UNPKG

@synet/patterns

Version:

Robust, battle-tested collection of stable patterns used in Synet packages

89 lines (88 loc) 2.35 kB
import type { RealtimeEvent, Topic } from "../common/realtime-event"; export interface ClientConnectedEventData { clientId: string; topic: Topic; timestamp: Date; metadata?: Record<string, unknown>; } export interface ClientDisconnectedEventData { clientId: string; topics: Topic[]; timestamp: Date; } export interface MessageReceivedEventData { clientId: string; message: Record<string, unknown>; timestamp: Date; } export type ServerEventType = "client.connected" | "client.disconnected" | "message.received"; /** * Server statistics */ export interface RealtimeServerStats { connectedClients: number; totalTopics: number; messagesSent: number; messagesReceived: number; uptime: number; averageLatency?: number; } /** * Configuration options for RealtimeServer */ export interface RealtimeServerOptions<TTransportOptions = unknown> { /** * Authentication configuration */ authToken?: string; auth?: { enabled: boolean; validateToken?: (token: string) => Promise<boolean>; extractClaims?: (token: string) => Promise<Record<string, unknown>>; }; /** * Client connection limits */ limits?: { maxConnections?: number; maxTopicsPerClient?: number; messageRateLimit?: number; }; /** * Transport-specific options */ transportOptions?: TTransportOptions; } /** * SERVER-SIDE: Broadcast events to connected clients */ export interface RealtimeServer<TEvent extends RealtimeEvent = RealtimeEvent> { /** * Start the server */ start(): Promise<void>; /** * Stop the server */ stop(): Promise<void>; /** * Broadcast an event to all subscribers of a topic * @param topic Target topic * @param event Event to broadcast */ broadcast(topic: Topic, event: TEvent): Promise<void>; /** * Send event to specific client (optional feature) * @param clientId Target client ID * @param event Event to send */ sendToClient?(clientId: string, event: TEvent): Promise<void>; /** * Get server stats */ getStats(): RealtimeServerStats; /** * Register event listeners for server events */ on<T extends ServerEventType>(event: T, handler: (data: unknown) => void): void; }