@rlanz/socket 0.0.1-0 → 0.0.1-10

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.
Files changed (67) hide show
  1. package/README.md +594 -90
  2. package/build/base_channel-DKmR3Z0l.d.ts +476 -0
  3. package/build/chunk-55EIQ2VV.js +152 -0
  4. package/build/chunk-55EIQ2VV.js.map +1 -0
  5. package/build/chunk-6PJ4ALJD.js +115 -0
  6. package/build/chunk-6PJ4ALJD.js.map +1 -0
  7. package/build/chunk-BLRAKPXW.js +7 -0
  8. package/build/chunk-BLRAKPXW.js.map +1 -0
  9. package/build/chunk-E6ILCRL3.js +182 -0
  10. package/build/chunk-E6ILCRL3.js.map +1 -0
  11. package/build/{chunk-XUDFDJME.js → chunk-G75J233Z.js} +12 -9
  12. package/build/chunk-G75J233Z.js.map +1 -0
  13. package/build/chunk-IUQ3GYZZ.js +140 -0
  14. package/build/chunk-IUQ3GYZZ.js.map +1 -0
  15. package/build/chunk-K243S3QP.js +131 -0
  16. package/build/chunk-K243S3QP.js.map +1 -0
  17. package/build/chunk-NUPBNOP3.js +61 -0
  18. package/build/chunk-NUPBNOP3.js.map +1 -0
  19. package/build/chunk-O6UYCGTV.js +914 -0
  20. package/build/chunk-O6UYCGTV.js.map +1 -0
  21. package/build/framework-16ypv4Ss.d.ts +13 -0
  22. package/build/index-8jB5RG6v.d.ts +150 -0
  23. package/build/index.d.ts +29 -8
  24. package/build/index.js +39 -15
  25. package/build/index.js.map +1 -1
  26. package/build/providers/socket_provider.d.ts +6 -3
  27. package/build/providers/socket_provider.js +2156 -45
  28. package/build/providers/socket_provider.js.map +1 -1
  29. package/build/services/socket.d.ts +6 -3
  30. package/build/{shared_types-Dw9AphfO.d.ts → shared_types-DE86M136.d.ts} +5 -4
  31. package/build/socket_service-C1JM64_9.d.ts +106 -0
  32. package/build/src/assembler_hook.d.ts +15 -0
  33. package/build/src/assembler_hook.js +238 -0
  34. package/build/src/assembler_hook.js.map +1 -0
  35. package/build/src/client/index.d.ts +3 -106
  36. package/build/src/client/index.js +6 -667
  37. package/build/src/client/index.js.map +1 -1
  38. package/build/src/client/react.d.ts +30 -0
  39. package/build/src/client/react.js +86 -0
  40. package/build/src/client/react.js.map +1 -0
  41. package/build/src/client/types.d.ts +62 -9
  42. package/build/src/client/vue.d.ts +32 -0
  43. package/build/src/client/vue.js +100 -0
  44. package/build/src/client/vue.js.map +1 -0
  45. package/build/src/decorators.d.ts +7 -4
  46. package/build/src/decorators.js +1 -1
  47. package/build/src/health_check.d.ts +6 -3
  48. package/build/src/health_check.js +14 -3
  49. package/build/src/health_check.js.map +1 -1
  50. package/build/src/otel.d.ts +1 -0
  51. package/build/src/otel.js +187 -32
  52. package/build/src/otel.js.map +1 -1
  53. package/build/src/testing.d.ts +45 -0
  54. package/build/src/testing.js +7 -0
  55. package/build/src/testing.js.map +1 -0
  56. package/build/src/types/tracing_channels.d.ts +1 -2
  57. package/build/src/types.d.ts +4 -2
  58. package/package.json +36 -11
  59. package/build/chunk-4UPUCRVG.js +0 -1772
  60. package/build/chunk-4UPUCRVG.js.map +0 -1
  61. package/build/chunk-GKAD2UOA.js +0 -18
  62. package/build/chunk-GKAD2UOA.js.map +0 -1
  63. package/build/chunk-HK7Z65DA.js +0 -19
  64. package/build/chunk-HK7Z65DA.js.map +0 -1
  65. package/build/chunk-XUDFDJME.js.map +0 -1
  66. package/build/socket_service-jxIaH5Rs.d.ts +0 -144
  67. package/build/types-C0rDwbry.d.ts +0 -393
