react-realtime-hooks 1.0.1 → 1.0.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/env.ts","../src/hooks/useOnlineStatus.ts","../src/core/reconnect.ts","../src/core/timers.ts","../src/hooks/useReconnect.ts","../src/hooks/useHeartbeat.ts","../src/core/connection-state.ts","../src/core/url.ts","../src/hooks/useWebSocket.ts","../src/hooks/useEventSource.ts"],"names":["useSyncExternalStore","useRef","useState","useEffect","startTransition","useEffectEvent","createInitialState","useMemo","socket","defaultParseMessage"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface RuntimeFeatureSupport {\n eventSource: boolean;\n navigatorOnLine: boolean;\n webSocket: boolean;\n}\n\nexport const isBrowserRuntime = (): boolean =>\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nexport const isWebSocketSupported = (): boolean =>\n typeof WebSocket !== \"undefined\";\n\nexport const isEventSourceSupported = (): boolean =>\n typeof EventSource !== \"undefined\";\n\nexport const hasNavigatorOnLineSupport = (): boolean =>\n typeof navigator !== \"undefined\" && typeof navigator.onLine === \"boolean\";\n\nexport const readOnlineStatus = (initialOnline = true): {\n isOnline: boolean;\n isSupported: boolean;\n} => {\n if (!hasNavigatorOnLineSupport()) {\n return {\n isOnline: initialOnline,\n isSupported: false\n };\n }\n\n return {\n isOnline: navigator.onLine,\n isSupported: true\n };\n};\n\nexport const getRuntimeFeatureSupport = (): RuntimeFeatureSupport => ({\n eventSource: isEventSourceSupported(),\n navigatorOnLine: hasNavigatorOnLineSupport(),\n webSocket: isWebSocketSupported()\n});\n","import { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\n\nimport { hasNavigatorOnLineSupport, readOnlineStatus } from \"../core/env\";\nimport type {\n UseOnlineStatusHook,\n UseOnlineStatusOptions,\n UseOnlineStatusResult\n} from \"../types/useOnlineStatus\";\n\nconst subscribeToOnlineStatus = (onStoreChange: () => void): (() => void) => {\n if (typeof window === \"undefined\") {\n return () => {};\n }\n\n window.addEventListener(\"online\", onStoreChange);\n window.addEventListener(\"offline\", onStoreChange);\n\n return () => {\n window.removeEventListener(\"online\", onStoreChange);\n window.removeEventListener(\"offline\", onStoreChange);\n };\n};\n\nconst createEmptyTransitionState = (): Pick<\n UseOnlineStatusResult,\n \"lastChangedAt\" | \"wentOfflineAt\" | \"wentOnlineAt\"\n> => ({\n lastChangedAt: null,\n wentOfflineAt: null,\n wentOnlineAt: null\n});\n\nexport const useOnlineStatus: UseOnlineStatusHook = (\n options: UseOnlineStatusOptions = {}\n) => {\n const initialOnline = options.initialOnline ?? true;\n const trackTransitions = options.trackTransitions ?? true;\n\n const isOnline = useSyncExternalStore(\n subscribeToOnlineStatus,\n () => readOnlineStatus(initialOnline).isOnline,\n () => initialOnline\n );\n\n const previousOnlineRef = useRef(isOnline);\n const [transitions, setTransitions] = useState(createEmptyTransitionState);\n\n useEffect(() => {\n if (!trackTransitions) {\n previousOnlineRef.current = isOnline;\n setTransitions(createEmptyTransitionState);\n return;\n }\n\n if (previousOnlineRef.current === isOnline) {\n return;\n }\n\n const changedAt = Date.now();\n previousOnlineRef.current = isOnline;\n\n setTransitions((current) => ({\n lastChangedAt: changedAt,\n wentOfflineAt: isOnline ? current.wentOfflineAt : changedAt,\n wentOnlineAt: isOnline ? changedAt : current.wentOnlineAt\n }));\n }, [isOnline, trackTransitions]);\n\n return {\n isOnline,\n isSupported: hasNavigatorOnLineSupport(),\n ...transitions\n };\n};\n","import type {\n ReconnectAttempt,\n ReconnectDelayContext,\n ReconnectDelayStrategy,\n ReconnectTrigger,\n UseReconnectOptions\n} from \"../types/useReconnect\";\n\nexport interface NormalizedReconnectOptions {\n backoffFactor: number;\n enabled: boolean;\n getDelayMs?: ReconnectDelayStrategy;\n initialDelayMs: number;\n jitterRatio: number;\n maxAttempts: number | null;\n maxDelayMs: number;\n onCancel?: () => void;\n onReset?: () => void;\n onSchedule?: (attempt: ReconnectAttempt) => void;\n resetOnSuccess: boolean;\n}\n\nexport interface ReconnectDelayCalculationOptions {\n random?: () => number;\n strategy?: ReconnectDelayStrategy;\n}\n\nexport interface CreateReconnectAttemptOptions\n extends ReconnectDelayCalculationOptions {\n now?: number;\n}\n\nexport const DEFAULT_RECONNECT_OPTIONS: Readonly<\n Omit<NormalizedReconnectOptions, \"getDelayMs\" | \"onCancel\" | \"onReset\" | \"onSchedule\">\n> = {\n backoffFactor: 2,\n enabled: true,\n initialDelayMs: 1_000,\n jitterRatio: 0.2,\n maxAttempts: null,\n maxDelayMs: 30_000,\n resetOnSuccess: true\n};\n\nconst clampNumber = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\nconst sanitizeDelay = (value: number): number => {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.round(value));\n};\n\nconst sanitizeBackoffFactor = (value: number): number => {\n if (!Number.isFinite(value)) {\n return DEFAULT_RECONNECT_OPTIONS.backoffFactor;\n }\n\n return Math.max(1, value);\n};\n\nconst sanitizeMaxAttempts = (\n value: number | null | undefined\n): number | null => {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (!Number.isFinite(value)) {\n return null;\n }\n\n return Math.max(0, Math.floor(value));\n};\n\nconst sanitizeJitterRatio = (value: number): number => {\n if (!Number.isFinite(value)) {\n return DEFAULT_RECONNECT_OPTIONS.jitterRatio;\n }\n\n return clampNumber(value, 0, 1);\n};\n\nexport const normalizeReconnectOptions = (\n options?: false | UseReconnectOptions\n): NormalizedReconnectOptions | null => {\n if (options === false) {\n return null;\n }\n\n const initialDelayMs = sanitizeDelay(\n options?.initialDelayMs ?? DEFAULT_RECONNECT_OPTIONS.initialDelayMs\n );\n const maxDelayMs = Math.max(\n initialDelayMs,\n sanitizeDelay(options?.maxDelayMs ?? DEFAULT_RECONNECT_OPTIONS.maxDelayMs)\n );\n\n const normalized: NormalizedReconnectOptions = {\n backoffFactor: sanitizeBackoffFactor(\n options?.backoffFactor ?? DEFAULT_RECONNECT_OPTIONS.backoffFactor\n ),\n enabled: options?.enabled ?? DEFAULT_RECONNECT_OPTIONS.enabled,\n initialDelayMs,\n jitterRatio: sanitizeJitterRatio(\n options?.jitterRatio ?? DEFAULT_RECONNECT_OPTIONS.jitterRatio\n ),\n maxAttempts: sanitizeMaxAttempts(options?.maxAttempts),\n maxDelayMs,\n resetOnSuccess: options?.resetOnSuccess ?? DEFAULT_RECONNECT_OPTIONS.resetOnSuccess\n };\n\n if (options?.getDelayMs !== undefined) {\n normalized.getDelayMs = options.getDelayMs;\n }\n\n if (options?.onCancel !== undefined) {\n normalized.onCancel = options.onCancel;\n }\n\n if (options?.onReset !== undefined) {\n normalized.onReset = options.onReset;\n }\n\n if (options?.onSchedule !== undefined) {\n normalized.onSchedule = options.onSchedule;\n }\n\n return normalized;\n};\n\nexport const createReconnectDelayContext = (\n attempt: number,\n options: Pick<\n NormalizedReconnectOptions,\n \"backoffFactor\" | \"initialDelayMs\" | \"jitterRatio\" | \"maxDelayMs\"\n >,\n lastDelayMs: number | null\n): ReconnectDelayContext => ({\n attempt: Math.max(1, Math.floor(attempt)),\n backoffFactor: options.backoffFactor,\n initialDelayMs: options.initialDelayMs,\n jitterRatio: options.jitterRatio,\n lastDelayMs,\n maxDelayMs: options.maxDelayMs\n});\n\nexport const defaultReconnectDelayStrategy = (\n context: ReconnectDelayContext\n): number => {\n const exponent = Math.max(0, context.attempt - 1);\n const baseDelay = context.initialDelayMs * context.backoffFactor ** exponent;\n return Math.min(context.maxDelayMs, sanitizeDelay(baseDelay));\n};\n\nexport const applyJitterToDelay = (\n delayMs: number,\n jitterRatio: number,\n random: () => number = Math.random\n): number => {\n if (delayMs === 0 || jitterRatio === 0) {\n return delayMs;\n }\n\n const safeRandom = clampNumber(random(), 0, 1);\n const variance = delayMs * jitterRatio;\n const offset = (safeRandom * 2 - 1) * variance;\n return sanitizeDelay(delayMs + offset);\n};\n\nexport const calculateReconnectDelay = (\n context: ReconnectDelayContext,\n options: ReconnectDelayCalculationOptions = {}\n): number => {\n const baseDelay = sanitizeDelay(\n (options.strategy ?? defaultReconnectDelayStrategy)(context)\n );\n const cappedDelay = Math.min(context.maxDelayMs, baseDelay);\n return Math.min(\n context.maxDelayMs,\n applyJitterToDelay(cappedDelay, context.jitterRatio, options.random)\n );\n};\n\nexport const canScheduleReconnectAttempt = (\n attempt: number,\n options: Pick<NormalizedReconnectOptions, \"enabled\" | \"maxAttempts\">\n): boolean => {\n if (!options.enabled) {\n return false;\n }\n\n if (attempt < 1) {\n return false;\n }\n\n return options.maxAttempts === null || attempt <= options.maxAttempts;\n};\n\nexport const createReconnectAttempt = (\n attempt: number,\n trigger: ReconnectTrigger,\n options: Pick<\n NormalizedReconnectOptions,\n \"backoffFactor\" | \"enabled\" | \"getDelayMs\" | \"initialDelayMs\" | \"jitterRatio\" | \"maxAttempts\" | \"maxDelayMs\"\n >,\n lastDelayMs: number | null,\n config: CreateReconnectAttemptOptions = {}\n): ReconnectAttempt | null => {\n if (!canScheduleReconnectAttempt(attempt, options)) {\n return null;\n }\n\n const context = createReconnectDelayContext(attempt, options, lastDelayMs);\n const calculationOptions: ReconnectDelayCalculationOptions = {};\n\n if (config.random !== undefined) {\n calculationOptions.random = config.random;\n }\n\n if (options.getDelayMs !== undefined) {\n calculationOptions.strategy = options.getDelayMs;\n }\n\n return {\n attempt,\n delayMs: calculateReconnectDelay(context, calculationOptions),\n scheduledAt: config.now ?? Date.now(),\n trigger\n };\n};\n","export interface ManagedTimeout {\n cancel: () => void;\n isActive: () => boolean;\n schedule: (callback: () => void, delayMs: number) => void;\n}\n\nexport interface ManagedInterval {\n cancel: () => void;\n isActive: () => boolean;\n start: (callback: () => void, intervalMs: number) => void;\n}\n\nconst sanitizeTimerDelay = (delayMs: number): number => {\n if (!Number.isFinite(delayMs)) {\n return 0;\n }\n\n return Math.max(0, Math.round(delayMs));\n};\n\nexport const createManagedTimeout = (): ManagedTimeout => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return {\n cancel() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n },\n isActive() {\n return timeoutId !== null;\n },\n schedule(callback, delayMs) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n callback();\n }, sanitizeTimerDelay(delayMs));\n }\n };\n};\n\nexport const createManagedInterval = (): ManagedInterval => {\n let intervalId: ReturnType<typeof setInterval> | null = null;\n\n return {\n cancel() {\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n },\n isActive() {\n return intervalId !== null;\n },\n start(callback, intervalMs) {\n if (intervalId !== null) {\n clearInterval(intervalId);\n }\n\n intervalId = setInterval(callback, sanitizeTimerDelay(intervalMs));\n }\n };\n};\n","import {\n startTransition,\n useEffect,\n useEffectEvent,\n useRef,\n useState\n} from \"react\";\n\nimport {\n createReconnectAttempt,\n normalizeReconnectOptions\n} from \"../core/reconnect\";\nimport { createManagedTimeout } from \"../core/timers\";\nimport type {\n ReconnectAttempt,\n ReconnectTrigger,\n UseReconnectHook,\n UseReconnectResult\n} from \"../types/useReconnect\";\n\ntype ReconnectState = Pick<\n UseReconnectResult,\n \"attempt\" | \"nextDelayMs\" | \"status\"\n>;\n\nconst createInitialState = (enabled: boolean): ReconnectState => ({\n attempt: 0,\n nextDelayMs: null,\n status: enabled ? \"idle\" : \"stopped\"\n});\n\nexport const useReconnect: UseReconnectHook = (options = {}) => {\n const normalizedOptions = normalizeReconnectOptions(options) ??\n normalizeReconnectOptions()!;\n const timeoutRef = useRef(createManagedTimeout());\n const lastDelayRef = useRef<number | null>(null);\n const [state, setState] = useState<ReconnectState>(() =>\n createInitialState(normalizedOptions.enabled)\n );\n const stateRef = useRef(state);\n\n stateRef.current = state;\n\n const commitState = (\n next:\n | ReconnectState\n | ((current: ReconnectState) => ReconnectState)\n ): void => {\n const resolved =\n typeof next === \"function\"\n ? next(stateRef.current)\n : next;\n\n stateRef.current = resolved;\n startTransition(() => {\n setState(resolved);\n });\n };\n\n const runAttempt = useEffectEvent((attempt: number) => {\n commitState({\n attempt,\n nextDelayMs: null,\n status: \"running\"\n });\n });\n\n const emitSchedule = useEffectEvent((attempt: ReconnectAttempt) => {\n normalizedOptions.onSchedule?.(attempt);\n });\n\n const emitCancel = useEffectEvent(() => {\n normalizedOptions.onCancel?.();\n });\n\n const emitReset = useEffectEvent(() => {\n normalizedOptions.onReset?.();\n });\n\n useEffect(() => {\n if (!normalizedOptions.enabled) {\n timeoutRef.current.cancel();\n commitState((current) => ({\n ...current,\n nextDelayMs: null,\n status: \"stopped\"\n }));\n return;\n }\n\n commitState((current) =>\n current.status === \"stopped\"\n ? {\n ...current,\n status: \"idle\"\n }\n : current\n );\n }, [normalizedOptions.enabled]);\n\n useEffect(() => () => {\n timeoutRef.current.cancel();\n }, []);\n\n const schedule = (trigger: ReconnectTrigger = \"manual\"): void => {\n const current = stateRef.current;\n const nextAttempt = current.attempt + 1;\n const attempt = createReconnectAttempt(\n nextAttempt,\n trigger,\n normalizedOptions,\n lastDelayRef.current\n );\n\n timeoutRef.current.cancel();\n\n if (attempt === null) {\n commitState((snapshot) => ({\n ...snapshot,\n nextDelayMs: null,\n status: \"stopped\"\n }));\n return;\n }\n\n lastDelayRef.current = attempt.delayMs;\n timeoutRef.current.schedule(() => {\n runAttempt(attempt.attempt);\n }, attempt.delayMs);\n\n commitState({\n attempt: attempt.attempt,\n nextDelayMs: attempt.delayMs,\n status: \"scheduled\"\n });\n\n emitSchedule(attempt);\n };\n\n const cancel = (): void => {\n const current = stateRef.current;\n const shouldEmitCancel =\n timeoutRef.current.isActive() ||\n current.status === \"scheduled\" ||\n current.status === \"running\";\n\n timeoutRef.current.cancel();\n commitState((snapshot) => ({\n ...snapshot,\n nextDelayMs: null,\n status: \"stopped\"\n }));\n\n if (shouldEmitCancel) {\n emitCancel();\n }\n };\n\n const reset = (): void => {\n timeoutRef.current.cancel();\n lastDelayRef.current = null;\n commitState(createInitialState(normalizedOptions.enabled));\n emitReset();\n };\n\n const markConnected = (): void => {\n timeoutRef.current.cancel();\n\n if (normalizedOptions.resetOnSuccess) {\n lastDelayRef.current = null;\n commitState(createInitialState(normalizedOptions.enabled));\n emitReset();\n return;\n }\n\n commitState((current) => ({\n ...current,\n nextDelayMs: null,\n status: normalizedOptions.enabled ? \"idle\" : \"stopped\"\n }));\n };\n\n return {\n attempt: state.attempt,\n cancel,\n isActive: state.status === \"scheduled\" || state.status === \"running\",\n isScheduled: state.status === \"scheduled\",\n markConnected,\n nextDelayMs: state.nextDelayMs,\n reset,\n schedule,\n status: state.status\n };\n};\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\nimport {\n createManagedInterval,\n createManagedTimeout\n} from \"../core/timers\";\nimport type {\n UseHeartbeatOptions,\n UseHeartbeatHook,\n UseHeartbeatResult\n} from \"../types/useHeartbeat\";\n\ntype HeartbeatState = Pick<\n UseHeartbeatResult,\n \"hasTimedOut\" | \"isRunning\" | \"lastAckAt\" | \"lastBeatAt\" | \"latencyMs\"\n>;\n\nconst createInitialState = (isRunning: boolean): HeartbeatState => ({\n hasTimedOut: false,\n isRunning,\n lastAckAt: null,\n lastBeatAt: null,\n latencyMs: null\n});\n\nexport const useHeartbeat = <\n TOutgoing = unknown,\n TIncoming = TOutgoing\n>(\n options: UseHeartbeatOptions<TOutgoing, TIncoming>\n): UseHeartbeatResult<TIncoming> => {\n const enabled = options.enabled ?? true;\n const startOnMount = options.startOnMount ?? true;\n const intervalRef = useRef(createManagedInterval());\n const timeoutRef = useRef(createManagedTimeout());\n const [state, setState] = useState<HeartbeatState>(() =>\n createInitialState(enabled && startOnMount)\n );\n const stateRef = useRef(state);\n\n stateRef.current = state;\n\n const commitState = (\n next:\n | HeartbeatState\n | ((current: HeartbeatState) => HeartbeatState)\n ): void => {\n const resolved =\n typeof next === \"function\" ? next(stateRef.current) : next;\n\n stateRef.current = resolved;\n setState(resolved);\n };\n\n const handleTimeout = useEffectEvent(() => {\n commitState((current) => ({\n ...current,\n hasTimedOut: true\n }));\n options.onTimeout?.();\n });\n\n const scheduleTimeout = useEffectEvent(() => {\n if (options.timeoutMs === undefined) {\n timeoutRef.current.cancel();\n return;\n }\n\n timeoutRef.current.schedule(() => {\n handleTimeout();\n }, options.timeoutMs);\n });\n\n const runBeat = useEffectEvent(() => {\n const performedAt = Date.now();\n\n commitState((current) => ({\n ...current,\n hasTimedOut: false,\n lastBeatAt: performedAt\n }));\n\n scheduleTimeout();\n options.onBeat?.();\n\n void options.beat?.();\n });\n\n const start = (): void => {\n if (!enabled) {\n return;\n }\n\n if (!intervalRef.current.isActive()) {\n intervalRef.current.start(() => {\n runBeat();\n }, options.intervalMs);\n }\n\n commitState((current) => ({\n ...current,\n hasTimedOut: false,\n isRunning: true\n }));\n };\n\n const stop = (): void => {\n intervalRef.current.cancel();\n timeoutRef.current.cancel();\n commitState((current) => ({\n ...current,\n hasTimedOut: false,\n isRunning: false\n }));\n };\n\n const beat = (): void => {\n if (!enabled) {\n return;\n }\n\n runBeat();\n };\n\n const notifyAck = (message: TIncoming): boolean => {\n if (stateRef.current.lastBeatAt === null) {\n return false;\n }\n\n const matchesAck =\n options.matchesAck === undefined || options.matchesAck(message);\n\n if (!matchesAck) {\n return false;\n }\n\n const acknowledgedAt = Date.now();\n timeoutRef.current.cancel();\n\n commitState((current) => ({\n ...current,\n hasTimedOut: false,\n lastAckAt: acknowledgedAt,\n latencyMs:\n current.lastBeatAt === null\n ? null\n : acknowledgedAt - current.lastBeatAt\n }));\n\n return true;\n };\n\n useEffect(() => {\n if (!enabled) {\n stop();\n return;\n }\n\n if (startOnMount) {\n start();\n return stop;\n }\n\n stop();\n return undefined;\n }, [enabled, options.intervalMs, startOnMount]);\n\n useEffect(() => () => {\n intervalRef.current.cancel();\n timeoutRef.current.cancel();\n }, []);\n\n return {\n beat,\n hasTimedOut: state.hasTimedOut,\n isRunning: state.isRunning,\n lastAckAt: state.lastAckAt,\n lastBeatAt: state.lastBeatAt,\n latencyMs: state.latencyMs,\n notifyAck,\n start,\n stop\n };\n};\n\nconst _useHeartbeatTypecheck: UseHeartbeatHook = useHeartbeat;\nvoid _useHeartbeatTypecheck;\n","import type {\n ConnectionStateSnapshot,\n RealtimeConnectionStatus\n} from \"../types/common\";\n\nexport const isConnectedStatus = (\n status: RealtimeConnectionStatus\n): boolean => status === \"open\";\n\nexport const isConnectingStatus = (\n status: RealtimeConnectionStatus\n): boolean => status === \"connecting\" || status === \"reconnecting\";\n\nexport const isClosedStatus = (\n status: RealtimeConnectionStatus\n): boolean => status === \"closed\" || status === \"idle\" || status === \"error\";\n\nexport const createConnectionStateSnapshot = (\n status: RealtimeConnectionStatus,\n config: {\n isSupported?: boolean;\n lastChangedAt?: number | null;\n } = {}\n): ConnectionStateSnapshot => {\n const base = {\n isSupported: config.isSupported ?? true,\n lastChangedAt: config.lastChangedAt ?? null\n };\n\n switch (status) {\n case \"open\":\n return {\n ...base,\n isClosed: false,\n isConnected: true,\n isConnecting: false,\n status\n };\n case \"connecting\":\n case \"reconnecting\":\n return {\n ...base,\n isClosed: false,\n isConnected: false,\n isConnecting: true,\n status\n };\n case \"closing\":\n return {\n ...base,\n isClosed: false,\n isConnected: false,\n isConnecting: false,\n status\n };\n case \"idle\":\n case \"closed\":\n case \"error\":\n return {\n ...base,\n isClosed: true,\n isConnected: false,\n isConnecting: false,\n status\n };\n }\n};\n","import type { UrlProvider } from \"../types/common\";\n\nconst normalizeResolvedUrl = (value: string | URL | null): string | null => {\n if (value === null) {\n return null;\n }\n\n if (value instanceof URL) {\n return value.toString();\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n};\n\nexport const resolveUrlProvider = (url: UrlProvider): string | null => {\n const resolved = typeof url === \"function\" ? url() : url;\n return normalizeResolvedUrl(resolved ?? null);\n};\n","import { useEffect, useEffectEvent, useMemo, useRef, useState } from \"react\";\n\nimport { createConnectionStateSnapshot } from \"../core/connection-state\";\nimport { isWebSocketSupported } from \"../core/env\";\nimport { resolveUrlProvider } from \"../core/url\";\nimport { useHeartbeat } from \"./useHeartbeat\";\nimport { useReconnect } from \"./useReconnect\";\nimport type { UseHeartbeatOptions } from \"../types/useHeartbeat\";\nimport type {\n UseWebSocketHook,\n UseWebSocketOptions,\n UseWebSocketResult\n} from \"../types/useWebSocket\";\n\ntype WebSocketState<TIncoming> = {\n bufferedAmount: number;\n lastChangedAt: number | null;\n lastCloseEvent: CloseEvent | null;\n lastError: Event | null;\n lastMessage: TIncoming | null;\n lastMessageEvent: MessageEvent<unknown> | null;\n status: UseWebSocketResult<TIncoming>[\"status\"];\n};\n\nconst createInitialState = <TIncoming,>(\n status: UseWebSocketResult<TIncoming>[\"status\"] = \"idle\"\n): WebSocketState<TIncoming> => ({\n bufferedAmount: 0,\n lastChangedAt: null,\n lastCloseEvent: null,\n lastError: null,\n lastMessage: null,\n lastMessageEvent: null,\n status\n});\n\nconst defaultParseMessage = <TIncoming,>(\n event: MessageEvent<unknown>\n): TIncoming => event.data as TIncoming;\n\nconst defaultSerializeMessage = <TOutgoing,>(message: TOutgoing) => {\n if (\n typeof message === \"string\" ||\n message instanceof Blob ||\n message instanceof ArrayBuffer\n ) {\n return message;\n }\n\n if (ArrayBuffer.isView(message)) {\n return message;\n }\n\n return JSON.stringify(message);\n};\n\nconst resolveFactoryValue = <TValue,>(\n value: TValue | (() => TValue)\n): TValue =>\n typeof value === \"function\"\n ? (value as () => TValue)()\n : value;\n\nconst toProtocolsDependency = (protocols: string | string[] | undefined): string => {\n if (protocols === undefined) {\n return \"\";\n }\n\n return Array.isArray(protocols) ? protocols.join(\"|\") : protocols;\n};\n\nconst toHeartbeatConfig = <TOutgoing, TIncoming>(\n heartbeat: UseWebSocketOptions<TIncoming, TOutgoing>[\"heartbeat\"]\n): UseHeartbeatOptions<TOutgoing, TIncoming> | null =>\n heartbeat === undefined || heartbeat === false ? null : heartbeat;\n\nexport const useWebSocket: UseWebSocketHook = <\n TIncoming = unknown,\n TOutgoing = TIncoming\n>(\n options: UseWebSocketOptions<TIncoming, TOutgoing>\n): UseWebSocketResult<TIncoming, TOutgoing> => {\n const connect = options.connect ?? true;\n const supported = isWebSocketSupported();\n const resolvedUrl = useMemo(() => resolveUrlProvider(options.url), [options.url]);\n const protocolsDependency = toProtocolsDependency(options.protocols);\n\n const socketRef = useRef<WebSocket | null>(null);\n const socketKeyRef = useRef<string | null>(null);\n const manualCloseRef = useRef(false);\n const manualOpenRef = useRef(false);\n const skipCloseReconnectRef = useRef(false);\n const suppressReconnectRef = useRef(false);\n const [openNonce, setOpenNonce] = useState(0);\n const [state, setState] = useState<WebSocketState<TIncoming>>(() =>\n createInitialState(connect ? \"connecting\" : \"idle\")\n );\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const reconnectEnabled =\n options.reconnect !== false && supported && resolvedUrl !== null;\n const reconnect = useReconnect(\n options.reconnect === false\n ? { enabled: false }\n : {\n ...options.reconnect,\n enabled: reconnectEnabled && (options.reconnect?.enabled ?? true)\n }\n );\n\n const heartbeatEnabled =\n options.heartbeat !== false && supported && resolvedUrl !== null;\n const heartbeatConfig = toHeartbeatConfig<TOutgoing, TIncoming>(\n options.heartbeat\n );\n const heartbeatHookOptions: UseHeartbeatOptions<TOutgoing, TIncoming> =\n heartbeatConfig === null\n ? {\n enabled: false,\n intervalMs: 1_000,\n startOnMount: false\n }\n : {\n beat: () => {\n const socket = socketRef.current;\n if (socket === null || socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n const heartbeatMessage = heartbeatConfig.message;\n\n if (heartbeatMessage !== undefined) {\n const serialized = (options.serializeMessage ?? defaultSerializeMessage)(\n resolveFactoryValue(heartbeatMessage)\n );\n socket.send(serialized);\n }\n\n return heartbeatConfig.beat?.() ?? true;\n },\n enabled: heartbeatEnabled && (heartbeatConfig.enabled ?? true),\n intervalMs: heartbeatConfig.intervalMs,\n startOnMount: false\n };\n\n if (heartbeatConfig !== null && heartbeatConfig.timeoutMs !== undefined) {\n heartbeatHookOptions.timeoutMs = heartbeatConfig.timeoutMs;\n }\n\n if (heartbeatConfig !== null && heartbeatConfig.matchesAck !== undefined) {\n heartbeatHookOptions.matchesAck = heartbeatConfig.matchesAck;\n }\n\n if (heartbeatConfig !== null && heartbeatConfig.onBeat !== undefined) {\n heartbeatHookOptions.onBeat = heartbeatConfig.onBeat;\n }\n\n if (heartbeatConfig !== null && heartbeatConfig.onTimeout !== undefined) {\n heartbeatHookOptions.onTimeout = heartbeatConfig.onTimeout;\n }\n\n const heartbeat = useHeartbeat<TOutgoing, TIncoming>(\n heartbeatHookOptions\n );\n\n const commitState = (\n next:\n | WebSocketState<TIncoming>\n | ((current: WebSocketState<TIncoming>) => WebSocketState<TIncoming>)\n ): void => {\n const resolved = typeof next === \"function\" ? next(stateRef.current) : next;\n stateRef.current = resolved;\n setState(resolved);\n };\n\n const closeSocket = useEffectEvent((code?: number, reason?: string) => {\n const socket = socketRef.current;\n\n if (socket === null) {\n return;\n }\n\n socketRef.current = null;\n socketKeyRef.current = null;\n\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(code, reason);\n }\n });\n\n const parseMessage = useEffectEvent((event: MessageEvent<unknown>) => {\n const parser = options.parseMessage ?? defaultParseMessage<TIncoming>;\n return parser(event);\n });\n\n const updateBufferedAmount = useEffectEvent(() => {\n commitState((current) => ({\n ...current,\n bufferedAmount: socketRef.current?.bufferedAmount ?? 0\n }));\n });\n\n const handleOpen = useEffectEvent((event: Event, socket: WebSocket) => {\n manualCloseRef.current = false;\n suppressReconnectRef.current = false;\n reconnect.markConnected();\n heartbeat.start();\n\n commitState((current) => ({\n ...current,\n bufferedAmount: socket.bufferedAmount,\n lastChangedAt: Date.now(),\n status: \"open\"\n }));\n\n options.onOpen?.(event, socket);\n });\n\n const handleMessage = useEffectEvent((event: MessageEvent<unknown>) => {\n try {\n const message = parseMessage(event);\n heartbeat.notifyAck(message);\n\n commitState((current) => ({\n ...current,\n bufferedAmount: socketRef.current?.bufferedAmount ?? current.bufferedAmount,\n lastMessage: message,\n lastMessageEvent: event\n }));\n\n options.onMessage?.(message, event);\n } catch {\n const parseError = new Event(\"error\");\n commitState((current) => ({\n ...current,\n lastError: parseError,\n status: \"error\"\n }));\n }\n });\n\n const handleError = useEffectEvent((event: Event) => {\n heartbeat.stop();\n commitState((current) => ({\n ...current,\n lastError: event,\n status: \"error\"\n }));\n\n options.onError?.(event);\n });\n\n const handleClose = useEffectEvent((event: CloseEvent) => {\n socketRef.current = null;\n socketKeyRef.current = null;\n heartbeat.stop();\n updateBufferedAmount();\n const skipCloseReconnect = skipCloseReconnectRef.current;\n skipCloseReconnectRef.current = false;\n\n const shouldReconnect =\n !suppressReconnectRef.current &&\n !skipCloseReconnect &&\n reconnectEnabled &&\n (options.shouldReconnect?.(event) ?? true);\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastCloseEvent: event,\n status: shouldReconnect ? \"reconnecting\" : \"closed\"\n }));\n\n options.onClose?.(event);\n\n if (shouldReconnect) {\n reconnect.schedule(\"close\");\n } else {\n suppressReconnectRef.current = false;\n }\n });\n\n const open = (): void => {\n manualCloseRef.current = false;\n manualOpenRef.current = true;\n suppressReconnectRef.current = false;\n reconnect.cancel();\n setOpenNonce((current) => current + 1);\n };\n\n const reconnectNow = (): void => {\n manualCloseRef.current = false;\n manualOpenRef.current = true;\n skipCloseReconnectRef.current = true;\n suppressReconnectRef.current = true;\n heartbeat.stop();\n closeSocket();\n suppressReconnectRef.current = false;\n reconnect.schedule(\"manual\");\n };\n\n const close = (code?: number, reason?: string): void => {\n manualCloseRef.current = true;\n manualOpenRef.current = false;\n suppressReconnectRef.current = true;\n reconnect.cancel();\n heartbeat.stop();\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status: \"closing\"\n }));\n\n closeSocket(code, reason);\n };\n\n const send = (message: TOutgoing): boolean => {\n const socket = socketRef.current;\n\n if (socket === null || socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n const serializer = options.serializeMessage ?? defaultSerializeMessage<TOutgoing>;\n socket.send(serializer(message));\n updateBufferedAmount();\n return true;\n };\n\n useEffect(() => {\n if (!supported) {\n socketKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status: \"closed\"\n }));\n return;\n }\n\n if (resolvedUrl === null) {\n socketKeyRef.current = null;\n closeSocket();\n commitState((current) => ({\n ...current,\n status: \"closed\"\n }));\n return;\n }\n\n const shouldConnect =\n (connect && !manualCloseRef.current) ||\n manualOpenRef.current ||\n reconnect.status === \"running\";\n const nextSocketKey = `${resolvedUrl}::${protocolsDependency}::${options.binaryType ?? \"blob\"}`;\n\n if (!shouldConnect) {\n if (socketRef.current !== null) {\n suppressReconnectRef.current = true;\n closeSocket();\n }\n\n socketKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status: manualCloseRef.current ? \"closed\" : \"idle\"\n }));\n return;\n }\n\n if (socketRef.current !== null && socketKeyRef.current !== nextSocketKey) {\n suppressReconnectRef.current = true;\n closeSocket();\n }\n\n if (socketRef.current !== null) {\n return;\n }\n\n const socket = new WebSocket(resolvedUrl, options.protocols);\n socketRef.current = socket;\n socketKeyRef.current = nextSocketKey;\n socket.binaryType = options.binaryType ?? \"blob\";\n\n commitState((current) => ({\n ...current,\n bufferedAmount: socket.bufferedAmount,\n lastChangedAt: Date.now(),\n status:\n reconnect.status === \"running\" || reconnect.status === \"scheduled\"\n ? \"reconnecting\"\n : \"connecting\"\n }));\n\n const handleSocketOpen = (event: Event): void => {\n handleOpen(event, socket);\n };\n const handleSocketMessage = (event: MessageEvent<unknown>): void => {\n handleMessage(event);\n };\n const handleSocketError = (event: Event): void => {\n handleError(event);\n };\n const handleSocketClose = (event: CloseEvent): void => {\n handleClose(event);\n };\n\n socket.addEventListener(\"open\", handleSocketOpen);\n socket.addEventListener(\"message\", handleSocketMessage);\n socket.addEventListener(\"error\", handleSocketError);\n socket.addEventListener(\"close\", handleSocketClose);\n\n return () => {\n socket.removeEventListener(\"open\", handleSocketOpen);\n socket.removeEventListener(\"message\", handleSocketMessage);\n socket.removeEventListener(\"error\", handleSocketError);\n socket.removeEventListener(\"close\", handleSocketClose);\n };\n }, [\n connect,\n openNonce,\n options.binaryType,\n protocolsDependency,\n reconnect.status,\n resolvedUrl,\n supported\n ]);\n\n useEffect(() => () => {\n suppressReconnectRef.current = true;\n socketKeyRef.current = null;\n\n const socket = socketRef.current;\n socketRef.current = null;\n\n if (socket === null) {\n return;\n }\n\n if (\n socket.readyState === WebSocket.OPEN ||\n socket.readyState === WebSocket.CONNECTING\n ) {\n socket.close();\n }\n }, []);\n\n useEffect(() => {\n if (state.status !== \"open\") {\n heartbeat.stop();\n }\n }, [state.status]);\n\n const status =\n (reconnect.status === \"scheduled\" || reconnect.status === \"running\") &&\n state.status !== \"open\"\n ? \"reconnecting\"\n : state.status;\n\n const snapshot = createConnectionStateSnapshot(status, {\n isSupported: supported,\n lastChangedAt: state.lastChangedAt\n });\n const heartbeatState =\n options.heartbeat === false\n ? null\n : {\n hasTimedOut: heartbeat.hasTimedOut,\n isRunning: heartbeat.isRunning,\n lastAckAt: heartbeat.lastAckAt,\n lastBeatAt: heartbeat.lastBeatAt,\n latencyMs: heartbeat.latencyMs\n };\n const reconnectState =\n options.reconnect === false\n ? null\n : {\n attempt: reconnect.attempt,\n isScheduled: reconnect.isScheduled,\n nextDelayMs: reconnect.nextDelayMs,\n status: reconnect.status\n };\n const commonResult = {\n bufferedAmount: state.bufferedAmount,\n close,\n heartbeatState,\n lastCloseEvent: state.lastCloseEvent,\n lastError: state.lastError,\n lastMessage: state.lastMessage,\n lastMessageEvent: state.lastMessageEvent,\n open,\n reconnect: reconnectNow,\n reconnectState,\n send,\n transport: \"websocket\" as const\n };\n const socket = socketRef.current;\n\n if (snapshot.status === \"open\") {\n return {\n ...snapshot,\n ...commonResult,\n socket: socket as WebSocket\n };\n }\n\n return {\n ...snapshot,\n ...commonResult,\n socket\n };\n};\n","import { useEffect, useEffectEvent, useMemo, useRef, useState } from \"react\";\n\nimport { createConnectionStateSnapshot } from \"../core/connection-state\";\nimport { isEventSourceSupported } from \"../core/env\";\nimport { resolveUrlProvider } from \"../core/url\";\nimport { useReconnect } from \"./useReconnect\";\nimport type {\n UseEventSourceHook,\n UseEventSourceOptions,\n UseEventSourceResult\n} from \"../types/useEventSource\";\n\ntype EventSourceState<TMessage> = {\n lastChangedAt: number | null;\n lastError: Event | null;\n lastEventName: string | null;\n lastMessage: TMessage | null;\n lastMessageEvent: MessageEvent<string> | null;\n status: UseEventSourceResult<TMessage>[\"status\"];\n};\n\nconst createInitialState = <TMessage,>(\n status: UseEventSourceResult<TMessage>[\"status\"] = \"idle\"\n): EventSourceState<TMessage> => ({\n lastChangedAt: null,\n lastError: null,\n lastEventName: null,\n lastMessage: null,\n lastMessageEvent: null,\n status\n});\n\nconst defaultParseMessage = <TMessage,>(\n event: MessageEvent<string>\n): TMessage => event.data as TMessage;\n\nconst toEventsDependency = (events: readonly string[] | undefined): string => {\n if (events === undefined || events.length === 0) {\n return \"\";\n }\n\n return [...new Set(events)].sort().join(\"|\");\n};\n\nconst normalizeNamedEvents = (\n events: readonly string[] | undefined\n): string[] => {\n if (events === undefined || events.length === 0) {\n return [];\n }\n\n return [...new Set(events)].filter((eventName) => eventName !== \"message\");\n};\n\nexport const useEventSource: UseEventSourceHook = <TMessage = unknown>(\n options: UseEventSourceOptions<TMessage>\n): UseEventSourceResult<TMessage> => {\n const connect = options.connect ?? true;\n const supported = isEventSourceSupported();\n const resolvedUrl = useMemo(() => resolveUrlProvider(options.url), [options.url]);\n const eventsDependency = toEventsDependency(options.events);\n const namedEvents = useMemo(\n () => normalizeNamedEvents(options.events),\n [eventsDependency]\n );\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const eventSourceKeyRef = useRef<string | null>(null);\n const manualCloseRef = useRef(false);\n const manualOpenRef = useRef(false);\n const skipErrorReconnectRef = useRef(false);\n const suppressReconnectRef = useRef(false);\n const [openNonce, setOpenNonce] = useState(0);\n const [state, setState] = useState<EventSourceState<TMessage>>(() =>\n createInitialState(connect ? \"connecting\" : \"idle\")\n );\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const reconnectEnabled =\n options.reconnect !== false && supported && resolvedUrl !== null;\n const reconnect = useReconnect(\n options.reconnect === false\n ? { enabled: false }\n : {\n ...options.reconnect,\n enabled: reconnectEnabled && (options.reconnect?.enabled ?? true)\n }\n );\n\n const commitState = (\n next:\n | EventSourceState<TMessage>\n | ((current: EventSourceState<TMessage>) => EventSourceState<TMessage>)\n ): void => {\n const resolved = typeof next === \"function\" ? next(stateRef.current) : next;\n stateRef.current = resolved;\n setState(resolved);\n };\n\n const closeEventSource = useEffectEvent(() => {\n const source = eventSourceRef.current;\n\n if (source === null) {\n return;\n }\n\n eventSourceRef.current = null;\n eventSourceKeyRef.current = null;\n source.close();\n });\n\n const parseMessage = useEffectEvent((event: MessageEvent<string>) => {\n const parser = options.parseMessage ?? defaultParseMessage<TMessage>;\n return parser(event);\n });\n\n const handleOpen = useEffectEvent((event: Event, source: EventSource) => {\n manualCloseRef.current = false;\n suppressReconnectRef.current = false;\n reconnect.markConnected();\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status: \"open\"\n }));\n\n options.onOpen?.(event, source);\n });\n\n const commitParsedMessage = useEffectEvent(\n (eventName: string, event: MessageEvent<string>, isNamedEvent: boolean) => {\n try {\n const message = parseMessage(event);\n\n commitState((current) => ({\n ...current,\n lastEventName: eventName,\n lastMessage: message,\n lastMessageEvent: event\n }));\n\n if (isNamedEvent) {\n options.onEvent?.(eventName, message, event);\n return;\n }\n\n options.onMessage?.(message, event);\n } catch {\n const parseError = new Event(\"error\");\n commitState((current) => ({\n ...current,\n lastError: parseError,\n status: \"error\"\n }));\n }\n }\n );\n\n const handleError = useEffectEvent((event: Event, source: EventSource) => {\n const skipErrorReconnect = skipErrorReconnectRef.current;\n skipErrorReconnectRef.current = false;\n const shouldReconnect =\n !suppressReconnectRef.current &&\n !skipErrorReconnect &&\n reconnectEnabled &&\n (options.shouldReconnect?.(event) ?? true);\n\n const readyState = source.readyState;\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: event,\n status:\n readyState === EventSource.OPEN\n ? \"open\"\n : shouldReconnect\n ? \"reconnecting\"\n : \"closed\"\n }));\n\n options.onError?.(event);\n\n if (!shouldReconnect) {\n suppressReconnectRef.current = false;\n closeEventSource();\n return;\n }\n\n if (readyState === EventSource.CLOSED) {\n eventSourceRef.current = null;\n eventSourceKeyRef.current = null;\n reconnect.schedule(\"error\");\n }\n });\n\n const open = (): void => {\n manualCloseRef.current = false;\n manualOpenRef.current = true;\n suppressReconnectRef.current = false;\n reconnect.cancel();\n setOpenNonce((current) => current + 1);\n };\n\n const reconnectNow = (): void => {\n manualCloseRef.current = false;\n manualOpenRef.current = true;\n skipErrorReconnectRef.current = true;\n suppressReconnectRef.current = true;\n closeEventSource();\n suppressReconnectRef.current = false;\n reconnect.schedule(\"manual\");\n };\n\n const close = (): void => {\n manualCloseRef.current = true;\n manualOpenRef.current = false;\n suppressReconnectRef.current = true;\n reconnect.cancel();\n closeEventSource();\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status: \"closed\"\n }));\n };\n\n useEffect(() => {\n if (!supported) {\n eventSourceKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status: \"closed\"\n }));\n return;\n }\n\n if (resolvedUrl === null) {\n eventSourceKeyRef.current = null;\n closeEventSource();\n commitState((current) => ({\n ...current,\n status: \"closed\"\n }));\n return;\n }\n\n const shouldConnect =\n (connect && !manualCloseRef.current) ||\n manualOpenRef.current ||\n reconnect.status === \"running\";\n const nextEventSourceKey = [\n resolvedUrl,\n options.withCredentials ? \"credentials\" : \"anonymous\",\n eventsDependency\n ].join(\"::\");\n\n if (!shouldConnect) {\n if (eventSourceRef.current !== null) {\n suppressReconnectRef.current = true;\n closeEventSource();\n }\n\n eventSourceKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status: manualCloseRef.current ? \"closed\" : \"idle\"\n }));\n return;\n }\n\n if (\n eventSourceRef.current !== null &&\n eventSourceKeyRef.current !== nextEventSourceKey\n ) {\n suppressReconnectRef.current = true;\n closeEventSource();\n }\n\n if (eventSourceRef.current !== null) {\n return;\n }\n\n const source = new EventSource(resolvedUrl, {\n withCredentials: options.withCredentials ?? false\n });\n\n eventSourceRef.current = source;\n eventSourceKeyRef.current = nextEventSourceKey;\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status:\n reconnect.status === \"running\" || reconnect.status === \"scheduled\"\n ? \"reconnecting\"\n : \"connecting\"\n }));\n\n const handleSourceOpen = (event: Event): void => {\n handleOpen(event, source);\n };\n const handleSourceMessage = (event: Event): void => {\n commitParsedMessage(\"message\", event as MessageEvent<string>, false);\n };\n const namedEventHandlers = new Map<\n string,\n (event: Event) => void\n >();\n const handleSourceError = (event: Event): void => {\n handleError(event, source);\n };\n\n source.addEventListener(\"open\", handleSourceOpen);\n source.addEventListener(\"message\", handleSourceMessage);\n\n for (const eventName of namedEvents) {\n const handler = (event: Event): void => {\n commitParsedMessage(eventName, event as MessageEvent<string>, true);\n };\n\n namedEventHandlers.set(eventName, handler);\n source.addEventListener(eventName, handler);\n }\n\n source.addEventListener(\"error\", handleSourceError);\n\n return () => {\n source.removeEventListener(\"open\", handleSourceOpen);\n source.removeEventListener(\"message\", handleSourceMessage);\n\n for (const [eventName, handler] of namedEventHandlers) {\n source.removeEventListener(eventName, handler);\n }\n\n source.removeEventListener(\"error\", handleSourceError);\n };\n }, [\n connect,\n eventsDependency,\n namedEvents,\n openNonce,\n options.withCredentials,\n reconnect.status,\n resolvedUrl,\n supported\n ]);\n\n useEffect(() => () => {\n suppressReconnectRef.current = true;\n eventSourceKeyRef.current = null;\n\n const source = eventSourceRef.current;\n eventSourceRef.current = null;\n\n if (source !== null) {\n source.close();\n }\n }, []);\n\n const status =\n (reconnect.status === \"scheduled\" || reconnect.status === \"running\") &&\n state.status !== \"open\"\n ? \"reconnecting\"\n : state.status;\n\n const snapshot = createConnectionStateSnapshot(status, {\n isSupported: supported,\n lastChangedAt: state.lastChangedAt\n });\n const reconnectState =\n options.reconnect === false\n ? null\n : {\n attempt: reconnect.attempt,\n isScheduled: reconnect.isScheduled,\n nextDelayMs: reconnect.nextDelayMs,\n status: reconnect.status\n };\n const commonResult = {\n close,\n lastError: state.lastError,\n lastEventName: state.lastEventName,\n lastMessage: state.lastMessage,\n lastMessageEvent: state.lastMessageEvent,\n open,\n reconnect: reconnectNow,\n reconnectState,\n transport: \"eventsource\" as const\n };\n const eventSource = eventSourceRef.current;\n\n if (snapshot.status === \"open\") {\n return {\n ...snapshot,\n ...commonResult,\n eventSource: eventSource as EventSource\n };\n }\n\n return {\n ...snapshot,\n ...commonResult,\n eventSource\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/core/env.ts","../src/hooks/useOnlineStatus.ts","../src/core/reconnect.ts","../src/core/timers.ts","../src/hooks/useReconnect.ts","../src/hooks/useHeartbeat.ts","../src/core/connection-state.ts","../src/core/url.ts","../src/hooks/useWebSocket.ts","../src/hooks/useEventSource.ts"],"names":["useSyncExternalStore","useRef","useState","useEffect","startTransition","useEffectEvent","createInitialState","useMemo","socket","defaultParseMessage"],"mappings":"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","file":"index.cjs","sourcesContent":["export interface RuntimeFeatureSupport {\n eventSource: boolean;\n navigatorOnLine: boolean;\n webSocket: boolean;\n}\n\nexport const isBrowserRuntime = (): boolean =>\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nexport const isWebSocketSupported = (): boolean =>\n typeof WebSocket !== \"undefined\";\n\nexport const isEventSourceSupported = (): boolean =>\n typeof EventSource !== \"undefined\";\n\nexport const hasNavigatorOnLineSupport = (): boolean =>\n typeof navigator !== \"undefined\" && typeof navigator.onLine === \"boolean\";\n\nexport const readOnlineStatus = (initialOnline = true): {\n isOnline: boolean;\n isSupported: boolean;\n} => {\n if (!hasNavigatorOnLineSupport()) {\n return {\n isOnline: initialOnline,\n isSupported: false\n };\n }\n\n return {\n isOnline: navigator.onLine,\n isSupported: true\n };\n};\n\nexport const getRuntimeFeatureSupport = (): RuntimeFeatureSupport => ({\n eventSource: isEventSourceSupported(),\n navigatorOnLine: hasNavigatorOnLineSupport(),\n webSocket: isWebSocketSupported()\n});\n","import { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\n\nimport { hasNavigatorOnLineSupport, readOnlineStatus } from \"../core/env\";\nimport type {\n UseOnlineStatusHook,\n UseOnlineStatusOptions,\n UseOnlineStatusResult\n} from \"../types/useOnlineStatus\";\n\nconst subscribeToOnlineStatus = (onStoreChange: () => void): (() => void) => {\n if (typeof window === \"undefined\") {\n return () => {};\n }\n\n window.addEventListener(\"online\", onStoreChange);\n window.addEventListener(\"offline\", onStoreChange);\n\n return () => {\n window.removeEventListener(\"online\", onStoreChange);\n window.removeEventListener(\"offline\", onStoreChange);\n };\n};\n\nconst createEmptyTransitionState = (): Pick<\n UseOnlineStatusResult,\n \"lastChangedAt\" | \"wentOfflineAt\" | \"wentOnlineAt\"\n> => ({\n lastChangedAt: null,\n wentOfflineAt: null,\n wentOnlineAt: null\n});\n\nexport const useOnlineStatus: UseOnlineStatusHook = (\n options: UseOnlineStatusOptions = {}\n) => {\n const initialOnline = options.initialOnline ?? true;\n const trackTransitions = options.trackTransitions ?? true;\n\n const isOnline = useSyncExternalStore(\n subscribeToOnlineStatus,\n () => readOnlineStatus(initialOnline).isOnline,\n () => initialOnline\n );\n\n const previousOnlineRef = useRef(isOnline);\n const [transitions, setTransitions] = useState(createEmptyTransitionState);\n\n useEffect(() => {\n if (!trackTransitions) {\n previousOnlineRef.current = isOnline;\n setTransitions(createEmptyTransitionState);\n return;\n }\n\n if (previousOnlineRef.current === isOnline) {\n return;\n }\n\n const changedAt = Date.now();\n previousOnlineRef.current = isOnline;\n\n setTransitions((current) => ({\n lastChangedAt: changedAt,\n wentOfflineAt: isOnline ? current.wentOfflineAt : changedAt,\n wentOnlineAt: isOnline ? changedAt : current.wentOnlineAt\n }));\n }, [isOnline, trackTransitions]);\n\n return {\n isOnline,\n isSupported: hasNavigatorOnLineSupport(),\n ...transitions\n };\n};\n","import type {\n ReconnectAttempt,\n ReconnectDelayContext,\n ReconnectDelayStrategy,\n ReconnectTrigger,\n UseReconnectOptions\n} from \"../types/useReconnect\";\n\nexport interface NormalizedReconnectOptions {\n backoffFactor: number;\n enabled: boolean;\n getDelayMs?: ReconnectDelayStrategy;\n initialDelayMs: number;\n jitterRatio: number;\n maxAttempts: number | null;\n maxDelayMs: number;\n onCancel?: () => void;\n onReset?: () => void;\n onSchedule?: (attempt: ReconnectAttempt) => void;\n resetOnSuccess: boolean;\n}\n\nexport interface ReconnectDelayCalculationOptions {\n random?: () => number;\n strategy?: ReconnectDelayStrategy;\n}\n\nexport interface CreateReconnectAttemptOptions\n extends ReconnectDelayCalculationOptions {\n now?: number;\n}\n\nexport const DEFAULT_RECONNECT_OPTIONS: Readonly<\n Omit<NormalizedReconnectOptions, \"getDelayMs\" | \"onCancel\" | \"onReset\" | \"onSchedule\">\n> = {\n backoffFactor: 2,\n enabled: true,\n initialDelayMs: 1_000,\n jitterRatio: 0.2,\n maxAttempts: null,\n maxDelayMs: 30_000,\n resetOnSuccess: true\n};\n\nconst clampNumber = (value: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, value));\n\nconst sanitizeDelay = (value: number): number => {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, Math.round(value));\n};\n\nconst sanitizeBackoffFactor = (value: number): number => {\n if (!Number.isFinite(value)) {\n return DEFAULT_RECONNECT_OPTIONS.backoffFactor;\n }\n\n return Math.max(1, value);\n};\n\nconst sanitizeMaxAttempts = (\n value: number | null | undefined\n): number | null => {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (!Number.isFinite(value)) {\n return null;\n }\n\n return Math.max(0, Math.floor(value));\n};\n\nconst sanitizeJitterRatio = (value: number): number => {\n if (!Number.isFinite(value)) {\n return DEFAULT_RECONNECT_OPTIONS.jitterRatio;\n }\n\n return clampNumber(value, 0, 1);\n};\n\nexport const normalizeReconnectOptions = (\n options?: false | UseReconnectOptions\n): NormalizedReconnectOptions | null => {\n if (options === false) {\n return null;\n }\n\n const initialDelayMs = sanitizeDelay(\n options?.initialDelayMs ?? DEFAULT_RECONNECT_OPTIONS.initialDelayMs\n );\n const maxDelayMs = Math.max(\n initialDelayMs,\n sanitizeDelay(options?.maxDelayMs ?? DEFAULT_RECONNECT_OPTIONS.maxDelayMs)\n );\n\n const normalized: NormalizedReconnectOptions = {\n backoffFactor: sanitizeBackoffFactor(\n options?.backoffFactor ?? DEFAULT_RECONNECT_OPTIONS.backoffFactor\n ),\n enabled: options?.enabled ?? DEFAULT_RECONNECT_OPTIONS.enabled,\n initialDelayMs,\n jitterRatio: sanitizeJitterRatio(\n options?.jitterRatio ?? DEFAULT_RECONNECT_OPTIONS.jitterRatio\n ),\n maxAttempts: sanitizeMaxAttempts(options?.maxAttempts),\n maxDelayMs,\n resetOnSuccess: options?.resetOnSuccess ?? DEFAULT_RECONNECT_OPTIONS.resetOnSuccess\n };\n\n if (options?.getDelayMs !== undefined) {\n normalized.getDelayMs = options.getDelayMs;\n }\n\n if (options?.onCancel !== undefined) {\n normalized.onCancel = options.onCancel;\n }\n\n if (options?.onReset !== undefined) {\n normalized.onReset = options.onReset;\n }\n\n if (options?.onSchedule !== undefined) {\n normalized.onSchedule = options.onSchedule;\n }\n\n return normalized;\n};\n\nexport const createReconnectDelayContext = (\n attempt: number,\n options: Pick<\n NormalizedReconnectOptions,\n \"backoffFactor\" | \"initialDelayMs\" | \"jitterRatio\" | \"maxDelayMs\"\n >,\n lastDelayMs: number | null\n): ReconnectDelayContext => ({\n attempt: Math.max(1, Math.floor(attempt)),\n backoffFactor: options.backoffFactor,\n initialDelayMs: options.initialDelayMs,\n jitterRatio: options.jitterRatio,\n lastDelayMs,\n maxDelayMs: options.maxDelayMs\n});\n\nexport const defaultReconnectDelayStrategy = (\n context: ReconnectDelayContext\n): number => {\n const exponent = Math.max(0, context.attempt - 1);\n const baseDelay = context.initialDelayMs * context.backoffFactor ** exponent;\n return Math.min(context.maxDelayMs, sanitizeDelay(baseDelay));\n};\n\nexport const applyJitterToDelay = (\n delayMs: number,\n jitterRatio: number,\n random: () => number = Math.random\n): number => {\n if (delayMs === 0 || jitterRatio === 0) {\n return delayMs;\n }\n\n const safeRandom = clampNumber(random(), 0, 1);\n const variance = delayMs * jitterRatio;\n const offset = (safeRandom * 2 - 1) * variance;\n return sanitizeDelay(delayMs + offset);\n};\n\nexport const calculateReconnectDelay = (\n context: ReconnectDelayContext,\n options: ReconnectDelayCalculationOptions = {}\n): number => {\n const baseDelay = sanitizeDelay(\n (options.strategy ?? defaultReconnectDelayStrategy)(context)\n );\n const cappedDelay = Math.min(context.maxDelayMs, baseDelay);\n return Math.min(\n context.maxDelayMs,\n applyJitterToDelay(cappedDelay, context.jitterRatio, options.random)\n );\n};\n\nexport const canScheduleReconnectAttempt = (\n attempt: number,\n options: Pick<NormalizedReconnectOptions, \"enabled\" | \"maxAttempts\">\n): boolean => {\n if (!options.enabled) {\n return false;\n }\n\n if (attempt < 1) {\n return false;\n }\n\n return options.maxAttempts === null || attempt <= options.maxAttempts;\n};\n\nexport const createReconnectAttempt = (\n attempt: number,\n trigger: ReconnectTrigger,\n options: Pick<\n NormalizedReconnectOptions,\n \"backoffFactor\" | \"enabled\" | \"getDelayMs\" | \"initialDelayMs\" | \"jitterRatio\" | \"maxAttempts\" | \"maxDelayMs\"\n >,\n lastDelayMs: number | null,\n config: CreateReconnectAttemptOptions = {}\n): ReconnectAttempt | null => {\n if (!canScheduleReconnectAttempt(attempt, options)) {\n return null;\n }\n\n const context = createReconnectDelayContext(attempt, options, lastDelayMs);\n const calculationOptions: ReconnectDelayCalculationOptions = {};\n\n if (config.random !== undefined) {\n calculationOptions.random = config.random;\n }\n\n if (options.getDelayMs !== undefined) {\n calculationOptions.strategy = options.getDelayMs;\n }\n\n return {\n attempt,\n delayMs: calculateReconnectDelay(context, calculationOptions),\n scheduledAt: config.now ?? Date.now(),\n trigger\n };\n};\n","export interface ManagedTimeout {\n cancel: () => void;\n isActive: () => boolean;\n schedule: (callback: () => void, delayMs: number) => void;\n}\n\nexport interface ManagedInterval {\n cancel: () => void;\n isActive: () => boolean;\n start: (callback: () => void, intervalMs: number) => void;\n}\n\nconst sanitizeTimerDelay = (delayMs: number): number => {\n if (!Number.isFinite(delayMs)) {\n return 0;\n }\n\n return Math.max(0, Math.round(delayMs));\n};\n\nexport const createManagedTimeout = (): ManagedTimeout => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return {\n cancel() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n },\n isActive() {\n return timeoutId !== null;\n },\n schedule(callback, delayMs) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n timeoutId = null;\n callback();\n }, sanitizeTimerDelay(delayMs));\n }\n };\n};\n\nexport const createManagedInterval = (): ManagedInterval => {\n let intervalId: ReturnType<typeof setInterval> | null = null;\n\n return {\n cancel() {\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n },\n isActive() {\n return intervalId !== null;\n },\n start(callback, intervalMs) {\n if (intervalId !== null) {\n clearInterval(intervalId);\n }\n\n intervalId = setInterval(callback, sanitizeTimerDelay(intervalMs));\n }\n };\n};\n","import {\n startTransition,\n useEffect,\n useEffectEvent,\n useRef,\n useState\n} from \"react\";\n\nimport {\n createReconnectAttempt,\n normalizeReconnectOptions\n} from \"../core/reconnect\";\nimport { createManagedTimeout } from \"../core/timers\";\nimport type {\n ReconnectAttempt,\n ReconnectTrigger,\n UseReconnectHook,\n UseReconnectResult\n} from \"../types/useReconnect\";\n\ntype ReconnectState = Pick<\n UseReconnectResult,\n \"attempt\" | \"nextDelayMs\" | \"status\"\n>;\n\nconst createInitialState = (enabled: boolean): ReconnectState => ({\n attempt: 0,\n nextDelayMs: null,\n status: enabled ? \"idle\" : \"stopped\"\n});\n\nexport const useReconnect: UseReconnectHook = (options = {}) => {\n const normalizedOptions = normalizeReconnectOptions(options) ??\n normalizeReconnectOptions()!;\n const timeoutRef = useRef(createManagedTimeout());\n const lastDelayRef = useRef<number | null>(null);\n const [state, setState] = useState<ReconnectState>(() =>\n createInitialState(normalizedOptions.enabled)\n );\n const stateRef = useRef(state);\n\n stateRef.current = state;\n\n const commitState = (\n next:\n | ReconnectState\n | ((current: ReconnectState) => ReconnectState)\n ): void => {\n const resolved =\n typeof next === \"function\"\n ? next(stateRef.current)\n : next;\n\n stateRef.current = resolved;\n startTransition(() => {\n setState(resolved);\n });\n };\n\n const runAttempt = useEffectEvent((attempt: number) => {\n commitState({\n attempt,\n nextDelayMs: null,\n status: \"running\"\n });\n });\n\n const emitSchedule = useEffectEvent((attempt: ReconnectAttempt) => {\n normalizedOptions.onSchedule?.(attempt);\n });\n\n const emitCancel = useEffectEvent(() => {\n normalizedOptions.onCancel?.();\n });\n\n const emitReset = useEffectEvent(() => {\n normalizedOptions.onReset?.();\n });\n\n useEffect(() => {\n if (!normalizedOptions.enabled) {\n timeoutRef.current.cancel();\n commitState((current) => ({\n ...current,\n nextDelayMs: null,\n status: \"stopped\"\n }));\n return;\n }\n\n commitState((current) =>\n current.status === \"stopped\"\n ? {\n ...current,\n status: \"idle\"\n }\n : current\n );\n }, [normalizedOptions.enabled]);\n\n useEffect(() => () => {\n timeoutRef.current.cancel();\n }, []);\n\n const schedule = (trigger: ReconnectTrigger = \"manual\"): void => {\n const current = stateRef.current;\n const nextAttempt = current.attempt + 1;\n const attempt = createReconnectAttempt(\n nextAttempt,\n trigger,\n normalizedOptions,\n lastDelayRef.current\n );\n\n timeoutRef.current.cancel();\n\n if (attempt === null) {\n commitState((snapshot) => ({\n ...snapshot,\n nextDelayMs: null,\n status: \"stopped\"\n }));\n return;\n }\n\n lastDelayRef.current = attempt.delayMs;\n timeoutRef.current.schedule(() => {\n runAttempt(attempt.attempt);\n }, attempt.delayMs);\n\n commitState({\n attempt: attempt.attempt,\n nextDelayMs: attempt.delayMs,\n status: \"scheduled\"\n });\n\n emitSchedule(attempt);\n };\n\n const cancel = (): void => {\n const current = stateRef.current;\n const shouldEmitCancel =\n timeoutRef.current.isActive() ||\n current.status === \"scheduled\" ||\n current.status === \"running\";\n\n timeoutRef.current.cancel();\n commitState((snapshot) => ({\n ...snapshot,\n nextDelayMs: null,\n status: \"stopped\"\n }));\n\n if (shouldEmitCancel) {\n emitCancel();\n }\n };\n\n const reset = (): void => {\n timeoutRef.current.cancel();\n lastDelayRef.current = null;\n commitState(createInitialState(normalizedOptions.enabled));\n emitReset();\n };\n\n const markConnected = (): void => {\n timeoutRef.current.cancel();\n\n if (normalizedOptions.resetOnSuccess) {\n lastDelayRef.current = null;\n commitState(createInitialState(normalizedOptions.enabled));\n emitReset();\n return;\n }\n\n commitState((current) => ({\n ...current,\n nextDelayMs: null,\n status: normalizedOptions.enabled ? \"idle\" : \"stopped\"\n }));\n };\n\n return {\n attempt: state.attempt,\n cancel,\n isActive: state.status === \"scheduled\" || state.status === \"running\",\n isScheduled: state.status === \"scheduled\",\n markConnected,\n nextDelayMs: state.nextDelayMs,\n reset,\n schedule,\n status: state.status\n };\n};\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\nimport {\n createManagedInterval,\n createManagedTimeout\n} from \"../core/timers\";\nimport type {\n UseHeartbeatOptions,\n UseHeartbeatHook,\n UseHeartbeatResult\n} from \"../types/useHeartbeat\";\n\ntype HeartbeatState = Pick<\n UseHeartbeatResult,\n \"hasTimedOut\" | \"isRunning\" | \"lastAckAt\" | \"lastBeatAt\" | \"latencyMs\"\n>;\n\nconst createInitialState = (isRunning: boolean): HeartbeatState => ({\n hasTimedOut: false,\n isRunning,\n lastAckAt: null,\n lastBeatAt: null,\n latencyMs: null\n});\n\nexport const useHeartbeat = <\n TOutgoing = unknown,\n TIncoming = TOutgoing\n>(\n options: UseHeartbeatOptions<TOutgoing, TIncoming>\n): UseHeartbeatResult<TIncoming> => {\n const enabled = options.enabled ?? true;\n const startOnMount = options.startOnMount ?? true;\n const intervalRef = useRef(createManagedInterval());\n const timeoutRef = useRef(createManagedTimeout());\n const generationRef = useRef(0);\n const [state, setState] = useState<HeartbeatState>(() =>\n createInitialState(enabled && startOnMount)\n );\n const stateRef = useRef(state);\n\n stateRef.current = state;\n\n const commitState = (\n next:\n | HeartbeatState\n | ((current: HeartbeatState) => HeartbeatState)\n ): void => {\n const resolved =\n typeof next === \"function\" ? next(stateRef.current) : next;\n\n stateRef.current = resolved;\n setState(resolved);\n };\n\n const handleTimeout = useEffectEvent(() => {\n commitState((current) => ({\n ...current,\n hasTimedOut: true\n }));\n options.onTimeout?.();\n });\n\n const scheduleTimeout = useEffectEvent(() => {\n if (options.timeoutMs === undefined) {\n timeoutRef.current.cancel();\n return;\n }\n\n timeoutRef.current.schedule(() => {\n handleTimeout();\n }, options.timeoutMs);\n });\n\n const handleBeatSuccess = useEffectEvent((performedAt: number) => {\n commitState((current) => ({\n ...current,\n hasTimedOut: false,\n lastBeatAt: performedAt\n }));\n\n scheduleTimeout();\n options.onBeat?.();\n });\n\n const handleBeatError = useEffectEvent((error: unknown) => {\n timeoutRef.current.cancel();\n options.onError?.(error);\n });\n\n const runBeat = useEffectEvent(() => {\n const generation = generationRef.current;\n\n const completeBeat = (result: void | boolean): void => {\n if (generation !== generationRef.current || result === false) {\n return;\n }\n\n handleBeatSuccess(Date.now());\n };\n\n const failBeat = (error: unknown): void => {\n if (generation !== generationRef.current) {\n return;\n }\n\n handleBeatError(error);\n };\n\n try {\n const result = options.beat?.();\n\n if (result !== null && typeof result === \"object\" && \"then\" in result) {\n void Promise.resolve(result).then(completeBeat, failBeat);\n return;\n }\n\n completeBeat(result);\n } catch (error) {\n failBeat(error);\n }\n });\n\n const start = (): void => {\n if (!enabled) {\n return;\n }\n\n if (!intervalRef.current.isActive()) {\n intervalRef.current.start(() => {\n runBeat();\n }, options.intervalMs);\n }\n\n commitState((current) => ({\n ...current,\n hasTimedOut: false,\n isRunning: true\n }));\n };\n\n const stop = (): void => {\n generationRef.current += 1;\n intervalRef.current.cancel();\n timeoutRef.current.cancel();\n commitState((current) => ({\n ...current,\n hasTimedOut: false,\n isRunning: false\n }));\n };\n\n const beat = (): void => {\n if (!enabled) {\n return;\n }\n\n runBeat();\n };\n\n const notifyAck = (message: TIncoming): boolean => {\n if (stateRef.current.lastBeatAt === null) {\n return false;\n }\n\n const matchesAck =\n options.matchesAck === undefined || options.matchesAck(message);\n\n if (!matchesAck) {\n return false;\n }\n\n const acknowledgedAt = Date.now();\n timeoutRef.current.cancel();\n\n commitState((current) => ({\n ...current,\n hasTimedOut: false,\n lastAckAt: acknowledgedAt,\n latencyMs:\n current.lastBeatAt === null\n ? null\n : acknowledgedAt - current.lastBeatAt\n }));\n\n return true;\n };\n\n useEffect(() => {\n if (!enabled) {\n stop();\n return;\n }\n\n if (startOnMount) {\n start();\n return stop;\n }\n\n stop();\n return undefined;\n }, [enabled, options.intervalMs, startOnMount]);\n\n useEffect(() => () => {\n generationRef.current += 1;\n intervalRef.current.cancel();\n timeoutRef.current.cancel();\n }, []);\n\n return {\n beat,\n hasTimedOut: state.hasTimedOut,\n isRunning: state.isRunning,\n lastAckAt: state.lastAckAt,\n lastBeatAt: state.lastBeatAt,\n latencyMs: state.latencyMs,\n notifyAck,\n start,\n stop\n };\n};\n\nconst _useHeartbeatTypecheck: UseHeartbeatHook = useHeartbeat;\nvoid _useHeartbeatTypecheck;\n","import type {\n ConnectionStateSnapshot,\n RealtimeConnectionStatus\n} from \"../types/common\";\n\nexport const isConnectedStatus = (\n status: RealtimeConnectionStatus\n): boolean => status === \"open\";\n\nexport const isConnectingStatus = (\n status: RealtimeConnectionStatus\n): boolean => status === \"connecting\" || status === \"reconnecting\";\n\nexport const isClosedStatus = (\n status: RealtimeConnectionStatus\n): boolean => status === \"closed\" || status === \"idle\" || status === \"error\";\n\nexport const createConnectionStateSnapshot = (\n status: RealtimeConnectionStatus,\n config: {\n isSupported?: boolean;\n lastChangedAt?: number | null;\n } = {}\n): ConnectionStateSnapshot => {\n const base = {\n isSupported: config.isSupported ?? true,\n lastChangedAt: config.lastChangedAt ?? null\n };\n\n switch (status) {\n case \"open\":\n return {\n ...base,\n isClosed: false,\n isConnected: true,\n isConnecting: false,\n status\n };\n case \"connecting\":\n case \"reconnecting\":\n return {\n ...base,\n isClosed: false,\n isConnected: false,\n isConnecting: true,\n status\n };\n case \"closing\":\n return {\n ...base,\n isClosed: false,\n isConnected: false,\n isConnecting: false,\n status\n };\n case \"idle\":\n case \"closed\":\n case \"error\":\n return {\n ...base,\n isClosed: true,\n isConnected: false,\n isConnecting: false,\n status\n };\n }\n};\n","import type { UrlProvider } from \"../types/common\";\n\nconst normalizeResolvedUrl = (value: string | URL | null): string | null => {\n if (value === null) {\n return null;\n }\n\n if (value instanceof URL) {\n return value.toString();\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n};\n\nexport const resolveUrlProvider = (url: UrlProvider): string | null => {\n const resolved = typeof url === \"function\" ? url() : url;\n return normalizeResolvedUrl(resolved ?? null);\n};\n","import { useEffect, useEffectEvent, useMemo, useRef, useState } from \"react\";\n\nimport { createConnectionStateSnapshot } from \"../core/connection-state\";\nimport { isWebSocketSupported } from \"../core/env\";\nimport { resolveUrlProvider } from \"../core/url\";\nimport { useHeartbeat } from \"./useHeartbeat\";\nimport { useReconnect } from \"./useReconnect\";\nimport type { UseHeartbeatOptions } from \"../types/useHeartbeat\";\nimport type {\n UseWebSocketHook,\n WebSocketHeartbeatAction,\n UseWebSocketHeartbeatOptions,\n UseWebSocketOptions,\n UseWebSocketResult\n} from \"../types/useWebSocket\";\n\ntype WebSocketState<TIncoming> = {\n bufferedAmount: number;\n lastChangedAt: number | null;\n lastCloseEvent: CloseEvent | null;\n lastError: Event | null;\n lastMessage: TIncoming | null;\n lastMessageEvent: MessageEvent<unknown> | null;\n status: UseWebSocketResult<TIncoming>[\"status\"];\n};\n\nconst createInitialState = <TIncoming,>(\n status: UseWebSocketResult<TIncoming>[\"status\"] = \"idle\"\n): WebSocketState<TIncoming> => ({\n bufferedAmount: 0,\n lastChangedAt: null,\n lastCloseEvent: null,\n lastError: null,\n lastMessage: null,\n lastMessageEvent: null,\n status\n});\n\nconst defaultParseMessage = <TIncoming,>(\n event: MessageEvent<unknown>\n): TIncoming => event.data as TIncoming;\n\nconst defaultSerializeMessage = <TOutgoing,>(message: TOutgoing) => {\n if (\n typeof message === \"string\" ||\n message instanceof Blob ||\n message instanceof ArrayBuffer\n ) {\n return message;\n }\n\n if (ArrayBuffer.isView(message)) {\n return message;\n }\n\n return JSON.stringify(message);\n};\n\nconst resolveFactoryValue = <TValue,>(\n value: TValue | (() => TValue)\n): TValue =>\n typeof value === \"function\"\n ? (value as () => TValue)()\n : value;\n\nconst toProtocolsDependency = (protocols: string | string[] | undefined): string => {\n if (protocols === undefined) {\n return \"\";\n }\n\n return Array.isArray(protocols) ? protocols.join(\"|\") : protocols;\n};\n\nconst toHeartbeatConfig = <TOutgoing, TIncoming>(\n heartbeat: UseWebSocketOptions<TIncoming, TOutgoing>[\"heartbeat\"]\n): UseWebSocketHeartbeatOptions<TOutgoing, TIncoming> | null =>\n heartbeat === undefined || heartbeat === false ? null : heartbeat;\n\nconst isSocketActive = (socket: WebSocket): boolean =>\n socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING;\n\nexport const useWebSocket: UseWebSocketHook = <\n TIncoming = unknown,\n TOutgoing = TIncoming\n>(\n options: UseWebSocketOptions<TIncoming, TOutgoing>\n): UseWebSocketResult<TIncoming, TOutgoing> => {\n const connect = options.connect ?? true;\n const supported = isWebSocketSupported();\n const resolvedUrl = useMemo(() => resolveUrlProvider(options.url), [options.url]);\n const protocolsDependency = toProtocolsDependency(options.protocols);\n\n const socketRef = useRef<WebSocket | null>(null);\n const socketKeyRef = useRef<string | null>(null);\n const manualCloseRef = useRef(false);\n const manualOpenRef = useRef(false);\n const skipCloseReconnectRef = useRef(false);\n const suppressReconnectRef = useRef(false);\n const pendingCloseActionRef = useRef<{\n error: Event | null;\n reconnectTrigger: \"heartbeat-timeout\" | \"error\" | null;\n } | null>(null);\n const terminalErrorRef = useRef<Event | null>(null);\n const [openNonce, setOpenNonce] = useState(0);\n const [state, setState] = useState<WebSocketState<TIncoming>>(() =>\n createInitialState(connect ? \"connecting\" : \"idle\")\n );\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const reconnectEnabled =\n options.reconnect !== false && supported && resolvedUrl !== null;\n const reconnect = useReconnect(\n options.reconnect === false\n ? { enabled: false }\n : {\n ...options.reconnect,\n enabled: reconnectEnabled && (options.reconnect?.enabled ?? true)\n }\n );\n\n const heartbeatEnabled =\n options.heartbeat !== false && supported && resolvedUrl !== null;\n const heartbeatConfig = toHeartbeatConfig<TOutgoing, TIncoming>(\n options.heartbeat\n );\n const defaultHeartbeatAction: WebSocketHeartbeatAction =\n options.reconnect === false ? \"close\" : \"reconnect\";\n const heartbeatHookOptions: UseHeartbeatOptions<TOutgoing, TIncoming> =\n heartbeatConfig === null\n ? {\n enabled: false,\n intervalMs: 1_000,\n startOnMount: false\n }\n : {\n beat: () => {\n const socket = socketRef.current;\n if (socket === null || socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n const heartbeatMessage = heartbeatConfig.message;\n\n if (heartbeatMessage !== undefined) {\n const serialized = (options.serializeMessage ?? defaultSerializeMessage)(\n resolveFactoryValue(heartbeatMessage)\n );\n socket.send(serialized);\n }\n\n return heartbeatConfig.beat?.() ?? true;\n },\n enabled: heartbeatEnabled && (heartbeatConfig.enabled ?? true),\n intervalMs: heartbeatConfig.intervalMs,\n startOnMount: false\n };\n\n if (heartbeatConfig !== null && heartbeatConfig.timeoutMs !== undefined) {\n heartbeatHookOptions.timeoutMs = heartbeatConfig.timeoutMs;\n }\n\n if (heartbeatConfig !== null && heartbeatConfig.matchesAck !== undefined) {\n heartbeatHookOptions.matchesAck = heartbeatConfig.matchesAck;\n }\n\n if (heartbeatConfig !== null && heartbeatConfig.onBeat !== undefined) {\n heartbeatHookOptions.onBeat = heartbeatConfig.onBeat;\n }\n\n if (heartbeatConfig !== null && heartbeatConfig.onTimeout !== undefined) {\n heartbeatHookOptions.onTimeout = heartbeatConfig.onTimeout;\n }\n\n if (heartbeatConfig !== null) {\n const onTimeout = heartbeatHookOptions.onTimeout;\n heartbeatHookOptions.onTimeout = () => {\n applyHeartbeatAction(\n heartbeatConfig.timeoutAction ?? defaultHeartbeatAction,\n new Event(\"heartbeat-timeout\"),\n \"heartbeat-timeout\"\n );\n onTimeout?.();\n };\n\n const onError = heartbeatConfig.onError;\n heartbeatHookOptions.onError = (error) => {\n const event =\n error instanceof Event ? error : new Event(\"heartbeat-error\");\n\n applyHeartbeatAction(\n heartbeatConfig.errorAction ??\n heartbeatConfig.timeoutAction ??\n defaultHeartbeatAction,\n event,\n \"error\"\n );\n onError?.(error);\n };\n }\n\n const heartbeat = useHeartbeat<TOutgoing, TIncoming>(\n heartbeatHookOptions\n );\n\n const commitState = (\n next:\n | WebSocketState<TIncoming>\n | ((current: WebSocketState<TIncoming>) => WebSocketState<TIncoming>)\n ): void => {\n const resolved = typeof next === \"function\" ? next(stateRef.current) : next;\n stateRef.current = resolved;\n setState(resolved);\n };\n\n const closeSocket = useEffectEvent((code?: number, reason?: string) => {\n const socket = socketRef.current;\n\n if (socket === null) {\n return;\n }\n\n socketRef.current = null;\n socketKeyRef.current = null;\n\n if (isSocketActive(socket)) {\n socket.close(code, reason);\n }\n });\n\n const applyHeartbeatAction = useEffectEvent(\n (\n action: WebSocketHeartbeatAction,\n error: Event,\n reconnectTrigger: \"heartbeat-timeout\" | \"error\"\n ) => {\n heartbeat.stop();\n\n if (action === \"none\") {\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: error\n }));\n return;\n }\n\n const shouldReconnect =\n action === \"reconnect\" &&\n reconnectEnabled &&\n (options.shouldReconnect?.(error) ?? true);\n manualOpenRef.current = false;\n terminalErrorRef.current = shouldReconnect ? null : error;\n const socket = socketRef.current;\n\n if (socket === null || !isSocketActive(socket)) {\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: error,\n status: shouldReconnect ? \"reconnecting\" : \"error\"\n }));\n\n if (shouldReconnect) {\n reconnect.schedule(reconnectTrigger);\n }\n\n return;\n }\n\n pendingCloseActionRef.current = {\n error,\n reconnectTrigger: shouldReconnect ? reconnectTrigger : null\n };\n skipCloseReconnectRef.current = true;\n suppressReconnectRef.current = true;\n closeSocket();\n }\n );\n\n const parseMessage = useEffectEvent((event: MessageEvent<unknown>) => {\n const parser = options.parseMessage ?? defaultParseMessage<TIncoming>;\n return parser(event);\n });\n\n const updateBufferedAmount = useEffectEvent(() => {\n commitState((current) => ({\n ...current,\n bufferedAmount: socketRef.current?.bufferedAmount ?? 0\n }));\n });\n\n const handleOpen = useEffectEvent((event: Event, socket: WebSocket) => {\n manualCloseRef.current = false;\n manualOpenRef.current = false;\n suppressReconnectRef.current = false;\n terminalErrorRef.current = null;\n reconnect.markConnected();\n heartbeat.start();\n\n commitState((current) => ({\n ...current,\n bufferedAmount: socket.bufferedAmount,\n lastChangedAt: Date.now(),\n status: \"open\"\n }));\n\n options.onOpen?.(event, socket);\n });\n\n const handleMessage = useEffectEvent((event: MessageEvent<unknown>) => {\n try {\n const message = parseMessage(event);\n heartbeat.notifyAck(message);\n\n commitState((current) => ({\n ...current,\n bufferedAmount: socketRef.current?.bufferedAmount ?? current.bufferedAmount,\n lastMessage: message,\n lastMessageEvent: event\n }));\n\n options.onMessage?.(message, event);\n } catch {\n const parseError = new Event(\"error\");\n terminalErrorRef.current = parseError;\n manualOpenRef.current = false;\n skipCloseReconnectRef.current = true;\n suppressReconnectRef.current = true;\n reconnect.cancel();\n heartbeat.stop();\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: parseError,\n status: \"error\"\n }));\n closeSocket(1003, \"parse-error\");\n }\n });\n\n const handleError = useEffectEvent((event: Event) => {\n heartbeat.stop();\n commitState((current) => ({\n ...current,\n lastError: event,\n status: \"error\"\n }));\n\n options.onError?.(event);\n });\n\n const handleClose = useEffectEvent((event: CloseEvent) => {\n socketRef.current = null;\n socketKeyRef.current = null;\n heartbeat.stop();\n updateBufferedAmount();\n const pendingCloseAction = pendingCloseActionRef.current;\n pendingCloseActionRef.current = null;\n const terminalError = terminalErrorRef.current;\n const skipCloseReconnect = skipCloseReconnectRef.current;\n skipCloseReconnectRef.current = false;\n\n if (pendingCloseAction !== null) {\n suppressReconnectRef.current = false;\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastCloseEvent: event,\n lastError: pendingCloseAction.error ?? current.lastError,\n status:\n pendingCloseAction.reconnectTrigger === null ? \"error\" : \"reconnecting\"\n }));\n\n options.onClose?.(event);\n\n if (pendingCloseAction.reconnectTrigger !== null) {\n reconnect.schedule(pendingCloseAction.reconnectTrigger);\n }\n\n return;\n }\n\n if (terminalError !== null) {\n suppressReconnectRef.current = false;\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastCloseEvent: event,\n lastError: terminalError,\n status: \"error\"\n }));\n\n options.onClose?.(event);\n return;\n }\n\n const shouldReconnect =\n !suppressReconnectRef.current &&\n !skipCloseReconnect &&\n reconnectEnabled &&\n (options.shouldReconnect?.(event) ?? true);\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastCloseEvent: event,\n status: shouldReconnect ? \"reconnecting\" : \"closed\"\n }));\n\n options.onClose?.(event);\n\n if (shouldReconnect) {\n reconnect.schedule(\"close\");\n } else {\n suppressReconnectRef.current = false;\n }\n });\n\n const open = (): void => {\n manualCloseRef.current = false;\n manualOpenRef.current = true;\n suppressReconnectRef.current = false;\n terminalErrorRef.current = null;\n reconnect.cancel();\n setOpenNonce((current) => current + 1);\n };\n\n const reconnectNow = (): void => {\n manualCloseRef.current = false;\n manualOpenRef.current = true;\n skipCloseReconnectRef.current = true;\n suppressReconnectRef.current = true;\n terminalErrorRef.current = null;\n heartbeat.stop();\n closeSocket();\n suppressReconnectRef.current = false;\n reconnect.schedule(\"manual\");\n };\n\n const close = (code?: number, reason?: string): void => {\n manualCloseRef.current = true;\n manualOpenRef.current = false;\n suppressReconnectRef.current = true;\n terminalErrorRef.current = null;\n reconnect.cancel();\n heartbeat.stop();\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status: \"closing\"\n }));\n\n closeSocket(code, reason);\n };\n\n const send = (message: TOutgoing): boolean => {\n const socket = socketRef.current;\n\n if (socket === null || socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n const serializer = options.serializeMessage ?? defaultSerializeMessage<TOutgoing>;\n socket.send(serializer(message));\n updateBufferedAmount();\n return true;\n };\n\n useEffect(() => {\n if (!supported) {\n socketKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status: \"closed\"\n }));\n return;\n }\n\n if (resolvedUrl === null) {\n socketKeyRef.current = null;\n closeSocket();\n commitState((current) => ({\n ...current,\n status: \"closed\"\n }));\n return;\n }\n\n const shouldConnect =\n terminalErrorRef.current === null &&\n ((connect && !manualCloseRef.current) ||\n manualOpenRef.current ||\n reconnect.status === \"running\");\n const nextSocketKey = `${resolvedUrl}::${protocolsDependency}::${options.binaryType ?? \"blob\"}`;\n\n if (!shouldConnect) {\n if (socketRef.current !== null) {\n suppressReconnectRef.current = true;\n closeSocket();\n }\n\n socketKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status:\n terminalErrorRef.current !== null\n ? \"error\"\n : manualCloseRef.current\n ? \"closed\"\n : \"idle\"\n }));\n return;\n }\n\n if (socketRef.current !== null && socketKeyRef.current !== nextSocketKey) {\n suppressReconnectRef.current = true;\n closeSocket();\n }\n\n if (socketRef.current !== null) {\n return;\n }\n\n const socket = new WebSocket(resolvedUrl, options.protocols);\n socketRef.current = socket;\n socketKeyRef.current = nextSocketKey;\n socket.binaryType = options.binaryType ?? \"blob\";\n\n commitState((current) => ({\n ...current,\n bufferedAmount: socket.bufferedAmount,\n lastChangedAt: Date.now(),\n status:\n reconnect.status === \"running\" || reconnect.status === \"scheduled\"\n ? \"reconnecting\"\n : \"connecting\"\n }));\n\n const handleSocketOpen = (event: Event): void => {\n handleOpen(event, socket);\n };\n const handleSocketMessage = (event: MessageEvent<unknown>): void => {\n handleMessage(event);\n };\n const handleSocketError = (event: Event): void => {\n handleError(event);\n };\n const handleSocketClose = (event: CloseEvent): void => {\n handleClose(event);\n };\n\n socket.addEventListener(\"open\", handleSocketOpen);\n socket.addEventListener(\"message\", handleSocketMessage);\n socket.addEventListener(\"error\", handleSocketError);\n socket.addEventListener(\"close\", handleSocketClose);\n\n return () => {\n socket.removeEventListener(\"open\", handleSocketOpen);\n socket.removeEventListener(\"message\", handleSocketMessage);\n socket.removeEventListener(\"error\", handleSocketError);\n socket.removeEventListener(\"close\", handleSocketClose);\n };\n }, [\n connect,\n openNonce,\n options.binaryType,\n protocolsDependency,\n reconnect.status,\n resolvedUrl,\n supported\n ]);\n\n useEffect(() => () => {\n suppressReconnectRef.current = true;\n socketKeyRef.current = null;\n terminalErrorRef.current = null;\n\n const socket = socketRef.current;\n socketRef.current = null;\n\n if (socket === null) {\n return;\n }\n\n if (isSocketActive(socket)) {\n socket.close();\n }\n }, []);\n\n useEffect(() => {\n if (state.status !== \"open\") {\n heartbeat.stop();\n }\n }, [state.status]);\n\n const status =\n (reconnect.status === \"scheduled\" || reconnect.status === \"running\") &&\n state.status !== \"open\"\n ? \"reconnecting\"\n : state.status;\n\n const snapshot = createConnectionStateSnapshot(status, {\n isSupported: supported,\n lastChangedAt: state.lastChangedAt\n });\n const heartbeatState =\n options.heartbeat === false\n ? null\n : {\n hasTimedOut: heartbeat.hasTimedOut,\n isRunning: heartbeat.isRunning,\n lastAckAt: heartbeat.lastAckAt,\n lastBeatAt: heartbeat.lastBeatAt,\n latencyMs: heartbeat.latencyMs\n };\n const reconnectState =\n options.reconnect === false\n ? null\n : {\n attempt: reconnect.attempt,\n isScheduled: reconnect.isScheduled,\n nextDelayMs: reconnect.nextDelayMs,\n status: reconnect.status\n };\n const commonResult = {\n bufferedAmount: state.bufferedAmount,\n close,\n heartbeatState,\n lastCloseEvent: state.lastCloseEvent,\n lastError: state.lastError,\n lastMessage: state.lastMessage,\n lastMessageEvent: state.lastMessageEvent,\n open,\n reconnect: reconnectNow,\n reconnectState,\n send,\n transport: \"websocket\" as const\n };\n const socket = socketRef.current;\n\n if (snapshot.status === \"open\") {\n return {\n ...snapshot,\n ...commonResult,\n socket: socket as WebSocket\n };\n }\n\n return {\n ...snapshot,\n ...commonResult,\n socket\n };\n};\n","import { useEffect, useEffectEvent, useMemo, useRef, useState } from \"react\";\n\nimport { createConnectionStateSnapshot } from \"../core/connection-state\";\nimport { isEventSourceSupported } from \"../core/env\";\nimport { resolveUrlProvider } from \"../core/url\";\nimport { useReconnect } from \"./useReconnect\";\nimport type {\n UseEventSourceHook,\n UseEventSourceOptions,\n UseEventSourceResult\n} from \"../types/useEventSource\";\n\ntype EventSourceState<TMessage> = {\n lastChangedAt: number | null;\n lastError: Event | null;\n lastEventName: string | null;\n lastMessage: TMessage | null;\n lastMessageEvent: MessageEvent<string> | null;\n status: UseEventSourceResult<TMessage>[\"status\"];\n};\n\nconst createInitialState = <TMessage,>(\n status: UseEventSourceResult<TMessage>[\"status\"] = \"idle\"\n): EventSourceState<TMessage> => ({\n lastChangedAt: null,\n lastError: null,\n lastEventName: null,\n lastMessage: null,\n lastMessageEvent: null,\n status\n});\n\nconst defaultParseMessage = <TMessage,>(\n event: MessageEvent<string>\n): TMessage => event.data as TMessage;\n\nconst toEventsDependency = (events: readonly string[] | undefined): string => {\n if (events === undefined || events.length === 0) {\n return \"\";\n }\n\n return [...new Set(events)].sort().join(\"|\");\n};\n\nconst normalizeNamedEvents = (\n events: readonly string[] | undefined\n): string[] => {\n if (events === undefined || events.length === 0) {\n return [];\n }\n\n return [...new Set(events)].filter((eventName) => eventName !== \"message\");\n};\n\nexport const useEventSource: UseEventSourceHook = <TMessage = unknown>(\n options: UseEventSourceOptions<TMessage>\n): UseEventSourceResult<TMessage> => {\n const connect = options.connect ?? true;\n const supported = isEventSourceSupported();\n const resolvedUrl = useMemo(() => resolveUrlProvider(options.url), [options.url]);\n const eventsDependency = toEventsDependency(options.events);\n const namedEvents = useMemo(\n () => normalizeNamedEvents(options.events),\n [eventsDependency]\n );\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const eventSourceKeyRef = useRef<string | null>(null);\n const manualCloseRef = useRef(false);\n const manualOpenRef = useRef(false);\n const skipErrorReconnectRef = useRef(false);\n const suppressReconnectRef = useRef(false);\n const terminalErrorRef = useRef<Event | null>(null);\n const [openNonce, setOpenNonce] = useState(0);\n const [state, setState] = useState<EventSourceState<TMessage>>(() =>\n createInitialState(connect ? \"connecting\" : \"idle\")\n );\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const reconnectEnabled =\n options.reconnect !== false && supported && resolvedUrl !== null;\n const reconnect = useReconnect(\n options.reconnect === false\n ? { enabled: false }\n : {\n ...options.reconnect,\n enabled: reconnectEnabled && (options.reconnect?.enabled ?? true)\n }\n );\n\n const commitState = (\n next:\n | EventSourceState<TMessage>\n | ((current: EventSourceState<TMessage>) => EventSourceState<TMessage>)\n ): void => {\n const resolved = typeof next === \"function\" ? next(stateRef.current) : next;\n stateRef.current = resolved;\n setState(resolved);\n };\n\n const closeEventSource = useEffectEvent(() => {\n const source = eventSourceRef.current;\n\n if (source === null) {\n return;\n }\n\n eventSourceRef.current = null;\n eventSourceKeyRef.current = null;\n source.close();\n });\n\n const parseMessage = useEffectEvent((event: MessageEvent<string>) => {\n const parser = options.parseMessage ?? defaultParseMessage<TMessage>;\n return parser(event);\n });\n\n const handleOpen = useEffectEvent((event: Event, source: EventSource) => {\n manualCloseRef.current = false;\n manualOpenRef.current = false;\n suppressReconnectRef.current = false;\n terminalErrorRef.current = null;\n reconnect.markConnected();\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status: \"open\"\n }));\n\n options.onOpen?.(event, source);\n });\n\n const commitParsedMessage = useEffectEvent(\n (eventName: string, event: MessageEvent<string>, isNamedEvent: boolean) => {\n try {\n const message = parseMessage(event);\n\n commitState((current) => ({\n ...current,\n lastEventName: eventName,\n lastMessage: message,\n lastMessageEvent: event\n }));\n\n if (isNamedEvent) {\n options.onEvent?.(eventName, message, event);\n return;\n }\n\n options.onMessage?.(message, event);\n } catch {\n const parseError = new Event(\"error\");\n terminalErrorRef.current = parseError;\n manualOpenRef.current = false;\n suppressReconnectRef.current = true;\n reconnect.cancel();\n closeEventSource();\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: parseError,\n status: \"error\"\n }));\n }\n }\n );\n\n const handleError = useEffectEvent((event: Event, source: EventSource) => {\n const terminalError = terminalErrorRef.current;\n\n if (terminalError !== null) {\n suppressReconnectRef.current = false;\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: terminalError,\n status: \"error\"\n }));\n\n return;\n }\n\n const skipErrorReconnect = skipErrorReconnectRef.current;\n skipErrorReconnectRef.current = false;\n const shouldReconnect =\n !suppressReconnectRef.current &&\n !skipErrorReconnect &&\n reconnectEnabled &&\n (options.shouldReconnect?.(event) ?? true);\n\n const readyState = source.readyState;\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: event,\n status:\n readyState === EventSource.OPEN\n ? \"open\"\n : shouldReconnect\n ? \"reconnecting\"\n : \"closed\"\n }));\n\n options.onError?.(event);\n\n if (!shouldReconnect) {\n suppressReconnectRef.current = false;\n closeEventSource();\n return;\n }\n\n if (readyState === EventSource.CLOSED) {\n eventSourceRef.current = null;\n eventSourceKeyRef.current = null;\n reconnect.schedule(\"error\");\n }\n });\n\n const open = (): void => {\n manualCloseRef.current = false;\n manualOpenRef.current = true;\n suppressReconnectRef.current = false;\n terminalErrorRef.current = null;\n reconnect.cancel();\n setOpenNonce((current) => current + 1);\n };\n\n const reconnectNow = (): void => {\n manualCloseRef.current = false;\n manualOpenRef.current = true;\n skipErrorReconnectRef.current = true;\n suppressReconnectRef.current = true;\n terminalErrorRef.current = null;\n closeEventSource();\n suppressReconnectRef.current = false;\n reconnect.schedule(\"manual\");\n };\n\n const close = (): void => {\n manualCloseRef.current = true;\n manualOpenRef.current = false;\n suppressReconnectRef.current = true;\n terminalErrorRef.current = null;\n reconnect.cancel();\n closeEventSource();\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status: \"closed\"\n }));\n };\n\n useEffect(() => {\n if (!supported) {\n eventSourceKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status: \"closed\"\n }));\n return;\n }\n\n if (resolvedUrl === null) {\n eventSourceKeyRef.current = null;\n closeEventSource();\n commitState((current) => ({\n ...current,\n status: \"closed\"\n }));\n return;\n }\n\n const shouldConnect =\n terminalErrorRef.current === null &&\n ((connect && !manualCloseRef.current) ||\n manualOpenRef.current ||\n reconnect.status === \"running\");\n const nextEventSourceKey = [\n resolvedUrl,\n options.withCredentials ? \"credentials\" : \"anonymous\",\n eventsDependency\n ].join(\"::\");\n\n if (!shouldConnect) {\n if (eventSourceRef.current !== null) {\n suppressReconnectRef.current = true;\n closeEventSource();\n }\n\n eventSourceKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status:\n terminalErrorRef.current !== null\n ? \"error\"\n : manualCloseRef.current\n ? \"closed\"\n : \"idle\"\n }));\n return;\n }\n\n if (\n eventSourceRef.current !== null &&\n eventSourceKeyRef.current !== nextEventSourceKey\n ) {\n suppressReconnectRef.current = true;\n closeEventSource();\n }\n\n if (eventSourceRef.current !== null) {\n return;\n }\n\n const source = new EventSource(resolvedUrl, {\n withCredentials: options.withCredentials ?? false\n });\n\n eventSourceRef.current = source;\n eventSourceKeyRef.current = nextEventSourceKey;\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status:\n reconnect.status === \"running\" || reconnect.status === \"scheduled\"\n ? \"reconnecting\"\n : \"connecting\"\n }));\n\n const handleSourceOpen = (event: Event): void => {\n handleOpen(event, source);\n };\n const handleSourceMessage = (event: Event): void => {\n commitParsedMessage(\"message\", event as MessageEvent<string>, false);\n };\n const namedEventHandlers = new Map<\n string,\n (event: Event) => void\n >();\n const handleSourceError = (event: Event): void => {\n handleError(event, source);\n };\n\n source.addEventListener(\"open\", handleSourceOpen);\n source.addEventListener(\"message\", handleSourceMessage);\n\n for (const eventName of namedEvents) {\n const handler = (event: Event): void => {\n commitParsedMessage(eventName, event as MessageEvent<string>, true);\n };\n\n namedEventHandlers.set(eventName, handler);\n source.addEventListener(eventName, handler);\n }\n\n source.addEventListener(\"error\", handleSourceError);\n\n return () => {\n source.removeEventListener(\"open\", handleSourceOpen);\n source.removeEventListener(\"message\", handleSourceMessage);\n\n for (const [eventName, handler] of namedEventHandlers) {\n source.removeEventListener(eventName, handler);\n }\n\n source.removeEventListener(\"error\", handleSourceError);\n };\n }, [\n connect,\n eventsDependency,\n namedEvents,\n openNonce,\n options.withCredentials,\n reconnect.status,\n resolvedUrl,\n supported\n ]);\n\n useEffect(() => () => {\n suppressReconnectRef.current = true;\n eventSourceKeyRef.current = null;\n terminalErrorRef.current = null;\n\n const source = eventSourceRef.current;\n eventSourceRef.current = null;\n\n if (source !== null) {\n source.close();\n }\n }, []);\n\n const status =\n (reconnect.status === \"scheduled\" || reconnect.status === \"running\") &&\n state.status !== \"open\"\n ? \"reconnecting\"\n : state.status;\n\n const snapshot = createConnectionStateSnapshot(status, {\n isSupported: supported,\n lastChangedAt: state.lastChangedAt\n });\n const reconnectState =\n options.reconnect === false\n ? null\n : {\n attempt: reconnect.attempt,\n isScheduled: reconnect.isScheduled,\n nextDelayMs: reconnect.nextDelayMs,\n status: reconnect.status\n };\n const commonResult = {\n close,\n lastError: state.lastError,\n lastEventName: state.lastEventName,\n lastMessage: state.lastMessage,\n lastMessageEvent: state.lastMessageEvent,\n open,\n reconnect: reconnectNow,\n reconnectState,\n transport: \"eventsource\" as const\n };\n const eventSource = eventSourceRef.current;\n\n if (snapshot.status === \"open\") {\n return {\n ...snapshot,\n ...commonResult,\n eventSource: eventSource as EventSource\n };\n }\n\n return {\n ...snapshot,\n ...commonResult,\n eventSource\n };\n};\n"]}
package/dist/index.d.cts CHANGED
@@ -70,6 +70,7 @@ interface UseHeartbeatOptions<TOutgoing = unknown, TIncoming = TOutgoing> {
70
70
  startOnMount?: boolean;
71
71
  onBeat?: () => void;
72
72
  onTimeout?: () => void;
73
+ onError?: (error: unknown) => void;
73
74
  }
