first commit
This commit is contained in:
48
bus/bus.go
Normal file
48
bus/bus.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package bus
|
||||
|
||||
import "sync"
|
||||
|
||||
// Subscriber represents a named handler for an event.
|
||||
type Subscriber struct {
|
||||
Name string
|
||||
Handler func(any)
|
||||
}
|
||||
|
||||
// CustomEventBus is a simple in-memory event bus using Go primitives.
|
||||
type CustomEventBus struct {
|
||||
mu sync.RWMutex
|
||||
subscribers map[string][]Subscriber
|
||||
}
|
||||
|
||||
func NewCustomEventBus() *CustomEventBus {
|
||||
return &CustomEventBus{
|
||||
subscribers: make(map[string][]Subscriber),
|
||||
}
|
||||
}
|
||||
|
||||
func (eb *CustomEventBus) Subscribe(event string, name string, handler func(any)) {
|
||||
eb.mu.Lock()
|
||||
defer eb.mu.Unlock()
|
||||
eb.subscribers[event] = append(eb.subscribers[event], Subscriber{Name: name, Handler: handler})
|
||||
}
|
||||
|
||||
func (eb *CustomEventBus) Publish(event string, data any) {
|
||||
eb.mu.RLock()
|
||||
subs := eb.subscribers[event]
|
||||
eb.mu.RUnlock()
|
||||
for _, sub := range subs {
|
||||
go sub.Handler(data) // Run handlers asynchronously
|
||||
}
|
||||
}
|
||||
|
||||
func (eb *CustomEventBus) GetSubscribers() map[string][]string {
|
||||
eb.mu.RLock()
|
||||
defer eb.mu.RUnlock()
|
||||
result := make(map[string][]string)
|
||||
for event, subs := range eb.subscribers {
|
||||
for _, sub := range subs {
|
||||
result[event] = append(result[event], sub.Name)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
Reference in New Issue
Block a user