github.com/ethereum-optimism/optimism@v1.7.2/op-node/rollup/derive/frame_queue.go (about)

     1  package derive
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  
     7  	"github.com/ethereum/go-ethereum/log"
     8  
     9  	"github.com/ethereum-optimism/optimism/op-service/eth"
    10  )
    11  
    12  var _ NextFrameProvider = &FrameQueue{}
    13  
    14  type NextDataProvider interface {
    15  	NextData(context.Context) ([]byte, error)
    16  	Origin() eth.L1BlockRef
    17  }
    18  
    19  type FrameQueue struct {
    20  	log    log.Logger
    21  	frames []Frame
    22  	prev   NextDataProvider
    23  }
    24  
    25  func NewFrameQueue(log log.Logger, prev NextDataProvider) *FrameQueue {
    26  	return &FrameQueue{
    27  		log:  log,
    28  		prev: prev,
    29  	}
    30  }
    31  
    32  func (fq *FrameQueue) Origin() eth.L1BlockRef {
    33  	return fq.prev.Origin()
    34  }
    35  
    36  func (fq *FrameQueue) NextFrame(ctx context.Context) (Frame, error) {
    37  	// Find more frames if we need to
    38  	if len(fq.frames) == 0 {
    39  		if data, err := fq.prev.NextData(ctx); err != nil {
    40  			return Frame{}, err
    41  		} else {
    42  			if new, err := ParseFrames(data); err == nil {
    43  				fq.frames = append(fq.frames, new...)
    44  			} else {
    45  				fq.log.Warn("Failed to parse frames", "origin", fq.prev.Origin(), "err", err)
    46  			}
    47  		}
    48  	}
    49  	// If we did not add more frames but still have more data, retry this function.
    50  	if len(fq.frames) == 0 {
    51  		return Frame{}, NotEnoughData
    52  	}
    53  
    54  	ret := fq.frames[0]
    55  	fq.frames = fq.frames[1:]
    56  	return ret, nil
    57  }
    58  
    59  func (fq *FrameQueue) Reset(_ context.Context, _ eth.L1BlockRef, _ eth.SystemConfig) error {
    60  	fq.frames = fq.frames[:0]
    61  	return io.EOF
    62  }