diff --git a/event/event.go b/event/event.go new file mode 100644 index 0000000..6a6541f --- /dev/null +++ b/event/event.go @@ -0,0 +1,16 @@ +package event + +type EventType string + +const INSTANCE_VIEWPORT_RESIZE EventType = "instance viewport resize" +const INSTANCE_DELETE EventType = "instance delete" +const INSTANCE_NEW EventType = "instance new" +const SESSION_END EventType = "session end" +const SESSION_READY EventType = "session ready" + +type Handler func(args ...interface{}) + +type EventApi interface { + Emit(name EventType, args ...interface{}) + On(name EventType, handler Handler) +} diff --git a/event/local_broker.go b/event/local_broker.go new file mode 100644 index 0000000..da68dd4 --- /dev/null +++ b/event/local_broker.go @@ -0,0 +1,34 @@ +package event + +import "sync" + +type localBroker struct { + sync.Mutex + + handlers map[EventType][]Handler +} + +func NewLocalBroker() *localBroker { + return &localBroker{handlers: map[EventType][]Handler{}} +} + +func (b *localBroker) On(name EventType, handler Handler) { + b.Lock() + defer b.Unlock() + + if b.handlers[name] == nil { + b.handlers[name] = []Handler{} + } + b.handlers[name] = append(b.handlers[name], handler) +} + +func (b *localBroker) Emit(name EventType, args ...interface{}) { + b.Lock() + defer b.Unlock() + + if b.handlers[name] != nil { + for _, handler := range b.handlers[name] { + handler(args...) + } + } +} diff --git a/event/local_broker_test.go b/event/local_broker_test.go new file mode 100644 index 0000000..777a4b8 --- /dev/null +++ b/event/local_broker_test.go @@ -0,0 +1,31 @@ +package event + +import ( + "sync" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestLocalBroker(t *testing.T) { + broker := NewLocalBroker() + + called := 0 + receivedArgs := []interface{}{} + + wg := sync.WaitGroup{} + wg.Add(1) + + broker.On(INSTANCE_NEW, func(args ...interface{}) { + called++ + receivedArgs = args + wg.Done() + }) + broker.Emit(SESSION_READY) + broker.Emit(INSTANCE_NEW, "foo", "bar") + + wg.Wait() + + assert.Equal(t, 1, called) + assert.Equal(t, []interface{}{"foo", "bar"}, receivedArgs) +}