nomadcode/services/core/internal/protosocket/events.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

75 lines
2.1 KiB
Go

package protosocket
import (
"context"
"github.com/nomadcode/nomadcode-core/internal/notification"
)
// SuccessResponse builds a response envelope correlated to a request.
func SuccessResponse(req Envelope, payload map[string]any) Envelope {
return Envelope{
ProtocolVersion: ProtocolVersion,
ID: generateID(),
CorrelationID: req.ID,
Type: "response",
Channel: req.Channel,
Action: req.Action,
Payload: payload,
}
}
// ErrorResponse builds an error envelope correlated to a request.
func ErrorResponse(req Envelope, code, message string, retryable bool) Envelope {
return Envelope{
ProtocolVersion: ProtocolVersion,
ID: generateID(),
CorrelationID: req.ID,
Type: "error",
Channel: req.Channel,
Action: req.Action,
Error: &EnvelopeError{
Code: code,
Message: message,
Retryable: retryable,
},
}
}
// Broadcaster publishes an envelope to all connected clients.
type Broadcaster interface {
BroadcastEnvelope(ctx context.Context, env Envelope) error
}
// TaskEventBroadcaster adapts notification task events into proto-socket
// task.status.changed events. It implements notification.TaskEventSink.
type TaskEventBroadcaster struct {
broadcaster Broadcaster
}
func NewTaskEventBroadcaster(broadcaster Broadcaster) *TaskEventBroadcaster {
return &TaskEventBroadcaster{broadcaster: broadcaster}
}
func (b *TaskEventBroadcaster) HandleTaskEvent(ctx context.Context, event notification.TaskEvent) error {
return b.broadcaster.BroadcastEnvelope(ctx, TaskStatusChangedEnvelope(event))
}
// TaskStatusChangedEnvelope maps a notification task event onto the
// task.status.changed event envelope.
func TaskStatusChangedEnvelope(event notification.TaskEvent) Envelope {
return Envelope{
ProtocolVersion: ProtocolVersion,
ID: generateID(),
Type: "event",
Channel: "task",
Action: "task.status.changed",
Payload: map[string]any{
"id": event.TaskID,
"type": string(event.Type),
"status": event.Status,
"title": event.Title,
"message": event.Message,
},
}
}