@@ -1 +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"]}
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,30 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { S as Socket } from '../../index-8jB5RG6v.js';
4
+ import { ConnectionState, EventHandler } from './types.js';
5
+ import { F as FrameworkChannelCallArgs, a as FrameworkChannel, b as FrameworkChannelPattern, c as FrameworkChannelEvent, d as FrameworkChannelParameters, e as FrameworkChannelEventPayload } from '../../framework-16ypv4Ss.js';
6
+ import '../../shared_types-DE86M136.js';
7
+
8
+ type ChannelEventArgs<Registry, Pattern extends FrameworkChannelPattern<Registry>, Event extends FrameworkChannelEvent<Registry, Pattern>> = FrameworkChannelParameters<Registry, Pattern> extends undefined ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>] : [
9
+ parameters: FrameworkChannelParameters<Registry, Pattern>,
10
+ event: Event,
11
+ handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>
12
+ ];
13
+ interface SocketProviderProps<Registry> {
14
+ socket: Socket<Registry>;
15
+ children?: ReactNode;
16
+ /** Connect on mount and disconnect on unmount. Use only for an exclusively owned socket. */
17
+ owned?: boolean;
18
+ }
19
+ declare function createSocketHooks<Registry = never>(): {
20
+ SocketProvider: ({ socket, children, owned }: SocketProviderProps<Registry>) => react.FunctionComponentElement<react.ProviderProps<Socket<Registry> | null>>;
21
+ useSocket: () => Socket<Registry>;
22
+ useSocketState: () => ConnectionState;
23
+ useChannel: {
24
+ <const Args extends FrameworkChannelCallArgs<Registry>>(...args: Args): FrameworkChannel<Registry, Args[0]> | null;
25
+ (pattern: null): null;
26
+ };
27
+ useChannelEvent: <const Pattern extends FrameworkChannelPattern<Registry>, Event extends FrameworkChannelEvent<Registry, Pattern>>(pattern: Pattern | null, ...args: ChannelEventArgs<Registry, Pattern, Event>) => void;
28
+ };
29
+
30
+ export { type SocketProviderProps, createSocketHooks };
@@ -0,0 +1,86 @@
1
+ import {
2
+ acquireChannel,
3
+ acquireSocketOwnership,
4
+ createChannelCallArgs,
5
+ resolveChannelEventArgs
6
+ } from "../../chunk-55EIQ2VV.js";
7
+ import {
8
+ buildChannelName
9
+ } from "../../chunk-O6UYCGTV.js";
10
+ import "../../chunk-BLRAKPXW.js";
11
+ import "../../chunk-6PJ4ALJD.js";
12
+ import "../../chunk-E6ILCRL3.js";
13
+
14
+ // src/client/react.ts
15
+ import {
16
+ createContext,
17
+ createElement,
18
+ useContext,
19
+ useEffect,
20
+ useRef,
21
+ useState,
22
+ useSyncExternalStore
23
+ } from "react";
24
+ function createSocketHooks() {
25
+ const SocketContext = createContext(null);
26
+ function useSocket() {
27
+ const socket = useContext(SocketContext);
28
+ if (!socket) throw new Error("SocketProvider is missing");
29
+ return socket;
30
+ }
31
+ function SocketProvider({ socket, children, owned = false }) {
32
+ useEffect(() => {
33
+ if (!owned) return;
34
+ return acquireSocketOwnership(socket);
35
+ }, [owned, socket]);
36
+ return createElement(SocketContext.Provider, { value: socket }, children);
37
+ }
38
+ function useSocketState() {
39
+ const socket = useSocket();
40
+ return useSyncExternalStore(
41
+ (notify) => socket.onStateChange(notify),
42
+ () => socket.state,
43
+ () => "disconnected"
44
+ );
45
+ }
46
+ function useChannel(...args) {
47
+ const [pattern, parameters] = args;
48
+ const socket = useSocket();
49
+ const name = pattern === null ? null : buildChannelName(pattern, parameters);
50
+ const [acquired, setAcquired] = useState(null);
51
+ useEffect(() => {
52
+ if (pattern === null || name === null) {
53
+ setAcquired(null);
54
+ return;
55
+ }
56
+ const channelArgs = createChannelCallArgs(pattern, parameters);
57
+ const { channel, lease } = acquireChannel(socket, ...channelArgs);
58
+ setAcquired({ socket, name, channel });
59
+ return () => lease.release();
60
+ }, [name, pattern, socket]);
61
+ return acquired?.socket === socket && acquired.name === name ? acquired.channel : null;
62
+ }
63
+ function useChannelEvent(pattern, ...args) {
64
+ const socket = useSocket();
65
+ const {
66
+ parameterInput: parameters,
67
+ event,
68
+ handler
69
+ } = resolveChannelEventArgs(args);
70
+ const name = pattern === null ? null : buildChannelName(pattern, parameters);
71
+ const handlerRef = useRef(handler);
72
+ handlerRef.current = handler;
73
+ useEffect(() => {
74
+ if (pattern === null || name === null) return;
75
+ const channelArgs = createChannelCallArgs(pattern, parameters);
76
+ const { lease } = acquireChannel(socket, ...channelArgs);
77
+ lease.listen(event, (data) => handlerRef.current(data));
78
+ return () => lease.release();
79
+ }, [event, name, pattern, socket]);
80
+ }
81
+ return { SocketProvider, useSocket, useSocketState, useChannel, useChannelEvent };
82
+ }
83
+ export {
84
+ createSocketHooks
85
+ };
86
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/client/react.ts"],"sourcesContent":["import {\n createContext,\n createElement,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react'\nimport type { Channel } from './channel.js'\nimport { buildChannelName, type Socket } from './socket.js'\nimport type { ConnectionState, EventHandler } from './types.js'\nimport {\n acquireChannel,\n acquireSocketOwnership,\n createChannelCallArgs,\n resolveChannelEventArgs,\n type FrameworkChannel,\n type FrameworkChannelCallArgs,\n type FrameworkChannelEvent,\n type FrameworkChannelEventPayload,\n type FrameworkChannelParameters,\n type FrameworkChannelPattern,\n} from './framework.js'\n\ntype ChannelEventArgs<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n> =\n FrameworkChannelParameters<Registry, Pattern> extends undefined\n ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>]\n : [\n parameters: FrameworkChannelParameters<Registry, Pattern>,\n event: Event,\n handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>,\n ]\n\nexport interface SocketProviderProps<Registry> {\n socket: Socket<Registry>\n children?: ReactNode\n /** Connect on mount and disconnect on unmount. Use only for an exclusively owned socket. */\n owned?: boolean\n}\n\nexport function createSocketHooks<Registry = never>() {\n const SocketContext = createContext<Socket<Registry> | null>(null)\n\n function useSocket(): Socket<Registry> {\n const socket = useContext(SocketContext)\n if (!socket) throw new Error('SocketProvider is missing')\n return socket\n }\n\n function SocketProvider({ socket, children, owned = false }: SocketProviderProps<Registry>) {\n useEffect(() => {\n if (!owned) return\n return acquireSocketOwnership(socket)\n }, [owned, socket])\n\n return createElement(SocketContext.Provider, { value: socket }, children)\n }\n\n function useSocketState(): ConnectionState {\n const socket = useSocket()\n return useSyncExternalStore(\n (notify) => socket.onStateChange(notify),\n () => socket.state,\n () => 'disconnected'\n )\n }\n\n function useChannel<const Args extends FrameworkChannelCallArgs<Registry>>(\n ...args: Args\n ): FrameworkChannel<Registry, Args[0]> | null\n function useChannel(pattern: null): null\n function useChannel(\n ...args: [pattern: FrameworkChannelPattern<Registry> | null, parameters?: object]\n ): Channel<any> | null {\n const [pattern, parameters] = args\n const socket = useSocket()\n const name = pattern === null ? null : buildChannelName(pattern, parameters)\n const [acquired, setAcquired] = useState<{\n socket: Socket<Registry>\n name: string\n channel: Channel<any>\n } | null>(null)\n\n useEffect(() => {\n if (pattern === null || name === null) {\n setAcquired(null)\n return\n }\n const channelArgs = createChannelCallArgs<Registry>(pattern, parameters)\n const { channel, lease } = acquireChannel(socket, ...channelArgs)\n setAcquired({ socket, name, channel })\n return () => lease.release()\n }, [name, pattern, socket])\n\n return acquired?.socket === socket && acquired.name === name ? acquired.channel : null\n }\n\n function useChannelEvent<\n const Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n >(pattern: Pattern | null, ...args: ChannelEventArgs<Registry, Pattern, Event>): void {\n const socket = useSocket()\n const {\n parameterInput: parameters,\n event,\n handler,\n } = resolveChannelEventArgs<\n FrameworkChannelParameters<Registry, Pattern>,\n Event,\n FrameworkChannelEventPayload<Registry, Pattern, Event>\n >(args)\n const name = pattern === null ? null : buildChannelName(pattern, parameters)\n const handlerRef = useRef(handler)\n handlerRef.current = handler\n\n useEffect(() => {\n if (pattern === null || name === null) return\n const channelArgs = createChannelCallArgs<Registry>(pattern, parameters)\n const { lease } = acquireChannel(socket, ...channelArgs)\n lease.listen(event, (data) => handlerRef.current(data))\n return () => lease.release()\n }, [event, name, pattern, socket])\n }\n\n return { SocketProvider, useSocket, useSocketState, useChannel, useChannelEvent }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAqCA,SAAS,oBAAsC;AACpD,QAAM,gBAAgB,cAAuC,IAAI;AAEjE,WAAS,YAA8B;AACrC,UAAM,SAAS,WAAW,aAAa;AACvC,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,2BAA2B;AACxD,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,EAAE,QAAQ,UAAU,QAAQ,MAAM,GAAkC;AAC1F,cAAU,MAAM;AACd,UAAI,CAAC,MAAO;AACZ,aAAO,uBAAuB,MAAM;AAAA,IACtC,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,WAAO,cAAc,cAAc,UAAU,EAAE,OAAO,OAAO,GAAG,QAAQ;AAAA,EAC1E;AAEA,WAAS,iBAAkC;AACzC,UAAM,SAAS,UAAU;AACzB,WAAO;AAAA,MACL,CAAC,WAAW,OAAO,cAAc,MAAM;AAAA,MACvC,MAAM,OAAO;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF;AAMA,WAAS,cACJ,MACkB;AACrB,UAAM,CAAC,SAAS,UAAU,IAAI;AAC9B,UAAM,SAAS,UAAU;AACzB,UAAM,OAAO,YAAY,OAAO,OAAO,iBAAiB,SAAS,UAAU;AAC3E,UAAM,CAAC,UAAU,WAAW,IAAI,SAItB,IAAI;AAEd,cAAU,MAAM;AACd,UAAI,YAAY,QAAQ,SAAS,MAAM;AACrC,oBAAY,IAAI;AAChB;AAAA,MACF;AACA,YAAM,cAAc,sBAAgC,SAAS,UAAU;AACvE,YAAM,EAAE,SAAS,MAAM,IAAI,eAAe,QAAQ,GAAG,WAAW;AAChE,kBAAY,EAAE,QAAQ,MAAM,QAAQ,CAAC;AACrC,aAAO,MAAM,MAAM,QAAQ;AAAA,IAC7B,GAAG,CAAC,MAAM,SAAS,MAAM,CAAC;AAE1B,WAAO,UAAU,WAAW,UAAU,SAAS,SAAS,OAAO,SAAS,UAAU;AAAA,EACpF;AAEA,WAAS,gBAGP,YAA4B,MAAwD;AACpF,UAAM,SAAS,UAAU;AACzB,UAAM;AAAA,MACJ,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,IACF,IAAI,wBAIF,IAAI;AACN,UAAM,OAAO,YAAY,OAAO,OAAO,iBAAiB,SAAS,UAAU;AAC3E,UAAM,aAAa,OAAO,OAAO;AACjC,eAAW,UAAU;AAErB,cAAU,MAAM;AACd,UAAI,YAAY,QAAQ,SAAS,KAAM;AACvC,YAAM,cAAc,sBAAgC,SAAS,UAAU;AACvE,YAAM,EAAE,MAAM,IAAI,eAAe,QAAQ,GAAG,WAAW;AACvD,YAAM,OAAO,OAAO,CAAC,SAAS,WAAW,QAAQ,IAAI,CAAC;AACtD,aAAO,MAAM,MAAM,QAAQ;AAAA,IAC7B,GAAG,CAAC,OAAO,MAAM,SAAS,MAAM,CAAC;AAAA,EACnC;AAEA,SAAO,EAAE,gBAAgB,WAAW,gBAAgB,YAAY,gBAAgB;AAClF;","names":[]}
@@ -1,5 +1,58 @@
1
- export { C as ChannelAck, a as ChannelMessage } from '../../shared_types-Dw9AphfO.js';
1
+ import { C as ChannelServerEventsOf } from '../../shared_types-DE86M136.js';
2
+ export { a as ChannelAck, b as ChannelMessage } from '../../shared_types-DE86M136.js';
2
3
 
4
+ /** Type-only contract carried by a browser channel. */
5
+ interface ChannelContract<ClientEvents = unknown, ServerEvents = unknown> {
6
+ readonly clientEvents: ClientEvents;
7
+ readonly serverEvents: ServerEvents;
8
+ }
9
+ type ChannelInstance<Entry> = Entry extends {
10
+ readonly channel: abstract new (...args: any[]) => infer Instance;
11
+ } ? Instance : never;
12
+ type HandlerName<E, K> = E extends {
13
+ readonly handlers: infer H;
14
+ } ? K extends keyof H ? H[K] : never : never;
15
+ type HandlerAck<Entry, Event> = HandlerName<Entry, Event> extends keyof ChannelInstance<Entry> ? ChannelInstance<Entry>[HandlerName<Entry, Event>] extends (...args: any[]) => infer Result ? Awaited<Result> : unknown : unknown;
16
+ type HandlerPayload<Entry, Event> = HandlerName<Entry, Event> extends keyof ChannelInstance<Entry> ? ChannelInstance<Entry>[HandlerName<Entry, Event>] extends (...args: any[]) => unknown ? Parameters<ChannelInstance<Entry>[HandlerName<Entry, Event>]> extends [
17
+ unknown,
18
+ ...infer Rest
19
+ ] ? Rest extends [] ? undefined : Rest[0] : undefined : unknown : unknown;
20
+ type ClientContracts<Entry> = Entry extends {
21
+ readonly handlers: infer Handlers;
22
+ } ? {
23
+ [Event in Extract<keyof Handlers, string>]: {
24
+ payload: HandlerPayload<Entry, Event>;
25
+ ack: HandlerAck<Entry, Event>;
26
+ };
27
+ } : unknown;
28
+ type ContractOfEntry<Entry> = ChannelContract<ClientContracts<Entry>, ChannelServerEventsOf<ChannelInstance<Entry>>>;
29
+ type RegistryChannels<Registry> = Registry extends {
30
+ readonly channels: infer Channels;
31
+ } ? Channels : never;
32
+ type RegistryChannelEntry<Registry, Pattern extends ChannelPattern<Registry>> = RegistryChannels<Registry>[Pattern];
33
+ /** Channel patterns explicitly declared in a generated registry. */
34
+ type ChannelPattern<Registry> = Extract<keyof RegistryChannels<Registry>, string>;
35
+ /** Resolves an explicit generated channel pattern to its contract. */
36
+ type ChannelContractFor<Registry, Pattern extends string> = string extends Pattern ? never : Pattern extends ChannelPattern<Registry> ? ContractOfEntry<RegistryChannelEntry<Registry, Pattern>> : never;
37
+ type ChannelParameterValue = string | number;
38
+ /** Parameters generated for an explicit channel pattern. Static channels use `undefined`. */
39
+ type ChannelParameters<Registry, Pattern extends ChannelPattern<Registry>> = RegistryChannelEntry<Registry, Pattern> extends {
40
+ readonly params: infer Parameters;
41
+ } ? Parameters extends object | undefined ? Parameters : never : never;
42
+ /** A correlated client call for one generated channel pattern. */
43
+ type ChannelCallArgs<Registry, Pattern extends ChannelPattern<Registry> = ChannelPattern<Registry>> = Pattern extends ChannelPattern<Registry> ? ChannelParameters<Registry, Pattern> extends undefined ? [pattern: Pattern] : [pattern: Pattern, parameters: ChannelParameters<Registry, Pattern>] : never;
44
+ type ClientEvents<Contract> = Contract extends ChannelContract<infer Events, unknown> ? Events : never;
45
+ type ServerEvents<Contract> = Contract extends ChannelContract<unknown, infer Events> ? Events : never;
46
+ /** Client events accepted by a generated channel. */
47
+ type ChannelClientEvent<Registry, Pattern extends ChannelPattern<Registry>> = Extract<keyof ClientEvents<ChannelContractFor<Registry, Pattern>>, string>;
48
+ /** Payload sent from the client for a generated channel event. */
49
+ type ChannelClientEventPayload<Registry, Pattern extends ChannelPattern<Registry>, Event extends ChannelClientEvent<Registry, Pattern>> = ClientEvents<ChannelContractFor<Registry, Pattern>>[Event] extends {
50
+ payload: infer Payload;
51
+ } ? Payload : never;
52
+ /** Server broadcast events received by a generated channel. */
53
+ type ChannelBroadcastEvent<Registry, Pattern extends ChannelPattern<Registry>> = Extract<keyof ServerEvents<ChannelContractFor<Registry, Pattern>>, string>;
54
+ /** Payload received from a server broadcast on a generated channel. */
55
+ type ChannelBroadcastPayload<Registry, Pattern extends ChannelPattern<Registry>, Event extends ChannelBroadcastEvent<Registry, Pattern>> = ServerEvents<ChannelContractFor<Registry, Pattern>>[Event];
3
56
  /**
4
57
  * Connection options.
5
58
  */
@@ -25,10 +78,10 @@ interface SocketOptions {
25
78
  */
26
79
  reconnectMaxDelay?: number;
27
80
  /**
28
- * Authentication data sent during the WebSocket handshake query string.
29
- * Ex: { token: 'oat_MjE...' }
81
+ * Decides whether a remotely closed connection should reconnect.
82
+ * By default, deliberate server disconnects are terminal and other closes reconnect.
30
83
  */
31
- auth?: Record<string, unknown>;
84
+ shouldReconnect?: (event: CloseEvent) => boolean;
32
85
  }
33
86
  /**
34
87
  * Channel subscription options.
@@ -61,7 +114,6 @@ interface SubscribeResult {
61
114
  ok: boolean;
62
115
  error?: string;
63
116
  data?: SubscribeAckData;
64
- presenceData?: PresenceData | null;
65
117
  }
66
118
  /**
67
119
  * Presence data.
@@ -70,14 +122,15 @@ interface PresenceData {
70
122
  channel: string;
71
123
  users: PresenceUser[];
72
124
  count: number;
125
+ [key: string]: unknown;
73
126
  }
74
127
  /**
75
128
  * User in presence data.
76
129
  */
77
130
  interface PresenceUser {
78
131
  id: string;
79
- name: string;
80
132
  joinedAt: string;
133
+ [key: string]: unknown;
81
134
  }
82
135
  /**
83
136
  * Connection state.
@@ -94,8 +147,8 @@ interface SocketClientTransport {
94
147
  connected: boolean;
95
148
  sendRequest<T = unknown>(message: Record<string, unknown>, timeout?: number): Promise<T>;
96
149
  send(message: Record<string, unknown>): void;
97
- on(event: string, handler: EventHandler): void;
98
- off(event: string, handler: EventHandler): void;
150
+ on<T = unknown>(event: string, handler: EventHandler<T>): void;
151
+ off<T = unknown>(event: string, handler: EventHandler<T>): void;
99
152
  }
100
153
 
101
- export type { ConnectionState, EventHandler, PresenceData, PresenceUser, SocketClientTransport, SocketOptions, SubscribeAckData, SubscribeOptions, SubscribeResult, UnsubscribeOptions };
154
+ export { type ChannelBroadcastEvent, type ChannelBroadcastPayload, type ChannelCallArgs, type ChannelClientEvent, type ChannelClientEventPayload, type ChannelContract, type ChannelContractFor, type ChannelParameterValue, type ChannelParameters, type ChannelPattern, ChannelServerEventsOf, type ConnectionState, type EventHandler, type PresenceData, type PresenceUser, type SocketClientTransport, type SocketOptions, type SubscribeAckData, type SubscribeOptions, type SubscribeResult, type UnsubscribeOptions };
@@ -0,0 +1,32 @@
1
+ import { ShallowRef, ComputedRef, MaybeRefOrGetter } from 'vue';
2
+ import { S as Socket } from '../../index-8jB5RG6v.js';
3
+ import { ConnectionState, EventHandler } from './types.js';
4
+ import { b as FrameworkChannelPattern, d as FrameworkChannelParameters, a as FrameworkChannel, c as FrameworkChannelEvent, e as FrameworkChannelEventPayload } from '../../framework-16ypv4Ss.js';
5
+ import '../../shared_types-DE86M136.js';
6
+
7
+ type ChannelParameterInput<Registry, Pattern extends FrameworkChannelPattern<Registry>> = MaybeRefOrGetter<FrameworkChannelParameters<Registry, Pattern>>;
8
+ type VueChannelCallArgs<Registry> = {
9
+ [Pattern in FrameworkChannelPattern<Registry>]: FrameworkChannelParameters<Registry, Pattern> extends undefined ? [pattern: Pattern] : [pattern: Pattern, parameters: ChannelParameterInput<Registry, Pattern>];
10
+ }[FrameworkChannelPattern<Registry>];
11
+ type VueChannelEventArgs<Registry, Pattern extends FrameworkChannelPattern<Registry>, Event extends FrameworkChannelEvent<Registry, Pattern>> = FrameworkChannelParameters<Registry, Pattern> extends undefined ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>] : [
12
+ parameters: ChannelParameterInput<Registry, Pattern>,
13
+ event: Event,
14
+ handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>
15
+ ];
16
+ declare function createSocketComposables<Registry = never>(): {
17
+ provideSocket: (socket: Socket<Registry>, options?: {
18
+ owned?: boolean;
19
+ }) => void;
20
+ useSocket: () => Socket<Registry>;
21
+ useSocketState: () => {
22
+ state: Readonly<ShallowRef<ConnectionState>>;
23
+ connected: ComputedRef<boolean>;
24
+ };
25
+ useChannel: {
26
+ <const Args extends VueChannelCallArgs<Registry>>(...args: Args): Readonly<ShallowRef<FrameworkChannel<Registry, Args[0]> | null>>;
27
+ (pattern: null): Readonly<ShallowRef<null>>;
28
+ };
29
+ useChannelEvent: <const Pattern extends FrameworkChannelPattern<Registry>, Event extends FrameworkChannelEvent<Registry, Pattern>>(pattern: Pattern | null, ...args: VueChannelEventArgs<Registry, Pattern, Event>) => void;
30
+ };
31
+
32
+ export { createSocketComposables };
@@ -0,0 +1,100 @@
1
+ import {
2
+ acquireChannel,
3
+ acquireSocketOwnership,
4
+ createChannelCallArgs,
5
+ resolveChannelEventArgs
6
+ } from "../../chunk-55EIQ2VV.js";
7
+ import {
8
+ buildChannelName
9
+ } from "../../chunk-O6UYCGTV.js";
10
+ import "../../chunk-BLRAKPXW.js";
11
+ import "../../chunk-6PJ4ALJD.js";
12
+ import "../../chunk-E6ILCRL3.js";
13
+
14
+ // src/client/vue.ts
15
+ import {
16
+ computed,
17
+ inject,
18
+ onMounted,
19
+ onScopeDispose,
20
+ provide,
21
+ shallowRef,
22
+ toValue,
23
+ watch
24
+ } from "vue";
25
+ function createSocketComposables() {
26
+ const key = /* @__PURE__ */ Symbol("socket");
27
+ function provideSocket(socket, options = {}) {
28
+ const state = shallowRef(socket.state);
29
+ const stopStateListener = socket.onStateChange((nextState) => {
30
+ state.value = nextState;
31
+ });
32
+ provide(key, { socket, state });
33
+ let releaseOwnership;
34
+ if (options.owned) onMounted(() => releaseOwnership = acquireSocketOwnership(socket));
35
+ onScopeDispose(() => {
36
+ stopStateListener();
37
+ releaseOwnership?.();
38
+ });
39
+ }
40
+ function useContext() {
41
+ const context = inject(key);
42
+ if (!context) throw new Error("provideSocket must be called by an ancestor");
43
+ return context;
44
+ }
45
+ function useSocket() {
46
+ return useContext().socket;
47
+ }
48
+ function useSocketState() {
49
+ const state = useContext().state;
50
+ return { state, connected: computed(() => state.value === "connected") };
51
+ }
52
+ function useChannel(...args) {
53
+ const [pattern, parameterInput] = args;
54
+ const socket = useSocket();
55
+ const channel = shallowRef(null);
56
+ watch(
57
+ () => pattern === null ? null : toValue(parameterInput),
58
+ (parameters, _previousParameters, onCleanup) => {
59
+ const nextName = pattern === null ? null : buildChannelName(pattern, parameters);
60
+ if (nextName === null || pattern === null) {
61
+ channel.value = null;
62
+ return;
63
+ }
64
+ const channelArgs = createChannelCallArgs(
65
+ pattern,
66
+ parameters
67
+ );
68
+ const acquired = acquireChannel(socket, ...channelArgs);
69
+ channel.value = acquired.channel;
70
+ onCleanup(() => acquired.lease.release());
71
+ },
72
+ { immediate: true }
73
+ );
74
+ return channel;
75
+ }
76
+ function useChannelEvent(pattern, ...args) {
77
+ const socket = useSocket();
78
+ const { parameterInput, event, handler } = resolveChannelEventArgs(args);
79
+ watch(
80
+ () => pattern === null ? null : toValue(parameterInput),
81
+ (parameters, _previousParameters, onCleanup) => {
82
+ const nextName = pattern === null ? null : buildChannelName(pattern, parameters);
83
+ if (nextName === null || pattern === null) return;
84
+ const channelArgs = createChannelCallArgs(
85
+ pattern,
86
+ parameters
87
+ );
88
+ const { lease } = acquireChannel(socket, ...channelArgs);
89
+ lease.listen(event, handler);
90
+ onCleanup(() => lease.release());
91
+ },
92
+ { immediate: true }
93
+ );
94
+ }
95
+ return { provideSocket, useSocket, useSocketState, useChannel, useChannelEvent };
96
+ }
97
+ export {
98
+ createSocketComposables
99
+ };
100
+ //# sourceMappingURL=vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/client/vue.ts"],"sourcesContent":["import {\n computed,\n inject,\n onMounted,\n onScopeDispose,\n provide,\n shallowRef,\n toValue,\n watch,\n type ComputedRef,\n type InjectionKey,\n type MaybeRefOrGetter,\n type ShallowRef,\n} from 'vue'\nimport type { Channel } from './channel.js'\nimport { buildChannelName, type Socket } from './socket.js'\nimport type { ConnectionState, EventHandler } from './types.js'\nimport {\n acquireChannel,\n acquireSocketOwnership,\n createChannelCallArgs,\n resolveChannelEventArgs,\n type FrameworkChannel,\n type FrameworkChannelEvent,\n type FrameworkChannelEventPayload,\n type FrameworkChannelParameters,\n type FrameworkChannelPattern,\n} from './framework.js'\n\ninterface VueSocketContext<Registry> {\n socket: Socket<Registry>\n state: ShallowRef<ConnectionState>\n}\n\ntype ChannelParameterInput<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n> = MaybeRefOrGetter<FrameworkChannelParameters<Registry, Pattern>>\n\ntype VueChannelCallArgs<Registry> = {\n [Pattern in FrameworkChannelPattern<Registry>]: FrameworkChannelParameters<\n Registry,\n Pattern\n > extends undefined\n ? [pattern: Pattern]\n : [pattern: Pattern, parameters: ChannelParameterInput<Registry, Pattern>]\n}[FrameworkChannelPattern<Registry>]\n\ntype VueChannelEventArgs<\n Registry,\n Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n> =\n FrameworkChannelParameters<Registry, Pattern> extends undefined\n ? [event: Event, handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>]\n : [\n parameters: ChannelParameterInput<Registry, Pattern>,\n event: Event,\n handler: EventHandler<FrameworkChannelEventPayload<Registry, Pattern, Event>>,\n ]\n\nexport function createSocketComposables<Registry = never>() {\n const key = Symbol('socket') as InjectionKey<VueSocketContext<Registry>>\n\n function provideSocket(socket: Socket<Registry>, options: { owned?: boolean } = {}): void {\n const state = shallowRef(socket.state)\n const stopStateListener = socket.onStateChange((nextState) => {\n state.value = nextState\n })\n provide(key, { socket, state })\n\n let releaseOwnership: (() => void) | undefined\n if (options.owned) onMounted(() => (releaseOwnership = acquireSocketOwnership(socket)))\n onScopeDispose(() => {\n stopStateListener()\n releaseOwnership?.()\n })\n }\n\n function useContext(): VueSocketContext<Registry> {\n const context = inject(key)\n if (!context) throw new Error('provideSocket must be called by an ancestor')\n return context\n }\n\n function useSocket(): Socket<Registry> {\n return useContext().socket\n }\n\n function useSocketState(): {\n state: Readonly<ShallowRef<ConnectionState>>\n connected: ComputedRef<boolean>\n } {\n const state = useContext().state\n return { state, connected: computed(() => state.value === 'connected') }\n }\n\n function useChannel<const Args extends VueChannelCallArgs<Registry>>(\n ...args: Args\n ): Readonly<ShallowRef<FrameworkChannel<Registry, Args[0]> | null>>\n function useChannel(pattern: null): Readonly<ShallowRef<null>>\n function useChannel(\n ...args: [\n pattern: FrameworkChannelPattern<Registry> | null,\n parameterInput?: MaybeRefOrGetter<object | undefined>,\n ]\n ): Readonly<ShallowRef<Channel<any> | null>> {\n const [pattern, parameterInput] = args\n const socket = useSocket()\n const channel = shallowRef(null) as ShallowRef<Channel<any> | null>\n\n watch(\n () => (pattern === null ? null : toValue(parameterInput)),\n (parameters, _previousParameters, onCleanup) => {\n const nextName =\n pattern === null ? null : buildChannelName(pattern, parameters as object | undefined)\n if (nextName === null || pattern === null) {\n channel.value = null\n return\n }\n const channelArgs = createChannelCallArgs<Registry>(\n pattern,\n parameters as object | undefined\n )\n const acquired = acquireChannel(socket, ...channelArgs)\n channel.value = acquired.channel\n onCleanup(() => acquired.lease.release())\n },\n { immediate: true }\n )\n\n return channel\n }\n\n function useChannelEvent<\n const Pattern extends FrameworkChannelPattern<Registry>,\n Event extends FrameworkChannelEvent<Registry, Pattern>,\n >(pattern: Pattern | null, ...args: VueChannelEventArgs<Registry, Pattern, Event>): void {\n const socket = useSocket()\n const { parameterInput, event, handler } = resolveChannelEventArgs<\n ChannelParameterInput<Registry, Pattern>,\n Event,\n FrameworkChannelEventPayload<Registry, Pattern, Event>\n >(args)\n watch(\n () => (pattern === null ? null : toValue(parameterInput)),\n (parameters, _previousParameters, onCleanup) => {\n const nextName =\n pattern === null ? null : buildChannelName(pattern, parameters as object | undefined)\n if (nextName === null || pattern === null) return\n const channelArgs = createChannelCallArgs<Registry>(\n pattern,\n parameters as object | undefined\n )\n const { lease } = acquireChannel(socket, ...channelArgs)\n lease.listen(event, handler)\n onCleanup(() => lease.release())\n },\n { immediate: true }\n )\n }\n\n return { provideSocket, useSocket, useSocketState, useChannel, useChannelEvent }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AAgDA,SAAS,0BAA4C;AAC1D,QAAM,MAAM,uBAAO,QAAQ;AAE3B,WAAS,cAAc,QAA0B,UAA+B,CAAC,GAAS;AACxF,UAAM,QAAQ,WAAW,OAAO,KAAK;AACrC,UAAM,oBAAoB,OAAO,cAAc,CAAC,cAAc;AAC5D,YAAM,QAAQ;AAAA,IAChB,CAAC;AACD,YAAQ,KAAK,EAAE,QAAQ,MAAM,CAAC;AAE9B,QAAI;AACJ,QAAI,QAAQ,MAAO,WAAU,MAAO,mBAAmB,uBAAuB,MAAM,CAAE;AACtF,mBAAe,MAAM;AACnB,wBAAkB;AAClB,yBAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,WAAS,aAAyC;AAChD,UAAM,UAAU,OAAO,GAAG;AAC1B,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,6CAA6C;AAC3E,WAAO;AAAA,EACT;AAEA,WAAS,YAA8B;AACrC,WAAO,WAAW,EAAE;AAAA,EACtB;AAEA,WAAS,iBAGP;AACA,UAAM,QAAQ,WAAW,EAAE;AAC3B,WAAO,EAAE,OAAO,WAAW,SAAS,MAAM,MAAM,UAAU,WAAW,EAAE;AAAA,EACzE;AAMA,WAAS,cACJ,MAIwC;AAC3C,UAAM,CAAC,SAAS,cAAc,IAAI;AAClC,UAAM,SAAS,UAAU;AACzB,UAAM,UAAU,WAAW,IAAI;AAE/B;AAAA,MACE,MAAO,YAAY,OAAO,OAAO,QAAQ,cAAc;AAAA,MACvD,CAAC,YAAY,qBAAqB,cAAc;AAC9C,cAAM,WACJ,YAAY,OAAO,OAAO,iBAAiB,SAAS,UAAgC;AACtF,YAAI,aAAa,QAAQ,YAAY,MAAM;AACzC,kBAAQ,QAAQ;AAChB;AAAA,QACF;AACA,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AACA,cAAM,WAAW,eAAe,QAAQ,GAAG,WAAW;AACtD,gBAAQ,QAAQ,SAAS;AACzB,kBAAU,MAAM,SAAS,MAAM,QAAQ,CAAC;AAAA,MAC1C;AAAA,MACA,EAAE,WAAW,KAAK;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAGP,YAA4B,MAA2D;AACvF,UAAM,SAAS,UAAU;AACzB,UAAM,EAAE,gBAAgB,OAAO,QAAQ,IAAI,wBAIzC,IAAI;AACN;AAAA,MACE,MAAO,YAAY,OAAO,OAAO,QAAQ,cAAc;AAAA,MACvD,CAAC,YAAY,qBAAqB,cAAc;AAC9C,cAAM,WACJ,YAAY,OAAO,OAAO,iBAAiB,SAAS,UAAgC;AACtF,YAAI,aAAa,QAAQ,YAAY,KAAM;AAC3C,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AACA,cAAM,EAAE,MAAM,IAAI,eAAe,QAAQ,GAAG,WAAW;AACvD,cAAM,OAAO,OAAO,OAAO;AAC3B,kBAAU,MAAM,MAAM,QAAQ,CAAC;AAAA,MACjC;AAAA,MACA,EAAE,WAAW,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SAAO,EAAE,eAAe,WAAW,gBAAgB,YAAY,gBAAgB;AACjF;","names":[]}
@@ -1,17 +1,20 @@
1
- import { C as ChannelEventMap, a as ChannelHandlerMap } from '../types-C0rDwbry.js';
1
+ import { A as AuthenticatedSocket } from '../base_channel-DKmR3Z0l.js';
2
2
  import 'ws';
