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 }