From 6eaece99c53a3e6bc56caea8a52a9fffc9606a04 Mon Sep 17 00:00:00 2001 From: "Jonathan Leibiusky @xetorthio" Date: Wed, 12 Jul 2017 21:46:57 -0300 Subject: [PATCH] Add events --- event/event.go | 16 ++++++++++++++++ event/local_broker.go | 34 ++++++++++++++++++++++++++++++++++ event/local_broker_test.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 event/event.go create mode 100644 event/local_broker.go create mode 100644 event/local_broker_test.go 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) +}