notif-agent 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client/EventEmitter.ts","../src/client/Channel.ts","../src/client/ConnectionManager.ts","../src/client/NotifAgent.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { EventCallback, GlobalEventCallback, EventMetadata } from './types';\n\nexport class EventEmitter {\n private listeners: Map<string, Set<EventCallback>> = new Map();\n private globalListeners: Set<GlobalEventCallback> = new Set();\n\n /**\n * Bind a callback to a specific event name.\n */\n public bind<T = any>(event: string, callback: EventCallback<T>): this {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n return this;\n }\n\n /**\n * Unbind a callback from a specific event name, or all callbacks if callback is omitted.\n * If both event and callback are omitted, all listeners are removed.\n */\n public unbind<T = any>(event?: string, callback?: EventCallback<T>): this {\n if (!event) {\n this.listeners.clear();\n return this;\n }\n\n if (!callback) {\n this.listeners.delete(event);\n return this;\n }\n\n const set = this.listeners.get(event);\n if (set) {\n set.delete(callback);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n return this;\n }\n\n /**\n * Bind a callback to ALL incoming events on this emitter.\n */\n public bind_global(callback: GlobalEventCallback): this {\n this.globalListeners.add(callback);\n return this;\n }\n\n /**\n * Unbind a global callback, or all global callbacks if callback is omitted.\n */\n public unbind_global(callback?: GlobalEventCallback): this {\n if (!callback) {\n this.globalListeners.clear();\n return this;\n }\n this.globalListeners.delete(callback);\n return this;\n }\n\n /**\n * Emit an event to registered listeners and global listeners.\n */\n public emit<T = any>(event: string, data: T, metadata?: EventMetadata): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const cb of Array.from(set)) {\n try {\n cb(data, metadata);\n } catch (err) {\n console.error(`[notif-agent] Error in listener for event \"${event}\":`, err);\n }\n }\n }\n\n for (const globalCb of Array.from(this.globalListeners)) {\n try {\n globalCb(event, data, metadata);\n } catch (err) {\n console.error(`[notif-agent] Error in global listener for event \"${event}\":`, err);\n }\n }\n }\n\n /**\n * Clear all listeners.\n */\n public clear(): void {\n this.listeners.clear();\n this.globalListeners.clear();\n }\n}\n","import { EventEmitter } from './EventEmitter';\nimport { ChannelSubscriptionState, EventCallback, GlobalEventCallback, EventMetadata } from './types';\n\nexport class Channel {\n public readonly name: string;\n public state: ChannelSubscriptionState = 'subscribing';\n private emitter: EventEmitter = new EventEmitter();\n\n constructor(name: string) {\n this.name = name;\n }\n\n /**\n * Whether the channel is currently successfully subscribed.\n */\n public get subscribed(): boolean {\n return this.state === 'subscribed';\n }\n\n /**\n * Bind an event listener to this channel.\n *\n * Example:\n * ```ts\n * channel.bind('new-comment', (data) => {\n * console.log(data);\n * });\n * ```\n */\n public bind<T = any>(event: string, callback: EventCallback<T>): this {\n this.emitter.bind(event, callback);\n return this;\n }\n\n /**\n * Unbind an event listener from this channel.\n */\n public unbind<T = any>(event?: string, callback?: EventCallback<T>): this {\n this.emitter.unbind(event, callback);\n return this;\n }\n\n /**\n * Bind a global listener to all events received on this channel.\n *\n * Example:\n * ```ts\n * channel.bind_global((eventName, data) => {\n * console.log(`Event ${eventName}:`, data);\n * });\n * ```\n */\n public bind_global(callback: GlobalEventCallback): this {\n this.emitter.bind_global(callback);\n return this;\n }\n\n /**\n * Unbind a global listener from this channel.\n */\n public unbind_global(callback?: GlobalEventCallback): this {\n this.emitter.unbind_global(callback);\n return this;\n }\n\n /**\n * Internal method to dispatch an event onto this channel.\n */\n public handleEvent<T = any>(event: string, data: T, metadata?: EventMetadata): void {\n this.emitter.emit(event, data, {\n ...metadata,\n event,\n channel: this.name,\n });\n }\n\n /**\n * Internal method to update subscription status and fire Pusher-compatible subscription events.\n */\n public setSubscribed(data?: any): void {\n this.state = 'subscribed';\n // Pusher compatibility and standard notif-agent event\n this.handleEvent('subscription_succeeded', data ?? {});\n this.handleEvent('pusher:subscription_succeeded', data ?? {});\n }\n\n /**\n * Internal method to set subscription error.\n */\n public setSubscriptionError(error: any): void {\n this.state = 'error';\n this.handleEvent('subscription_error', error);\n this.handleEvent('pusher:subscription_error', error);\n }\n\n /**\n * Internal method called when channel is unsubscribed.\n */\n public setUnsubscribed(): void {\n this.state = 'unsubscribed';\n this.emitter.clear();\n }\n}\n","import { EventEmitter } from './EventEmitter';\nimport {\n ConnectionState,\n NotifAgentOptions,\n SSEMessagePayload,\n StateChangePayload,\n} from './types';\n\nexport class ConnectionManager {\n public state: ConnectionState = 'initialized';\n public clientId: string | null = null;\n\n /**\n * Pusher-compatible alias for clientId.\n */\n public get socket_id(): string | null {\n return this.clientId;\n }\n\n private emitter: EventEmitter = new EventEmitter();\n private options: Required<Omit<NotifAgentOptions, 'headers' | 'queryParams' | 'url' | 'authEndpoint' | 'auth'>> & {\n url: string;\n headers?: NotifAgentOptions['headers'];\n queryParams?: NotifAgentOptions['queryParams'];\n authEndpoint?: NotifAgentOptions['authEndpoint'];\n auth?: NotifAgentOptions['auth'];\n };\n\n private eventSource: EventSource | null = null;\n private abortController: AbortController | null = null;\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n private isManuallyClosed = false;\n\n constructor(url: string, options: NotifAgentOptions = {}) {\n this.options = {\n url,\n headers: options.headers,\n queryParams: options.queryParams,\n withCredentials: options.withCredentials ?? false,\n transport: options.transport ?? 'auto',\n reconnectBaseDelay: options.reconnectBaseDelay ?? 1000,\n reconnectMaxDelay: options.reconnectMaxDelay ?? 30000,\n maxReconnectAttempts: options.maxReconnectAttempts ?? Infinity,\n heartbeatTimeout: options.heartbeatTimeout ?? 45000,\n autoConnect: options.autoConnect ?? true,\n debug: options.debug ?? false,\n };\n\n if (this.options.autoConnect) {\n // Connect on next tick so callers have time to bind connection listeners\n setTimeout(() => {\n if (!this.isManuallyClosed && this.state === 'initialized') {\n this.connect();\n }\n }, 0);\n }\n }\n\n public bind<T = any>(event: string, callback: (data: T) => void): this {\n this.emitter.bind(event, callback);\n return this;\n }\n\n public unbind<T = any>(event?: string, callback?: (data: T) => void): this {\n this.emitter.unbind(event, callback);\n return this;\n }\n\n public connect(): void {\n this.isManuallyClosed = false;\n this.clearTimers();\n\n if (this.state === 'connected' || this.state === 'connecting') {\n return;\n }\n\n this.transition('connecting');\n this.establishConnection();\n }\n\n public disconnect(): void {\n this.isManuallyClosed = true;\n this.clientId = null;\n this.clearTimers();\n this.closeActiveTransport();\n this.transition('disconnected');\n }\n\n private transition(nextState: ConnectionState): void {\n if (this.state === nextState) return;\n\n const previous = this.state;\n this.state = nextState;\n\n this.log(`State transition: ${previous} -> ${nextState}`);\n\n const payload: StateChangePayload = { previous, current: nextState };\n this.emitter.emit('state_change', payload);\n this.emitter.emit(nextState, payload);\n }\n\n private async establishConnection(): Promise<void> {\n try {\n const headers = await this.resolveHeaders();\n const hasCustomHeaders = headers && Object.keys(headers).length > 0;\n const shouldUseFetch =\n this.options.transport === 'fetch' ||\n (this.options.transport === 'auto' && (hasCustomHeaders || typeof EventSource === 'undefined'));\n\n const fullUrl = this.buildUrl();\n\n if (shouldUseFetch) {\n this.log(`Connecting via Fetch SSE stream: ${fullUrl}`);\n this.connectViaFetch(fullUrl, headers);\n } else {\n this.log(`Connecting via native EventSource: ${fullUrl}`);\n this.connectViaEventSource(fullUrl);\n }\n } catch (err) {\n this.handleConnectionFailure(err);\n }\n }\n\n private connectViaEventSource(url: string): void {\n this.closeActiveTransport();\n\n try {\n const es = new EventSource(url, {\n withCredentials: this.options.withCredentials,\n });\n this.eventSource = es;\n\n es.onopen = () => {\n this.handleConnectionSuccess();\n };\n\n es.onmessage = (e: MessageEvent) => {\n this.resetHeartbeat();\n this.parseAndDispatchMessage('message', e.data, e.lastEventId);\n };\n\n es.onerror = (err) => {\n this.log('EventSource error occurred', err);\n if (es.readyState === EventSource.CLOSED) {\n this.handleConnectionFailure(err);\n } else {\n // EventSource is in CONNECTING state attempting internal reconnect\n this.transition('unavailable');\n }\n };\n } catch (err) {\n this.handleConnectionFailure(err);\n }\n }\n\n private async connectViaFetch(url: string, headers?: Record<string, string>): Promise<void> {\n this.closeActiveTransport();\n this.abortController = new AbortController();\n\n try {\n const requestHeaders: Record<string, string> = {\n Accept: 'text/event-stream',\n 'Cache-Control': 'no-cache',\n ...headers,\n };\n\n const response = await fetch(url, {\n method: 'GET',\n headers: requestHeaders,\n credentials: this.options.withCredentials ? 'include' : 'same-origin',\n signal: this.abortController.signal,\n });\n\n if (!response.ok) {\n throw new Error(`SSE connection failed with HTTP status ${response.status}: ${response.statusText}`);\n }\n\n if (!response.body) {\n throw new Error('Response body is null or stream reading is not supported');\n }\n\n this.handleConnectionSuccess();\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n this.resetHeartbeat();\n buffer += decoder.decode(value, { stream: true });\n\n // Process SSE frames (blocks ending with double newline)\n const parts = buffer.split(/\\r\\n\\r\\n|\\n\\n/);\n buffer = parts.pop() ?? '';\n\n for (const part of parts) {\n if (part.trim().length > 0) {\n this.processSSEFrame(part);\n }\n }\n }\n\n // Stream closed normally from server\n if (!this.isManuallyClosed) {\n this.handleConnectionFailure(new Error('SSE stream ended by server'));\n }\n } catch (err: any) {\n if (err.name === 'AbortError' || this.isManuallyClosed) {\n // Expected cancellation\n return;\n }\n this.handleConnectionFailure(err);\n }\n }\n\n private processSSEFrame(frame: string): void {\n const lines = frame.split(/\\r\\n|\\r|\\n/);\n let event = 'message';\n let data = '';\n let id: string | undefined;\n\n for (const line of lines) {\n if (line.startsWith(':')) {\n // Comment / ping heartbeat\n this.resetHeartbeat();\n continue;\n }\n\n if (line.startsWith('event:')) {\n event = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n const value = line.slice(5).trim();\n data += (data ? '\\n' : '') + value;\n } else if (line.startsWith('id:')) {\n id = line.slice(3).trim();\n } else if (line.startsWith('retry:')) {\n const retryMs = parseInt(line.slice(6).trim(), 10);\n if (!isNaN(retryMs)) {\n this.options.reconnectBaseDelay = retryMs;\n }\n }\n }\n\n if (data || event !== 'message') {\n this.parseAndDispatchMessage(event, data, id);\n }\n }\n\n private parseAndDispatchMessage(sseEvent: string, rawData: string, id?: string): void {\n let parsedData: any = rawData;\n let channel: string | undefined;\n let eventName = sseEvent;\n\n if (rawData) {\n try {\n const json = JSON.parse(rawData);\n // Check if server packaged channel & event inside json payload\n if (typeof json === 'object' && json !== null) {\n if (json.channel && typeof json.channel === 'string') {\n channel = json.channel;\n }\n if (json.event && typeof json.event === 'string') {\n eventName = json.event;\n }\n if ('data' in json) {\n parsedData = json.data;\n } else {\n parsedData = json;\n }\n } else {\n parsedData = json;\n }\n } catch {\n parsedData = rawData;\n }\n }\n\n // Handle handshake event from NotifServer\n if (eventName === 'connected' && parsedData && typeof parsedData === 'object' && parsedData.clientId) {\n this.clientId = parsedData.clientId;\n this.emitter.emit('handshake', parsedData);\n }\n\n // Handle heartbeat pings\n if (eventName === 'ping' || eventName === 'heartbeat' || eventName === ':ping') {\n this.resetHeartbeat();\n return;\n }\n\n const payload: SSEMessagePayload = {\n channel,\n event: eventName,\n data: parsedData,\n id,\n timestamp: Date.now(),\n };\n\n this.emitter.emit('message', payload);\n }\n\n private handleConnectionSuccess(): void {\n this.reconnectAttempts = 0;\n this.transition('connected');\n this.resetHeartbeat();\n }\n\n private handleConnectionFailure(error: any): void {\n this.log('Connection failed or dropped', error);\n this.closeActiveTransport();\n this.clearHeartbeat();\n\n if (this.isManuallyClosed) {\n return;\n }\n\n this.emitter.emit('error', error);\n\n this.reconnectAttempts++;\n if (this.reconnectAttempts > this.options.maxReconnectAttempts) {\n this.log(`Max reconnect attempts (${this.options.maxReconnectAttempts}) exceeded. State -> failed`);\n this.transition('failed');\n return;\n }\n\n this.transition('unavailable');\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) clearTimeout(this.reconnectTimer);\n\n // Exponential backoff with jitter\n const delay = Math.min(\n this.options.reconnectBaseDelay * Math.pow(1.5, this.reconnectAttempts - 1),\n this.options.reconnectMaxDelay\n );\n const jitter = delay * 0.2 * (Math.random() - 0.5); // +/- 10%\n const totalDelay = Math.max(100, Math.round(delay + jitter));\n\n this.log(`Scheduling reconnect in ${totalDelay}ms (attempt #${this.reconnectAttempts})`);\n\n this.reconnectTimer = setTimeout(() => {\n if (!this.isManuallyClosed && this.state !== 'connected') {\n this.transition('connecting');\n this.establishConnection();\n }\n }, totalDelay);\n }\n\n private resetHeartbeat(): void {\n this.clearHeartbeat();\n\n if (this.options.heartbeatTimeout <= 0) return;\n\n this.heartbeatTimer = setTimeout(() => {\n this.log(`Heartbeat timeout (${this.options.heartbeatTimeout}ms) exceeded. Connection dropped.`);\n this.handleConnectionFailure(new Error('Heartbeat timeout'));\n }, this.options.heartbeatTimeout);\n }\n\n private clearHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearTimeout(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private clearTimers(): void {\n this.clearHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private closeActiveTransport(): void {\n if (this.eventSource) {\n try {\n this.eventSource.close();\n } catch {}\n this.eventSource = null;\n }\n\n if (this.abortController) {\n try {\n this.abortController.abort();\n } catch {}\n this.abortController = null;\n }\n }\n\n private buildUrl(): string {\n const url = new URL(this.options.url, typeof window !== 'undefined' ? window.location.href : 'http://localhost');\n if (this.options.queryParams) {\n for (const [key, value] of Object.entries(this.options.queryParams)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async resolveHeaders(): Promise<Record<string, string> | undefined> {\n if (!this.options.headers) return undefined;\n if (typeof this.options.headers === 'function') {\n return await this.options.headers();\n }\n return this.options.headers;\n }\n\n private log(...args: any[]): void {\n if (this.options.debug) {\n console.log('[notif-agent:connection]', ...args);\n }\n }\n}\n","import { Channel } from './Channel';\nimport { ConnectionManager } from './ConnectionManager';\nimport { EventEmitter } from './EventEmitter';\nimport {\n EventCallback,\n GlobalEventCallback,\n NotifAgentOptions,\n SSEMessagePayload,\n} from './types';\n\nexport class NotifAgent {\n public readonly connection: ConnectionManager;\n private options: NotifAgentOptions;\n private channels: Map<string, Channel> = new Map();\n private globalEmitter: EventEmitter = new EventEmitter();\n\n /**\n * Unique client connection ID provided by NotifServer handshake.\n */\n public get clientId(): string | null {\n return this.connection.clientId;\n }\n\n /**\n * Pusher-compatible alias for clientId.\n */\n public get socket_id(): string | null {\n return this.connection.clientId;\n }\n\n constructor(urlOrOptions: string | NotifAgentOptions, maybeOptions?: NotifAgentOptions) {\n let options: NotifAgentOptions;\n\n if (typeof urlOrOptions === 'string') {\n options = { ...(maybeOptions ?? {}), url: urlOrOptions };\n } else {\n options = urlOrOptions;\n }\n\n if (!options.url) {\n throw new Error('[notif-agent] SSE URL must be specified');\n }\n\n this.options = options;\n this.connection = new ConnectionManager(options.url, options);\n\n // Listen to connection messages to route events\n this.connection.bind<SSEMessagePayload>('message', (payload) => {\n this.routeMessage(payload);\n });\n\n const triggerChannelSubscriptions = () => {\n for (const channel of this.channels.values()) {\n const isPrivate = channel.name.startsWith('private-') || channel.name.startsWith('presence-');\n if (isPrivate && this.options.authEndpoint) {\n this.authorizeChannel(channel);\n } else {\n channel.setSubscribed();\n }\n }\n };\n\n // On handshake with server clientId, authorize channels\n this.connection.bind('handshake', () => {\n triggerChannelSubscriptions();\n });\n\n // On reconnect / connected\n this.connection.bind('connected', () => {\n if (this.connection.clientId || !this.options.authEndpoint) {\n triggerChannelSubscriptions();\n }\n });\n }\n\n /**\n * Subscribe to a channel.\n *\n * Example:\n * ```ts\n * const channel = agent.subscribe('orders');\n * channel.bind('created', (order) => { ... });\n * ```\n */\n public subscribe(channelName: string): Channel {\n if (!channelName) {\n throw new Error('[notif-agent] Channel name cannot be empty');\n }\n\n let channel = this.channels.get(channelName);\n if (!channel) {\n channel = new Channel(channelName);\n this.channels.set(channelName, channel);\n\n // If already connected, mark channel as subscribed or authorize if private\n if (this.connection.state === 'connected') {\n setTimeout(() => {\n const isPrivate = channelName.startsWith('private-') || channelName.startsWith('presence-');\n if (isPrivate && this.options.authEndpoint) {\n this.authorizeChannel(channel!);\n } else {\n channel?.setSubscribed();\n }\n }, 0);\n }\n }\n\n return channel;\n }\n\n /**\n * Internal authorization helper for private/presence channels.\n */\n private async authorizeChannel(channel: Channel): Promise<void> {\n if (!this.options.authEndpoint) {\n channel.setSubscribed();\n return;\n }\n\n try {\n let customHeaders: Record<string, string> = {};\n if (typeof this.options.auth?.headers === 'function') {\n customHeaders = await this.options.auth.headers();\n } else if (this.options.auth?.headers) {\n customHeaders = this.options.auth.headers;\n }\n\n const body = {\n clientId: this.connection.clientId,\n socket_id: this.connection.clientId,\n channel: channel.name,\n ...(this.options.auth?.params ?? {}),\n };\n\n const response = await fetch(this.options.authEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...customHeaders,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`[notif-agent] Authorization failed (${response.status}): ${errorText}`);\n }\n\n const authData = await response.json().catch(() => ({}));\n channel.setSubscribed(authData);\n } catch (err) {\n channel.setSubscriptionError(err);\n }\n }\n\n /**\n * Unsubscribe from a channel.\n */\n public unsubscribe(channelName: string): void {\n const channel = this.channels.get(channelName);\n if (channel) {\n channel.setUnsubscribed();\n this.channels.delete(channelName);\n }\n }\n\n /**\n * Get an existing subscribed channel by name, if any.\n */\n public channel(channelName: string): Channel | undefined {\n return this.channels.get(channelName);\n }\n\n /**\n * Return all currently subscribed channels.\n */\n public allChannels(): Channel[] {\n return Array.from(this.channels.values());\n }\n\n /**\n * Bind to an event across all channels or global events.\n *\n * Example:\n * ```ts\n * agent.bind('system-alert', (data) => console.log(data));\n * ```\n */\n public bind<T = any>(event: string, callback: EventCallback<T>): this {\n this.globalEmitter.bind(event, callback);\n return this;\n }\n\n /**\n * Unbind an event listener.\n */\n public unbind<T = any>(event?: string, callback?: EventCallback<T>): this {\n this.globalEmitter.unbind(event, callback);\n return this;\n }\n\n /**\n * Bind to all events regardless of name.\n */\n public bind_global(callback: GlobalEventCallback): this {\n this.globalEmitter.bind_global(callback);\n return this;\n }\n\n /**\n * Unbind a global event listener.\n */\n public unbind_global(callback?: GlobalEventCallback): this {\n this.globalEmitter.unbind_global(callback);\n return this;\n }\n\n /**\n * Connect to the SSE endpoint.\n */\n public connect(): void {\n this.connection.connect();\n }\n\n /**\n * Disconnect from the SSE endpoint.\n */\n public disconnect(): void {\n this.connection.disconnect();\n }\n\n /**\n * Route incoming SSE message to global emitters and specific channels.\n */\n private routeMessage(payload: SSEMessagePayload): void {\n const metadata = {\n channel: payload.channel,\n event: payload.event,\n id: payload.id,\n timestamp: payload.timestamp,\n };\n\n // 1. Dispatch to global agent emitter\n this.globalEmitter.emit(payload.event, payload.data, metadata);\n\n // 2. Dispatch to specific channel if message contains a channel\n if (payload.channel) {\n const targetChannel = this.channels.get(payload.channel);\n if (targetChannel) {\n targetChannel.handleEvent(payload.event, payload.data, metadata);\n }\n } else {\n // If message has no channel specified, notify all active channels\n for (const ch of this.channels.values()) {\n ch.handleEvent(payload.event, payload.data, metadata);\n }\n }\n }\n}\n","import { NotifAgent } from './client/NotifAgent';\n\nexport { NotifAgent } from './client/NotifAgent';\nexport { Channel } from './client/Channel';\nexport { ConnectionManager } from './client/ConnectionManager';\nexport { EventEmitter } from './client/EventEmitter';\nexport * from './client/types';\n\nexport default NotifAgent;\n"]}
@@ -0,0 +1,126 @@
1
+ import { IncomingMessage, ServerResponse } from 'http';
2
+
3
+ interface NotifClient {
4
+ id: string;
5
+ userId?: string;
6
+ channels: Set<string>;
7
+ send: (event: string, data: any, options?: {
8
+ channel?: string;
9
+ id?: string;
10
+ sseEvent?: string;
11
+ }) => void;
12
+ sendComment: (comment: string) => void;
13
+ close: () => void;
14
+ meta: Record<string, any>;
15
+ }
16
+ interface NotifServerOptions {
17
+ /**
18
+ * Heartbeat interval in milliseconds to keep SSE connections open through proxies.
19
+ * Defaults to 20000ms (20s). Set to 0 to disable.
20
+ */
21
+ heartbeatInterval?: number;
22
+ /**
23
+ * Optional custom client ID generator.
24
+ */
25
+ generateClientId?: () => string;
26
+ /**
27
+ * Debug logging.
28
+ */
29
+ debug?: boolean;
30
+ }
31
+ interface TriggerOptions {
32
+ id?: string;
33
+ sseEvent?: string;
34
+ }
35
+ declare class NotifServer {
36
+ private clients;
37
+ private heartbeatInterval;
38
+ private heartbeatTimer;
39
+ private generateClientId;
40
+ private debug;
41
+ constructor(options?: NotifServerOptions);
42
+ /**
43
+ * Broadcast an event to one or more channels.
44
+ * Matches Pusher's `pusher.trigger(channel, event, data)` API.
45
+ *
46
+ * Example:
47
+ * ```ts
48
+ * server.trigger('orders', 'order-created', { id: 123, amount: 49.99 });
49
+ * ```
50
+ */
51
+ trigger(channel: string | string[], event: string, data: any, options?: TriggerOptions): void;
52
+ /**
53
+ * Alias for trigger().
54
+ */
55
+ broadcast(channel: string | string[], event: string, data: any, options?: TriggerOptions): void;
56
+ /**
57
+ * Send an event directly to a specific client ID.
58
+ */
59
+ sendToClient(clientId: string, event: string, data: any, options?: TriggerOptions & {
60
+ channel?: string;
61
+ }): boolean;
62
+ /**
63
+ * Send an event to all connected clients belonging to a specific user ID.
64
+ */
65
+ sendToUser(userId: string, event: string, data: any, options?: TriggerOptions & {
66
+ channel?: string;
67
+ }): number;
68
+ /**
69
+ * Subscribe a connected client to a channel.
70
+ */
71
+ subscribeClient(clientId: string, channel: string): boolean;
72
+ /**
73
+ * Unsubscribe a connected client from a channel.
74
+ */
75
+ unsubscribeClient(clientId: string, channel: string): boolean;
76
+ /**
77
+ * Get total connected clients count.
78
+ */
79
+ getClientCount(): number;
80
+ /**
81
+ * Get subscribers count for a specific channel.
82
+ */
83
+ getSubscribersCount(channel: string): number;
84
+ /**
85
+ * Handle incoming HTTP request in Node.js / Express / Fastify environment.
86
+ *
87
+ * Example:
88
+ * ```ts
89
+ * app.get('/sse', (req, res) => {
90
+ * server.handleRequest(req, res);
91
+ * });
92
+ * ```
93
+ */
94
+ handleRequest(req: IncomingMessage, res: ServerResponse, options?: {
95
+ clientId?: string;
96
+ userId?: string;
97
+ channels?: string[];
98
+ meta?: Record<string, any>;
99
+ }): NotifClient;
100
+ /**
101
+ * Handle Web standard Request (Next.js App Router, Edge runtime, Hono, Cloudflare Workers).
102
+ * Returns a standard `Response` object with a `ReadableStream`.
103
+ *
104
+ * Example:
105
+ * ```ts
106
+ * export function GET(request: Request) {
107
+ * return server.createWebResponse(request);
108
+ * }
109
+ * ```
110
+ */
111
+ createWebResponse(request?: Request, options?: {
112
+ clientId?: string;
113
+ userId?: string;
114
+ channels?: string[];
115
+ meta?: Record<string, any>;
116
+ }): Response;
117
+ /**
118
+ * Stop the server heartbeat and disconnect all clients.
119
+ */
120
+ close(): void;
121
+ private removeClient;
122
+ private startHeartbeat;
123
+ private log;
124
+ }
125
+
126
+ export { type NotifClient, NotifServer, type NotifServerOptions, type TriggerOptions };
@@ -0,0 +1,126 @@
1
+ import { IncomingMessage, ServerResponse } from 'http';
2
+
3
+ interface NotifClient {
4
+ id: string;
5
+ userId?: string;
6
+ channels: Set<string>;
7
+ send: (event: string, data: any, options?: {
8
+ channel?: string;
9
+ id?: string;
10
+ sseEvent?: string;
11
+ }) => void;
12
+ sendComment: (comment: string) => void;
13
+ close: () => void;
14
+ meta: Record<string, any>;
15
+ }
16
+ interface NotifServerOptions {
17
+ /**
18
+ * Heartbeat interval in milliseconds to keep SSE connections open through proxies.
19
+ * Defaults to 20000ms (20s). Set to 0 to disable.
20
+ */
21
+ heartbeatInterval?: number;
22
+ /**
23
+ * Optional custom client ID generator.
24
+ */
25
+ generateClientId?: () => string;
26
+ /**
27
+ * Debug logging.
28
+ */
29
+ debug?: boolean;
30
+ }
31
+ interface TriggerOptions {
32
+ id?: string;
33
+ sseEvent?: string;
34
+ }
35
+ declare class NotifServer {
36
+ private clients;
37
+ private heartbeatInterval;
38
+ private heartbeatTimer;
39
+ private generateClientId;
40
+ private debug;
41
+ constructor(options?: NotifServerOptions);
42
+ /**
43
+ * Broadcast an event to one or more channels.
44
+ * Matches Pusher's `pusher.trigger(channel, event, data)` API.
45
+ *
46
+ * Example:
47
+ * ```ts
48
+ * server.trigger('orders', 'order-created', { id: 123, amount: 49.99 });
49
+ * ```
50
+ */
51
+ trigger(channel: string | string[], event: string, data: any, options?: TriggerOptions): void;
52
+ /**
53
+ * Alias for trigger().
54
+ */
55
+ broadcast(channel: string | string[], event: string, data: any, options?: TriggerOptions): void;
56
+ /**
57
+ * Send an event directly to a specific client ID.
58
+ */
59
+ sendToClient(clientId: string, event: string, data: any, options?: TriggerOptions & {
60
+ channel?: string;
61
+ }): boolean;
62
+ /**
63
+ * Send an event to all connected clients belonging to a specific user ID.
64
+ */
65
+ sendToUser(userId: string, event: string, data: any, options?: TriggerOptions & {
66
+ channel?: string;
67
+ }): number;
68
+ /**
69
+ * Subscribe a connected client to a channel.
70
+ */
71
+ subscribeClient(clientId: string, channel: string): boolean;
72
+ /**
73
+ * Unsubscribe a connected client from a channel.
74
+ */
75
+ unsubscribeClient(clientId: string, channel: string): boolean;
76
+ /**
77
+ * Get total connected clients count.
78
+ */
79
+ getClientCount(): number;
80
+ /**
81
+ * Get subscribers count for a specific channel.
82
+ */
83
+ getSubscribersCount(channel: string): number;
84
+ /**
85
+ * Handle incoming HTTP request in Node.js / Express / Fastify environment.
86
+ *
87
+ * Example:
88
+ * ```ts
89
+ * app.get('/sse', (req, res) => {
90
+ * server.handleRequest(req, res);
91
+ * });
92
+ * ```
93
+ */
94
+ handleRequest(req: IncomingMessage, res: ServerResponse, options?: {
95
+ clientId?: string;
96
+ userId?: string;
97
+ channels?: string[];
98
+ meta?: Record<string, any>;
99
+ }): NotifClient;
100
+ /**
101
+ * Handle Web standard Request (Next.js App Router, Edge runtime, Hono, Cloudflare Workers).
102
+ * Returns a standard `Response` object with a `ReadableStream`.
103
+ *
104
+ * Example:
105
+ * ```ts
106
+ * export function GET(request: Request) {
107
+ * return server.createWebResponse(request);
108
+ * }
109
+ * ```
110
+ */
111
+ createWebResponse(request?: Request, options?: {
112
+ clientId?: string;
113
+ userId?: string;
114
+ channels?: string[];
115
+ meta?: Record<string, any>;
116
+ }): Response;
117
+ /**
118
+ * Stop the server heartbeat and disconnect all clients.
119
+ */
120
+ close(): void;
121
+ private removeClient;
122
+ private startHeartbeat;
123
+ private log;
124
+ }
125
+
126
+ export { type NotifClient, NotifServer, type NotifServerOptions, type TriggerOptions };