package events
|
|
|
|
import "context"
|
|
|
|
// An EventCache buffers events for a Fireable
|
|
// All events are cached. Filtering happens on Flush
|
|
type EventCache struct {
|
|
evsw Fireable
|
|
events []eventInfo
|
|
}
|
|
|
|
// Create a new EventCache with an EventSwitch as backend
|
|
func NewEventCache(evsw Fireable) *EventCache {
|
|
return &EventCache{
|
|
evsw: evsw,
|
|
}
|
|
}
|
|
|
|
// a cached event
|
|
type eventInfo struct {
|
|
event string
|
|
data EventData
|
|
}
|
|
|
|
// Cache an event to be fired upon finality.
|
|
func (evc *EventCache) FireEvent(event string, data EventData) {
|
|
// append to list (go will grow our backing array exponentially)
|
|
evc.events = append(evc.events, eventInfo{event, data})
|
|
}
|
|
|
|
// Fire events by running evsw.FireEvent on all cached events. Blocks.
|
|
// Clears cached events
|
|
func (evc *EventCache) Flush(ctx context.Context) {
|
|
for _, ei := range evc.events {
|
|
evc.evsw.FireEvent(ctx, ei.event, ei.data)
|
|
}
|
|
// Clear the buffer, since we only add to it with append it's safe to just set it to nil and maybe safe an allocation
|
|
evc.events = nil
|
|
}
|