@emeryld/rrroutes-client 2.7.11 → 2.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/routesV3.client.batch.ts","../src/routesV3.client.fetch.ts","../src/routesV3.client.get.ts","../src/routesV3.client.shared.ts","../src/routesV3.client.infiniteGet.ts","../src/routesV3.client.mutation.ts","../src/routesV3.client.ts","../src/sockets/socket.client.context.provider.tsx","../src/sockets/socket.client.context.client.ts","../src/sockets/socket.client.context.connection.ts","../src/sockets/socket.client.context.debug.ts","../src/sockets/socket.client.sys.ts","../src/sockets/socket.client.core.ts","../src/sockets/socketedRoute/socket.client.helper.route.ts","../src/sockets/socketedRoute/socket.client.helper.debug.ts","../src/sockets/socketedRoute/socket.client.helper.rooms.ts"],"sourcesContent":["import {\n lowProfileParse,\n type AnyLeafLowProfile,\n type HttpMethod,\n} from '@emeryld/rrroutes-contract'\nimport {\n keepPreviousData,\n useQuery,\n type QueryClient,\n type QueryKey,\n} from '@tanstack/react-query'\nimport { useCallback, useRef } from 'react'\nimport type {\n BranchArgsInput,\n BranchBuildOptions,\n BranchFetchInput,\n BranchFetchOutput,\n BranchSetDataInput,\n BranchUseEndpointOptions,\n BuiltBranch,\n BuiltLeafMap,\n RouteClientFetch,\n} from './routesV3.client.types'\n\ntype BuildBatchBranchDeps = {\n fetchRaw: RouteClientFetch\n queryClient: QueryClient\n validateResponses: boolean\n getBuiltLeaf: (built: unknown) => AnyLeafLowProfile\n encodeLeafKey: (leaf: AnyLeafLowProfile) => string\n toArgsTuple: (args: unknown) => unknown[]\n}\n\nexport function buildBatchBranch<T extends BuiltLeafMap>(\n leaves: T,\n options: BranchBuildOptions,\n deps: BuildBatchBranchDeps,\n): BuiltBranch<T> {\n const {\n fetchRaw,\n queryClient,\n validateResponses,\n getBuiltLeaf,\n encodeLeafKey,\n toArgsTuple,\n } = deps\n\n const batchMethod = (options.method ?? 'POST') as\n | HttpMethod\n | Uppercase<HttpMethod>\n const defaultHeaders = options.headers\n\n const getQueryKeys = (input?: BranchArgsInput<T>) => {\n const out = {} as any\n const argsByLeaf = (input ?? {}) as BranchArgsInput<T>\n for (const [alias, built] of Object.entries(leaves)) {\n const args = argsByLeaf[alias as keyof T]\n out[alias] = (built as any).getQueryKeys(...toArgsTuple(args))\n }\n return out as BuiltBranch<T>['getQueryKeys'] extends (\n ...args: any[]\n ) => infer R\n ? R\n : never\n }\n\n const invalidateBranch = async (input?: BranchArgsInput<T>) => {\n const argsByLeaf = (input ?? {}) as BranchArgsInput<T>\n await Promise.all(\n Object.entries(leaves).map(([alias, built]) => {\n const args = argsByLeaf[alias as keyof T]\n return (built as any).invalidate(...toArgsTuple(args))\n }),\n )\n }\n\n const setDataBranch = (input: BranchSetDataInput<T>) => {\n const out = {} as any\n for (const [alias, def] of Object.entries(input)) {\n if (!def) continue\n const built = (leaves as Record<string, any>)[alias]\n if (!built) continue\n out[alias] = (built as any).setData(def.updater, ...toArgsTuple(def.args))\n }\n return out\n }\n\n const fetchBranch = async (\n input: BranchFetchInput<T>,\n ): Promise<BranchFetchOutput<T>> => {\n const payload: Record<\n string,\n {\n encodedLeaf: string\n params?: unknown\n query?: unknown\n body?: unknown\n }\n > = {}\n\n for (const [aliasRaw, built] of Object.entries(leaves)) {\n const leaf = getBuiltLeaf(built)\n const encodedLeaf = encodeLeafKey(leaf)\n\n const alias = aliasRaw as keyof T\n const branchInput = input[alias] as BranchFetchInput<T>[keyof T]\n const query = (branchInput as any)?.query\n const params = (branchInput as any)?.params\n const body = (branchInput as any)?.body\n\n payload[aliasRaw] = {\n encodedLeaf,\n ...(params !== undefined ? { params } : {}),\n ...(query !== undefined ? { query } : {}),\n ...(body !== undefined ? { body } : {}),\n }\n }\n\n const batchResponse = await fetchRaw({\n path: options.path,\n method: batchMethod,\n body: payload,\n headers: defaultHeaders,\n })\n\n const rawData = batchResponse.data\n if (!rawData || typeof rawData !== 'object' || Array.isArray(rawData)) {\n throw new Error(\n 'Batch response must be a plain object keyed by branch aliases.',\n )\n }\n\n const mapped = {} as BranchFetchOutput<T>\n for (const [aliasRaw, built] of Object.entries(leaves)) {\n if (!(aliasRaw in rawData)) {\n throw new Error(`Batch response missing alias \"${aliasRaw}\".`)\n }\n\n const leaf = getBuiltLeaf(built)\n const rawLeafData = (rawData as Record<string, unknown>)[aliasRaw]\n const parsedLeafData =\n validateResponses && leaf.cfg.outputSchema\n ? lowProfileParse(leaf.cfg.outputSchema, rawLeafData)\n : rawLeafData\n\n if (validateResponses && !leaf.cfg.outputSchema) {\n throw new Error(\n `No output schema defined for leaf ${leaf.method.toUpperCase()} ${leaf.path}, cannot validate batch response.`,\n )\n }\n\n ;(mapped as Record<string, unknown>)[aliasRaw] = parsedLeafData\n }\n\n return mapped\n }\n\n const useEndpoint = (\n input: BranchFetchInput<T>,\n rqOpts?: BranchUseEndpointOptions<T>,\n ) => {\n const queryKeys = getQueryKeys(input as unknown as BranchArgsInput<T>)\n const branchQueryKey = [\n 'batch',\n String(batchMethod).toLowerCase(),\n options.path,\n queryKeys,\n ] as unknown as QueryKey\n const { onReceive, ...useQueryOptions } = (rqOpts ??\n {}) as BranchUseEndpointOptions<T>\n\n const listenersRef = useRef(new Set<(data: BranchFetchOutput<T>) => void>())\n const notifyOnReceive = useCallback(\n (data: BranchFetchOutput<T>) => {\n onReceive?.(data)\n listenersRef.current.forEach((listener) => listener(data))\n },\n [onReceive],\n )\n const registerOnReceive = useCallback(\n (listener: (data: BranchFetchOutput<T>) => void) => {\n listenersRef.current.add(listener)\n return () => {\n listenersRef.current.delete(listener)\n }\n },\n [],\n )\n\n const queryResult = useQuery<\n BranchFetchOutput<T>,\n unknown,\n BranchFetchOutput<T>,\n QueryKey\n >(\n {\n ...(useQueryOptions as Omit<BranchUseEndpointOptions<T>, 'onReceive'>),\n queryKey: branchQueryKey,\n placeholderData: useQueryOptions.placeholderData ?? keepPreviousData,\n queryFn: async () => {\n const result = await fetchBranch(input)\n notifyOnReceive(result)\n return result\n },\n },\n queryClient,\n )\n\n return { ...queryResult, onReceive: registerOnReceive }\n }\n\n return {\n fetch: fetchBranch,\n useEndpoint,\n getQueryKeys,\n invalidate: invalidateBranch,\n setData: setDataBranch as BuiltBranch<T>['setData'],\n }\n}\n","// routesV3.client.fetch.ts\n\nimport { Fetcher, FetcherOutput, FetchInput } from './routesV3.client.types'\n\n// httpError.ts (or similar)\nexport class HttpError extends Error {\n status: number\n statusText: string\n url: string\n body: { message: string }\n headers: Record<string, string>\n\n constructor({\n res,\n url,\n body: { message },\n }: {\n res: Response\n url: string\n body: { message: string }\n }) {\n super(`[${res.status}] ${res.statusText}${message ? ` - ${message}` : ''}`)\n this.name = 'HttpError'\n this.status = res.status\n this.statusText = res.statusText\n this.url = url\n this.body = { message }\n this.headers = res.headers ? Object.fromEntries(res.headers.entries()) : {}\n }\n}\n\n/**\n * Default fetch implementation used by the route client helper.\n * @param req Normalized request information (URL, method, body, headers).\n * @returns Parsed JSON (or text fallback) from the server response.\n */\nexport const defaultFetcher: Fetcher = async <T>(\n req: FetchInput,\n): Promise<FetcherOutput<T>> => {\n const headers: Record<string, string> = { ...(req.headers ?? {}) }\n const isFormData =\n typeof FormData !== 'undefined' && req.body instanceof FormData\n if (!isFormData) {\n headers['Content-Type'] ||= 'application/json'\n headers['Accept'] ||= 'application/json'\n }\n\n const res = await fetch(req.url, {\n method: req.method,\n headers,\n body: isFormData\n ? (req.body as any)\n : req.body == null\n ? undefined\n : JSON.stringify(req.body),\n })\n\n const text = await res.json()\n\n if (!res.ok) {\n throw new HttpError({\n res,\n url: req.url,\n body: text,\n })\n }\n\n try {\n return {\n data: text as T,\n headers: res.headers ? Object.fromEntries(res.headers.entries()) : {},\n status: res.status,\n }\n } catch {\n return {\n data: text as unknown as T,\n headers: res.headers ? Object.fromEntries(res.headers.entries()) : {},\n status: res.status,\n }\n }\n}\n","// routesV3.client.get.ts\n\nimport type {\n AnyLeafLowProfile,\n HttpMethod,\n InferBodyInput,\n InferOutput,\n InferParams,\n InferQuery,\n} from '@emeryld/rrroutes-contract'\nimport { buildCacheKey, lowProfileParse } from '@emeryld/rrroutes-contract'\nimport {\n keepPreviousData,\n useQuery,\n type QueryClient,\n type QueryKey,\n} from '@tanstack/react-query'\nimport { useCallback, useRef } from 'react'\nimport {\n areEndpointArgsComplete,\n buildUrl,\n extractArgs,\n splitMultipartBody,\n toArgsTuple,\n toFormData,\n toUpper,\n} from './routesV3.client.shared'\nimport type {\n ArgsFor,\n ArgsTuple,\n BuiltQuery,\n DataShape,\n Fetcher,\n QueryBuildOptionsFor,\n QueryKeysFor,\n QueryUseEndpointOptionsFor,\n RouteClientDebugEvent,\n Updater,\n} from './routesV3.client.types'\n\ntype GetEnv = {\n baseUrl: string\n validateResponses: boolean\n fetcher: Fetcher\n queryClient: QueryClient\n emit: (event: RouteClientDebugEvent) => void\n decorateDebugEvent: <T extends RouteClientDebugEvent>(\n event: T,\n details?: Partial<RouteClientDebugEvent>,\n ) => RouteClientDebugEvent\n isVerboseDebug: boolean\n leafLabel: string\n}\n\nexport function buildGetLeaf<L extends AnyLeafLowProfile>(\n leaf: L,\n rqOpts: QueryBuildOptionsFor<L> | undefined,\n env: GetEnv,\n): BuiltQuery<L> {\n const leafCfg = leaf.cfg\n const method = toUpper(leaf.method as HttpMethod)\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema)\n\n const {\n baseUrl,\n validateResponses,\n fetcher,\n queryClient,\n emit,\n decorateDebugEvent,\n isVerboseDebug,\n leafLabel,\n } = env\n\n emit({ type: 'build', leaf: leafLabel })\n\n const getQueryKeys = <A extends ArgsTuple<L> = ArgsTuple<L>>(\n ...tuple: A\n ): QueryKeysFor<L, A> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = (a as any)?.query as InferQuery<L> | undefined\n return buildCacheKey({\n leaf,\n params: params as any,\n query: query as any,\n }) as unknown as QueryKeysFor<L, A>\n }\n\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple) as unknown as QueryKey\n await queryClient.invalidateQueries({ queryKey, exact: true })\n emit({ type: 'invalidate', key: queryKey, exact: true })\n }\n\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args\n const k = getQueryKeys(...(rest as ArgsTuple<L>)) as unknown as QueryKey\n const next = queryClient.setQueryData<InferOutput<L> | undefined>(\n k,\n (prev) =>\n typeof updater === 'function'\n ? (updater as any)(prev)\n : (updater as any),\n ) as any\n emit({ type: 'setData', key: k })\n return next as any\n }\n\n const buildOnReceive =\n (\n rqOpts as\n | { onReceive?: ((data: InferOutput<L>) => void) | undefined }\n | undefined\n )?.onReceive ?? undefined\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>\n body?: InferBodyInput<L>\n onReceive?: (data: InferOutput<L>) => void\n requireBody?: boolean\n },\n ): Promise<InferOutput<L>> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = {\n ...((a as any)?.query ?? ({} as InferQuery<L> | undefined)),\n ...(options?.queryOverride ?? {}),\n }\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n )\n\n let payload: unknown\n const isMultipart =\n Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0\n const acceptsBody = Boolean(leafCfg.bodySchema || isMultipart)\n const requiresBody = options?.requireBody ?? (!acceptsBody ? false : true)\n\n if (typeof options?.body !== 'undefined') {\n const { regularBody, multipartFiles } = splitMultipartBody(\n options.body as Record<string, unknown>,\n leafCfg.bodyFiles,\n )\n const normalizedBody = leafCfg.bodySchema\n ? lowProfileParse(leafCfg.bodySchema, regularBody)\n : regularBody\n if (isMultipart && normalizedBody && typeof normalizedBody === 'object') {\n payload = toFormData(\n {\n ...(normalizedBody as Record<string, unknown>),\n ...multipartFiles,\n },\n leafCfg.bodyFiles,\n )\n } else {\n payload = normalizedBody\n }\n } else if (requiresBody && acceptsBody) {\n throw new Error('Body is required when invoking a mutation fetch.')\n }\n\n const startedAt = Date.now()\n const detail = isVerboseDebug\n ? { params, normalizedParams, query, normalizedQuery, baseUrl }\n : undefined\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method,\n url,\n leaf: leafLabel,\n ...(payload !== undefined ? { body: payload } : {}),\n },\n detail,\n ),\n )\n\n try {\n const out = await fetcher<InferOutput<L>>(\n payload === undefined\n ? { url, method }\n : { url, method, body: payload },\n )\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'fetched',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n\n if (validateResponses) {\n if (!leafCfg.outputSchema) {\n throw new Error(\n `No output schema defined for leaf ${leafLabel}, cannot validate response.`,\n )\n }\n out.data = lowProfileParse(\n leafCfg.outputSchema,\n out.data,\n ) as InferOutput<L>\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'parsed',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n }\n\n options?.onReceive?.(out.data)\n return out.data\n } catch (error) {\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'error',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n ...(payload !== undefined ? { body: payload } : {}),\n error,\n },\n detail,\n ),\n )\n throw error\n }\n }\n\n const fetchGet: BuiltQuery<L>['fetch'] = (...tupleWithBody) => {\n const acceptsBody = Boolean(leafCfg.bodySchema)\n const tupleLength = tupleWithBody.length\n const maybeBodyIndex = expectsArgs ? 1 : 0\n const hasBodyCandidate = acceptsBody && tupleLength > maybeBodyIndex\n const body = hasBodyCandidate\n ? (tupleWithBody[tupleLength - 1] as InferBodyInput<L>)\n : undefined\n const tuple = hasBodyCandidate\n ? (tupleWithBody.slice(0, tupleLength - 1) as ArgsTuple<L>)\n : (tupleWithBody as ArgsTuple<L>)\n\n return fetchEndpoint(tuple, {\n body,\n onReceive: buildOnReceive,\n requireBody: false,\n })\n }\n\n const useEndpoint: BuiltQuery<L>['useEndpoint'] = (...useArgs) => {\n const args = (expectsArgs ? useArgs[0] : undefined) as ArgsFor<L> | undefined\n const useEndpointOptions = (\n expectsArgs ? useArgs[1] : useArgs[0]\n ) as QueryUseEndpointOptionsFor<L> | undefined\n const hasCompleteArgs = !expectsArgs || areEndpointArgsComplete(leaf, args)\n const tuple = toArgsTuple(args)\n const queryKeys = getQueryKeys(...tuple)\n emit({\n type: 'useEndpoint',\n leaf: leafLabel,\n variant: 'get',\n keys: queryKeys,\n })\n\n const { onReceive: buildOnReceive, ...buildQueryOptions } = (rqOpts ??\n {}) as QueryBuildOptionsFor<L>\n const { onReceive: useOnReceive, ...runtimeQueryOptions } = (useEndpointOptions ??\n {}) as QueryUseEndpointOptionsFor<L>\n const mergedQueryOptions = {\n ...buildQueryOptions,\n ...runtimeQueryOptions,\n }\n const mergedEnabled = (mergedQueryOptions as { enabled?: unknown }).enabled\n const guardedEnabled =\n hasCompleteArgs &&\n (typeof mergedEnabled === 'undefined' ? true : mergedEnabled)\n\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>())\n const notifyOnReceive = useCallback((data: InferOutput<L>) => {\n buildOnReceive?.(data)\n useOnReceive?.(data)\n listenersRef.current.forEach((listener) => listener(data))\n }, [buildOnReceive, useOnReceive])\n const registerOnReceive = useCallback(\n (listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener)\n return () => {\n listenersRef.current.delete(listener)\n }\n },\n [],\n )\n\n const queryResult = useQuery<\n InferOutput<L>,\n unknown,\n InferOutput<L>,\n QueryKey\n >(\n {\n ...mergedQueryOptions,\n enabled: guardedEnabled as any,\n queryKey: getQueryKeys(...tuple) as unknown as QueryKey,\n placeholderData:\n mergedQueryOptions.placeholderData ?? keepPreviousData,\n queryFn: () => {\n if (!hasCompleteArgs) {\n return Promise.resolve(undefined as unknown as InferOutput<L>)\n }\n return fetchEndpoint(tuple, {\n onReceive: notifyOnReceive,\n })\n },\n },\n queryClient,\n )\n\n return { ...queryResult, onReceive: registerOnReceive }\n }\n\n return {\n getQueryKeys,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n fetch: fetchGet,\n } as BuiltQuery<L>\n}\n","// routesV3.client.shared.ts\n\nimport type {\n AnyLeafLowProfile,\n FileField,\n HttpMethod,\n ImagePickerAsset,\n InferParams,\n InferQuery,\n ReactNativeFile,\n} from '@emeryld/rrroutes-contract'\nimport { compilePath, lowProfileParse } from '@emeryld/rrroutes-contract'\nimport type { ArgsFor, ArgsTuple, Cursor } from './routesV3.client.types'\n\n/**\n * Convert an HTTP method to uppercase (as expected by fetch).\n */\nexport const toUpper = (m: HttpMethod): Uppercase<HttpMethod> =>\n m.toUpperCase() as Uppercase<HttpMethod>\n\n/**\n * Serialize a query object into a search string.\n */\nexport function toSearchString(query: Record<string, unknown> | undefined) {\n if (!query) return ''\n const params = new URLSearchParams()\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue\n if (typeof v === 'string') {\n params.append(k, v)\n continue\n }\n if (typeof v === 'number' || typeof v === 'boolean') {\n params.append(k, String(v))\n continue\n }\n if (v instanceof Date) {\n params.append(k, v.toISOString())\n continue\n }\n params.append(k, JSON.stringify(v))\n }\n const s = params.toString()\n return s ? `?${s}` : ''\n}\n\n/**\n * Remove the given key from an object (used to drop cursors from cache keys).\n */\nexport function stripKey<Q extends Record<string, unknown> | undefined>(\n obj: Q,\n key: string,\n): Q {\n if (!obj) return obj\n const { [key]: _omit, ...rest } = obj as any\n return rest as Q\n}\n\n/**\n * Default cursor extractor used by infinite queries.\n */\nexport const defaultGetNextCursor = (p: unknown): Cursor => {\n if (!p || typeof p !== 'object') return undefined\n const record = p as Record<string, unknown>\n if ('nextCursor' in record) {\n return record.nextCursor as Cursor\n }\n if ('meta' in record) {\n const meta = record.meta\n if (meta && typeof meta === 'object' && 'nextCursor' in meta) {\n return (meta as Record<string, unknown>).nextCursor as Cursor\n }\n }\n return undefined\n}\n\n/**\n * Extract the optional argument object from a variadic tuple.\n */\nexport function extractArgs<L extends AnyLeafLowProfile>(\n args: ArgsTuple<L>,\n): ArgsFor<L> | undefined {\n return (args as unknown as any[])[0] as any\n}\n\n/**\n * Convert an optional args object into the variadic tuple form.\n */\nexport function toArgsTuple<L extends AnyLeafLowProfile>(\n args: ArgsFor<L> | undefined,\n): ArgsTuple<L> {\n return (typeof args === 'undefined' ? [] : [args]) as ArgsTuple<L>\n}\n\n/**\n * Normalize params and query values, then construct a request URL for the given leaf.\n */\nexport function buildUrl<L extends AnyLeafLowProfile>(\n leaf: L,\n baseUrl: string,\n params: InferParams<L> | undefined,\n query: InferQuery<L> | undefined,\n) {\n const normalizedParams = leaf.cfg.paramsSchema\n ? lowProfileParse(leaf.cfg.paramsSchema, params)\n : {}\n const normalizedQuery = leaf.cfg.querySchema\n ? lowProfileParse(leaf.cfg.querySchema, query)\n : {}\n\n const path = compilePath<L['path']>(\n leaf.path,\n (normalizedParams ?? {}) as any,\n )\n const url = `${baseUrl ?? ''}${path}${toSearchString(normalizedQuery as any)}`\n return { url, normalizedQuery, normalizedParams }\n}\n\n/**\n * Check whether the provided args are complete enough to build a request URL.\n * Used by hooks to avoid running queries until required params/query values exist.\n */\nexport function areEndpointArgsComplete<L extends AnyLeafLowProfile>(\n leaf: L,\n args: ArgsFor<L> | undefined,\n) {\n const params = (args as any)?.params as InferParams<L> | undefined\n const query = (args as any)?.query as InferQuery<L> | undefined\n try {\n buildUrl(leaf, '', params, query)\n return true\n } catch {\n return false\n }\n}\n\n// -----------------------------------------------------------------------------\n// Multipart / path helpers used by the raw fetch\n// -----------------------------------------------------------------------------\n\nfunction isBlobLike(value: unknown): value is Blob {\n return typeof Blob !== 'undefined' && value instanceof Blob\n}\n\nfunction assertFileFieldValue(\n sourceKey: string,\n targetField: string,\n value: unknown,\n) {\n if (value == null) return\n if (isBlobLike(value)) return\n if (isReactNativeFile(value)) return\n if (isImagePickerAsset(value)) return\n if (typeof FileList !== 'undefined' && value instanceof FileList) {\n for (const item of Array.from(value)) {\n if (!isBlobLike(item)) {\n throw new Error(\n `Multipart field \"${sourceKey}\" must contain Blob/File values for \"${targetField}\".`,\n )\n }\n }\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n if (\n !isBlobLike(item) &&\n !isReactNativeFile(item) &&\n !isImagePickerAsset(item)\n ) {\n throw new Error(\n `Multipart field \"${sourceKey}\" must contain Blob/File, ReactNativeFile or ImagePickerAsset values for \"${targetField}\".`,\n )\n }\n }\n return\n }\n throw new Error(\n `Multipart field \"${sourceKey}\" must be Blob/File, ReactNativeFile, ImagePickerAsset, Blob[]/ReactNativeFile[]/ImagePickerAsset[] or FileList. ReactNativeFile = { uri: string, name: string, type: string }.`,\n )\n}\n\nexport function splitMultipartBody(\n body: Record<string, any> | undefined,\n fields: FileField[] | undefined,\n) {\n if (!body || typeof body !== 'object' || Array.isArray(body) || !fields) {\n return {\n regularBody: body,\n multipartFiles: {} as Record<string, unknown>,\n }\n }\n\n const fieldByInputKey = new Map<string, string>()\n for (const field of fields) {\n fieldByInputKey.set(`file_${field.name}`, field.name)\n fieldByInputKey.set(field.name, field.name)\n }\n\n const regularBody: Record<string, unknown> = {}\n const multipartFiles: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(body)) {\n const resolvedFieldName = fieldByInputKey.get(key)\n if (!resolvedFieldName) {\n regularBody[key] = value\n continue\n }\n assertFileFieldValue(key, resolvedFieldName, value)\n multipartFiles[resolvedFieldName] = value\n }\n\n return { regularBody, multipartFiles }\n}\n\nconst isReactNativeFile = (v: any): v is ReactNativeFile =>\n v &&\n typeof v === 'object' &&\n typeof v.uri === 'string' &&\n typeof v.name === 'string' &&\n typeof v.type === 'string'\n\nconst isImagePickerAsset = (v: any): v is ImagePickerAsset =>\n v &&\n typeof v === 'object' &&\n typeof v.uri === 'string' &&\n (typeof v.fileName === 'string' ||\n typeof v.mimeType === 'string' ||\n typeof v.width === 'number' ||\n typeof v.height === 'number')\n\nconst isFile = (v: any): v is File =>\n typeof File !== 'undefined' && v instanceof File\n\nconst isBlob = (v: any): v is Blob =>\n typeof Blob !== 'undefined' && v instanceof Blob\n\nexport function toFormData(\n body: Record<string, unknown>,\n bodyFiles: readonly FileField[] = [],\n) {\n const fd = new FormData()\n // Accept both inferred keys (file_${name}) and resolved field names (name)\n const fileKeys = new Set(bodyFiles.flatMap((f) => [f.name, `file_${f.name}`]))\n\n const appendFile = (fieldName: string, value: any) => {\n if (value == null) return\n\n // RN file descriptor\n if (isReactNativeFile(value)) {\n fd.append(fieldName, value as any)\n return\n }\n\n // Expo ImagePicker asset (normalize to RN file descriptor)\n if (isImagePickerAsset(value)) {\n fd.append(fieldName, {\n uri: value.uri,\n name: value.fileName ?? 'upload',\n type: value.mimeType ?? 'application/octet-stream',\n } as any)\n return\n }\n\n // Web File\n if (isFile(value)) {\n fd.append(fieldName, value, value.name)\n return\n }\n\n // Web/ReactNative Blob (RN supports Blob in many cases too)\n if (isBlob(value)) {\n fd.append(fieldName, value, 'upload')\n return\n }\n\n throw new Error(`Invalid upload value for ${fieldName}`)\n }\n\n for (const [key, value] of Object.entries(body)) {\n if (fileKeys.has(key)) {\n // If caller passed an array for a multi-file field, append each\n if (Array.isArray(value)) {\n for (const v of value) appendFile(key, v)\n } else {\n appendFile(key, value)\n }\n continue\n }\n\n // regular fields: stringify non-strings\n if (typeof value === 'string') fd.append(key, value)\n else if (typeof value === 'number' || typeof value === 'boolean')\n fd.append(key, String(value))\n else if (value == null) {\n // skip\n } else {\n // if you already have a policy for objects, keep it consistent\n fd.append(key, JSON.stringify(value))\n }\n }\n\n return fd\n}\n\nfunction getPathParamNames(path: string): Set<string> {\n const names = new Set<string>()\n const re = /:([A-Za-z0-9_]+)/g\n let match: RegExpExecArray | null\n while ((match = re.exec(path)) !== null) {\n names.add(match[1])\n }\n return names\n}\n\n/**\n * Validate that the query is a flat Record<string, string>.\n * Throws if any value is non-string or the structure is not a plain object.\n */\nexport function normalizeFlatQuery(\n query: unknown,\n): Record<string, string> | undefined {\n if (query == null) return undefined\n if (typeof query !== 'object' || Array.isArray(query)) {\n throw new Error('Query must be a plain object (Record<string, string>).')\n }\n const result: Record<string, string> = {}\n for (const [k, v] of Object.entries(query as Record<string, unknown>)) {\n if (v == null) continue\n if (typeof v !== 'string') {\n throw new Error(\n `Query param \"${k}\" must be a string; received type \"${typeof v}\".`,\n )\n }\n result[k] = v\n }\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Validate path parameters against the path template and compile the path.\n */\nexport function compileRawPath(path: string, params: unknown): string {\n const placeholders = getPathParamNames(path)\n\n if (!params || typeof params !== 'object' || Array.isArray(params)) {\n if (placeholders.size > 0) {\n throw new Error(\n `Missing path parameters for \"${path}\": ${[...placeholders].join(\n ', ',\n )}`,\n )\n }\n return path\n }\n\n const paramObj = params as Record<string, unknown>\n const providedNames = new Set(Object.keys(paramObj))\n\n // Extra params that do not exist in path\n for (const name of providedNames) {\n if (!placeholders.has(name)) {\n throw new Error(\n `Unexpected path parameter \"${name}\" for template \"${path}\".`,\n )\n }\n const value = paramObj[name]\n if (value != null && (typeof value === 'object' || Array.isArray(value))) {\n throw new Error(\n `Path parameter \"${name}\" must be a primitive; received \"${typeof value}\".`,\n )\n }\n }\n\n // Missing params for placeholders\n for (const name of placeholders) {\n if (!providedNames.has(name)) {\n throw new Error(\n `Missing value for path parameter \"${name}\" in template \"${path}\".`,\n )\n }\n }\n\n if (placeholders.size === 0) {\n return path\n }\n\n return compilePath(path as any, paramObj as any)\n}\n","// routesV3.client.infiniteGet.ts\n\nimport type {\n AnyLeafLowProfile,\n HttpMethod,\n InferBodyInput,\n InferOutput,\n InferParams,\n InferQuery,\n} from '@emeryld/rrroutes-contract'\nimport { buildCacheKey, lowProfileParse } from '@emeryld/rrroutes-contract'\nimport {\n keepPreviousData,\n useInfiniteQuery,\n type InfiniteData,\n type QueryClient,\n type QueryKey,\n} from '@tanstack/react-query'\nimport { useCallback, useRef } from 'react'\nimport {\n areEndpointArgsComplete,\n buildUrl,\n defaultGetNextCursor,\n extractArgs,\n splitMultipartBody,\n stripKey,\n toArgsTuple,\n toFormData,\n toUpper,\n} from './routesV3.client.shared'\nimport type {\n ArgsFor,\n ArgsTuple,\n BuiltInfinite,\n Cursor,\n DataShape,\n Fetcher,\n InfiniteBuildOptionsFor,\n InfiniteUseEndpointOptionsFor,\n QueryKeysFor,\n RouteClientDebugEvent,\n Updater,\n} from './routesV3.client.types'\n\ntype InfiniteEnv = {\n baseUrl: string\n validateResponses: boolean\n fetcher: Fetcher\n queryClient: QueryClient\n emit: (event: RouteClientDebugEvent) => void\n decorateDebugEvent: <T extends RouteClientDebugEvent>(\n event: T,\n details?: Partial<RouteClientDebugEvent>,\n ) => RouteClientDebugEvent\n isVerboseDebug: boolean\n leafLabel: string\n}\n\n/**\n * Merge two page outputs into a single logical page.\n * - Concatenates arrays.\n * - Shallow-merges objects.\n * - Special-cases \"meta\" to merge recursively.\n * - Defaults to the latest value for non-mergeable fields.\n */\nfunction mergePageOutputs(prev: any, next: any): any {\n if (prev == null) return next\n if (next == null) return prev\n\n if (Array.isArray(prev) && Array.isArray(next)) {\n return [...prev, ...next]\n }\n\n if (typeof prev !== 'object' || typeof next !== 'object') {\n return next\n }\n\n const merged: any = { ...prev }\n\n for (const key of Object.keys(next)) {\n const pv = (prev as any)[key]\n const nv = (next as any)[key]\n\n if (Array.isArray(pv) && Array.isArray(nv)) {\n merged[key] = [...pv, ...nv]\n continue\n }\n\n if (\n pv &&\n typeof pv === 'object' &&\n !Array.isArray(pv) &&\n nv &&\n typeof nv === 'object' &&\n !Array.isArray(nv)\n ) {\n if (key === 'meta') {\n merged[key] = mergePageOutputs(pv, nv)\n } else {\n merged[key] = nv\n }\n continue\n }\n\n merged[key] = nv\n }\n\n return merged\n}\n\nexport function buildInfiniteGetLeaf<L extends AnyLeafLowProfile>(\n leaf: L,\n rqOpts: InfiniteBuildOptionsFor<L> | undefined,\n env: InfiniteEnv,\n): BuiltInfinite<L> {\n const leafCfg = leaf.cfg\n const method = toUpper(leaf.method as HttpMethod)\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema)\n\n const {\n baseUrl,\n validateResponses,\n fetcher,\n queryClient,\n emit,\n decorateDebugEvent,\n isVerboseDebug,\n leafLabel,\n } = env\n\n emit({ type: 'build', leaf: leafLabel })\n\n // Feed-specific options\n const infiniteOptions = (rqOpts ?? {}) as InfiniteBuildOptionsFor<L>\n const {\n cursorQueryKey,\n getNextPageCursor,\n initialPageParam,\n splitPageSize,\n splitPageSizeParam,\n ...passthroughOptions\n } = infiniteOptions\n\n const feedCursorQueryKey = cursorQueryKey ?? 'pagination_cursor'\n const feedNextPageCursor =\n getNextPageCursor ??\n ((lastPage: InferOutput<L>) => defaultGetNextCursor(lastPage))\n const feedInitialPageParam =\n typeof initialPageParam === 'undefined' ? undefined : initialPageParam\n const feedQueryOptions = passthroughOptions\n\n const effectiveSplitPageSize =\n typeof splitPageSize === 'number' && splitPageSize > 0\n ? splitPageSize\n : undefined\n const effectiveSplitPageSizeParam = splitPageSizeParam ?? 'pageSize'\n\n const getQueryKeys = <A extends ArgsTuple<L> = ArgsTuple<L>>(\n ...tuple: A\n ): QueryKeysFor<L, A> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = (a as any)?.query as InferQuery<L> | undefined\n const qForKey = stripKey(query as any, feedCursorQueryKey)\n return buildCacheKey({\n leaf,\n params: params as any,\n query: qForKey,\n }) as unknown as QueryKeysFor<L, A>\n }\n\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple) as unknown as QueryKey\n await queryClient.invalidateQueries({ queryKey, exact: true })\n emit({ type: 'invalidate', key: queryKey, exact: true })\n }\n\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args\n const k = getQueryKeys(...(rest as ArgsTuple<L>)) as unknown as QueryKey\n const next = queryClient.setQueryData<\n InfiniteData<InferOutput<L>> | undefined\n >(k, (prev) =>\n typeof updater === 'function' ? (updater as any)(prev) : (updater as any),\n ) as any\n emit({ type: 'setData', key: k })\n return next as any\n }\n\n const buildOnReceive =\n (\n rqOpts as\n | { onReceive?: ((data: InferOutput<L>) => void) | undefined }\n | undefined\n )?.onReceive ?? undefined\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>\n body?: InferBodyInput<L>\n onReceive?: (data: InferOutput<L>) => void\n requireBody?: boolean\n },\n ): Promise<InferOutput<L>> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = {\n ...((a as any)?.query ?? ({} as InferQuery<L> | undefined)),\n ...(options?.queryOverride ?? {}),\n }\n\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n )\n\n let payload: unknown\n const isMultipart =\n Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0\n const acceptsBody = Boolean(leafCfg.bodySchema || isMultipart)\n const requiresBody = options?.requireBody ?? (!acceptsBody ? false : true)\n\n if (typeof options?.body !== 'undefined') {\n const { regularBody, multipartFiles } = splitMultipartBody(\n options.body as Record<string, unknown>,\n leafCfg.bodyFiles,\n )\n const normalizedBody = leafCfg.bodySchema\n ? lowProfileParse(leafCfg.bodySchema, regularBody)\n : regularBody\n if (isMultipart && normalizedBody && typeof normalizedBody === 'object') {\n payload = toFormData(\n {\n ...(normalizedBody as Record<string, unknown>),\n ...multipartFiles,\n },\n leafCfg.bodyFiles,\n )\n } else {\n payload = normalizedBody\n }\n } else if (requiresBody && acceptsBody) {\n throw new Error('Body is required when invoking a mutation fetch.')\n }\n\n const startedAt = Date.now()\n const detail = isVerboseDebug\n ? { params, normalizedParams, query, normalizedQuery, baseUrl }\n : undefined\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method,\n url,\n leaf: leafLabel,\n ...(payload !== undefined ? { body: payload } : {}),\n },\n detail,\n ),\n )\n\n try {\n const out = await fetcher<InferOutput<L>>(\n payload === undefined\n ? { url, method }\n : { url, method, body: payload },\n )\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'fetched',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n\n if (validateResponses) {\n if (!leafCfg.outputSchema) {\n throw new Error(\n `No output schema defined for leaf ${leafLabel}, cannot validate response.`,\n )\n }\n out.data = lowProfileParse(\n leafCfg.outputSchema,\n out.data,\n ) as InferOutput<L>\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'parsed',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n }\n\n options?.onReceive?.(out.data)\n return out.data\n } catch (error) {\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'error',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n ...(payload !== undefined ? { body: payload } : {}),\n error,\n },\n detail,\n ),\n )\n throw error\n }\n }\n\n const fetchGet: BuiltInfinite<L>['fetch'] = (...tupleWithBody) => {\n const acceptsBody = Boolean(leafCfg.bodySchema)\n const tupleLength = tupleWithBody.length\n const maybeBodyIndex = expectsArgs ? 1 : 0\n const hasBodyCandidate = acceptsBody && tupleLength > maybeBodyIndex\n const body = hasBodyCandidate\n ? (tupleWithBody[tupleLength - 1] as InferBodyInput<L>)\n : undefined\n const tuple = hasBodyCandidate\n ? (tupleWithBody.slice(0, tupleLength - 1) as ArgsTuple<L>)\n : (tupleWithBody as ArgsTuple<L>)\n\n return fetchEndpoint(tuple, {\n body,\n onReceive: buildOnReceive,\n requireBody: false,\n })\n }\n\n const useEndpoint: BuiltInfinite<L>['useEndpoint'] = (...useArgs) => {\n const args = (expectsArgs ? useArgs[0] : undefined) as\n | ArgsFor<L>\n | undefined\n const useEndpointOptions = (expectsArgs ? useArgs[1] : useArgs[0]) as\n | InfiniteUseEndpointOptionsFor<L>\n | undefined\n const hasCompleteArgs = !expectsArgs || areEndpointArgsComplete(leaf, args)\n const tuple = toArgsTuple(args)\n const params = (args as any)?.params as InferParams<L> | undefined\n const query = (args as any)?.query as InferQuery<L> | undefined\n const buildOptions = (feedQueryOptions ?? {}) as Omit<\n InfiniteBuildOptionsFor<L>,\n 'cursorQueryKey' | 'getNextPageCursor' | 'initialPageParam'\n >\n const { onReceive: buildOnReceive, ...buildInfiniteQueryOptions } =\n buildOptions\n const {\n onReceive: useOnReceive,\n cursorQueryKey: useCursorQueryKey,\n getNextPageCursor: useGetNextPageCursor,\n initialPageParam: useInitialPageParam,\n ...runtimeInfiniteQueryOptions\n } =\n (useEndpointOptions ?? {}) as InfiniteUseEndpointOptionsFor<L>\n const effectiveCursorParam = useCursorQueryKey ?? feedCursorQueryKey\n const effectiveNextPageCursor =\n useGetNextPageCursor ?? feedNextPageCursor\n const effectiveInitialPageParam =\n typeof useInitialPageParam === 'undefined'\n ? feedInitialPageParam\n : useInitialPageParam\n const qForKey = stripKey(query as any, effectiveCursorParam)\n const queryKeys = buildCacheKey({\n leaf,\n params: params as any,\n query: qForKey,\n }) as unknown as QueryKeysFor<L, ArgsTuple<L>>\n emit({\n type: 'useEndpoint',\n leaf: leafLabel,\n variant: 'infiniteGet',\n keys: queryKeys,\n })\n const mergedInfiniteQueryOptions = {\n ...buildInfiniteQueryOptions,\n ...runtimeInfiniteQueryOptions,\n }\n const mergedEnabled = (mergedInfiniteQueryOptions as { enabled?: unknown })\n .enabled\n const guardedEnabled =\n hasCompleteArgs &&\n (typeof mergedEnabled === 'undefined' ? true : mergedEnabled)\n\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>())\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOnReceive?.(data)\n useOnReceive?.(data)\n listenersRef.current.forEach((listener) => listener(data))\n },\n [buildOnReceive, useOnReceive],\n )\n const registerOnReceive = useCallback(\n (listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener)\n return () => {\n listenersRef.current.delete(listener)\n }\n },\n [],\n )\n\n const { normalizedQuery, normalizedParams } = hasCompleteArgs\n ? buildUrl({ ...leaf, cfg: leafCfg } as L, baseUrl, params, query)\n : {\n normalizedQuery: (query ?? {}) as InferQuery<L>,\n normalizedParams: (params ?? {}) as InferParams<L>,\n }\n\n const queryResult = useInfiniteQuery<\n InferOutput<L>,\n unknown,\n InfiniteData<InferOutput<L>>,\n QueryKey,\n Cursor\n >(\n {\n ...mergedInfiniteQueryOptions,\n enabled: guardedEnabled as any,\n placeholderData:\n mergedInfiniteQueryOptions.placeholderData ?? keepPreviousData,\n initialPageParam: effectiveInitialPageParam,\n getNextPageParam: (lastPage) => effectiveNextPageCursor(lastPage),\n queryKey: queryKeys as unknown as QueryKey,\n queryFn: ({ pageParam }) => {\n if (!hasCompleteArgs) {\n return Promise.resolve(undefined as InferOutput<L>)\n }\n\n // Fast path: no splitting configured.\n if (!effectiveSplitPageSize) {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [effectiveCursorParam]: pageParam } : {}),\n }\n return fetchEndpoint(tuple, {\n queryOverride: pageQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n })\n }\n\n // Read the logical page size from the normalized query.\n const basePageSizeRaw = (normalizedQuery as any)?.[\n effectiveSplitPageSizeParam\n ]\n const basePageSize =\n typeof basePageSizeRaw === 'number'\n ? basePageSizeRaw\n : basePageSizeRaw != null\n ? Number(basePageSizeRaw)\n : undefined\n\n // If no valid logical page size or split is not actually smaller, fall back.\n if (\n !basePageSize ||\n !Number.isFinite(basePageSize) ||\n basePageSize <= effectiveSplitPageSize\n ) {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [effectiveCursorParam]: pageParam } : {}),\n }\n return fetchEndpoint(tuple, {\n queryOverride: pageQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n })\n }\n\n const totalTarget = basePageSize\n const pageParamForThisPage = pageParam\n\n const runSplitFetch = async (): Promise<InferOutput<L>> => {\n let remaining = totalTarget\n let currentCursor: Cursor | undefined = pageParam\n let aggregated: InferOutput<L> | undefined\n\n while (remaining > 0) {\n const thisCallSize = Math.min(remaining, effectiveSplitPageSize)\n\n const splitQuery = {\n ...(normalizedQuery as any),\n ...(currentCursor\n ? { [effectiveCursorParam]: currentCursor }\n : {}),\n [effectiveSplitPageSizeParam]: thisCallSize,\n }\n\n const page = await fetchEndpoint(tuple, {\n queryOverride: splitQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n })\n\n aggregated = aggregated\n ? mergePageOutputs(aggregated, page)\n : page\n\n remaining -= thisCallSize\n\n const nextCursor = effectiveNextPageCursor(page)\n currentCursor = nextCursor\n\n const k = queryKeys as unknown as QueryKey\n\n queryClient.setQueryData<\n InfiniteData<InferOutput<L>> | undefined\n >(k, (prev) => {\n if (!aggregated) return prev\n\n if (!prev) {\n return {\n pages: [aggregated],\n pageParams: [pageParamForThisPage],\n } as InfiniteData<InferOutput<L>>\n }\n\n const idx = prev.pageParams.findIndex(\n (p) =>\n p === pageParamForThisPage ||\n (p == null && pageParamForThisPage == null),\n )\n\n if (idx === -1) {\n return {\n pages: [...prev.pages, aggregated],\n pageParams: [...prev.pageParams, pageParamForThisPage],\n }\n }\n\n const newPages = [...prev.pages]\n newPages[idx] = aggregated\n\n return { ...prev, pages: newPages }\n })\n\n if (!nextCursor) {\n break\n }\n }\n\n return aggregated as InferOutput<L>\n }\n\n return runSplitFetch()\n },\n },\n queryClient,\n )\n\n return { ...queryResult, onReceive: registerOnReceive }\n }\n\n return {\n getQueryKeys,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n fetch: fetchGet,\n } as BuiltInfinite<L>\n}\n","// routesV3.client.mutation.ts\n\nimport type {\n AnyLeafLowProfile,\n HttpMethod,\n InferBodyInput,\n InferOutput,\n InferParams,\n InferQuery,\n} from '@emeryld/rrroutes-contract'\nimport { buildCacheKey, lowProfileParse } from '@emeryld/rrroutes-contract'\nimport {\n useMutation,\n type QueryClient,\n type QueryKey,\n} from '@tanstack/react-query'\nimport { useCallback, useRef } from 'react'\nimport {\n buildUrl,\n extractArgs,\n splitMultipartBody,\n toArgsTuple,\n toFormData,\n toUpper,\n} from './routesV3.client.shared'\nimport type {\n ArgsFor,\n ArgsTuple,\n BuiltMutation,\n DataShape,\n Fetcher,\n MutationBuildOptionsFor,\n MutationUseEndpointOptionsFor,\n QueryKeysFor,\n RouteClientDebugEvent,\n Updater,\n} from './routesV3.client.types'\n\ntype MutationEnv = {\n baseUrl: string\n validateResponses: boolean\n fetcher: Fetcher\n queryClient: QueryClient\n emit: (event: RouteClientDebugEvent) => void\n decorateDebugEvent: <T extends RouteClientDebugEvent>(\n event: T,\n details?: Partial<RouteClientDebugEvent>,\n ) => RouteClientDebugEvent\n isVerboseDebug: boolean\n leafLabel: string\n}\n\nexport function buildMutationLeaf<L extends AnyLeafLowProfile>(\n leaf: L,\n rqOpts: MutationBuildOptionsFor<L> | undefined,\n env: MutationEnv,\n): BuiltMutation<L> {\n const leafCfg = leaf.cfg\n const method = toUpper(leaf.method as HttpMethod)\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema)\n\n const {\n baseUrl,\n validateResponses,\n fetcher,\n queryClient,\n emit,\n decorateDebugEvent,\n isVerboseDebug,\n leafLabel,\n } = env\n\n emit({ type: 'build', leaf: leafLabel })\n\n const getQueryKeys = <A extends ArgsTuple<L> = ArgsTuple<L>>(\n ...tuple: A\n ): QueryKeysFor<L, A> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = (a as any)?.query as InferQuery<L> | undefined\n return buildCacheKey({\n leaf,\n params: params as any,\n query: query as any,\n }) as unknown as QueryKeysFor<L, A>\n }\n\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple) as unknown as QueryKey\n await queryClient.invalidateQueries({ queryKey, exact: true })\n emit({ type: 'invalidate', key: queryKey, exact: true })\n }\n\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args\n const k = getQueryKeys(...(rest as ArgsTuple<L>)) as unknown as QueryKey\n const next = queryClient.setQueryData<InferOutput<L> | undefined>(\n k,\n (prev) =>\n typeof updater === 'function'\n ? (updater as any)(prev)\n : (updater as any),\n ) as any\n emit({ type: 'setData', key: k })\n return next as any\n }\n\n const mutationBuildOptions = (rqOpts ?? {}) as MutationBuildOptionsFor<L>\n const { onReceive: mutationBuildOnReceive, ...mutationBuildQueryOptions } =\n mutationBuildOptions\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>\n body?: InferBodyInput<L>\n onReceive?: (data: InferOutput<L>) => void\n requireBody?: boolean\n },\n ): Promise<InferOutput<L>> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = {\n ...((a as any)?.query ?? ({} as InferQuery<L> | undefined)),\n ...(options?.queryOverride ?? {}),\n }\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n )\n\n let payload: unknown\n const isMultipart =\n Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0\n const acceptsBody = Boolean(leafCfg.bodySchema || isMultipart)\n const requiresBody = options?.requireBody ?? (!acceptsBody ? false : true)\n\n if (typeof options?.body !== 'undefined') {\n const { regularBody, multipartFiles } = splitMultipartBody(\n options.body as Record<string, unknown>,\n leafCfg.bodyFiles,\n )\n const normalizedBody = leafCfg.bodySchema\n ? lowProfileParse(leafCfg.bodySchema, regularBody)\n : regularBody\n if (isMultipart && normalizedBody && typeof normalizedBody === 'object') {\n payload = toFormData(\n {\n ...(normalizedBody as Record<string, unknown>),\n ...multipartFiles,\n },\n leafCfg.bodyFiles,\n )\n } else {\n payload = normalizedBody\n }\n } else if (requiresBody && acceptsBody) {\n throw new Error('Body is required when invoking a mutation fetch.')\n }\n\n const startedAt = Date.now()\n const detail = isVerboseDebug\n ? { params, normalizedParams, query, normalizedQuery, baseUrl }\n : undefined\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method,\n url,\n leaf: leafLabel,\n ...(payload !== undefined ? { body: payload } : {}),\n },\n detail,\n ),\n )\n\n try {\n const out = await fetcher<InferOutput<L>>(\n payload === undefined\n ? { url, method }\n : { url, method, body: payload },\n )\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'fetched',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n\n if (validateResponses) {\n if (!leafCfg.outputSchema) {\n throw new Error(\n `No output schema defined for leaf ${leafLabel}, cannot validate response.`,\n )\n }\n out.data = lowProfileParse(\n leafCfg.outputSchema,\n out.data,\n ) as InferOutput<L>\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'parsed',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n }\n\n options?.onReceive?.(out.data)\n return out.data\n } catch (error) {\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'error',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n ...(payload !== undefined ? { body: payload } : {}),\n error,\n },\n detail,\n ),\n )\n throw error\n }\n }\n\n const fetchMutation: BuiltMutation<L>['fetch'] = async (...tupleWithBody) => {\n if (tupleWithBody.length === 0) {\n throw new Error('Body is required when invoking a mutation fetch.')\n }\n const bodyIndex = tupleWithBody.length - 1\n const tuple = tupleWithBody.slice(0, bodyIndex) as ArgsTuple<L>\n const body = tupleWithBody[bodyIndex] as InferBodyInput<L>\n const result = await fetchEndpoint(tuple, {\n body,\n onReceive: (data) => mutationBuildOnReceive?.(data),\n requireBody: true,\n })\n return result\n }\n\n const useEndpoint: BuiltMutation<L>['useEndpoint'] = (...useArgs) => {\n const args = (expectsArgs ? useArgs[0] : undefined) as ArgsFor<L> | undefined\n const useEndpointOptions = (\n expectsArgs ? useArgs[1] : useArgs[0]\n ) as MutationUseEndpointOptionsFor<L> | undefined\n const tuple = toArgsTuple(args)\n const mutationKey = getQueryKeys(...tuple)\n emit({\n type: 'useEndpoint',\n leaf: leafLabel,\n variant: 'mutation',\n keys: mutationKey,\n })\n const { onReceive: useOnReceive, ...runtimeMutationOptions } = (useEndpointOptions ??\n {}) as MutationUseEndpointOptionsFor<L>\n const mergedMutationOptions = {\n ...mutationBuildQueryOptions,\n ...runtimeMutationOptions,\n }\n\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>())\n const notifyListeners = useCallback((data: InferOutput<L>) => {\n listenersRef.current.forEach((listener) => listener(data))\n }, [])\n const registerOnReceive = useCallback(\n (listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener)\n return () => {\n listenersRef.current.delete(listener)\n }\n },\n [],\n )\n\n const mutationResult = useMutation<\n InferOutput<L>,\n unknown,\n InferBodyInput<L>,\n unknown\n >(\n {\n ...mergedMutationOptions,\n mutationKey: mutationKey as unknown as QueryKey,\n mutationFn: async (body: InferBodyInput<L>) => {\n const result = await fetchMutation(\n ...([...tuple, body] as [...ArgsTuple<L>, InferBodyInput<L>]),\n )\n useOnReceive?.(result)\n notifyListeners(result)\n return result\n },\n },\n queryClient,\n )\n\n return { ...mutationResult, onReceive: registerOnReceive }\n }\n\n return {\n getQueryKeys,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n fetch: fetchMutation,\n } as BuiltMutation<L>\n}\n","// routesV3.client.ts\n\nimport {\n type AnyLeafLowProfile,\n type HttpMethod,\n} from '@emeryld/rrroutes-contract'\nimport { type QueryKey } from '@tanstack/react-query'\nimport { buildBatchBranch } from './routesV3.client.batch'\nimport { defaultFetcher } from './routesV3.client.fetch'\nimport { buildGetLeaf } from './routesV3.client.get'\nimport { buildInfiniteGetLeaf } from './routesV3.client.infiniteGet'\nimport { buildMutationLeaf } from './routesV3.client.mutation'\nimport {\n compileRawPath,\n normalizeFlatQuery,\n toSearchString,\n toUpper,\n} from './routesV3.client.shared'\nimport type {\n BranchBuildOptions,\n BuildMeta,\n BuildOptionsFor,\n BuiltForLeaf,\n BuiltLeafMap,\n RouteClient,\n RouteClientDebugEvent,\n RouteClientDebugLogger,\n RouteClientDebugMode,\n RouteClientDebugOptions,\n RouteClientDebugToggleOptions,\n RouteClientFetchArgs,\n RouteClientOptions,\n RouterBuilder,\n} from './routesV3.client.types'\n\nconst BUILT_LEAF_META = '__rrroutesLeaf' as const\ntype BuiltLeafWithMeta = {\n [BUILT_LEAF_META]?: AnyLeafLowProfile\n}\n\n// -----------------------------------------------------------------------------\n// Debug logging\n// -----------------------------------------------------------------------------\n\nconst noopDebugLogger: RouteClientDebugLogger = () => {}\n\nconst defaultDebugLogger: RouteClientDebugLogger = (\n event: RouteClientDebugEvent,\n) => {\n if (typeof console === 'undefined') return\n const fn = console.debug ?? console.log\n fn?.call(console, '[rrroutes-client]', event)\n}\n\nconst debugEventTypes: RouteClientDebugEvent['type'][] = [\n 'fetch',\n 'invalidate',\n 'setData',\n 'build',\n 'useEndpoint',\n]\n\ntype DebugEmitter<Names extends string> = {\n emit: (event: RouteClientDebugEvent, name?: Names) => void\n mode: RouteClientDebugMode\n}\n\nconst noopEmit = () => {}\n\nfunction createDebugEmitter<Names extends string>(\n option?: RouteClientDebugOptions<Names>,\n environment?: string,\n): DebugEmitter<Names> {\n const disabled: DebugEmitter<Names> = { emit: noopEmit, mode: 'minimal' }\n\n if (environment && environment.toLowerCase() === 'production') {\n return disabled\n }\n\n if (!option) {\n return disabled\n }\n if (option === true || option === 'minimal') {\n return {\n emit: (event, name) =>\n defaultDebugLogger(name ? { ...event, name } : event),\n mode: 'minimal',\n }\n }\n if (option === 'complete') {\n return {\n emit: (event, name) =>\n defaultDebugLogger(name ? { ...event, name } : event),\n mode: 'complete',\n }\n }\n if (typeof option === 'function') {\n return {\n emit: (event, name) => option(name ? { ...event, name } : event),\n mode: 'minimal',\n }\n }\n if (typeof option === 'object') {\n const toggles = option as RouteClientDebugToggleOptions<Names>\n const verbose = Boolean(toggles.verbose)\n const enabledTypes = debugEventTypes.filter((type) => toggles[type])\n if (enabledTypes.length === 0) {\n return { emit: noopEmit, mode: verbose ? 'complete' : 'minimal' }\n }\n const whitelist = new Set<RouteClientDebugEvent['type']>(enabledTypes)\n const onlySet =\n toggles.only && toggles.only.length > 0\n ? new Set<Names>(toggles.only)\n : undefined\n const logger = toggles.logger ?? defaultDebugLogger\n const emit: DebugEmitter<Names>['emit'] = (event, name) => {\n if (!whitelist.has(event.type)) return\n if (onlySet) {\n if (!name || !onlySet.has(name)) return\n }\n logger(name ? { ...event, name } : event)\n }\n return { emit, mode: verbose ? 'complete' : 'minimal' }\n }\n\n return disabled\n}\n\n// -----------------------------------------------------------------------------\n// Client factory\n// -----------------------------------------------------------------------------\n\nexport function createRouteClient<Names extends string = string>(\n opts: RouteClientOptions<Names>,\n): RouteClient<Names> {\n const queryClient = opts.queryClient\n const fetcher = opts.fetcher ?? defaultFetcher\n const baseUrl = opts.baseUrl\n const environment = opts.environment ?? undefined\n const validateResponses = opts.validateResponses ?? true\n\n const { emit: emitDebug, mode: debugMode } = createDebugEmitter<Names>(\n opts.debug,\n environment,\n )\n const isVerboseDebug = debugMode === 'complete'\n\n const decorateDebugEvent = <T extends RouteClientDebugEvent>(\n event: T,\n details?: Partial<RouteClientDebugEvent>,\n ): RouteClientDebugEvent => {\n if (!isVerboseDebug || !details) return event\n return { ...event, ...details } as RouteClientDebugEvent\n }\n\n async function invalidate(prefix: string[], exact = false) {\n const queryKey = prefix as unknown as QueryKey\n await queryClient.invalidateQueries({ queryKey, exact })\n emitDebug({ type: 'invalidate', key: queryKey, exact })\n }\n\n const toArgsTuple = (args: unknown) =>\n (typeof args === 'undefined' ? [] : [args]) as unknown[]\n\n const getBuiltLeaf = (built: unknown) => {\n const leaf = (built as BuiltLeafWithMeta)[BUILT_LEAF_META]\n if (!leaf) {\n throw new Error(\n 'buildBranch(...) expects endpoints created with this route client via client.build(...).',\n )\n }\n return leaf\n }\n\n const encodeLeafKey = (leaf: AnyLeafLowProfile) =>\n encodeURIComponent(`${leaf.method.toUpperCase()} ${leaf.path}`)\n\n function buildInternal<L extends AnyLeafLowProfile>(\n leaf: L,\n rqOpts?: BuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ): BuiltForLeaf<L> {\n const leafLabel = `${leaf.method.toUpperCase()} ${String(leaf.path)}`\n const debugName = meta?.name\n const emit = (event: RouteClientDebugEvent) => emitDebug(event, debugName)\n\n const isGet = leaf.method === 'get'\n const isFeed = !!leaf.cfg.feed\n\n const env = {\n baseUrl,\n validateResponses,\n fetcher,\n queryClient,\n emit,\n decorateDebugEvent,\n isVerboseDebug,\n leafLabel,\n }\n\n let built: BuiltForLeaf<L>\n if (isGet && isFeed) {\n built = buildInfiniteGetLeaf(\n leaf,\n rqOpts as any,\n env,\n ) as unknown as BuiltForLeaf<L>\n } else if (isGet) {\n built = buildGetLeaf(\n leaf,\n rqOpts as any,\n env,\n ) as unknown as BuiltForLeaf<L>\n } else {\n built = buildMutationLeaf(\n leaf,\n rqOpts as any,\n env,\n ) as unknown as BuiltForLeaf<L>\n }\n\n Object.defineProperty(built as object, BUILT_LEAF_META, {\n value: leaf,\n enumerable: false,\n configurable: false,\n writable: false,\n })\n\n return built\n }\n\n const fetchRaw: RouteClient<Names>['fetch'] = async (\n input: RouteClientFetchArgs,\n ) => {\n const { path, method, query, body, params } = input as any\n\n if (!path || typeof path !== 'string') {\n throw new Error('fetch(path, ...) requires a non-empty string path.')\n }\n if (!method) {\n throw new Error('fetch(path, method, ...) requires an HTTP method.')\n }\n\n const methodLower = String(method).toLowerCase() as HttpMethod\n const methodUpper = toUpper(methodLower)\n\n const flatQuery = normalizeFlatQuery(query)\n const search = toSearchString(flatQuery as Record<string, unknown>)\n\n const compiledPath = compileRawPath(path, params)\n const url = `${baseUrl ?? ''}${compiledPath}${search}`\n const leafLabel = `${methodUpper} ${path}`\n\n const startedAt = Date.now()\n const detail = isVerboseDebug\n ? { params, flatQuery, query, baseUrl }\n : undefined\n\n emitDebug(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method: methodUpper,\n url,\n leaf: leafLabel,\n ...(body !== undefined ? { body } : {}),\n },\n detail,\n ),\n )\n\n try {\n const out = await fetcher<unknown>(\n body === undefined\n ? { url, method: methodUpper, headers: input.headers }\n : { url, method: methodUpper, body, headers: input.headers },\n )\n\n emitDebug(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'fetched',\n method: methodUpper,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? { params, query: flatQuery, output: out }\n : undefined,\n ),\n )\n\n return out\n } catch (error) {\n emitDebug(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'error',\n method: methodUpper,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n ...(body !== undefined ? { body } : {}),\n error,\n },\n detail,\n ),\n )\n throw error\n }\n }\n\n const buildBranchInternal: RouteClient<Names>['buildBranch'] = <\n T extends BuiltLeafMap,\n >(\n leaves: T,\n options: BranchBuildOptions,\n ) =>\n buildBatchBranch(leaves, options, {\n fetchRaw,\n queryClient,\n validateResponses,\n getBuiltLeaf,\n encodeLeafKey,\n toArgsTuple,\n })\n\n return {\n queryClient,\n invalidate,\n fetch: fetchRaw,\n build: buildInternal as RouteClient<Names>['build'],\n buildBranch: buildBranchInternal as RouteClient<Names>['buildBranch'],\n }\n}\n\n// -----------------------------------------------------------------------------\n// Router builder\n// -----------------------------------------------------------------------------\n\nexport function buildRouter<\n Routes extends Record<PropertyKey, AnyLeafLowProfile>,\n Names extends string = string,\n>(\n routeClient: RouteClient<Names>,\n routes: Routes,\n): RouterBuilder<Routes, Names> {\n const buildLeaf = routeClient.build as <L extends AnyLeafLowProfile>(\n leaf: L,\n options?: BuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ) => BuiltForLeaf<L>\n\n return ((key, opts, meta) =>\n buildLeaf(\n routes[key],\n opts as BuildOptionsFor<Routes[typeof key]>,\n meta,\n )) as RouterBuilder<Routes, Names>\n}\n","import type {\n EventMap,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport * as React from 'react'\nimport type { Socket } from 'socket.io-client'\nimport { SocketCtx, useSocketClient } from './socket.client.context.client'\nimport {\n useSocketConnection,\n type UseSocketConnectionArgs,\n} from './socket.client.context.connection'\nimport {\n dbg,\n describeSocketLike,\n SocketProviderDebugOptions,\n summarizeBaseOptions,\n summarizeEvents,\n summarizeMeta,\n trackHookTrigger,\n type HookDebugSnapshot,\n} from './socket.client.context.debug'\nimport { SocketClient, type SocketClientOptions } from './socket.client.core'\n\ntype BaseOptions<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n> = Omit<SocketClientOptions<T, C>, 'socket'>\n\ntype ProviderRuntimeSocket =\n | { socket: Socket | null }\n | { getSocket: () => Socket | Promise<Socket> }\n\ntype SocketProviderProps<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n> = React.PropsWithChildren<\n {\n events: T\n baseOptions: BaseOptions<T, C>\n fallback?: React.ReactNode\n providerDebug?: SocketProviderDebugOptions\n destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>\n } & ProviderRuntimeSocket\n>\n\nexport function buildSocketProvider<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(args: {\n /** The events map for the SocketClient. This is required to ensure type safety when using the client and connection hooks. */\n events: T\n /** The base options for the SocketClient. This includes all options except the socket instance and debug options. */\n options: Omit<BaseOptions<T, C>, 'debug'> & {\n /** Optional debug configuration.\n * emit: when emitting an event\n * receive: when receiving an event\n * connection: on connect/reconnect/disconnect/connect_error\n * lifecycle: on client init and destroy\n * heartbeat: on ping emit, pong receive, and validation failures\n * config: when logging the socket config snapshot (only if debug.logger is set)\n * room: on room join and leave attempts\n * register: when registering and unregistering event handlers\n * resolve: when resolving the socket from getSocket, including start, success, failure, and cancellation\n * client: when the SocketClient instance is created or destroyed, or if the socket is missing on init\n * render: on each render of the provider, including whether the client is available\n * hook: when key hooks are triggered, such as receiving endpoint data or applying socket messages, along with snapshots of relevant state\n */\n debug: BaseOptions<T, C>['debug'] & SocketProviderDebugOptions\n }\n}) {\n const { events, options: baseOptions } = args\n\n return {\n SocketProvider: (\n props: React.PropsWithChildren<\n ProviderRuntimeSocket & {\n fallback?: React.ReactNode\n destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>\n }\n >,\n ) => (\n <SocketProvider<T, C>\n events={events}\n baseOptions={baseOptions}\n providerDebug={baseOptions.debug}\n {...props}\n />\n ),\n useSocketClient: () => useSocketClient<T, C>(),\n useSocketConnection: <K extends keyof T & string>(\n p: UseSocketConnectionArgs<T, K, C>,\n ) => useSocketConnection<T, K, C>(p),\n }\n}\n\nfunction SocketProvider<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(props: SocketProviderProps<T, C>) {\n const {\n events,\n baseOptions,\n children,\n fallback,\n providerDebug,\n destroyLeaveMeta,\n } = props\n\n const [resolvedSocket, setResolvedSocket] = React.useState<Socket | null>(\n null,\n )\n\n const socket: Socket | null =\n 'socket' in props ? (props.socket ?? null) : resolvedSocket\n\n const providerDebugRef = React.useRef<\n SocketProviderDebugOptions | undefined\n >()\n providerDebugRef.current = providerDebug\n\n const resolveEffectDebugRef = React.useRef<HookDebugSnapshot | null>(null)\n const clientMemoDebugRef = React.useRef<HookDebugSnapshot | null>(null)\n const destroyEffectDebugRef = React.useRef<HookDebugSnapshot | null>(null)\n\n React.useEffect(() => {\n trackHookTrigger({\n ref: resolveEffectDebugRef,\n hook: 'resolve_effect',\n providerDebug: providerDebugRef.current,\n snapshot: {\n resolvedSocket: describeSocketLike(resolvedSocket),\n },\n })\n\n if (!('getSocket' in props)) return\n\n let cancelled = false\n dbg(providerDebugRef.current, { type: 'resolve', phase: 'start' })\n\n if (!resolvedSocket) {\n Promise.resolve(props.getSocket())\n .then((s) => {\n if (cancelled) {\n dbg(providerDebugRef.current, {\n type: 'resolve',\n phase: 'cancelled',\n })\n return\n }\n if (!s) {\n dbg(providerDebugRef.current, {\n type: 'resolve',\n phase: 'socketMissing',\n })\n return\n }\n setResolvedSocket(s)\n dbg(providerDebugRef.current, { type: 'resolve', phase: 'ok' })\n })\n .catch((err) => {\n if (cancelled) return\n dbg(providerDebugRef.current, {\n type: 'resolve',\n phase: 'error',\n err: String(err),\n })\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [resolvedSocket])\n\n trackHookTrigger({\n ref: clientMemoDebugRef,\n hook: 'client_memo',\n providerDebug: providerDebugRef.current,\n snapshot: {\n events: summarizeEvents(events),\n baseOptions: summarizeBaseOptions(baseOptions),\n socket: describeSocketLike(socket),\n },\n })\n\n const client = React.useMemo(() => {\n if (!socket) {\n dbg(providerDebugRef.current, {\n type: 'client',\n phase: 'init',\n missing: true,\n })\n return null\n }\n const c = new SocketClient<T, C>(events, { ...baseOptions, socket })\n dbg(providerDebugRef.current, {\n type: 'client',\n phase: 'init',\n missing: false,\n })\n return c\n }, [events, baseOptions, socket])\n\n const destroyLeaveMetaRef = React.useRef(destroyLeaveMeta)\n React.useEffect(() => {\n destroyLeaveMetaRef.current = destroyLeaveMeta\n }, [destroyLeaveMeta])\n\n React.useEffect(() => {\n trackHookTrigger({\n ref: destroyEffectDebugRef,\n hook: 'destroy_effect',\n providerDebug: providerDebugRef.current,\n snapshot: {\n hasClient: !!client,\n destroyLeaveMeta: summarizeMeta(\n destroyLeaveMetaRef.current,\n 'destroyLeaveMeta',\n ),\n },\n })\n\n return () => {\n if (client) {\n void Promise.resolve(client.destroy(destroyLeaveMetaRef.current))\n .then(() => {\n dbg(providerDebugRef.current, { type: 'client', phase: 'destroy' })\n })\n .catch((error) => {\n dbg(providerDebugRef.current, {\n type: 'resolve',\n phase: 'error',\n err: `client.destroy failed: ${String(error)}`,\n })\n })\n }\n }\n }, [client])\n\n dbg(providerDebugRef.current, { type: 'render', hasClient: !!client })\n\n return (\n <SocketCtx.Provider value={client}>\n {client == null ? (fallback ?? children) : children}\n </SocketCtx.Provider>\n )\n}\n","import type {\n EventMap,\n SocketConnectionConfigOutput,\n} from '@emeryld/rrroutes-contract'\nimport * as React from 'react'\nimport { SocketClient } from './socket.client.core'\n\nexport const SocketCtx = React.createContext<SocketClient<\n any,\n SocketConnectionConfigOutput\n> | null | undefined>(undefined)\n\nexport function useSocketClient<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(): SocketClient<T, C> | null {\n const ctx = React.useContext(SocketCtx)\n if (typeof ctx === 'undefined') {\n throw new Error('SocketClient not found. Wrap with <SocketProvider>.')\n }\n if (!ctx) {\n return null\n }\n return ctx as unknown as SocketClient<T, C> | null\n}\n","import type {\n EventMap,\n Payload,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport * as React from 'react'\nimport { useSocketClient } from './socket.client.context.client'\nimport type { ClientCtx, ServerEnvelope } from './socket.client.core'\n\ntype Rooms = string[] | string | undefined\n\nexport type UseSocketConnectionDebugEvent =\n | {\n type: 'lifecycle'\n phase: 'effect_start' | 'effect_cleanup' | 'client_missing'\n event: string\n rooms: string[]\n autoJoin: boolean\n autoLeave: boolean\n }\n | {\n type: 'subscription'\n phase: 'register' | 'unregister' | 'message'\n event: string\n }\n | {\n type: 'room'\n phase:\n | 'join_attempt'\n | 'join_ok'\n | 'join_error'\n | 'leave_attempt'\n | 'leave_ok'\n | 'leave_error'\n | 'join_skip'\n | 'leave_skip'\n rooms: string[]\n reason?: 'no_rooms' | 'auto_disabled'\n err?: string\n }\n\nexport type UseSocketConnectionDebugOptions = {\n enabled?: boolean\n logger?: (event: UseSocketConnectionDebugEvent) => void\n lifecycle?: boolean\n subscription?: boolean\n room?: boolean\n warnIfClientMissing?: boolean\n throwIfClientMissing?: boolean\n}\n\nexport type UseSocketConnectionArgs<\n T extends EventMap,\n K extends keyof T & string,\n C extends SocketConnectionConfigOutput,\n> = {\n event: K\n rooms?: Rooms\n onMessage: (\n payload: Payload<T, K>,\n meta?: { envelope: ServerEnvelope<T[K]['__out']>; ctx: ClientCtx },\n ) => void\n onCleanup?: () => void\n autoJoin?: boolean\n autoLeave?: boolean\n debug?: UseSocketConnectionDebugOptions\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>\n}\n\nexport function useSocketConnection<\n T extends EventMap,\n K extends keyof T & string,\n C extends SocketConnectionConfigOutput,\n>(args: UseSocketConnectionArgs<T, K, C>) {\n const {\n event,\n rooms,\n onMessage,\n onCleanup,\n autoJoin = true,\n autoLeave = true,\n debug,\n } = args\n const client = useSocketClient<T, C>()\n\n const normalizedRooms = React.useMemo(\n () => (rooms == null ? [] : Array.isArray(rooms) ? rooms : [rooms]),\n [rooms],\n )\n const normalizedRoomsKey = React.useMemo(\n () => normalizedRooms.join('\\u0001'),\n [normalizedRooms],\n )\n const joinMetaKey = React.useMemo(\n () => JSON.stringify(args.joinMeta ?? null),\n [args.joinMeta],\n )\n const leaveMetaKey = React.useMemo(\n () => JSON.stringify(args.leaveMeta ?? null),\n [args.leaveMeta],\n )\n const missingClientWarnedRef = React.useRef(false)\n\n const emitDebug = React.useCallback(\n (event: UseSocketConnectionDebugEvent) => {\n if (!debug?.enabled) return\n if (debug[event.type] === false) return\n const logger = debug.logger\n if (logger) {\n try {\n logger(event)\n } catch (error) {\n if (\n typeof console !== 'undefined' &&\n typeof console.warn === 'function'\n ) {\n // eslint-disable-next-line no-console\n console.warn('[socket] useSocketConnection debug logger threw', error)\n }\n }\n return\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n // eslint-disable-next-line no-console\n console.log('[socket] useSocketConnection', event)\n }\n },\n [debug],\n )\n\n const reportAsyncError = React.useCallback(\n (phase: 'joinRooms' | 'leaveRooms', error: unknown) => {\n if (\n typeof console !== 'undefined' &&\n typeof console.warn === 'function'\n ) {\n // eslint-disable-next-line no-console\n console.warn(`[socket] useSocketConnection ${phase} failed`, error)\n }\n },\n [],\n )\n\n React.useEffect(() => {\n emitDebug({\n type: 'lifecycle',\n phase: 'effect_start',\n event,\n rooms: normalizedRooms,\n autoJoin,\n autoLeave,\n })\n\n if (!client) {\n emitDebug({\n type: 'lifecycle',\n phase: 'client_missing',\n event,\n rooms: normalizedRooms,\n autoJoin,\n autoLeave,\n })\n if (debug?.throwIfClientMissing) {\n throw new Error(\n `useSocketConnection(\"${event}\") missing SocketClient. Wrap with <SocketProvider>.`,\n )\n }\n if (\n debug?.warnIfClientMissing &&\n !missingClientWarnedRef.current &&\n typeof console !== 'undefined' &&\n typeof console.warn === 'function'\n ) {\n missingClientWarnedRef.current = true\n // eslint-disable-next-line no-console\n console.warn(\n `[socket] useSocketConnection(\"${event}\") skipped because SocketClient is null.`,\n )\n }\n return\n }\n\n missingClientWarnedRef.current = false\n emitDebug({ type: 'subscription', phase: 'register', event })\n\n if (autoJoin && normalizedRooms.length > 0) {\n emitDebug({\n type: 'room',\n phase: 'join_attempt',\n rooms: normalizedRooms,\n })\n void client\n .joinRooms(normalizedRooms, args.joinMeta)\n .then(() => {\n emitDebug({ type: 'room', phase: 'join_ok', rooms: normalizedRooms })\n })\n .catch((error) => {\n emitDebug({\n type: 'room',\n phase: 'join_error',\n rooms: normalizedRooms,\n err: String(error),\n })\n reportAsyncError('joinRooms', error)\n })\n } else {\n emitDebug({\n type: 'room',\n phase: 'join_skip',\n rooms: normalizedRooms,\n reason: autoJoin ? 'no_rooms' : 'auto_disabled',\n })\n }\n\n const unsubscribe = client.on(event, (payload, meta) => {\n emitDebug({ type: 'subscription', phase: 'message', event })\n onMessage(payload, meta)\n })\n\n return () => {\n emitDebug({ type: 'subscription', phase: 'unregister', event })\n unsubscribe()\n if (autoLeave && normalizedRooms.length > 0) {\n emitDebug({\n type: 'room',\n phase: 'leave_attempt',\n rooms: normalizedRooms,\n })\n void client\n .leaveRooms(normalizedRooms, args.leaveMeta)\n .then(() => {\n emitDebug({ type: 'room', phase: 'leave_ok', rooms: normalizedRooms })\n })\n .catch((error) => {\n emitDebug({\n type: 'room',\n phase: 'leave_error',\n rooms: normalizedRooms,\n err: String(error),\n })\n reportAsyncError('leaveRooms', error)\n })\n } else {\n emitDebug({\n type: 'room',\n phase: 'leave_skip',\n rooms: normalizedRooms,\n reason: autoLeave ? 'no_rooms' : 'auto_disabled',\n })\n }\n if (onCleanup) onCleanup()\n emitDebug({\n type: 'lifecycle',\n phase: 'effect_cleanup',\n event,\n rooms: normalizedRooms,\n autoJoin,\n autoLeave,\n })\n }\n }, [\n client,\n event,\n onMessage,\n onCleanup,\n autoJoin,\n autoLeave,\n debug,\n emitDebug,\n reportAsyncError,\n normalizedRoomsKey,\n joinMetaKey,\n leaveMetaKey,\n ])\n}\n","import type * as React from 'react'\n\ntype HookDebugReason = 'init' | 'change'\ntype HookDebugValue = string | number | boolean | null | undefined\n\nexport type SocketProviderDebugEvent =\n | {\n type: 'resolve'\n phase: 'start' | 'ok' | 'error' | 'socketMissing' | 'cancelled'\n err?: string\n }\n | { type: 'client'; phase: 'init' | 'destroy'; missing?: boolean }\n | { type: 'render'; hasClient: boolean }\n | {\n type: 'hook'\n phase: 'resolve_effect' | 'client_memo' | 'destroy_effect'\n reason: HookDebugReason\n changes: Array<{\n dependency: string\n previous: HookDebugValue\n next: HookDebugValue\n }>\n }\n\nexport type SocketProviderDebugOptions = {\n verbose?: boolean\n logger?: (e: SocketProviderDebugEvent) => void\n} & {\n [P in SocketProviderDebugEvent['type']]?: boolean\n}\n\nexport type HookDebugSnapshot = Record<string, unknown>\ntype HookIdentifier = Extract<\n SocketProviderDebugEvent,\n { type: 'hook' }\n>['phase']\n\nexport function dbg(\n dbgOpts: SocketProviderDebugOptions | undefined,\n e: SocketProviderDebugEvent,\n) {\n if (!dbgOpts?.logger) return\n if (!dbgOpts[e.type]) return\n try {\n dbgOpts.logger(e)\n } catch (error) {\n if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n // eslint-disable-next-line no-console\n console.warn('[socket] provider debug logger threw', error)\n }\n }\n}\n\nfunction isProbablySocket(value: unknown): value is {\n id?: string\n connected?: boolean\n recovered?: boolean\n} {\n if (!value || typeof value !== 'object') return false\n const anyVal = value as any\n const ctorName = anyVal.constructor?.name\n if (ctorName === 'Socket') return true\n return (\n ('connected' in anyVal || 'recovered' in anyVal) &&\n typeof anyVal.on === 'function' &&\n typeof anyVal.emit === 'function'\n )\n}\n\nexport function describeSocketLike(\n value: { id?: string; connected?: boolean; recovered?: boolean } | null,\n): HookDebugValue {\n if (!value) return null\n const id = value.id ?? 'unknown'\n const connected = value.connected ?? false\n const recovered =\n typeof value.recovered === 'boolean' ? ` recovered=${value.recovered}` : ''\n return `[Socket id=${id} connected=${connected}${recovered}]`\n}\n\nfunction safeDescribeHookValue(value: unknown): HookDebugValue {\n if (value == null) return value as null | undefined\n\n const valueType = typeof value\n if (\n valueType === 'string' ||\n valueType === 'number' ||\n valueType === 'boolean'\n ) {\n return value as HookDebugValue\n }\n if (valueType === 'bigint' || valueType === 'symbol') return String(value)\n if (valueType === 'function')\n return `[function ${(value as Function).name || 'anonymous'}]`\n if (Array.isArray(value)) return `[array length=${value.length}]`\n\n if (isProbablySocket(value)) return describeSocketLike(value)\n\n const ctorName =\n (value as { constructor?: { name?: string } }).constructor?.name ?? 'object'\n const keys = Object.keys(value as Record<string, unknown>)\n const keyPreview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n return `[${ctorName} keys=${keyPreview}${suffix}]`\n}\n\nexport function summarizeEvents(events: unknown): HookDebugValue {\n if (!events || typeof events !== 'object')\n return safeDescribeHookValue(events)\n const keys = Object.keys(events as Record<string, unknown>)\n if (!keys.length) return '[events empty]'\n const preview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n return `[events count=${keys.length} keys=${preview}${suffix}]`\n}\n\nexport function summarizeBaseOptions(options: unknown): HookDebugValue {\n if (!options || typeof options !== 'object')\n return safeDescribeHookValue(options)\n const obj = options as Record<string, unknown>\n const keys = Object.keys(obj)\n if (!keys.length) return '[baseOptions empty]'\n\n const preview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n const hasDebug = 'debug' in obj\n return `[baseOptions keys=${preview}${suffix} debug=${hasDebug}]`\n}\n\nexport function summarizeMeta(meta: unknown, label: string): HookDebugValue {\n if (meta == null) return null\n if (typeof meta !== 'object') return safeDescribeHookValue(meta)\n const keys = Object.keys(meta as Record<string, unknown>)\n if (!keys.length) return `[${label} empty]`\n const preview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n return `[${label} keys=${preview}${suffix}]`\n}\n\nfunction createHookDebugEvent(\n prev: HookDebugSnapshot | null,\n next: HookDebugSnapshot,\n hook: HookIdentifier,\n): Extract<SocketProviderDebugEvent, { type: 'hook' }> | null {\n const reason: HookDebugReason = prev ? 'change' : 'init'\n const changed = Object.keys(next).reduce<\n Array<{\n dependency: string\n previous: HookDebugValue\n next: HookDebugValue\n }>\n >((acc, dependency) => {\n const prevValue = prev ? prev[dependency] : undefined\n const nextValue = next[dependency]\n if (!prev || !Object.is(prevValue, nextValue)) {\n acc.push({\n dependency,\n previous: safeDescribeHookValue(prevValue),\n next: safeDescribeHookValue(nextValue),\n })\n }\n return acc\n }, [])\n\n if (!changed.length) return null\n return { type: 'hook', phase: hook, reason, changes: changed }\n}\n\nexport function trackHookTrigger({\n ref,\n hook,\n providerDebug,\n snapshot,\n}: {\n ref: React.MutableRefObject<HookDebugSnapshot | null>\n hook: HookIdentifier\n providerDebug?: SocketProviderDebugOptions\n snapshot: HookDebugSnapshot\n}) {\n const prev = ref.current\n ref.current = snapshot\n if (!providerDebug?.logger || !providerDebug?.hook) return\n const event = createHookDebugEvent(prev, snapshot, hook)\n if (event) dbg(providerDebug, event)\n}\n","// socket.client.sys.ts\n\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport type { Socket } from 'socket.io-client'\nimport { z } from 'zod'\nimport type { SocketClient } from './socket.client.core'\n\nexport type MaybeSocket = Socket | null\n\nexport type SysEventMap<\n T extends EventMap,\n C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput,\n> = {\n /** Connect event, triggered when the socket successfully connects to the server. */\n 'sys:connect': (args: {\n socket: Socket\n client: SocketClient<T, C>\n }) => Promise<void> | void\n /** Disconnect event, triggered when the socket disconnects from the server. */\n 'sys:disconnect': (args: {\n socket: Socket\n client: SocketClient<T, C>\n reason: string\n }) => Promise<void> | void\n /** Reconnect attempt event, triggered when the socket attempts to reconnect after a disconnection. */\n 'sys:reconnect': (args: {\n socket: Socket\n attempt: number\n client: SocketClient<T, C>\n }) => Promise<void> | void\n /** Connect error event, triggered when the socket encounters an error while trying to connect to the server. */\n 'sys:connect_error': (args: {\n socket: Socket\n client: SocketClient<T, C>\n error: string\n }) => Promise<void> | void\n /** Ping event, triggered by the server to check if the client is still responsive. The client can respond with a pong event, optionally including a payload defined by the server. */\n 'sys:ping': (args: {\n socket: Socket\n client: SocketClient<T, C>\n }) =>\n | Promise<SocketSchemaOutput<C['pingPayload']>>\n | SocketSchemaOutput<C['pingPayload']>\n /** Pong event, triggered in response to a ping event, allowing the client to send a payload back to the server. */\n 'sys:pong': (args: {\n socket: Socket\n client: SocketClient<T, C>\n payload: SocketSchemaOutput<C['pongPayload']>\n }) => Promise<void> | void\n /** Room join event, triggered when the client attempts to join one or more rooms. Return true to allow the join, or false to deny it. */\n 'sys:room_join': (args: {\n socket: Socket\n client: SocketClient<T, C>\n rooms: string | string[]\n meta: SocketSchemaOutput<C['joinMetaMessage']>\n }) => Promise<boolean> | boolean\n /** Room leave event, triggered when the client attempts to leave one or more rooms. Return true to allow the leave, or false to deny it. */\n 'sys:room_leave': (args: {\n socket: Socket\n client: SocketClient<T, C>\n rooms: string | string[]\n meta: SocketSchemaOutput<C['leaveMetaMessage']>\n }) => Promise<boolean> | boolean\n}\n\nconst roomValueSchema = z.union([z.array(z.string()), z.string()])\n\nexport type RoomPayloadSchema<Meta extends z.ZodTypeAny> = z.ZodObject<{\n rooms: typeof roomValueSchema\n meta: Meta\n}>\n\nexport const buildRoomPayloadSchema = <Meta extends z.ZodTypeAny>(\n metaSchema: Meta,\n): RoomPayloadSchema<Meta> =>\n z.object({\n rooms: roomValueSchema,\n meta: metaSchema,\n })\n","// socket.client.core.ts\n\nimport type {\n EventMap,\n Payload,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport type { ManagerOptions } from 'socket.io-client'\nimport { z } from 'zod'\nimport {\n SocketClientConfigSnapshot,\n SocketClientDebugEvent,\n} from './socket.client.debug'\nimport type {\n MaybeSocket,\n RoomPayloadSchema,\n SysEventMap,\n} from './socket.client.sys'\nimport { buildRoomPayloadSchema } from './socket.client.sys'\n\nexport type ServerEnvelope<Payload> = {\n eventName: string\n sentAt: string | Date\n sentTo: string[]\n data?: Payload\n metadata?: Record<string, unknown>\n rooms: string[]\n}\n\nexport type ClientCtx = {\n receivedAt: Date\n latencyMs?: number\n nsp?: string\n socketId?: string\n socket?: MaybeSocket\n reply?: (data?: unknown) => void\n}\n\nexport type ClientStatsSnapshot = {\n roomsCount: number\n totalHandlers: number\n rooms: { room: string; count: number }[]\n handlers: { event: string; handlers: number }[]\n}\n\n// helper, since original code used NoInfer\ntype NoInfer<T> = [T][T extends any ? 0 : never]\n\ntype RoomPayload<Meta extends z.ZodTypeAny> = z.output<RoomPayloadSchema<Meta>>\n\ntype SocketManagerIntrospect = {\n uri?: string\n opts?: Partial<ManagerOptions>\n engine?: {\n transport?: {\n name?: string\n }\n }\n _readyState?: string\n}\n\nexport type SocketClientDebugOptions<K extends string = string> = {\n verbose?: boolean\n only?: K[]\n logger?: (e: SocketClientDebugEvent<K>) => void\n} & {\n [P in SocketClientDebugEvent['type']]?: boolean\n}\n\n/** === Heartbeat config (now only timing + optional onPong) === */\nexport type HeartbeatClientOptions = {\n /** Interval between pings. Default 15_000. */\n intervalMs?: number\n /** Give up waiting for pong after this many ms. Default 7_500. */\n timeoutMs?: number\n}\n\nexport type SocketClientOptions<\n T extends EventMap = EventMap,\n C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput,\n> = {\n /** Inject an existing socket.io-client Socket. Can be null while bootstrapping. */\n socket: MaybeSocket\n /** The configuration of the ping/pong payload schemas and room join/leave meta message schemas. */\n config: C\n /** Optional debug configuration. */\n environment?: 'development' | 'production'\n /** Optional debug configuration.\n * emit: when emitting an event\n * receive: when receiving an event\n * connection: on connect/reconnect/disconnect/connect_error\n * lifecycle: on client init and destroy\n * heartbeat: on ping emit, pong receive, and validation failures\n * config: when logging the socket config snapshot (only if debug.logger is set)\n * room: on room join and leave attempts\n * register: when registering and unregistering event handlers\n */\n debug?: SocketClientDebugOptions\n /** Optional heartbeat configuration. If provided, the client will start the heartbeat loop on the default 'sys:connect' handler. */\n heartbeat?: HeartbeatClientOptions\n sys: SysEventMap<T, C>\n}\n\ntype HandlerEntry<T extends EventMap, K extends keyof T & string> = {\n orig: (\n payload: Payload<T, K>,\n meta: { envelope: ServerEnvelope<T[K]['__out']>; ctx: ClientCtx },\n ) => void\n wrapped: (\n envelopeOrRaw: ServerEnvelope<T[K]['__out']> | Payload<T, K>,\n ) => void\n errorWrapped: (e: unknown) => void\n}\n\nexport class SocketClient<\n T extends EventMap,\n C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput,\n> {\n readonly socket: MaybeSocket\n private readonly events: T\n private readonly environment: 'development' | 'production'\n private readonly debug: SocketClientDebugOptions<keyof T & string>\n\n private readonly config: C\n private readonly sysEvents: SysEventMap<T, C>\n private readonly roomJoinSchema: RoomPayloadSchema<C['joinMetaMessage']>\n private readonly roomLeaveSchema: RoomPayloadSchema<C['leaveMetaMessage']>\n\n // heartbeat\n private readonly hb: HeartbeatClientOptions\n private hbTimer: ReturnType<typeof setInterval> | null = null\n\n /** keep references so we can .off() later */\n private readonly onConnect: () => void\n private readonly onReconnect: (attempt: number) => void\n private readonly onDisconnect: (reason: unknown) => void\n private readonly onConnectError: (err: unknown) => void\n private readonly onPong: (raw: any) => void\n\n // stats\n private readonly roomCounts = new Map<string, number>()\n private readonly handlerMap = new Map<string, Set<HandlerEntry<T, any>>>()\n\n private snapshotSocketConfig(\n socket: MaybeSocket,\n ): SocketClientConfigSnapshot | null {\n if (!socket) return null\n const manager = (socket.io ??\n null) as unknown as SocketManagerIntrospect | null\n const base: SocketClientConfigSnapshot = {\n nsp: this.getNamespace(socket),\n }\n if (!manager) return base\n\n const opts = (manager.opts ?? {}) as Partial<ManagerOptions>\n const transports = Array.isArray(opts.transports)\n ? opts.transports.filter((t): t is string => typeof t === 'string')\n : undefined\n const transportName =\n typeof manager.engine?.transport?.name === 'string'\n ? manager.engine.transport?.name\n : undefined\n const readyState =\n typeof manager._readyState === 'string' ? manager._readyState : undefined\n const uri = typeof manager.uri === 'string' ? manager.uri : undefined\n\n return {\n ...base,\n url: uri,\n path: typeof opts.path === 'string' ? opts.path : undefined,\n transport: transportName ?? transports?.[0],\n transports,\n readyState,\n autoConnect:\n typeof opts.autoConnect === 'boolean' ? opts.autoConnect : undefined,\n reconnection:\n typeof opts.reconnection === 'boolean' ? opts.reconnection : undefined,\n reconnectionAttempts:\n typeof opts.reconnectionAttempts === 'number'\n ? opts.reconnectionAttempts\n : undefined,\n reconnectionDelay:\n typeof opts.reconnectionDelay === 'number'\n ? opts.reconnectionDelay\n : undefined,\n reconnectionDelayMax:\n typeof opts.reconnectionDelayMax === 'number'\n ? opts.reconnectionDelayMax\n : undefined,\n timeout: typeof opts.timeout === 'number' ? opts.timeout : undefined,\n hostname: typeof opts.hostname === 'string' ? opts.hostname : undefined,\n port:\n typeof opts.port === 'number' || typeof opts.port === 'string'\n ? opts.port\n : undefined,\n secure: typeof opts.secure === 'boolean' ? opts.secure : undefined,\n }\n }\n\n private logSocketConfigSnapshot(reason: string): void {\n if (!this.debug.logger || !this.debug.config) return\n const snapshot = this.snapshotSocketConfig(this.socket)\n this.dbg({\n type: 'config',\n phase: reason,\n ...(snapshot == null\n ? { err: 'Socket is missing. ' }\n : {\n socketId: this.socket?.id,\n snapshot: snapshot,\n }),\n })\n }\n\n private getValidationDetails(\n error: z.ZodError<any>,\n ): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined\n return { issues: error.issues }\n }\n\n private getVerboseDetails(\n details: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined\n return details\n }\n\n private formatError(error: unknown): string {\n if (error instanceof Error) return error.message\n if (typeof error === 'string') return error\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n }\n\n private getNamespace(socket: MaybeSocket): string | undefined {\n if (!socket) return undefined\n const nsp = (socket as any).nsp\n return typeof nsp === 'string' ? nsp : undefined\n }\n\n constructor(events: T, opts: SocketClientOptions<T, C>) {\n this.events = events\n this.socket = opts.socket ?? null\n\n this.environment = opts.environment ?? 'development'\n this.debug = opts.debug ?? {}\n this.config = opts.config\n this.sysEvents = opts.sys\n this.roomJoinSchema = buildRoomPayloadSchema(this.config.joinMetaMessage)\n this.roomLeaveSchema = buildRoomPayloadSchema(this.config.leaveMetaMessage)\n\n const hb = opts.heartbeat ?? {}\n this.hb = {\n intervalMs: hb.intervalMs ?? 15_000,\n timeoutMs: hb.timeoutMs ?? 7_500,\n }\n\n if (!this.socket) {\n this.dbg({\n type: 'lifecycle',\n phase: 'init',\n err: 'Socket reference is null during initialization',\n })\n } else {\n this.dbg({\n type: 'lifecycle',\n phase: 'init',\n heartbeatIntervalMs: this.hb.intervalMs,\n heartbeatTimeoutMs: this.hb.timeoutMs,\n environment: this.environment,\n })\n this.logSocketConfigSnapshot('constructor')\n }\n\n /* socket lifecycle → connection bucket, now sys map aware */\n this.onConnect = () => {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n id: socket.id,\n details: {\n nsp: this.getNamespace(socket),\n },\n })\n this.logSocketConfigSnapshot('connect_event')\n void Promise.resolve(\n this.getSysEvent('sys:connect')({\n socket,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n id: socket.id,\n err: `sys:connect handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n nsp: this.getNamespace(socket),\n rawError: error,\n }),\n })\n })\n }\n\n this.onReconnect = (attempt) => {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n attempt,\n id: socket.id,\n details: {\n nsp: this.getNamespace(socket),\n },\n })\n this.logSocketConfigSnapshot('reconnect_event')\n void Promise.resolve(\n this.getSysEvent('sys:reconnect')({\n attempt,\n socket,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n attempt,\n id: socket.id,\n err: `sys:reconnect handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n nsp: this.getNamespace(socket),\n rawError: error,\n }),\n })\n })\n }\n\n this.onDisconnect = (reason) => {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'disconnect_event',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n this.dbg({\n type: 'connection',\n phase: 'disconnect_event',\n reason: String(reason),\n details: {\n roomsTracked: this.roomCounts.size,\n },\n })\n this.logSocketConfigSnapshot('disconnect_event')\n void Promise.resolve(\n this.getSysEvent('sys:disconnect')({\n reason: String(reason),\n socket,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'connection',\n phase: 'disconnect_event',\n reason: String(reason),\n id: socket.id,\n err: `sys:disconnect handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n roomsTracked: this.roomCounts.size,\n rawError: error,\n }),\n })\n })\n }\n\n this.onConnectError = (err) => {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'connect_error_event',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n this.dbg({\n type: 'connection',\n phase: 'connect_error_event',\n err: String(err),\n details: this.getVerboseDetails({ rawError: err }),\n })\n this.logSocketConfigSnapshot('connect_error_event')\n void Promise.resolve(\n this.getSysEvent('sys:connect_error')({\n error: String(err),\n socket,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'connection',\n phase: 'connect_error_event',\n id: socket.id,\n err: `sys:connect_error handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n })\n }\n\n this.onPong = (raw: unknown) => {\n if (!this.socket) {\n this.dbg({\n type: 'heartbeat',\n phase: 'pong_recv',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n const parsed = this.config.pongPayload.safeParse(raw)\n if (!parsed.success) {\n this.dbg({\n type: 'heartbeat',\n phase: 'validation_failed',\n err: `pong payload validation failed: ${parsed.error.message}`,\n details: this.getValidationDetails(parsed.error),\n })\n return\n }\n const validated = parsed.data\n this.dbg({\n type: 'heartbeat',\n phase: 'pong_recv',\n payload: validated,\n })\n\n void Promise.resolve(\n this.getSysEvent('sys:pong')({\n socket,\n payload: validated as SocketSchemaOutput<\n (typeof this.config)['pongPayload']\n >,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'heartbeat',\n phase: 'pong_recv',\n err: `sys:pong handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n })\n }\n\n // register top-level listeners with stored refs (only if we have a socket)\n if (this.socket) {\n this.socket.on('connect', this.onConnect)\n this.socket.on('reconnect', this.onReconnect)\n this.socket.on('disconnect', this.onDisconnect)\n this.socket.on('connect_error', this.onConnectError)\n this.socket.on('sys:pong', this.onPong)\n }\n }\n\n private getSysEvent<K extends keyof SysEventMap<T, C>>(\n name: K,\n ): SysEventMap<T, C>[K] {\n return this.sysEvents[name]\n }\n\n private dbg(e: SocketClientDebugEvent<any>) {\n const d = this.debug\n if (!d.logger) return\n if (!d[e.type]) return\n if (d.only && 'event' in e && !d.only.includes(e.event as any)) return\n try {\n d.logger(e)\n } catch (error) {\n if (\n this.environment === 'development' &&\n typeof console !== 'undefined' &&\n typeof console.warn === 'function'\n ) {\n // eslint-disable-next-line no-console\n console.warn('[socket] debug logger threw', error)\n }\n }\n }\n\n /** internal stats snapshot */\n stats(): ClientStatsSnapshot {\n const rooms = Array.from(this.roomCounts.entries()).map(\n ([room, count]) => ({ room, count }),\n )\n const handlers = Array.from(this.handlerMap.entries()).map(\n ([event, set]) => ({\n event,\n handlers: set.size,\n }),\n )\n return {\n roomsCount: rooms.length,\n totalHandlers: handlers.reduce((a, b) => a + b.handlers, 0),\n rooms,\n handlers,\n }\n }\n\n private toArray(rooms?: string[] | string): string[] {\n return rooms == null ? [] : Array.isArray(rooms) ? rooms : [rooms]\n }\n\n private rollbackJoinIncrement(rooms: string[]) {\n for (const room of rooms) {\n const curr = this.roomCounts.get(room) ?? 0\n const next = Math.max(0, curr - 1)\n if (next === 0) this.roomCounts.delete(room)\n else this.roomCounts.set(room, next)\n }\n }\n\n private rollbackLeaveDecrement(rooms: string[]) {\n for (const room of rooms) {\n const curr = this.roomCounts.get(room) ?? 0\n this.roomCounts.set(room, curr + 1)\n }\n }\n\n /**\n * Public: start the heartbeat loop manually.\n *\n * This is called by the default 'sys:connect' handler, but you can also\n * call it yourself from any sysHandler to change when heartbeats start.\n */\n startHeartbeat() {\n this.stopHeartbeat('stop_before_start')\n if (!this.socket) {\n this.dbg({\n type: 'heartbeat',\n phase: 'start',\n err: 'Socket is null',\n })\n return\n }\n\n const socket = this.socket\n\n this.dbg({\n type: 'heartbeat',\n phase: 'start',\n details: {\n intervalMs: this.hb.intervalMs,\n timeoutMs: this.hb.timeoutMs,\n },\n })\n\n const tick = async () => {\n if (!socket) {\n this.dbg({\n type: 'heartbeat',\n phase: 'tick_skip',\n err: 'Socket missing during heartbeat tick',\n })\n return\n }\n\n const payload = await this.getSysEvent('sys:ping')({\n socket,\n client: this,\n })\n\n const check = this.config.pingPayload.safeParse(payload)\n if (!check.success) {\n this.dbg({\n type: 'heartbeat',\n phase: 'validation_failed',\n err: 'ping payload validation failed',\n details: this.getValidationDetails(check.error),\n })\n if (this.environment === 'development') {\n // eslint-disable-next-line no-console\n console.warn(\n '[socket] ping schema validation failed',\n check.error.issues,\n )\n }\n return\n }\n const dataToSend = check.data\n socket.emit('sys:ping', dataToSend)\n this.dbg({\n type: 'heartbeat',\n phase: 'ping_emit',\n payload: dataToSend,\n })\n }\n\n const runTick = () => {\n void tick().catch((error) => {\n this.dbg({\n type: 'heartbeat',\n phase: 'ping_emit',\n err: `sys:ping handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n })\n }\n\n this.hbTimer = setInterval(runTick, this.hb.intervalMs)\n runTick()\n }\n\n /**\n * Public: stop the heartbeat loop.\n *\n * This is called by the default 'sys:disconnect' handler, but you can also\n * call it yourself from any sysHandler to fully control heartbeat lifecycle.\n */\n stopHeartbeat(reason?: string) {\n const hadTimer = Boolean(this.hbTimer)\n if (this.hbTimer) {\n clearInterval(this.hbTimer)\n this.hbTimer = null\n }\n this.dbg({\n type: 'heartbeat',\n phase: 'stop',\n reason,\n hadTimer,\n })\n }\n\n emit<K extends keyof T & string>(\n event: K,\n payload: Payload<T, K>,\n metadata?: Record<string, unknown>,\n ): void {\n if (!this.socket) {\n this.dbg({ type: 'emit', event, err: 'Socket is null' })\n return\n }\n const schema = this.events[event].message\n const parsed = schema.safeParse(payload)\n if (!parsed.success) {\n this.dbg({\n type: 'emit',\n event,\n err: 'payload_validation_failed',\n details: this.getValidationDetails(parsed.error),\n })\n throw new Error(`Invalid payload for \"${event}\": ${parsed.error.message}`)\n }\n\n this.socket.emit(String(event), parsed.data)\n this.dbg({\n type: 'emit',\n event,\n metadata,\n })\n }\n\n async joinRooms(\n rooms: string[] | string,\n meta: SocketSchemaOutput<C['joinMetaMessage']>,\n ): Promise<() => Promise<void>> {\n if (!this.socket) {\n this.dbg({\n type: 'room',\n phase: 'join',\n rooms: this.toArray(rooms),\n err: 'Socket is null',\n })\n throw new Error('Socket is null in joinRooms method')\n }\n if (\n !(await this.getSysEvent('sys:room_join')({\n rooms,\n meta,\n socket: this.socket,\n client: this,\n }))\n ) {\n this.dbg({\n type: 'room',\n phase: 'join',\n rooms: this.toArray(rooms),\n err: 'sys:room_join handler aborted join',\n })\n return async () => {}\n }\n const list = this.toArray(rooms)\n const toJoin: string[] = []\n for (const r of list) {\n const next = (this.roomCounts.get(r) ?? 0) + 1\n this.roomCounts.set(r, next)\n if (next === 1) toJoin.push(r)\n }\n if (toJoin.length > 0 && this.socket) {\n const payloadResult = this.roomJoinSchema.safeParse({\n rooms: toJoin,\n meta,\n })\n\n if (!payloadResult.success) {\n this.rollbackJoinIncrement(toJoin)\n this.dbg({\n type: 'room',\n phase: 'join',\n rooms: toJoin,\n err: 'payload validation failed',\n details: this.getValidationDetails(payloadResult.error),\n })\n return async () => {}\n }\n const payload = payloadResult.data as RoomPayload<C['joinMetaMessage']>\n const normalizedRooms = this.toArray(payload.rooms)\n this.socket.emit('sys:room_join', payload)\n this.dbg({ type: 'room', phase: 'join', rooms: normalizedRooms })\n }\n return async () => {\n await this.leaveRooms(rooms, meta)\n }\n }\n\n async leaveRooms(\n rooms: string[] | string,\n meta: SocketSchemaOutput<C['leaveMetaMessage']>,\n ): Promise<void> {\n if (!this.socket) {\n this.dbg({\n type: 'room',\n phase: 'leave',\n rooms: this.toArray(rooms),\n err: 'Socket is null',\n })\n throw new Error('Socket is null in leaveRooms method')\n }\n if (\n !(await this.getSysEvent('sys:room_leave')({\n rooms,\n meta,\n socket: this.socket,\n client: this,\n }))\n ) {\n this.dbg({\n type: 'room',\n phase: 'leave',\n rooms: this.toArray(rooms),\n err: 'sys:room_leave handler aborted leave',\n })\n return\n }\n const list = this.toArray(rooms)\n const toLeave: string[] = []\n for (const r of list) {\n const curr = this.roomCounts.get(r) ?? 0\n const next = Math.max(0, curr - 1)\n if (next === 0 && curr > 0) toLeave.push(r)\n if (next === 0) this.roomCounts.delete(r)\n else this.roomCounts.set(r, next)\n }\n if (toLeave.length > 0 && this.socket) {\n const payloadResult = this.roomLeaveSchema.safeParse({\n rooms: toLeave,\n meta: meta,\n })\n\n if (!payloadResult.success) {\n this.rollbackLeaveDecrement(toLeave)\n this.dbg({\n type: 'room',\n phase: 'leave',\n rooms: toLeave,\n err: 'payload validation failed',\n details: this.getValidationDetails(payloadResult.error),\n })\n return\n }\n\n const payload = payloadResult.data as RoomPayload<C['leaveMetaMessage']>\n const normalizedRooms = this.toArray(payload.rooms)\n this.socket.emit('sys:room_leave', payload)\n this.dbg({ type: 'room', phase: 'leave', rooms: normalizedRooms })\n }\n }\n\n on<K extends keyof T & string>(\n event: K,\n handler: (\n payload: T[K]['__out'],\n meta?: { envelope: ServerEnvelope<T[K]['__out']>; ctx: ClientCtx },\n ) => void,\n ): () => void {\n const schema = this.events[event].message\n\n this.dbg({ type: 'register', phase: 'register', event })\n\n if (!this.socket) {\n this.dbg({\n type: 'register',\n phase: 'register',\n event,\n err: 'Socket is null',\n })\n return () => {}\n }\n\n const socket = this.socket\n const toStringList = (value: unknown): string[] =>\n Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string')\n : []\n\n const wrappedEnv = (envelope: ServerEnvelope<T[K]['__out']>) => {\n const rawData = envelope.data\n\n const parsed = schema.safeParse(rawData)\n if (!parsed.success) {\n this.dbg({\n type: 'receive',\n event,\n err: 'payload_validation_failed',\n details: this.getValidationDetails(parsed.error),\n })\n return\n }\n const data = parsed.data as Payload<T, K>\n\n const receivedAt = new Date()\n const sentAt = envelope?.sentAt ? new Date(envelope.sentAt) : undefined\n\n const meta = {\n envelope: {\n eventName: (typeof envelope?.eventName === 'string'\n ? envelope.eventName\n : event) as K,\n sentAt: envelope?.sentAt ?? receivedAt.toISOString(),\n sentTo: toStringList(envelope?.sentTo),\n data,\n metadata: envelope?.metadata,\n rooms: toStringList(envelope?.rooms),\n },\n ctx: {\n receivedAt,\n latencyMs: sentAt\n ? Math.max(0, receivedAt.getTime() - sentAt.getTime())\n : undefined,\n nsp: this.getNamespace(socket),\n socketId: socket.id,\n socket,\n },\n } satisfies {\n envelope: ServerEnvelope<T[K]['__out']>\n ctx: ClientCtx\n }\n\n this.dbg({\n type: 'receive',\n event,\n envelope: this.debug.verbose\n ? {\n eventName: meta.envelope.eventName,\n sentAt: meta.envelope.sentAt,\n sentTo: meta.envelope.sentTo,\n metadata: meta.envelope.metadata,\n }\n : undefined,\n })\n\n try {\n handler(data, meta)\n } catch (error) {\n this.dbg({\n type: 'receive',\n event,\n err: `handler_failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n }\n }\n\n const wrappedDispatcher = (\n envelopeOrRaw: ServerEnvelope<T[K]['__out']> | Payload<T, K>,\n ) => {\n if (\n typeof envelopeOrRaw === 'object' &&\n envelopeOrRaw !== null &&\n 'eventName' in envelopeOrRaw &&\n 'sentAt' in envelopeOrRaw &&\n 'sentTo' in envelopeOrRaw &&\n 'data' in envelopeOrRaw\n ) {\n wrappedEnv(envelopeOrRaw as ServerEnvelope<T[K]['__out']>)\n } else {\n this.dbg({\n type: 'receive',\n event,\n envelope: undefined,\n })\n try {\n handler(envelopeOrRaw as Payload<T, K>, undefined)\n } catch (error) {\n this.dbg({\n type: 'receive',\n event,\n err: `handler_failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n }\n }\n }\n\n const errorWrapped = (e: unknown) => {\n this.dbg({ type: 'receive', event, err: String(e) })\n }\n\n socket.on(String(event), wrappedDispatcher)\n socket.on(`${String(event)}:error`, errorWrapped)\n\n let set = this.handlerMap.get(String(event))\n if (!set) {\n set = new Set()\n this.handlerMap.set(String(event), set)\n }\n const entry: HandlerEntry<T, K> = {\n orig: handler,\n wrapped: wrappedDispatcher,\n errorWrapped,\n }\n set.add(entry)\n\n return () => {\n socket.off(String(event), wrappedDispatcher)\n socket.off(`${String(event)}:error`, errorWrapped)\n const s = this.handlerMap.get(String(event))\n if (s) {\n s.delete(entry)\n if (s.size === 0) this.handlerMap.delete(String(event))\n }\n this.dbg({ type: 'register', phase: 'unregister', event })\n }\n }\n\n /**\n * Remove all listeners, stop timers, and leave rooms.\n * Call when disposing the client instance.\n */\n async destroy(\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>,\n ): Promise<void> {\n const socket = this.socket\n this.dbg({\n type: 'lifecycle',\n phase: 'destroy_begin',\n socketId: socket?.id,\n details: {\n roomsTracked: this.roomCounts.size,\n handlerEvents: this.handlerMap.size,\n },\n })\n // stop heartbeat timer\n this.stopHeartbeat('destroy')\n\n // remove top-level socket listeners\n if (socket) {\n socket.off('connect', this.onConnect)\n socket.off('reconnect', this.onReconnect)\n socket.off('disconnect', this.onDisconnect)\n socket.off('connect_error', this.onConnectError)\n socket.off('sys:pong', this.onPong)\n\n // unsubscribe all per-event handlers\n for (const [event, set] of this.handlerMap.entries()) {\n for (const entry of set) {\n socket.off(String(event), entry.wrapped)\n socket.off(`${String(event)}:error`, entry.errorWrapped)\n }\n }\n }\n this.handlerMap.clear()\n\n // leave any rooms we joined via ref-count\n const toLeave = Array.from(this.roomCounts.entries())\n .filter(([, count]) => count > 0)\n .map(([room]) => room)\n if (toLeave.length > 0 && socket) {\n await this.leaveRooms(toLeave, leaveMeta)\n }\n this.roomCounts.clear()\n this.dbg({\n type: 'lifecycle',\n phase: 'destroy_complete',\n socketId: socket?.id,\n details: {\n roomsTracked: this.roomCounts.size,\n handlerEvents: this.handlerMap.size,\n },\n })\n }\n\n /** Pass-throughs. Managing connection is the caller’s responsibility. */\n disconnect(): void {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'disconnect',\n reason: 'client_disconnect',\n err: 'Socket is null',\n })\n return\n }\n this.stopHeartbeat('disconnect')\n this.socket.disconnect()\n this.dbg({\n type: 'connection',\n phase: 'disconnect',\n reason: 'client_disconnect',\n details: {\n nsp: this.getNamespace(this.socket),\n },\n })\n this.logSocketConfigSnapshot('disconnect_call')\n }\n\n connect(): void {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'connect',\n err: 'Socket is null',\n })\n return\n }\n this.socket.connect()\n this.dbg({\n type: 'connection',\n phase: 'connect',\n id: this.socket.id ?? '',\n details: {\n nsp: this.getNamespace(this.socket),\n },\n })\n this.logSocketConfigSnapshot('connect_call')\n }\n}\n","import type {\n AnyLeafLowProfile,\n EventMap,\n InferOutput,\n SocketConnectionConfigOutput,\n SocketEvent,\n} from '@emeryld/rrroutes-contract'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type {\n ArgsFor,\n ArgsTuple,\n BuiltInfinite,\n BuiltQuery,\n DataShape,\n InfiniteUseEndpointResultFor,\n QueryUseEndpointResultFor,\n UseEndpointArgs,\n} from '../../routesV3.client.types'\nimport type {\n ClientCtx,\n ServerEnvelope,\n SocketClient,\n} from '../socket.client.core'\nimport {\n dbg,\n describeObjectReference,\n isSameObjectReference,\n safeJsonKey,\n shouldWarnSocketMutationGuard,\n trackHookTrigger,\n type HookDebugSnapshot,\n type SocketedRouteDebugOptions,\n} from './socket.client.helper.debug'\nimport {\n mergeRoomState,\n roomStateEqual,\n roomsFromData,\n type RoomState,\n type ToRoomsMapper,\n type ToRoomsMeta,\n} from './socket.client.helper.rooms'\n\nexport type SocketedBuilt<L extends AnyLeafLowProfile> =\n L['cfg']['feed'] extends true ? BuiltInfinite<L> : BuiltQuery<L>\n\nexport type SocketedRouteResult<L extends AnyLeafLowProfile> =\n (L['cfg']['feed'] extends true\n ? InfiniteUseEndpointResultFor<L>\n : QueryUseEndpointResultFor<L>) & { rooms: string[] }\n\nexport type ApplySocket<\n L extends AnyLeafLowProfile,\n S extends SocketEvent,\n AppContext = undefined,\n> = (args: {\n prev: DataShape<L> | undefined\n payload: S['__out']\n args: ArgsFor<L> | undefined\n meta: {\n envelope?: ServerEnvelope<S['__out']>\n ctx?: ClientCtx\n appContext?: AppContext\n }\n}) => DataShape<L> | undefined | null\n\nexport type SocketedRouteOptions<\n L extends AnyLeafLowProfile,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n AppContext = undefined,\n> = {\n /** The built route to compose with socket wiring. This should be a route built with the `buildRoute` function */\n built: SocketedBuilt<L>\n /** A function that derives the rooms to join from the endpoint data. This will be called on initial render and whenever the endpoint data changes. */\n toRooms: ToRoomsMapper<L, C, AppContext>\n /** An object mapping socket event names to functions that apply incoming socket messages to the endpoint data. Each function receives the previous data, the socket message payload, and an optional meta object containing the server envelope, client context, and app context. The function should return the new data (new referrence), or null to indicate no change. */\n applySocket: {\n [K in keyof Events & string]?: ApplySocket<L, Events[K], AppContext>\n }\n /** A hook that returns the SocketClient instance. This is required to access the socket client within the route and apply socket messages. */\n useSocketClient: () => SocketClient<Events, C> | null\n /** Optional context hook that is threaded into `toRooms` and `applySocket` metadata. */\n useContext?: () => AppContext\n /** Debug options for the socketed route. This is optional and can be used to enable debug logging for the route's internal operations, such as room joining and socket message application.\n * client: Logs when the socket client becomes available or unavailable.\n * render: Logs on each render of the route, including whether the client is available and the current rooms.\n * hook: Logs when key hooks are triggered, such as receiving endpoint data or applying socket messages, along with snapshots of relevant state.\n * room: Logs attempts to join or leave rooms, including reasons for skipping or errors.\n */\n debug?: SocketedRouteDebugOptions\n}\n\nfunction isSocketClientUnavailableError(err: unknown): boolean {\n return err instanceof Error && err.message.includes('SocketClient not found')\n}\n\nfunction parseUseEndpointArgs<L extends AnyLeafLowProfile>(\n useArgs: UseEndpointArgs<L>,\n): { endpointArgs: ArgsFor<L> | undefined; endpointArgsTuple: ArgsTuple<L> } {\n const firstArg = (useArgs as unknown[])[0]\n const firstArgRecord =\n firstArg && typeof firstArg === 'object'\n ? (firstArg as Record<string, unknown>)\n : undefined\n const hasRouteArgs = Boolean(\n firstArgRecord &&\n (Object.prototype.hasOwnProperty.call(firstArgRecord, 'params') ||\n Object.prototype.hasOwnProperty.call(firstArgRecord, 'query')),\n )\n const endpointArgs = hasRouteArgs ? (firstArg as ArgsFor<L>) : undefined\n const endpointArgsTuple = (\n typeof endpointArgs === 'undefined' ? [] : [endpointArgs]\n ) as ArgsTuple<L>\n return { endpointArgs, endpointArgsTuple }\n}\n\nfunction useDefaultSocketedRouteContext<AppContext>(): AppContext {\n return undefined as AppContext\n}\n\nfunction createToRoomsMeta<AppContext>(\n appContext: AppContext,\n): ToRoomsMeta<AppContext> {\n return { appContext }\n}\n\n/**\n * Compose a GET endpoint with socket wiring:\n * - joins/leaves rooms derived from the endpoint data\n * - subscribes to a socket event and applies messages to the cache\n */\nexport function buildSocketedRoute<\n L extends AnyLeafLowProfile,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n AppContext = undefined,\n>(options: SocketedRouteOptions<L, Events, C, AppContext>) {\n const {\n built,\n toRooms,\n applySocket,\n useSocketClient,\n useContext: useRouteContext = useDefaultSocketedRouteContext<AppContext>,\n debug,\n } = options\n\n const { useEndpoint: useInnerEndpoint, ...rest } = built\n const useEndpoint = (\n ...useArgs: UseEndpointArgs<L>\n ): SocketedRouteResult<L> => {\n const client: SocketClient<Events, C> | null = useSocketClient()\n let socketClientError: unknown = null\n\n const endpointResult = useInnerEndpoint(\n ...useArgs,\n ) as SocketedRouteResult<L>\n const appContext = useRouteContext()\n const toRoomsMeta = useMemo(\n () => createToRoomsMeta(appContext),\n [appContext],\n )\n const { endpointArgs, endpointArgsTuple } = parseUseEndpointArgs(useArgs)\n const argsKey = useMemo(\n () => safeJsonKey(endpointArgs ?? null),\n [endpointArgs],\n )\n\n const [roomState, setRoomState] = useState<RoomState<C>>(() =>\n roomsFromData(\n endpointResult.data as DataShape<L> | undefined,\n endpointArgs,\n toRooms,\n toRoomsMeta,\n ),\n )\n const renderCountRef = useRef(0)\n const clientReadyRef = useRef<boolean | null>(null)\n const endpointDataRef = useRef<DataShape<L> | undefined>(\n endpointResult.data as DataShape<L> | undefined,\n )\n const toRoomsRef = useRef(toRooms)\n const toRoomsMetaRef = useRef(toRoomsMeta)\n const onReceiveEffectDebugRef = useRef<HookDebugSnapshot | null>(null)\n const deriveRoomsEffectDebugRef = useRef<HookDebugSnapshot | null>(null)\n const joinRoomsEffectDebugRef = useRef<HookDebugSnapshot | null>(null)\n const applySocketEffectDebugRef = useRef<HookDebugSnapshot | null>(null)\n\n renderCountRef.current += 1\n endpointDataRef.current = endpointResult.data as DataShape<L> | undefined\n toRoomsRef.current = toRooms\n toRoomsMetaRef.current = toRoomsMeta\n\n const roomsKey = useMemo(() => roomState.rooms.join('|'), [roomState.rooms])\n const joinMetaKey = useMemo(\n () => safeJsonKey(roomState.joinMeta ?? null),\n [roomState.joinMeta],\n )\n const leaveMetaKey = useMemo(\n () => safeJsonKey(roomState.leaveMeta ?? null),\n [roomState.leaveMeta],\n )\n\n const hasClient = !!client\n if (clientReadyRef.current !== hasClient) {\n clientReadyRef.current = hasClient\n dbg(debug, {\n type: 'client',\n phase: hasClient ? 'ready' : 'missing',\n err: hasClient ? undefined : String(socketClientError),\n })\n }\n\n dbg(debug, {\n type: 'render',\n renderCount: renderCountRef.current,\n hasClient,\n argsKey,\n rooms: roomState.rooms,\n roomsKey,\n joinMetaKey,\n leaveMetaKey,\n })\n\n useEffect(() => {\n trackHookTrigger({\n ref: onReceiveEffectDebugRef,\n phase: 'endpoint_on_receive_effect',\n debug,\n snapshot: {\n onReceiveRef: describeObjectReference(endpointResult.onReceive),\n },\n })\n\n const unsubscribe = endpointResult.onReceive((data: InferOutput<L>) => {\n setRoomState((prev) => {\n const next = mergeRoomState(\n prev,\n toRoomsRef.current({\n data,\n args: endpointArgs,\n meta: toRoomsMetaRef.current,\n }),\n )\n return roomStateEqual(prev, next) ? prev : next\n })\n })\n return unsubscribe\n }, [endpointResult.onReceive, argsKey])\n\n useEffect(() => {\n trackHookTrigger({\n ref: deriveRoomsEffectDebugRef,\n phase: 'derive_rooms_effect',\n debug,\n snapshot: {\n argsKey,\n endpointDataRef: describeObjectReference(endpointDataRef.current),\n toRoomsRef: describeObjectReference(toRooms),\n },\n })\n\n const next = roomsFromData(\n endpointDataRef.current,\n endpointArgs,\n toRooms,\n toRoomsMeta,\n )\n setRoomState((prev) => (roomStateEqual(prev, next) ? prev : next))\n }, [argsKey, toRooms, toRoomsMeta, debug])\n\n useEffect(() => {\n trackHookTrigger({\n ref: joinRoomsEffectDebugRef,\n phase: 'join_rooms_effect',\n debug,\n snapshot: {\n hasClient: !!client,\n clientRef: describeObjectReference(client),\n roomsKey,\n joinMetaKey,\n leaveMetaKey,\n },\n })\n\n if (!client) {\n dbg(debug, {\n type: 'room',\n phase: 'join_skip',\n rooms: roomState.rooms,\n reason: 'socket_client_missing',\n })\n return\n }\n if (roomState.rooms.length === 0) {\n dbg(debug, {\n type: 'room',\n phase: 'join_skip',\n rooms: [],\n reason: 'no_rooms',\n })\n return\n }\n const { joinMeta, leaveMeta } = roomState\n if (!joinMeta || !leaveMeta) {\n dbg(debug, {\n type: 'room',\n phase: 'join_skip',\n rooms: roomState.rooms,\n reason: 'missing_meta',\n })\n return\n }\n let active = true\n dbg(debug, {\n type: 'room',\n phase: 'join_attempt',\n rooms: roomState.rooms,\n })\n ;(async () => {\n try {\n await client.joinRooms(roomState.rooms, joinMeta)\n } catch (err) {\n dbg(debug, {\n type: 'room',\n phase: 'join_error',\n rooms: roomState.rooms,\n err: String(err),\n })\n }\n })()\n return () => {\n if (!active) return\n active = false\n if (roomState.rooms.length === 0) {\n dbg(debug, {\n type: 'room',\n phase: 'leave_skip',\n rooms: [],\n reason: 'no_rooms',\n })\n return\n }\n dbg(debug, {\n type: 'room',\n phase: 'leave_attempt',\n rooms: roomState.rooms,\n })\n void client.leaveRooms(roomState.rooms, leaveMeta).catch((err) => {\n dbg(debug, {\n type: 'room',\n phase: 'leave_error',\n rooms: roomState.rooms,\n err: String(err),\n })\n })\n }\n }, [client, roomsKey, joinMetaKey, leaveMetaKey, debug])\n\n useEffect(() => {\n trackHookTrigger({\n ref: applySocketEffectDebugRef,\n phase: 'apply_socket_effect',\n debug,\n snapshot: {\n hasClient: !!client,\n clientRef: describeObjectReference(client),\n applySocketKeys: Object.keys(applySocket).sort().join(','),\n argsKey,\n toRoomsRef: describeObjectReference(toRooms),\n },\n })\n\n if (!client) return\n\n type QueuedSocketUpdate = {\n event: string\n fn: ApplySocket<L, Events[string], AppContext>\n payload: Events[string]['__out']\n meta?: {\n envelope: ServerEnvelope<Events[string]['__out']>\n ctx: ClientCtx\n }\n }\n\n const queue: QueuedSocketUpdate[] = []\n const sameRefWarnedEvents = new Set<keyof Events & string>()\n let draining = false\n let active = true\n\n const drainQueue = () => {\n if (!active || draining) return\n draining = true\n try {\n while (active && queue.length > 0) {\n const nextUpdate = queue.shift()\n if (!nextUpdate) continue\n built.setData(\n (prev) => {\n const next = nextUpdate.fn({\n prev,\n payload: nextUpdate.payload,\n args: endpointArgs,\n meta: {\n ...(nextUpdate.meta ?? {}),\n appContext: toRoomsMetaRef.current.appContext,\n },\n })\n if (next === null) return prev\n\n if (\n shouldWarnSocketMutationGuard() &&\n isSameObjectReference(prev, next) &&\n !sameRefWarnedEvents.has(nextUpdate.event)\n ) {\n sameRefWarnedEvents.add(nextUpdate.event)\n // eslint-disable-next-line no-console\n console.warn(\n `[socketedRoute] applySocket(\"${nextUpdate.event}\") returned the previous reference. Return a new object/array for updates, or return null for no change.`,\n )\n }\n const nextRoomState = roomsFromData(\n next as DataShape<L> | undefined,\n endpointArgs,\n toRooms,\n toRoomsMetaRef.current,\n )\n setRoomState((prevRoomState) =>\n roomStateEqual(prevRoomState, nextRoomState)\n ? prevRoomState\n : nextRoomState,\n )\n return next\n },\n ...endpointArgsTuple,\n )\n }\n } finally {\n draining = false\n if (active && queue.length > 0) drainQueue()\n }\n }\n\n const entries = Object.entries(applySocket).filter(\n ([_event, fn]) => typeof fn === 'function',\n ) as [string, ApplySocket<L, Events[string], AppContext>][]\n\n const unsubscribes = entries.map(([ev, fn]) =>\n client.on(ev, (payload, meta) => {\n queue.push({\n event: ev,\n fn,\n payload,\n ...(meta ? { meta } : {}),\n })\n drainQueue()\n }),\n )\n\n return () => {\n active = false\n queue.length = 0\n unsubscribes.forEach((u) => u?.())\n }\n }, [client, applySocket, built, argsKey, toRooms, debug])\n\n return { ...endpointResult, rooms: roomState.rooms }\n }\n\n return {\n ...rest,\n useEndpoint,\n }\n}\n","export type HookDebugReason = 'init' | 'change'\nexport type HookDebugValue = string | number | boolean | null | undefined\n\nexport type SocketedRouteDebugEvent =\n | {\n type: 'client'\n phase: 'ready' | 'missing'\n err?: string\n }\n | {\n type: 'render'\n renderCount: number\n hasClient: boolean\n argsKey: string\n rooms: string[]\n roomsKey: string\n joinMetaKey: string\n leaveMetaKey: string\n }\n | {\n type: 'hook'\n phase:\n | 'endpoint_on_receive_effect'\n | 'derive_rooms_effect'\n | 'join_rooms_effect'\n | 'apply_socket_effect'\n reason: HookDebugReason\n changes: Array<{\n dependency: string\n previous: HookDebugValue\n next: HookDebugValue\n }>\n }\n | {\n type: 'room'\n phase:\n | 'join_attempt'\n | 'join_skip'\n | 'join_error'\n | 'leave_attempt'\n | 'leave_skip'\n | 'leave_error'\n rooms: string[]\n reason?: string\n err?: string\n }\n\nexport type SocketedRouteDebugOptions = {\n logger?: (event: SocketedRouteDebugEvent) => void\n} & {\n [P in SocketedRouteDebugEvent['type']]?: boolean\n}\n\nexport type HookDebugSnapshot = Record<string, unknown>\ntype HookIdentifier = Extract<\n SocketedRouteDebugEvent,\n { type: 'hook' }\n>['phase']\n\nconst objectReferenceIds = new WeakMap<object, number>()\nlet objectReferenceCounter = 0\n\nexport function describeObjectReference(value: unknown): string | null {\n if (value == null) return null\n const valueType = typeof value\n if (valueType !== 'object' && valueType !== 'function') return null\n\n const obj = value as object\n let id = objectReferenceIds.get(obj)\n if (!id) {\n id = ++objectReferenceCounter\n objectReferenceIds.set(obj, id)\n }\n return `ref#${id}`\n}\n\nexport function safeJsonKey(value: unknown): string {\n try {\n const serialized = JSON.stringify(value ?? null)\n return serialized ?? 'null'\n } catch {\n return '[unserializable]'\n }\n}\n\nexport function isSameObjectReference(prev: unknown, next: unknown): boolean {\n if (prev !== next) return false\n if (next == null) return false\n const valueType = typeof next\n return valueType === 'object' || valueType === 'function'\n}\n\nexport function shouldWarnSocketMutationGuard(): boolean {\n const nodeEnv = (\n globalThis as { process?: { env?: { NODE_ENV?: string } } }\n ).process?.env?.NODE_ENV\n return nodeEnv !== 'production'\n}\n\nfunction safeDescribeHookValue(value: unknown): HookDebugValue {\n if (value == null) return value as null | undefined\n\n const valueType = typeof value\n if (\n valueType === 'string' ||\n valueType === 'number' ||\n valueType === 'boolean'\n ) {\n return value as HookDebugValue\n }\n if (valueType === 'bigint' || valueType === 'symbol') return String(value)\n if (valueType === 'function')\n return `[function ${(value as Function).name || 'anonymous'}]`\n if (Array.isArray(value)) return `[array length=${value.length}]`\n\n const ctorName =\n (value as { constructor?: { name?: string } }).constructor?.name ?? 'object'\n const keys = Object.keys(value as Record<string, unknown>)\n const keyPreview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n const ref = describeObjectReference(value)\n return `[${ctorName}${ref ? ` ${ref}` : ''} keys=${keyPreview}${suffix}]`\n}\n\nfunction createHookDebugEvent(\n prev: HookDebugSnapshot | null,\n next: HookDebugSnapshot,\n phase: HookIdentifier,\n): Extract<SocketedRouteDebugEvent, { type: 'hook' }> | null {\n const reason: HookDebugReason = prev ? 'change' : 'init'\n const changed = Object.keys(next).reduce<\n Array<{\n dependency: string\n previous: HookDebugValue\n next: HookDebugValue\n }>\n >((acc, dependency) => {\n const prevValue = prev ? prev[dependency] : undefined\n const nextValue = next[dependency]\n if (!prev || !Object.is(prevValue, nextValue)) {\n acc.push({\n dependency,\n previous: safeDescribeHookValue(prevValue),\n next: safeDescribeHookValue(nextValue),\n })\n }\n return acc\n }, [])\n\n if (!changed.length) return null\n return { type: 'hook', phase, reason, changes: changed }\n}\n\nexport function dbg(\n debug: SocketedRouteDebugOptions | undefined,\n event: SocketedRouteDebugEvent,\n) {\n if (!debug?.logger) return\n if (!debug[event.type]) return\n debug.logger(event)\n}\n\nexport function trackHookTrigger({\n ref,\n phase,\n debug,\n snapshot,\n}: {\n ref: { current: HookDebugSnapshot | null }\n phase: HookIdentifier\n debug?: SocketedRouteDebugOptions\n snapshot: HookDebugSnapshot\n}) {\n const prev = ref.current\n ref.current = snapshot\n if (!debug?.logger || !debug?.hook) return\n const event = createHookDebugEvent(prev, snapshot, phase)\n if (event) dbg(debug, event)\n}\n","import type {\n AnyLeafLowProfile,\n InferOutput,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport type { ArgsFor, DataShape } from '../../routesV3.client.types'\nimport { safeJsonKey } from './socket.client.helper.debug'\n\nexport type RoomsInput = string | string[] | undefined | null\n\nexport type RoomState<C extends SocketConnectionConfigOutput> = {\n rooms: string[]\n joinMeta?: SocketSchemaOutput<C['joinMetaMessage']>\n leaveMeta?: SocketSchemaOutput<C['leaveMetaMessage']>\n}\n\nexport type ToRoomsResult<C extends SocketConnectionConfigOutput> = {\n rooms: RoomsInput\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>\n}\n\nexport type ToRoomsMeta<AppContext = undefined> = {\n appContext?: AppContext\n}\n\nexport type ToRoomsMapper<\n L extends AnyLeafLowProfile,\n C extends SocketConnectionConfigOutput,\n AppContext = undefined,\n> = (args: {\n data: InferOutput<L>\n args: ArgsFor<L> | undefined\n meta?: ToRoomsMeta<AppContext>\n}) => ToRoomsResult<C>\n\nfunction normalizeRooms(rooms: RoomsInput): string[] {\n if (rooms == null) return []\n const list = Array.isArray(rooms) ? rooms : [rooms]\n const seen = new Set<string>()\n const normalized: string[] = []\n for (const r of list) {\n if (typeof r !== 'string') continue\n if (seen.has(r)) continue\n seen.add(r)\n normalized.push(r)\n }\n return normalized\n}\n\nfunction arrayShallowEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i += 1) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n\nexport function roomStateEqual<C extends SocketConnectionConfigOutput>(\n prev: RoomState<C>,\n next: RoomState<C>,\n): boolean {\n return (\n arrayShallowEqual(prev.rooms, next.rooms) &&\n safeJsonKey(prev.joinMeta) === safeJsonKey(next.joinMeta) &&\n safeJsonKey(prev.leaveMeta) === safeJsonKey(next.leaveMeta)\n )\n}\n\nexport function mergeRoomState<\n L extends AnyLeafLowProfile,\n C extends SocketConnectionConfigOutput,\n>(prev: RoomState<C>, toRoomsResult: ToRoomsResult<C>): RoomState<C> {\n const merged = new Set(prev.rooms)\n for (const r of normalizeRooms(toRoomsResult.rooms)) merged.add(r)\n return {\n rooms: Array.from(merged),\n joinMeta: toRoomsResult.joinMeta ?? prev.joinMeta,\n leaveMeta: toRoomsResult.leaveMeta ?? prev.leaveMeta,\n }\n}\n\nexport function roomsFromData<\n L extends AnyLeafLowProfile,\n C extends SocketConnectionConfigOutput,\n AppContext = undefined,\n>(\n data: DataShape<L> | undefined,\n args: ArgsFor<L> | undefined,\n toRooms: ToRoomsMapper<L, C, AppContext>,\n meta?: ToRoomsMeta<AppContext>,\n): RoomState<C> {\n if (data == null) return { rooms: [] }\n\n let state: RoomState<C> = { rooms: [] }\n const add = (input: InferOutput<L>) => {\n const mergeForValue = (value: unknown) => {\n state = mergeRoomState(\n state,\n toRooms({ data: value as InferOutput<L>, args, meta }),\n )\n }\n\n if (Array.isArray(input)) {\n input.forEach((entry) => mergeForValue(entry))\n return\n }\n\n if (input && typeof input === 'object') {\n const maybeItems = (input as any).items\n if (Array.isArray(maybeItems)) {\n maybeItems.forEach((entry) => mergeForValue(entry))\n return\n }\n }\n\n mergeForValue(input)\n }\n\n const maybePages = (data as any)?.pages\n if (Array.isArray(maybePages)) {\n for (const page of maybePages) add(page as InferOutput<L>)\n return state\n }\n\n add(data as InferOutput<L>)\n return state\n}\n"],"mappings":"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","names":["toArgsTuple","lowProfileParse","keepPreviousData","useQuery","useCallback","useRef","lowProfileParse","lowProfileParse","buildOnReceive","useRef","useCallback","useQuery","keepPreviousData","buildCacheKey","lowProfileParse","keepPreviousData","useCallback","useRef","buildCacheKey","lowProfileParse","buildOnReceive","useRef","useCallback","keepPreviousData","buildCacheKey","lowProfileParse","useCallback","useRef","buildCacheKey","lowProfileParse","useRef","useCallback","toArgsTuple","React","React","event","entry","useEffect","useMemo","useRef","useState","safeDescribeHookValue","createHookDebugEvent","dbg","trackHookTrigger","useSocketClient","useMemo","useState","useRef","dbg","useEffect","trackHookTrigger"]}
1
+ {"version":3,"sources":["../src/routesV3.client.batch.ts","../src/routesV3.client.fetch.ts","../src/routesV3.client.get.ts","../src/routesV3.client.shared.ts","../src/routesV3.client.infiniteGet.ts","../src/routesV3.client.mutation.ts","../src/routesV3.client.ts","../src/sockets/socket.client.context.provider.tsx","../src/sockets/socket.client.context.client.ts","../src/sockets/socket.client.context.connection.ts","../src/sockets/socket.client.context.debug.ts","../src/sockets/socket.client.sys.ts","../src/sockets/socket.client.core.ts","../src/sockets/socketedRoute/socket.client.helper.route.ts","../src/sockets/socketedRoute/socket.client.helper.debug.ts","../src/sockets/socketedRoute/socket.client.helper.rooms.ts"],"sourcesContent":["import {\n lowProfileParse,\n type AnyLeafLowProfile,\n type HttpMethod,\n} from '@emeryld/rrroutes-contract'\nimport {\n keepPreviousData,\n useQuery,\n type QueryClient,\n type QueryKey,\n} from '@tanstack/react-query'\nimport { useCallback, useRef } from 'react'\nimport type {\n BranchArgsInput,\n BranchBuildOptions,\n BranchFetchInput,\n BranchFetchOutput,\n BranchSetDataInput,\n BranchUseEndpointOptions,\n BuiltBranch,\n BuiltLeafMap,\n RouteClientFetch,\n} from './routesV3.client.types'\n\ntype BuildBatchBranchDeps = {\n fetchRaw: RouteClientFetch\n queryClient: QueryClient\n validateResponses: boolean\n getBuiltLeaf: (built: unknown) => AnyLeafLowProfile\n encodeLeafKey: (leaf: AnyLeafLowProfile) => string\n toArgsTuple: (args: unknown) => unknown[]\n}\n\nexport function buildBatchBranch<T extends BuiltLeafMap>(\n leaves: T,\n options: BranchBuildOptions,\n deps: BuildBatchBranchDeps,\n): BuiltBranch<T> {\n const {\n fetchRaw,\n queryClient,\n validateResponses,\n getBuiltLeaf,\n encodeLeafKey,\n toArgsTuple,\n } = deps\n\n const batchMethod = (options.method ?? 'POST') as\n | HttpMethod\n | Uppercase<HttpMethod>\n const defaultHeaders = options.headers\n\n const getQueryKeys = (input?: BranchArgsInput<T>) => {\n const out = {} as any\n const argsByLeaf = (input ?? {}) as BranchArgsInput<T>\n for (const [alias, built] of Object.entries(leaves)) {\n const args = argsByLeaf[alias as keyof T]\n out[alias] = (built as any).getQueryKeys(...toArgsTuple(args))\n }\n return out as BuiltBranch<T>['getQueryKeys'] extends (\n ...args: any[]\n ) => infer R\n ? R\n : never\n }\n\n const invalidateBranch = async (input?: BranchArgsInput<T>) => {\n const argsByLeaf = (input ?? {}) as BranchArgsInput<T>\n await Promise.all(\n Object.entries(leaves).map(([alias, built]) => {\n const args = argsByLeaf[alias as keyof T]\n return (built as any).invalidate(...toArgsTuple(args))\n }),\n )\n }\n\n const setDataBranch = (input: BranchSetDataInput<T>) => {\n const out = {} as any\n for (const [alias, def] of Object.entries(input)) {\n if (!def) continue\n const built = (leaves as Record<string, any>)[alias]\n if (!built) continue\n out[alias] = (built as any).setData(def.updater, ...toArgsTuple(def.args))\n }\n return out\n }\n\n const fetchBranch = async (\n input: BranchFetchInput<T>,\n ): Promise<BranchFetchOutput<T>> => {\n const payload: Record<\n string,\n {\n encodedLeaf: string\n params?: unknown\n query?: unknown\n body?: unknown\n }\n > = {}\n\n for (const [aliasRaw, built] of Object.entries(leaves)) {\n const leaf = getBuiltLeaf(built)\n const encodedLeaf = encodeLeafKey(leaf)\n\n const alias = aliasRaw as keyof T\n const branchInput = input[alias] as BranchFetchInput<T>[keyof T]\n const query = (branchInput as any)?.query\n const params = (branchInput as any)?.params\n const body = (branchInput as any)?.body\n\n payload[aliasRaw] = {\n encodedLeaf,\n ...(params !== undefined ? { params } : {}),\n ...(query !== undefined ? { query } : {}),\n ...(body !== undefined ? { body } : {}),\n }\n }\n\n const batchResponse = await fetchRaw({\n path: options.path,\n method: batchMethod,\n body: payload,\n headers: defaultHeaders,\n })\n\n const rawData = batchResponse.data\n if (!rawData || typeof rawData !== 'object' || Array.isArray(rawData)) {\n throw new Error(\n 'Batch response must be a plain object keyed by branch aliases.',\n )\n }\n\n const mapped = {} as BranchFetchOutput<T>\n for (const [aliasRaw, built] of Object.entries(leaves)) {\n if (!(aliasRaw in rawData)) {\n throw new Error(`Batch response missing alias \"${aliasRaw}\".`)\n }\n\n const leaf = getBuiltLeaf(built)\n const rawLeafData = (rawData as Record<string, unknown>)[aliasRaw]\n const parsedLeafData =\n validateResponses && leaf.cfg.outputSchema\n ? lowProfileParse(leaf.cfg.outputSchema, rawLeafData)\n : rawLeafData\n\n if (validateResponses && !leaf.cfg.outputSchema) {\n throw new Error(\n `No output schema defined for leaf ${leaf.method.toUpperCase()} ${leaf.path}, cannot validate batch response.`,\n )\n }\n\n ;(mapped as Record<string, unknown>)[aliasRaw] = parsedLeafData\n }\n\n return mapped\n }\n\n const useEndpoint = (\n input: BranchFetchInput<T>,\n rqOpts?: BranchUseEndpointOptions<T>,\n ) => {\n const queryKeys = getQueryKeys(input as unknown as BranchArgsInput<T>)\n const branchQueryKey = [\n 'batch',\n String(batchMethod).toLowerCase(),\n options.path,\n queryKeys,\n ] as unknown as QueryKey\n const { onReceive, ...useQueryOptions } = (rqOpts ??\n {}) as BranchUseEndpointOptions<T>\n\n const listenersRef = useRef(new Set<(data: BranchFetchOutput<T>) => void>())\n const notifyOnReceive = useCallback(\n (data: BranchFetchOutput<T>) => {\n onReceive?.(data)\n listenersRef.current.forEach((listener) => listener(data))\n },\n [onReceive],\n )\n const registerOnReceive = useCallback(\n (listener: (data: BranchFetchOutput<T>) => void) => {\n listenersRef.current.add(listener)\n return () => {\n listenersRef.current.delete(listener)\n }\n },\n [],\n )\n\n const queryResult = useQuery<\n BranchFetchOutput<T>,\n unknown,\n BranchFetchOutput<T>,\n QueryKey\n >(\n {\n ...(useQueryOptions as Omit<BranchUseEndpointOptions<T>, 'onReceive'>),\n queryKey: branchQueryKey,\n placeholderData: useQueryOptions.placeholderData ?? keepPreviousData,\n queryFn: async () => {\n const result = await fetchBranch(input)\n notifyOnReceive(result)\n return result\n },\n },\n queryClient,\n )\n\n return { ...queryResult, onReceive: registerOnReceive }\n }\n\n return {\n fetch: fetchBranch,\n useEndpoint,\n getQueryKeys,\n invalidate: invalidateBranch,\n setData: setDataBranch as BuiltBranch<T>['setData'],\n }\n}\n","// routesV3.client.fetch.ts\n\nimport { Fetcher, FetcherOutput, FetchInput } from './routesV3.client.types'\n\n// httpError.ts (or similar)\nexport class HttpError extends Error {\n status: number\n statusText: string\n url: string\n body: { message: string }\n headers: Record<string, string>\n\n constructor({\n res,\n url,\n body: { message },\n }: {\n res: Response\n url: string\n body: { message: string }\n }) {\n super(`[${res.status}] ${res.statusText}${message ? ` - ${message}` : ''}`)\n this.name = 'HttpError'\n this.status = res.status\n this.statusText = res.statusText\n this.url = url\n this.body = { message }\n this.headers = res.headers ? Object.fromEntries(res.headers.entries()) : {}\n }\n}\n\n/**\n * Default fetch implementation used by the route client helper.\n * @param req Normalized request information (URL, method, body, headers).\n * @returns Parsed JSON (or text fallback) from the server response.\n */\nexport const defaultFetcher: Fetcher = async <T>(\n req: FetchInput,\n): Promise<FetcherOutput<T>> => {\n const headers: Record<string, string> = { ...(req.headers ?? {}) }\n const isFormData =\n typeof FormData !== 'undefined' && req.body instanceof FormData\n if (!isFormData) {\n headers['Content-Type'] ||= 'application/json'\n headers['Accept'] ||= 'application/json'\n }\n\n const res = await fetch(req.url, {\n method: req.method,\n headers,\n body: isFormData\n ? (req.body as any)\n : req.body == null\n ? undefined\n : JSON.stringify(req.body),\n })\n\n const text = await res.json()\n\n if (!res.ok) {\n throw new HttpError({\n res,\n url: req.url,\n body: text,\n })\n }\n\n try {\n return {\n data: text as T,\n headers: res.headers ? Object.fromEntries(res.headers.entries()) : {},\n status: res.status,\n }\n } catch {\n return {\n data: text as unknown as T,\n headers: res.headers ? Object.fromEntries(res.headers.entries()) : {},\n status: res.status,\n }\n }\n}\n","// routesV3.client.get.ts\n\nimport type {\n AnyLeafLowProfile,\n HttpMethod,\n InferBodyInput,\n InferOutput,\n InferParams,\n InferQuery,\n} from '@emeryld/rrroutes-contract'\nimport { buildCacheKey, lowProfileParse } from '@emeryld/rrroutes-contract'\nimport {\n keepPreviousData,\n useQuery,\n type QueryClient,\n type QueryKey,\n} from '@tanstack/react-query'\nimport { useCallback, useRef } from 'react'\nimport {\n areEndpointArgsComplete,\n buildUrl,\n extractArgs,\n splitMultipartBody,\n toArgsTuple,\n toFormData,\n toUpper,\n} from './routesV3.client.shared'\nimport type {\n ArgsFor,\n ArgsTuple,\n BuiltQuery,\n DataShape,\n Fetcher,\n QueryBuildOptionsFor,\n QueryKeysFor,\n QueryUseEndpointOptionsFor,\n RouteClientDebugEvent,\n Updater,\n} from './routesV3.client.types'\n\ntype GetEnv = {\n baseUrl: string\n validateResponses: boolean\n fetcher: Fetcher\n queryClient: QueryClient\n emit: (event: RouteClientDebugEvent) => void\n decorateDebugEvent: <T extends RouteClientDebugEvent>(\n event: T,\n details?: Partial<RouteClientDebugEvent>,\n ) => RouteClientDebugEvent\n isVerboseDebug: boolean\n leafLabel: string\n}\n\nexport function buildGetLeaf<L extends AnyLeafLowProfile>(\n leaf: L,\n rqOpts: QueryBuildOptionsFor<L> | undefined,\n env: GetEnv,\n): BuiltQuery<L> {\n const leafCfg = leaf.cfg\n const method = toUpper(leaf.method as HttpMethod)\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema)\n\n const {\n baseUrl,\n validateResponses,\n fetcher,\n queryClient,\n emit,\n decorateDebugEvent,\n isVerboseDebug,\n leafLabel,\n } = env\n\n emit({ type: 'build', leaf: leafLabel })\n\n const getQueryKeys = <A extends ArgsTuple<L> = ArgsTuple<L>>(\n ...tuple: A\n ): QueryKeysFor<L, A> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = (a as any)?.query as InferQuery<L> | undefined\n return buildCacheKey({\n leaf,\n params: params as any,\n query: query as any,\n }) as unknown as QueryKeysFor<L, A>\n }\n\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple) as unknown as QueryKey\n await queryClient.invalidateQueries({ queryKey, exact: true })\n emit({ type: 'invalidate', key: queryKey, exact: true })\n }\n\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args\n const k = getQueryKeys(...(rest as ArgsTuple<L>)) as unknown as QueryKey\n const next = queryClient.setQueryData<InferOutput<L> | undefined>(\n k,\n (prev) =>\n typeof updater === 'function'\n ? (updater as any)(prev)\n : (updater as any),\n ) as any\n emit({ type: 'setData', key: k })\n return next as any\n }\n\n const buildOnReceive =\n (\n rqOpts as\n | { onReceive?: ((data: InferOutput<L>) => void) | undefined }\n | undefined\n )?.onReceive ?? undefined\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>\n body?: InferBodyInput<L>\n onReceive?: (data: InferOutput<L>) => void\n requireBody?: boolean\n },\n ): Promise<InferOutput<L>> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = {\n ...((a as any)?.query ?? ({} as InferQuery<L> | undefined)),\n ...(options?.queryOverride ?? {}),\n }\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n )\n\n let payload: unknown\n const isMultipart =\n Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0\n const acceptsBody = Boolean(leafCfg.bodySchema || isMultipart)\n const requiresBody = options?.requireBody ?? (!acceptsBody ? false : true)\n\n if (typeof options?.body !== 'undefined') {\n const { regularBody, multipartFiles } = splitMultipartBody(\n options.body as Record<string, unknown>,\n leafCfg.bodyFiles,\n )\n const normalizedBody = leafCfg.bodySchema\n ? lowProfileParse(leafCfg.bodySchema, regularBody)\n : regularBody\n if (isMultipart && normalizedBody && typeof normalizedBody === 'object') {\n payload = toFormData(\n {\n ...(normalizedBody as Record<string, unknown>),\n ...multipartFiles,\n },\n leafCfg.bodyFiles,\n )\n } else {\n payload = normalizedBody\n }\n } else if (requiresBody && acceptsBody) {\n throw new Error('Body is required when invoking a mutation fetch.')\n }\n\n const startedAt = Date.now()\n const detail = isVerboseDebug\n ? { params, normalizedParams, query, normalizedQuery, baseUrl }\n : undefined\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method,\n url,\n leaf: leafLabel,\n ...(payload !== undefined ? { body: payload } : {}),\n },\n detail,\n ),\n )\n\n try {\n const out = await fetcher<InferOutput<L>>(\n payload === undefined\n ? { url, method }\n : { url, method, body: payload },\n )\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'fetched',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n\n if (validateResponses) {\n if (!leafCfg.outputSchema) {\n throw new Error(\n `No output schema defined for leaf ${leafLabel}, cannot validate response.`,\n )\n }\n out.data = lowProfileParse(\n leafCfg.outputSchema,\n out.data,\n ) as InferOutput<L>\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'parsed',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n }\n\n options?.onReceive?.(out.data)\n return out.data\n } catch (error) {\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'error',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n ...(payload !== undefined ? { body: payload } : {}),\n error,\n },\n detail,\n ),\n )\n throw error\n }\n }\n\n const fetchGet: BuiltQuery<L>['fetch'] = (...tupleWithBody) => {\n const acceptsBody = Boolean(leafCfg.bodySchema)\n const tupleLength = tupleWithBody.length\n const maybeBodyIndex = expectsArgs ? 1 : 0\n const hasBodyCandidate = acceptsBody && tupleLength > maybeBodyIndex\n const body = hasBodyCandidate\n ? (tupleWithBody[tupleLength - 1] as InferBodyInput<L>)\n : undefined\n const tuple = hasBodyCandidate\n ? (tupleWithBody.slice(0, tupleLength - 1) as ArgsTuple<L>)\n : (tupleWithBody as ArgsTuple<L>)\n\n return fetchEndpoint(tuple, {\n body,\n onReceive: buildOnReceive,\n requireBody: false,\n })\n }\n\n const useEndpoint: BuiltQuery<L>['useEndpoint'] = (...useArgs) => {\n const args = (expectsArgs ? useArgs[0] : undefined) as ArgsFor<L> | undefined\n const useEndpointOptions = (\n expectsArgs ? useArgs[1] : useArgs[0]\n ) as QueryUseEndpointOptionsFor<L> | undefined\n const hasCompleteArgs = !expectsArgs || areEndpointArgsComplete(leaf, args)\n const tuple = toArgsTuple(args)\n const queryKeys = getQueryKeys(...tuple)\n emit({\n type: 'useEndpoint',\n leaf: leafLabel,\n variant: 'get',\n keys: queryKeys,\n })\n\n const { onReceive: buildOnReceive, ...buildQueryOptions } = (rqOpts ??\n {}) as QueryBuildOptionsFor<L>\n const { onReceive: useOnReceive, ...runtimeQueryOptions } = (useEndpointOptions ??\n {}) as QueryUseEndpointOptionsFor<L>\n const mergedQueryOptions = {\n ...buildQueryOptions,\n ...runtimeQueryOptions,\n }\n const mergedEnabled = (mergedQueryOptions as { enabled?: unknown }).enabled\n const guardedEnabled =\n hasCompleteArgs &&\n (typeof mergedEnabled === 'undefined' ? true : mergedEnabled)\n\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>())\n const notifyOnReceive = useCallback((data: InferOutput<L>) => {\n buildOnReceive?.(data)\n useOnReceive?.(data)\n listenersRef.current.forEach((listener) => listener(data))\n }, [buildOnReceive, useOnReceive])\n const registerOnReceive = useCallback(\n (listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener)\n return () => {\n listenersRef.current.delete(listener)\n }\n },\n [],\n )\n\n const queryResult = useQuery<\n InferOutput<L>,\n unknown,\n InferOutput<L>,\n QueryKey\n >(\n {\n ...mergedQueryOptions,\n enabled: guardedEnabled as any,\n queryKey: getQueryKeys(...tuple) as unknown as QueryKey,\n placeholderData:\n mergedQueryOptions.placeholderData ?? keepPreviousData,\n queryFn: () => {\n if (!hasCompleteArgs) {\n return Promise.resolve(undefined as unknown as InferOutput<L>)\n }\n return fetchEndpoint(tuple, {\n onReceive: notifyOnReceive,\n })\n },\n },\n queryClient,\n )\n\n return { ...queryResult, onReceive: registerOnReceive }\n }\n\n return {\n getQueryKeys,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n fetch: fetchGet,\n } as BuiltQuery<L>\n}\n","// routesV3.client.shared.ts\n\nimport type {\n AnyLeafLowProfile,\n FileField,\n HttpMethod,\n ImagePickerAsset,\n InferParams,\n InferQuery,\n ReactNativeFile,\n} from '@emeryld/rrroutes-contract'\nimport { compilePath, lowProfileParse } from '@emeryld/rrroutes-contract'\nimport type { ArgsFor, ArgsTuple, Cursor } from './routesV3.client.types'\n\n/**\n * Convert an HTTP method to uppercase (as expected by fetch).\n */\nexport const toUpper = (m: HttpMethod): Uppercase<HttpMethod> =>\n m.toUpperCase() as Uppercase<HttpMethod>\n\n/**\n * Serialize a query object into a search string.\n */\nexport function toSearchString(query: Record<string, unknown> | undefined) {\n if (!query) return ''\n const params = new URLSearchParams()\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue\n if (typeof v === 'string') {\n params.append(k, v)\n continue\n }\n if (typeof v === 'number' || typeof v === 'boolean') {\n params.append(k, String(v))\n continue\n }\n if (v instanceof Date) {\n params.append(k, v.toISOString())\n continue\n }\n params.append(k, JSON.stringify(v))\n }\n const s = params.toString()\n return s ? `?${s}` : ''\n}\n\n/**\n * Remove the given key from an object (used to drop cursors from cache keys).\n */\nexport function stripKey<Q extends Record<string, unknown> | undefined>(\n obj: Q,\n key: string,\n): Q {\n if (!obj) return obj\n const { [key]: _omit, ...rest } = obj as any\n return rest as Q\n}\n\n/**\n * Default cursor extractor used by infinite queries.\n */\nexport const defaultGetNextCursor = (p: unknown): Cursor => {\n if (!p || typeof p !== 'object') return undefined\n const record = p as Record<string, unknown>\n if ('nextCursor' in record) {\n return record.nextCursor as Cursor\n }\n if ('meta' in record) {\n const meta = record.meta\n if (meta && typeof meta === 'object' && 'nextCursor' in meta) {\n return (meta as Record<string, unknown>).nextCursor as Cursor\n }\n }\n return undefined\n}\n\n/**\n * Extract the optional argument object from a variadic tuple.\n */\nexport function extractArgs<L extends AnyLeafLowProfile>(\n args: ArgsTuple<L>,\n): ArgsFor<L> | undefined {\n return (args as unknown as any[])[0] as any\n}\n\n/**\n * Convert an optional args object into the variadic tuple form.\n */\nexport function toArgsTuple<L extends AnyLeafLowProfile>(\n args: ArgsFor<L> | undefined,\n): ArgsTuple<L> {\n return (typeof args === 'undefined' ? [] : [args]) as ArgsTuple<L>\n}\n\n/**\n * Normalize params and query values, then construct a request URL for the given leaf.\n */\nexport function buildUrl<L extends AnyLeafLowProfile>(\n leaf: L,\n baseUrl: string,\n params: InferParams<L> | undefined,\n query: InferQuery<L> | undefined,\n) {\n const normalizedParams = leaf.cfg.paramsSchema\n ? lowProfileParse(leaf.cfg.paramsSchema, params)\n : {}\n const normalizedQuery = leaf.cfg.querySchema\n ? lowProfileParse(leaf.cfg.querySchema, query)\n : {}\n\n const path = compilePath<L['path']>(\n leaf.path,\n (normalizedParams ?? {}) as any,\n )\n const url = `${baseUrl ?? ''}${path}${toSearchString(normalizedQuery as any)}`\n return { url, normalizedQuery, normalizedParams }\n}\n\n/**\n * Check whether the provided args are complete enough to build a request URL.\n * Used by hooks to avoid running queries until required params/query values exist.\n */\nexport function areEndpointArgsComplete<L extends AnyLeafLowProfile>(\n leaf: L,\n args: ArgsFor<L> | undefined,\n) {\n const params = (args as any)?.params as InferParams<L> | undefined\n const query = (args as any)?.query as InferQuery<L> | undefined\n try {\n buildUrl(leaf, '', params, query)\n return true\n } catch {\n return false\n }\n}\n\n// -----------------------------------------------------------------------------\n// Multipart / path helpers used by the raw fetch\n// -----------------------------------------------------------------------------\n\nfunction isBlobLike(value: unknown): value is Blob {\n return typeof Blob !== 'undefined' && value instanceof Blob\n}\n\nfunction assertFileFieldValue(\n sourceKey: string,\n targetField: string,\n value: unknown,\n) {\n if (value == null) return\n if (isBlobLike(value)) return\n if (isReactNativeFile(value)) return\n if (isImagePickerAsset(value)) return\n if (typeof FileList !== 'undefined' && value instanceof FileList) {\n for (const item of Array.from(value)) {\n if (!isBlobLike(item)) {\n throw new Error(\n `Multipart field \"${sourceKey}\" must contain Blob/File values for \"${targetField}\".`,\n )\n }\n }\n return\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n if (\n !isBlobLike(item) &&\n !isReactNativeFile(item) &&\n !isImagePickerAsset(item)\n ) {\n throw new Error(\n `Multipart field \"${sourceKey}\" must contain Blob/File, ReactNativeFile or ImagePickerAsset values for \"${targetField}\".`,\n )\n }\n }\n return\n }\n throw new Error(\n `Multipart field \"${sourceKey}\" must be Blob/File, ReactNativeFile, ImagePickerAsset, Blob[]/ReactNativeFile[]/ImagePickerAsset[] or FileList. ReactNativeFile = { uri: string, name: string, type: string }.`,\n )\n}\n\nexport function splitMultipartBody(\n body: Record<string, any> | undefined,\n fields: FileField[] | undefined,\n) {\n if (!body || typeof body !== 'object' || Array.isArray(body) || !fields) {\n return {\n regularBody: body,\n multipartFiles: {} as Record<string, unknown>,\n }\n }\n\n const fieldByInputKey = new Map<string, string>()\n for (const field of fields) {\n fieldByInputKey.set(`file_${field.name}`, field.name)\n fieldByInputKey.set(field.name, field.name)\n }\n\n const regularBody: Record<string, unknown> = {}\n const multipartFiles: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(body)) {\n const resolvedFieldName = fieldByInputKey.get(key)\n if (!resolvedFieldName) {\n regularBody[key] = value\n continue\n }\n assertFileFieldValue(key, resolvedFieldName, value)\n multipartFiles[resolvedFieldName] = value\n }\n\n return { regularBody, multipartFiles }\n}\n\nconst isReactNativeFile = (v: any): v is ReactNativeFile =>\n v &&\n typeof v === 'object' &&\n typeof v.uri === 'string' &&\n typeof v.name === 'string' &&\n typeof v.type === 'string'\n\nconst isImagePickerAsset = (v: any): v is ImagePickerAsset =>\n v &&\n typeof v === 'object' &&\n typeof v.uri === 'string' &&\n (typeof v.fileName === 'string' ||\n typeof v.mimeType === 'string' ||\n typeof v.width === 'number' ||\n typeof v.height === 'number')\n\nconst isFile = (v: any): v is File =>\n typeof File !== 'undefined' && v instanceof File\n\nconst isBlob = (v: any): v is Blob =>\n typeof Blob !== 'undefined' && v instanceof Blob\n\nexport function toFormData(\n body: Record<string, unknown>,\n bodyFiles: readonly FileField[] = [],\n) {\n const fd = new FormData()\n // Accept both inferred keys (file_${name}) and resolved field names (name)\n const fileKeys = new Set(bodyFiles.flatMap((f) => [f.name, `file_${f.name}`]))\n\n const appendFile = (fieldName: string, value: any) => {\n if (value == null) return\n\n // RN file descriptor\n if (isReactNativeFile(value)) {\n fd.append(fieldName, value as any)\n return\n }\n\n // Expo ImagePicker asset (normalize to RN file descriptor)\n if (isImagePickerAsset(value)) {\n fd.append(fieldName, {\n uri: value.uri,\n name: value.fileName ?? 'upload',\n type: value.mimeType ?? 'application/octet-stream',\n } as any)\n return\n }\n\n // Web File\n if (isFile(value)) {\n fd.append(fieldName, value, value.name)\n return\n }\n\n // Web/ReactNative Blob (RN supports Blob in many cases too)\n if (isBlob(value)) {\n fd.append(fieldName, value, 'upload')\n return\n }\n\n throw new Error(`Invalid upload value for ${fieldName}`)\n }\n\n for (const [key, value] of Object.entries(body)) {\n if (fileKeys.has(key)) {\n // If caller passed an array for a multi-file field, append each\n if (Array.isArray(value)) {\n for (const v of value) appendFile(key, v)\n } else {\n appendFile(key, value)\n }\n continue\n }\n\n // regular fields: stringify non-strings\n if (typeof value === 'string') fd.append(key, value)\n else if (typeof value === 'number' || typeof value === 'boolean')\n fd.append(key, String(value))\n else if (value == null) {\n // skip\n } else {\n // if you already have a policy for objects, keep it consistent\n fd.append(key, JSON.stringify(value))\n }\n }\n\n return fd\n}\n\nfunction getPathParamNames(path: string): Set<string> {\n const names = new Set<string>()\n const re = /:([A-Za-z0-9_]+)/g\n let match: RegExpExecArray | null\n while ((match = re.exec(path)) !== null) {\n names.add(match[1])\n }\n return names\n}\n\n/**\n * Validate that the query is a flat Record<string, string>.\n * Throws if any value is non-string or the structure is not a plain object.\n */\nexport function normalizeFlatQuery(\n query: unknown,\n): Record<string, string> | undefined {\n if (query == null) return undefined\n if (typeof query !== 'object' || Array.isArray(query)) {\n throw new Error('Query must be a plain object (Record<string, string>).')\n }\n const result: Record<string, string> = {}\n for (const [k, v] of Object.entries(query as Record<string, unknown>)) {\n if (v == null) continue\n if (typeof v !== 'string') {\n throw new Error(\n `Query param \"${k}\" must be a string; received type \"${typeof v}\".`,\n )\n }\n result[k] = v\n }\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Validate path parameters against the path template and compile the path.\n */\nexport function compileRawPath(path: string, params: unknown): string {\n const placeholders = getPathParamNames(path)\n\n if (!params || typeof params !== 'object' || Array.isArray(params)) {\n if (placeholders.size > 0) {\n throw new Error(\n `Missing path parameters for \"${path}\": ${[...placeholders].join(\n ', ',\n )}`,\n )\n }\n return path\n }\n\n const paramObj = params as Record<string, unknown>\n const providedNames = new Set(Object.keys(paramObj))\n\n // Extra params that do not exist in path\n for (const name of providedNames) {\n if (!placeholders.has(name)) {\n throw new Error(\n `Unexpected path parameter \"${name}\" for template \"${path}\".`,\n )\n }\n const value = paramObj[name]\n if (value != null && (typeof value === 'object' || Array.isArray(value))) {\n throw new Error(\n `Path parameter \"${name}\" must be a primitive; received \"${typeof value}\".`,\n )\n }\n }\n\n // Missing params for placeholders\n for (const name of placeholders) {\n if (!providedNames.has(name)) {\n throw new Error(\n `Missing value for path parameter \"${name}\" in template \"${path}\".`,\n )\n }\n }\n\n if (placeholders.size === 0) {\n return path\n }\n\n return compilePath(path as any, paramObj as any)\n}\n","// routesV3.client.infiniteGet.ts\n\nimport type {\n AnyLeafLowProfile,\n HttpMethod,\n InferBodyInput,\n InferOutput,\n InferParams,\n InferQuery,\n} from '@emeryld/rrroutes-contract'\nimport { buildCacheKey, lowProfileParse } from '@emeryld/rrroutes-contract'\nimport {\n keepPreviousData,\n useInfiniteQuery,\n type InfiniteData,\n type QueryClient,\n type QueryKey,\n} from '@tanstack/react-query'\nimport { useCallback, useRef } from 'react'\nimport {\n areEndpointArgsComplete,\n buildUrl,\n defaultGetNextCursor,\n extractArgs,\n splitMultipartBody,\n stripKey,\n toArgsTuple,\n toFormData,\n toUpper,\n} from './routesV3.client.shared'\nimport type {\n ArgsFor,\n ArgsTuple,\n BuiltInfinite,\n Cursor,\n DataShape,\n Fetcher,\n InfiniteBuildOptionsFor,\n InfiniteUseEndpointOptionsFor,\n QueryKeysFor,\n RouteClientDebugEvent,\n Updater,\n} from './routesV3.client.types'\n\ntype InfiniteEnv = {\n baseUrl: string\n validateResponses: boolean\n fetcher: Fetcher\n queryClient: QueryClient\n emit: (event: RouteClientDebugEvent) => void\n decorateDebugEvent: <T extends RouteClientDebugEvent>(\n event: T,\n details?: Partial<RouteClientDebugEvent>,\n ) => RouteClientDebugEvent\n isVerboseDebug: boolean\n leafLabel: string\n}\n\n/**\n * Merge two page outputs into a single logical page.\n * - Concatenates arrays.\n * - Shallow-merges objects.\n * - Special-cases \"meta\" to merge recursively.\n * - Defaults to the latest value for non-mergeable fields.\n */\nfunction mergePageOutputs(prev: any, next: any): any {\n if (prev == null) return next\n if (next == null) return prev\n\n if (Array.isArray(prev) && Array.isArray(next)) {\n return [...prev, ...next]\n }\n\n if (typeof prev !== 'object' || typeof next !== 'object') {\n return next\n }\n\n const merged: any = { ...prev }\n\n for (const key of Object.keys(next)) {\n const pv = (prev as any)[key]\n const nv = (next as any)[key]\n\n if (Array.isArray(pv) && Array.isArray(nv)) {\n merged[key] = [...pv, ...nv]\n continue\n }\n\n if (\n pv &&\n typeof pv === 'object' &&\n !Array.isArray(pv) &&\n nv &&\n typeof nv === 'object' &&\n !Array.isArray(nv)\n ) {\n if (key === 'meta') {\n merged[key] = mergePageOutputs(pv, nv)\n } else {\n merged[key] = nv\n }\n continue\n }\n\n merged[key] = nv\n }\n\n return merged\n}\n\nexport function buildInfiniteGetLeaf<L extends AnyLeafLowProfile>(\n leaf: L,\n rqOpts: InfiniteBuildOptionsFor<L> | undefined,\n env: InfiniteEnv,\n): BuiltInfinite<L> {\n const leafCfg = leaf.cfg\n const method = toUpper(leaf.method as HttpMethod)\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema)\n\n const {\n baseUrl,\n validateResponses,\n fetcher,\n queryClient,\n emit,\n decorateDebugEvent,\n isVerboseDebug,\n leafLabel,\n } = env\n\n emit({ type: 'build', leaf: leafLabel })\n\n // Feed-specific options\n const infiniteOptions = (rqOpts ?? {}) as InfiniteBuildOptionsFor<L>\n const {\n cursorQueryKey,\n getNextPageCursor,\n initialPageParam,\n splitPageSize,\n splitPageSizeParam,\n ...passthroughOptions\n } = infiniteOptions\n\n const feedCursorQueryKey = cursorQueryKey ?? 'pagination_cursor'\n const feedNextPageCursor =\n getNextPageCursor ??\n ((lastPage: InferOutput<L>) => defaultGetNextCursor(lastPage))\n const feedInitialPageParam =\n typeof initialPageParam === 'undefined' ? undefined : initialPageParam\n const feedQueryOptions = passthroughOptions\n\n const effectiveSplitPageSize =\n typeof splitPageSize === 'number' && splitPageSize > 0\n ? splitPageSize\n : undefined\n const effectiveSplitPageSizeParam = splitPageSizeParam ?? 'pageSize'\n\n const getQueryKeys = <A extends ArgsTuple<L> = ArgsTuple<L>>(\n ...tuple: A\n ): QueryKeysFor<L, A> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = (a as any)?.query as InferQuery<L> | undefined\n const qForKey = stripKey(query as any, feedCursorQueryKey)\n return buildCacheKey({\n leaf,\n params: params as any,\n query: qForKey,\n }) as unknown as QueryKeysFor<L, A>\n }\n\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple) as unknown as QueryKey\n await queryClient.invalidateQueries({ queryKey, exact: true })\n emit({ type: 'invalidate', key: queryKey, exact: true })\n }\n\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args\n const k = getQueryKeys(...(rest as ArgsTuple<L>)) as unknown as QueryKey\n const next = queryClient.setQueryData<\n InfiniteData<InferOutput<L>> | undefined\n >(k, (prev) =>\n typeof updater === 'function' ? (updater as any)(prev) : (updater as any),\n ) as any\n emit({ type: 'setData', key: k })\n return next as any\n }\n\n const buildOnReceive =\n (\n rqOpts as\n | { onReceive?: ((data: InferOutput<L>) => void) | undefined }\n | undefined\n )?.onReceive ?? undefined\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>\n body?: InferBodyInput<L>\n onReceive?: (data: InferOutput<L>) => void\n requireBody?: boolean\n },\n ): Promise<InferOutput<L>> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = {\n ...((a as any)?.query ?? ({} as InferQuery<L> | undefined)),\n ...(options?.queryOverride ?? {}),\n }\n\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n )\n\n let payload: unknown\n const isMultipart =\n Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0\n const acceptsBody = Boolean(leafCfg.bodySchema || isMultipart)\n const requiresBody = options?.requireBody ?? (!acceptsBody ? false : true)\n\n if (typeof options?.body !== 'undefined') {\n const { regularBody, multipartFiles } = splitMultipartBody(\n options.body as Record<string, unknown>,\n leafCfg.bodyFiles,\n )\n const normalizedBody = leafCfg.bodySchema\n ? lowProfileParse(leafCfg.bodySchema, regularBody)\n : regularBody\n if (isMultipart && normalizedBody && typeof normalizedBody === 'object') {\n payload = toFormData(\n {\n ...(normalizedBody as Record<string, unknown>),\n ...multipartFiles,\n },\n leafCfg.bodyFiles,\n )\n } else {\n payload = normalizedBody\n }\n } else if (requiresBody && acceptsBody) {\n throw new Error('Body is required when invoking a mutation fetch.')\n }\n\n const startedAt = Date.now()\n const detail = isVerboseDebug\n ? { params, normalizedParams, query, normalizedQuery, baseUrl }\n : undefined\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method,\n url,\n leaf: leafLabel,\n ...(payload !== undefined ? { body: payload } : {}),\n },\n detail,\n ),\n )\n\n try {\n const out = await fetcher<InferOutput<L>>(\n payload === undefined\n ? { url, method }\n : { url, method, body: payload },\n )\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'fetched',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n\n if (validateResponses) {\n if (!leafCfg.outputSchema) {\n throw new Error(\n `No output schema defined for leaf ${leafLabel}, cannot validate response.`,\n )\n }\n out.data = lowProfileParse(\n leafCfg.outputSchema,\n out.data,\n ) as InferOutput<L>\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'parsed',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n }\n\n options?.onReceive?.(out.data)\n return out.data\n } catch (error) {\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'error',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n ...(payload !== undefined ? { body: payload } : {}),\n error,\n },\n detail,\n ),\n )\n throw error\n }\n }\n\n const fetchGet: BuiltInfinite<L>['fetch'] = (...tupleWithBody) => {\n const acceptsBody = Boolean(leafCfg.bodySchema)\n const tupleLength = tupleWithBody.length\n const maybeBodyIndex = expectsArgs ? 1 : 0\n const hasBodyCandidate = acceptsBody && tupleLength > maybeBodyIndex\n const body = hasBodyCandidate\n ? (tupleWithBody[tupleLength - 1] as InferBodyInput<L>)\n : undefined\n const tuple = hasBodyCandidate\n ? (tupleWithBody.slice(0, tupleLength - 1) as ArgsTuple<L>)\n : (tupleWithBody as ArgsTuple<L>)\n\n return fetchEndpoint(tuple, {\n body,\n onReceive: buildOnReceive,\n requireBody: false,\n })\n }\n\n const useEndpoint: BuiltInfinite<L>['useEndpoint'] = (...useArgs) => {\n const args = (expectsArgs ? useArgs[0] : undefined) as\n | ArgsFor<L>\n | undefined\n const useEndpointOptions = (expectsArgs ? useArgs[1] : useArgs[0]) as\n | InfiniteUseEndpointOptionsFor<L>\n | undefined\n const hasCompleteArgs = !expectsArgs || areEndpointArgsComplete(leaf, args)\n const tuple = toArgsTuple(args)\n const params = (args as any)?.params as InferParams<L> | undefined\n const query = (args as any)?.query as InferQuery<L> | undefined\n const buildOptions = (feedQueryOptions ?? {}) as Omit<\n InfiniteBuildOptionsFor<L>,\n 'cursorQueryKey' | 'getNextPageCursor' | 'initialPageParam'\n >\n const { onReceive: buildOnReceive, ...buildInfiniteQueryOptions } =\n buildOptions\n const {\n onReceive: useOnReceive,\n cursorQueryKey: useCursorQueryKey,\n getNextPageCursor: useGetNextPageCursor,\n initialPageParam: useInitialPageParam,\n ...runtimeInfiniteQueryOptions\n } =\n (useEndpointOptions ?? {}) as InfiniteUseEndpointOptionsFor<L>\n const effectiveCursorParam = useCursorQueryKey ?? feedCursorQueryKey\n const effectiveNextPageCursor =\n useGetNextPageCursor ?? feedNextPageCursor\n const effectiveInitialPageParam =\n typeof useInitialPageParam === 'undefined'\n ? feedInitialPageParam\n : useInitialPageParam\n const qForKey = stripKey(query as any, effectiveCursorParam)\n const queryKeys = buildCacheKey({\n leaf,\n params: params as any,\n query: qForKey,\n }) as unknown as QueryKeysFor<L, ArgsTuple<L>>\n emit({\n type: 'useEndpoint',\n leaf: leafLabel,\n variant: 'infiniteGet',\n keys: queryKeys,\n })\n const mergedInfiniteQueryOptions = {\n ...buildInfiniteQueryOptions,\n ...runtimeInfiniteQueryOptions,\n }\n const mergedEnabled = (mergedInfiniteQueryOptions as { enabled?: unknown })\n .enabled\n const guardedEnabled =\n hasCompleteArgs &&\n (typeof mergedEnabled === 'undefined' ? true : mergedEnabled)\n\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>())\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOnReceive?.(data)\n useOnReceive?.(data)\n listenersRef.current.forEach((listener) => listener(data))\n },\n [buildOnReceive, useOnReceive],\n )\n const registerOnReceive = useCallback(\n (listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener)\n return () => {\n listenersRef.current.delete(listener)\n }\n },\n [],\n )\n\n const { normalizedQuery, normalizedParams } = hasCompleteArgs\n ? buildUrl({ ...leaf, cfg: leafCfg } as L, baseUrl, params, query)\n : {\n normalizedQuery: (query ?? {}) as InferQuery<L>,\n normalizedParams: (params ?? {}) as InferParams<L>,\n }\n\n const queryResult = useInfiniteQuery<\n InferOutput<L>,\n unknown,\n InfiniteData<InferOutput<L>>,\n QueryKey,\n Cursor\n >(\n {\n ...mergedInfiniteQueryOptions,\n enabled: guardedEnabled as any,\n placeholderData:\n mergedInfiniteQueryOptions.placeholderData ?? keepPreviousData,\n initialPageParam: effectiveInitialPageParam,\n getNextPageParam: (lastPage) => effectiveNextPageCursor(lastPage),\n queryKey: queryKeys as unknown as QueryKey,\n queryFn: ({ pageParam }) => {\n if (!hasCompleteArgs) {\n return Promise.resolve(undefined as InferOutput<L>)\n }\n\n // Fast path: no splitting configured.\n if (!effectiveSplitPageSize) {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [effectiveCursorParam]: pageParam } : {}),\n }\n return fetchEndpoint(tuple, {\n queryOverride: pageQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n })\n }\n\n // Read the logical page size from the normalized query.\n const basePageSizeRaw = (normalizedQuery as any)?.[\n effectiveSplitPageSizeParam\n ]\n const basePageSize =\n typeof basePageSizeRaw === 'number'\n ? basePageSizeRaw\n : basePageSizeRaw != null\n ? Number(basePageSizeRaw)\n : undefined\n\n // If no valid logical page size or split is not actually smaller, fall back.\n if (\n !basePageSize ||\n !Number.isFinite(basePageSize) ||\n basePageSize <= effectiveSplitPageSize\n ) {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [effectiveCursorParam]: pageParam } : {}),\n }\n return fetchEndpoint(tuple, {\n queryOverride: pageQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n })\n }\n\n const totalTarget = basePageSize\n const pageParamForThisPage = pageParam\n\n const runSplitFetch = async (): Promise<InferOutput<L>> => {\n let remaining = totalTarget\n let currentCursor: Cursor | undefined = pageParam\n let aggregated: InferOutput<L> | undefined\n\n while (remaining > 0) {\n const thisCallSize = Math.min(remaining, effectiveSplitPageSize)\n\n const splitQuery = {\n ...(normalizedQuery as any),\n ...(currentCursor\n ? { [effectiveCursorParam]: currentCursor }\n : {}),\n [effectiveSplitPageSizeParam]: thisCallSize,\n }\n\n const page = await fetchEndpoint(tuple, {\n queryOverride: splitQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n })\n\n aggregated = aggregated\n ? mergePageOutputs(aggregated, page)\n : page\n\n remaining -= thisCallSize\n\n const nextCursor = effectiveNextPageCursor(page)\n currentCursor = nextCursor\n\n const k = queryKeys as unknown as QueryKey\n\n queryClient.setQueryData<\n InfiniteData<InferOutput<L>> | undefined\n >(k, (prev) => {\n if (!aggregated) return prev\n\n if (!prev) {\n return {\n pages: [aggregated],\n pageParams: [pageParamForThisPage],\n } as InfiniteData<InferOutput<L>>\n }\n\n const idx = prev.pageParams.findIndex(\n (p) =>\n p === pageParamForThisPage ||\n (p == null && pageParamForThisPage == null),\n )\n\n if (idx === -1) {\n return {\n pages: [...prev.pages, aggregated],\n pageParams: [...prev.pageParams, pageParamForThisPage],\n }\n }\n\n const newPages = [...prev.pages]\n newPages[idx] = aggregated\n\n return { ...prev, pages: newPages }\n })\n\n if (!nextCursor) {\n break\n }\n }\n\n return aggregated as InferOutput<L>\n }\n\n return runSplitFetch()\n },\n },\n queryClient,\n )\n\n return { ...queryResult, onReceive: registerOnReceive }\n }\n\n return {\n getQueryKeys,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n fetch: fetchGet,\n } as BuiltInfinite<L>\n}\n","// routesV3.client.mutation.ts\n\nimport type {\n AnyLeafLowProfile,\n HttpMethod,\n InferBodyInput,\n InferOutput,\n InferParams,\n InferQuery,\n} from '@emeryld/rrroutes-contract'\nimport { buildCacheKey, lowProfileParse } from '@emeryld/rrroutes-contract'\nimport {\n useMutation,\n type QueryClient,\n type QueryKey,\n} from '@tanstack/react-query'\nimport { useCallback, useRef } from 'react'\nimport {\n buildUrl,\n extractArgs,\n splitMultipartBody,\n toArgsTuple,\n toFormData,\n toUpper,\n} from './routesV3.client.shared'\nimport type {\n ArgsFor,\n ArgsTuple,\n BuiltMutation,\n DataShape,\n Fetcher,\n MutationBuildOptionsFor,\n MutationUseEndpointOptionsFor,\n QueryKeysFor,\n RouteClientDebugEvent,\n Updater,\n} from './routesV3.client.types'\n\ntype MutationEnv = {\n baseUrl: string\n validateResponses: boolean\n fetcher: Fetcher\n queryClient: QueryClient\n emit: (event: RouteClientDebugEvent) => void\n decorateDebugEvent: <T extends RouteClientDebugEvent>(\n event: T,\n details?: Partial<RouteClientDebugEvent>,\n ) => RouteClientDebugEvent\n isVerboseDebug: boolean\n leafLabel: string\n}\n\nexport function buildMutationLeaf<L extends AnyLeafLowProfile>(\n leaf: L,\n rqOpts: MutationBuildOptionsFor<L> | undefined,\n env: MutationEnv,\n): BuiltMutation<L> {\n const leafCfg = leaf.cfg\n const method = toUpper(leaf.method as HttpMethod)\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema)\n\n const {\n baseUrl,\n validateResponses,\n fetcher,\n queryClient,\n emit,\n decorateDebugEvent,\n isVerboseDebug,\n leafLabel,\n } = env\n\n emit({ type: 'build', leaf: leafLabel })\n\n const getQueryKeys = <A extends ArgsTuple<L> = ArgsTuple<L>>(\n ...tuple: A\n ): QueryKeysFor<L, A> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = (a as any)?.query as InferQuery<L> | undefined\n return buildCacheKey({\n leaf,\n params: params as any,\n query: query as any,\n }) as unknown as QueryKeysFor<L, A>\n }\n\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple) as unknown as QueryKey\n await queryClient.invalidateQueries({ queryKey, exact: true })\n emit({ type: 'invalidate', key: queryKey, exact: true })\n }\n\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args\n const k = getQueryKeys(...(rest as ArgsTuple<L>)) as unknown as QueryKey\n const next = queryClient.setQueryData<InferOutput<L> | undefined>(\n k,\n (prev) =>\n typeof updater === 'function'\n ? (updater as any)(prev)\n : (updater as any),\n ) as any\n emit({ type: 'setData', key: k })\n return next as any\n }\n\n const mutationBuildOptions = (rqOpts ?? {}) as MutationBuildOptionsFor<L>\n const { onReceive: mutationBuildOnReceive, ...mutationBuildQueryOptions } =\n mutationBuildOptions\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>\n body?: InferBodyInput<L>\n onReceive?: (data: InferOutput<L>) => void\n requireBody?: boolean\n },\n ): Promise<InferOutput<L>> => {\n const a = extractArgs<L>(tuple)\n const params = (a as any)?.params as InferParams<L> | undefined\n const query = {\n ...((a as any)?.query ?? ({} as InferQuery<L> | undefined)),\n ...(options?.queryOverride ?? {}),\n }\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n )\n\n let payload: unknown\n const isMultipart =\n Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0\n const acceptsBody = Boolean(leafCfg.bodySchema || isMultipart)\n const requiresBody = options?.requireBody ?? (!acceptsBody ? false : true)\n\n if (typeof options?.body !== 'undefined') {\n const { regularBody, multipartFiles } = splitMultipartBody(\n options.body as Record<string, unknown>,\n leafCfg.bodyFiles,\n )\n const normalizedBody = leafCfg.bodySchema\n ? lowProfileParse(leafCfg.bodySchema, regularBody)\n : regularBody\n if (isMultipart && normalizedBody && typeof normalizedBody === 'object') {\n payload = toFormData(\n {\n ...(normalizedBody as Record<string, unknown>),\n ...multipartFiles,\n },\n leafCfg.bodyFiles,\n )\n } else {\n payload = normalizedBody\n }\n } else if (requiresBody && acceptsBody) {\n throw new Error('Body is required when invoking a mutation fetch.')\n }\n\n const startedAt = Date.now()\n const detail = isVerboseDebug\n ? { params, normalizedParams, query, normalizedQuery, baseUrl }\n : undefined\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method,\n url,\n leaf: leafLabel,\n ...(payload !== undefined ? { body: payload } : {}),\n },\n detail,\n ),\n )\n\n try {\n const out = await fetcher<InferOutput<L>>(\n payload === undefined\n ? { url, method }\n : { url, method, body: payload },\n )\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'fetched',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n\n if (validateResponses) {\n if (!leafCfg.outputSchema) {\n throw new Error(\n `No output schema defined for leaf ${leafLabel}, cannot validate response.`,\n )\n }\n out.data = lowProfileParse(\n leafCfg.outputSchema,\n out.data,\n ) as InferOutput<L>\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'parsed',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? {\n params: normalizedParams,\n query: normalizedQuery,\n output: out,\n }\n : undefined,\n ),\n )\n }\n\n options?.onReceive?.(out.data)\n return out.data\n } catch (error) {\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'error',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n ...(payload !== undefined ? { body: payload } : {}),\n error,\n },\n detail,\n ),\n )\n throw error\n }\n }\n\n const fetchMutation: BuiltMutation<L>['fetch'] = async (...tupleWithBody) => {\n if (tupleWithBody.length === 0) {\n throw new Error('Body is required when invoking a mutation fetch.')\n }\n const bodyIndex = tupleWithBody.length - 1\n const tuple = tupleWithBody.slice(0, bodyIndex) as ArgsTuple<L>\n const body = tupleWithBody[bodyIndex] as InferBodyInput<L>\n const result = await fetchEndpoint(tuple, {\n body,\n onReceive: (data) => mutationBuildOnReceive?.(data),\n requireBody: true,\n })\n return result\n }\n\n const useEndpoint: BuiltMutation<L>['useEndpoint'] = (...useArgs) => {\n const args = (expectsArgs ? useArgs[0] : undefined) as ArgsFor<L> | undefined\n const useEndpointOptions = (\n expectsArgs ? useArgs[1] : useArgs[0]\n ) as MutationUseEndpointOptionsFor<L> | undefined\n const tuple = toArgsTuple(args)\n const mutationKey = getQueryKeys(...tuple)\n emit({\n type: 'useEndpoint',\n leaf: leafLabel,\n variant: 'mutation',\n keys: mutationKey,\n })\n const { onReceive: useOnReceive, ...runtimeMutationOptions } = (useEndpointOptions ??\n {}) as MutationUseEndpointOptionsFor<L>\n const mergedMutationOptions = {\n ...mutationBuildQueryOptions,\n ...runtimeMutationOptions,\n }\n\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>())\n const notifyListeners = useCallback((data: InferOutput<L>) => {\n listenersRef.current.forEach((listener) => listener(data))\n }, [])\n const registerOnReceive = useCallback(\n (listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener)\n return () => {\n listenersRef.current.delete(listener)\n }\n },\n [],\n )\n\n const mutationResult = useMutation<\n InferOutput<L>,\n unknown,\n InferBodyInput<L>,\n unknown\n >(\n {\n ...mergedMutationOptions,\n mutationKey: mutationKey as unknown as QueryKey,\n mutationFn: async (body: InferBodyInput<L>) => {\n const result = await fetchMutation(\n ...([...tuple, body] as [...ArgsTuple<L>, InferBodyInput<L>]),\n )\n useOnReceive?.(result)\n notifyListeners(result)\n return result\n },\n },\n queryClient,\n )\n\n return { ...mutationResult, onReceive: registerOnReceive }\n }\n\n return {\n getQueryKeys,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n fetch: fetchMutation,\n } as BuiltMutation<L>\n}\n","// routesV3.client.ts\n\nimport {\n type AnyLeafLowProfile,\n type HttpMethod,\n} from '@emeryld/rrroutes-contract'\nimport { type QueryKey } from '@tanstack/react-query'\nimport { buildBatchBranch } from './routesV3.client.batch'\nimport { defaultFetcher } from './routesV3.client.fetch'\nimport { buildGetLeaf } from './routesV3.client.get'\nimport { buildInfiniteGetLeaf } from './routesV3.client.infiniteGet'\nimport { buildMutationLeaf } from './routesV3.client.mutation'\nimport {\n compileRawPath,\n normalizeFlatQuery,\n toSearchString,\n toUpper,\n} from './routesV3.client.shared'\nimport type {\n BranchBuildOptions,\n BuildMeta,\n BuildOptionsFor,\n BuiltForLeaf,\n BuiltLeafMap,\n RouteClient,\n RouteClientDebugEvent,\n RouteClientDebugLogger,\n RouteClientDebugMode,\n RouteClientDebugOptions,\n RouteClientDebugToggleOptions,\n RouteClientFetchArgs,\n RouteClientOptions,\n RouterBuilder,\n} from './routesV3.client.types'\n\nconst BUILT_LEAF_META = '__rrroutesLeaf' as const\ntype BuiltLeafWithMeta = {\n [BUILT_LEAF_META]?: AnyLeafLowProfile\n}\n\n// -----------------------------------------------------------------------------\n// Debug logging\n// -----------------------------------------------------------------------------\n\nconst noopDebugLogger: RouteClientDebugLogger = () => {}\n\nconst defaultDebugLogger: RouteClientDebugLogger = (\n event: RouteClientDebugEvent,\n) => {\n if (typeof console === 'undefined') return\n const fn = console.debug ?? console.log\n fn?.call(console, '[rrroutes-client]', event)\n}\n\nconst debugEventTypes: RouteClientDebugEvent['type'][] = [\n 'fetch',\n 'invalidate',\n 'setData',\n 'build',\n 'useEndpoint',\n]\n\ntype DebugEmitter<Names extends string> = {\n emit: (event: RouteClientDebugEvent, name?: Names) => void\n mode: RouteClientDebugMode\n}\n\nconst noopEmit = () => {}\n\nfunction createDebugEmitter<Names extends string>(\n option?: RouteClientDebugOptions<Names>,\n environment?: string,\n): DebugEmitter<Names> {\n const disabled: DebugEmitter<Names> = { emit: noopEmit, mode: 'minimal' }\n\n if (environment && environment.toLowerCase() === 'production') {\n return disabled\n }\n\n if (!option) {\n return disabled\n }\n if (option === true || option === 'minimal') {\n return {\n emit: (event, name) =>\n defaultDebugLogger(name ? { ...event, name } : event),\n mode: 'minimal',\n }\n }\n if (option === 'complete') {\n return {\n emit: (event, name) =>\n defaultDebugLogger(name ? { ...event, name } : event),\n mode: 'complete',\n }\n }\n if (typeof option === 'function') {\n return {\n emit: (event, name) => option(name ? { ...event, name } : event),\n mode: 'minimal',\n }\n }\n if (typeof option === 'object') {\n const toggles = option as RouteClientDebugToggleOptions<Names>\n const verbose = Boolean(toggles.verbose)\n const enabledTypes = debugEventTypes.filter((type) => toggles[type])\n if (enabledTypes.length === 0) {\n return { emit: noopEmit, mode: verbose ? 'complete' : 'minimal' }\n }\n const whitelist = new Set<RouteClientDebugEvent['type']>(enabledTypes)\n const onlySet =\n toggles.only && toggles.only.length > 0\n ? new Set<Names>(toggles.only)\n : undefined\n const logger = toggles.logger ?? defaultDebugLogger\n const emit: DebugEmitter<Names>['emit'] = (event, name) => {\n if (!whitelist.has(event.type)) return\n if (onlySet) {\n if (!name || !onlySet.has(name)) return\n }\n logger(name ? { ...event, name } : event)\n }\n return { emit, mode: verbose ? 'complete' : 'minimal' }\n }\n\n return disabled\n}\n\n// -----------------------------------------------------------------------------\n// Client factory\n// -----------------------------------------------------------------------------\n\nexport function createRouteClient<Names extends string = string>(\n opts: RouteClientOptions<Names>,\n): RouteClient<Names> {\n const queryClient = opts.queryClient\n const fetcher = opts.fetcher ?? defaultFetcher\n const baseUrl = opts.baseUrl\n const environment = opts.environment ?? undefined\n const validateResponses = opts.validateResponses ?? true\n\n const { emit: emitDebug, mode: debugMode } = createDebugEmitter<Names>(\n opts.debug,\n environment,\n )\n const isVerboseDebug = debugMode === 'complete'\n\n const decorateDebugEvent = <T extends RouteClientDebugEvent>(\n event: T,\n details?: Partial<RouteClientDebugEvent>,\n ): RouteClientDebugEvent => {\n if (!isVerboseDebug || !details) return event\n return { ...event, ...details } as RouteClientDebugEvent\n }\n\n async function invalidate(prefix: string[], exact = false) {\n const queryKey = prefix as unknown as QueryKey\n await queryClient.invalidateQueries({ queryKey, exact })\n emitDebug({ type: 'invalidate', key: queryKey, exact })\n }\n\n const toArgsTuple = (args: unknown) =>\n (typeof args === 'undefined' ? [] : [args]) as unknown[]\n\n const getBuiltLeaf = (built: unknown) => {\n const leaf = (built as BuiltLeafWithMeta)[BUILT_LEAF_META]\n if (!leaf) {\n throw new Error(\n 'buildBranch(...) expects endpoints created with this route client via client.build(...).',\n )\n }\n return leaf\n }\n\n const encodeLeafKey = (leaf: AnyLeafLowProfile) =>\n encodeURIComponent(`${leaf.method.toUpperCase()} ${leaf.path}`)\n\n function buildInternal<L extends AnyLeafLowProfile>(\n leaf: L,\n rqOpts?: BuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ): BuiltForLeaf<L> {\n const leafLabel = `${leaf.method.toUpperCase()} ${String(leaf.path)}`\n const debugName = meta?.name\n const emit = (event: RouteClientDebugEvent) => emitDebug(event, debugName)\n\n const isGet = leaf.method === 'get'\n const isFeed = !!leaf.cfg.feed\n\n const env = {\n baseUrl,\n validateResponses,\n fetcher,\n queryClient,\n emit,\n decorateDebugEvent,\n isVerboseDebug,\n leafLabel,\n }\n\n let built: BuiltForLeaf<L>\n if (isGet && isFeed) {\n built = buildInfiniteGetLeaf(\n leaf,\n rqOpts as any,\n env,\n ) as unknown as BuiltForLeaf<L>\n } else if (isGet) {\n built = buildGetLeaf(\n leaf,\n rqOpts as any,\n env,\n ) as unknown as BuiltForLeaf<L>\n } else {\n built = buildMutationLeaf(\n leaf,\n rqOpts as any,\n env,\n ) as unknown as BuiltForLeaf<L>\n }\n\n Object.defineProperty(built as object, BUILT_LEAF_META, {\n value: leaf,\n enumerable: false,\n configurable: false,\n writable: false,\n })\n\n return built\n }\n\n const fetchRaw: RouteClient<Names>['fetch'] = async (\n input: RouteClientFetchArgs,\n ) => {\n const { path, method, query, body, params } = input as any\n\n if (!path || typeof path !== 'string') {\n throw new Error('fetch(path, ...) requires a non-empty string path.')\n }\n if (!method) {\n throw new Error('fetch(path, method, ...) requires an HTTP method.')\n }\n\n const methodLower = String(method).toLowerCase() as HttpMethod\n const methodUpper = toUpper(methodLower)\n\n const flatQuery = normalizeFlatQuery(query)\n const search = toSearchString(flatQuery as Record<string, unknown>)\n\n const compiledPath = compileRawPath(path, params)\n const url = `${baseUrl ?? ''}${compiledPath}${search}`\n const leafLabel = `${methodUpper} ${path}`\n\n const startedAt = Date.now()\n const detail = isVerboseDebug\n ? { params, flatQuery, query, baseUrl }\n : undefined\n\n emitDebug(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method: methodUpper,\n url,\n leaf: leafLabel,\n ...(body !== undefined ? { body } : {}),\n },\n detail,\n ),\n )\n\n try {\n const out = await fetcher<unknown>(\n body === undefined\n ? { url, method: methodUpper, headers: input.headers }\n : { url, method: methodUpper, body, headers: input.headers },\n )\n\n emitDebug(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'fetched',\n method: methodUpper,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug\n ? { params, query: flatQuery, output: out }\n : undefined,\n ),\n )\n\n return out\n } catch (error) {\n emitDebug(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'error',\n method: methodUpper,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n ...(body !== undefined ? { body } : {}),\n error,\n },\n detail,\n ),\n )\n throw error\n }\n }\n\n const buildBranchInternal: RouteClient<Names>['buildBranch'] = <\n T extends BuiltLeafMap,\n >(\n leaves: T,\n options: BranchBuildOptions,\n ) =>\n buildBatchBranch(leaves, options, {\n fetchRaw,\n queryClient,\n validateResponses,\n getBuiltLeaf,\n encodeLeafKey,\n toArgsTuple,\n })\n\n return {\n queryClient,\n invalidate,\n fetch: fetchRaw,\n build: buildInternal as RouteClient<Names>['build'],\n buildBranch: buildBranchInternal as RouteClient<Names>['buildBranch'],\n }\n}\n\n// -----------------------------------------------------------------------------\n// Router builder\n// -----------------------------------------------------------------------------\n\nexport function buildRouter<\n Routes extends Record<PropertyKey, AnyLeafLowProfile>,\n Names extends string = string,\n>(\n routeClient: RouteClient<Names>,\n routes: Routes,\n): RouterBuilder<Routes, Names> {\n const buildLeaf = routeClient.build as <L extends AnyLeafLowProfile>(\n leaf: L,\n options?: BuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ) => BuiltForLeaf<L>\n\n return ((key, opts, meta) =>\n buildLeaf(\n routes[key],\n opts as BuildOptionsFor<Routes[typeof key]>,\n meta,\n )) as RouterBuilder<Routes, Names>\n}\n","import type {\n EventMap,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport * as React from 'react'\nimport type { Socket } from 'socket.io-client'\nimport { SocketCtx, useSocketClient } from './socket.client.context.client'\nimport {\n useSocketConnection,\n useSocketEvent,\n useSocketRooms,\n type UseSocketEventArgs,\n type UseSocketConnectionArgs,\n type UseSocketRoomsArgs,\n} from './socket.client.context.connection'\nimport {\n dbg,\n describeSocketLike,\n SocketProviderDebugOptions,\n summarizeBaseOptions,\n summarizeEvents,\n summarizeMeta,\n trackHookTrigger,\n type HookDebugSnapshot,\n} from './socket.client.context.debug'\nimport { SocketClient, type SocketClientOptions } from './socket.client.core'\n\ntype BaseOptions<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n> = Omit<SocketClientOptions<T, C>, 'socket'>\n\ntype ProviderRuntimeSocket =\n | { socket: Socket | null }\n | { getSocket: () => Socket | Promise<Socket> }\n\ntype SocketProviderProps<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n> = React.PropsWithChildren<\n {\n events: T\n baseOptions: BaseOptions<T, C>\n fallback?: React.ReactNode\n providerDebug?: SocketProviderDebugOptions\n destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>\n } & ProviderRuntimeSocket\n>\n\nexport function buildSocketProvider<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(args: {\n /** The events map for the SocketClient. This is required to ensure type safety when using the client and connection hooks. */\n events: T\n /** The base options for the SocketClient. This includes all options except the socket instance and debug options. */\n options: Omit<BaseOptions<T, C>, 'debug'> & {\n /** Optional debug configuration.\n * emit: when emitting an event\n * receive: when receiving an event\n * connection: on connect/reconnect/disconnect/connect_error\n * lifecycle: on client init and destroy\n * heartbeat: on ping emit, pong receive, and validation failures\n * config: when logging the socket config snapshot (only if debug.logger is set)\n * room: on room join and leave attempts\n * register: when registering and unregistering event handlers\n * resolve: when resolving the socket from getSocket, including start, success, failure, and cancellation\n * client: when the SocketClient instance is created or destroyed, or if the socket is missing on init\n * render: on each render of the provider, including whether the client is available\n * hook: when key hooks are triggered, such as receiving endpoint data or applying socket messages, along with snapshots of relevant state\n */\n debug: BaseOptions<T, C>['debug'] & SocketProviderDebugOptions\n }\n}) {\n const { events, options: baseOptions } = args\n\n return {\n SocketProvider: (\n props: React.PropsWithChildren<\n ProviderRuntimeSocket & {\n fallback?: React.ReactNode\n destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>\n }\n >,\n ) => (\n <SocketProvider<T, C>\n events={events}\n baseOptions={baseOptions}\n providerDebug={baseOptions.debug}\n {...props}\n />\n ),\n useSocketClient: () => useSocketClient<T, C>(),\n useSocketRooms: (p: UseSocketRoomsArgs<C>) => useSocketRooms<C>(p),\n useSocketEvent: <K extends keyof T & string>(p: UseSocketEventArgs<T, K, C>) =>\n useSocketEvent<T, K, C>(p),\n useSocketConnection: <K extends keyof T & string>(\n ...args: UseSocketConnectionArgs<T, K, C>\n ) => useSocketConnection<T, K, C>(...args),\n }\n}\n\nfunction SocketProvider<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(props: SocketProviderProps<T, C>) {\n const {\n events,\n baseOptions,\n children,\n fallback,\n providerDebug,\n destroyLeaveMeta,\n } = props\n\n const [resolvedSocket, setResolvedSocket] = React.useState<Socket | null>(\n null,\n )\n\n const socket: Socket | null =\n 'socket' in props ? (props.socket ?? null) : resolvedSocket\n\n const providerDebugRef = React.useRef<\n SocketProviderDebugOptions | undefined\n >()\n providerDebugRef.current = providerDebug\n\n const resolveEffectDebugRef = React.useRef<HookDebugSnapshot | null>(null)\n const clientMemoDebugRef = React.useRef<HookDebugSnapshot | null>(null)\n const destroyEffectDebugRef = React.useRef<HookDebugSnapshot | null>(null)\n\n React.useEffect(() => {\n trackHookTrigger({\n ref: resolveEffectDebugRef,\n hook: 'resolve_effect',\n providerDebug: providerDebugRef.current,\n snapshot: {\n resolvedSocket: describeSocketLike(resolvedSocket),\n },\n })\n\n if (!('getSocket' in props)) return\n\n let cancelled = false\n dbg(providerDebugRef.current, { type: 'resolve', phase: 'start' })\n\n if (!resolvedSocket) {\n Promise.resolve(props.getSocket())\n .then((s) => {\n if (cancelled) {\n dbg(providerDebugRef.current, {\n type: 'resolve',\n phase: 'cancelled',\n })\n return\n }\n if (!s) {\n dbg(providerDebugRef.current, {\n type: 'resolve',\n phase: 'socketMissing',\n })\n return\n }\n setResolvedSocket(s)\n dbg(providerDebugRef.current, { type: 'resolve', phase: 'ok' })\n })\n .catch((err) => {\n if (cancelled) return\n dbg(providerDebugRef.current, {\n type: 'resolve',\n phase: 'error',\n err: String(err),\n })\n })\n }\n\n return () => {\n cancelled = true\n }\n }, [resolvedSocket])\n\n trackHookTrigger({\n ref: clientMemoDebugRef,\n hook: 'client_memo',\n providerDebug: providerDebugRef.current,\n snapshot: {\n events: summarizeEvents(events),\n baseOptions: summarizeBaseOptions(baseOptions),\n socket: describeSocketLike(socket),\n },\n })\n\n const client = React.useMemo(() => {\n if (!socket) {\n dbg(providerDebugRef.current, {\n type: 'client',\n phase: 'init',\n missing: true,\n })\n return null\n }\n const c = new SocketClient<T, C>(events, { ...baseOptions, socket })\n dbg(providerDebugRef.current, {\n type: 'client',\n phase: 'init',\n missing: false,\n })\n return c\n }, [events, baseOptions, socket])\n\n const destroyLeaveMetaRef = React.useRef(destroyLeaveMeta)\n React.useEffect(() => {\n destroyLeaveMetaRef.current = destroyLeaveMeta\n }, [destroyLeaveMeta])\n\n React.useEffect(() => {\n trackHookTrigger({\n ref: destroyEffectDebugRef,\n hook: 'destroy_effect',\n providerDebug: providerDebugRef.current,\n snapshot: {\n hasClient: !!client,\n destroyLeaveMeta: summarizeMeta(\n destroyLeaveMetaRef.current,\n 'destroyLeaveMeta',\n ),\n },\n })\n\n return () => {\n if (client) {\n void Promise.resolve(client.destroy(destroyLeaveMetaRef.current))\n .then(() => {\n dbg(providerDebugRef.current, { type: 'client', phase: 'destroy' })\n })\n .catch((error) => {\n dbg(providerDebugRef.current, {\n type: 'resolve',\n phase: 'error',\n err: `client.destroy failed: ${String(error)}`,\n })\n })\n }\n }\n }, [client])\n\n dbg(providerDebugRef.current, { type: 'render', hasClient: !!client })\n\n return (\n <SocketCtx.Provider value={client}>\n {client == null ? (fallback ?? children) : children}\n </SocketCtx.Provider>\n )\n}\n","import type {\n EventMap,\n SocketConnectionConfigOutput,\n} from '@emeryld/rrroutes-contract'\nimport * as React from 'react'\nimport { SocketClient } from './socket.client.core'\n\nexport const SocketCtx = React.createContext<SocketClient<\n any,\n SocketConnectionConfigOutput\n> | null | undefined>(undefined)\n\nexport function useSocketClient<\n T extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(): SocketClient<T, C> | null {\n const ctx = React.useContext(SocketCtx)\n if (typeof ctx === 'undefined' || !ctx) {\n return null\n }\n return ctx as unknown as SocketClient<T, C> | null\n}\n","import type {\n EventMap,\n Payload,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport * as React from 'react'\nimport { useSocketClient } from './socket.client.context.client'\nimport type { ClientCtx, ServerEnvelope } from './socket.client.core'\n\ntype Rooms = string[] | string | undefined\n\nexport type UseSocketConnectionDebugEvent =\n | {\n type: 'lifecycle'\n phase: 'effect_start' | 'effect_cleanup' | 'client_missing'\n event?: string\n rooms?: string[]\n autoJoin?: boolean\n autoLeave?: boolean\n }\n | {\n type: 'subscription'\n phase: 'register' | 'unregister' | 'message' | 'message_dropped_duplicate'\n event: string\n dedupeKey?: string\n }\n | {\n type: 'room'\n phase:\n | 'join_attempt'\n | 'join_ok'\n | 'join_error'\n | 'leave_attempt'\n | 'leave_ok'\n | 'leave_error'\n | 'join_skip'\n | 'leave_skip'\n rooms: string[]\n reason?: 'no_rooms' | 'auto_disabled' | 'disabled'\n err?: string\n }\n\nexport type UseSocketConnectionDebugOptions = {\n enabled?: boolean\n logger?: (event: UseSocketConnectionDebugEvent) => void\n lifecycle?: boolean\n subscription?: boolean\n room?: boolean\n warnIfClientMissing?: boolean\n}\n\nexport type UseSocketRoomsArgs<C extends SocketConnectionConfigOutput> = {\n rooms?: Rooms\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>\n autoJoin?: boolean\n autoLeave?: boolean\n enabled?: boolean\n onCleanup?: () => void\n debug?: UseSocketConnectionDebugOptions\n}\n\nexport type UseSocketEventArgs<\n T extends EventMap,\n K extends keyof T & string,\n C extends SocketConnectionConfigOutput,\n> = {\n event: K\n onMessage: (\n payload: Payload<T, K>,\n meta?: { envelope: ServerEnvelope<T[K]['__out']>; ctx: ClientCtx },\n ) => void\n enabled?: boolean\n onCleanup?: () => void\n messageDeduplication?: {\n ttlMs?: number\n key?: (\n payload: Payload<T, K>,\n meta?: { envelope: ServerEnvelope<T[K]['__out']>; ctx: ClientCtx },\n ) => string | undefined\n }\n debug?: UseSocketConnectionDebugOptions\n // Keeps `C` in the public signature for provider-bound typing parity.\n _configBrand?: C\n}\n\nexport type UseSocketConnectionArgs<\n T extends EventMap,\n K extends keyof T & string,\n C extends SocketConnectionConfigOutput,\n> = [\n rooms: UseSocketRoomsArgs<C>,\n event: UseSocketEventArgs<T, K, C>,\n]\n\nfunction normalizeRooms(rooms: Rooms): string[] {\n if (rooms == null) return []\n return Array.isArray(rooms) ? rooms : [rooms]\n}\n\nfunction safeSerialize(value: unknown): string {\n try {\n return JSON.stringify(value) ?? String(value)\n } catch {\n return '[unserializable]'\n }\n}\n\nfunction useLatestRef<T>(value: T): React.MutableRefObject<T> {\n const ref = React.useRef(value)\n React.useEffect(() => {\n ref.current = value\n }, [value])\n return ref\n}\n\nfunction useDebugEmitter(debug: UseSocketConnectionDebugOptions | undefined) {\n const debugRef = useLatestRef(debug)\n return React.useCallback((event: UseSocketConnectionDebugEvent) => {\n const dbg = debugRef.current\n if (!dbg?.enabled) return\n if (dbg[event.type] === false) return\n const logger = dbg.logger\n if (logger) {\n try {\n logger(event)\n } catch (error) {\n if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n // eslint-disable-next-line no-console\n console.warn('[socket] debug logger threw', error)\n }\n }\n return\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n // eslint-disable-next-line no-console\n console.log('[socket]', event)\n }\n }, [])\n}\n\nexport function useSocketRooms<C extends SocketConnectionConfigOutput>(\n args: UseSocketRoomsArgs<C>,\n) {\n const {\n rooms,\n autoJoin = true,\n autoLeave = true,\n enabled = true,\n onCleanup,\n debug,\n } = args\n const client = useSocketClient<EventMap, C>()\n\n const normalizedRooms = React.useMemo(() => normalizeRooms(rooms), [rooms])\n const normalizedRoomsKey = React.useMemo(\n () => normalizedRooms.join('\\u0001'),\n [normalizedRooms],\n )\n const joinMetaRef = useLatestRef(args.joinMeta)\n const leaveMetaRef = useLatestRef(args.leaveMeta)\n const onCleanupRef = useLatestRef(onCleanup)\n const debugRef = useLatestRef(debug)\n const emitDebug = useDebugEmitter(debug)\n const missingClientWarnedRef = React.useRef(false)\n const joinMetaKey = React.useMemo(\n () => JSON.stringify(args.joinMeta ?? null),\n [args.joinMeta],\n )\n const leaveMetaKey = React.useMemo(\n () => JSON.stringify(args.leaveMeta ?? null),\n [args.leaveMeta],\n )\n\n React.useEffect(() => {\n emitDebug({\n type: 'lifecycle',\n phase: 'effect_start',\n rooms: normalizedRooms,\n autoJoin,\n autoLeave,\n })\n\n if (!enabled) {\n emitDebug({\n type: 'room',\n phase: 'join_skip',\n rooms: normalizedRooms,\n reason: 'disabled',\n })\n return\n }\n\n if (!client) {\n emitDebug({\n type: 'lifecycle',\n phase: 'client_missing',\n rooms: normalizedRooms,\n autoJoin,\n autoLeave,\n })\n if (\n debugRef.current?.warnIfClientMissing &&\n !missingClientWarnedRef.current &&\n typeof console !== 'undefined' &&\n typeof console.warn === 'function'\n ) {\n missingClientWarnedRef.current = true\n // eslint-disable-next-line no-console\n console.warn('[socket] useSocketRooms skipped because SocketClient is null.')\n }\n return\n }\n missingClientWarnedRef.current = false\n\n if (autoJoin && normalizedRooms.length > 0) {\n emitDebug({ type: 'room', phase: 'join_attempt', rooms: normalizedRooms })\n void client\n .joinRooms(normalizedRooms, joinMetaRef.current)\n .then(() => emitDebug({ type: 'room', phase: 'join_ok', rooms: normalizedRooms }))\n .catch((error) =>\n emitDebug({\n type: 'room',\n phase: 'join_error',\n rooms: normalizedRooms,\n err: String(error),\n }),\n )\n } else {\n emitDebug({\n type: 'room',\n phase: 'join_skip',\n rooms: normalizedRooms,\n reason: autoJoin ? 'no_rooms' : 'auto_disabled',\n })\n }\n\n return () => {\n if (autoLeave && normalizedRooms.length > 0) {\n emitDebug({\n type: 'room',\n phase: 'leave_attempt',\n rooms: normalizedRooms,\n })\n void client\n .leaveRooms(normalizedRooms, leaveMetaRef.current)\n .then(() =>\n emitDebug({ type: 'room', phase: 'leave_ok', rooms: normalizedRooms }),\n )\n .catch((error) =>\n emitDebug({\n type: 'room',\n phase: 'leave_error',\n rooms: normalizedRooms,\n err: String(error),\n }),\n )\n } else {\n emitDebug({\n type: 'room',\n phase: 'leave_skip',\n rooms: normalizedRooms,\n reason: autoLeave ? 'no_rooms' : 'auto_disabled',\n })\n }\n onCleanupRef.current?.()\n emitDebug({\n type: 'lifecycle',\n phase: 'effect_cleanup',\n rooms: normalizedRooms,\n autoJoin,\n autoLeave,\n })\n }\n }, [\n client,\n enabled,\n autoJoin,\n autoLeave,\n normalizedRoomsKey,\n joinMetaKey,\n leaveMetaKey,\n emitDebug,\n ])\n}\n\nexport function useSocketEvent<\n T extends EventMap,\n K extends keyof T & string,\n C extends SocketConnectionConfigOutput,\n>(args: UseSocketEventArgs<T, K, C>) {\n const {\n event,\n onMessage,\n onCleanup,\n enabled = true,\n messageDeduplication,\n debug,\n } = args\n const client = useSocketClient<T, C>()\n const onMessageRef = useLatestRef(onMessage)\n const onCleanupRef = useLatestRef(onCleanup)\n const messageDeduplicationRef = useLatestRef(messageDeduplication)\n const debugRef = useLatestRef(debug)\n const emitDebug = useDebugEmitter(debug)\n const missingClientWarnedRef = React.useRef(false)\n const seenMessageKeysRef = React.useRef<Map<string, number>>(new Map())\n\n React.useEffect(() => {\n emitDebug({ type: 'lifecycle', phase: 'effect_start', event })\n\n if (!enabled) return\n\n if (!client) {\n emitDebug({ type: 'lifecycle', phase: 'client_missing', event })\n if (\n debugRef.current?.warnIfClientMissing &&\n !missingClientWarnedRef.current &&\n typeof console !== 'undefined' &&\n typeof console.warn === 'function'\n ) {\n missingClientWarnedRef.current = true\n // eslint-disable-next-line no-console\n console.warn(`[socket] useSocketEvent(\"${event}\") skipped because SocketClient is null.`)\n }\n return\n }\n missingClientWarnedRef.current = false\n\n emitDebug({ type: 'subscription', phase: 'register', event })\n const unsubscribe = client.on(event, (payload, meta) => {\n const dedupeCfg = messageDeduplicationRef.current\n if (dedupeCfg) {\n const ttlMs = Math.max(0, dedupeCfg.ttlMs ?? 1500)\n const now = Date.now()\n const dedupeKey =\n dedupeCfg.key?.(payload, meta) ??\n (meta?.envelope\n ? `${event}|${String(meta.envelope.eventName)}|${String(meta.envelope.sentAt)}|${safeSerialize(payload)}`\n : `${event}|${safeSerialize(payload)}`)\n const prev = seenMessageKeysRef.current.get(dedupeKey)\n if (typeof prev === 'number' && now - prev <= ttlMs) {\n emitDebug({\n type: 'subscription',\n phase: 'message_dropped_duplicate',\n event,\n dedupeKey,\n })\n return\n }\n seenMessageKeysRef.current.set(dedupeKey, now)\n }\n\n emitDebug({ type: 'subscription', phase: 'message', event })\n onMessageRef.current(payload, meta)\n })\n\n return () => {\n emitDebug({ type: 'subscription', phase: 'unregister', event })\n unsubscribe()\n onCleanupRef.current?.()\n emitDebug({ type: 'lifecycle', phase: 'effect_cleanup', event })\n }\n }, [client, enabled, event, emitDebug])\n}\n\nexport function useSocketConnection<\n T extends EventMap,\n K extends keyof T & string,\n C extends SocketConnectionConfigOutput,\n>(\n roomsArgs: UseSocketRoomsArgs<C>,\n eventArgs: UseSocketEventArgs<T, K, C>,\n) {\n useSocketRooms<C>(roomsArgs)\n useSocketEvent<T, K, C>(eventArgs)\n}\n","import type * as React from 'react'\n\ntype HookDebugReason = 'init' | 'change'\ntype HookDebugValue = string | number | boolean | null | undefined\n\nexport type SocketProviderDebugEvent =\n | {\n type: 'resolve'\n phase: 'start' | 'ok' | 'error' | 'socketMissing' | 'cancelled'\n err?: string\n }\n | { type: 'client'; phase: 'init' | 'destroy'; missing?: boolean }\n | { type: 'render'; hasClient: boolean }\n | {\n type: 'hook'\n phase: 'resolve_effect' | 'client_memo' | 'destroy_effect'\n reason: HookDebugReason\n changes: Array<{\n dependency: string\n previous: HookDebugValue\n next: HookDebugValue\n }>\n }\n\nexport type SocketProviderDebugOptions = {\n verbose?: boolean\n logger?: (e: SocketProviderDebugEvent) => void\n} & {\n [P in SocketProviderDebugEvent['type']]?: boolean\n}\n\nexport type HookDebugSnapshot = Record<string, unknown>\ntype HookIdentifier = Extract<\n SocketProviderDebugEvent,\n { type: 'hook' }\n>['phase']\n\nexport function dbg(\n dbgOpts: SocketProviderDebugOptions | undefined,\n e: SocketProviderDebugEvent,\n) {\n if (!dbgOpts?.logger) return\n if (!dbgOpts[e.type]) return\n try {\n dbgOpts.logger(e)\n } catch (error) {\n if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n // eslint-disable-next-line no-console\n console.warn('[socket] provider debug logger threw', error)\n }\n }\n}\n\nfunction isProbablySocket(value: unknown): value is {\n id?: string\n connected?: boolean\n recovered?: boolean\n} {\n if (!value || typeof value !== 'object') return false\n const anyVal = value as any\n const ctorName = anyVal.constructor?.name\n if (ctorName === 'Socket') return true\n return (\n ('connected' in anyVal || 'recovered' in anyVal) &&\n typeof anyVal.on === 'function' &&\n typeof anyVal.emit === 'function'\n )\n}\n\nexport function describeSocketLike(\n value: { id?: string; connected?: boolean; recovered?: boolean } | null,\n): HookDebugValue {\n if (!value) return null\n const id = value.id ?? 'unknown'\n const connected = value.connected ?? false\n const recovered =\n typeof value.recovered === 'boolean' ? ` recovered=${value.recovered}` : ''\n return `[Socket id=${id} connected=${connected}${recovered}]`\n}\n\nfunction safeDescribeHookValue(value: unknown): HookDebugValue {\n if (value == null) return value as null | undefined\n\n const valueType = typeof value\n if (\n valueType === 'string' ||\n valueType === 'number' ||\n valueType === 'boolean'\n ) {\n return value as HookDebugValue\n }\n if (valueType === 'bigint' || valueType === 'symbol') return String(value)\n if (valueType === 'function')\n return `[function ${(value as Function).name || 'anonymous'}]`\n if (Array.isArray(value)) return `[array length=${value.length}]`\n\n if (isProbablySocket(value)) return describeSocketLike(value)\n\n const ctorName =\n (value as { constructor?: { name?: string } }).constructor?.name ?? 'object'\n const keys = Object.keys(value as Record<string, unknown>)\n const keyPreview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n return `[${ctorName} keys=${keyPreview}${suffix}]`\n}\n\nexport function summarizeEvents(events: unknown): HookDebugValue {\n if (!events || typeof events !== 'object')\n return safeDescribeHookValue(events)\n const keys = Object.keys(events as Record<string, unknown>)\n if (!keys.length) return '[events empty]'\n const preview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n return `[events count=${keys.length} keys=${preview}${suffix}]`\n}\n\nexport function summarizeBaseOptions(options: unknown): HookDebugValue {\n if (!options || typeof options !== 'object')\n return safeDescribeHookValue(options)\n const obj = options as Record<string, unknown>\n const keys = Object.keys(obj)\n if (!keys.length) return '[baseOptions empty]'\n\n const preview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n const hasDebug = 'debug' in obj\n return `[baseOptions keys=${preview}${suffix} debug=${hasDebug}]`\n}\n\nexport function summarizeMeta(meta: unknown, label: string): HookDebugValue {\n if (meta == null) return null\n if (typeof meta !== 'object') return safeDescribeHookValue(meta)\n const keys = Object.keys(meta as Record<string, unknown>)\n if (!keys.length) return `[${label} empty]`\n const preview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n return `[${label} keys=${preview}${suffix}]`\n}\n\nfunction createHookDebugEvent(\n prev: HookDebugSnapshot | null,\n next: HookDebugSnapshot,\n hook: HookIdentifier,\n): Extract<SocketProviderDebugEvent, { type: 'hook' }> | null {\n const reason: HookDebugReason = prev ? 'change' : 'init'\n const changed = Object.keys(next).reduce<\n Array<{\n dependency: string\n previous: HookDebugValue\n next: HookDebugValue\n }>\n >((acc, dependency) => {\n const prevValue = prev ? prev[dependency] : undefined\n const nextValue = next[dependency]\n if (!prev || !Object.is(prevValue, nextValue)) {\n acc.push({\n dependency,\n previous: safeDescribeHookValue(prevValue),\n next: safeDescribeHookValue(nextValue),\n })\n }\n return acc\n }, [])\n\n if (!changed.length) return null\n return { type: 'hook', phase: hook, reason, changes: changed }\n}\n\nexport function trackHookTrigger({\n ref,\n hook,\n providerDebug,\n snapshot,\n}: {\n ref: React.MutableRefObject<HookDebugSnapshot | null>\n hook: HookIdentifier\n providerDebug?: SocketProviderDebugOptions\n snapshot: HookDebugSnapshot\n}) {\n const prev = ref.current\n ref.current = snapshot\n if (!providerDebug?.logger || !providerDebug?.hook) return\n const event = createHookDebugEvent(prev, snapshot, hook)\n if (event) dbg(providerDebug, event)\n}\n","// socket.client.sys.ts\n\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport type { Socket } from 'socket.io-client'\nimport { z } from 'zod'\nimport type { SocketClient } from './socket.client.core'\n\nexport type MaybeSocket = Socket | null\n\nexport type SysEventMap<\n T extends EventMap,\n C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput,\n> = {\n /** Connect event, triggered when the socket successfully connects to the server. */\n 'sys:connect': (args: {\n socket: Socket\n client: SocketClient<T, C>\n }) => Promise<void> | void\n /** Disconnect event, triggered when the socket disconnects from the server. */\n 'sys:disconnect': (args: {\n socket: Socket\n client: SocketClient<T, C>\n reason: string\n }) => Promise<void> | void\n /** Reconnect attempt event, triggered when the socket attempts to reconnect after a disconnection. */\n 'sys:reconnect': (args: {\n socket: Socket\n attempt: number\n client: SocketClient<T, C>\n }) => Promise<void> | void\n /** Connect error event, triggered when the socket encounters an error while trying to connect to the server. */\n 'sys:connect_error': (args: {\n socket: Socket\n client: SocketClient<T, C>\n error: string\n }) => Promise<void> | void\n /** Ping event, triggered by the server to check if the client is still responsive. The client can respond with a pong event, optionally including a payload defined by the server. */\n 'sys:ping': (args: {\n socket: Socket\n client: SocketClient<T, C>\n }) =>\n | Promise<SocketSchemaOutput<C['pingPayload']>>\n | SocketSchemaOutput<C['pingPayload']>\n /** Pong event, triggered in response to a ping event, allowing the client to send a payload back to the server. */\n 'sys:pong': (args: {\n socket: Socket\n client: SocketClient<T, C>\n payload: SocketSchemaOutput<C['pongPayload']>\n }) => Promise<void> | void\n /** Room join event, triggered when the client attempts to join one or more rooms. Return true to allow the join, or false to deny it. */\n 'sys:room_join': (args: {\n socket: Socket\n client: SocketClient<T, C>\n rooms: string | string[]\n meta: SocketSchemaOutput<C['joinMetaMessage']>\n }) => Promise<boolean> | boolean\n /** Room leave event, triggered when the client attempts to leave one or more rooms. Return true to allow the leave, or false to deny it. */\n 'sys:room_leave': (args: {\n socket: Socket\n client: SocketClient<T, C>\n rooms: string | string[]\n meta: SocketSchemaOutput<C['leaveMetaMessage']>\n }) => Promise<boolean> | boolean\n}\n\nconst roomValueSchema = z.union([z.array(z.string()), z.string()])\n\nexport type RoomPayloadSchema<Meta extends z.ZodTypeAny> = z.ZodObject<{\n rooms: typeof roomValueSchema\n meta: Meta\n}>\n\nexport const buildRoomPayloadSchema = <Meta extends z.ZodTypeAny>(\n metaSchema: Meta,\n): RoomPayloadSchema<Meta> =>\n z.object({\n rooms: roomValueSchema,\n meta: metaSchema,\n })\n","// socket.client.core.ts\n\nimport type {\n EventMap,\n Payload,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport type { ManagerOptions } from 'socket.io-client'\nimport { z } from 'zod'\nimport {\n SocketClientConfigSnapshot,\n SocketClientDebugEvent,\n} from './socket.client.debug'\nimport type {\n MaybeSocket,\n RoomPayloadSchema,\n SysEventMap,\n} from './socket.client.sys'\nimport { buildRoomPayloadSchema } from './socket.client.sys'\n\nexport type ServerEnvelope<Payload> = {\n eventName: string\n sentAt: string | Date\n sentTo: string[]\n data?: Payload\n metadata?: Record<string, unknown>\n rooms: string[]\n}\n\nexport type ClientCtx = {\n receivedAt: Date\n latencyMs?: number\n nsp?: string\n socketId?: string\n socket?: MaybeSocket\n reply?: (data?: unknown) => void\n}\n\nexport type ClientStatsSnapshot = {\n roomsCount: number\n totalHandlers: number\n rooms: { room: string; count: number }[]\n handlers: { event: string; handlers: number }[]\n}\n\n// helper, since original code used NoInfer\ntype NoInfer<T> = [T][T extends any ? 0 : never]\n\ntype RoomPayload<Meta extends z.ZodTypeAny> = z.output<RoomPayloadSchema<Meta>>\n\ntype SocketManagerIntrospect = {\n uri?: string\n opts?: Partial<ManagerOptions>\n engine?: {\n transport?: {\n name?: string\n }\n }\n _readyState?: string\n}\n\nexport type SocketClientDebugOptions<K extends string = string> = {\n verbose?: boolean\n only?: K[]\n logger?: (e: SocketClientDebugEvent<K>) => void\n} & {\n [P in SocketClientDebugEvent['type']]?: boolean\n}\n\n/** === Heartbeat config (now only timing + optional onPong) === */\nexport type HeartbeatClientOptions = {\n /** Interval between pings. Default 15_000. */\n intervalMs?: number\n /** Give up waiting for pong after this many ms. Default 7_500. */\n timeoutMs?: number\n}\n\nexport type SocketClientOptions<\n T extends EventMap = EventMap,\n C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput,\n> = {\n /** Inject an existing socket.io-client Socket. Can be null while bootstrapping. */\n socket: MaybeSocket\n /** The configuration of the ping/pong payload schemas and room join/leave meta message schemas. */\n config: C\n /** Optional debug configuration. */\n environment?: 'development' | 'production'\n /** Optional debug configuration.\n * emit: when emitting an event\n * receive: when receiving an event\n * connection: on connect/reconnect/disconnect/connect_error\n * lifecycle: on client init and destroy\n * heartbeat: on ping emit, pong receive, and validation failures\n * config: when logging the socket config snapshot (only if debug.logger is set)\n * room: on room join and leave attempts\n * register: when registering and unregistering event handlers\n */\n debug?: SocketClientDebugOptions\n /** Optional heartbeat configuration. If provided, the client will start the heartbeat loop on the default 'sys:connect' handler. */\n heartbeat?: HeartbeatClientOptions\n sys: SysEventMap<T, C>\n}\n\ntype HandlerEntry<T extends EventMap, K extends keyof T & string> = {\n orig: (\n payload: Payload<T, K>,\n meta: { envelope: ServerEnvelope<T[K]['__out']>; ctx: ClientCtx },\n ) => void\n wrapped: (\n envelopeOrRaw: ServerEnvelope<T[K]['__out']> | Payload<T, K>,\n ) => void\n errorWrapped: (e: unknown) => void\n}\n\nexport class SocketClient<\n T extends EventMap,\n C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput,\n> {\n readonly socket: MaybeSocket\n private readonly events: T\n private readonly environment: 'development' | 'production'\n private readonly debug: SocketClientDebugOptions<keyof T & string>\n\n private readonly config: C\n private readonly sysEvents: SysEventMap<T, C>\n private readonly roomJoinSchema: RoomPayloadSchema<C['joinMetaMessage']>\n private readonly roomLeaveSchema: RoomPayloadSchema<C['leaveMetaMessage']>\n\n // heartbeat\n private readonly hb: HeartbeatClientOptions\n private hbTimer: ReturnType<typeof setInterval> | null = null\n\n /** keep references so we can .off() later */\n private readonly onConnect: () => void\n private readonly onReconnect: (attempt: number) => void\n private readonly onDisconnect: (reason: unknown) => void\n private readonly onConnectError: (err: unknown) => void\n private readonly onPong: (raw: any) => void\n\n // stats\n private readonly roomCounts = new Map<string, number>()\n private readonly handlerMap = new Map<string, Set<HandlerEntry<T, any>>>()\n\n private snapshotSocketConfig(\n socket: MaybeSocket,\n ): SocketClientConfigSnapshot | null {\n if (!socket) return null\n const manager = (socket.io ??\n null) as unknown as SocketManagerIntrospect | null\n const base: SocketClientConfigSnapshot = {\n nsp: this.getNamespace(socket),\n }\n if (!manager) return base\n\n const opts = (manager.opts ?? {}) as Partial<ManagerOptions>\n const transports = Array.isArray(opts.transports)\n ? opts.transports.filter((t): t is string => typeof t === 'string')\n : undefined\n const transportName =\n typeof manager.engine?.transport?.name === 'string'\n ? manager.engine.transport?.name\n : undefined\n const readyState =\n typeof manager._readyState === 'string' ? manager._readyState : undefined\n const uri = typeof manager.uri === 'string' ? manager.uri : undefined\n\n return {\n ...base,\n url: uri,\n path: typeof opts.path === 'string' ? opts.path : undefined,\n transport: transportName ?? transports?.[0],\n transports,\n readyState,\n autoConnect:\n typeof opts.autoConnect === 'boolean' ? opts.autoConnect : undefined,\n reconnection:\n typeof opts.reconnection === 'boolean' ? opts.reconnection : undefined,\n reconnectionAttempts:\n typeof opts.reconnectionAttempts === 'number'\n ? opts.reconnectionAttempts\n : undefined,\n reconnectionDelay:\n typeof opts.reconnectionDelay === 'number'\n ? opts.reconnectionDelay\n : undefined,\n reconnectionDelayMax:\n typeof opts.reconnectionDelayMax === 'number'\n ? opts.reconnectionDelayMax\n : undefined,\n timeout: typeof opts.timeout === 'number' ? opts.timeout : undefined,\n hostname: typeof opts.hostname === 'string' ? opts.hostname : undefined,\n port:\n typeof opts.port === 'number' || typeof opts.port === 'string'\n ? opts.port\n : undefined,\n secure: typeof opts.secure === 'boolean' ? opts.secure : undefined,\n }\n }\n\n private logSocketConfigSnapshot(reason: string): void {\n if (!this.debug.logger || !this.debug.config) return\n const snapshot = this.snapshotSocketConfig(this.socket)\n this.dbg({\n type: 'config',\n phase: reason,\n ...(snapshot == null\n ? { err: 'Socket is missing. ' }\n : {\n socketId: this.socket?.id,\n snapshot: snapshot,\n }),\n })\n }\n\n private getValidationDetails(\n error: z.ZodError<any>,\n ): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined\n return { issues: error.issues }\n }\n\n private getVerboseDetails(\n details: Record<string, unknown>,\n ): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined\n return details\n }\n\n private formatError(error: unknown): string {\n if (error instanceof Error) return error.message\n if (typeof error === 'string') return error\n try {\n return JSON.stringify(error)\n } catch {\n return String(error)\n }\n }\n\n private getNamespace(socket: MaybeSocket): string | undefined {\n if (!socket) return undefined\n const nsp = (socket as any).nsp\n return typeof nsp === 'string' ? nsp : undefined\n }\n\n constructor(events: T, opts: SocketClientOptions<T, C>) {\n this.events = events\n this.socket = opts.socket ?? null\n\n this.environment = opts.environment ?? 'development'\n this.debug = opts.debug ?? {}\n this.config = opts.config\n this.sysEvents = opts.sys\n this.roomJoinSchema = buildRoomPayloadSchema(this.config.joinMetaMessage)\n this.roomLeaveSchema = buildRoomPayloadSchema(this.config.leaveMetaMessage)\n\n const hb = opts.heartbeat ?? {}\n this.hb = {\n intervalMs: hb.intervalMs ?? 15_000,\n timeoutMs: hb.timeoutMs ?? 7_500,\n }\n\n if (!this.socket) {\n this.dbg({\n type: 'lifecycle',\n phase: 'init',\n err: 'Socket reference is null during initialization',\n })\n } else {\n this.dbg({\n type: 'lifecycle',\n phase: 'init',\n heartbeatIntervalMs: this.hb.intervalMs,\n heartbeatTimeoutMs: this.hb.timeoutMs,\n environment: this.environment,\n })\n this.logSocketConfigSnapshot('constructor')\n }\n\n /* socket lifecycle → connection bucket, now sys map aware */\n this.onConnect = () => {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n id: socket.id,\n details: {\n nsp: this.getNamespace(socket),\n },\n })\n this.logSocketConfigSnapshot('connect_event')\n void Promise.resolve(\n this.getSysEvent('sys:connect')({\n socket,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n id: socket.id,\n err: `sys:connect handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n nsp: this.getNamespace(socket),\n rawError: error,\n }),\n })\n })\n }\n\n this.onReconnect = (attempt) => {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n attempt,\n id: socket.id,\n details: {\n nsp: this.getNamespace(socket),\n },\n })\n this.logSocketConfigSnapshot('reconnect_event')\n void Promise.resolve(\n this.getSysEvent('sys:reconnect')({\n attempt,\n socket,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n attempt,\n id: socket.id,\n err: `sys:reconnect handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n nsp: this.getNamespace(socket),\n rawError: error,\n }),\n })\n })\n }\n\n this.onDisconnect = (reason) => {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'disconnect_event',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n this.dbg({\n type: 'connection',\n phase: 'disconnect_event',\n reason: String(reason),\n details: {\n roomsTracked: this.roomCounts.size,\n },\n })\n this.logSocketConfigSnapshot('disconnect_event')\n void Promise.resolve(\n this.getSysEvent('sys:disconnect')({\n reason: String(reason),\n socket,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'connection',\n phase: 'disconnect_event',\n reason: String(reason),\n id: socket.id,\n err: `sys:disconnect handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n roomsTracked: this.roomCounts.size,\n rawError: error,\n }),\n })\n })\n }\n\n this.onConnectError = (err) => {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'connect_error_event',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n this.dbg({\n type: 'connection',\n phase: 'connect_error_event',\n err: String(err),\n details: this.getVerboseDetails({ rawError: err }),\n })\n this.logSocketConfigSnapshot('connect_error_event')\n void Promise.resolve(\n this.getSysEvent('sys:connect_error')({\n error: String(err),\n socket,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'connection',\n phase: 'connect_error_event',\n id: socket.id,\n err: `sys:connect_error handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n })\n }\n\n this.onPong = (raw: unknown) => {\n if (!this.socket) {\n this.dbg({\n type: 'heartbeat',\n phase: 'pong_recv',\n err: 'Socket is null',\n })\n return\n }\n const socket = this.socket\n const parsed = this.config.pongPayload.safeParse(raw)\n if (!parsed.success) {\n this.dbg({\n type: 'heartbeat',\n phase: 'validation_failed',\n err: `pong payload validation failed: ${parsed.error.message}`,\n details: this.getValidationDetails(parsed.error),\n })\n return\n }\n const validated = parsed.data\n this.dbg({\n type: 'heartbeat',\n phase: 'pong_recv',\n payload: validated,\n })\n\n void Promise.resolve(\n this.getSysEvent('sys:pong')({\n socket,\n payload: validated as SocketSchemaOutput<\n (typeof this.config)['pongPayload']\n >,\n client: this,\n }),\n ).catch((error) => {\n this.dbg({\n type: 'heartbeat',\n phase: 'pong_recv',\n err: `sys:pong handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n })\n }\n\n // register top-level listeners with stored refs (only if we have a socket)\n if (this.socket) {\n this.socket.on('connect', this.onConnect)\n this.socket.on('reconnect', this.onReconnect)\n this.socket.on('disconnect', this.onDisconnect)\n this.socket.on('connect_error', this.onConnectError)\n this.socket.on('sys:pong', this.onPong)\n }\n }\n\n private getSysEvent<K extends keyof SysEventMap<T, C>>(\n name: K,\n ): SysEventMap<T, C>[K] {\n return this.sysEvents[name]\n }\n\n private dbg(e: SocketClientDebugEvent<any>) {\n const d = this.debug\n if (!d.logger) return\n if (!d[e.type]) return\n if (d.only && 'event' in e && !d.only.includes(e.event as any)) return\n try {\n d.logger(e)\n } catch (error) {\n if (\n this.environment === 'development' &&\n typeof console !== 'undefined' &&\n typeof console.warn === 'function'\n ) {\n // eslint-disable-next-line no-console\n console.warn('[socket] debug logger threw', error)\n }\n }\n }\n\n /** internal stats snapshot */\n stats(): ClientStatsSnapshot {\n const rooms = Array.from(this.roomCounts.entries()).map(\n ([room, count]) => ({ room, count }),\n )\n const handlers = Array.from(this.handlerMap.entries()).map(\n ([event, set]) => ({\n event,\n handlers: set.size,\n }),\n )\n return {\n roomsCount: rooms.length,\n totalHandlers: handlers.reduce((a, b) => a + b.handlers, 0),\n rooms,\n handlers,\n }\n }\n\n private toArray(rooms?: string[] | string): string[] {\n return rooms == null ? [] : Array.isArray(rooms) ? rooms : [rooms]\n }\n\n private rollbackJoinIncrement(rooms: string[]) {\n for (const room of rooms) {\n const curr = this.roomCounts.get(room) ?? 0\n const next = Math.max(0, curr - 1)\n if (next === 0) this.roomCounts.delete(room)\n else this.roomCounts.set(room, next)\n }\n }\n\n private rollbackLeaveDecrement(rooms: string[]) {\n for (const room of rooms) {\n const curr = this.roomCounts.get(room) ?? 0\n this.roomCounts.set(room, curr + 1)\n }\n }\n\n /**\n * Public: start the heartbeat loop manually.\n *\n * This is called by the default 'sys:connect' handler, but you can also\n * call it yourself from any sysHandler to change when heartbeats start.\n */\n startHeartbeat() {\n this.stopHeartbeat('stop_before_start')\n if (!this.socket) {\n this.dbg({\n type: 'heartbeat',\n phase: 'start',\n err: 'Socket is null',\n })\n return\n }\n\n const socket = this.socket\n\n this.dbg({\n type: 'heartbeat',\n phase: 'start',\n details: {\n intervalMs: this.hb.intervalMs,\n timeoutMs: this.hb.timeoutMs,\n },\n })\n\n const tick = async () => {\n if (!socket) {\n this.dbg({\n type: 'heartbeat',\n phase: 'tick_skip',\n err: 'Socket missing during heartbeat tick',\n })\n return\n }\n\n const payload = await this.getSysEvent('sys:ping')({\n socket,\n client: this,\n })\n\n const check = this.config.pingPayload.safeParse(payload)\n if (!check.success) {\n this.dbg({\n type: 'heartbeat',\n phase: 'validation_failed',\n err: 'ping payload validation failed',\n details: this.getValidationDetails(check.error),\n })\n if (this.environment === 'development') {\n // eslint-disable-next-line no-console\n console.warn(\n '[socket] ping schema validation failed',\n check.error.issues,\n )\n }\n return\n }\n const dataToSend = check.data\n socket.emit('sys:ping', dataToSend)\n this.dbg({\n type: 'heartbeat',\n phase: 'ping_emit',\n payload: dataToSend,\n })\n }\n\n const runTick = () => {\n void tick().catch((error) => {\n this.dbg({\n type: 'heartbeat',\n phase: 'ping_emit',\n err: `sys:ping handler failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n })\n }\n\n this.hbTimer = setInterval(runTick, this.hb.intervalMs)\n runTick()\n }\n\n /**\n * Public: stop the heartbeat loop.\n *\n * This is called by the default 'sys:disconnect' handler, but you can also\n * call it yourself from any sysHandler to fully control heartbeat lifecycle.\n */\n stopHeartbeat(reason?: string) {\n const hadTimer = Boolean(this.hbTimer)\n if (this.hbTimer) {\n clearInterval(this.hbTimer)\n this.hbTimer = null\n }\n this.dbg({\n type: 'heartbeat',\n phase: 'stop',\n reason,\n hadTimer,\n })\n }\n\n emit<K extends keyof T & string>(\n event: K,\n payload: Payload<T, K>,\n metadata?: Record<string, unknown>,\n ): void {\n if (!this.socket) {\n this.dbg({ type: 'emit', event, err: 'Socket is null' })\n return\n }\n const schema = this.events[event].message\n const parsed = schema.safeParse(payload)\n if (!parsed.success) {\n this.dbg({\n type: 'emit',\n event,\n err: 'payload_validation_failed',\n details: this.getValidationDetails(parsed.error),\n })\n throw new Error(`Invalid payload for \"${event}\": ${parsed.error.message}`)\n }\n\n this.socket.emit(String(event), parsed.data)\n this.dbg({\n type: 'emit',\n event,\n metadata,\n })\n }\n\n async joinRooms(\n rooms: string[] | string,\n meta: SocketSchemaOutput<C['joinMetaMessage']>,\n ): Promise<() => Promise<void>> {\n if (!this.socket) {\n this.dbg({\n type: 'room',\n phase: 'join',\n rooms: this.toArray(rooms),\n err: 'Socket is null',\n })\n throw new Error('Socket is null in joinRooms method')\n }\n if (\n !(await this.getSysEvent('sys:room_join')({\n rooms,\n meta,\n socket: this.socket,\n client: this,\n }))\n ) {\n this.dbg({\n type: 'room',\n phase: 'join',\n rooms: this.toArray(rooms),\n err: 'sys:room_join handler aborted join',\n })\n return async () => {}\n }\n const list = this.toArray(rooms)\n const toJoin: string[] = []\n for (const r of list) {\n const next = (this.roomCounts.get(r) ?? 0) + 1\n this.roomCounts.set(r, next)\n if (next === 1) toJoin.push(r)\n }\n if (toJoin.length > 0 && this.socket) {\n const payloadResult = this.roomJoinSchema.safeParse({\n rooms: toJoin,\n meta,\n })\n\n if (!payloadResult.success) {\n this.rollbackJoinIncrement(toJoin)\n this.dbg({\n type: 'room',\n phase: 'join',\n rooms: toJoin,\n err: 'payload validation failed',\n details: this.getValidationDetails(payloadResult.error),\n })\n return async () => {}\n }\n const payload = payloadResult.data as RoomPayload<C['joinMetaMessage']>\n const normalizedRooms = this.toArray(payload.rooms)\n this.socket.emit('sys:room_join', payload)\n this.dbg({ type: 'room', phase: 'join', rooms: normalizedRooms })\n }\n return async () => {\n await this.leaveRooms(rooms, meta)\n }\n }\n\n async leaveRooms(\n rooms: string[] | string,\n meta: SocketSchemaOutput<C['leaveMetaMessage']>,\n ): Promise<void> {\n if (!this.socket) {\n this.dbg({\n type: 'room',\n phase: 'leave',\n rooms: this.toArray(rooms),\n err: 'Socket is null',\n })\n throw new Error('Socket is null in leaveRooms method')\n }\n if (\n !(await this.getSysEvent('sys:room_leave')({\n rooms,\n meta,\n socket: this.socket,\n client: this,\n }))\n ) {\n this.dbg({\n type: 'room',\n phase: 'leave',\n rooms: this.toArray(rooms),\n err: 'sys:room_leave handler aborted leave',\n })\n return\n }\n const list = this.toArray(rooms)\n const toLeave: string[] = []\n for (const r of list) {\n const curr = this.roomCounts.get(r) ?? 0\n const next = Math.max(0, curr - 1)\n if (next === 0 && curr > 0) toLeave.push(r)\n if (next === 0) this.roomCounts.delete(r)\n else this.roomCounts.set(r, next)\n }\n if (toLeave.length > 0 && this.socket) {\n const payloadResult = this.roomLeaveSchema.safeParse({\n rooms: toLeave,\n meta: meta,\n })\n\n if (!payloadResult.success) {\n this.rollbackLeaveDecrement(toLeave)\n this.dbg({\n type: 'room',\n phase: 'leave',\n rooms: toLeave,\n err: 'payload validation failed',\n details: this.getValidationDetails(payloadResult.error),\n })\n return\n }\n\n const payload = payloadResult.data as RoomPayload<C['leaveMetaMessage']>\n const normalizedRooms = this.toArray(payload.rooms)\n this.socket.emit('sys:room_leave', payload)\n this.dbg({ type: 'room', phase: 'leave', rooms: normalizedRooms })\n }\n }\n\n on<K extends keyof T & string>(\n event: K,\n handler: (\n payload: T[K]['__out'],\n meta?: { envelope: ServerEnvelope<T[K]['__out']>; ctx: ClientCtx },\n ) => void,\n ): () => void {\n const schema = this.events[event].message\n\n this.dbg({ type: 'register', phase: 'register', event })\n\n if (!this.socket) {\n this.dbg({\n type: 'register',\n phase: 'register',\n event,\n err: 'Socket is null',\n })\n return () => {}\n }\n\n const socket = this.socket\n const toStringList = (value: unknown): string[] =>\n Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string')\n : []\n\n const wrappedEnv = (envelope: ServerEnvelope<T[K]['__out']>) => {\n const rawData = envelope.data\n\n const parsed = schema.safeParse(rawData)\n if (!parsed.success) {\n this.dbg({\n type: 'receive',\n event,\n err: 'payload_validation_failed',\n details: this.getValidationDetails(parsed.error),\n })\n return\n }\n const data = parsed.data as Payload<T, K>\n\n const receivedAt = new Date()\n const sentAt = envelope?.sentAt ? new Date(envelope.sentAt) : undefined\n\n const meta = {\n envelope: {\n eventName: (typeof envelope?.eventName === 'string'\n ? envelope.eventName\n : event) as K,\n sentAt: envelope?.sentAt ?? receivedAt.toISOString(),\n sentTo: toStringList(envelope?.sentTo),\n data,\n metadata: envelope?.metadata,\n rooms: toStringList(envelope?.rooms),\n },\n ctx: {\n receivedAt,\n latencyMs: sentAt\n ? Math.max(0, receivedAt.getTime() - sentAt.getTime())\n : undefined,\n nsp: this.getNamespace(socket),\n socketId: socket.id,\n socket,\n },\n } satisfies {\n envelope: ServerEnvelope<T[K]['__out']>\n ctx: ClientCtx\n }\n\n this.dbg({\n type: 'receive',\n event,\n envelope: this.debug.verbose\n ? {\n eventName: meta.envelope.eventName,\n sentAt: meta.envelope.sentAt,\n sentTo: meta.envelope.sentTo,\n metadata: meta.envelope.metadata,\n }\n : undefined,\n })\n\n try {\n handler(data, meta)\n } catch (error) {\n this.dbg({\n type: 'receive',\n event,\n err: `handler_failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n }\n }\n\n const wrappedDispatcher = (\n envelopeOrRaw: ServerEnvelope<T[K]['__out']> | Payload<T, K>,\n ) => {\n if (\n typeof envelopeOrRaw === 'object' &&\n envelopeOrRaw !== null &&\n 'eventName' in envelopeOrRaw &&\n 'sentAt' in envelopeOrRaw &&\n 'sentTo' in envelopeOrRaw &&\n 'data' in envelopeOrRaw\n ) {\n wrappedEnv(envelopeOrRaw as ServerEnvelope<T[K]['__out']>)\n } else {\n this.dbg({\n type: 'receive',\n event,\n envelope: undefined,\n })\n try {\n handler(envelopeOrRaw as Payload<T, K>, undefined)\n } catch (error) {\n this.dbg({\n type: 'receive',\n event,\n err: `handler_failed: ${this.formatError(error)}`,\n details: this.getVerboseDetails({\n rawError: error,\n }),\n })\n }\n }\n }\n\n const errorWrapped = (e: unknown) => {\n this.dbg({ type: 'receive', event, err: String(e) })\n }\n\n socket.on(String(event), wrappedDispatcher)\n socket.on(`${String(event)}:error`, errorWrapped)\n\n let set = this.handlerMap.get(String(event))\n if (!set) {\n set = new Set()\n this.handlerMap.set(String(event), set)\n }\n const entry: HandlerEntry<T, K> = {\n orig: handler,\n wrapped: wrappedDispatcher,\n errorWrapped,\n }\n set.add(entry)\n\n return () => {\n socket.off(String(event), wrappedDispatcher)\n socket.off(`${String(event)}:error`, errorWrapped)\n const s = this.handlerMap.get(String(event))\n if (s) {\n s.delete(entry)\n if (s.size === 0) this.handlerMap.delete(String(event))\n }\n this.dbg({ type: 'register', phase: 'unregister', event })\n }\n }\n\n /**\n * Remove all listeners, stop timers, and leave rooms.\n * Call when disposing the client instance.\n */\n async destroy(\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>,\n ): Promise<void> {\n const socket = this.socket\n this.dbg({\n type: 'lifecycle',\n phase: 'destroy_begin',\n socketId: socket?.id,\n details: {\n roomsTracked: this.roomCounts.size,\n handlerEvents: this.handlerMap.size,\n },\n })\n // stop heartbeat timer\n this.stopHeartbeat('destroy')\n\n // remove top-level socket listeners\n if (socket) {\n socket.off('connect', this.onConnect)\n socket.off('reconnect', this.onReconnect)\n socket.off('disconnect', this.onDisconnect)\n socket.off('connect_error', this.onConnectError)\n socket.off('sys:pong', this.onPong)\n\n // unsubscribe all per-event handlers\n for (const [event, set] of this.handlerMap.entries()) {\n for (const entry of set) {\n socket.off(String(event), entry.wrapped)\n socket.off(`${String(event)}:error`, entry.errorWrapped)\n }\n }\n }\n this.handlerMap.clear()\n\n // leave any rooms we joined via ref-count\n const toLeave = Array.from(this.roomCounts.entries())\n .filter(([, count]) => count > 0)\n .map(([room]) => room)\n if (toLeave.length > 0 && socket) {\n await this.leaveRooms(toLeave, leaveMeta)\n }\n this.roomCounts.clear()\n this.dbg({\n type: 'lifecycle',\n phase: 'destroy_complete',\n socketId: socket?.id,\n details: {\n roomsTracked: this.roomCounts.size,\n handlerEvents: this.handlerMap.size,\n },\n })\n }\n\n /** Pass-throughs. Managing connection is the caller’s responsibility. */\n disconnect(): void {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'disconnect',\n reason: 'client_disconnect',\n err: 'Socket is null',\n })\n return\n }\n this.stopHeartbeat('disconnect')\n this.socket.disconnect()\n this.dbg({\n type: 'connection',\n phase: 'disconnect',\n reason: 'client_disconnect',\n details: {\n nsp: this.getNamespace(this.socket),\n },\n })\n this.logSocketConfigSnapshot('disconnect_call')\n }\n\n connect(): void {\n if (!this.socket) {\n this.dbg({\n type: 'connection',\n phase: 'connect',\n err: 'Socket is null',\n })\n return\n }\n this.socket.connect()\n this.dbg({\n type: 'connection',\n phase: 'connect',\n id: this.socket.id ?? '',\n details: {\n nsp: this.getNamespace(this.socket),\n },\n })\n this.logSocketConfigSnapshot('connect_call')\n }\n}\n","import type {\n AnyLeafLowProfile,\n EventMap,\n InferOutput,\n SocketConnectionConfigOutput,\n SocketEvent,\n} from '@emeryld/rrroutes-contract'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport type {\n ArgsFor,\n ArgsTuple,\n BuiltInfinite,\n BuiltQuery,\n DataShape,\n InfiniteUseEndpointResultFor,\n QueryUseEndpointResultFor,\n UseEndpointArgs,\n} from '../../routesV3.client.types'\nimport type {\n ClientCtx,\n ServerEnvelope,\n SocketClient,\n} from '../socket.client.core'\nimport {\n dbg,\n describeObjectReference,\n isSameObjectReference,\n safeJsonKey,\n shouldWarnSocketMutationGuard,\n trackHookTrigger,\n type HookDebugSnapshot,\n type SocketedRouteDebugOptions,\n} from './socket.client.helper.debug'\nimport {\n mergeRoomState,\n roomStateEqual,\n roomsFromData,\n type RoomState,\n type ToRoomsMapper,\n type ToRoomsMeta,\n} from './socket.client.helper.rooms'\n\nexport type SocketedBuilt<L extends AnyLeafLowProfile> =\n L['cfg']['feed'] extends true ? BuiltInfinite<L> : BuiltQuery<L>\n\nexport type SocketedRouteResult<L extends AnyLeafLowProfile> =\n (L['cfg']['feed'] extends true\n ? InfiniteUseEndpointResultFor<L>\n : QueryUseEndpointResultFor<L>) & { rooms: string[] }\n\nexport type ApplySocket<\n L extends AnyLeafLowProfile,\n S extends SocketEvent,\n AppContext = undefined,\n> = (args: {\n prev: DataShape<L> | undefined\n payload: S['__out']\n args: ArgsFor<L> | undefined\n meta: {\n envelope?: ServerEnvelope<S['__out']>\n ctx?: ClientCtx\n appContext?: AppContext\n }\n}) => DataShape<L> | undefined | null\n\nexport type SocketedRouteOptions<\n L extends AnyLeafLowProfile,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n AppContext = undefined,\n> = {\n /** The built route to compose with socket wiring. This should be a route built with the `buildRoute` function */\n built: SocketedBuilt<L>\n /** A function that derives the rooms to join from the endpoint data. This will be called on initial render and whenever the endpoint data changes. */\n toRooms: ToRoomsMapper<L, C, AppContext>\n /** An object mapping socket event names to functions that apply incoming socket messages to the endpoint data. Each function receives the previous data, the socket message payload, and an optional meta object containing the server envelope, client context, and app context. The function should return the new data (new referrence), or null to indicate no change. */\n applySocket: {\n [K in keyof Events & string]?: ApplySocket<L, Events[K], AppContext>\n }\n /** A hook that returns the SocketClient instance. This is required to access the socket client within the route and apply socket messages. */\n useSocketClient: () => SocketClient<Events, C> | null\n /** Optional context hook that is threaded into `toRooms` and `applySocket` metadata. */\n useContext?: () => AppContext\n /** Debug options for the socketed route. This is optional and can be used to enable debug logging for the route's internal operations, such as room joining and socket message application.\n * client: Logs when the socket client becomes available or unavailable.\n * render: Logs on each render of the route, including whether the client is available and the current rooms.\n * hook: Logs when key hooks are triggered, such as receiving endpoint data or applying socket messages, along with snapshots of relevant state.\n * room: Logs attempts to join or leave rooms, including reasons for skipping or errors.\n */\n debug?: SocketedRouteDebugOptions\n}\n\nfunction isSocketClientUnavailableError(err: unknown): boolean {\n return err instanceof Error && err.message.includes('SocketClient not found')\n}\n\nfunction parseUseEndpointArgs<L extends AnyLeafLowProfile>(\n useArgs: UseEndpointArgs<L>,\n): { endpointArgs: ArgsFor<L> | undefined; endpointArgsTuple: ArgsTuple<L> } {\n const firstArg = (useArgs as unknown[])[0]\n const firstArgRecord =\n firstArg && typeof firstArg === 'object'\n ? (firstArg as Record<string, unknown>)\n : undefined\n const hasRouteArgs = Boolean(\n firstArgRecord &&\n (Object.prototype.hasOwnProperty.call(firstArgRecord, 'params') ||\n Object.prototype.hasOwnProperty.call(firstArgRecord, 'query')),\n )\n const endpointArgs = hasRouteArgs ? (firstArg as ArgsFor<L>) : undefined\n const endpointArgsTuple = (\n typeof endpointArgs === 'undefined' ? [] : [endpointArgs]\n ) as ArgsTuple<L>\n return { endpointArgs, endpointArgsTuple }\n}\n\nfunction useDefaultSocketedRouteContext<AppContext>(): AppContext {\n return undefined as AppContext\n}\n\nfunction createToRoomsMeta<AppContext>(\n appContext: AppContext,\n): ToRoomsMeta<AppContext> {\n return { appContext }\n}\n\n/**\n * Compose a GET endpoint with socket wiring:\n * - joins/leaves rooms derived from the endpoint data\n * - subscribes to a socket event and applies messages to the cache\n */\nexport function buildSocketedRoute<\n L extends AnyLeafLowProfile,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n AppContext = undefined,\n>(options: SocketedRouteOptions<L, Events, C, AppContext>) {\n const {\n built,\n toRooms,\n applySocket,\n useSocketClient,\n useContext: useRouteContext = useDefaultSocketedRouteContext<AppContext>,\n debug,\n } = options\n\n const { useEndpoint: useInnerEndpoint, ...rest } = built\n const useEndpoint = (\n ...useArgs: UseEndpointArgs<L>\n ): SocketedRouteResult<L> => {\n const client: SocketClient<Events, C> | null = useSocketClient()\n let socketClientError: unknown = null\n\n const endpointResult = useInnerEndpoint(\n ...useArgs,\n ) as SocketedRouteResult<L>\n const appContext = useRouteContext()\n const toRoomsMeta = useMemo(\n () => createToRoomsMeta(appContext),\n [appContext],\n )\n const { endpointArgs, endpointArgsTuple } = parseUseEndpointArgs(useArgs)\n const argsKey = useMemo(\n () => safeJsonKey(endpointArgs ?? null),\n [endpointArgs],\n )\n\n const [roomState, setRoomState] = useState<RoomState<C>>(() =>\n roomsFromData(\n endpointResult.data as DataShape<L> | undefined,\n endpointArgs,\n toRooms,\n toRoomsMeta,\n ),\n )\n const renderCountRef = useRef(0)\n const clientReadyRef = useRef<boolean | null>(null)\n const endpointDataRef = useRef<DataShape<L> | undefined>(\n endpointResult.data as DataShape<L> | undefined,\n )\n const toRoomsRef = useRef(toRooms)\n const toRoomsMetaRef = useRef(toRoomsMeta)\n const onReceiveEffectDebugRef = useRef<HookDebugSnapshot | null>(null)\n const deriveRoomsEffectDebugRef = useRef<HookDebugSnapshot | null>(null)\n const joinRoomsEffectDebugRef = useRef<HookDebugSnapshot | null>(null)\n const applySocketEffectDebugRef = useRef<HookDebugSnapshot | null>(null)\n\n renderCountRef.current += 1\n endpointDataRef.current = endpointResult.data as DataShape<L> | undefined\n toRoomsRef.current = toRooms\n toRoomsMetaRef.current = toRoomsMeta\n\n const roomsKey = useMemo(() => roomState.rooms.join('|'), [roomState.rooms])\n const joinMetaKey = useMemo(\n () => safeJsonKey(roomState.joinMeta ?? null),\n [roomState.joinMeta],\n )\n const leaveMetaKey = useMemo(\n () => safeJsonKey(roomState.leaveMeta ?? null),\n [roomState.leaveMeta],\n )\n\n const hasClient = !!client\n if (clientReadyRef.current !== hasClient) {\n clientReadyRef.current = hasClient\n dbg(debug, {\n type: 'client',\n phase: hasClient ? 'ready' : 'missing',\n err: hasClient ? undefined : String(socketClientError),\n })\n }\n\n dbg(debug, {\n type: 'render',\n renderCount: renderCountRef.current,\n hasClient,\n argsKey,\n rooms: roomState.rooms,\n roomsKey,\n joinMetaKey,\n leaveMetaKey,\n })\n\n useEffect(() => {\n trackHookTrigger({\n ref: onReceiveEffectDebugRef,\n phase: 'endpoint_on_receive_effect',\n debug,\n snapshot: {\n onReceiveRef: describeObjectReference(endpointResult.onReceive),\n },\n })\n\n const unsubscribe = endpointResult.onReceive((data: InferOutput<L>) => {\n setRoomState((prev) => {\n const next = mergeRoomState(\n prev,\n toRoomsRef.current({\n data,\n args: endpointArgs,\n meta: toRoomsMetaRef.current,\n }),\n )\n return roomStateEqual(prev, next) ? prev : next\n })\n })\n return unsubscribe\n }, [endpointResult.onReceive, argsKey])\n\n useEffect(() => {\n trackHookTrigger({\n ref: deriveRoomsEffectDebugRef,\n phase: 'derive_rooms_effect',\n debug,\n snapshot: {\n argsKey,\n endpointDataRef: describeObjectReference(endpointDataRef.current),\n toRoomsRef: describeObjectReference(toRooms),\n },\n })\n\n const next = roomsFromData(\n endpointDataRef.current,\n endpointArgs,\n toRooms,\n toRoomsMeta,\n )\n setRoomState((prev) => (roomStateEqual(prev, next) ? prev : next))\n }, [argsKey, toRooms, toRoomsMeta, debug])\n\n useEffect(() => {\n trackHookTrigger({\n ref: joinRoomsEffectDebugRef,\n phase: 'join_rooms_effect',\n debug,\n snapshot: {\n hasClient: !!client,\n clientRef: describeObjectReference(client),\n roomsKey,\n joinMetaKey,\n leaveMetaKey,\n },\n })\n\n if (!client) {\n dbg(debug, {\n type: 'room',\n phase: 'join_skip',\n rooms: roomState.rooms,\n reason: 'socket_client_missing',\n })\n return\n }\n if (roomState.rooms.length === 0) {\n dbg(debug, {\n type: 'room',\n phase: 'join_skip',\n rooms: [],\n reason: 'no_rooms',\n })\n return\n }\n const { joinMeta, leaveMeta } = roomState\n if (!joinMeta || !leaveMeta) {\n dbg(debug, {\n type: 'room',\n phase: 'join_skip',\n rooms: roomState.rooms,\n reason: 'missing_meta',\n })\n return\n }\n let active = true\n dbg(debug, {\n type: 'room',\n phase: 'join_attempt',\n rooms: roomState.rooms,\n })\n ;(async () => {\n try {\n await client.joinRooms(roomState.rooms, joinMeta)\n } catch (err) {\n dbg(debug, {\n type: 'room',\n phase: 'join_error',\n rooms: roomState.rooms,\n err: String(err),\n })\n }\n })()\n return () => {\n if (!active) return\n active = false\n if (roomState.rooms.length === 0) {\n dbg(debug, {\n type: 'room',\n phase: 'leave_skip',\n rooms: [],\n reason: 'no_rooms',\n })\n return\n }\n dbg(debug, {\n type: 'room',\n phase: 'leave_attempt',\n rooms: roomState.rooms,\n })\n void client.leaveRooms(roomState.rooms, leaveMeta).catch((err) => {\n dbg(debug, {\n type: 'room',\n phase: 'leave_error',\n rooms: roomState.rooms,\n err: String(err),\n })\n })\n }\n }, [client, roomsKey, joinMetaKey, leaveMetaKey, debug])\n\n useEffect(() => {\n trackHookTrigger({\n ref: applySocketEffectDebugRef,\n phase: 'apply_socket_effect',\n debug,\n snapshot: {\n hasClient: !!client,\n clientRef: describeObjectReference(client),\n applySocketKeys: Object.keys(applySocket).sort().join(','),\n argsKey,\n toRoomsRef: describeObjectReference(toRooms),\n },\n })\n\n if (!client) return\n\n type QueuedSocketUpdate = {\n event: string\n fn: ApplySocket<L, Events[string], AppContext>\n payload: Events[string]['__out']\n meta?: {\n envelope: ServerEnvelope<Events[string]['__out']>\n ctx: ClientCtx\n }\n }\n\n const queue: QueuedSocketUpdate[] = []\n const sameRefWarnedEvents = new Set<keyof Events & string>()\n let draining = false\n let active = true\n\n const drainQueue = () => {\n if (!active || draining) return\n draining = true\n try {\n while (active && queue.length > 0) {\n const nextUpdate = queue.shift()\n if (!nextUpdate) continue\n built.setData(\n (prev) => {\n const next = nextUpdate.fn({\n prev,\n payload: nextUpdate.payload,\n args: endpointArgs,\n meta: {\n ...(nextUpdate.meta ?? {}),\n appContext: toRoomsMetaRef.current.appContext,\n },\n })\n if (next === null) return prev\n\n if (\n shouldWarnSocketMutationGuard() &&\n isSameObjectReference(prev, next) &&\n !sameRefWarnedEvents.has(nextUpdate.event)\n ) {\n sameRefWarnedEvents.add(nextUpdate.event)\n // eslint-disable-next-line no-console\n console.warn(\n `[socketedRoute] applySocket(\"${nextUpdate.event}\") returned the previous reference. Return a new object/array for updates, or return null for no change.`,\n )\n }\n const nextRoomState = roomsFromData(\n next as DataShape<L> | undefined,\n endpointArgs,\n toRooms,\n toRoomsMetaRef.current,\n )\n setRoomState((prevRoomState) =>\n roomStateEqual(prevRoomState, nextRoomState)\n ? prevRoomState\n : nextRoomState,\n )\n return next\n },\n ...endpointArgsTuple,\n )\n }\n } finally {\n draining = false\n if (active && queue.length > 0) drainQueue()\n }\n }\n\n const entries = Object.entries(applySocket).filter(\n ([_event, fn]) => typeof fn === 'function',\n ) as [string, ApplySocket<L, Events[string], AppContext>][]\n\n const unsubscribes = entries.map(([ev, fn]) =>\n client.on(ev, (payload, meta) => {\n queue.push({\n event: ev,\n fn,\n payload,\n ...(meta ? { meta } : {}),\n })\n drainQueue()\n }),\n )\n\n return () => {\n active = false\n queue.length = 0\n unsubscribes.forEach((u) => u?.())\n }\n }, [client, applySocket, built, argsKey, toRooms, debug])\n\n return { ...endpointResult, rooms: roomState.rooms }\n }\n\n return {\n ...rest,\n useEndpoint,\n }\n}\n","export type HookDebugReason = 'init' | 'change'\nexport type HookDebugValue = string | number | boolean | null | undefined\n\nexport type SocketedRouteDebugEvent =\n | {\n type: 'client'\n phase: 'ready' | 'missing'\n err?: string\n }\n | {\n type: 'render'\n renderCount: number\n hasClient: boolean\n argsKey: string\n rooms: string[]\n roomsKey: string\n joinMetaKey: string\n leaveMetaKey: string\n }\n | {\n type: 'hook'\n phase:\n | 'endpoint_on_receive_effect'\n | 'derive_rooms_effect'\n | 'join_rooms_effect'\n | 'apply_socket_effect'\n reason: HookDebugReason\n changes: Array<{\n dependency: string\n previous: HookDebugValue\n next: HookDebugValue\n }>\n }\n | {\n type: 'room'\n phase:\n | 'join_attempt'\n | 'join_skip'\n | 'join_error'\n | 'leave_attempt'\n | 'leave_skip'\n | 'leave_error'\n rooms: string[]\n reason?: string\n err?: string\n }\n\nexport type SocketedRouteDebugOptions = {\n logger?: (event: SocketedRouteDebugEvent) => void\n} & {\n [P in SocketedRouteDebugEvent['type']]?: boolean\n}\n\nexport type HookDebugSnapshot = Record<string, unknown>\ntype HookIdentifier = Extract<\n SocketedRouteDebugEvent,\n { type: 'hook' }\n>['phase']\n\nconst objectReferenceIds = new WeakMap<object, number>()\nlet objectReferenceCounter = 0\n\nexport function describeObjectReference(value: unknown): string | null {\n if (value == null) return null\n const valueType = typeof value\n if (valueType !== 'object' && valueType !== 'function') return null\n\n const obj = value as object\n let id = objectReferenceIds.get(obj)\n if (!id) {\n id = ++objectReferenceCounter\n objectReferenceIds.set(obj, id)\n }\n return `ref#${id}`\n}\n\nexport function safeJsonKey(value: unknown): string {\n try {\n const serialized = JSON.stringify(value ?? null)\n return serialized ?? 'null'\n } catch {\n return '[unserializable]'\n }\n}\n\nexport function isSameObjectReference(prev: unknown, next: unknown): boolean {\n if (prev !== next) return false\n if (next == null) return false\n const valueType = typeof next\n return valueType === 'object' || valueType === 'function'\n}\n\nexport function shouldWarnSocketMutationGuard(): boolean {\n const nodeEnv = (\n globalThis as { process?: { env?: { NODE_ENV?: string } } }\n ).process?.env?.NODE_ENV\n return nodeEnv !== 'production'\n}\n\nfunction safeDescribeHookValue(value: unknown): HookDebugValue {\n if (value == null) return value as null | undefined\n\n const valueType = typeof value\n if (\n valueType === 'string' ||\n valueType === 'number' ||\n valueType === 'boolean'\n ) {\n return value as HookDebugValue\n }\n if (valueType === 'bigint' || valueType === 'symbol') return String(value)\n if (valueType === 'function')\n return `[function ${(value as Function).name || 'anonymous'}]`\n if (Array.isArray(value)) return `[array length=${value.length}]`\n\n const ctorName =\n (value as { constructor?: { name?: string } }).constructor?.name ?? 'object'\n const keys = Object.keys(value as Record<string, unknown>)\n const keyPreview = keys.slice(0, 4).join(',')\n const suffix = keys.length > 4 ? ',…' : ''\n const ref = describeObjectReference(value)\n return `[${ctorName}${ref ? ` ${ref}` : ''} keys=${keyPreview}${suffix}]`\n}\n\nfunction createHookDebugEvent(\n prev: HookDebugSnapshot | null,\n next: HookDebugSnapshot,\n phase: HookIdentifier,\n): Extract<SocketedRouteDebugEvent, { type: 'hook' }> | null {\n const reason: HookDebugReason = prev ? 'change' : 'init'\n const changed = Object.keys(next).reduce<\n Array<{\n dependency: string\n previous: HookDebugValue\n next: HookDebugValue\n }>\n >((acc, dependency) => {\n const prevValue = prev ? prev[dependency] : undefined\n const nextValue = next[dependency]\n if (!prev || !Object.is(prevValue, nextValue)) {\n acc.push({\n dependency,\n previous: safeDescribeHookValue(prevValue),\n next: safeDescribeHookValue(nextValue),\n })\n }\n return acc\n }, [])\n\n if (!changed.length) return null\n return { type: 'hook', phase, reason, changes: changed }\n}\n\nexport function dbg(\n debug: SocketedRouteDebugOptions | undefined,\n event: SocketedRouteDebugEvent,\n) {\n if (!debug?.logger) return\n if (!debug[event.type]) return\n debug.logger(event)\n}\n\nexport function trackHookTrigger({\n ref,\n phase,\n debug,\n snapshot,\n}: {\n ref: { current: HookDebugSnapshot | null }\n phase: HookIdentifier\n debug?: SocketedRouteDebugOptions\n snapshot: HookDebugSnapshot\n}) {\n const prev = ref.current\n ref.current = snapshot\n if (!debug?.logger || !debug?.hook) return\n const event = createHookDebugEvent(prev, snapshot, phase)\n if (event) dbg(debug, event)\n}\n","import type {\n AnyLeafLowProfile,\n InferOutput,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract'\nimport type { ArgsFor, DataShape } from '../../routesV3.client.types'\nimport { safeJsonKey } from './socket.client.helper.debug'\n\nexport type RoomsInput = string | string[] | undefined | null\n\nexport type RoomState<C extends SocketConnectionConfigOutput> = {\n rooms: string[]\n joinMeta?: SocketSchemaOutput<C['joinMetaMessage']>\n leaveMeta?: SocketSchemaOutput<C['leaveMetaMessage']>\n}\n\nexport type ToRoomsResult<C extends SocketConnectionConfigOutput> = {\n rooms: RoomsInput\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>\n}\n\nexport type ToRoomsMeta<AppContext = undefined> = {\n appContext?: AppContext\n}\n\nexport type ToRoomsMapper<\n L extends AnyLeafLowProfile,\n C extends SocketConnectionConfigOutput,\n AppContext = undefined,\n> = (args: {\n data: InferOutput<L>\n args: ArgsFor<L> | undefined\n meta?: ToRoomsMeta<AppContext>\n}) => ToRoomsResult<C>\n\nfunction normalizeRooms(rooms: RoomsInput): string[] {\n if (rooms == null) return []\n const list = Array.isArray(rooms) ? rooms : [rooms]\n const seen = new Set<string>()\n const normalized: string[] = []\n for (const r of list) {\n if (typeof r !== 'string') continue\n if (seen.has(r)) continue\n seen.add(r)\n normalized.push(r)\n }\n return normalized\n}\n\nfunction arrayShallowEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i += 1) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n\nexport function roomStateEqual<C extends SocketConnectionConfigOutput>(\n prev: RoomState<C>,\n next: RoomState<C>,\n): boolean {\n return (\n arrayShallowEqual(prev.rooms, next.rooms) &&\n safeJsonKey(prev.joinMeta) === safeJsonKey(next.joinMeta) &&\n safeJsonKey(prev.leaveMeta) === safeJsonKey(next.leaveMeta)\n )\n}\n\nexport function mergeRoomState<\n L extends AnyLeafLowProfile,\n C extends SocketConnectionConfigOutput,\n>(prev: RoomState<C>, toRoomsResult: ToRoomsResult<C>): RoomState<C> {\n const merged = new Set(prev.rooms)\n for (const r of normalizeRooms(toRoomsResult.rooms)) merged.add(r)\n return {\n rooms: Array.from(merged),\n joinMeta: toRoomsResult.joinMeta ?? prev.joinMeta,\n leaveMeta: toRoomsResult.leaveMeta ?? prev.leaveMeta,\n }\n}\n\nexport function roomsFromData<\n L extends AnyLeafLowProfile,\n C extends SocketConnectionConfigOutput,\n AppContext = undefined,\n>(\n data: DataShape<L> | undefined,\n args: ArgsFor<L> | undefined,\n toRooms: ToRoomsMapper<L, C, AppContext>,\n meta?: ToRoomsMeta<AppContext>,\n): RoomState<C> {\n if (data == null) return { rooms: [] }\n\n let state: RoomState<C> = { rooms: [] }\n const add = (input: InferOutput<L>) => {\n const mergeForValue = (value: unknown) => {\n state = mergeRoomState(\n state,\n toRooms({ data: value as InferOutput<L>, args, meta }),\n )\n }\n\n if (Array.isArray(input)) {\n input.forEach((entry) => mergeForValue(entry))\n return\n }\n\n if (input && typeof input === 'object') {\n const maybeItems = (input as any).items\n if (Array.isArray(maybeItems)) {\n maybeItems.forEach((entry) => mergeForValue(entry))\n return\n }\n }\n\n mergeForValue(input)\n }\n\n const maybePages = (data as any)?.pages\n if (Array.isArray(maybePages)) {\n for (const page of maybePages) add(page as InferOutput<L>)\n return state\n }\n\n add(data as InferOutput<L>)\n return state\n}\n"],"mappings":"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","names":["toArgsTuple","lowProfileParse","keepPreviousData","useQuery","useCallback","useRef","lowProfileParse","lowProfileParse","buildOnReceive","useRef","useCallback","useQuery","keepPreviousData","buildCacheKey","lowProfileParse","keepPreviousData","useCallback","useRef","buildCacheKey","lowProfileParse","buildOnReceive","useRef","useCallback","keepPreviousData","buildCacheKey","lowProfileParse","useCallback","useRef","buildCacheKey","lowProfileParse","useRef","useCallback","toArgsTuple","React","React","dbg","entry","args","useEffect","useMemo","useRef","useState","safeDescribeHookValue","createHookDebugEvent","dbg","trackHookTrigger","normalizeRooms","useSocketClient","useMemo","useState","useRef","dbg","useEffect","trackHookTrigger"]}