package types // Interface assertions var _ TxEventPublisher = (*TxEventBuffer)(nil) // TxEventBuffer is a buffer of events, which uses a slice to temporarily store // events. type TxEventBuffer struct { next TxEventPublisher capacity int events []EventDataTx } // NewTxEventBuffer accepts a TxEventPublisher and returns a new buffer with the given // capacity. func NewTxEventBuffer(next TxEventPublisher, capacity int) *TxEventBuffer { return &TxEventBuffer{ next: next, capacity: capacity, events: make([]EventDataTx, 0, capacity), } } // Len returns the number of events cached. func (b TxEventBuffer) Len() int { return len(b.events) } // PublishEventTx buffers an event to be fired upon finality. func (b *TxEventBuffer) PublishEventTx(e EventDataTx) error { b.events = append(b.events, e) return nil } // Flush publishes events by running next.PublishWithTags on all cached events. // Blocks. Clears cached events. func (b *TxEventBuffer) Flush() error { for _, e := range b.events { err := b.next.PublishEventTx(e) if err != nil { return err } } // Clear out the elements and set the length to 0 // but maintain the underlying slice's capacity. // See Issue https://github.com/tendermint/tendermint/issues/1189 b.events = b.events[:0] return nil }