3
3
  import 'node:http';
4
+ import '@adonisjs/core/types/http';
5
+ import '@adonisjs/core/http';
4
6
  import '@boringnode/bus/types/main';
5
- import '../shared_types-Dw9AphfO.js';
7
+ import '../shared_types-DE86M136.js';
6
8
 
9
+ type DecoratedChannelHandler<User> = (socket: AuthenticatedSocket<User>, data: unknown) => unknown;
7
10
  /**
8
- * Legacy method decorator used to bind an incoming channel event to a method.
11
+ * Method decorator used to bind an incoming channel event to a method.
9
12
  */
10
13
  declare function onMessage<EventName extends string>(event: EventName): MethodDecorator;
11
14
  /**
12
15
  * Resolve decorated handlers for a channel instance, including inherited ones.
13
16
  * Child classes override parent handlers when the event name is the same.
14
17
  */
15
- declare function getDecoratedChannelHandlers<User = unknown, Events extends ChannelEventMap = ChannelEventMap, HttpContext = unknown>(instance: object): ChannelHandlerMap<User, Events, HttpContext>;
18
+ declare function getDecoratedChannelHandlers<User = unknown>(instance: object): Record<string, DecoratedChannelHandler<User>>;
16
19
 
17
20
  export { getDecoratedChannelHandlers, onMessage };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getDecoratedChannelHandlers,
