github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/fvm/meter/event_meter.go (about) 1 package meter 2 3 import ( 4 "math" 5 6 "github.com/onflow/flow-go/fvm/errors" 7 ) 8 9 type EventMeterParameters struct { 10 eventEmitByteLimit uint64 11 } 12 13 func DefaultEventMeterParameters() EventMeterParameters { 14 return EventMeterParameters{ 15 eventEmitByteLimit: math.MaxUint64, 16 } 17 } 18 19 func (params MeterParameters) WithEventEmitByteLimit( 20 byteLimit uint64, 21 ) MeterParameters { 22 newParams := params 23 newParams.eventEmitByteLimit = byteLimit 24 return newParams 25 } 26 27 type EventMeter struct { 28 params EventMeterParameters 29 30 totalEmittedEventBytes uint64 31 } 32 33 func NewEventMeter(params EventMeterParameters) EventMeter { 34 return EventMeter{ 35 params: params, 36 } 37 } 38 39 func (m *EventMeter) MeterEmittedEvent(byteSize uint64) error { 40 m.totalEmittedEventBytes += byteSize 41 42 if m.totalEmittedEventBytes > m.params.eventEmitByteLimit { 43 return errors.NewEventLimitExceededError( 44 m.totalEmittedEventBytes, 45 m.params.eventEmitByteLimit) 46 } 47 return nil 48 } 49 50 func (m *EventMeter) TotalEmittedEventBytes() uint64 { 51 return m.totalEmittedEventBytes 52 } 53 54 func (m *EventMeter) Merge(child EventMeter) { 55 m.totalEmittedEventBytes += child.TotalEmittedEventBytes() 56 }