react-realtime-hooks 1.4.2 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -4
- package/dist/index.cjs +11 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.js +11 -6
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/env.ts","../src/hooks/useOnlineStatus.ts","../src/hooks/usePageVisibility.ts","../src/core/timers.ts","../src/hooks/useConnectionGate.ts","../src/core/reconnect.ts","../src/hooks/useStableCallback.ts","../src/hooks/useReconnect.ts","../src/hooks/useHeartbeat.ts","../src/core/connection-state.ts","../src/core/errors.ts","../src/core/url.ts","../src/hooks/useWebSocketController.ts","../src/hooks/useWebSocket.ts","../src/hooks/useEventSource.ts"],"names":["useSyncExternalStore","useRef","useState","useEffect","createEmptyTransitionState","useInsertionEffect","useCallback","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 hasDocumentVisibilitySupport = (): boolean =>\n typeof document !== \"undefined\" && typeof document.visibilityState === \"string\";\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 readPageVisibility = (initialVisible = true): {\n isVisible: boolean;\n isSupported: boolean;\n visibilityState: DocumentVisibilityState | \"visible\";\n} => {\n if (!hasDocumentVisibilitySupport()) {\n return {\n isVisible: initialVisible,\n isSupported: false,\n visibilityState: initialVisible ? \"visible\" : \"hidden\"\n };\n }\n\n return {\n isVisible: document.visibilityState === \"visible\",\n isSupported: true,\n visibilityState: document.visibilityState\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 { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\n\nimport {\n hasDocumentVisibilitySupport,\n readPageVisibility\n} from \"../core/env\";\nimport type {\n UsePageVisibilityHook,\n UsePageVisibilityOptions,\n UsePageVisibilityResult\n} from \"../types/usePageVisibility\";\n\nconst subscribeToPageVisibility = (\n onStoreChange: () => void\n): (() => void) => {\n if (typeof document === \"undefined\" || !hasDocumentVisibilitySupport()) {\n return () => {};\n }\n\n document.addEventListener(\"visibilitychange\", onStoreChange);\n\n return () => {\n document.removeEventListener(\"visibilitychange\", onStoreChange);\n };\n};\n\nconst createEmptyTransitionState = (): Pick<\n UsePageVisibilityResult,\n \"lastChangedAt\" | \"becameVisibleAt\" | \"becameHiddenAt\"\n> => ({\n lastChangedAt: null,\n becameHiddenAt: null,\n becameVisibleAt: null\n});\n\nexport const usePageVisibility: UsePageVisibilityHook = (\n options: UsePageVisibilityOptions = {}\n) => {\n const initialVisible = options.initialVisible ?? true;\n const trackTransitions = options.trackTransitions ?? true;\n\n const visibilityState = useSyncExternalStore(\n subscribeToPageVisibility,\n () => readPageVisibility(initialVisible).visibilityState,\n () => (initialVisible ? \"visible\" : \"hidden\")\n );\n\n const isVisible = visibilityState === \"visible\";\n const previousVisibleRef = useRef(isVisible);\n const [transitions, setTransitions] = useState(createEmptyTransitionState);\n\n useEffect(() => {\n if (!trackTransitions) {\n previousVisibleRef.current = isVisible;\n setTransitions(createEmptyTransitionState);\n return;\n }\n\n if (previousVisibleRef.current === isVisible) {\n return;\n }\n\n const changedAt = Date.now();\n previousVisibleRef.current = isVisible;\n\n setTransitions((current) => ({\n lastChangedAt: changedAt,\n becameHiddenAt: isVisible ? current.becameHiddenAt : changedAt,\n becameVisibleAt: isVisible ? changedAt : current.becameVisibleAt\n }));\n }, [isVisible, trackTransitions]);\n\n return {\n isSupported: hasDocumentVisibilitySupport(),\n isVisible,\n visibilityState,\n ...transitions\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 { useEffect, useRef, useState } from \"react\";\n\nimport { createManagedTimeout } from \"../core/timers\";\nimport { useOnlineStatus } from \"./useOnlineStatus\";\nimport { usePageVisibility } from \"./usePageVisibility\";\nimport type {\n ConnectionGateReason,\n UseConnectionGateHook,\n UseConnectionGateResult\n} from \"../types/useConnectionGate\";\n\ntype ConnectionGateTransitionState = Pick<\n UseConnectionGateResult,\n \"becameBlockedAt\" | \"becameReadyAt\" | \"lastChangedAt\"\n>;\n\nconst createEmptyTransitionState = (): ConnectionGateTransitionState => ({\n becameBlockedAt: null,\n becameReadyAt: null,\n lastChangedAt: null\n});\n\nconst normalizeHiddenGraceMs = (value: number | undefined): number => {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, value);\n};\n\nexport const useConnectionGate: UseConnectionGateHook = (options = {}) => {\n const enabled = options.enabled ?? true;\n const requireOnline = options.requireOnline ?? true;\n const requireVisible = options.requireVisible ?? false;\n const hiddenGraceMs = normalizeHiddenGraceMs(options.hiddenGraceMs);\n const trackTransitions = options.trackTransitions ?? true;\n const onlineStatus = useOnlineStatus({\n ...(options.initialOnline === undefined\n ? {}\n : { initialOnline: options.initialOnline }),\n trackTransitions: false\n });\n const pageVisibility = usePageVisibility({\n ...(options.initialVisible === undefined\n ? {}\n : { initialVisible: options.initialVisible }),\n trackTransitions: false\n });\n const hiddenGraceTimeoutRef = useRef(createManagedTimeout());\n const hiddenSinceRef = useRef<number | null>(null);\n const previousStateRef = useRef<{\n connect: boolean;\n reason: ConnectionGateReason;\n } | null>(null);\n const [hasExceededHiddenGrace, setHasExceededHiddenGrace] = useState(false);\n const [isWaitingForVisibleGrace, setIsWaitingForVisibleGrace] = useState(false);\n const [transitions, setTransitions] = useState(createEmptyTransitionState);\n\n useEffect(() => () => {\n hiddenGraceTimeoutRef.current.cancel();\n }, []);\n\n useEffect(() => {\n hiddenGraceTimeoutRef.current.cancel();\n\n if (!requireVisible || pageVisibility.isVisible) {\n hiddenSinceRef.current = null;\n setHasExceededHiddenGrace(false);\n setIsWaitingForVisibleGrace(false);\n return;\n }\n\n const hiddenSince = hiddenSinceRef.current ?? Date.now();\n hiddenSinceRef.current = hiddenSince;\n\n if (hiddenGraceMs <= 0) {\n setHasExceededHiddenGrace(true);\n setIsWaitingForVisibleGrace(false);\n return;\n }\n\n const elapsedMs = Date.now() - hiddenSince;\n\n if (elapsedMs >= hiddenGraceMs) {\n setHasExceededHiddenGrace(true);\n setIsWaitingForVisibleGrace(false);\n return;\n }\n\n setHasExceededHiddenGrace(false);\n setIsWaitingForVisibleGrace(true);\n hiddenGraceTimeoutRef.current.schedule(() => {\n setHasExceededHiddenGrace(true);\n setIsWaitingForVisibleGrace(false);\n }, hiddenGraceMs - elapsedMs);\n }, [hiddenGraceMs, pageVisibility.isVisible, requireVisible]);\n\n let reason: ConnectionGateReason = \"ready\";\n\n if (!enabled) {\n reason = \"manual\";\n } else if (requireOnline && !onlineStatus.isOnline) {\n reason = \"offline\";\n } else if (\n requireVisible &&\n !pageVisibility.isVisible &&\n hasExceededHiddenGrace\n ) {\n reason = \"hidden\";\n }\n\n const connect = reason === \"ready\";\n const isBlocked = !connect;\n\n useEffect(() => {\n if (!trackTransitions) {\n previousStateRef.current = {\n connect,\n reason\n };\n setTransitions(createEmptyTransitionState);\n return;\n }\n\n const previousState = previousStateRef.current;\n\n if (previousState === null) {\n previousStateRef.current = {\n connect,\n reason\n };\n return;\n }\n\n if (\n previousState.connect === connect &&\n previousState.reason === reason\n ) {\n return;\n }\n\n const changedAt = Date.now();\n previousStateRef.current = {\n connect,\n reason\n };\n\n setTransitions((current) => ({\n becameBlockedAt: connect ? current.becameBlockedAt : changedAt,\n becameReadyAt: connect ? changedAt : current.becameReadyAt,\n lastChangedAt: changedAt\n }));\n }, [connect, reason, trackTransitions]);\n\n return {\n becameBlockedAt: transitions.becameBlockedAt,\n becameReadyAt: transitions.becameReadyAt,\n connect,\n isBlocked,\n isOnline: onlineStatus.isOnline,\n isOnlineSupported: onlineStatus.isSupported,\n isVisibilitySupported: pageVisibility.isSupported,\n isVisible: pageVisibility.isVisible,\n isWaitingForVisibleGrace,\n lastChangedAt: transitions.lastChangedAt,\n reason,\n visibilityState: pageVisibility.visibilityState\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","import { useCallback, useInsertionEffect, useRef } from \"react\";\n\n/**\n * Returns a referentially stable wrapper around `callback` that always\n * invokes the most recent version of the function passed in.\n *\n * The latest reference is committed via `useInsertionEffect` instead of\n * being mutated during render. Mutating refs during render is unsafe\n * under concurrent rendering: a render may be discarded after writing\n * to the ref, leaving the ref out of sync with the committed tree.\n * `useInsertionEffect` runs synchronously after commit, before any\n * layout effect or paint, so the ref always matches the committed\n * callback by the time any effect, event handler, or subscription\n * reads from it.\n *\n * The returned wrapper itself never changes identity, which makes it\n * safe to pass into `useEffect` dependency arrays or to add as an\n * event listener without forcing teardown on every render.\n *\n * Note: the returned wrapper must not be invoked during render. It is\n * intended for event handlers, effects, and subscription callbacks.\n */\nexport const useStableCallback = <TArgs extends unknown[], TResult>(\n callback: (...args: TArgs) => TResult\n): ((...args: TArgs) => TResult) => {\n const callbackRef = useRef(callback);\n\n useInsertionEffect(() => {\n callbackRef.current = callback;\n });\n\n return useCallback((...args: TArgs) => callbackRef.current(...args), []);\n};\n","import { useEffect, useInsertionEffect, useRef, useState } from \"react\";\n\nimport {\n createReconnectAttempt,\n normalizeReconnectOptions\n} from \"../core/reconnect\";\nimport { createManagedTimeout } from \"../core/timers\";\nimport { useStableCallback } from \"./useStableCallback\";\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 useInsertionEffect(() => {\n stateRef.current = state;\n });\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 // `status` is a control signal read by `useEffect` dependencies in\n // `useWebSocket` / `useEventSource`. It must commit at the default\n // priority so the consumer effect runs in the same React commit as\n // the timer callback that triggered the transition; deprioritizing\n // it via `startTransition` opens a window where the transport sees\n // a stale status while higher-priority updates render.\n setState(resolved);\n };\n\n const runAttempt = useStableCallback((attempt: number) => {\n commitState({\n attempt,\n nextDelayMs: null,\n status: \"running\"\n });\n });\n\n const emitSchedule = useStableCallback((attempt: ReconnectAttempt) => {\n normalizedOptions.onSchedule?.(attempt);\n });\n\n const emitCancel = useStableCallback(() => {\n normalizedOptions.onCancel?.();\n });\n\n const emitReset = useStableCallback(() => {\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 = useStableCallback((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 = useStableCallback((): 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 = useStableCallback((): void => {\n timeoutRef.current.cancel();\n lastDelayRef.current = null;\n commitState(createInitialState(normalizedOptions.enabled));\n emitReset();\n });\n\n const markConnected = useStableCallback((): 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, useInsertionEffect, useRef, useState } from \"react\";\n\nimport {\n createManagedInterval,\n createManagedTimeout\n} from \"../core/timers\";\nimport { useStableCallback } from \"./useStableCallback\";\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 useInsertionEffect(() => {\n stateRef.current = state;\n });\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 = useStableCallback(() => {\n commitState((current) => ({\n ...current,\n hasTimedOut: true\n }));\n options.onTimeout?.();\n });\n\n const scheduleTimeout = useStableCallback(() => {\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 = useStableCallback((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 = useStableCallback((error: unknown) => {\n timeoutRef.current.cancel();\n options.onError?.(error);\n });\n\n const runBeat = useStableCallback(() => {\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 = useStableCallback((): 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 = useStableCallback((): void => {\n generationRef.current += 1;\n intervalRef.current.cancel();\n timeoutRef.current.cancel();\n commitState(createInitialState(false));\n });\n\n const beat = useStableCallback((): void => {\n if (!enabled) {\n return;\n }\n\n runBeat();\n });\n\n const notifyAck = useStableCallback((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, start, startOnMount, stop]);\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","export type RealtimeErrorKind =\n | \"heartbeat-error\"\n | \"heartbeat-timeout\"\n | \"parse-error\";\n\nexport interface RealtimeErrorEventInit extends EventInit {\n cause?: unknown;\n kind: RealtimeErrorKind;\n}\n\nexport class RealtimeErrorEvent extends Event {\n readonly cause: unknown;\n readonly kind: RealtimeErrorKind;\n\n constructor(type: string, init: RealtimeErrorEventInit) {\n super(type, init);\n this.cause = init.cause;\n this.kind = init.kind;\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 { useRef } from \"react\";\n\nimport type { ReconnectTrigger } from \"../types/useReconnect\";\n\n/**\n * Latched description of what the next observed `close` event should\n * commit, generated by the heartbeat path when an active socket exists\n * and we have to wait for the close to actually fire.\n */\nexport type WebSocketPendingCloseAction = {\n error: Event | null;\n reconnectTrigger: ReconnectTrigger | null;\n};\n\ntype ControllerState = {\n /**\n * The user explicitly called `close()`. Suppresses auto-reconnect on\n * the next deps-effect run unless cleared by `open()` / `reconnect()`.\n */\n manualClose: boolean;\n /**\n * The user explicitly called `open()` (or `reconnect()`). Forces the\n * deps-effect to connect even when `connect={false}`.\n */\n manualOpen: boolean;\n /**\n * Reconnect is suppressed for the close that is currently in flight.\n * Cleared by the close-handler once it has used the value, or by an\n * incoming `open` event.\n */\n reconnectSuppressed: boolean;\n /**\n * One-shot guard: the very next close should bypass the auto-reconnect\n * decision entirely. Consumed by the close handler.\n */\n skipNextCloseReconnect: boolean;\n /**\n * Latched action that the close handler should commit when the close\n * fires. Set by the heartbeat path with an active socket. Consumed by\n * the close handler.\n */\n pendingCloseAction: WebSocketPendingCloseAction | null;\n /**\n * Sticky terminal error (e.g. parse-error). Survives until cleared by\n * a user action (`open()` / `close()` / `reconnect()`) or replaced by\n * a subsequent heartbeat result. Read by both the close handler and\n * the deps-effect.\n */\n terminalError: Event | null;\n};\n\nconst createInitialState = (): ControllerState => ({\n manualClose: false,\n manualOpen: false,\n pendingCloseAction: null,\n reconnectSuppressed: false,\n skipNextCloseReconnect: false,\n terminalError: null\n});\n\n/**\n * Imperative control-plane state for `useWebSocket`. Consolidates the\n * six interacting mutable booleans/refs that previously lived directly\n * inside the hook into a single object whose transitions are exposed\n * through named methods.\n *\n * Behaviour is intentionally identical to the previous pile of refs;\n * this is a pure refactor that makes the control flow easier to read\n * and review. None of the methods cause renders -- the controller is\n * stored in a single `useRef`, not in React state.\n */\nexport type WebSocketController = {\n /** Did the user explicitly call `close()` and not `open()` since? */\n hasManualCloseRequested: () => boolean;\n /** Did the user explicitly call `open()` (or `reconnect()`) and not `close()` since? */\n hasManualOpenRequested: () => boolean;\n /** Sticky terminal error, or `null`. Non-destructive read. */\n peekTerminalError: () => Event | null;\n /** Should the close currently in flight skip auto-reconnect? */\n isReconnectSuppressed: () => boolean;\n\n /** `open()` was called. */\n noteUserOpenRequested: () => void;\n /** `close()` was called, before `closeSocket(trackClose)` runs. */\n noteUserCloseRequested: () => void;\n /** `reconnect()` was called, before the controlled close runs. */\n noteUserReconnectRequested: () => void;\n /** `reconnect()`'s controlled close has finished, before scheduling. */\n noteUserReconnectClosed: () => void;\n\n /** Socket fired `open`; clear all manual / suppress / terminal flags. */\n noteSocketOpened: () => void;\n\n /**\n * Heartbeat decided to act, but no active socket is around to close.\n * Sets the terminal error iff the action is not a reconnect.\n */\n noteHeartbeatNoActiveSocket: (input: {\n shouldReconnect: boolean;\n error: Event;\n }) => void;\n /**\n * Heartbeat decided to act and there is an active socket: latch a\n * pending close action and prepare both reconnect guards.\n */\n noteHeartbeatActiveSocketClose: (input: WebSocketPendingCloseAction) => void;\n\n /** Parser threw; latch a terminal error and prepare both guards. */\n noteParseError: (error: Event) => void;\n\n /**\n * The deps-effect itself initiated a close because the URL changed,\n * `connect` became false, or the runtime is unsupported. The next\n * close should not auto-reconnect.\n */\n noteEffectInitiatedClose: () => void;\n\n /** Consume the latched pending action, clearing it. */\n consumePendingCloseAction: () => WebSocketPendingCloseAction | null;\n /** Consume the one-shot skip flag, clearing it. */\n consumeSkipNextCloseReconnect: () => boolean;\n /** Reset the imminent-close suppression after the close has been processed. */\n clearReconnectSuppression: () => void;\n};\n\nexport const useWebSocketController = (): WebSocketController => {\n const ref = useRef<ControllerState | null>(null);\n\n if (ref.current === null) {\n ref.current = createInitialState();\n }\n\n const state = ref.current;\n\n const controllerRef = useRef<WebSocketController | null>(null);\n\n if (controllerRef.current === null) {\n controllerRef.current = {\n clearReconnectSuppression: () => {\n state.reconnectSuppressed = false;\n },\n consumePendingCloseAction: () => {\n const action = state.pendingCloseAction;\n state.pendingCloseAction = null;\n return action;\n },\n consumeSkipNextCloseReconnect: () => {\n const skip = state.skipNextCloseReconnect;\n state.skipNextCloseReconnect = false;\n return skip;\n },\n hasManualCloseRequested: () => state.manualClose,\n hasManualOpenRequested: () => state.manualOpen,\n isReconnectSuppressed: () => state.reconnectSuppressed,\n noteEffectInitiatedClose: () => {\n state.reconnectSuppressed = true;\n },\n noteHeartbeatActiveSocketClose: (input) => {\n state.manualOpen = false;\n state.terminalError =\n input.reconnectTrigger === null ? input.error : null;\n state.pendingCloseAction = input;\n state.skipNextCloseReconnect = true;\n state.reconnectSuppressed = true;\n },\n noteHeartbeatNoActiveSocket: ({ shouldReconnect, error }) => {\n state.manualOpen = false;\n state.terminalError = shouldReconnect ? null : error;\n },\n noteParseError: (error) => {\n state.terminalError = error;\n state.manualOpen = false;\n state.skipNextCloseReconnect = true;\n state.reconnectSuppressed = true;\n },\n noteSocketOpened: () => {\n state.manualClose = false;\n state.manualOpen = false;\n state.reconnectSuppressed = false;\n state.terminalError = null;\n },\n noteUserCloseRequested: () => {\n state.manualClose = true;\n state.manualOpen = false;\n state.reconnectSuppressed = true;\n state.terminalError = null;\n },\n noteUserOpenRequested: () => {\n state.manualClose = false;\n state.manualOpen = true;\n state.reconnectSuppressed = false;\n state.terminalError = null;\n },\n noteUserReconnectClosed: () => {\n state.reconnectSuppressed = false;\n },\n noteUserReconnectRequested: () => {\n state.manualClose = false;\n state.manualOpen = true;\n state.skipNextCloseReconnect = true;\n state.reconnectSuppressed = true;\n state.terminalError = null;\n },\n peekTerminalError: () => state.terminalError\n };\n }\n\n return controllerRef.current;\n};\n","import {\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\n\nimport { createConnectionStateSnapshot } from \"../core/connection-state\";\nimport { RealtimeErrorEvent } from \"../core/errors\";\nimport { isWebSocketSupported } from \"../core/env\";\nimport { resolveUrlProvider } from \"../core/url\";\nimport { useHeartbeat } from \"./useHeartbeat\";\nimport { useReconnect } from \"./useReconnect\";\nimport { useStableCallback } from \"./useStableCallback\";\nimport { useWebSocketController } from \"./useWebSocketController\";\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 JSON.stringify(protocols);\n};\n\nconst parseProtocolsDependency = (\n protocolsDependency: string\n): string | string[] | undefined =>\n protocolsDependency === \"\"\n ? undefined\n : JSON.parse(protocolsDependency) as string | string[];\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 const protocols = useMemo(\n () => parseProtocolsDependency(protocolsDependency),\n [protocolsDependency]\n );\n\n const socketRef = useRef<WebSocket | null>(null);\n const socketKeyRef = useRef<string | null>(null);\n const activeSocketEpochRef = useRef<number | null>(null);\n const closingSocketEpochRef = useRef<number | null>(null);\n const nextSocketEpochRef = useRef(0);\n const controller = useWebSocketController();\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 useInsertionEffect(() => {\n stateRef.current = state;\n });\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 RealtimeErrorEvent(\"heartbeat-timeout\", {\n kind: \"heartbeat-timeout\"\n }),\n \"heartbeat-timeout\"\n );\n onTimeout?.();\n };\n\n const onError = heartbeatConfig.onError;\n heartbeatHookOptions.onError = (error) => {\n const event = new RealtimeErrorEvent(\"heartbeat-error\", {\n cause: error,\n kind: \"heartbeat-error\"\n });\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 = useStableCallback((\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 isActiveSocketEvent = useStableCallback((socketEpoch: number) => {\n return activeSocketEpochRef.current === socketEpoch;\n });\n\n const shouldHandleSocketClose = useStableCallback((socketEpoch: number) => {\n return (\n activeSocketEpochRef.current === socketEpoch ||\n closingSocketEpochRef.current === socketEpoch\n );\n });\n\n const closeSocket = useStableCallback(\n (\n config: {\n code?: number | undefined;\n reason?: string | undefined;\n trackClose?: boolean;\n } = {}\n ) => {\n const socket = socketRef.current;\n const socketEpoch = activeSocketEpochRef.current;\n\n if (socket === null || socketEpoch === null) {\n return;\n }\n\n socketRef.current = null;\n socketKeyRef.current = null;\n activeSocketEpochRef.current = null;\n closingSocketEpochRef.current = config.trackClose ? socketEpoch : null;\n\n if (isSocketActive(socket)) {\n socket.close(config.code, config.reason);\n }\n }\n );\n\n const applyHeartbeatAction = useStableCallback(\n (\n action: WebSocketHeartbeatAction,\n error: Event,\n reconnectTrigger: \"heartbeat-timeout\" | \"error\"\n ) => {\n heartbeat.stop();\n options.onError?.(error);\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 const socket = socketRef.current;\n\n if (socket === null || !isSocketActive(socket)) {\n controller.noteHeartbeatNoActiveSocket({ error, shouldReconnect });\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 controller.noteHeartbeatActiveSocketClose({\n error,\n reconnectTrigger: shouldReconnect ? reconnectTrigger : null\n });\n closeSocket({ trackClose: true });\n }\n );\n\n const parseMessage = useStableCallback((event: MessageEvent<unknown>) => {\n const parser = options.parseMessage ?? defaultParseMessage<TIncoming>;\n return parser(event);\n });\n\n const updateBufferedAmount = useStableCallback(() => {\n commitState((current) => ({\n ...current,\n bufferedAmount: socketRef.current?.bufferedAmount ?? 0\n }));\n });\n\n const handleOpen = useStableCallback((event: Event, socket: WebSocket) => {\n controller.noteSocketOpened();\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 = useStableCallback((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 (error) {\n const parseError = new RealtimeErrorEvent(\"error\", {\n cause: error,\n kind: \"parse-error\"\n });\n controller.noteParseError(parseError);\n reconnect.cancel();\n heartbeat.stop();\n options.onError?.(parseError);\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: parseError,\n status: \"error\"\n }));\n closeSocket({\n code: 1003,\n reason: \"parse-error\",\n trackClose: true\n });\n }\n });\n\n const handleError = useStableCallback((event: Event, socketEpoch: number) => {\n if (!isActiveSocketEvent(socketEpoch)) {\n return;\n }\n\n heartbeat.stop();\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: event,\n status: \"error\"\n }));\n\n options.onError?.(event);\n });\n\n const handleClose = useStableCallback((event: CloseEvent, socketEpoch: number) => {\n if (!shouldHandleSocketClose(socketEpoch)) {\n return;\n }\n\n if (activeSocketEpochRef.current === socketEpoch) {\n socketRef.current = null;\n socketKeyRef.current = null;\n activeSocketEpochRef.current = null;\n }\n\n if (closingSocketEpochRef.current === socketEpoch) {\n closingSocketEpochRef.current = null;\n }\n\n heartbeat.stop();\n updateBufferedAmount();\n const pendingCloseAction = controller.consumePendingCloseAction();\n const terminalError = controller.peekTerminalError();\n const skipCloseReconnect = controller.consumeSkipNextCloseReconnect();\n\n if (pendingCloseAction !== null) {\n controller.clearReconnectSuppression();\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 controller.clearReconnectSuppression();\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 !controller.isReconnectSuppressed() &&\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 controller.clearReconnectSuppression();\n }\n });\n\n const open = useStableCallback((): void => {\n controller.noteUserOpenRequested();\n reconnect.cancel();\n setOpenNonce((current) => current + 1);\n });\n\n const reconnectNow = useStableCallback((): void => {\n controller.noteUserReconnectRequested();\n heartbeat.stop();\n closeSocket();\n controller.noteUserReconnectClosed();\n reconnect.schedule(\"manual\");\n });\n\n const close = useStableCallback((code?: number, reason?: string): void => {\n controller.noteUserCloseRequested();\n reconnect.cancel();\n heartbeat.stop();\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status: \"closing\"\n }));\n\n closeSocket({\n code,\n reason,\n trackClose: true\n });\n });\n\n const send = useStableCallback((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 controller.peekTerminalError() === null &&\n ((connect && !controller.hasManualCloseRequested()) ||\n controller.hasManualOpenRequested() ||\n reconnect.status === \"running\");\n const nextSocketKey = `${resolvedUrl}::${protocolsDependency}::${options.binaryType ?? \"blob\"}`;\n\n if (!shouldConnect) {\n if (socketRef.current !== null) {\n controller.noteEffectInitiatedClose();\n closeSocket();\n }\n\n socketKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status:\n controller.peekTerminalError() !== null\n ? \"error\"\n : controller.hasManualCloseRequested()\n ? \"closed\"\n : \"idle\"\n }));\n return;\n }\n\n if (socketRef.current !== null && socketKeyRef.current !== nextSocketKey) {\n controller.noteEffectInitiatedClose();\n closeSocket();\n }\n\n if (socketRef.current !== null) {\n return;\n }\n\n // Commit `connecting` synchronously so consumer effects (status\n // observers, snapshot reducers) see the transition in the same React\n // commit as the call that triggered the connect attempt.\n commitState((current) => ({\n ...current,\n bufferedAmount: 0,\n lastChangedAt: Date.now(),\n status:\n reconnect.status === \"running\" || reconnect.status === \"scheduled\"\n ? \"reconnecting\"\n : \"connecting\"\n }));\n\n // Defer the actual `new WebSocket(...)` allocation by a microtask.\n // Under React Strict Mode in dev, the effect runs mount → cleanup →\n // mount synchronously; the cleanup below flips `cancelled` so the\n // discarded mount never opens a real socket. After the microtask\n // queue flushes, only the surviving mount instantiates the socket.\n let cancelled = false;\n let detachListeners: (() => void) | null = null;\n\n queueMicrotask(() => {\n if (cancelled) {\n return;\n }\n\n const socket = new WebSocket(resolvedUrl, protocols);\n const socketEpoch = nextSocketEpochRef.current + 1;\n socketRef.current = socket;\n socketKeyRef.current = nextSocketKey;\n activeSocketEpochRef.current = socketEpoch;\n closingSocketEpochRef.current = null;\n nextSocketEpochRef.current = socketEpoch;\n socket.binaryType = options.binaryType ?? \"blob\";\n\n commitState((current) => ({\n ...current,\n bufferedAmount: socket.bufferedAmount\n }));\n\n const handleSocketOpen = (event: Event): void => {\n if (!isActiveSocketEvent(socketEpoch)) {\n return;\n }\n\n handleOpen(event, socket);\n };\n const handleSocketMessage = (event: MessageEvent<unknown>): void => {\n if (!isActiveSocketEvent(socketEpoch)) {\n return;\n }\n\n handleMessage(event);\n };\n const handleSocketError = (event: Event): void => {\n handleError(event, socketEpoch);\n };\n const handleSocketClose = (event: CloseEvent): void => {\n handleClose(event, socketEpoch);\n };\n\n socket.addEventListener(\"open\", handleSocketOpen);\n socket.addEventListener(\"message\", handleSocketMessage);\n socket.addEventListener(\"error\", handleSocketError);\n socket.addEventListener(\"close\", handleSocketClose);\n\n detachListeners = () => {\n socket.removeEventListener(\"open\", handleSocketOpen);\n socket.removeEventListener(\"message\", handleSocketMessage);\n socket.removeEventListener(\"error\", handleSocketError);\n socket.removeEventListener(\"close\", handleSocketClose);\n };\n });\n\n return () => {\n cancelled = true;\n detachListeners?.();\n };\n }, [\n closeSocket,\n commitState,\n connect,\n controller,\n handleClose,\n handleError,\n handleMessage,\n handleOpen,\n isActiveSocketEvent,\n openNonce,\n options.binaryType,\n protocols,\n protocolsDependency,\n reconnect.status,\n resolvedUrl,\n supported\n ]);\n\n useEffect(() => () => {\n controller.noteEffectInitiatedClose();\n socketKeyRef.current = null;\n activeSocketEpochRef.current = null;\n closingSocketEpochRef.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 }, [controller]);\n\n const stopHeartbeat = heartbeat.stop;\n\n useEffect(() => {\n if (state.status !== \"open\") {\n stopHeartbeat();\n }\n }, [state.status, stopHeartbeat]);\n\n // `WebSocket.bufferedAmount` does not fire any event when bytes\n // drain to the network. Without polling, `state.bufferedAmount`\n // would only refresh when the consumer calls `send(...)`, when a\n // message arrives, or when the socket transitions to `open`. Opt-in\n // polling (`bufferedAmountPolling`) gives consumers a real-time view\n // for backpressure UIs.\n const rawBufferedAmountPolling = options.bufferedAmountPolling;\n const bufferedAmountPollingMode: \"raf\" | number | null = useMemo(() => {\n if (rawBufferedAmountPolling === undefined || rawBufferedAmountPolling === false) {\n return null;\n }\n\n if (rawBufferedAmountPolling === true) {\n return 100;\n }\n\n if (rawBufferedAmountPolling === \"raf\") {\n return \"raf\";\n }\n\n const intervalMs = rawBufferedAmountPolling.intervalMs;\n\n return Number.isFinite(intervalMs) && intervalMs > 0 ? intervalMs : null;\n }, [rawBufferedAmountPolling]);\n\n const pollBufferedAmount = useStableCallback(() => {\n const socket = socketRef.current;\n\n if (socket === null) {\n return;\n }\n\n const next = socket.bufferedAmount;\n\n if (stateRef.current.bufferedAmount === next) {\n return;\n }\n\n commitState((current) => ({\n ...current,\n bufferedAmount: next\n }));\n });\n\n useEffect(() => {\n if (bufferedAmountPollingMode === null) {\n return;\n }\n\n if (state.status !== \"open\") {\n return;\n }\n\n if (bufferedAmountPollingMode === \"raf\") {\n if (typeof requestAnimationFrame !== \"function\") {\n return;\n }\n\n let frame = requestAnimationFrame(function loop() {\n pollBufferedAmount();\n frame = requestAnimationFrame(loop);\n });\n\n return () => {\n cancelAnimationFrame(frame);\n };\n }\n\n const intervalId = setInterval(pollBufferedAmount, bufferedAmountPollingMode);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [bufferedAmountPollingMode, state.status, pollBufferedAmount]);\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 {\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\n\nimport { createConnectionStateSnapshot } from \"../core/connection-state\";\nimport { RealtimeErrorEvent } from \"../core/errors\";\nimport { isEventSourceSupported } from \"../core/env\";\nimport { resolveUrlProvider } from \"../core/url\";\nimport { useReconnect } from \"./useReconnect\";\nimport { useStableCallback } from \"./useStableCallback\";\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 normalizeNamedEvents = (\n events: readonly string[] | undefined\n): string[] => {\n if (events === undefined || events.length === 0) {\n return [];\n }\n\n return [...new Set(events)]\n .filter((eventName) => eventName !== \"message\")\n .sort();\n};\n\nconst toEventsDependency = (events: readonly string[] | undefined): string =>\n JSON.stringify(normalizeNamedEvents(events));\n\nconst parseEventsDependency = (eventsDependency: string): string[] =>\n JSON.parse(eventsDependency) as string[];\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 () => parseEventsDependency(eventsDependency),\n [eventsDependency]\n );\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const eventSourceKeyRef = useRef<string | null>(null);\n const activeEventSourceEpochRef = useRef<number | null>(null);\n const nextEventSourceEpochRef = useRef(0);\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 useInsertionEffect(() => {\n stateRef.current = state;\n });\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 = useStableCallback((\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 = useStableCallback(() => {\n const source = eventSourceRef.current;\n\n if (source === null) {\n return;\n }\n\n eventSourceRef.current = null;\n eventSourceKeyRef.current = null;\n activeEventSourceEpochRef.current = null;\n source.close();\n });\n\n const isActiveEventSourceEvent = useStableCallback((sourceEpoch: number) => {\n return activeEventSourceEpochRef.current === sourceEpoch;\n });\n\n const parseMessage = useStableCallback((event: MessageEvent<string>) => {\n const parser = options.parseMessage ?? defaultParseMessage<TMessage>;\n return parser(event);\n });\n\n const handleOpen = useStableCallback((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 = useStableCallback(\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 (error) {\n const parseError = new RealtimeErrorEvent(\"error\", {\n cause: error,\n kind: \"parse-error\"\n });\n terminalErrorRef.current = parseError;\n manualOpenRef.current = false;\n suppressReconnectRef.current = true;\n reconnect.cancel();\n closeEventSource();\n options.onError?.(parseError);\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: parseError,\n status: \"error\"\n }));\n }\n }\n );\n\n const handleError = useStableCallback((\n event: Event,\n source: EventSource,\n sourceEpoch: number\n ) => {\n if (!isActiveEventSourceEvent(sourceEpoch)) {\n return;\n }\n\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 commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: event,\n status: shouldReconnect ? \"reconnecting\" : \"closed\"\n }));\n\n options.onError?.(event);\n\n if (!shouldReconnect) {\n suppressReconnectRef.current = false;\n closeEventSource();\n return;\n }\n\n closeEventSource();\n reconnect.schedule(\"error\");\n });\n\n const open = useStableCallback((): 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 = useStableCallback((): 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 = useStableCallback((): 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 (reconnect.status === \"running\" ||\n (reconnect.status !== \"scheduled\" &&\n ((connect && !manualCloseRef.current) || manualOpenRef.current)));\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 // Commit `connecting` synchronously so consumer effects (status\n // observers, snapshot reducers) see the transition in the same React\n // commit as the call that triggered the connect attempt.\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 // Defer the actual `new EventSource(...)` allocation by a microtask.\n // Under React Strict Mode in dev, the effect runs mount → cleanup →\n // mount synchronously; the cleanup below flips `cancelled` so the\n // discarded mount never opens a real source. After the microtask\n // queue flushes, only the surviving mount instantiates the source.\n let cancelled = false;\n let detachListeners: (() => void) | null = null;\n\n queueMicrotask(() => {\n if (cancelled) {\n return;\n }\n\n const source = new EventSource(resolvedUrl, {\n withCredentials: options.withCredentials ?? false\n });\n const sourceEpoch = nextEventSourceEpochRef.current + 1;\n\n eventSourceRef.current = source;\n eventSourceKeyRef.current = nextEventSourceKey;\n activeEventSourceEpochRef.current = sourceEpoch;\n nextEventSourceEpochRef.current = sourceEpoch;\n\n const handleSourceOpen = (event: Event): void => {\n if (!isActiveEventSourceEvent(sourceEpoch)) {\n return;\n }\n\n handleOpen(event, source);\n };\n const handleSourceMessage = (event: Event): void => {\n if (!isActiveEventSourceEvent(sourceEpoch)) {\n return;\n }\n\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, sourceEpoch);\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 if (!isActiveEventSourceEvent(sourceEpoch)) {\n return;\n }\n\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 detachListeners = () => {\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\n return () => {\n cancelled = true;\n detachListeners?.();\n };\n }, [\n closeEventSource,\n commitParsedMessage,\n commitState,\n connect,\n eventsDependency,\n handleError,\n handleOpen,\n isActiveEventSourceEvent,\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 activeEventSourceEpochRef.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"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/env.ts","../src/hooks/useOnlineStatus.ts","../src/hooks/usePageVisibility.ts","../src/core/timers.ts","../src/hooks/useConnectionGate.ts","../src/core/reconnect.ts","../src/hooks/useStableCallback.ts","../src/hooks/useReconnect.ts","../src/hooks/useHeartbeat.ts","../src/core/connection-state.ts","../src/core/errors.ts","../src/core/url.ts","../src/hooks/useWebSocketController.ts","../src/hooks/useWebSocket.ts","../src/hooks/useEventSource.ts"],"names":["useSyncExternalStore","useRef","useState","useEffect","createEmptyTransitionState","useInsertionEffect","useCallback","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 hasDocumentVisibilitySupport = (): boolean =>\n typeof document !== \"undefined\" && typeof document.visibilityState === \"string\";\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 readPageVisibility = (initialVisible = true): {\n isVisible: boolean;\n isSupported: boolean;\n visibilityState: DocumentVisibilityState | \"visible\";\n} => {\n if (!hasDocumentVisibilitySupport()) {\n return {\n isVisible: initialVisible,\n isSupported: false,\n visibilityState: initialVisible ? \"visible\" : \"hidden\"\n };\n }\n\n return {\n isVisible: document.visibilityState === \"visible\",\n isSupported: true,\n visibilityState: document.visibilityState\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 { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\n\nimport {\n hasDocumentVisibilitySupport,\n readPageVisibility\n} from \"../core/env\";\nimport type {\n UsePageVisibilityHook,\n UsePageVisibilityOptions,\n UsePageVisibilityResult\n} from \"../types/usePageVisibility\";\n\nconst subscribeToPageVisibility = (\n onStoreChange: () => void\n): (() => void) => {\n if (typeof document === \"undefined\" || !hasDocumentVisibilitySupport()) {\n return () => {};\n }\n\n document.addEventListener(\"visibilitychange\", onStoreChange);\n\n return () => {\n document.removeEventListener(\"visibilitychange\", onStoreChange);\n };\n};\n\nconst createEmptyTransitionState = (): Pick<\n UsePageVisibilityResult,\n \"lastChangedAt\" | \"becameVisibleAt\" | \"becameHiddenAt\"\n> => ({\n lastChangedAt: null,\n becameHiddenAt: null,\n becameVisibleAt: null\n});\n\nexport const usePageVisibility: UsePageVisibilityHook = (\n options: UsePageVisibilityOptions = {}\n) => {\n const initialVisible = options.initialVisible ?? true;\n const trackTransitions = options.trackTransitions ?? true;\n\n const visibilityState = useSyncExternalStore(\n subscribeToPageVisibility,\n () => readPageVisibility(initialVisible).visibilityState,\n () => (initialVisible ? \"visible\" : \"hidden\")\n );\n\n const isVisible = visibilityState === \"visible\";\n const previousVisibleRef = useRef(isVisible);\n const [transitions, setTransitions] = useState(createEmptyTransitionState);\n\n useEffect(() => {\n if (!trackTransitions) {\n previousVisibleRef.current = isVisible;\n setTransitions(createEmptyTransitionState);\n return;\n }\n\n if (previousVisibleRef.current === isVisible) {\n return;\n }\n\n const changedAt = Date.now();\n previousVisibleRef.current = isVisible;\n\n setTransitions((current) => ({\n lastChangedAt: changedAt,\n becameHiddenAt: isVisible ? current.becameHiddenAt : changedAt,\n becameVisibleAt: isVisible ? changedAt : current.becameVisibleAt\n }));\n }, [isVisible, trackTransitions]);\n\n return {\n isSupported: hasDocumentVisibilitySupport(),\n isVisible,\n visibilityState,\n ...transitions\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 { useEffect, useRef, useState } from \"react\";\n\nimport { createManagedTimeout } from \"../core/timers\";\nimport { useOnlineStatus } from \"./useOnlineStatus\";\nimport { usePageVisibility } from \"./usePageVisibility\";\nimport type {\n ConnectionGateReason,\n UseConnectionGateHook,\n UseConnectionGateResult\n} from \"../types/useConnectionGate\";\n\ntype ConnectionGateTransitionState = Pick<\n UseConnectionGateResult,\n \"becameBlockedAt\" | \"becameReadyAt\" | \"lastChangedAt\"\n>;\n\nconst createEmptyTransitionState = (): ConnectionGateTransitionState => ({\n becameBlockedAt: null,\n becameReadyAt: null,\n lastChangedAt: null\n});\n\nconst normalizeHiddenGraceMs = (value: number | undefined): number => {\n if (value === undefined || !Number.isFinite(value)) {\n return 0;\n }\n\n return Math.max(0, value);\n};\n\nexport const useConnectionGate: UseConnectionGateHook = (options = {}) => {\n const enabled = options.enabled ?? true;\n const requireOnline = options.requireOnline ?? true;\n const requireVisible = options.requireVisible ?? false;\n const hiddenGraceMs = normalizeHiddenGraceMs(options.hiddenGraceMs);\n const trackTransitions = options.trackTransitions ?? true;\n const onlineStatus = useOnlineStatus({\n ...(options.initialOnline === undefined\n ? {}\n : { initialOnline: options.initialOnline }),\n trackTransitions: false\n });\n const pageVisibility = usePageVisibility({\n ...(options.initialVisible === undefined\n ? {}\n : { initialVisible: options.initialVisible }),\n trackTransitions: false\n });\n const hiddenGraceTimeoutRef = useRef(createManagedTimeout());\n const hiddenSinceRef = useRef<number | null>(null);\n const previousStateRef = useRef<{\n connect: boolean;\n reason: ConnectionGateReason;\n } | null>(null);\n const [hasExceededHiddenGrace, setHasExceededHiddenGrace] = useState(false);\n const [isWaitingForVisibleGrace, setIsWaitingForVisibleGrace] = useState(false);\n const [transitions, setTransitions] = useState(createEmptyTransitionState);\n\n useEffect(() => () => {\n hiddenGraceTimeoutRef.current.cancel();\n }, []);\n\n useEffect(() => {\n hiddenGraceTimeoutRef.current.cancel();\n\n if (!requireVisible || pageVisibility.isVisible) {\n hiddenSinceRef.current = null;\n setHasExceededHiddenGrace(false);\n setIsWaitingForVisibleGrace(false);\n return;\n }\n\n const hiddenSince = hiddenSinceRef.current ?? Date.now();\n hiddenSinceRef.current = hiddenSince;\n\n if (hiddenGraceMs <= 0) {\n setHasExceededHiddenGrace(true);\n setIsWaitingForVisibleGrace(false);\n return;\n }\n\n const elapsedMs = Date.now() - hiddenSince;\n\n if (elapsedMs >= hiddenGraceMs) {\n setHasExceededHiddenGrace(true);\n setIsWaitingForVisibleGrace(false);\n return;\n }\n\n setHasExceededHiddenGrace(false);\n setIsWaitingForVisibleGrace(true);\n hiddenGraceTimeoutRef.current.schedule(() => {\n setHasExceededHiddenGrace(true);\n setIsWaitingForVisibleGrace(false);\n }, hiddenGraceMs - elapsedMs);\n }, [hiddenGraceMs, pageVisibility.isVisible, requireVisible]);\n\n let reason: ConnectionGateReason = \"ready\";\n\n if (!enabled) {\n reason = \"manual\";\n } else if (requireOnline && !onlineStatus.isOnline) {\n reason = \"offline\";\n } else if (\n requireVisible &&\n !pageVisibility.isVisible &&\n hasExceededHiddenGrace\n ) {\n reason = \"hidden\";\n }\n\n const connect = reason === \"ready\";\n const isBlocked = !connect;\n\n useEffect(() => {\n if (!trackTransitions) {\n previousStateRef.current = {\n connect,\n reason\n };\n setTransitions(createEmptyTransitionState);\n return;\n }\n\n const previousState = previousStateRef.current;\n\n if (previousState === null) {\n previousStateRef.current = {\n connect,\n reason\n };\n return;\n }\n\n if (\n previousState.connect === connect &&\n previousState.reason === reason\n ) {\n return;\n }\n\n const changedAt = Date.now();\n previousStateRef.current = {\n connect,\n reason\n };\n\n setTransitions((current) => ({\n becameBlockedAt: connect ? current.becameBlockedAt : changedAt,\n becameReadyAt: connect ? changedAt : current.becameReadyAt,\n lastChangedAt: changedAt\n }));\n }, [connect, reason, trackTransitions]);\n\n return {\n becameBlockedAt: transitions.becameBlockedAt,\n becameReadyAt: transitions.becameReadyAt,\n connect,\n isBlocked,\n isOnline: onlineStatus.isOnline,\n isOnlineSupported: onlineStatus.isSupported,\n isVisibilitySupported: pageVisibility.isSupported,\n isVisible: pageVisibility.isVisible,\n isWaitingForVisibleGrace,\n lastChangedAt: transitions.lastChangedAt,\n reason,\n visibilityState: pageVisibility.visibilityState\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: 10,\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:\n options?.maxAttempts === undefined\n ? DEFAULT_RECONNECT_OPTIONS.maxAttempts\n : 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","import { useCallback, useInsertionEffect, useRef } from \"react\";\n\n/**\n * Returns a referentially stable wrapper around `callback` that always\n * invokes the most recent version of the function passed in.\n *\n * The latest reference is committed via `useInsertionEffect` instead of\n * being mutated during render. Mutating refs during render is unsafe\n * under concurrent rendering: a render may be discarded after writing\n * to the ref, leaving the ref out of sync with the committed tree.\n * `useInsertionEffect` runs synchronously after commit, before any\n * layout effect or paint, so the ref always matches the committed\n * callback by the time any effect, event handler, or subscription\n * reads from it.\n *\n * The returned wrapper itself never changes identity, which makes it\n * safe to pass into `useEffect` dependency arrays or to add as an\n * event listener without forcing teardown on every render.\n *\n * Note: the returned wrapper must not be invoked during render. It is\n * intended for event handlers, effects, and subscription callbacks.\n */\nexport const useStableCallback = <TArgs extends unknown[], TResult>(\n callback: (...args: TArgs) => TResult\n): ((...args: TArgs) => TResult) => {\n const callbackRef = useRef(callback);\n\n useInsertionEffect(() => {\n callbackRef.current = callback;\n });\n\n return useCallback((...args: TArgs) => callbackRef.current(...args), []);\n};\n","import { useEffect, useInsertionEffect, useRef, useState } from \"react\";\n\nimport {\n createReconnectAttempt,\n normalizeReconnectOptions\n} from \"../core/reconnect\";\nimport { createManagedTimeout } from \"../core/timers\";\nimport { useStableCallback } from \"./useStableCallback\";\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 useInsertionEffect(() => {\n stateRef.current = state;\n });\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 // `status` is a control signal read by `useEffect` dependencies in\n // `useWebSocket` / `useEventSource`. It must commit at the default\n // priority so the consumer effect runs in the same React commit as\n // the timer callback that triggered the transition; deprioritizing\n // it via `startTransition` opens a window where the transport sees\n // a stale status while higher-priority updates render.\n setState(resolved);\n };\n\n const runAttempt = useStableCallback((attempt: number) => {\n commitState({\n attempt,\n nextDelayMs: null,\n status: \"running\"\n });\n });\n\n const emitSchedule = useStableCallback((attempt: ReconnectAttempt) => {\n normalizedOptions.onSchedule?.(attempt);\n });\n\n const emitCancel = useStableCallback(() => {\n normalizedOptions.onCancel?.();\n });\n\n const emitReset = useStableCallback(() => {\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 = useStableCallback((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 = useStableCallback((): 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 = useStableCallback((): void => {\n timeoutRef.current.cancel();\n lastDelayRef.current = null;\n commitState(createInitialState(normalizedOptions.enabled));\n emitReset();\n });\n\n const markConnected = useStableCallback((): 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, useInsertionEffect, useRef, useState } from \"react\";\n\nimport {\n createManagedInterval,\n createManagedTimeout\n} from \"../core/timers\";\nimport { useStableCallback } from \"./useStableCallback\";\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\n/**\n * Default ack timeout in milliseconds. Picked so the hook surfaces a stalled\n * connection without spamming `onTimeout` during transient lag. Set\n * `timeoutMs: null` on a hook to opt out of timeouts entirely.\n */\nexport const DEFAULT_HEARTBEAT_TIMEOUT_MS = 10_000;\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 useInsertionEffect(() => {\n stateRef.current = state;\n });\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 = useStableCallback(() => {\n commitState((current) => ({\n ...current,\n hasTimedOut: true\n }));\n options.onTimeout?.();\n });\n\n const scheduleTimeout = useStableCallback(() => {\n const timeoutMs =\n options.timeoutMs === undefined ? DEFAULT_HEARTBEAT_TIMEOUT_MS : options.timeoutMs;\n\n if (timeoutMs === null) {\n timeoutRef.current.cancel();\n return;\n }\n\n timeoutRef.current.schedule(() => {\n handleTimeout();\n }, timeoutMs);\n });\n\n const handleBeatSuccess = useStableCallback((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 = useStableCallback((error: unknown) => {\n timeoutRef.current.cancel();\n options.onError?.(error);\n });\n\n const runBeat = useStableCallback(() => {\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 = useStableCallback((): 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 = useStableCallback((): void => {\n generationRef.current += 1;\n intervalRef.current.cancel();\n timeoutRef.current.cancel();\n commitState(createInitialState(false));\n });\n\n const beat = useStableCallback((): void => {\n if (!enabled) {\n return;\n }\n\n runBeat();\n });\n\n const notifyAck = useStableCallback((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, start, startOnMount, stop]);\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","export type RealtimeErrorKind =\n | \"heartbeat-error\"\n | \"heartbeat-timeout\"\n | \"parse-error\";\n\nexport interface RealtimeErrorEventInit extends EventInit {\n cause?: unknown;\n kind: RealtimeErrorKind;\n}\n\nexport class RealtimeErrorEvent extends Event {\n readonly cause: unknown;\n readonly kind: RealtimeErrorKind;\n\n constructor(type: string, init: RealtimeErrorEventInit) {\n super(type, init);\n this.cause = init.cause;\n this.kind = init.kind;\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 { useRef } from \"react\";\n\nimport type { ReconnectTrigger } from \"../types/useReconnect\";\n\n/**\n * Latched description of what the next observed `close` event should\n * commit, generated by the heartbeat path when an active socket exists\n * and we have to wait for the close to actually fire.\n */\nexport type WebSocketPendingCloseAction = {\n error: Event | null;\n reconnectTrigger: ReconnectTrigger | null;\n};\n\ntype ControllerState = {\n /**\n * The user explicitly called `close()`. Suppresses auto-reconnect on\n * the next deps-effect run unless cleared by `open()` / `reconnect()`.\n */\n manualClose: boolean;\n /**\n * The user explicitly called `open()` (or `reconnect()`). Forces the\n * deps-effect to connect even when `connect={false}`.\n */\n manualOpen: boolean;\n /**\n * Reconnect is suppressed for the close that is currently in flight.\n * Cleared by the close-handler once it has used the value, or by an\n * incoming `open` event.\n */\n reconnectSuppressed: boolean;\n /**\n * One-shot guard: the very next close should bypass the auto-reconnect\n * decision entirely. Consumed by the close handler.\n */\n skipNextCloseReconnect: boolean;\n /**\n * Latched action that the close handler should commit when the close\n * fires. Set by the heartbeat path with an active socket. Consumed by\n * the close handler.\n */\n pendingCloseAction: WebSocketPendingCloseAction | null;\n /**\n * Sticky terminal error (e.g. parse-error). Survives until cleared by\n * a user action (`open()` / `close()` / `reconnect()`) or replaced by\n * a subsequent heartbeat result. Read by both the close handler and\n * the deps-effect.\n */\n terminalError: Event | null;\n};\n\nconst createInitialState = (): ControllerState => ({\n manualClose: false,\n manualOpen: false,\n pendingCloseAction: null,\n reconnectSuppressed: false,\n skipNextCloseReconnect: false,\n terminalError: null\n});\n\n/**\n * Imperative control-plane state for `useWebSocket`. Consolidates the\n * six interacting mutable booleans/refs that previously lived directly\n * inside the hook into a single object whose transitions are exposed\n * through named methods.\n *\n * Behaviour is intentionally identical to the previous pile of refs;\n * this is a pure refactor that makes the control flow easier to read\n * and review. None of the methods cause renders -- the controller is\n * stored in a single `useRef`, not in React state.\n */\nexport type WebSocketController = {\n /** Did the user explicitly call `close()` and not `open()` since? */\n hasManualCloseRequested: () => boolean;\n /** Did the user explicitly call `open()` (or `reconnect()`) and not `close()` since? */\n hasManualOpenRequested: () => boolean;\n /** Sticky terminal error, or `null`. Non-destructive read. */\n peekTerminalError: () => Event | null;\n /** Should the close currently in flight skip auto-reconnect? */\n isReconnectSuppressed: () => boolean;\n\n /** `open()` was called. */\n noteUserOpenRequested: () => void;\n /** `close()` was called, before `closeSocket(trackClose)` runs. */\n noteUserCloseRequested: () => void;\n /** `reconnect()` was called, before the controlled close runs. */\n noteUserReconnectRequested: () => void;\n /** `reconnect()`'s controlled close has finished, before scheduling. */\n noteUserReconnectClosed: () => void;\n\n /** Socket fired `open`; clear all manual / suppress / terminal flags. */\n noteSocketOpened: () => void;\n\n /**\n * Heartbeat decided to act, but no active socket is around to close.\n * Sets the terminal error iff the action is not a reconnect.\n */\n noteHeartbeatNoActiveSocket: (input: {\n shouldReconnect: boolean;\n error: Event;\n }) => void;\n /**\n * Heartbeat decided to act and there is an active socket: latch a\n * pending close action and prepare both reconnect guards.\n */\n noteHeartbeatActiveSocketClose: (input: WebSocketPendingCloseAction) => void;\n\n /** Parser threw; latch a terminal error and prepare both guards. */\n noteParseError: (error: Event) => void;\n\n /**\n * The deps-effect itself initiated a close because the URL changed,\n * `connect` became false, or the runtime is unsupported. The next\n * close should not auto-reconnect.\n */\n noteEffectInitiatedClose: () => void;\n\n /** Consume the latched pending action, clearing it. */\n consumePendingCloseAction: () => WebSocketPendingCloseAction | null;\n /** Consume the one-shot skip flag, clearing it. */\n consumeSkipNextCloseReconnect: () => boolean;\n /** Reset the imminent-close suppression after the close has been processed. */\n clearReconnectSuppression: () => void;\n};\n\nexport const useWebSocketController = (): WebSocketController => {\n const ref = useRef<ControllerState | null>(null);\n\n if (ref.current === null) {\n ref.current = createInitialState();\n }\n\n const state = ref.current;\n\n const controllerRef = useRef<WebSocketController | null>(null);\n\n if (controllerRef.current === null) {\n controllerRef.current = {\n clearReconnectSuppression: () => {\n state.reconnectSuppressed = false;\n },\n consumePendingCloseAction: () => {\n const action = state.pendingCloseAction;\n state.pendingCloseAction = null;\n return action;\n },\n consumeSkipNextCloseReconnect: () => {\n const skip = state.skipNextCloseReconnect;\n state.skipNextCloseReconnect = false;\n return skip;\n },\n hasManualCloseRequested: () => state.manualClose,\n hasManualOpenRequested: () => state.manualOpen,\n isReconnectSuppressed: () => state.reconnectSuppressed,\n noteEffectInitiatedClose: () => {\n state.reconnectSuppressed = true;\n },\n noteHeartbeatActiveSocketClose: (input) => {\n state.manualOpen = false;\n state.terminalError =\n input.reconnectTrigger === null ? input.error : null;\n state.pendingCloseAction = input;\n state.skipNextCloseReconnect = true;\n state.reconnectSuppressed = true;\n },\n noteHeartbeatNoActiveSocket: ({ shouldReconnect, error }) => {\n state.manualOpen = false;\n state.terminalError = shouldReconnect ? null : error;\n },\n noteParseError: (error) => {\n state.terminalError = error;\n state.manualOpen = false;\n state.skipNextCloseReconnect = true;\n state.reconnectSuppressed = true;\n },\n noteSocketOpened: () => {\n state.manualClose = false;\n state.manualOpen = false;\n state.reconnectSuppressed = false;\n state.terminalError = null;\n },\n noteUserCloseRequested: () => {\n state.manualClose = true;\n state.manualOpen = false;\n state.reconnectSuppressed = true;\n state.terminalError = null;\n },\n noteUserOpenRequested: () => {\n state.manualClose = false;\n state.manualOpen = true;\n state.reconnectSuppressed = false;\n state.terminalError = null;\n },\n noteUserReconnectClosed: () => {\n state.reconnectSuppressed = false;\n },\n noteUserReconnectRequested: () => {\n state.manualClose = false;\n state.manualOpen = true;\n state.skipNextCloseReconnect = true;\n state.reconnectSuppressed = true;\n state.terminalError = null;\n },\n peekTerminalError: () => state.terminalError\n };\n }\n\n return controllerRef.current;\n};\n","import {\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\n\nimport { createConnectionStateSnapshot } from \"../core/connection-state\";\nimport { RealtimeErrorEvent } from \"../core/errors\";\nimport { isWebSocketSupported } from \"../core/env\";\nimport { resolveUrlProvider } from \"../core/url\";\nimport { useHeartbeat } from \"./useHeartbeat\";\nimport { useReconnect } from \"./useReconnect\";\nimport { useStableCallback } from \"./useStableCallback\";\nimport { useWebSocketController } from \"./useWebSocketController\";\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 JSON.stringify(protocols);\n};\n\nconst parseProtocolsDependency = (\n protocolsDependency: string\n): string | string[] | undefined =>\n protocolsDependency === \"\"\n ? undefined\n : JSON.parse(protocolsDependency) as string | string[];\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 const protocols = useMemo(\n () => parseProtocolsDependency(protocolsDependency),\n [protocolsDependency]\n );\n\n const socketRef = useRef<WebSocket | null>(null);\n const socketKeyRef = useRef<string | null>(null);\n const activeSocketEpochRef = useRef<number | null>(null);\n const closingSocketEpochRef = useRef<number | null>(null);\n const nextSocketEpochRef = useRef(0);\n const controller = useWebSocketController();\n const [openNonce, setOpenNonce] = useState(0);\n const initialStatus: WebSocketState<TIncoming>[\"status\"] =\n !supported || resolvedUrl === null\n ? \"closed\"\n : connect\n ? \"connecting\"\n : \"idle\";\n const [state, setState] = useState<WebSocketState<TIncoming>>(() =>\n createInitialState(initialStatus)\n );\n const stateRef = useRef(state);\n useInsertionEffect(() => {\n stateRef.current = state;\n });\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 ?? null;\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 RealtimeErrorEvent(\"heartbeat-timeout\", {\n kind: \"heartbeat-timeout\"\n }),\n \"heartbeat-timeout\"\n );\n onTimeout?.();\n };\n\n const onError = heartbeatConfig.onError;\n heartbeatHookOptions.onError = (error) => {\n const event = new RealtimeErrorEvent(\"heartbeat-error\", {\n cause: error,\n kind: \"heartbeat-error\"\n });\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 = useStableCallback((\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 isActiveSocketEvent = useStableCallback((socketEpoch: number) => {\n return activeSocketEpochRef.current === socketEpoch;\n });\n\n const shouldHandleSocketClose = useStableCallback((socketEpoch: number) => {\n return (\n activeSocketEpochRef.current === socketEpoch ||\n closingSocketEpochRef.current === socketEpoch\n );\n });\n\n const closeSocket = useStableCallback(\n (\n config: {\n code?: number | undefined;\n reason?: string | undefined;\n trackClose?: boolean;\n } = {}\n ) => {\n const socket = socketRef.current;\n const socketEpoch = activeSocketEpochRef.current;\n\n if (socket === null || socketEpoch === null) {\n return;\n }\n\n socketRef.current = null;\n socketKeyRef.current = null;\n activeSocketEpochRef.current = null;\n closingSocketEpochRef.current = config.trackClose ? socketEpoch : null;\n\n if (isSocketActive(socket)) {\n socket.close(config.code, config.reason);\n }\n }\n );\n\n const applyHeartbeatAction = useStableCallback(\n (\n action: WebSocketHeartbeatAction,\n error: Event,\n reconnectTrigger: \"heartbeat-timeout\" | \"error\"\n ) => {\n heartbeat.stop();\n options.onError?.(error);\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 const socket = socketRef.current;\n\n if (socket === null || !isSocketActive(socket)) {\n controller.noteHeartbeatNoActiveSocket({ error, shouldReconnect });\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 controller.noteHeartbeatActiveSocketClose({\n error,\n reconnectTrigger: shouldReconnect ? reconnectTrigger : null\n });\n closeSocket({ trackClose: true });\n }\n );\n\n const parseMessage = useStableCallback((event: MessageEvent<unknown>) => {\n const parser = options.parseMessage ?? defaultParseMessage<TIncoming>;\n return parser(event);\n });\n\n const updateBufferedAmount = useStableCallback(() => {\n commitState((current) => ({\n ...current,\n bufferedAmount: socketRef.current?.bufferedAmount ?? 0\n }));\n });\n\n const handleOpen = useStableCallback((event: Event, socket: WebSocket) => {\n controller.noteSocketOpened();\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 = useStableCallback((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 (error) {\n const parseError = new RealtimeErrorEvent(\"error\", {\n cause: error,\n kind: \"parse-error\"\n });\n controller.noteParseError(parseError);\n reconnect.cancel();\n heartbeat.stop();\n options.onError?.(parseError);\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: parseError,\n status: \"error\"\n }));\n closeSocket({\n code: 1003,\n reason: \"parse-error\",\n trackClose: true\n });\n }\n });\n\n const handleError = useStableCallback((event: Event, socketEpoch: number) => {\n if (!isActiveSocketEvent(socketEpoch)) {\n return;\n }\n\n heartbeat.stop();\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: event,\n status: \"error\"\n }));\n\n options.onError?.(event);\n });\n\n const handleClose = useStableCallback((event: CloseEvent, socketEpoch: number) => {\n if (!shouldHandleSocketClose(socketEpoch)) {\n return;\n }\n\n if (activeSocketEpochRef.current === socketEpoch) {\n socketRef.current = null;\n socketKeyRef.current = null;\n activeSocketEpochRef.current = null;\n }\n\n if (closingSocketEpochRef.current === socketEpoch) {\n closingSocketEpochRef.current = null;\n }\n\n heartbeat.stop();\n updateBufferedAmount();\n const pendingCloseAction = controller.consumePendingCloseAction();\n const terminalError = controller.peekTerminalError();\n const skipCloseReconnect = controller.consumeSkipNextCloseReconnect();\n\n if (pendingCloseAction !== null) {\n controller.clearReconnectSuppression();\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 controller.clearReconnectSuppression();\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 !controller.isReconnectSuppressed() &&\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 controller.clearReconnectSuppression();\n }\n });\n\n const open = useStableCallback((): void => {\n controller.noteUserOpenRequested();\n reconnect.cancel();\n setOpenNonce((current) => current + 1);\n });\n\n const reconnectNow = useStableCallback((): void => {\n controller.noteUserReconnectRequested();\n heartbeat.stop();\n closeSocket();\n controller.noteUserReconnectClosed();\n reconnect.schedule(\"manual\");\n });\n\n const close = useStableCallback((code?: number, reason?: string): void => {\n controller.noteUserCloseRequested();\n reconnect.cancel();\n heartbeat.stop();\n\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n status: \"closing\"\n }));\n\n closeSocket({\n code,\n reason,\n trackClose: true\n });\n });\n\n const send = useStableCallback((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 controller.peekTerminalError() === null &&\n ((connect && !controller.hasManualCloseRequested()) ||\n controller.hasManualOpenRequested() ||\n reconnect.status === \"running\");\n const nextSocketKey = `${resolvedUrl}::${protocolsDependency}::${options.binaryType ?? \"blob\"}`;\n\n if (!shouldConnect) {\n if (socketRef.current !== null) {\n controller.noteEffectInitiatedClose();\n closeSocket();\n }\n\n socketKeyRef.current = null;\n commitState((current) => ({\n ...current,\n status:\n controller.peekTerminalError() !== null\n ? \"error\"\n : controller.hasManualCloseRequested()\n ? \"closed\"\n : \"idle\"\n }));\n return;\n }\n\n if (socketRef.current !== null && socketKeyRef.current !== nextSocketKey) {\n controller.noteEffectInitiatedClose();\n closeSocket();\n }\n\n if (socketRef.current !== null) {\n return;\n }\n\n // Commit `connecting` synchronously so consumer effects (status\n // observers, snapshot reducers) see the transition in the same React\n // commit as the call that triggered the connect attempt.\n commitState((current) => ({\n ...current,\n bufferedAmount: 0,\n lastChangedAt: Date.now(),\n status:\n reconnect.status === \"running\" || reconnect.status === \"scheduled\"\n ? \"reconnecting\"\n : \"connecting\"\n }));\n\n // Defer the actual `new WebSocket(...)` allocation by a microtask.\n // Under React Strict Mode in dev, the effect runs mount → cleanup →\n // mount synchronously; the cleanup below flips `cancelled` so the\n // discarded mount never opens a real socket. After the microtask\n // queue flushes, only the surviving mount instantiates the socket.\n let cancelled = false;\n let detachListeners: (() => void) | null = null;\n\n queueMicrotask(() => {\n if (cancelled) {\n return;\n }\n\n const socket = new WebSocket(resolvedUrl, protocols);\n const socketEpoch = nextSocketEpochRef.current + 1;\n socketRef.current = socket;\n socketKeyRef.current = nextSocketKey;\n activeSocketEpochRef.current = socketEpoch;\n closingSocketEpochRef.current = null;\n nextSocketEpochRef.current = socketEpoch;\n socket.binaryType = options.binaryType ?? \"blob\";\n\n commitState((current) => ({\n ...current,\n bufferedAmount: socket.bufferedAmount\n }));\n\n const handleSocketOpen = (event: Event): void => {\n if (!isActiveSocketEvent(socketEpoch)) {\n return;\n }\n\n handleOpen(event, socket);\n };\n const handleSocketMessage = (event: MessageEvent<unknown>): void => {\n if (!isActiveSocketEvent(socketEpoch)) {\n return;\n }\n\n handleMessage(event);\n };\n const handleSocketError = (event: Event): void => {\n handleError(event, socketEpoch);\n };\n const handleSocketClose = (event: CloseEvent): void => {\n handleClose(event, socketEpoch);\n };\n\n socket.addEventListener(\"open\", handleSocketOpen);\n socket.addEventListener(\"message\", handleSocketMessage);\n socket.addEventListener(\"error\", handleSocketError);\n socket.addEventListener(\"close\", handleSocketClose);\n\n detachListeners = () => {\n socket.removeEventListener(\"open\", handleSocketOpen);\n socket.removeEventListener(\"message\", handleSocketMessage);\n socket.removeEventListener(\"error\", handleSocketError);\n socket.removeEventListener(\"close\", handleSocketClose);\n };\n });\n\n return () => {\n cancelled = true;\n detachListeners?.();\n };\n }, [\n closeSocket,\n commitState,\n connect,\n controller,\n handleClose,\n handleError,\n handleMessage,\n handleOpen,\n isActiveSocketEvent,\n openNonce,\n options.binaryType,\n protocols,\n protocolsDependency,\n reconnect.status,\n resolvedUrl,\n supported\n ]);\n\n useEffect(() => () => {\n controller.noteEffectInitiatedClose();\n socketKeyRef.current = null;\n activeSocketEpochRef.current = null;\n closingSocketEpochRef.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 }, [controller]);\n\n const stopHeartbeat = heartbeat.stop;\n\n useEffect(() => {\n if (state.status !== \"open\") {\n stopHeartbeat();\n }\n }, [state.status, stopHeartbeat]);\n\n // `WebSocket.bufferedAmount` does not fire any event when bytes\n // drain to the network. Without polling, `state.bufferedAmount`\n // would only refresh when the consumer calls `send(...)`, when a\n // message arrives, or when the socket transitions to `open`. Opt-in\n // polling (`bufferedAmountPolling`) gives consumers a real-time view\n // for backpressure UIs.\n const rawBufferedAmountPolling = options.bufferedAmountPolling;\n const bufferedAmountPollingMode: \"raf\" | number | null = useMemo(() => {\n if (rawBufferedAmountPolling === undefined || rawBufferedAmountPolling === false) {\n return null;\n }\n\n if (rawBufferedAmountPolling === true) {\n return 100;\n }\n\n if (rawBufferedAmountPolling === \"raf\") {\n return \"raf\";\n }\n\n const intervalMs = rawBufferedAmountPolling.intervalMs;\n\n return Number.isFinite(intervalMs) && intervalMs > 0 ? intervalMs : null;\n }, [rawBufferedAmountPolling]);\n\n const pollBufferedAmount = useStableCallback(() => {\n const socket = socketRef.current;\n\n if (socket === null) {\n return;\n }\n\n const next = socket.bufferedAmount;\n\n if (stateRef.current.bufferedAmount === next) {\n return;\n }\n\n commitState((current) => ({\n ...current,\n bufferedAmount: next\n }));\n });\n\n useEffect(() => {\n if (bufferedAmountPollingMode === null) {\n return;\n }\n\n if (state.status !== \"open\") {\n return;\n }\n\n if (bufferedAmountPollingMode === \"raf\") {\n if (typeof requestAnimationFrame !== \"function\") {\n return;\n }\n\n let frame = requestAnimationFrame(function loop() {\n pollBufferedAmount();\n frame = requestAnimationFrame(loop);\n });\n\n return () => {\n cancelAnimationFrame(frame);\n };\n }\n\n const intervalId = setInterval(pollBufferedAmount, bufferedAmountPollingMode);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [bufferedAmountPollingMode, state.status, pollBufferedAmount]);\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 {\n useEffect,\n useInsertionEffect,\n useMemo,\n useRef,\n useState\n} from \"react\";\n\nimport { createConnectionStateSnapshot } from \"../core/connection-state\";\nimport { RealtimeErrorEvent } from \"../core/errors\";\nimport { isEventSourceSupported } from \"../core/env\";\nimport { resolveUrlProvider } from \"../core/url\";\nimport { useReconnect } from \"./useReconnect\";\nimport { useStableCallback } from \"./useStableCallback\";\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 normalizeNamedEvents = (\n events: readonly string[] | undefined\n): string[] => {\n if (events === undefined || events.length === 0) {\n return [];\n }\n\n return [...new Set(events)]\n .filter((eventName) => eventName !== \"message\")\n .sort();\n};\n\nconst toEventsDependency = (events: readonly string[] | undefined): string =>\n JSON.stringify(normalizeNamedEvents(events));\n\nconst parseEventsDependency = (eventsDependency: string): string[] =>\n JSON.parse(eventsDependency) as string[];\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 () => parseEventsDependency(eventsDependency),\n [eventsDependency]\n );\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const eventSourceKeyRef = useRef<string | null>(null);\n const activeEventSourceEpochRef = useRef<number | null>(null);\n const nextEventSourceEpochRef = useRef(0);\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 initialStatus: EventSourceState<TMessage>[\"status\"] =\n !supported || resolvedUrl === null\n ? \"closed\"\n : connect\n ? \"connecting\"\n : \"idle\";\n const [state, setState] = useState<EventSourceState<TMessage>>(() =>\n createInitialState(initialStatus)\n );\n const stateRef = useRef(state);\n useInsertionEffect(() => {\n stateRef.current = state;\n });\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 = useStableCallback((\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 = useStableCallback(() => {\n const source = eventSourceRef.current;\n\n if (source === null) {\n return;\n }\n\n eventSourceRef.current = null;\n eventSourceKeyRef.current = null;\n activeEventSourceEpochRef.current = null;\n source.close();\n });\n\n const isActiveEventSourceEvent = useStableCallback((sourceEpoch: number) => {\n return activeEventSourceEpochRef.current === sourceEpoch;\n });\n\n const parseMessage = useStableCallback((event: MessageEvent<string>) => {\n const parser = options.parseMessage ?? defaultParseMessage<TMessage>;\n return parser(event);\n });\n\n const handleOpen = useStableCallback((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 = useStableCallback(\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 (error) {\n const parseError = new RealtimeErrorEvent(\"error\", {\n cause: error,\n kind: \"parse-error\"\n });\n terminalErrorRef.current = parseError;\n manualOpenRef.current = false;\n suppressReconnectRef.current = true;\n reconnect.cancel();\n closeEventSource();\n options.onError?.(parseError);\n commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: parseError,\n status: \"error\"\n }));\n }\n }\n );\n\n const handleError = useStableCallback((\n event: Event,\n source: EventSource,\n sourceEpoch: number\n ) => {\n if (!isActiveEventSourceEvent(sourceEpoch)) {\n return;\n }\n\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 commitState((current) => ({\n ...current,\n lastChangedAt: Date.now(),\n lastError: event,\n status: shouldReconnect ? \"reconnecting\" : \"closed\"\n }));\n\n options.onError?.(event);\n\n if (!shouldReconnect) {\n suppressReconnectRef.current = false;\n closeEventSource();\n return;\n }\n\n closeEventSource();\n reconnect.schedule(\"error\");\n });\n\n const open = useStableCallback((): 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 = useStableCallback((): 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 = useStableCallback((): 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 (reconnect.status === \"running\" ||\n (reconnect.status !== \"scheduled\" &&\n ((connect && !manualCloseRef.current) || manualOpenRef.current)));\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 // Commit `connecting` synchronously so consumer effects (status\n // observers, snapshot reducers) see the transition in the same React\n // commit as the call that triggered the connect attempt.\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 // Defer the actual `new EventSource(...)` allocation by a microtask.\n // Under React Strict Mode in dev, the effect runs mount → cleanup →\n // mount synchronously; the cleanup below flips `cancelled` so the\n // discarded mount never opens a real source. After the microtask\n // queue flushes, only the surviving mount instantiates the source.\n let cancelled = false;\n let detachListeners: (() => void) | null = null;\n\n queueMicrotask(() => {\n if (cancelled) {\n return;\n }\n\n const source = new EventSource(resolvedUrl, {\n withCredentials: options.withCredentials ?? false\n });\n const sourceEpoch = nextEventSourceEpochRef.current + 1;\n\n eventSourceRef.current = source;\n eventSourceKeyRef.current = nextEventSourceKey;\n activeEventSourceEpochRef.current = sourceEpoch;\n nextEventSourceEpochRef.current = sourceEpoch;\n\n const handleSourceOpen = (event: Event): void => {\n if (!isActiveEventSourceEvent(sourceEpoch)) {\n return;\n }\n\n handleOpen(event, source);\n };\n const handleSourceMessage = (event: Event): void => {\n if (!isActiveEventSourceEvent(sourceEpoch)) {\n return;\n }\n\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, sourceEpoch);\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 if (!isActiveEventSourceEvent(sourceEpoch)) {\n return;\n }\n\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 detachListeners = () => {\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\n return () => {\n cancelled = true;\n detachListeners?.();\n };\n }, [\n closeEventSource,\n commitParsedMessage,\n commitState,\n connect,\n eventsDependency,\n handleError,\n handleOpen,\n isActiveEventSourceEvent,\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 activeEventSourceEpochRef.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"]}
|