nomadcode/services/core/internal/protosocket/dispatcher.go
toki e36db7281b feat: update project rules, roadmap, and core service changes
- Update agent-ops project rules and roadmap files
- Add proto-socket infrastructure communication rail milestone
- Update Flutter pubspec.lock and contracts notes
- Enhance core service: config, HTTP middleware, router
- Add notification module improvements
- Add protosocket internal package
2026-05-30 19:32:48 +09:00

59 lines
1.1 KiB
Go

package protosocket
import (
"context"
"crypto/rand"
"encoding/hex"
"fmt"
"sync"
)
type HandlerFunc func(context.Context, Envelope) Envelope
type Dispatcher struct {
mu sync.RWMutex
handlers map[string]HandlerFunc
}
func NewDispatcher() *Dispatcher {
return &Dispatcher{
handlers: make(map[string]HandlerFunc),
}
}
func (d *Dispatcher) Register(action string, handler HandlerFunc) {
d.mu.Lock()
defer d.mu.Unlock()
d.handlers[action] = handler
}
func (d *Dispatcher) Dispatch(ctx context.Context, env Envelope) Envelope {
d.mu.RLock()
handler, ok := d.handlers[env.Action]
d.mu.RUnlock()
if !ok {
return Envelope{
ProtocolVersion: ProtocolVersion,
ID: generateID(),
CorrelationID: env.ID,
Type: "error",
Channel: env.Channel,
Action: env.Action,
Error: &EnvelopeError{
Code: "UNSUPPORTED_ACTION",
Message: fmt.Sprintf("unsupported action: %s", env.Action),
},
}
}
return handler(ctx, env)
}
func generateID() string {
b := make([]byte, 16)
if _, err := rand.Read(b); err != nil {
return "error-id-fallback"
}
return hex.EncodeToString(b)
}