74
75
  interface UseHeartbeatResult<TIncoming = unknown> {
75
76
  isRunning: boolean;
@@ -118,6 +119,11 @@ type ConnectionStateSnapshot = (ConnectionStateSnapshotBase & {
118
119
  type MessageParser<TMessage> = (event: MessageEvent<unknown>) => TMessage;
119
120
  type MessageSerializer<TMessage> = (message: TMessage) => string | ArrayBufferLike | Blob | ArrayBufferView;
120
121
 
122
+ type WebSocketHeartbeatAction = "none" | "close" | "reconnect";
123
+ interface UseWebSocketHeartbeatOptions<TOutgoing = unknown, TIncoming = TOutgoing> extends UseHeartbeatOptions<TOutgoing, TIncoming> {
124
+ timeoutAction?: WebSocketHeartbeatAction;
125
+ errorAction?: WebSocketHeartbeatAction;
126
+ }
121
127
  interface UseWebSocketOptions<TIncoming = unknown, TOutgoing = TIncoming> {
122
128
  url: UrlProvider;
123
129
  protocols?: string | string[];
@@ -126,7 +132,7 @@ interface UseWebSocketOptions<TIncoming = unknown, TOutgoing = TIncoming> {
126
132
  parseMessage?: MessageParser<TIncoming>;
127
133
  serializeMessage?: MessageSerializer<TOutgoing>;
128
134
  reconnect?: false | UseReconnectOptions;
129
- heartbeat?: false | UseHeartbeatOptions<TOutgoing, TIncoming>;
135
+ heartbeat?: false | UseWebSocketHeartbeatOptions<TOutgoing, TIncoming>;
130
136
  shouldReconnect?: (event: CloseEvent | Event | undefined) => boolean;
131
137
  onOpen?: (event: Event, socket: WebSocket) => void;
132
138
  onMessage?: (message: TIncoming, event: MessageEvent<unknown>) => void;
@@ -213,4 +219,4 @@ type UseEventSourceHook = <TMessage = unknown>(options: UseEventSourceOptions<TM
213
219
 
214
220
  declare const useEventSource: UseEventSourceHook;
215
221
 
216
- export { type ConnectionStateSnapshot, type HeartbeatAckMatcher, type HeartbeatBeatFn, type MessageParser, type MessageSerializer, type Milliseconds, type RealtimeConnectionStatus, type RealtimeTransport, type ReconnectAttempt, type ReconnectDelayContext, type ReconnectDelayStrategy, type ReconnectStatus, type ReconnectTrigger, type UrlProvider, type UseEventSourceHook, type UseEventSourceOptions, type UseEventSourceResult, type UseHeartbeatHook, type UseHeartbeatOptions, type UseHeartbeatResult, type UseOnlineStatusHook, type UseOnlineStatusOptions, type UseOnlineStatusResult, type UseReconnectHook, type UseReconnectOptions, type UseReconnectResult, type UseWebSocketHook, type UseWebSocketOptions, type UseWebSocketResult, useEventSource, useHeartbeat, useOnlineStatus, useReconnect, useWebSocket };
222
+ export { type ConnectionStateSnapshot, type HeartbeatAckMatcher, type HeartbeatBeatFn, type MessageParser, type MessageSerializer, type Milliseconds, type RealtimeConnectionStatus, type RealtimeTransport, type ReconnectAttempt, type ReconnectDelayContext, type ReconnectDelayStrategy, type ReconnectStatus, type ReconnectTrigger, type UrlProvider, type UseEventSourceHook, type UseEventSourceOptions, type UseEventSourceResult, type UseHeartbeatHook, type UseHeartbeatOptions, type UseHeartbeatResult, type UseOnlineStatusHook, type UseOnlineStatusOptions, type UseOnlineStatusResult, type UseReconnectHook, type UseReconnectOptions, type UseReconnectResult, type UseWebSocketHeartbeatOptions, type UseWebSocketHook, type UseWebSocketOptions, type UseWebSocketResult, type WebSocketHeartbeatAction, useEventSource, useHeartbeat, useOnlineStatus, useReconnect, useWebSocket };
package/dist/index.d.ts CHANGED
@@ -70,6 +70,7 @@ interface UseHeartbeatOptions<TOutgoing = unknown, TIncoming = TOutgoing> {
70
70
  startOnMount?: boolean;
71
71
  onBeat?: () => void;
72
72
  onTimeout?: () => void;
73
+ onError?: (error: unknown) => void;
73
74
  }
74
75
  interface UseHeartbeatResult<TIncoming = unknown> {
75
76
  isRunning: boolean;
@@ -118,6 +119,11 @@ type ConnectionStateSnapshot = (ConnectionStateSnapshotBase & {
118
119
  type MessageParser<TMessage> = (event: MessageEvent<unknown>) => TMessage;
119
120
  type MessageSerializer<TMessage> = (message: TMessage) => string | ArrayBufferLike | Blob | ArrayBufferView;
120
121
 
122
+ type WebSocketHeartbeatAction = "none" | "close" | "reconnect";
123
+ interface UseWebSocketHeartbeatOptions<TOutgoing = unknown, TIncoming = TOutgoing> extends UseHeartbeatOptions<TOutgoing, TIncoming> {
124
+ timeoutAction?: WebSocketHeartbeatAction;
125
+ errorAction?: WebSocketHeartbeatAction;
126
+ }
121
127
  interface UseWebSocketOptions<TIncoming = unknown, TOutgoing = TIncoming> {
122
128
  url: UrlProvider;
123
129
  protocols?: string | string[];
@@ -126,7 +132,7 @@ interface UseWebSocketOptions<TIncoming = unknown, TOutgoing = TIncoming> {
126
132
  parseMessage?: MessageParser<TIncoming>;
127
133
  serializeMessage?: MessageSerializer<TOutgoing>;
128
134
  reconnect?: false | UseReconnectOptions;
129
- heartbeat?: false | UseHeartbeatOptions<TOutgoing, TIncoming>;
135
+ heartbeat?: false | UseWebSocketHeartbeatOptions<TOutgoing, TIncoming>;
130
136
  shouldReconnect?: (event: CloseEvent | Event | undefined) => boolean;
131
137
  onOpen?: (event: Event, socket: WebSocket) => void;
132
138
  onMessage?: (message: TIncoming, event: MessageEvent<unknown>) => void;
@@ -213,4 +219,4 @@ type UseEventSourceHook = <TMessage = unknown>(options: UseEventSourceOptions<TM
213
219
 
214
220
  declare const useEventSource: UseEventSourceHook;
215
221
 
216
- export { type ConnectionStateSnapshot, type HeartbeatAckMatcher, type HeartbeatBeatFn, type MessageParser, type MessageSerializer, type Milliseconds, type RealtimeConnectionStatus, type RealtimeTransport, type ReconnectAttempt, type ReconnectDelayContext, type ReconnectDelayStrategy, type ReconnectStatus, type ReconnectTrigger, type UrlProvider, type UseEventSourceHook, type UseEventSourceOptions, type UseEventSourceResult, type UseHeartbeatHook, type UseHeartbeatOptions, type UseHeartbeatResult, type UseOnlineStatusHook, type UseOnlineStatusOptions, type UseOnlineStatusResult, type UseReconnectHook, type UseReconnectOptions, type UseReconnectResult, type UseWebSocketHook, type UseWebSocketOptions, type UseWebSocketResult, useEventSource, useHeartbeat, useOnlineStatus, useReconnect, useWebSocket };
222
+ export { type ConnectionStateSnapshot, type HeartbeatAckMatcher, type HeartbeatBeatFn, type MessageParser, type MessageSerializer, type Milliseconds, type RealtimeConnectionStatus, type RealtimeTransport, type ReconnectAttempt, type ReconnectDelayContext, type ReconnectDelayStrategy, type ReconnectStatus, type ReconnectTrigger, type UrlProvider, type UseEventSourceHook, type UseEventSourceOptions, type UseEventSourceResult, type UseHeartbeatHook, type UseHeartbeatOptions, type UseHeartbeatResult, type UseOnlineStatusHook, type UseOnlineStatusOptions, type UseOnlineStatusResult, type UseReconnectHook, type UseReconnectOptions, type UseReconnectResult, type UseWebSocketHeartbeatOptions, type UseWebSocketHook, type UseWebSocketOptions, type UseWebSocketResult, type WebSocketHeartbeatAction, useEventSource, useHeartbeat, useOnlineStatus, useReconnect, useWebSocket };