3
3
  onMessage
4
- } from "../chunk-XUDFDJME.js";
4
+ } from "../chunk-G75J233Z.js";
5
5
  export {
6
6
  getDecoratedChannelHandlers,
7
7
  onMessage
@@ -1,12 +1,15 @@
1
- import { S as SocketService } from '../socket_service-jxIaH5Rs.js';
2
- import '../types-C0rDwbry.js';
3
1
  import { BaseCheck, Result } from '@adonisjs/core/health';
4
- import '../shared_types-Dw9AphfO.js';
2
+ import { S as SocketService } from '../socket_service-C1JM64_9.js';
5
3
  import 'node:http';
6
4
  import '@adonisjs/logger';
7
5
  import 'emittery';
8
6
  import 'ws';
7
+ import '../base_channel-DKmR3Z0l.js';
8
+ import '@adonisjs/core/types/http';
9
+ import '@adonisjs/core/http';
9
10
  import '@boringnode/bus/types/main';
11
+ import '../shared_types-DE86M136.js';
12
+ import './testing.js';
10
13
 
11
14
  declare class SocketHealthCheck extends BaseCheck {
12
15
  private socket;
@@ -1,6 +1,17 @@
1
- import {
2
- SocketHealthCheck
3
- } from "../chunk-HK7Z65DA.js";
1
+ // src/health_check.ts
2
+ import { BaseCheck, Result } from "@adonisjs/core/health";
3
+ var SocketHealthCheck = class extends BaseCheck {
4
+ constructor(socket) {
5
+ super();
6
+ this.socket = socket;
7
+ }
8
+ name = "Socket health check";
9
+ async run() {
10
+ const snapshot = this.socket.health();
11
+ const result = snapshot.ready ? Result.ok("Socket service is ready") : Result.failed(`Socket service is ${snapshot.status}`);
12
+ return result.setMetaData(snapshot);
13
+ }
14
+ };
4
15
  export {
5
16
  SocketHealthCheck
6
17
  };
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../src/health_check.ts"],"sourcesContent":["import { BaseCheck, Result } from '@adonisjs/core/health'\nimport type { SocketService } from './socket_service.js'\n\nexport class SocketHealthCheck extends BaseCheck {\n name = 'Socket health check'\n\n constructor(private socket: SocketService) {\n super()\n }\n\n async run() {\n const snapshot = this.socket.health()\n const result = snapshot.ready\n ? Result.ok('Socket service is ready')\n : Result.failed(`Socket service is ${snapshot.status}`)\n\n return result.setMetaData(snapshot)\n }\n}\n"],"mappings":";AAAA,SAAS,WAAW,cAAc;AAG3B,IAAM,oBAAN,cAAgC,UAAU;AAAA,EAG/C,YAAoB,QAAuB;AACzC,UAAM;AADY;AAAA,EAEpB;AAAA,EAJA,OAAO;AAAA,EAMP,MAAM,MAAM;AACV,UAAM,WAAW,KAAK,OAAO,OAAO;AACpC,UAAM,SAAS,SAAS,QACpB,OAAO,GAAG,yBAAyB,IACnC,OAAO,OAAO,qBAAqB,SAAS,MAAM,EAAE;AAExD,WAAO,OAAO,YAAY,QAAQ;AAAA,EACpC;AACF;","names":[]}
@@ -23,6 +23,7 @@ declare class SocketInstrumentation extends InstrumentationBase<SocketInstrument
23
23
  protected broadcastHandlers?: TracingChannelSubscribers<SocketBroadcastMessage>;
24
24
  constructor(config?: SocketInstrumentationConfig);
25
25
  protected init(): undefined;
26
+ protected _updateMetricInstruments(): void;
26
27
  enable(): void;
27
28
  disable(): void;
28
29
  manuallyRegister(): void;