feat: plugin discovery, capability/contribution/permission registries, Plugin Manager UI
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
// Package events provides an in-process event bus for plugin and core communication.
|
||||
package events
|
||||
|
||||
import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
// Handler is a function that processes an event.
|
||||
type Handler func(event Event)
|
||||
|
||||
// Event represents a named event with a payload.
|
||||
type Event struct {
|
||||
Name string `json:"name"`
|
||||
Timestamp string `json:"timestamp"`
|
||||
Payload interface{} `json:"payload"`
|
||||
}
|
||||
|
||||
// Bus is a simple in-process event bus.
|
||||
type Bus struct {
|
||||
mu sync.RWMutex
|
||||
handlers map[string][]Handler
|
||||
}
|
||||
|
||||
// NewBus creates a new event bus.
|
||||
func NewBus() *Bus {
|
||||
return &Bus{
|
||||
handlers: make(map[string][]Handler),
|
||||
}
|
||||
}
|
||||
|
||||
// Subscribe registers a handler for an event name.
|
||||
func (b *Bus) Subscribe(event string, handler Handler) {
|
||||
b.mu.Lock()
|
||||
defer b.mu.Unlock()
|
||||
b.handlers[event] = append(b.handlers[event], handler)
|
||||
}
|
||||
|
||||
// Unsubscribe removes all handlers for a plugin (matched by prefix or exact).
|
||||
// For now, a simple version: clear all handlers for a given event name.
|
||||
func (b *Bus) Unsubscribe(event string) {
|
||||
b.mu.Lock()
|
||||
defer b.mu.Unlock()
|
||||
delete(b.handlers, event)
|
||||
}
|
||||
|
||||
// Publish dispatches an event to all registered handlers.
|
||||
func (b *Bus) Publish(event Event) {
|
||||
b.mu.RLock()
|
||||
handlers, ok := b.handlers[event.Name]
|
||||
b.mu.RUnlock()
|
||||
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
|
||||
for _, handler := range handlers {
|
||||
handler(event)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user