@rlanz/socket 0.0.1-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.
- package/LICENSE.md +9 -0
- package/README.md +387 -0
- package/build/chunk-4UPUCRVG.js +1772 -0
- package/build/chunk-4UPUCRVG.js.map +1 -0
- package/build/chunk-GKAD2UOA.js +18 -0
- package/build/chunk-GKAD2UOA.js.map +1 -0
- package/build/chunk-HK7Z65DA.js +19 -0
- package/build/chunk-HK7Z65DA.js.map +1 -0
- package/build/chunk-XUDFDJME.js +42 -0
- package/build/chunk-XUDFDJME.js.map +1 -0
- package/build/index.d.ts +10 -0
- package/build/index.js +21 -0
- package/build/index.js.map +1 -0
- package/build/providers/socket_provider.d.ts +40 -0
- package/build/providers/socket_provider.js +132 -0
- package/build/providers/socket_provider.js.map +1 -0
- package/build/services/socket.d.ts +12 -0
- package/build/services/socket.js +10 -0
- package/build/services/socket.js.map +1 -0
- package/build/shared_types-Dw9AphfO.d.ts +21 -0
- package/build/socket_service-jxIaH5Rs.d.ts +144 -0
- package/build/src/client/index.d.ts +106 -0
- package/build/src/client/index.js +671 -0
- package/build/src/client/index.js.map +1 -0
- package/build/src/client/types.d.ts +101 -0
- package/build/src/client/types.js +1 -0
- package/build/src/client/types.js.map +1 -0
- package/build/src/decorators.d.ts +17 -0
- package/build/src/decorators.js +9 -0
- package/build/src/decorators.js.map +1 -0
- package/build/src/health_check.d.ts +18 -0
- package/build/src/health_check.js +7 -0
- package/build/src/health_check.js.map +1 -0
- package/build/src/otel.d.ts +31 -0
- package/build/src/otel.js +276 -0
- package/build/src/otel.js.map +1 -0
- package/build/src/types/tracing_channels.d.ts +40 -0
- package/build/src/types/tracing_channels.js +1 -0
- package/build/src/types/tracing_channels.js.map +1 -0
- package/build/src/types.d.ts +5 -0
- package/build/src/types.js +1 -0
- package/build/src/types.js.map +1 -0
- package/build/types-C0rDwbry.d.ts +393 -0
- package/package.json +105 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/client/channel.ts","../../../src/client/socket_session.ts","../../../src/client/socket.ts"],"sourcesContent":["import type {\n SocketClientTransport,\n SubscribeOptions,\n SubscribeResult,\n UnsubscribeOptions,\n PresenceData,\n PresenceUser,\n EventHandler,\n ChannelMessage,\n ChannelAck,\n} from './types.js'\n\ninterface PendingSubscribe {\n promise: Promise<Channel>\n resolve: (channel: Channel) => void\n reject: (error: Error) => void\n token: number\n}\n\n/**\n * Represents a subscribed channel.\n * Chainable API inspired by Laravel Echo.\n *\n * @example\n * ```ts\n * socket.channel('chat/general')\n * .here((users) => setOnlineUsers(users))\n * .joining((user) => console.log(`${user.name} joined`))\n * .leaving((user) => console.log(`${user.name} left`))\n * .listen('chat:message', (msg) => addMessage(msg))\n * .subscribe()\n * ```\n */\nexport class Channel {\n /**\n * Channel name.\n */\n readonly name: string\n\n /**\n * Socket client transport.\n */\n #transport: SocketClientTransport\n\n /**\n * Whether the channel should stay subscribed.\n */\n #subscribed = false\n #active = false\n\n /**\n * Event handlers grouped by event type.\n */\n #eventHandlers = new Map<string, Set<EventHandler>>()\n\n /**\n * Current presence data.\n */\n #presence: PresenceData | null = null\n\n /**\n * Present user IDs used to detect join and leave events.\n */\n #presentUserIds = new Set<string>()\n\n /**\n * Handler registered through .here().\n */\n #hereHandler: EventHandler<PresenceUser[]> | null = null\n\n /**\n * Handler registered through .joining().\n */\n #joiningHandler: EventHandler<PresenceUser> | null = null\n\n /**\n * Handler registered through .leaving().\n */\n #leavingHandler: EventHandler<PresenceUser> | null = null\n\n /**\n * Internal transport handlers to clean up on unsubscribe.\n */\n #boundPresenceHandler: ((data: unknown) => void) | null = null\n #boundEventHandler: ((data: unknown) => void) | null = null\n #boundDisconnectHandler: (() => void) | null = null\n #listenersAttached = false\n #pendingSubscribe: PendingSubscribe | null = null\n #subscribeToken = 0\n\n constructor(name: string, transport: SocketClientTransport) {\n this.name = name\n this.#transport = transport\n }\n\n /**\n * Whether the channel should stay subscribed.\n */\n get subscribed(): boolean {\n return this.#subscribed\n }\n\n /**\n * Whether the channel is active on the server.\n */\n get active(): boolean {\n return this.#active\n }\n\n /**\n * List of present users.\n */\n get users(): PresenceUser[] {\n return this.#presence?.users ?? []\n }\n\n /**\n * Number of present users.\n */\n get count(): number {\n return this.#presence?.count ?? 0\n }\n\n /**\n * Registers a handler called with the present users.\n * Called immediately on subscribe and after each presence change.\n */\n here(handler: EventHandler<PresenceUser[]>): this {\n this.#hereHandler = handler\n return this\n }\n\n /**\n * Registers a handler called when a user joins.\n */\n joining(handler: EventHandler<PresenceUser>): this {\n this.#joiningHandler = handler\n return this\n }\n\n /**\n * Registers a handler called when a user leaves.\n */\n leaving(handler: EventHandler<PresenceUser>): this {\n this.#leavingHandler = handler\n return this\n }\n\n /**\n * Listens for an event on this channel.\n */\n listen<T = unknown>(event: string, handler: EventHandler<T>): this {\n if (!this.#eventHandlers.has(event)) {\n this.#eventHandlers.set(event, new Set())\n }\n this.#eventHandlers.get(event)!.add(handler as EventHandler)\n return this\n }\n\n /**\n * Removes an event listener.\n */\n stopListening(event: string, handler?: EventHandler): this {\n if (handler) {\n this.#eventHandlers.get(event)?.delete(handler)\n } else {\n this.#eventHandlers.delete(event)\n }\n return this\n }\n\n /**\n * Subscribes to the channel.\n *\n * client listeners -> subscribe ack -> active channel\n * | | |\n * v v v\n * events ready presence sync send/listen\n */\n async subscribe(options: SubscribeOptions = {}): Promise<this> {\n this.#subscribed = true\n\n if (this.#pendingSubscribe) {\n return this.#pendingSubscribe.promise as Promise<this>\n }\n\n if (this.#active) {\n return this\n }\n\n const timeout = options.timeout ?? 5000\n\n // Attach listeners before subscribing so the first server events are not missed.\n if (!this.#listenersAttached) {\n this.#setupSocketListeners()\n }\n\n const token = ++this.#subscribeToken\n\n let resolvePromise: (channel: Channel) => void\n let rejectPromise: (error: Error) => void\n\n const promise = new Promise<Channel>((resolve, reject) => {\n resolvePromise = resolve\n rejectPromise = reject\n })\n\n this.#pendingSubscribe = {\n promise,\n resolve: resolvePromise!,\n reject: rejectPromise!,\n token,\n }\n\n const { resolve, reject } = this.#pendingSubscribe\n\n const timer = setTimeout(() => {\n if (token !== this.#subscribeToken) return\n this.#pendingSubscribe = null\n this.#resetConnectionState()\n reject(new Error(`Subscribe timeout for channel: ${this.name}`))\n }, timeout)\n\n this.#transport\n .sendRequest<SubscribeResult>({ type: 'subscribe', channel: this.name }, timeout)\n .then((response) => {\n if (token !== this.#subscribeToken) return\n clearTimeout(timer)\n this.#pendingSubscribe = null\n\n if (response.ok) {\n this.#active = true\n\n const presenceData = response.data?.presenceData ?? response.presenceData\n\n // Apply the initial presence snapshot.\n if (presenceData) {\n this.#handleInitialPresence(presenceData)\n }\n\n resolve(this)\n } else {\n this.#resetConnectionState()\n reject(new Error(response.error ?? 'Subscribe failed'))\n }\n })\n .catch((error) => {\n if (token !== this.#subscribeToken) return\n clearTimeout(timer)\n this.#pendingSubscribe = null\n this.#resetConnectionState()\n reject(error instanceof Error ? error : new Error('Subscribe failed'))\n })\n\n return promise as Promise<this>\n }\n\n /**\n * Unsubscribes from the channel.\n */\n async unsubscribe(options: UnsubscribeOptions = {}): Promise<void> {\n if (!this.#subscribed && !this.#active) return\n this.#subscribed = false\n this.#subscribeToken++\n if (this.#pendingSubscribe) {\n this.#pendingSubscribe.reject(new Error(`Unsubscribed from channel: ${this.name}`))\n this.#pendingSubscribe = null\n }\n\n return new Promise((resolve) => {\n const timeout = options.timeout ?? 5000\n const timer = setTimeout(() => {\n this.#cleanupTerminal()\n resolve()\n }, timeout)\n\n this.#transport\n .sendRequest({ type: 'unsubscribe', channel: this.name }, timeout)\n .then(() => {\n clearTimeout(timer)\n this.#cleanupTerminal()\n resolve()\n })\n .catch(() => {\n clearTimeout(timer)\n this.#cleanupTerminal()\n resolve()\n })\n })\n }\n\n /**\n * Sends an event to the server.\n */\n send<T = unknown>(event: string, data?: T): this {\n if (!this.#active) {\n console.warn(`Cannot send to channel ${this.name}: not subscribed`)\n return this\n }\n const payload: ChannelMessage = {\n channel: this.name,\n event,\n data,\n }\n this.#transport.send({ type: 'message', ...payload })\n return this\n }\n\n /**\n * Sends an event and waits for a response.\n */\n async sendWithAck<T = unknown, R = unknown>(event: string, data?: T): Promise<R> {\n if (!this.#active) {\n throw new Error(`Cannot send to channel ${this.name}: not subscribed`)\n }\n const payload: ChannelMessage = {\n channel: this.name,\n event,\n data,\n }\n const response = await this.#transport.sendRequest<ChannelAck<R>>({\n type: 'message',\n ...payload,\n })\n if (!response?.ok) {\n throw new Error(response?.error ?? `Channel handler failed: ${event}`)\n }\n return response.data as R\n }\n\n /**\n * Configures transport listeners.\n */\n #setupSocketListeners(): void {\n // Handler for presence:update.\n this.#boundPresenceHandler = (data: unknown) => {\n if (!data || typeof data !== 'object') return\n this.#handlePresenceUpdate(data as PresenceData)\n }\n this.#transport.on(`channel:${this.name}:presence:update`, this.#boundPresenceHandler)\n\n this.#boundEventHandler = (data: unknown) => {\n if (!data || typeof data !== 'object') return\n\n const payload = data as { event?: string; data?: unknown }\n if (!payload.event) return\n\n const handlers = this.#eventHandlers.get(payload.event)\n handlers?.forEach((handler) => handler(payload.data))\n }\n this.#transport.on(`channel:${this.name}:event`, this.#boundEventHandler)\n\n // Mark the channel inactive when the socket disconnects.\n this.#boundDisconnectHandler = () => {\n this.#resetConnectionState()\n }\n this.#transport.on('disconnect', this.#boundDisconnectHandler)\n\n this.#listenersAttached = true\n }\n\n /**\n * Handles the initial presence snapshot.\n */\n #handleInitialPresence(data: PresenceData): void {\n this.#presence = data\n this.#presentUserIds = new Set(data.users.map((u) => u.id))\n\n // Call here() with all users.\n this.#hereHandler?.(data.users)\n }\n\n /**\n * Handles a presence update.\n *\n * previous IDs current IDs\n * | |\n * +-- diff in -----+--> joining / leaving callbacks\n */\n #handlePresenceUpdate(data: PresenceData): void {\n const previousIds = this.#presentUserIds\n const currentIds = new Set(data.users.map((u) => u.id))\n\n // Detect new users.\n for (const user of data.users) {\n if (!previousIds.has(user.id)) {\n this.#joiningHandler?.(user)\n }\n }\n\n // Detect users that left.\n if (this.#presence) {\n for (const user of this.#presence.users) {\n if (!currentIds.has(user.id)) {\n this.#leavingHandler?.(user)\n }\n }\n }\n\n // Update local state.\n this.#presence = data\n this.#presentUserIds = currentIds\n\n // Call here() with the updated list.\n this.#hereHandler?.(data.users)\n }\n\n #resetConnectionState(): void {\n this.#active = false\n this.#presence = null\n this.#presentUserIds.clear()\n }\n\n #detachTransportListeners(): void {\n if (this.#boundPresenceHandler) {\n this.#transport.off(`channel:${this.name}:presence:update`, this.#boundPresenceHandler)\n this.#boundPresenceHandler = null\n }\n\n if (this.#boundEventHandler) {\n this.#transport.off(`channel:${this.name}:event`, this.#boundEventHandler)\n this.#boundEventHandler = null\n }\n\n if (this.#boundDisconnectHandler) {\n this.#transport.off('disconnect', this.#boundDisconnectHandler)\n this.#boundDisconnectHandler = null\n }\n\n this.#listenersAttached = false\n }\n\n #clearUserCallbacks(): void {\n this.#eventHandlers.clear()\n this.#hereHandler = null\n this.#joiningHandler = null\n this.#leavingHandler = null\n }\n\n /**\n * Performs terminal cleanup after the user leaves or the socket is disposed.\n */\n #cleanupTerminal(): void {\n this.#subscribed = false\n this.#resetConnectionState()\n this.#detachTransportListeners()\n this.#clearUserCallbacks()\n }\n}\n","import type { ConnectionState, EventHandler } from './types.js'\nimport type { ServerProtocolMessage } from '../shared_types.js'\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n timer: ReturnType<typeof setTimeout>\n}\n\ninterface ClientSocketSessionOptions {\n buildUrl: () => string\n createWebSocket?: (url: string) => WebSocket\n autoReconnect?: boolean\n reconnectDelay?: number\n reconnectMaxDelay?: number\n onConnected?: () => void\n}\n\nexport class ClientSocketSession {\n #ws: WebSocket | null = null\n #state: ConnectionState = 'disconnected'\n #connectPromise: Promise<void> | null = null\n #cancelConnect: ((error: Error) => void) | null = null\n #stateHandlers = new Set<EventHandler<ConnectionState>>()\n #eventHandlers = new Map<string, Set<EventHandler>>()\n #pendingRequests = new Map<string, PendingRequest>()\n #requestId = 0\n #reconnectAttempts = 0\n #reconnectTimer: ReturnType<typeof setTimeout> | null = null\n #manualDisconnect = false\n #buildUrl: () => string\n #createWebSocket: (url: string) => WebSocket\n #autoReconnect: boolean\n #reconnectDelay: number\n #reconnectMaxDelay: number\n #onConnected?: () => void\n\n constructor(options: ClientSocketSessionOptions) {\n this.#buildUrl = options.buildUrl\n this.#createWebSocket = options.createWebSocket ?? ((url) => new WebSocket(url))\n this.#autoReconnect = options.autoReconnect ?? true\n this.#reconnectDelay = Math.max(0, options.reconnectDelay ?? 250)\n this.#reconnectMaxDelay = Math.max(this.#reconnectDelay, options.reconnectMaxDelay ?? 5000)\n this.#onConnected = options.onConnected\n }\n\n get state(): ConnectionState {\n return this.#state\n }\n\n get connected(): boolean {\n return this.#state === 'connected'\n }\n\n connect(): Promise<void> {\n if (this.#state === 'connected') {\n return Promise.resolve()\n }\n\n if (this.#connectPromise) {\n return this.#connectPromise\n }\n\n this.#manualDisconnect = false\n this.#setState('connecting')\n\n const connectPromise = new Promise<void>((resolve, reject) => {\n const ws = this.#createWebSocket(this.#buildUrl())\n this.#ws = ws\n let settled = false\n\n const cleanup = () => {\n ws.removeEventListener('open', handleOpen)\n ws.removeEventListener('error', handleError)\n if (this.#connectPromise === connectPromise) {\n this.#connectPromise = null\n }\n if (this.#cancelConnect === cancelConnect) {\n this.#cancelConnect = null\n }\n }\n\n const cancelConnect = (error: Error) => {\n if (settled) {\n return\n }\n\n settled = true\n cleanup()\n reject(error)\n }\n\n const handleOpen = () => {\n settled = true\n cleanup()\n this.#reconnectAttempts = 0\n this.#setState('connected')\n this.#emitLocal('connect')\n this.#onConnected?.()\n resolve()\n }\n\n const handleError = () => {\n cancelConnect(new Error('WebSocket connection failed'))\n if (this.#ws === ws) {\n this.#setState('disconnected')\n }\n }\n\n const handleClose = () => {\n cancelConnect(new Error('WebSocket connection failed'))\n\n if (this.#ws === ws) {\n this.#handleClose()\n }\n }\n\n this.#cancelConnect = cancelConnect\n ws.addEventListener('open', handleOpen)\n ws.addEventListener('error', handleError)\n ws.addEventListener('message', (event) => this.#handleIncoming(event.data))\n ws.addEventListener('close', handleClose)\n })\n\n this.#connectPromise = connectPromise\n return connectPromise\n }\n\n disconnect(): void {\n this.#manualDisconnect = true\n if (this.#reconnectTimer) {\n clearTimeout(this.#reconnectTimer)\n this.#reconnectTimer = null\n }\n\n this.#cancelConnect?.(new Error('Socket disconnected'))\n this.#reconnectAttempts = 0\n this.#ws?.close()\n this.#rejectPending(new Error('Socket disconnected'))\n }\n\n onStateChange(handler: EventHandler<ConnectionState>): () => void {\n this.#stateHandlers.add(handler)\n\n return () => {\n this.#stateHandlers.delete(handler)\n }\n }\n\n on<T = unknown>(event: string, handler: EventHandler<T>): () => void {\n if (!this.#eventHandlers.has(event)) {\n this.#eventHandlers.set(event, new Set())\n }\n\n this.#eventHandlers.get(event)!.add(handler as EventHandler)\n\n return () => {\n this.off(event, handler as EventHandler)\n }\n }\n\n off(event: string, handler: EventHandler): void {\n this.#eventHandlers.get(event)?.delete(handler)\n }\n\n send(message: Record<string, unknown>): void {\n if (this.#ws?.readyState !== WebSocket.OPEN) {\n return\n }\n\n this.#ws.send(JSON.stringify(message))\n }\n\n sendRequest<T = unknown>(message: Record<string, unknown>, timeout = 5000): Promise<T> {\n if (this.#ws?.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error('Socket is not connected'))\n }\n\n const id = String(++this.#requestId)\n const payload = { id, ...message }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.#pendingRequests.delete(id)\n reject(new Error('Socket request timed out'))\n }, timeout)\n\n this.#pendingRequests.set(id, { resolve: resolve as (value: unknown) => void, reject, timer })\n this.#ws!.send(JSON.stringify(payload))\n })\n }\n\n #handleIncoming(raw: unknown): void {\n const message = this.#parseMessage(raw)\n if (!message) {\n return\n }\n\n if (message.type === 'ack') {\n this.#resolveAck(message)\n return\n }\n\n if (message.type === 'event') {\n if (message.channel) {\n if (message.event === 'presence:update') {\n this.#emitLocal(`channel:${message.channel}:presence:update`, message.data)\n return\n }\n\n this.#emitLocal(`channel:${message.channel}:event`, {\n event: message.event,\n data: message.data,\n })\n return\n }\n\n this.#emitLocal(message.event, message.data)\n }\n }\n\n #parseMessage(raw: unknown): ServerProtocolMessage | null {\n try {\n const data = typeof raw === 'string' ? raw : String(raw)\n const message = JSON.parse(data)\n return message && typeof message === 'object' ? (message as ServerProtocolMessage) : null\n } catch {\n return null\n }\n }\n\n #resolveAck(message: Extract<ServerProtocolMessage, { type: 'ack' }>): void {\n if (!message.id) {\n return\n }\n\n const pending = this.#pendingRequests.get(message.id)\n if (!pending) {\n return\n }\n\n clearTimeout(pending.timer)\n this.#pendingRequests.delete(message.id)\n\n if (message.ok) {\n pending.resolve({ ok: true, data: message.data })\n } else {\n pending.resolve({ ok: false, error: message.error })\n }\n }\n\n #handleClose(): void {\n const shouldEmitDisconnect = this.#state !== 'disconnected'\n\n this.#setState('disconnected')\n if (shouldEmitDisconnect) {\n this.#emitLocal('disconnect')\n }\n this.#rejectPending(new Error('Socket disconnected'))\n\n this.#scheduleReconnect()\n }\n\n #scheduleReconnect(): void {\n if (this.#manualDisconnect || !this.#autoReconnect || this.#reconnectTimer) {\n return\n }\n\n const delay = Math.min(\n this.#reconnectDelay * 2 ** this.#reconnectAttempts,\n this.#reconnectMaxDelay\n )\n this.#reconnectAttempts += 1\n\n this.#reconnectTimer = setTimeout(() => {\n this.#reconnectTimer = null\n this.connect().catch(() => this.#handleClose())\n }, delay)\n }\n\n #rejectPending(error: Error): void {\n for (const [id, pending] of this.#pendingRequests) {\n clearTimeout(pending.timer)\n pending.reject(error)\n this.#pendingRequests.delete(id)\n }\n }\n\n #emitLocal(event: string, data?: unknown): void {\n this.#eventHandlers.get(event)?.forEach((handler) => handler(data))\n }\n\n #setState(state: ConnectionState): void {\n if (this.#state === state) {\n return\n }\n\n this.#state = state\n this.#stateHandlers.forEach((handler) => handler(state))\n }\n}\n","import { Channel } from './channel.js'\nimport { ClientSocketSession } from './socket_session.js'\nimport type {\n SocketOptions,\n ConnectionState,\n EventHandler,\n SocketClientTransport,\n} from './types.js'\n\n/**\n * Main Socket client.\n */\nexport class Socket implements SocketClientTransport {\n #channels = new Map<string, Channel>()\n #url: string\n #path: string\n #auth?: Record<string, unknown>\n #session: ClientSocketSession\n\n constructor(options: SocketOptions = {}) {\n const browserWindow = globalThis as typeof globalThis & {\n window?: { location?: { origin?: string } }\n }\n const browserOrigin =\n typeof globalThis === 'object' && browserWindow.window?.location?.origin\n ? browserWindow.window.location.origin\n : ''\n\n this.#url = options.url ?? browserOrigin\n this.#path = options.path ?? '/socket'\n this.#auth = options.auth\n this.#session = new ClientSocketSession({\n buildUrl: () => this.#buildUrl(),\n autoReconnect: options.autoReconnect,\n reconnectDelay: options.reconnectDelay,\n reconnectMaxDelay: options.reconnectMaxDelay,\n onConnected: () => {\n void this.#resubscribeChannels()\n },\n })\n }\n\n get state(): ConnectionState {\n return this.#session.state\n }\n\n get connected(): boolean {\n return this.#session.connected\n }\n\n get id(): string | undefined {\n return undefined\n }\n\n connect(): Promise<void> {\n return this.#session.connect()\n }\n\n disconnect(): void {\n for (const channel of this.#channels.values()) {\n channel.unsubscribe().catch(() => {})\n }\n this.#channels.clear()\n\n this.#session.disconnect()\n }\n\n channel(name: string): Channel {\n if (!this.#channels.has(name)) {\n this.#channels.set(name, new Channel(name, this))\n }\n\n return this.#channels.get(name)!\n }\n\n async leave(name: string): Promise<void> {\n const channel = this.#channels.get(name)\n if (channel) {\n await channel.unsubscribe()\n this.#channels.delete(name)\n }\n }\n\n onStateChange(handler: EventHandler<ConnectionState>): () => void {\n return this.#session.onStateChange(handler)\n }\n\n on<T = unknown>(event: string, handler: EventHandler<T>): () => void {\n return this.#session.on(event, handler)\n }\n\n off(event: string, handler: EventHandler): void {\n this.#session.off(event, handler)\n }\n\n send(message: Record<string, unknown>): void {\n this.#session.send(message)\n }\n\n sendRequest<T = unknown>(message: Record<string, unknown>, timeout = 5000): Promise<T> {\n return this.#session.sendRequest(message, timeout)\n }\n\n #buildUrl(): string {\n const browserGlobal = globalThis as typeof globalThis & {\n location?: { origin?: string }\n }\n const url = new URL(this.#url || browserGlobal.location?.origin || 'http://localhost')\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n url.pathname = this.#path\n\n if (this.#auth) {\n url.searchParams.set('auth', JSON.stringify(this.#auth))\n }\n\n return url.toString()\n }\n\n async #resubscribeChannels(): Promise<void> {\n for (const channel of this.#channels.values()) {\n if (channel.subscribed && !channel.active) {\n await channel.subscribe().catch(console.error)\n }\n }\n }\n}\n"],"mappings":"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","names":["resolve","reject"]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export { C as ChannelAck, a as ChannelMessage } from '../../shared_types-Dw9AphfO.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Connection options.
|
|
5
|
+
*/
|
|
6
|
+
interface SocketOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Server URL. Defaults to window.location.origin.
|
|
9
|
+
*/
|
|
10
|
+
url?: string;
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket path. Defaults to /socket.
|
|
13
|
+
*/
|
|
14
|
+
path?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Automatic reconnection. Defaults to true.
|
|
17
|
+
*/
|
|
18
|
+
autoReconnect?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Initial automatic reconnection delay in ms. Defaults to 250.
|
|
21
|
+
*/
|
|
22
|
+
reconnectDelay?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Maximum automatic reconnection delay in ms. Defaults to 5000.
|
|
25
|
+
*/
|
|
26
|
+
reconnectMaxDelay?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Authentication data sent during the WebSocket handshake query string.
|
|
29
|
+
* Ex: { token: 'oat_MjE...' }
|
|
30
|
+
*/
|
|
31
|
+
auth?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Channel subscription options.
|
|
35
|
+
*/
|
|
36
|
+
interface SubscribeOptions {
|
|
37
|
+
/**
|
|
38
|
+
* Timeout in ms. Defaults to 5000.
|
|
39
|
+
*/
|
|
40
|
+
timeout?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Channel unsubscription options.
|
|
44
|
+
*/
|
|
45
|
+
interface UnsubscribeOptions {
|
|
46
|
+
/**
|
|
47
|
+
* Timeout in ms. Defaults to 5000.
|
|
48
|
+
*/
|
|
49
|
+
timeout?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Data returned by a successful channel subscription.
|
|
53
|
+
*/
|
|
54
|
+
interface SubscribeAckData {
|
|
55
|
+
presenceData?: PresenceData | null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Subscription response.
|
|
59
|
+
*/
|
|
60
|
+
interface SubscribeResult {
|
|
61
|
+
ok: boolean;
|
|
62
|
+
error?: string;
|
|
63
|
+
data?: SubscribeAckData;
|
|
64
|
+
presenceData?: PresenceData | null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Presence data.
|
|
68
|
+
*/
|
|
69
|
+
interface PresenceData {
|
|
70
|
+
channel: string;
|
|
71
|
+
users: PresenceUser[];
|
|
72
|
+
count: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* User in presence data.
|
|
76
|
+
*/
|
|
77
|
+
interface PresenceUser {
|
|
78
|
+
id: string;
|
|
79
|
+
name: string;
|
|
80
|
+
joinedAt: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Connection state.
|
|
84
|
+
*/
|
|
85
|
+
type ConnectionState = 'disconnected' | 'connecting' | 'connected';
|
|
86
|
+
/**
|
|
87
|
+
* Event handler.
|
|
88
|
+
*/
|
|
89
|
+
type EventHandler<T = unknown> = (data: T) => void;
|
|
90
|
+
/**
|
|
91
|
+
* Internal client transport used by channels.
|
|
92
|
+
*/
|
|
93
|
+
interface SocketClientTransport {
|
|
94
|
+
connected: boolean;
|
|
95
|
+
sendRequest<T = unknown>(message: Record<string, unknown>, timeout?: number): Promise<T>;
|
|
96
|
+
send(message: Record<string, unknown>): void;
|
|
97
|
+
on(event: string, handler: EventHandler): void;
|
|
98
|
+
off(event: string, handler: EventHandler): void;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export type { ConnectionState, EventHandler, PresenceData, PresenceUser, SocketClientTransport, SocketOptions, SubscribeAckData, SubscribeOptions, SubscribeResult, UnsubscribeOptions };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { C as ChannelEventMap, a as ChannelHandlerMap } from '../types-C0rDwbry.js';
|
|
2
|
+
import 'ws';
|
|
3
|
+
import 'node:http';
|
|
4
|
+
import '@boringnode/bus/types/main';
|
|
5
|
+
import '../shared_types-Dw9AphfO.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Legacy method decorator used to bind an incoming channel event to a method.
|
|
9
|
+
*/
|
|
10
|
+
declare function onMessage<EventName extends string>(event: EventName): MethodDecorator;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve decorated handlers for a channel instance, including inherited ones.
|
|
13
|
+
* Child classes override parent handlers when the event name is the same.
|
|
14
|
+
*/
|
|
15
|
+
declare function getDecoratedChannelHandlers<User = unknown, Events extends ChannelEventMap = ChannelEventMap, HttpContext = unknown>(instance: object): ChannelHandlerMap<User, Events, HttpContext>;
|
|
16
|
+
|
|
17
|
+
export { getDecoratedChannelHandlers, onMessage };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { S as SocketService } from '../socket_service-jxIaH5Rs.js';
|
|
2
|
+
import '../types-C0rDwbry.js';
|
|
3
|
+
import { BaseCheck, Result } from '@adonisjs/core/health';
|
|
4
|
+
import '../shared_types-Dw9AphfO.js';
|
|
5
|
+
import 'node:http';
|
|
6
|
+
import '@adonisjs/logger';
|
|
7
|
+
import 'emittery';
|
|
8
|
+
import 'ws';
|
|
9
|
+
import '@boringnode/bus/types/main';
|
|
10
|
+
|
|
11
|
+
declare class SocketHealthCheck extends BaseCheck {
|
|
12
|
+
private socket;
|
|
13
|
+
name: string;
|
|
14
|
+
constructor(socket: SocketService);
|
|
15
|
+
run(): Promise<Result>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { SocketHealthCheck };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Span } from '@opentelemetry/api';
|
|
2
|
+
import { TracingChannelSubscribers } from 'node:diagnostics_channel';
|
|
3
|
+
import { InstrumentationBase, InstrumentationConfig } from '@opentelemetry/instrumentation';
|
|
4
|
+
import { SocketConnectMessage, SocketDisconnectMessage, SocketSubscribeMessage, SocketUnsubscribeMessage, SocketChannelMessage, SocketBroadcastMessage } from './types/tracing_channels.js';
|
|
5
|
+
|
|
6
|
+
interface SocketInstrumentationConfig extends InstrumentationConfig {
|
|
7
|
+
/**
|
|
8
|
+
* The messaging system identifier.
|
|
9
|
+
*
|
|
10
|
+
* @default '@rlanz/socket'
|
|
11
|
+
*/
|
|
12
|
+
messagingSystem?: string;
|
|
13
|
+
}
|
|
14
|
+
declare class SocketInstrumentation extends InstrumentationBase<SocketInstrumentationConfig> {
|
|
15
|
+
#private;
|
|
16
|
+
protected subscribed: boolean;
|
|
17
|
+
protected spans: WeakMap<object, Span>;
|
|
18
|
+
protected connectHandlers?: TracingChannelSubscribers<SocketConnectMessage>;
|
|
19
|
+
protected disconnectHandlers?: TracingChannelSubscribers<SocketDisconnectMessage>;
|
|
20
|
+
protected subscribeHandlers?: TracingChannelSubscribers<SocketSubscribeMessage>;
|
|
21
|
+
protected unsubscribeHandlers?: TracingChannelSubscribers<SocketUnsubscribeMessage>;
|
|
22
|
+
protected messageHandlers?: TracingChannelSubscribers<SocketChannelMessage>;
|
|
23
|
+
protected broadcastHandlers?: TracingChannelSubscribers<SocketBroadcastMessage>;
|
|
24
|
+
constructor(config?: SocketInstrumentationConfig);
|
|
25
|
+
protected init(): undefined;
|
|
26
|
+
enable(): void;
|
|
27
|
+
disable(): void;
|
|
28
|
+
manuallyRegister(): void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { SocketInstrumentation, type SocketInstrumentationConfig };
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import {
|
|
2
|
+
broadcastChannel,
|
|
3
|
+
channelMessageChannel,
|
|
4
|
+
connectChannel,
|
|
5
|
+
disconnectChannel,
|
|
6
|
+
subscribeChannel,
|
|
7
|
+
unsubscribeChannel
|
|
8
|
+
} from "../chunk-GKAD2UOA.js";
|
|
9
|
+
|
|
10
|
+
// src/otel.ts
|
|
11
|
+
import { SpanKind, SpanStatusCode } from "@opentelemetry/api";
|
|
12
|
+
import { InstrumentationBase } from "@opentelemetry/instrumentation";
|
|
13
|
+
var SocketInstrumentation = class extends InstrumentationBase {
|
|
14
|
+
subscribed = false;
|
|
15
|
+
spans = /* @__PURE__ */ new WeakMap();
|
|
16
|
+
connectHandlers;
|
|
17
|
+
disconnectHandlers;
|
|
18
|
+
subscribeHandlers;
|
|
19
|
+
unsubscribeHandlers;
|
|
20
|
+
messageHandlers;
|
|
21
|
+
broadcastHandlers;
|
|
22
|
+
#connectionCounter = this.meter.createCounter("rlanz_socket_connections_total", {
|
|
23
|
+
description: "Total number of accepted socket connections"
|
|
24
|
+
});
|
|
25
|
+
#disconnectionCounter = this.meter.createCounter("rlanz_socket_disconnections_total", {
|
|
26
|
+
description: "Total number of closed socket connections"
|
|
27
|
+
});
|
|
28
|
+
#activeConnections = this.meter.createUpDownCounter("rlanz_socket_connections_active", {
|
|
29
|
+
description: "Number of currently active socket connections"
|
|
30
|
+
});
|
|
31
|
+
#subscriptionCounter = this.meter.createCounter("rlanz_socket_subscriptions_total", {
|
|
32
|
+
description: "Total number of successful channel subscriptions"
|
|
33
|
+
});
|
|
34
|
+
#activeSubscriptions = this.meter.createUpDownCounter("rlanz_socket_subscriptions_active", {
|
|
35
|
+
description: "Number of currently active channel subscriptions"
|
|
36
|
+
});
|
|
37
|
+
#messageCounter = this.meter.createCounter("rlanz_socket_messages_total", {
|
|
38
|
+
description: "Total number of channel messages received from clients"
|
|
39
|
+
});
|
|
40
|
+
#broadcastCounter = this.meter.createCounter("rlanz_socket_broadcasts_total", {
|
|
41
|
+
description: "Total number of broadcast operations"
|
|
42
|
+
});
|
|
43
|
+
#broadcastDeliveryCounter = this.meter.createCounter("rlanz_socket_broadcast_deliveries_total", {
|
|
44
|
+
description: "Total number of socket deliveries made by broadcast operations"
|
|
45
|
+
});
|
|
46
|
+
constructor(config = {}) {
|
|
47
|
+
super("@rlanz/socket", "0.0.1", config);
|
|
48
|
+
}
|
|
49
|
+
get #messagingSystem() {
|
|
50
|
+
return this.getConfig().messagingSystem ?? "@rlanz/socket";
|
|
51
|
+
}
|
|
52
|
+
init() {
|
|
53
|
+
return void 0;
|
|
54
|
+
}
|
|
55
|
+
enable() {
|
|
56
|
+
super.enable();
|
|
57
|
+
if (this.subscribed !== void 0) this.#subscribe();
|
|
58
|
+
}
|
|
59
|
+
disable() {
|
|
60
|
+
if (this.subscribed !== void 0) this.#unsubscribe();
|
|
61
|
+
super.disable();
|
|
62
|
+
}
|
|
63
|
+
manuallyRegister() {
|
|
64
|
+
this.#subscribe();
|
|
65
|
+
}
|
|
66
|
+
#subscribe() {
|
|
67
|
+
if (this.subscribed) return;
|
|
68
|
+
if (!this.isEnabled()) return;
|
|
69
|
+
this.subscribed = true;
|
|
70
|
+
this.connectHandlers = {
|
|
71
|
+
start: (message) => this.#startSpan(message, "socket connect", SpanKind.SERVER, {
|
|
72
|
+
"network.transport": "websocket"
|
|
73
|
+
}),
|
|
74
|
+
end: (message) => this.#handleConnectEnd(message),
|
|
75
|
+
asyncStart: () => {
|
|
76
|
+
},
|
|
77
|
+
asyncEnd: () => {
|
|
78
|
+
},
|
|
79
|
+
error: (message) => this.#recordError(message)
|
|
80
|
+
};
|
|
81
|
+
this.disconnectHandlers = {
|
|
82
|
+
start: (message) => this.#startSpan(message, "socket disconnect", SpanKind.INTERNAL, {
|
|
83
|
+
"socket.disconnect.reason": message.reason,
|
|
84
|
+
"socket.disconnect.subscriptions": message.subscriptions ?? 0
|
|
85
|
+
}),
|
|
86
|
+
end: () => {
|
|
87
|
+
},
|
|
88
|
+
asyncStart: () => {
|
|
89
|
+
},
|
|
90
|
+
asyncEnd: (message) => this.#handleDisconnectEnd(message),
|
|
91
|
+
error: (message) => this.#recordError(message)
|
|
92
|
+
};
|
|
93
|
+
this.subscribeHandlers = {
|
|
94
|
+
start: (message) => this.#startSpan(message, `socket subscribe ${message.channel}`, SpanKind.SERVER, {
|
|
95
|
+
"messaging.destination.name": message.channel,
|
|
96
|
+
"messaging.operation.name": "subscribe",
|
|
97
|
+
"messaging.operation.type": "receive"
|
|
98
|
+
}),
|
|
99
|
+
end: () => {
|
|
100
|
+
},
|
|
101
|
+
asyncStart: () => {
|
|
102
|
+
},
|
|
103
|
+
asyncEnd: (message) => this.#handleSubscribeEnd(message),
|
|
104
|
+
error: (message) => this.#recordError(message)
|
|
105
|
+
};
|
|
106
|
+
this.unsubscribeHandlers = {
|
|
107
|
+
start: (message) => this.#startSpan(message, `socket unsubscribe ${message.channel}`, SpanKind.SERVER, {
|
|
108
|
+
"messaging.destination.name": message.channel,
|
|
109
|
+
"messaging.operation.name": "unsubscribe",
|
|
110
|
+
"messaging.operation.type": "receive"
|
|
111
|
+
}),
|
|
112
|
+
end: () => {
|
|
113
|
+
},
|
|
114
|
+
asyncStart: () => {
|
|
115
|
+
},
|
|
116
|
+
asyncEnd: (message) => this.#handleUnsubscribeEnd(message),
|
|
117
|
+
error: (message) => this.#recordError(message)
|
|
118
|
+
};
|
|
119
|
+
this.messageHandlers = {
|
|
120
|
+
start: (message) => this.#startSpan(message, `socket message ${message.channel}`, SpanKind.SERVER, {
|
|
121
|
+
"messaging.destination.name": message.channel,
|
|
122
|
+
"messaging.operation.name": "process",
|
|
123
|
+
"messaging.operation.type": "receive",
|
|
124
|
+
"messaging.event.name": message.event
|
|
125
|
+
}),
|
|
126
|
+
end: () => {
|
|
127
|
+
},
|
|
128
|
+
asyncStart: () => {
|
|
129
|
+
},
|
|
130
|
+
asyncEnd: (message) => this.#handleMessageEnd(message),
|
|
131
|
+
error: (message) => this.#recordError(message)
|
|
132
|
+
};
|
|
133
|
+
this.broadcastHandlers = {
|
|
134
|
+
start: (message) => this.#startSpan(message, `socket broadcast ${message.target}`, SpanKind.PRODUCER, {
|
|
135
|
+
...this.#broadcastAttributes(message)
|
|
136
|
+
}),
|
|
137
|
+
end: (message) => this.#handleBroadcastEnd(message),
|
|
138
|
+
asyncStart: () => {
|
|
139
|
+
},
|
|
140
|
+
asyncEnd: () => {
|
|
141
|
+
},
|
|
142
|
+
error: (message) => this.#recordError(message)
|
|
143
|
+
};
|
|
144
|
+
connectChannel.subscribe(this.connectHandlers);
|
|
145
|
+
disconnectChannel.subscribe(this.disconnectHandlers);
|
|
146
|
+
subscribeChannel.subscribe(this.subscribeHandlers);
|
|
147
|
+
unsubscribeChannel.subscribe(this.unsubscribeHandlers);
|
|
148
|
+
channelMessageChannel.subscribe(this.messageHandlers);
|
|
149
|
+
broadcastChannel.subscribe(this.broadcastHandlers);
|
|
150
|
+
}
|
|
151
|
+
#unsubscribe() {
|
|
152
|
+
if (!this.subscribed) return;
|
|
153
|
+
if (this.connectHandlers) connectChannel.unsubscribe(this.connectHandlers);
|
|
154
|
+
if (this.disconnectHandlers) disconnectChannel.unsubscribe(this.disconnectHandlers);
|
|
155
|
+
if (this.subscribeHandlers) subscribeChannel.unsubscribe(this.subscribeHandlers);
|
|
156
|
+
if (this.unsubscribeHandlers) unsubscribeChannel.unsubscribe(this.unsubscribeHandlers);
|
|
157
|
+
if (this.messageHandlers) channelMessageChannel.unsubscribe(this.messageHandlers);
|
|
158
|
+
if (this.broadcastHandlers) broadcastChannel.unsubscribe(this.broadcastHandlers);
|
|
159
|
+
this.subscribed = false;
|
|
160
|
+
this.spans = /* @__PURE__ */ new WeakMap();
|
|
161
|
+
}
|
|
162
|
+
#startSpan(message, name, kind, attributes = {}) {
|
|
163
|
+
const span = this.tracer.startSpan(name, {
|
|
164
|
+
kind,
|
|
165
|
+
attributes: {
|
|
166
|
+
"messaging.system": this.#messagingSystem,
|
|
167
|
+
...attributes
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
this.spans.set(message, span);
|
|
171
|
+
}
|
|
172
|
+
#handleDisconnectEnd(message) {
|
|
173
|
+
this.#disconnectionCounter.add(1, { "socket.disconnect.reason": message.reason });
|
|
174
|
+
this.#activeConnections.add(-1);
|
|
175
|
+
if (message.subscriptions) {
|
|
176
|
+
this.#activeSubscriptions.add(-message.subscriptions);
|
|
177
|
+
}
|
|
178
|
+
this.#endSpan(message);
|
|
179
|
+
}
|
|
180
|
+
#handleConnectEnd(message) {
|
|
181
|
+
this.#connectionCounter.add(1);
|
|
182
|
+
this.#activeConnections.add(1);
|
|
183
|
+
this.#endSpan(message);
|
|
184
|
+
}
|
|
185
|
+
#handleSubscribeEnd(message) {
|
|
186
|
+
const attributes = {
|
|
187
|
+
"messaging.destination.name": message.channel,
|
|
188
|
+
"socket.subscription.created": Boolean(message.created)
|
|
189
|
+
};
|
|
190
|
+
if (message.ok) {
|
|
191
|
+
this.#subscriptionCounter.add(1, attributes);
|
|
192
|
+
if (message.created) this.#activeSubscriptions.add(1, attributes);
|
|
193
|
+
}
|
|
194
|
+
this.#endSpanWithOutcome(message, attributes);
|
|
195
|
+
}
|
|
196
|
+
#handleUnsubscribeEnd(message) {
|
|
197
|
+
const attributes = {
|
|
198
|
+
"messaging.destination.name": message.channel,
|
|
199
|
+
"socket.subscription.removed": Boolean(message.removed)
|
|
200
|
+
};
|
|
201
|
+
if (message.ok && message.removed) {
|
|
202
|
+
this.#activeSubscriptions.add(-1, attributes);
|
|
203
|
+
}
|
|
204
|
+
this.#endSpanWithOutcome(message, attributes);
|
|
205
|
+
}
|
|
206
|
+
#handleMessageEnd(message) {
|
|
207
|
+
const attributes = {
|
|
208
|
+
"messaging.destination.name": message.channel,
|
|
209
|
+
"messaging.event.name": message.event
|
|
210
|
+
};
|
|
211
|
+
this.#messageCounter.add(1, {
|
|
212
|
+
...attributes,
|
|
213
|
+
"socket.message.ok": Boolean(message.ok)
|
|
214
|
+
});
|
|
215
|
+
this.#endSpanWithOutcome(message, attributes);
|
|
216
|
+
}
|
|
217
|
+
#handleBroadcastEnd(message) {
|
|
218
|
+
const attributes = this.#broadcastAttributes(message);
|
|
219
|
+
this.#broadcastCounter.add(1, attributes);
|
|
220
|
+
if (message.delivered !== void 0) {
|
|
221
|
+
this.#broadcastDeliveryCounter.add(message.delivered, attributes);
|
|
222
|
+
}
|
|
223
|
+
this.#endSpan(message, {
|
|
224
|
+
...attributes,
|
|
225
|
+
...message.delivered !== void 0 ? { "socket.broadcast.delivered": message.delivered } : {}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
#recordError(message) {
|
|
229
|
+
const span = this.spans.get(message);
|
|
230
|
+
if (!span) return;
|
|
231
|
+
if (message.error instanceof Error) {
|
|
232
|
+
span.recordException(message.error);
|
|
233
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: message.error.message });
|
|
234
|
+
} else {
|
|
235
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
236
|
+
}
|
|
237
|
+
span.end();
|
|
238
|
+
this.spans.delete(message);
|
|
239
|
+
}
|
|
240
|
+
#endSpanWithOutcome(message, attributes) {
|
|
241
|
+
this.#endSpan(message, attributes);
|
|
242
|
+
}
|
|
243
|
+
#endSpan(message, attributes = {}) {
|
|
244
|
+
const span = this.spans.get(message);
|
|
245
|
+
if (!span) return;
|
|
246
|
+
span.setAttributes(attributes);
|
|
247
|
+
const outcome = message;
|
|
248
|
+
if (outcome.ok === false) {
|
|
249
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: outcome.error });
|
|
250
|
+
if (outcome.error) {
|
|
251
|
+
span.setAttribute("error.type", outcome.error);
|
|
252
|
+
}
|
|
253
|
+
} else {
|
|
254
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
255
|
+
}
|
|
256
|
+
span.end();
|
|
257
|
+
this.spans.delete(message);
|
|
258
|
+
}
|
|
259
|
+
#broadcastAttributes(message) {
|
|
260
|
+
const attributes = {
|
|
261
|
+
"messaging.operation.name": "publish",
|
|
262
|
+
"messaging.operation.type": "send",
|
|
263
|
+
"messaging.event.name": message.event,
|
|
264
|
+
"socket.broadcast.target": message.target,
|
|
265
|
+
"socket.broadcast.via": message.via
|
|
266
|
+
};
|
|
267
|
+
if (message.channel) attributes["messaging.destination.name"] = message.channel;
|
|
268
|
+
if (message.room) attributes["socket.user.room"] = message.room;
|
|
269
|
+
if (message.except) attributes["socket.broadcast.except_count"] = message.except.length;
|
|
270
|
+
return attributes;
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
export {
|
|
274
|
+
SocketInstrumentation
|
|
275
|
+
};
|
|
276
|
+
//# sourceMappingURL=otel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/otel.ts"],"sourcesContent":["import { SpanKind, SpanStatusCode, type Span } from '@opentelemetry/api'\nimport type { TracingChannelSubscribers } from 'node:diagnostics_channel'\nimport { InstrumentationBase } from '@opentelemetry/instrumentation'\nimport type { InstrumentationConfig } from '@opentelemetry/instrumentation'\nimport {\n broadcastChannel,\n channelMessageChannel,\n connectChannel,\n disconnectChannel,\n subscribeChannel,\n unsubscribeChannel,\n} from './tracing_channels.js'\nimport type {\n SocketBroadcastMessage,\n SocketChannelMessage,\n SocketConnectMessage,\n SocketDisconnectMessage,\n SocketSubscribeMessage,\n SocketUnsubscribeMessage,\n} from './types/tracing_channels.js'\n\nexport interface SocketInstrumentationConfig extends InstrumentationConfig {\n /**\n * The messaging system identifier.\n *\n * @default '@rlanz/socket'\n */\n messagingSystem?: string\n}\n\ntype AttributeValue = string | number | boolean\n\nexport class SocketInstrumentation extends InstrumentationBase<SocketInstrumentationConfig> {\n protected subscribed = false\n protected spans = new WeakMap<object, Span>()\n protected connectHandlers?: TracingChannelSubscribers<SocketConnectMessage>\n protected disconnectHandlers?: TracingChannelSubscribers<SocketDisconnectMessage>\n protected subscribeHandlers?: TracingChannelSubscribers<SocketSubscribeMessage>\n protected unsubscribeHandlers?: TracingChannelSubscribers<SocketUnsubscribeMessage>\n protected messageHandlers?: TracingChannelSubscribers<SocketChannelMessage>\n protected broadcastHandlers?: TracingChannelSubscribers<SocketBroadcastMessage>\n\n #connectionCounter = this.meter.createCounter('rlanz_socket_connections_total', {\n description: 'Total number of accepted socket connections',\n })\n #disconnectionCounter = this.meter.createCounter('rlanz_socket_disconnections_total', {\n description: 'Total number of closed socket connections',\n })\n #activeConnections = this.meter.createUpDownCounter('rlanz_socket_connections_active', {\n description: 'Number of currently active socket connections',\n })\n #subscriptionCounter = this.meter.createCounter('rlanz_socket_subscriptions_total', {\n description: 'Total number of successful channel subscriptions',\n })\n #activeSubscriptions = this.meter.createUpDownCounter('rlanz_socket_subscriptions_active', {\n description: 'Number of currently active channel subscriptions',\n })\n #messageCounter = this.meter.createCounter('rlanz_socket_messages_total', {\n description: 'Total number of channel messages received from clients',\n })\n #broadcastCounter = this.meter.createCounter('rlanz_socket_broadcasts_total', {\n description: 'Total number of broadcast operations',\n })\n #broadcastDeliveryCounter = this.meter.createCounter('rlanz_socket_broadcast_deliveries_total', {\n description: 'Total number of socket deliveries made by broadcast operations',\n })\n\n constructor(config: SocketInstrumentationConfig = {}) {\n super('@rlanz/socket', '0.0.1', config)\n }\n\n get #messagingSystem(): string {\n return this.getConfig().messagingSystem ?? '@rlanz/socket'\n }\n\n protected init() {\n return undefined\n }\n\n enable() {\n super.enable()\n // `InstrumentationBase` calls `enable()` from its constructor, before this\n // subclass's fields and private methods are installed on the instance.\n // During that premature call `this.subscribed` is still `undefined`, so the\n // guard prevents calling `#subscribe()` on a not-yet-branded instance.\n if (this.subscribed !== undefined) this.#subscribe()\n }\n\n disable() {\n if (this.subscribed !== undefined) this.#unsubscribe()\n super.disable()\n }\n\n manuallyRegister() {\n this.#subscribe()\n }\n\n #subscribe() {\n if (this.subscribed) return\n if (!this.isEnabled()) return\n\n this.subscribed = true\n\n this.connectHandlers = {\n start: (message) =>\n this.#startSpan(message, 'socket connect', SpanKind.SERVER, {\n 'network.transport': 'websocket',\n }),\n end: (message) => this.#handleConnectEnd(message as SocketConnectMessage),\n asyncStart: () => {},\n asyncEnd: () => {},\n error: (message) => this.#recordError(message as SocketConnectMessage & { error: unknown }),\n }\n\n this.disconnectHandlers = {\n start: (message) =>\n this.#startSpan(message, 'socket disconnect', SpanKind.INTERNAL, {\n 'socket.disconnect.reason': message.reason,\n 'socket.disconnect.subscriptions': message.subscriptions ?? 0,\n }),\n end: () => {},\n asyncStart: () => {},\n asyncEnd: (message) => this.#handleDisconnectEnd(message as SocketDisconnectMessage),\n error: (message) =>\n this.#recordError(message as SocketDisconnectMessage & { error: unknown }),\n }\n\n this.subscribeHandlers = {\n start: (message) =>\n this.#startSpan(message, `socket subscribe ${message.channel}`, SpanKind.SERVER, {\n 'messaging.destination.name': message.channel,\n 'messaging.operation.name': 'subscribe',\n 'messaging.operation.type': 'receive',\n }),\n end: () => {},\n asyncStart: () => {},\n asyncEnd: (message) => this.#handleSubscribeEnd(message as SocketSubscribeMessage),\n error: (message) => this.#recordError(message as SocketSubscribeMessage & { error: unknown }),\n }\n\n this.unsubscribeHandlers = {\n start: (message) =>\n this.#startSpan(message, `socket unsubscribe ${message.channel}`, SpanKind.SERVER, {\n 'messaging.destination.name': message.channel,\n 'messaging.operation.name': 'unsubscribe',\n 'messaging.operation.type': 'receive',\n }),\n end: () => {},\n asyncStart: () => {},\n asyncEnd: (message) => this.#handleUnsubscribeEnd(message as SocketUnsubscribeMessage),\n error: (message) =>\n this.#recordError(message as SocketUnsubscribeMessage & { error: unknown }),\n }\n\n this.messageHandlers = {\n start: (message) =>\n this.#startSpan(message, `socket message ${message.channel}`, SpanKind.SERVER, {\n 'messaging.destination.name': message.channel,\n 'messaging.operation.name': 'process',\n 'messaging.operation.type': 'receive',\n 'messaging.event.name': message.event,\n }),\n end: () => {},\n asyncStart: () => {},\n asyncEnd: (message) => this.#handleMessageEnd(message as SocketChannelMessage),\n error: (message) => this.#recordError(message as SocketChannelMessage & { error: unknown }),\n }\n\n this.broadcastHandlers = {\n start: (message) =>\n this.#startSpan(message, `socket broadcast ${message.target}`, SpanKind.PRODUCER, {\n ...this.#broadcastAttributes(message),\n }),\n end: (message) => this.#handleBroadcastEnd(message as SocketBroadcastMessage),\n asyncStart: () => {},\n asyncEnd: () => {},\n error: (message) => this.#recordError(message as SocketBroadcastMessage & { error: unknown }),\n }\n\n connectChannel.subscribe(this.connectHandlers as any)\n disconnectChannel.subscribe(this.disconnectHandlers as any)\n subscribeChannel.subscribe(this.subscribeHandlers as any)\n unsubscribeChannel.subscribe(this.unsubscribeHandlers as any)\n channelMessageChannel.subscribe(this.messageHandlers as any)\n broadcastChannel.subscribe(this.broadcastHandlers as any)\n }\n\n #unsubscribe() {\n if (!this.subscribed) return\n\n if (this.connectHandlers) connectChannel.unsubscribe(this.connectHandlers as any)\n if (this.disconnectHandlers) disconnectChannel.unsubscribe(this.disconnectHandlers as any)\n if (this.subscribeHandlers) subscribeChannel.unsubscribe(this.subscribeHandlers as any)\n if (this.unsubscribeHandlers) unsubscribeChannel.unsubscribe(this.unsubscribeHandlers as any)\n if (this.messageHandlers) channelMessageChannel.unsubscribe(this.messageHandlers as any)\n if (this.broadcastHandlers) broadcastChannel.unsubscribe(this.broadcastHandlers as any)\n\n this.subscribed = false\n this.spans = new WeakMap()\n }\n\n #startSpan(\n message: object,\n name: string,\n kind: SpanKind,\n attributes: Record<string, AttributeValue> = {}\n ) {\n const span = this.tracer.startSpan(name, {\n kind,\n attributes: {\n 'messaging.system': this.#messagingSystem,\n ...attributes,\n },\n })\n\n this.spans.set(message, span)\n }\n\n #handleDisconnectEnd(message: SocketDisconnectMessage) {\n this.#disconnectionCounter.add(1, { 'socket.disconnect.reason': message.reason })\n this.#activeConnections.add(-1)\n if (message.subscriptions) {\n this.#activeSubscriptions.add(-message.subscriptions)\n }\n\n this.#endSpan(message)\n }\n\n #handleConnectEnd(message: SocketConnectMessage) {\n this.#connectionCounter.add(1)\n this.#activeConnections.add(1)\n this.#endSpan(message)\n }\n\n #handleSubscribeEnd(message: SocketSubscribeMessage) {\n const attributes = {\n 'messaging.destination.name': message.channel,\n 'socket.subscription.created': Boolean(message.created),\n }\n\n if (message.ok) {\n this.#subscriptionCounter.add(1, attributes)\n if (message.created) this.#activeSubscriptions.add(1, attributes)\n }\n\n this.#endSpanWithOutcome(message, attributes)\n }\n\n #handleUnsubscribeEnd(message: SocketUnsubscribeMessage) {\n const attributes = {\n 'messaging.destination.name': message.channel,\n 'socket.subscription.removed': Boolean(message.removed),\n }\n\n if (message.ok && message.removed) {\n this.#activeSubscriptions.add(-1, attributes)\n }\n\n this.#endSpanWithOutcome(message, attributes)\n }\n\n #handleMessageEnd(message: SocketChannelMessage) {\n const attributes = {\n 'messaging.destination.name': message.channel,\n 'messaging.event.name': message.event,\n }\n\n this.#messageCounter.add(1, {\n ...attributes,\n 'socket.message.ok': Boolean(message.ok),\n })\n\n this.#endSpanWithOutcome(message, attributes)\n }\n\n #handleBroadcastEnd(message: SocketBroadcastMessage) {\n const attributes = this.#broadcastAttributes(message)\n\n this.#broadcastCounter.add(1, attributes)\n if (message.delivered !== undefined) {\n this.#broadcastDeliveryCounter.add(message.delivered, attributes)\n }\n\n this.#endSpan(message, {\n ...attributes,\n ...(message.delivered !== undefined\n ? { 'socket.broadcast.delivered': message.delivered }\n : {}),\n })\n }\n\n #recordError(message: object & { error: unknown }) {\n const span = this.spans.get(message)\n if (!span) return\n\n if (message.error instanceof Error) {\n span.recordException(message.error)\n span.setStatus({ code: SpanStatusCode.ERROR, message: message.error.message })\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR })\n }\n\n span.end()\n this.spans.delete(message)\n }\n\n #endSpanWithOutcome(\n message: SocketSubscribeMessage | SocketUnsubscribeMessage | SocketChannelMessage,\n attributes: Record<string, AttributeValue>\n ) {\n this.#endSpan(message, attributes)\n }\n\n #endSpan(message: object, attributes: Record<string, AttributeValue> = {}) {\n const span = this.spans.get(message)\n if (!span) return\n\n span.setAttributes(attributes)\n\n const outcome = message as {\n ok?: boolean\n error?: string\n }\n\n if (outcome.ok === false) {\n span.setStatus({ code: SpanStatusCode.ERROR, message: outcome.error })\n if (outcome.error) {\n span.setAttribute('error.type', outcome.error)\n }\n } else {\n span.setStatus({ code: SpanStatusCode.OK })\n }\n\n span.end()\n this.spans.delete(message)\n }\n\n #broadcastAttributes(message: SocketBroadcastMessage): Record<string, AttributeValue> {\n const attributes: Record<string, AttributeValue> = {\n 'messaging.operation.name': 'publish',\n 'messaging.operation.type': 'send',\n 'messaging.event.name': message.event,\n 'socket.broadcast.target': message.target,\n 'socket.broadcast.via': message.via,\n }\n\n if (message.channel) attributes['messaging.destination.name'] = message.channel\n if (message.room) attributes['socket.user.room'] = message.room\n if (message.except) attributes['socket.broadcast.except_count'] = message.except.length\n\n return attributes\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
interface SocketConnectMessage {
|
|
2
|
+
socketId: string;
|
|
3
|
+
}
|
|
4
|
+
interface SocketDisconnectMessage {
|
|
5
|
+
socketId: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
subscriptions?: number;
|
|
8
|
+
}
|
|
9
|
+
interface SocketSubscribeMessage {
|
|
10
|
+
socketId: string;
|
|
11
|
+
channel: string;
|
|
12
|
+
created?: boolean;
|
|
13
|
+
ok?: boolean;
|
|
14
|
+
error?: string;
|
|
15
|
+
}
|
|
16
|
+
interface SocketUnsubscribeMessage {
|
|
17
|
+
socketId: string;
|
|
18
|
+
channel: string;
|
|
19
|
+
removed?: boolean;
|
|
20
|
+
ok?: boolean;
|
|
21
|
+
error?: string;
|
|
22
|
+
}
|
|
23
|
+
interface SocketChannelMessage {
|
|
24
|
+
socketId: string;
|
|
25
|
+
channel: string;
|
|
26
|
+
event: string;
|
|
27
|
+
ok?: boolean;
|
|
28
|
+
error?: string;
|
|
29
|
+
}
|
|
30
|
+
interface SocketBroadcastMessage {
|
|
31
|
+
target: 'channel' | 'user' | 'global';
|
|
32
|
+
event: string;
|
|
33
|
+
channel?: string;
|
|
34
|
+
room?: string;
|
|
35
|
+
except?: string[];
|
|
36
|
+
via: 'local' | 'bus';
|
|
37
|
+
delivered?: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export type { SocketBroadcastMessage, SocketChannelMessage, SocketConnectMessage, SocketDisconnectMessage, SocketSubscribeMessage, SocketUnsubscribeMessage };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=tracing_channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|