nyk
feat(refactor): ready for manual QA after main sync (#274)
b6ecafa unverified
Raw
History Blame Contribute Delete
1.58 kB
import { EventEmitter } from 'events'
/**
* Server-side event bus for broadcasting database mutations to SSE clients.
* Singleton per Next.js server process.
*/
export interface ServerEvent {
type: string
data: any
timestamp: number
}
// Event types emitted by the bus
export type EventType =
| 'task.created'
| 'task.updated'
| 'task.deleted'
| 'task.status_changed'
| 'chat.message'
| 'chat.message.deleted'
| 'notification.created'
| 'notification.read'
| 'activity.created'
| 'agent.updated'
| 'agent.created'
| 'agent.deleted'
| 'agent.synced'
| 'agent.status_changed'
| 'audit.security'
| 'security.event'
| 'connection.created'
| 'connection.disconnected'
| 'github.synced'
class ServerEventBus extends EventEmitter {
private static instance: ServerEventBus | null = null
private constructor() {
super()
this.setMaxListeners(50)
}
static getInstance(): ServerEventBus {
if (!ServerEventBus.instance) {
ServerEventBus.instance = new ServerEventBus()
}
return ServerEventBus.instance
}
/**
* Broadcast an event to all SSE listeners
*/
broadcast(type: EventType, data: any): ServerEvent {
const event: ServerEvent = { type, data, timestamp: Date.now() }
this.emit('server-event', event)
return event
}
}
// Use globalThis to survive HMR in development
const globalBus = globalThis as typeof globalThis & { __eventBus?: ServerEventBus }
export const eventBus = globalBus.__eventBus ?? ServerEventBus.getInstance()
globalBus.__eventBus = eventBus as ServerEventBus