Add realtime gateway and simulator bridge

This commit is contained in:
2026-03-27 21:06:17 +08:00
parent 0703fd47a2
commit 2c0fd4c549
36 changed files with 6852 additions and 1 deletions

View File

@@ -0,0 +1,53 @@
package plugin
import (
"context"
"log/slog"
"sync"
"realtime-gateway/internal/model"
)
type Handler interface {
Name() string
Handle(context.Context, model.Envelope) error
}
type Bus struct {
logger *slog.Logger
mu sync.RWMutex
handlers []Handler
}
func NewBus(logger *slog.Logger) *Bus {
return &Bus{
logger: logger,
}
}
func (b *Bus) Register(handler Handler) {
b.mu.Lock()
b.handlers = append(b.handlers, handler)
b.mu.Unlock()
}
func (b *Bus) Publish(envelope model.Envelope) {
b.mu.RLock()
handlers := append([]Handler(nil), b.handlers...)
b.mu.RUnlock()
for _, handler := range handlers {
handler := handler
go func() {
if err := handler.Handle(context.Background(), envelope); err != nil {
b.logger.Warn("plugin handler failed", "handler", handler.Name(), "error", err)
}
}()
}
}
func (b *Bus) HandlerCount() int {
b.mu.RLock()
defer b.mu.RUnlock()
return len(b.handlers)
}