| package event |
|
|
| import "sync" |
|
|
| type localBroker struct { |
| sync.Mutex |
|
|
| handlers map[EventType][]Handler |
| anyHandlers []AnyHandler |
| } |
|
|
| func NewLocalBroker() *localBroker { |
| return &localBroker{handlers: map[EventType][]Handler{}, anyHandlers: []AnyHandler{}} |
| } |
|
|
| 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) OnAny(handler AnyHandler) { |
| b.Lock() |
| defer b.Unlock() |
|
|
| b.anyHandlers = append(b.anyHandlers, handler) |
| } |
|
|
| func (b *localBroker) Emit(name EventType, sessionId string, args ...interface{}) { |
| go func() { |
| b.Lock() |
| defer b.Unlock() |
|
|
| for _, handler := range b.anyHandlers { |
| handler(name, sessionId, args...) |
| } |
| if b.handlers[name] != nil { |
| for _, handler := range b.handlers[name] { |
| handler(sessionId, args...) |
| } |
| } |
| }() |
| } |
|
|