package realtime // EventPublisher sends SSE events to users and channels. // Implementations: // - SSEPublisher: publishes via Redis for cross-process delivery (production) // - LocalPublisher: delivers directly to SSEHub in-process (development) type EventPublisher interface { SendToUser(userID string, event *SSEEvent) error SendToChannel(channel string, event *SSEEvent) error } // Compile-time interface checks. var ( _ EventPublisher = (*SSEPublisher)(nil) _ EventPublisher = (*LocalPublisher)(nil) ) // LocalPublisher delivers SSE events directly to the local SSEHub. // Use this when the service and worker run in the same process (standalone/dev mode). type LocalPublisher struct { hub *SSEHub } // NewLocalPublisher creates a publisher that sends events directly to the SSEHub. func NewLocalPublisher(hub *SSEHub) *LocalPublisher { return &LocalPublisher{hub: hub} } // SendToUser sends an event to a user's SSE channel. func (p *LocalPublisher) SendToUser(userID string, event *SSEEvent) error { p.hub.SendToUser(userID, event) return nil } // SendToChannel sends an event to a named SSE channel. func (p *LocalPublisher) SendToChannel(channel string, event *SSEEvent) error { p.hub.SendToChannel(channel, event) return nil }