@emeryld/rrroutes-client 2.2.13 → 2.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -398,7 +398,7 @@ const useSocketedRooms = buildSocketedRoute({
398
398
  leaveMeta: { source: 'rooms:list' },
399
399
  }),
400
400
  useSocketClient,
401
- applyMessage: {
401
+ applySocket: {
402
402
  'chat:message': (prev, payload) => {
403
403
  if (!prev) return prev;
404
404
  // Example: bump unread count in cache
package/dist/index.cjs CHANGED
@@ -810,7 +810,7 @@ function roomsFromData(data, toRooms) {
810
810
  return state;
811
811
  }
812
812
  function buildSocketedRoute(options) {
813
- const { built, toRooms, applyMessage, useSocketClient: useSocketClient2 } = options;
813
+ const { built, toRooms, applySocket, useSocketClient: useSocketClient2 } = options;
814
814
  return (...useArgs) => {
815
815
  const client = useSocketClient2();
816
816
  const endpointResult = built.useEndpoint(...useArgs);
@@ -849,7 +849,7 @@ function buildSocketedRoute(options) {
849
849
  };
850
850
  }, [client, roomsKey, roomState.joinMeta, roomState.leaveMeta, joinMetaKey, leaveMetaKey]);
851
851
  (0, import_react2.useEffect)(() => {
852
- const entries = Object.entries(applyMessage).filter(
852
+ const entries = Object.entries(applySocket).filter(
853
853
  ([_event, fn]) => typeof fn === "function"
854
854
  );
855
855
  const unsubscribes = entries.map(
@@ -862,7 +862,7 @@ function buildSocketedRoute(options) {
862
862
  })
863
863
  );
864
864
  return () => unsubscribes.forEach((u) => u?.());
865
- }, [client, applyMessage, built, argsKey, toRooms]);
865
+ }, [client, applySocket, built, argsKey, toRooms]);
866
866
  return { ...endpointResult, rooms: roomState.rooms };
867
867
  };
868
868
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/routesV3.client.fetch.ts","../src/routesV3.client.index.ts","../src/sockets/socket.client.sys.ts","../src/sockets/socket.client.context.tsx","../src/sockets/socketedRoute/socket.client.helper.ts","../src/sockets/socket.client.index.ts"],"sourcesContent":["/**\n * This package exports React Query hooks, so we mark it as client-only to keep Next.js happy.\n */\n'use client';\n\nexport * from './routesV3.client.types';\nexport * from './routesV3.client.fetch';\nexport * from './routesV3.client.index';\nexport * from './sockets/socket.client.index';","// routesV3.client.fetch.ts\n\nimport { Fetcher, FetchInput } from './routesV3.client.types';\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>(req: FetchInput): Promise<T> => {\n const headers: Record<string, string> = { ...(req.headers ?? {}) };\n const isFormData = 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 ? (req.body as any) : req.body == null ? undefined : JSON.stringify(req.body),\n });\n\n const text = await res.text();\n if (!res.ok) {\n const snippet = text.slice(0, 400);\n throw new Error(`[${res.status}] ${res.statusText} — ${snippet}`);\n }\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n};\n","// routesV3.client.ts\nimport { useCallback, useRef } from 'react';\nimport {\n keepPreviousData,\n useInfiniteQuery,\n useMutation,\n useQuery,\n type InfiniteData,\n type QueryKey,\n} from '@tanstack/react-query';\nimport { z, type ZodType } from 'zod';\nimport {\n HttpMethod,\n buildCacheKey,\n compilePath,\n} from '@emeryld/rrroutes-contract';\nimport type {\n AnyLeaf,\n InferBody,\n InferOutput,\n InferParams,\n InferQuery,\n Prettify,\n} from '@emeryld/rrroutes-contract';\nimport { defaultFetcher } from './routesV3.client.fetch';\nimport type {\n ArgsFor,\n ArgsTuple,\n BuildMeta,\n BuiltForLeaf,\n BuiltInfinite,\n BuiltMutation,\n BuiltQuery,\n BuildOptionsFor,\n Cursor,\n DataShape,\n InfiniteBuildOptionsFor,\n MutationBuildOptionsFor,\n QueryKeysFor,\n QueryBuildOptionsFor,\n RouteClient,\n RouteClientOptions,\n RouteClientDebugEvent,\n RouteClientDebugLogger,\n RouteClientDebugMode,\n RouteClientDebugOptions,\n RouteClientDebugToggleOptions,\n Updater,\n RouterBuilder,\n} from './routesV3.client.types';\n\n// -------------------------------------------------------------------------------------\n// Tiny helpers\n// -------------------------------------------------------------------------------------\n/**\n * Convert an HTTP method to uppercase (as expected by fetch).\n * @param m Lowercase HTTP method.\n * @returns Uppercase method string.\n */\nconst toUpper = (m: HttpMethod): Uppercase<HttpMethod> => m.toUpperCase() as Uppercase<HttpMethod>;\n\nconst defaultFeedQuerySchema = z.object({\n cursor: z.string().optional(),\n limit: z.coerce.number().min(1).max(100).default(20),\n});\n\nconst defaultFeedOutputSchema = z.object({\n items: z.array(z.unknown()),\n nextCursor: z.string().optional(),\n});\n\n/**\n * Parse the given value with the supplied schema (if present).\n * @param value Raw value to validate.\n * @param schema Optional Zod schema used for validation/coercion.\n * @returns The validated or original value.\n */\nfunction zParse<T>(value: unknown, schema?: ZodType): T {\n return schema ? (schema.parse(value) as T) : (value as T);\n}\n\n/**\n * Serialize a query object into a search string.\n * @param query Query params object (possibly undefined).\n * @returns Query string prefixed with `?`, or empty string.\n */\nfunction 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 == null) continue;\n if (Array.isArray(v)) {\n v.forEach((x) => {\n if (x == null) return;\n if (typeof x === 'object') {\n params.append(k, JSON.stringify(x));\n } else {\n params.append(k, String(x));\n }\n });\n continue;\n }\n if (typeof v === 'object') {\n params.set(k, JSON.stringify(v));\n continue;\n }\n params.set(k, String(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 * @param obj Source object.\n * @param key Property name to omit.\n * @returns Copy of the object without the specified key.\n */\nfunction stripKey<Q extends Record<string, unknown> | undefined>(obj: Q, key: string): 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 * @param p Page result returned from the server.\n * @returns Next cursor string, if present.\n */\nconst defaultGetNextCursor = (p: unknown): Cursor =>\n p && typeof p === 'object' && 'nextCursor' in p ? (p as any).nextCursor : undefined;\n\n// Debug logging --------------------------------------------------------------\nconst noopDebugLogger: RouteClientDebugLogger = () => {};\n\nconst defaultDebugLogger: RouteClientDebugLogger = (event: RouteClientDebugEvent) => {\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) => defaultDebugLogger(name ? { ...event, name } : event),\n mode: 'minimal',\n };\n }\n if (option === 'complete') {\n return {\n emit: (event, name) => 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 ? new Set<Names>(toggles.only) : 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// Split the variadic tuple at runtime\n/**\n * Extract the optional argument object from a variadic tuple.\n * @param args Tuple passed to a built endpoint helper.\n * @returns The argument object if present.\n */\nfunction extractArgs<L extends AnyLeaf>(args: ArgsTuple<L>): ArgsFor<L> | undefined {\n return (args as unknown as any[])[0] as any;\n}\n\nfunction toArgsTuple<L extends AnyLeaf>(args: ArgsFor<L> | undefined): ArgsTuple<L> {\n return (typeof args === 'undefined' ? [] : [args]) as ArgsTuple<L>;\n}\n\nfunction augmentFeedQuerySchema(schema: ZodType | undefined) {\n if (!schema) return defaultFeedQuerySchema;\n if (schema instanceof z.ZodObject) {\n const shape = (schema as any).shape ? (schema as any).shape : (schema as any)._def?.shape?.();\n return schema.extend({\n ...(shape ?? {}),\n cursor: defaultFeedQuerySchema.shape.cursor,\n limit: defaultFeedQuerySchema.shape.limit,\n });\n }\n return z.intersection(schema, defaultFeedQuerySchema);\n}\n\nfunction augmentFeedOutputSchema(schema: ZodType | undefined) {\n if (!schema) return defaultFeedOutputSchema;\n if (schema instanceof z.ZodObject) {\n const shape = (schema as any).shape ? (schema as any).shape : (schema as any)._def?.shape?.();\n const hasItems = Boolean(shape?.items);\n if (hasItems) return schema.extend({ nextCursor: z.string().optional() });\n return z.object({\n items: z.array(schema as ZodType),\n nextCursor: z.string().optional(),\n });\n }\n if (schema instanceof z.ZodArray) {\n return z.object({\n items: schema,\n nextCursor: z.string().optional(),\n });\n }\n return defaultFeedOutputSchema;\n}\n\n/**\n * Normalize params and query values, then construct a request URL for the given leaf.\n * @param leaf Leaf describing the endpoint.\n * @param baseUrl Optional base URL prepended to the path.\n * @param params Route parameters supplied by the caller.\n * @param query Query parameters supplied by the caller.\n * @returns Object containing the composed URL plus normalized params/query payloads.\n */\nfunction buildUrl<L extends AnyLeaf>(\n leaf: L,\n baseUrl: string,\n params: InferParams<L> | undefined,\n query: InferQuery<L> | undefined,\n) {\n const normalizedParams = zParse<InferParams<L>>(params, leaf.cfg.paramsSchema);\n const normalizedQuery = zParse<InferQuery<L>>(query, leaf.cfg.querySchema);\n const path = compilePath<L['path']>(leaf.path, (normalizedParams ?? {}) as any);\n const url = `${baseUrl ?? ''}${path}${toSearchString(normalizedQuery as any)}`;\n return { url, normalizedQuery, normalizedParams };\n}\n\n// -------------------------------------------------------------------------------------\n// Client factory\n// -------------------------------------------------------------------------------------\n/**\n * Construct typed React Query helpers backed by a routes-v3 registry leaf.\n * @param opts Route client configuration (query client, fetcher overrides, etc).\n * @returns Object that can build endpoint hooks/mutations from leaves.\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 cursorParam = opts.cursorParam ?? 'cursor';\n const getNextCursor = opts.getNextCursor ?? defaultGetNextCursor;\n const environment =\n opts.environment ?? undefined;\n const { emit: emitDebug, mode: debugMode } = createDebugEmitter<Names>(opts.debug, environment);\n const isVerboseDebug = debugMode === 'complete';\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 /**\n * Invalidate a set of queries sharing the given prefix.\n * @param prefix Key parts shared by matching endpoints.\n * @param exact When true, invalidate only exact key matches.\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 /**\n * Build the client surface for a single leaf (query/mutation/infinite query).\n * @param leaf Leaf describing the endpoint.\n * @param rqOpts Optional React Query configuration.\n * @returns Helper object exposing getQueryKeys/invalidate/setData/useEndpoint/fetch.\n */\n function buildInternal<L extends AnyLeaf>(\n leaf: L,\n rqOpts?: QueryBuildOptionsFor<L> | InfiniteBuildOptionsFor<L> | MutationBuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ): BuiltForLeaf<L> {\n const isGet = leaf.method === 'get';\n const isFeed = !!leaf.cfg.feed;\n const leafCfg = isFeed\n ? {\n ...leaf.cfg,\n querySchema: augmentFeedQuerySchema(leaf.cfg.querySchema),\n outputSchema: augmentFeedOutputSchema(leaf.cfg.outputSchema),\n }\n : leaf.cfg;\n const method = toUpper(leaf.method);\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema);\n const leafLabel = `${leaf.method.toUpperCase()} ${String(leaf.path)}`;\n const debugName = meta?.name;\n const emit = (event: RouteClientDebugEvent) => emitDebug(event, debugName);\n emit({ type: 'build', leaf: leafLabel });\n\n // --- key/invalidate/setData shared helpers ---\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 = isGet && isFeed ? stripKey(query as any, cursorParam) : (query as any);\n return buildCacheKey({\n leaf,\n params: params as any,\n query: qForKey,\n }) as unknown as QueryKeysFor<L, A>;\n };\n\n /**\n * Invalidate the React Query cache for this exact leaf invocation.\n * @param tuple Optional params/query tuple.\n */\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple);\n await queryClient.invalidateQueries({ queryKey, exact: true });\n emit({ type: 'invalidate', key: queryKey, exact: true });\n };\n\n /**\n * Update the cache entries for this leaf.\n * @param args Tuple whose first entry is the updater and optional params/query follow.\n */\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args;\n const k = getQueryKeys(...(rest as ArgsTuple<L>));\n let next: InferOutput<L> | InfiniteData<InferOutput<L>> | undefined;\n if (isGet && isFeed) {\n next = queryClient.setQueryData<InfiniteData<InferOutput<L>> | undefined>(\n k,\n (prev) => (typeof updater === 'function' ? (updater as any)(prev) : (updater as any)),\n ) as any;\n } else {\n next = queryClient.setQueryData<InferOutput<L> | undefined>(\n k,\n (prev) => (typeof updater === 'function' ? (updater as any)(prev) : (updater as any)),\n ) as any;\n }\n emit({ type: 'setData', key: k });\n return next as any;\n };\n\n const buildOnReceive = (\n rqOpts as { onReceive?: ((data: InferOutput<L>) => void) | undefined } | undefined\n )?.onReceive;\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>;\n body?: InferBody<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 options?.queryOverride ?? ((a as any)?.query as InferQuery<L> | undefined);\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n );\n\n let payload: InferBody<L> | FormData | undefined;\n const acceptsBody = Boolean(leafCfg.bodySchema);\n const requiresBody = options?.requireBody ?? (!isGet && acceptsBody);\n if (typeof options?.body !== 'undefined') {\n const normalizedBody = zParse<InferBody<L>>(options.body, leafCfg.bodySchema);\n const isMultipart = Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0;\n payload = isMultipart ? toFormData(normalizedBody as any) : normalizedBody;\n } else if (requiresBody) {\n throw new Error('Body is required when invoking a mutation fetch.');\n }\n\n const startedAt = Date.now();\n const detail = isVerboseDebug ? { params: normalizedParams, query: normalizedQuery } : undefined;\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 try {\n const out = await fetcher<unknown>(\n payload === undefined ? { url, method } : { url, method, body: payload },\n );\n const parsed = zParse<InferOutput<L>>(out, leafCfg.outputSchema);\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'success',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug ? { params: normalizedParams, query: normalizedQuery, output: parsed } : undefined,\n ),\n );\n\n options?.onReceive?.(parsed);\n return parsed;\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 = (\n ...tupleWithBody: InferBody<L> extends never ? ArgsTuple<L> : [...ArgsTuple<L>, InferBody<L>]\n ): Promise<InferOutput<L>> => {\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 InferBody<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, { body, onReceive: buildOnReceive, requireBody: false });\n };\n\n // --- Infinite GET ---\n if (isGet && isFeed) {\n const useEndpoint: BuiltInfinite<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'infiniteGet' });\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 = (rqOpts ?? {}) as InfiniteBuildOptionsFor<L>;\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>());\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOptions?.onReceive?.(data);\n listenersRef.current.forEach((listener) => listener(data));\n },\n [],\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 // Normalize once; we’ll inject the cursor per page below.\n const { normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n );\n const queryResult = useInfiniteQuery<\n InferOutput<L>,\n unknown,\n InfiniteData<InferOutput<L>>,\n QueryKey,\n Cursor\n >({\n ...buildOptions,\n queryKey: getQueryKeys(...tuple),\n initialPageParam: undefined,\n getNextPageParam: (lastPage) => getNextCursor(lastPage),\n placeholderData: keepPreviousData,\n queryFn: ({ pageParam }) => {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [cursorParam]: pageParam } : {}),\n };\n return fetchEndpoint(tuple, {\n queryOverride: pageQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n });\n },\n // NOTE: TData is InfiniteData<T>, so we don't need a select here.\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n // --- Plain GET ---\n if (isGet) {\n const useEndpoint: BuiltQuery<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'get' });\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 = (rqOpts ?? {}) as QueryBuildOptionsFor<L>;\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>());\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOptions?.onReceive?.(data);\n listenersRef.current.forEach((listener) => listener(data));\n },\n [],\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 buildUrl({ ...leaf, cfg: leafCfg } as L, baseUrl, params, query);\n const queryResult = useQuery<InferOutput<L>, unknown, InferOutput<L>, QueryKey>({\n ...buildOptions,\n queryKey: getQueryKeys(...tuple),\n placeholderData: keepPreviousData,\n queryFn: () =>\n fetchEndpoint(tuple, {\n onReceive: notifyOnReceive,\n }),\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n\n // --- Mutation (POST/PUT/PATCH/DELETE) ---\n const mutationBuildOptions = (rqOpts ?? {}) as MutationBuildOptionsFor<L>;\n const fetchMutation: BuiltMutation<L>['fetch'] = async (\n ...tupleWithBody: Prettify<[...ArgsTuple<L>, InferBody<L>]>\n ) => {\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 InferBody<L>;\n const result = await fetchEndpoint(tuple, {\n body,\n onReceive: (data) => mutationBuildOptions?.onReceive?.(data),\n requireBody: true,\n });\n\n return result;\n };\n\n const useEndpoint: BuiltMutation<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'mutation' });\n const tuple = toArgsTuple(args);\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((listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener);\n return () => {\n listenersRef.current.delete(listener);\n };\n }, []);\n\n const mutationResult = useMutation<InferOutput<L>, unknown, InferBody<L>, unknown>({\n ...mutationBuildOptions,\n mutationKey: getQueryKeys(...tuple),\n mutationFn: async (body: InferBody<L>) => {\n const result = await fetchMutation(...([...tuple, body] as [...ArgsTuple<L>, InferBody<L>]));\n notifyListeners(result);\n return result;\n },\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n\n return {\n queryClient,\n invalidate,\n build: buildInternal as RouteClient<Names>['build'],\n };\n}\n\n/**\n * Curry a route client with a registry of leaves so callers can build endpoints by name.\n * @param routeClient The route client instance created via `createRouteClient`.\n * @param routes Object map of named leaves (e.g., a registry’s `byKey` or a curated subset).\n * @returns Function that builds endpoints by supplying the route name instead of the leaf itself.\n */\nexport function buildRouter<\n Routes extends Record<PropertyKey, AnyLeaf>,\n Names extends string = string,\n>(routeClient: RouteClient<Names>, routes: Routes): RouterBuilder<Routes, Names> {\n const buildLeaf = routeClient.build as <L extends AnyLeaf>(\n leaf: L,\n options?: BuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ) => BuiltForLeaf<L>;\n\n return ((key, opts, meta) =>\n buildLeaf(routes[key], opts as BuildOptionsFor<Routes[typeof key]>, meta)) as RouterBuilder<\n Routes,\n Names\n >;\n}\n\n// -------------------------------------------------------------------------------------\n// Multipart helper\n// -------------------------------------------------------------------------------------\nfunction toFormData(body: Record<string, any>): FormData {\n const fd = new FormData();\n for (const [k, v] of Object.entries(body ?? {})) {\n if (v == null) continue;\n if (Array.isArray(v)) v.forEach((item, i) => fd.append(`${k}[${i}]`, item as any));\n else fd.append(k, v as any);\n }\n return fd;\n}\n","// socket.client.sys.ts\n\nimport type { Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n SysEventName,\n} from '@emeryld/rrroutes-contract';\nimport { SocketClient } from './socket.client.index';\n\nexport type MaybeSocket = Socket | null;\n\nexport type SysEventMap<T extends EventMap, C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput> = {\n 'sys:connect': (args: { socket: Socket; client: SocketClient<T, C> }) => Promise<void> | void;\n 'sys:disconnect': (args: { socket: Socket; client: SocketClient<T, C>; reason: string }) => Promise<void> | void;\n 'sys:reconnect': (args: { socket: Socket; attempt: number; client: SocketClient<T, C> }) => Promise<void> | void;\n 'sys:connect_error': (args: { socket: Socket; client: SocketClient<T, C>; error: string }) => Promise<void> | void;\n 'sys:ping': (args: {\n socket: Socket;\n client: SocketClient<T, C>;\n }) => Promise<SocketSchemaOutput<C['pingPayload']>> | SocketSchemaOutput<C['pingPayload']>;\n 'sys:pong': (args: {\n socket: Socket;\n client: SocketClient<T, C>;\n payload: SocketSchemaOutput<C['pongPayload']>;\n }) => Promise<void> | void;\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 '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>(metaSchema: Meta): RoomPayloadSchema<Meta> =>\n z.object({\n rooms: roomValueSchema,\n meta: metaSchema,\n });\n","// socket.client.context.tsx\n\nimport * as React from 'react';\nimport { Socket } from 'socket.io-client';\nimport {\n SocketClient,\n SocketClientOptions,\n ClientCtx,\n ServerEnvelope,\n} from './socket.client.index';\nimport {\n EventMap,\n SocketConnectionConfigOutput,\n Payload,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\n\n/** === Provider-side debug === */\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<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>;\n };\n\nexport type SocketProviderDebugOptions = {\n verbose?: boolean;\n logger?: (e: SocketProviderDebugEvent) => void;\n} & {\n [P in SocketProviderDebugEvent['type']]?: boolean;\n};\n\n/** === Types for runtime socket injection === */\ntype BaseOptions<T extends EventMap, C extends SocketConnectionConfigOutput> = Omit<\n SocketClientOptions<T, C>,\n 'socket'\n>;\n\ntype ProviderRuntimeSocket =\n | { socket: Socket | null }\n | { getSocket: () => Socket | Promise<Socket> };\n\ntype SocketProviderProps<T extends EventMap, C extends SocketConnectionConfigOutput> = React.PropsWithChildren<{\n events: T;\n baseOptions: BaseOptions<T, C>;\n /** show while waiting for async socket; should not use the socket context */\n fallback?: React.ReactNode;\n providerDebug?: SocketProviderDebugOptions;\n destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n} & ProviderRuntimeSocket>;\n\nconst SocketCtx = React.createContext<SocketClient<any, SocketConnectionConfigOutput> | null>(null);\n\nfunction dbg(dbgOpts: SocketProviderDebugOptions | undefined, e: SocketProviderDebugEvent) {\n if (!dbgOpts?.logger) return;\n if (!dbgOpts[e.type]) return;\n dbgOpts.logger(e);\n}\n\ntype HookDebugSnapshot = Record<string, unknown>;\ntype HookIdentifier = Extract<SocketProviderDebugEvent, { type: 'hook' }>['phase'];\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 // Fallback heuristic for socket.io client instances\n return (\n ('connected' in anyVal || 'recovered' in anyVal) &&\n typeof anyVal.on === 'function' &&\n typeof anyVal.emit === 'function'\n );\n}\n\nfunction describeSocketLike(value: { id?: string; connected?: boolean; recovered?: boolean } | null): HookDebugValue {\n if (!value) return null;\n const id = value.id ?? 'unknown';\n const connected = value.connected ?? false;\n const recovered = 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 (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n return value as HookDebugValue;\n }\n if (valueType === 'bigint' || valueType === 'symbol') return String(value);\n if (valueType === 'function') return `[function ${(value as Function).name || 'anonymous'}]`;\n if (Array.isArray(value)) return `[array length=${value.length}]`;\n\n if (isProbablySocket(value)) {\n return describeSocketLike(value);\n }\n\n const ctorName = (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\nfunction summarizeEvents(events: unknown): HookDebugValue {\n if (!events || typeof events !== 'object') 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\nfunction summarizeBaseOptions(options: unknown): HookDebugValue {\n if (!options || typeof options !== 'object') 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\nfunction 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<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>\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\n return { type: 'hook', phase: hook, reason, changes: changed };\n}\n\nfunction 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\nexport function buildSocketProvider<T extends EventMap, C extends SocketConnectionConfigOutput>(args: {\n events: T;\n options: Omit<BaseOptions<T, C>, 'debug'> & {\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 & { fallback?: React.ReactNode; destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']> }\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: Parameters<typeof useSocketConnection<T, K, C>>[0],\n ) => useSocketConnection<T, K, C>(p),\n };\n}\n\nfunction SocketProvider<T extends EventMap, C extends SocketConnectionConfigOutput>(props: SocketProviderProps<T, C>) {\n const { events, baseOptions, children, fallback, providerDebug, destroyLeaveMeta } = props;\n\n // Async sockets are resolved into this state.\n const [resolvedSocket, setResolvedSocket] = React.useState<Socket | null>(null);\n\n // Single source of truth for \"the socket we should use right now\".\n const socket: Socket | null = 'socket' in props ? props.socket ?? null : resolvedSocket;\n\n const providerDebugRef = React.useRef<SocketProviderDebugOptions | undefined>();\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, { type: 'resolve', phase: 'cancelled' });\n return;\n }\n if (!s) {\n dbg(providerDebugRef.current, { type: 'resolve', phase: 'socketMissing' });\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, { type: 'resolve', phase: 'error', err: String(err) });\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [resolvedSocket]);\n\n // Focus hook debug on high-signal data, not full objects\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, { type: 'client', phase: 'init', missing: true });\n return null;\n }\n const c = new SocketClient<T, C>(events, { ...baseOptions, socket });\n dbg(providerDebugRef.current, { type: 'client', phase: 'init', missing: false });\n return c;\n }, [events, baseOptions, socket]);\n\n // Keep latest destroyLeaveMeta in a ref so changing its identity does not\n // retrigger the destroy effect and cause repeated client.destroy() calls.\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(destroyLeaveMetaRef.current, 'destroyLeaveMeta'),\n },\n });\n\n return () => {\n if (client) {\n client.destroy(destroyLeaveMetaRef.current);\n dbg(providerDebugRef.current, { type: 'client', phase: 'destroy' });\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\nexport function useSocketClient<T extends EventMap, C extends SocketConnectionConfigOutput>(): SocketClient<T, C> {\n const ctx = React.useContext(SocketCtx);\n if (!ctx) throw new Error('SocketClient not found. Wrap with <SocketProvider>.');\n return ctx as unknown as SocketClient<T, C>;\n}\n\ntype Rooms = string[] | string | undefined;\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>; ctx: ClientCtx },\n ) => void;\n onCleanup?: () => void;\n autoJoin?: boolean;\n autoLeave?: boolean;\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n};\n\nexport function useSocketConnection<T extends EventMap, K extends keyof T & string, C extends SocketConnectionConfigOutput>(\n args: UseSocketConnectionArgs<T, K, C>,\n) {\n const { event, rooms, onMessage, onCleanup, autoJoin = true, autoLeave = true } = 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\n React.useEffect(() => {\n if (autoJoin && normalizedRooms.length > 0) client.joinRooms(normalizedRooms, args.joinMeta);\n const unsubscribe = client.on(event, onMessage);\n\n return () => {\n unsubscribe();\n if (autoLeave && normalizedRooms.length > 0) client.leaveRooms(normalizedRooms, args.leaveMeta);\n if (onCleanup) onCleanup();\n };\n }, [client, event, onMessage, autoJoin, autoLeave, ...normalizedRooms]);\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type {\n AnyLeaf,\n EventMap,\n InferOutput,\n Payload,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\nimport type {\n BuiltInfinite,\n BuiltQuery,\n DataShape,\n InfiniteUseEndpointResultFor,\n QueryUseEndpointResultFor,\n UseEndpointArgs,\n} from '../../routesV3.client.types';\nimport type { ClientCtx, ServerEnvelope, SocketClient } from '../socket.client.index';\n\ntype RoomsInput = string | string[] | undefined | null;\n\ntype SocketedBuilt<L extends AnyLeaf> = L['cfg']['feed'] extends true\n ? BuiltInfinite<L>\n : BuiltQuery<L>;\n\ntype SocketedRouteResult<L extends AnyLeaf> = (L['cfg']['feed'] extends true\n ? InfiniteUseEndpointResultFor<L>\n : QueryUseEndpointResultFor<L>) & { rooms: string[] };\n\nexport type SocketedRouteOptions<\n L extends AnyLeaf,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n> = {\n built: SocketedBuilt<L>;\n toRooms: (data: InferOutput<L>) => {\n rooms: RoomsInput;\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n };\n applyMessage: {\n [K in keyof Events & string]?: (\n prev: DataShape<L> | undefined,\n payload: Payload<Events, K>,\n meta: { envelope: ServerEnvelope<Events, K>; ctx: ClientCtx },\n ) => DataShape<L> | undefined;\n };\n useSocketClient: () => SocketClient<Events, C>;\n};\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\ntype RoomState<C extends SocketConnectionConfigOutput> = {\n rooms: string[];\n joinMeta?: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta?: SocketSchemaOutput<C['leaveMetaMessage']>;\n};\n\nfunction mergeRoomState<L extends AnyLeaf, C extends SocketConnectionConfigOutput>(\n prev: RoomState<C>,\n toRoomsResult: ReturnType<SocketedRouteOptions<L, any, C>['toRooms']>,\n): 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\nfunction roomsFromData<L extends AnyLeaf, C extends SocketConnectionConfigOutput>(\n data: DataShape<L> | undefined,\n toRooms: SocketedRouteOptions<L, any, C>['toRooms'],\n): RoomState<C> {\n if (data == null) return { rooms: [] };\n\n let state: RoomState<C> = { rooms: [] };\n const add = (input: InferOutput<L>) => {\n state = mergeRoomState(state, toRooms(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\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 AnyLeaf,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(options: SocketedRouteOptions<L, Events, C>) {\n const { built, toRooms, applyMessage, useSocketClient } = options;\n\n return (...useArgs: UseEndpointArgs<L>): SocketedRouteResult<L> => {\n const client = useSocketClient();\n const endpointResult = built.useEndpoint(...useArgs) as SocketedRouteResult<L>;\n const argsKey = useMemo(() => JSON.stringify(useArgs[0] ?? null), [useArgs]);\n\n const [roomState, setRoomState] = useState<RoomState<C>>(() =>\n roomsFromData(endpointResult.data as DataShape<L> | undefined, toRooms),\n );\n const roomsKey = useMemo(() => roomState.rooms.join('|'), [roomState.rooms]);\n const joinMetaKey = useMemo(() => JSON.stringify(roomState.joinMeta ?? null), [roomState.joinMeta]);\n const leaveMetaKey = useMemo(() => JSON.stringify(roomState.leaveMeta ?? null), [roomState.leaveMeta]);\n\n useEffect(() => {\n const unsubscribe = endpointResult.onReceive((data) => {\n setRoomState((prev) => mergeRoomState(prev, toRooms(data as InferOutput<L>)));\n });\n return unsubscribe;\n }, [endpointResult, toRooms]);\n\n useEffect(() => {\n setRoomState(roomsFromData(endpointResult.data as DataShape<L> | undefined, toRooms));\n }, [endpointResult.data, toRooms]);\n\n useEffect(() => {\n if (roomState.rooms.length === 0) return;\n const {joinMeta, leaveMeta} = roomState;\n if (!joinMeta || !leaveMeta) return;\n let active = true;\n (async () => {\n try {\n await client.joinRooms(roomState.rooms, joinMeta);\n } catch {\n // ignore join failures; hook should not throw\n }\n })();\n return () => {\n if (!active || roomState.rooms.length === 0) return;\n active = false;\n void client.leaveRooms(roomState.rooms, leaveMeta).catch(() => {});\n };\n }, [client, roomsKey, roomState.joinMeta, roomState.leaveMeta, joinMetaKey, leaveMetaKey]);\n\n useEffect(() => {\n const entries = Object.entries(applyMessage).filter(\n ([_event, fn]) => typeof fn === 'function',\n ) as Array<\n [\n keyof Events & string,\n (\n prev: DataShape<L> | undefined,\n payload: Payload<Events, keyof Events & string>,\n meta: { envelope: ServerEnvelope<Events, keyof Events & string>; ctx: ClientCtx },\n ) => DataShape<L> | undefined\n ]\n >;\n\n const unsubscribes = entries.map(([ev, fn]) =>\n client.on(ev, (payload, meta) => {\n built.setData((prev) => {\n const next = fn(prev, payload as any, meta as any);\n setRoomState(roomsFromData(next as DataShape<L> | undefined, toRooms));\n return next;\n }, ...(useArgs as UseEndpointArgs<L>));\n }),\n );\n return () => unsubscribes.forEach((u) => u?.());\n }, [client, applyMessage, built, argsKey, toRooms]);\n\n return { ...endpointResult, rooms: roomState.rooms };\n };\n}\n","// socket.client.index.ts\n\nimport type { ManagerOptions, Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n Payload,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\nimport type { MaybeSocket, RoomPayloadSchema, SysEventMap } from './socket.client.sys';\nimport { buildRoomPayloadSchema } from './socket.client.sys';\nimport { SocketClientDebugEvent, SocketClientConfigSnapshot } from './socket.client.debug';\n\n\nexport type ServerEnvelope<T extends EventMap, K extends keyof T & string> = {\n eventName: K;\n sentAt: string | Date;\n sentTo: string[];\n data?: Payload<T, K>;\n metadata?: Record<string, unknown>;\n};\n\nexport type ClientCtx = {\n receivedAt: Date;\n latencyMs?: number;\n nsp?: string;\n socketId?: string;\n rooms?: 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 config: C;\n environment?: 'development' | 'production';\n debug?: SocketClientDebugOptions<keyof T & string>;\n heartbeat?: HeartbeatClientOptions;\n sys: SysEventMap<T, C>;\n};\n\ntype HandlerEntry<T extends EventMap, K extends keyof T & string> = {\n orig: (payload: Payload<T, K>, meta: { envelope: ServerEnvelope<T, K>; ctx: ClientCtx }) => void;\n wrapped: (envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>) => void;\n errorWrapped: (e: unknown) => void;\n};\n\nexport class SocketClient<T extends EventMap, C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput> {\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(socket: MaybeSocket): SocketClientConfigSnapshot | null {\n if (!socket) return null;\n const manager = (socket.io ?? 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' ? manager.engine.transport?.name : undefined;\n const readyState = 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: typeof opts.autoConnect === 'boolean' ? opts.autoConnect : undefined,\n reconnection: typeof opts.reconnection === 'boolean' ? opts.reconnection : undefined,\n reconnectionAttempts:\n typeof opts.reconnectionAttempts === 'number' ? opts.reconnectionAttempts : undefined,\n reconnectionDelay:\n typeof opts.reconnectionDelay === 'number' ? opts.reconnectionDelay : undefined,\n reconnectionDelayMax:\n typeof opts.reconnectionDelayMax === 'number' ? opts.reconnectionDelayMax : undefined,\n timeout: typeof opts.timeout === 'number' ? opts.timeout : undefined,\n hostname: typeof opts.hostname === 'string' ? opts.hostname : undefined,\n port: typeof opts.port === 'number' || typeof opts.port === 'string' ? opts.port : 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(error: z.ZodError<any>): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined;\n return { issues: error.issues };\n }\n\n private getVerboseDetails(details: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined;\n return details;\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 = async() => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'connect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onConnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot('connect_event');\n await this.getSysEvent('sys:connect')({\n socket: this.socket,\n client: this,\n });\n };\n\n this.onReconnect = async (attempt) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'reconnect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onReconnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n attempt,\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot('reconnect_event');\n await this.getSysEvent('sys:reconnect')({\n attempt,\n socket: this.socket,\n client: this,\n });\n };\n\n this.onDisconnect = async (reason) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'disconnect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onDisconnect handler');\n }\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 await this.getSysEvent('sys:disconnect')({\n reason: String(reason),\n socket: this.socket,\n client: this,\n });\n };\n\n this.onConnectError = async (err) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'connect_error_event', err: 'Socket is null' });\n throw new Error('Socket is null in onConnectError handler');\n }\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 await this.getSysEvent('sys:connect_error')({\n error: String(err),\n socket: this.socket,\n client: this,\n });\n };\n\n this.onPong =async (raw: unknown) => {\n if (!this.socket) {\n this.dbg({ type: 'heartbeat', phase: 'pong_recv', err: 'Socket is null' });\n throw new Error('Socket is null in onPong handler');\n }\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 await this.getSysEvent('sys:pong')({\n socket: this.socket,\n payload: validated as SocketSchemaOutput<(typeof this.config)['pongPayload']>,\n client: this,\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>>(name: K): 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 d.logger(e);\n }\n\n /** internal stats snapshot */\n stats(): ClientStatsSnapshot {\n const rooms = Array.from(this.roomCounts.entries()).map(([room, count]) => ({ room, count }));\n const handlers = Array.from(this.handlerMap.entries()).map(([event, set]) => ({\n event,\n handlers: set.size,\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('[socket] ping schema validation failed', check.error.issues);\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 this.hbTimer = setInterval(tick, this.hb.intervalMs);\n tick();\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(rooms: string[] | string, meta: SocketSchemaOutput<C['joinMetaMessage']>):Promise<()=> Promise<void>> {\n if (!this.socket) {\n this.dbg({ type: 'room', phase: 'join', rooms: this.toArray(rooms), err: 'Socket is null' });\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(rooms: string[] | string, meta: SocketSchemaOutput<C['leaveMetaMessage']>): Promise<void> {\n if (!this.socket) {\n this.dbg({ type: 'room', phase: 'leave', rooms: this.toArray(rooms), err: 'Socket is null' });\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: (payload: Payload<T, K>, meta: { envelope: ServerEnvelope<T, K>; ctx: ClientCtx }) => 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({ type: 'register', phase: 'register', event, err: 'Socket is null' });\n return () => {};\n }\n\n const socket = this.socket;\n\n const wrapped = (envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>) => {\n const maybeEnvelope = envelopeOrRaw as any;\n const rawData = maybeEnvelope?.data ?? maybeEnvelope;\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\n const receivedAt = new Date();\n const sentAt = maybeEnvelope?.sentAt ? new Date(maybeEnvelope.sentAt) : undefined;\n\n const meta = {\n envelope: {\n eventName: (maybeEnvelope?.eventName ?? event) as K,\n sentAt: maybeEnvelope?.sentAt ?? receivedAt.toISOString(),\n sentTo: maybeEnvelope?.sentTo ?? [],\n data: undefined,\n metadata: maybeEnvelope?.metadata,\n },\n ctx: {\n receivedAt,\n latencyMs: sentAt ? Math.max(0, receivedAt.getTime() - sentAt.getTime()) : undefined,\n nsp: this.getNamespace(socket),\n socketId: socket.id,\n socket,\n },\n } as const;\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 handler(parsed.data as any, meta as any);\n };\n\n const errorWrapped = (e: unknown) => {\n this.dbg({ type: 'receive', event, err: String(e) });\n };\n\n socket.on(String(event), wrapped);\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> = { orig: handler, wrapped, errorWrapped };\n set.add(entry);\n\n return () => {\n socket.off(String(event), wrapped);\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(leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>): 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 \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\nexport * from './socket.client.context';\nexport * from './socket.client.sys';\nexport * from './socketedRoute/socket.client.helper';\n"],"mappings":"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","names":["useEndpoint","import_zod","import_react","useSocketClient"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/routesV3.client.fetch.ts","../src/routesV3.client.index.ts","../src/sockets/socket.client.sys.ts","../src/sockets/socket.client.context.tsx","../src/sockets/socketedRoute/socket.client.helper.ts","../src/sockets/socket.client.index.ts"],"sourcesContent":["/**\n * This package exports React Query hooks, so we mark it as client-only to keep Next.js happy.\n */\n'use client';\n\nexport * from './routesV3.client.types';\nexport * from './routesV3.client.fetch';\nexport * from './routesV3.client.index';\nexport * from './sockets/socket.client.index';","// routesV3.client.fetch.ts\n\nimport { Fetcher, FetchInput } from './routesV3.client.types';\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>(req: FetchInput): Promise<T> => {\n const headers: Record<string, string> = { ...(req.headers ?? {}) };\n const isFormData = 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 ? (req.body as any) : req.body == null ? undefined : JSON.stringify(req.body),\n });\n\n const text = await res.text();\n if (!res.ok) {\n const snippet = text.slice(0, 400);\n throw new Error(`[${res.status}] ${res.statusText} — ${snippet}`);\n }\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n};\n","// routesV3.client.ts\nimport { useCallback, useRef } from 'react';\nimport {\n keepPreviousData,\n useInfiniteQuery,\n useMutation,\n useQuery,\n type InfiniteData,\n type QueryKey,\n} from '@tanstack/react-query';\nimport { z, type ZodType } from 'zod';\nimport {\n HttpMethod,\n buildCacheKey,\n compilePath,\n} from '@emeryld/rrroutes-contract';\nimport type {\n AnyLeaf,\n InferBody,\n InferOutput,\n InferParams,\n InferQuery,\n Prettify,\n} from '@emeryld/rrroutes-contract';\nimport { defaultFetcher } from './routesV3.client.fetch';\nimport type {\n ArgsFor,\n ArgsTuple,\n BuildMeta,\n BuiltForLeaf,\n BuiltInfinite,\n BuiltMutation,\n BuiltQuery,\n BuildOptionsFor,\n Cursor,\n DataShape,\n InfiniteBuildOptionsFor,\n MutationBuildOptionsFor,\n QueryKeysFor,\n QueryBuildOptionsFor,\n RouteClient,\n RouteClientOptions,\n RouteClientDebugEvent,\n RouteClientDebugLogger,\n RouteClientDebugMode,\n RouteClientDebugOptions,\n RouteClientDebugToggleOptions,\n Updater,\n RouterBuilder,\n} from './routesV3.client.types';\n\n// -------------------------------------------------------------------------------------\n// Tiny helpers\n// -------------------------------------------------------------------------------------\n/**\n * Convert an HTTP method to uppercase (as expected by fetch).\n * @param m Lowercase HTTP method.\n * @returns Uppercase method string.\n */\nconst toUpper = (m: HttpMethod): Uppercase<HttpMethod> => m.toUpperCase() as Uppercase<HttpMethod>;\n\nconst defaultFeedQuerySchema = z.object({\n cursor: z.string().optional(),\n limit: z.coerce.number().min(1).max(100).default(20),\n});\n\nconst defaultFeedOutputSchema = z.object({\n items: z.array(z.unknown()),\n nextCursor: z.string().optional(),\n});\n\n/**\n * Parse the given value with the supplied schema (if present).\n * @param value Raw value to validate.\n * @param schema Optional Zod schema used for validation/coercion.\n * @returns The validated or original value.\n */\nfunction zParse<T>(value: unknown, schema?: ZodType): T {\n return schema ? (schema.parse(value) as T) : (value as T);\n}\n\n/**\n * Serialize a query object into a search string.\n * @param query Query params object (possibly undefined).\n * @returns Query string prefixed with `?`, or empty string.\n */\nfunction 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 == null) continue;\n if (Array.isArray(v)) {\n v.forEach((x) => {\n if (x == null) return;\n if (typeof x === 'object') {\n params.append(k, JSON.stringify(x));\n } else {\n params.append(k, String(x));\n }\n });\n continue;\n }\n if (typeof v === 'object') {\n params.set(k, JSON.stringify(v));\n continue;\n }\n params.set(k, String(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 * @param obj Source object.\n * @param key Property name to omit.\n * @returns Copy of the object without the specified key.\n */\nfunction stripKey<Q extends Record<string, unknown> | undefined>(obj: Q, key: string): 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 * @param p Page result returned from the server.\n * @returns Next cursor string, if present.\n */\nconst defaultGetNextCursor = (p: unknown): Cursor =>\n p && typeof p === 'object' && 'nextCursor' in p ? (p as any).nextCursor : undefined;\n\n// Debug logging --------------------------------------------------------------\nconst noopDebugLogger: RouteClientDebugLogger = () => {};\n\nconst defaultDebugLogger: RouteClientDebugLogger = (event: RouteClientDebugEvent) => {\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) => defaultDebugLogger(name ? { ...event, name } : event),\n mode: 'minimal',\n };\n }\n if (option === 'complete') {\n return {\n emit: (event, name) => 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 ? new Set<Names>(toggles.only) : 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// Split the variadic tuple at runtime\n/**\n * Extract the optional argument object from a variadic tuple.\n * @param args Tuple passed to a built endpoint helper.\n * @returns The argument object if present.\n */\nfunction extractArgs<L extends AnyLeaf>(args: ArgsTuple<L>): ArgsFor<L> | undefined {\n return (args as unknown as any[])[0] as any;\n}\n\nfunction toArgsTuple<L extends AnyLeaf>(args: ArgsFor<L> | undefined): ArgsTuple<L> {\n return (typeof args === 'undefined' ? [] : [args]) as ArgsTuple<L>;\n}\n\nfunction augmentFeedQuerySchema(schema: ZodType | undefined) {\n if (!schema) return defaultFeedQuerySchema;\n if (schema instanceof z.ZodObject) {\n const shape = (schema as any).shape ? (schema as any).shape : (schema as any)._def?.shape?.();\n return schema.extend({\n ...(shape ?? {}),\n cursor: defaultFeedQuerySchema.shape.cursor,\n limit: defaultFeedQuerySchema.shape.limit,\n });\n }\n return z.intersection(schema, defaultFeedQuerySchema);\n}\n\nfunction augmentFeedOutputSchema(schema: ZodType | undefined) {\n if (!schema) return defaultFeedOutputSchema;\n if (schema instanceof z.ZodObject) {\n const shape = (schema as any).shape ? (schema as any).shape : (schema as any)._def?.shape?.();\n const hasItems = Boolean(shape?.items);\n if (hasItems) return schema.extend({ nextCursor: z.string().optional() });\n return z.object({\n items: z.array(schema as ZodType),\n nextCursor: z.string().optional(),\n });\n }\n if (schema instanceof z.ZodArray) {\n return z.object({\n items: schema,\n nextCursor: z.string().optional(),\n });\n }\n return defaultFeedOutputSchema;\n}\n\n/**\n * Normalize params and query values, then construct a request URL for the given leaf.\n * @param leaf Leaf describing the endpoint.\n * @param baseUrl Optional base URL prepended to the path.\n * @param params Route parameters supplied by the caller.\n * @param query Query parameters supplied by the caller.\n * @returns Object containing the composed URL plus normalized params/query payloads.\n */\nfunction buildUrl<L extends AnyLeaf>(\n leaf: L,\n baseUrl: string,\n params: InferParams<L> | undefined,\n query: InferQuery<L> | undefined,\n) {\n const normalizedParams = zParse<InferParams<L>>(params, leaf.cfg.paramsSchema);\n const normalizedQuery = zParse<InferQuery<L>>(query, leaf.cfg.querySchema);\n const path = compilePath<L['path']>(leaf.path, (normalizedParams ?? {}) as any);\n const url = `${baseUrl ?? ''}${path}${toSearchString(normalizedQuery as any)}`;\n return { url, normalizedQuery, normalizedParams };\n}\n\n// -------------------------------------------------------------------------------------\n// Client factory\n// -------------------------------------------------------------------------------------\n/**\n * Construct typed React Query helpers backed by a routes-v3 registry leaf.\n * @param opts Route client configuration (query client, fetcher overrides, etc).\n * @returns Object that can build endpoint hooks/mutations from leaves.\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 cursorParam = opts.cursorParam ?? 'cursor';\n const getNextCursor = opts.getNextCursor ?? defaultGetNextCursor;\n const environment =\n opts.environment ?? undefined;\n const { emit: emitDebug, mode: debugMode } = createDebugEmitter<Names>(opts.debug, environment);\n const isVerboseDebug = debugMode === 'complete';\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 /**\n * Invalidate a set of queries sharing the given prefix.\n * @param prefix Key parts shared by matching endpoints.\n * @param exact When true, invalidate only exact key matches.\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 /**\n * Build the client surface for a single leaf (query/mutation/infinite query).\n * @param leaf Leaf describing the endpoint.\n * @param rqOpts Optional React Query configuration.\n * @returns Helper object exposing getQueryKeys/invalidate/setData/useEndpoint/fetch.\n */\n function buildInternal<L extends AnyLeaf>(\n leaf: L,\n rqOpts?: QueryBuildOptionsFor<L> | InfiniteBuildOptionsFor<L> | MutationBuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ): BuiltForLeaf<L> {\n const isGet = leaf.method === 'get';\n const isFeed = !!leaf.cfg.feed;\n const leafCfg = isFeed\n ? {\n ...leaf.cfg,\n querySchema: augmentFeedQuerySchema(leaf.cfg.querySchema),\n outputSchema: augmentFeedOutputSchema(leaf.cfg.outputSchema),\n }\n : leaf.cfg;\n const method = toUpper(leaf.method);\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema);\n const leafLabel = `${leaf.method.toUpperCase()} ${String(leaf.path)}`;\n const debugName = meta?.name;\n const emit = (event: RouteClientDebugEvent) => emitDebug(event, debugName);\n emit({ type: 'build', leaf: leafLabel });\n\n // --- key/invalidate/setData shared helpers ---\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 = isGet && isFeed ? stripKey(query as any, cursorParam) : (query as any);\n return buildCacheKey({\n leaf,\n params: params as any,\n query: qForKey,\n }) as unknown as QueryKeysFor<L, A>;\n };\n\n /**\n * Invalidate the React Query cache for this exact leaf invocation.\n * @param tuple Optional params/query tuple.\n */\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple);\n await queryClient.invalidateQueries({ queryKey, exact: true });\n emit({ type: 'invalidate', key: queryKey, exact: true });\n };\n\n /**\n * Update the cache entries for this leaf.\n * @param args Tuple whose first entry is the updater and optional params/query follow.\n */\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args;\n const k = getQueryKeys(...(rest as ArgsTuple<L>));\n let next: InferOutput<L> | InfiniteData<InferOutput<L>> | undefined;\n if (isGet && isFeed) {\n next = queryClient.setQueryData<InfiniteData<InferOutput<L>> | undefined>(\n k,\n (prev) => (typeof updater === 'function' ? (updater as any)(prev) : (updater as any)),\n ) as any;\n } else {\n next = queryClient.setQueryData<InferOutput<L> | undefined>(\n k,\n (prev) => (typeof updater === 'function' ? (updater as any)(prev) : (updater as any)),\n ) as any;\n }\n emit({ type: 'setData', key: k });\n return next as any;\n };\n\n const buildOnReceive = (\n rqOpts as { onReceive?: ((data: InferOutput<L>) => void) | undefined } | undefined\n )?.onReceive;\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>;\n body?: InferBody<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 options?.queryOverride ?? ((a as any)?.query as InferQuery<L> | undefined);\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n );\n\n let payload: InferBody<L> | FormData | undefined;\n const acceptsBody = Boolean(leafCfg.bodySchema);\n const requiresBody = options?.requireBody ?? (!isGet && acceptsBody);\n if (typeof options?.body !== 'undefined') {\n const normalizedBody = zParse<InferBody<L>>(options.body, leafCfg.bodySchema);\n const isMultipart = Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0;\n payload = isMultipart ? toFormData(normalizedBody as any) : normalizedBody;\n } else if (requiresBody) {\n throw new Error('Body is required when invoking a mutation fetch.');\n }\n\n const startedAt = Date.now();\n const detail = isVerboseDebug ? { params: normalizedParams, query: normalizedQuery } : undefined;\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 try {\n const out = await fetcher<unknown>(\n payload === undefined ? { url, method } : { url, method, body: payload },\n );\n const parsed = zParse<InferOutput<L>>(out, leafCfg.outputSchema);\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'success',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug ? { params: normalizedParams, query: normalizedQuery, output: parsed } : undefined,\n ),\n );\n\n options?.onReceive?.(parsed);\n return parsed;\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 = (\n ...tupleWithBody: InferBody<L> extends never ? ArgsTuple<L> : [...ArgsTuple<L>, InferBody<L>]\n ): Promise<InferOutput<L>> => {\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 InferBody<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, { body, onReceive: buildOnReceive, requireBody: false });\n };\n\n // --- Infinite GET ---\n if (isGet && isFeed) {\n const useEndpoint: BuiltInfinite<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'infiniteGet' });\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 = (rqOpts ?? {}) as InfiniteBuildOptionsFor<L>;\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>());\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOptions?.onReceive?.(data);\n listenersRef.current.forEach((listener) => listener(data));\n },\n [],\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 // Normalize once; we’ll inject the cursor per page below.\n const { normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n );\n const queryResult = useInfiniteQuery<\n InferOutput<L>,\n unknown,\n InfiniteData<InferOutput<L>>,\n QueryKey,\n Cursor\n >({\n ...buildOptions,\n queryKey: getQueryKeys(...tuple),\n initialPageParam: undefined,\n getNextPageParam: (lastPage) => getNextCursor(lastPage),\n placeholderData: keepPreviousData,\n queryFn: ({ pageParam }) => {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [cursorParam]: pageParam } : {}),\n };\n return fetchEndpoint(tuple, {\n queryOverride: pageQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n });\n },\n // NOTE: TData is InfiniteData<T>, so we don't need a select here.\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n // --- Plain GET ---\n if (isGet) {\n const useEndpoint: BuiltQuery<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'get' });\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 = (rqOpts ?? {}) as QueryBuildOptionsFor<L>;\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>());\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOptions?.onReceive?.(data);\n listenersRef.current.forEach((listener) => listener(data));\n },\n [],\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 buildUrl({ ...leaf, cfg: leafCfg } as L, baseUrl, params, query);\n const queryResult = useQuery<InferOutput<L>, unknown, InferOutput<L>, QueryKey>({\n ...buildOptions,\n queryKey: getQueryKeys(...tuple),\n placeholderData: keepPreviousData,\n queryFn: () =>\n fetchEndpoint(tuple, {\n onReceive: notifyOnReceive,\n }),\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n\n // --- Mutation (POST/PUT/PATCH/DELETE) ---\n const mutationBuildOptions = (rqOpts ?? {}) as MutationBuildOptionsFor<L>;\n const fetchMutation: BuiltMutation<L>['fetch'] = async (\n ...tupleWithBody: Prettify<[...ArgsTuple<L>, InferBody<L>]>\n ) => {\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 InferBody<L>;\n const result = await fetchEndpoint(tuple, {\n body,\n onReceive: (data) => mutationBuildOptions?.onReceive?.(data),\n requireBody: true,\n });\n\n return result;\n };\n\n const useEndpoint: BuiltMutation<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'mutation' });\n const tuple = toArgsTuple(args);\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((listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener);\n return () => {\n listenersRef.current.delete(listener);\n };\n }, []);\n\n const mutationResult = useMutation<InferOutput<L>, unknown, InferBody<L>, unknown>({\n ...mutationBuildOptions,\n mutationKey: getQueryKeys(...tuple),\n mutationFn: async (body: InferBody<L>) => {\n const result = await fetchMutation(...([...tuple, body] as [...ArgsTuple<L>, InferBody<L>]));\n notifyListeners(result);\n return result;\n },\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n\n return {\n queryClient,\n invalidate,\n build: buildInternal as RouteClient<Names>['build'],\n };\n}\n\n/**\n * Curry a route client with a registry of leaves so callers can build endpoints by name.\n * @param routeClient The route client instance created via `createRouteClient`.\n * @param routes Object map of named leaves (e.g., a registry’s `byKey` or a curated subset).\n * @returns Function that builds endpoints by supplying the route name instead of the leaf itself.\n */\nexport function buildRouter<\n Routes extends Record<PropertyKey, AnyLeaf>,\n Names extends string = string,\n>(routeClient: RouteClient<Names>, routes: Routes): RouterBuilder<Routes, Names> {\n const buildLeaf = routeClient.build as <L extends AnyLeaf>(\n leaf: L,\n options?: BuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ) => BuiltForLeaf<L>;\n\n return ((key, opts, meta) =>\n buildLeaf(routes[key], opts as BuildOptionsFor<Routes[typeof key]>, meta)) as RouterBuilder<\n Routes,\n Names\n >;\n}\n\n// -------------------------------------------------------------------------------------\n// Multipart helper\n// -------------------------------------------------------------------------------------\nfunction toFormData(body: Record<string, any>): FormData {\n const fd = new FormData();\n for (const [k, v] of Object.entries(body ?? {})) {\n if (v == null) continue;\n if (Array.isArray(v)) v.forEach((item, i) => fd.append(`${k}[${i}]`, item as any));\n else fd.append(k, v as any);\n }\n return fd;\n}\n","// socket.client.sys.ts\n\nimport type { Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n SysEventName,\n} from '@emeryld/rrroutes-contract';\nimport { SocketClient } from './socket.client.index';\n\nexport type MaybeSocket = Socket | null;\n\nexport type SysEventMap<T extends EventMap, C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput> = {\n 'sys:connect': (args: { socket: Socket; client: SocketClient<T, C> }) => Promise<void> | void;\n 'sys:disconnect': (args: { socket: Socket; client: SocketClient<T, C>; reason: string }) => Promise<void> | void;\n 'sys:reconnect': (args: { socket: Socket; attempt: number; client: SocketClient<T, C> }) => Promise<void> | void;\n 'sys:connect_error': (args: { socket: Socket; client: SocketClient<T, C>; error: string }) => Promise<void> | void;\n 'sys:ping': (args: {\n socket: Socket;\n client: SocketClient<T, C>;\n }) => Promise<SocketSchemaOutput<C['pingPayload']>> | SocketSchemaOutput<C['pingPayload']>;\n 'sys:pong': (args: {\n socket: Socket;\n client: SocketClient<T, C>;\n payload: SocketSchemaOutput<C['pongPayload']>;\n }) => Promise<void> | void;\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 '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>(metaSchema: Meta): RoomPayloadSchema<Meta> =>\n z.object({\n rooms: roomValueSchema,\n meta: metaSchema,\n });\n","// socket.client.context.tsx\n\nimport * as React from 'react';\nimport { Socket } from 'socket.io-client';\nimport {\n SocketClient,\n SocketClientOptions,\n ClientCtx,\n ServerEnvelope,\n} from './socket.client.index';\nimport {\n EventMap,\n SocketConnectionConfigOutput,\n Payload,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\n\n/** === Provider-side debug === */\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<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>;\n };\n\nexport type SocketProviderDebugOptions = {\n verbose?: boolean;\n logger?: (e: SocketProviderDebugEvent) => void;\n} & {\n [P in SocketProviderDebugEvent['type']]?: boolean;\n};\n\n/** === Types for runtime socket injection === */\ntype BaseOptions<T extends EventMap, C extends SocketConnectionConfigOutput> = Omit<\n SocketClientOptions<T, C>,\n 'socket'\n>;\n\ntype ProviderRuntimeSocket =\n | { socket: Socket | null }\n | { getSocket: () => Socket | Promise<Socket> };\n\ntype SocketProviderProps<T extends EventMap, C extends SocketConnectionConfigOutput> = React.PropsWithChildren<{\n events: T;\n baseOptions: BaseOptions<T, C>;\n /** show while waiting for async socket; should not use the socket context */\n fallback?: React.ReactNode;\n providerDebug?: SocketProviderDebugOptions;\n destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n} & ProviderRuntimeSocket>;\n\nconst SocketCtx = React.createContext<SocketClient<any, SocketConnectionConfigOutput> | null>(null);\n\nfunction dbg(dbgOpts: SocketProviderDebugOptions | undefined, e: SocketProviderDebugEvent) {\n if (!dbgOpts?.logger) return;\n if (!dbgOpts[e.type]) return;\n dbgOpts.logger(e);\n}\n\ntype HookDebugSnapshot = Record<string, unknown>;\ntype HookIdentifier = Extract<SocketProviderDebugEvent, { type: 'hook' }>['phase'];\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 // Fallback heuristic for socket.io client instances\n return (\n ('connected' in anyVal || 'recovered' in anyVal) &&\n typeof anyVal.on === 'function' &&\n typeof anyVal.emit === 'function'\n );\n}\n\nfunction describeSocketLike(value: { id?: string; connected?: boolean; recovered?: boolean } | null): HookDebugValue {\n if (!value) return null;\n const id = value.id ?? 'unknown';\n const connected = value.connected ?? false;\n const recovered = 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 (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n return value as HookDebugValue;\n }\n if (valueType === 'bigint' || valueType === 'symbol') return String(value);\n if (valueType === 'function') return `[function ${(value as Function).name || 'anonymous'}]`;\n if (Array.isArray(value)) return `[array length=${value.length}]`;\n\n if (isProbablySocket(value)) {\n return describeSocketLike(value);\n }\n\n const ctorName = (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\nfunction summarizeEvents(events: unknown): HookDebugValue {\n if (!events || typeof events !== 'object') 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\nfunction summarizeBaseOptions(options: unknown): HookDebugValue {\n if (!options || typeof options !== 'object') 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\nfunction 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<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>\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\n return { type: 'hook', phase: hook, reason, changes: changed };\n}\n\nfunction 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\nexport function buildSocketProvider<T extends EventMap, C extends SocketConnectionConfigOutput>(args: {\n events: T;\n options: Omit<BaseOptions<T, C>, 'debug'> & {\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 & { fallback?: React.ReactNode; destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']> }\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: Parameters<typeof useSocketConnection<T, K, C>>[0],\n ) => useSocketConnection<T, K, C>(p),\n };\n}\n\nfunction SocketProvider<T extends EventMap, C extends SocketConnectionConfigOutput>(props: SocketProviderProps<T, C>) {\n const { events, baseOptions, children, fallback, providerDebug, destroyLeaveMeta } = props;\n\n // Async sockets are resolved into this state.\n const [resolvedSocket, setResolvedSocket] = React.useState<Socket | null>(null);\n\n // Single source of truth for \"the socket we should use right now\".\n const socket: Socket | null = 'socket' in props ? props.socket ?? null : resolvedSocket;\n\n const providerDebugRef = React.useRef<SocketProviderDebugOptions | undefined>();\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, { type: 'resolve', phase: 'cancelled' });\n return;\n }\n if (!s) {\n dbg(providerDebugRef.current, { type: 'resolve', phase: 'socketMissing' });\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, { type: 'resolve', phase: 'error', err: String(err) });\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [resolvedSocket]);\n\n // Focus hook debug on high-signal data, not full objects\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, { type: 'client', phase: 'init', missing: true });\n return null;\n }\n const c = new SocketClient<T, C>(events, { ...baseOptions, socket });\n dbg(providerDebugRef.current, { type: 'client', phase: 'init', missing: false });\n return c;\n }, [events, baseOptions, socket]);\n\n // Keep latest destroyLeaveMeta in a ref so changing its identity does not\n // retrigger the destroy effect and cause repeated client.destroy() calls.\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(destroyLeaveMetaRef.current, 'destroyLeaveMeta'),\n },\n });\n\n return () => {\n if (client) {\n client.destroy(destroyLeaveMetaRef.current);\n dbg(providerDebugRef.current, { type: 'client', phase: 'destroy' });\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\nexport function useSocketClient<T extends EventMap, C extends SocketConnectionConfigOutput>(): SocketClient<T, C> {\n const ctx = React.useContext(SocketCtx);\n if (!ctx) throw new Error('SocketClient not found. Wrap with <SocketProvider>.');\n return ctx as unknown as SocketClient<T, C>;\n}\n\ntype Rooms = string[] | string | undefined;\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>; ctx: ClientCtx },\n ) => void;\n onCleanup?: () => void;\n autoJoin?: boolean;\n autoLeave?: boolean;\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n};\n\nexport function useSocketConnection<T extends EventMap, K extends keyof T & string, C extends SocketConnectionConfigOutput>(\n args: UseSocketConnectionArgs<T, K, C>,\n) {\n const { event, rooms, onMessage, onCleanup, autoJoin = true, autoLeave = true } = 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\n React.useEffect(() => {\n if (autoJoin && normalizedRooms.length > 0) client.joinRooms(normalizedRooms, args.joinMeta);\n const unsubscribe = client.on(event, onMessage);\n\n return () => {\n unsubscribe();\n if (autoLeave && normalizedRooms.length > 0) client.leaveRooms(normalizedRooms, args.leaveMeta);\n if (onCleanup) onCleanup();\n };\n }, [client, event, onMessage, autoJoin, autoLeave, ...normalizedRooms]);\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type {\n AnyLeaf,\n EventMap,\n InferOutput,\n Payload,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\nimport type {\n BuiltInfinite,\n BuiltQuery,\n DataShape,\n InfiniteUseEndpointResultFor,\n QueryUseEndpointResultFor,\n UseEndpointArgs,\n} from '../../routesV3.client.types';\nimport type { ClientCtx, ServerEnvelope, SocketClient } from '../socket.client.index';\n\ntype RoomsInput = string | string[] | undefined | null;\n\ntype SocketedBuilt<L extends AnyLeaf> = L['cfg']['feed'] extends true\n ? BuiltInfinite<L>\n : BuiltQuery<L>;\n\ntype SocketedRouteResult<L extends AnyLeaf> = (L['cfg']['feed'] extends true\n ? InfiniteUseEndpointResultFor<L>\n : QueryUseEndpointResultFor<L>) & { rooms: string[] };\n\nexport type SocketedRouteOptions<\n L extends AnyLeaf,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n> = {\n built: SocketedBuilt<L>;\n toRooms: (data: InferOutput<L>) => {\n rooms: RoomsInput;\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n };\n applySocket: {\n [K in keyof Events & string]?: (\n prev: DataShape<L> | undefined,\n payload: Payload<Events, K>,\n meta: { envelope: ServerEnvelope<Events, K>; ctx: ClientCtx },\n ) => DataShape<L> | undefined;\n };\n useSocketClient: () => SocketClient<Events, C>;\n};\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\ntype RoomState<C extends SocketConnectionConfigOutput> = {\n rooms: string[];\n joinMeta?: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta?: SocketSchemaOutput<C['leaveMetaMessage']>;\n};\n\nfunction mergeRoomState<L extends AnyLeaf, C extends SocketConnectionConfigOutput>(\n prev: RoomState<C>,\n toRoomsResult: ReturnType<SocketedRouteOptions<L, any, C>['toRooms']>,\n): 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\nfunction roomsFromData<L extends AnyLeaf, C extends SocketConnectionConfigOutput>(\n data: DataShape<L> | undefined,\n toRooms: SocketedRouteOptions<L, any, C>['toRooms'],\n): RoomState<C> {\n if (data == null) return { rooms: [] };\n\n let state: RoomState<C> = { rooms: [] };\n const add = (input: InferOutput<L>) => {\n state = mergeRoomState(state, toRooms(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\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 AnyLeaf,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(options: SocketedRouteOptions<L, Events, C>) {\n const { built, toRooms, applySocket, useSocketClient } = options;\n\n return (...useArgs: UseEndpointArgs<L>): SocketedRouteResult<L> => {\n const client = useSocketClient();\n const endpointResult = built.useEndpoint(...useArgs) as SocketedRouteResult<L>;\n const argsKey = useMemo(() => JSON.stringify(useArgs[0] ?? null), [useArgs]);\n\n const [roomState, setRoomState] = useState<RoomState<C>>(() =>\n roomsFromData(endpointResult.data as DataShape<L> | undefined, toRooms),\n );\n const roomsKey = useMemo(() => roomState.rooms.join('|'), [roomState.rooms]);\n const joinMetaKey = useMemo(() => JSON.stringify(roomState.joinMeta ?? null), [roomState.joinMeta]);\n const leaveMetaKey = useMemo(() => JSON.stringify(roomState.leaveMeta ?? null), [roomState.leaveMeta]);\n\n useEffect(() => {\n const unsubscribe = endpointResult.onReceive((data) => {\n setRoomState((prev) => mergeRoomState(prev, toRooms(data as InferOutput<L>)));\n });\n return unsubscribe;\n }, [endpointResult, toRooms]);\n\n useEffect(() => {\n setRoomState(roomsFromData(endpointResult.data as DataShape<L> | undefined, toRooms));\n }, [endpointResult.data, toRooms]);\n\n useEffect(() => {\n if (roomState.rooms.length === 0) return;\n const {joinMeta, leaveMeta} = roomState;\n if (!joinMeta || !leaveMeta) return;\n let active = true;\n (async () => {\n try {\n await client.joinRooms(roomState.rooms, joinMeta);\n } catch {\n // ignore join failures; hook should not throw\n }\n })();\n return () => {\n if (!active || roomState.rooms.length === 0) return;\n active = false;\n void client.leaveRooms(roomState.rooms, leaveMeta).catch(() => {});\n };\n }, [client, roomsKey, roomState.joinMeta, roomState.leaveMeta, joinMetaKey, leaveMetaKey]);\n\n useEffect(() => {\n const entries = Object.entries(applySocket).filter(\n ([_event, fn]) => typeof fn === 'function',\n ) as Array<\n [\n keyof Events & string,\n (\n prev: DataShape<L> | undefined,\n payload: Payload<Events, keyof Events & string>,\n meta: { envelope: ServerEnvelope<Events, keyof Events & string>; ctx: ClientCtx },\n ) => DataShape<L> | undefined\n ]\n >;\n\n const unsubscribes = entries.map(([ev, fn]) =>\n client.on(ev, (payload, meta) => {\n built.setData((prev) => {\n const next = fn(prev, payload as any, meta as any);\n setRoomState(roomsFromData(next as DataShape<L> | undefined, toRooms));\n return next;\n }, ...(useArgs as UseEndpointArgs<L>));\n }),\n );\n return () => unsubscribes.forEach((u) => u?.());\n }, [client, applySocket, built, argsKey, toRooms]);\n\n return { ...endpointResult, rooms: roomState.rooms };\n };\n}\n","// socket.client.index.ts\n\nimport type { ManagerOptions, Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n Payload,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\nimport type { MaybeSocket, RoomPayloadSchema, SysEventMap } from './socket.client.sys';\nimport { buildRoomPayloadSchema } from './socket.client.sys';\nimport { SocketClientDebugEvent, SocketClientConfigSnapshot } from './socket.client.debug';\n\n\nexport type ServerEnvelope<T extends EventMap, K extends keyof T & string> = {\n eventName: K;\n sentAt: string | Date;\n sentTo: string[];\n data?: Payload<T, K>;\n metadata?: Record<string, unknown>;\n};\n\nexport type ClientCtx = {\n receivedAt: Date;\n latencyMs?: number;\n nsp?: string;\n socketId?: string;\n rooms?: 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 config: C;\n environment?: 'development' | 'production';\n debug?: SocketClientDebugOptions<keyof T & string>;\n heartbeat?: HeartbeatClientOptions;\n sys: SysEventMap<T, C>;\n};\n\ntype HandlerEntry<T extends EventMap, K extends keyof T & string> = {\n orig: (payload: Payload<T, K>, meta: { envelope: ServerEnvelope<T, K>; ctx: ClientCtx }) => void;\n wrapped: (envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>) => void;\n errorWrapped: (e: unknown) => void;\n};\n\nexport class SocketClient<T extends EventMap, C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput> {\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(socket: MaybeSocket): SocketClientConfigSnapshot | null {\n if (!socket) return null;\n const manager = (socket.io ?? 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' ? manager.engine.transport?.name : undefined;\n const readyState = 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: typeof opts.autoConnect === 'boolean' ? opts.autoConnect : undefined,\n reconnection: typeof opts.reconnection === 'boolean' ? opts.reconnection : undefined,\n reconnectionAttempts:\n typeof opts.reconnectionAttempts === 'number' ? opts.reconnectionAttempts : undefined,\n reconnectionDelay:\n typeof opts.reconnectionDelay === 'number' ? opts.reconnectionDelay : undefined,\n reconnectionDelayMax:\n typeof opts.reconnectionDelayMax === 'number' ? opts.reconnectionDelayMax : undefined,\n timeout: typeof opts.timeout === 'number' ? opts.timeout : undefined,\n hostname: typeof opts.hostname === 'string' ? opts.hostname : undefined,\n port: typeof opts.port === 'number' || typeof opts.port === 'string' ? opts.port : 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(error: z.ZodError<any>): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined;\n return { issues: error.issues };\n }\n\n private getVerboseDetails(details: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined;\n return details;\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 = async() => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'connect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onConnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot('connect_event');\n await this.getSysEvent('sys:connect')({\n socket: this.socket,\n client: this,\n });\n };\n\n this.onReconnect = async (attempt) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'reconnect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onReconnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n attempt,\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot('reconnect_event');\n await this.getSysEvent('sys:reconnect')({\n attempt,\n socket: this.socket,\n client: this,\n });\n };\n\n this.onDisconnect = async (reason) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'disconnect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onDisconnect handler');\n }\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 await this.getSysEvent('sys:disconnect')({\n reason: String(reason),\n socket: this.socket,\n client: this,\n });\n };\n\n this.onConnectError = async (err) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'connect_error_event', err: 'Socket is null' });\n throw new Error('Socket is null in onConnectError handler');\n }\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 await this.getSysEvent('sys:connect_error')({\n error: String(err),\n socket: this.socket,\n client: this,\n });\n };\n\n this.onPong =async (raw: unknown) => {\n if (!this.socket) {\n this.dbg({ type: 'heartbeat', phase: 'pong_recv', err: 'Socket is null' });\n throw new Error('Socket is null in onPong handler');\n }\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 await this.getSysEvent('sys:pong')({\n socket: this.socket,\n payload: validated as SocketSchemaOutput<(typeof this.config)['pongPayload']>,\n client: this,\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>>(name: K): 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 d.logger(e);\n }\n\n /** internal stats snapshot */\n stats(): ClientStatsSnapshot {\n const rooms = Array.from(this.roomCounts.entries()).map(([room, count]) => ({ room, count }));\n const handlers = Array.from(this.handlerMap.entries()).map(([event, set]) => ({\n event,\n handlers: set.size,\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('[socket] ping schema validation failed', check.error.issues);\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 this.hbTimer = setInterval(tick, this.hb.intervalMs);\n tick();\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(rooms: string[] | string, meta: SocketSchemaOutput<C['joinMetaMessage']>):Promise<()=> Promise<void>> {\n if (!this.socket) {\n this.dbg({ type: 'room', phase: 'join', rooms: this.toArray(rooms), err: 'Socket is null' });\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(rooms: string[] | string, meta: SocketSchemaOutput<C['leaveMetaMessage']>): Promise<void> {\n if (!this.socket) {\n this.dbg({ type: 'room', phase: 'leave', rooms: this.toArray(rooms), err: 'Socket is null' });\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: (payload: Payload<T, K>, meta: { envelope: ServerEnvelope<T, K>; ctx: ClientCtx }) => 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({ type: 'register', phase: 'register', event, err: 'Socket is null' });\n return () => {};\n }\n\n const socket = this.socket;\n\n const wrapped = (envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>) => {\n const maybeEnvelope = envelopeOrRaw as any;\n const rawData = maybeEnvelope?.data ?? maybeEnvelope;\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\n const receivedAt = new Date();\n const sentAt = maybeEnvelope?.sentAt ? new Date(maybeEnvelope.sentAt) : undefined;\n\n const meta = {\n envelope: {\n eventName: (maybeEnvelope?.eventName ?? event) as K,\n sentAt: maybeEnvelope?.sentAt ?? receivedAt.toISOString(),\n sentTo: maybeEnvelope?.sentTo ?? [],\n data: undefined,\n metadata: maybeEnvelope?.metadata,\n },\n ctx: {\n receivedAt,\n latencyMs: sentAt ? Math.max(0, receivedAt.getTime() - sentAt.getTime()) : undefined,\n nsp: this.getNamespace(socket),\n socketId: socket.id,\n socket,\n },\n } as const;\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 handler(parsed.data as any, meta as any);\n };\n\n const errorWrapped = (e: unknown) => {\n this.dbg({ type: 'receive', event, err: String(e) });\n };\n\n socket.on(String(event), wrapped);\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> = { orig: handler, wrapped, errorWrapped };\n set.add(entry);\n\n return () => {\n socket.off(String(event), wrapped);\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(leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>): 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 \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\nexport * from './socket.client.context';\nexport * from './socket.client.sys';\nexport * from './socketedRoute/socket.client.helper';\n"],"mappings":"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","names":["useEndpoint","import_zod","import_react","useSocketClient"]}
package/dist/index.mjs CHANGED
@@ -775,7 +775,7 @@ function roomsFromData(data, toRooms) {
775
775
  return state;
776
776
  }
777
777
  function buildSocketedRoute(options) {
778
- const { built, toRooms, applyMessage, useSocketClient: useSocketClient2 } = options;
778
+ const { built, toRooms, applySocket, useSocketClient: useSocketClient2 } = options;
779
779
  return (...useArgs) => {
780
780
  const client = useSocketClient2();
781
781
  const endpointResult = built.useEndpoint(...useArgs);
@@ -814,7 +814,7 @@ function buildSocketedRoute(options) {
814
814
  };
815
815
  }, [client, roomsKey, roomState.joinMeta, roomState.leaveMeta, joinMetaKey, leaveMetaKey]);
816
816
  useEffect2(() => {
817
- const entries = Object.entries(applyMessage).filter(
817
+ const entries = Object.entries(applySocket).filter(
818
818
  ([_event, fn]) => typeof fn === "function"
819
819
  );
820
820
  const unsubscribes = entries.map(
@@ -827,7 +827,7 @@ function buildSocketedRoute(options) {
827
827
  })
828
828
  );
829
829
  return () => unsubscribes.forEach((u) => u?.());
830
- }, [client, applyMessage, built, argsKey, toRooms]);
830
+ }, [client, applySocket, built, argsKey, toRooms]);
831
831
  return { ...endpointResult, rooms: roomState.rooms };
832
832
  };
833
833
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/routesV3.client.fetch.ts","../src/routesV3.client.index.ts","../src/sockets/socket.client.sys.ts","../src/sockets/socket.client.context.tsx","../src/sockets/socketedRoute/socket.client.helper.ts","../src/sockets/socket.client.index.ts"],"sourcesContent":["// routesV3.client.fetch.ts\n\nimport { Fetcher, FetchInput } from './routesV3.client.types';\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>(req: FetchInput): Promise<T> => {\n const headers: Record<string, string> = { ...(req.headers ?? {}) };\n const isFormData = 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 ? (req.body as any) : req.body == null ? undefined : JSON.stringify(req.body),\n });\n\n const text = await res.text();\n if (!res.ok) {\n const snippet = text.slice(0, 400);\n throw new Error(`[${res.status}] ${res.statusText} — ${snippet}`);\n }\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n};\n","// routesV3.client.ts\nimport { useCallback, useRef } from 'react';\nimport {\n keepPreviousData,\n useInfiniteQuery,\n useMutation,\n useQuery,\n type InfiniteData,\n type QueryKey,\n} from '@tanstack/react-query';\nimport { z, type ZodType } from 'zod';\nimport {\n HttpMethod,\n buildCacheKey,\n compilePath,\n} from '@emeryld/rrroutes-contract';\nimport type {\n AnyLeaf,\n InferBody,\n InferOutput,\n InferParams,\n InferQuery,\n Prettify,\n} from '@emeryld/rrroutes-contract';\nimport { defaultFetcher } from './routesV3.client.fetch';\nimport type {\n ArgsFor,\n ArgsTuple,\n BuildMeta,\n BuiltForLeaf,\n BuiltInfinite,\n BuiltMutation,\n BuiltQuery,\n BuildOptionsFor,\n Cursor,\n DataShape,\n InfiniteBuildOptionsFor,\n MutationBuildOptionsFor,\n QueryKeysFor,\n QueryBuildOptionsFor,\n RouteClient,\n RouteClientOptions,\n RouteClientDebugEvent,\n RouteClientDebugLogger,\n RouteClientDebugMode,\n RouteClientDebugOptions,\n RouteClientDebugToggleOptions,\n Updater,\n RouterBuilder,\n} from './routesV3.client.types';\n\n// -------------------------------------------------------------------------------------\n// Tiny helpers\n// -------------------------------------------------------------------------------------\n/**\n * Convert an HTTP method to uppercase (as expected by fetch).\n * @param m Lowercase HTTP method.\n * @returns Uppercase method string.\n */\nconst toUpper = (m: HttpMethod): Uppercase<HttpMethod> => m.toUpperCase() as Uppercase<HttpMethod>;\n\nconst defaultFeedQuerySchema = z.object({\n cursor: z.string().optional(),\n limit: z.coerce.number().min(1).max(100).default(20),\n});\n\nconst defaultFeedOutputSchema = z.object({\n items: z.array(z.unknown()),\n nextCursor: z.string().optional(),\n});\n\n/**\n * Parse the given value with the supplied schema (if present).\n * @param value Raw value to validate.\n * @param schema Optional Zod schema used for validation/coercion.\n * @returns The validated or original value.\n */\nfunction zParse<T>(value: unknown, schema?: ZodType): T {\n return schema ? (schema.parse(value) as T) : (value as T);\n}\n\n/**\n * Serialize a query object into a search string.\n * @param query Query params object (possibly undefined).\n * @returns Query string prefixed with `?`, or empty string.\n */\nfunction 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 == null) continue;\n if (Array.isArray(v)) {\n v.forEach((x) => {\n if (x == null) return;\n if (typeof x === 'object') {\n params.append(k, JSON.stringify(x));\n } else {\n params.append(k, String(x));\n }\n });\n continue;\n }\n if (typeof v === 'object') {\n params.set(k, JSON.stringify(v));\n continue;\n }\n params.set(k, String(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 * @param obj Source object.\n * @param key Property name to omit.\n * @returns Copy of the object without the specified key.\n */\nfunction stripKey<Q extends Record<string, unknown> | undefined>(obj: Q, key: string): 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 * @param p Page result returned from the server.\n * @returns Next cursor string, if present.\n */\nconst defaultGetNextCursor = (p: unknown): Cursor =>\n p && typeof p === 'object' && 'nextCursor' in p ? (p as any).nextCursor : undefined;\n\n// Debug logging --------------------------------------------------------------\nconst noopDebugLogger: RouteClientDebugLogger = () => {};\n\nconst defaultDebugLogger: RouteClientDebugLogger = (event: RouteClientDebugEvent) => {\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) => defaultDebugLogger(name ? { ...event, name } : event),\n mode: 'minimal',\n };\n }\n if (option === 'complete') {\n return {\n emit: (event, name) => 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 ? new Set<Names>(toggles.only) : 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// Split the variadic tuple at runtime\n/**\n * Extract the optional argument object from a variadic tuple.\n * @param args Tuple passed to a built endpoint helper.\n * @returns The argument object if present.\n */\nfunction extractArgs<L extends AnyLeaf>(args: ArgsTuple<L>): ArgsFor<L> | undefined {\n return (args as unknown as any[])[0] as any;\n}\n\nfunction toArgsTuple<L extends AnyLeaf>(args: ArgsFor<L> | undefined): ArgsTuple<L> {\n return (typeof args === 'undefined' ? [] : [args]) as ArgsTuple<L>;\n}\n\nfunction augmentFeedQuerySchema(schema: ZodType | undefined) {\n if (!schema) return defaultFeedQuerySchema;\n if (schema instanceof z.ZodObject) {\n const shape = (schema as any).shape ? (schema as any).shape : (schema as any)._def?.shape?.();\n return schema.extend({\n ...(shape ?? {}),\n cursor: defaultFeedQuerySchema.shape.cursor,\n limit: defaultFeedQuerySchema.shape.limit,\n });\n }\n return z.intersection(schema, defaultFeedQuerySchema);\n}\n\nfunction augmentFeedOutputSchema(schema: ZodType | undefined) {\n if (!schema) return defaultFeedOutputSchema;\n if (schema instanceof z.ZodObject) {\n const shape = (schema as any).shape ? (schema as any).shape : (schema as any)._def?.shape?.();\n const hasItems = Boolean(shape?.items);\n if (hasItems) return schema.extend({ nextCursor: z.string().optional() });\n return z.object({\n items: z.array(schema as ZodType),\n nextCursor: z.string().optional(),\n });\n }\n if (schema instanceof z.ZodArray) {\n return z.object({\n items: schema,\n nextCursor: z.string().optional(),\n });\n }\n return defaultFeedOutputSchema;\n}\n\n/**\n * Normalize params and query values, then construct a request URL for the given leaf.\n * @param leaf Leaf describing the endpoint.\n * @param baseUrl Optional base URL prepended to the path.\n * @param params Route parameters supplied by the caller.\n * @param query Query parameters supplied by the caller.\n * @returns Object containing the composed URL plus normalized params/query payloads.\n */\nfunction buildUrl<L extends AnyLeaf>(\n leaf: L,\n baseUrl: string,\n params: InferParams<L> | undefined,\n query: InferQuery<L> | undefined,\n) {\n const normalizedParams = zParse<InferParams<L>>(params, leaf.cfg.paramsSchema);\n const normalizedQuery = zParse<InferQuery<L>>(query, leaf.cfg.querySchema);\n const path = compilePath<L['path']>(leaf.path, (normalizedParams ?? {}) as any);\n const url = `${baseUrl ?? ''}${path}${toSearchString(normalizedQuery as any)}`;\n return { url, normalizedQuery, normalizedParams };\n}\n\n// -------------------------------------------------------------------------------------\n// Client factory\n// -------------------------------------------------------------------------------------\n/**\n * Construct typed React Query helpers backed by a routes-v3 registry leaf.\n * @param opts Route client configuration (query client, fetcher overrides, etc).\n * @returns Object that can build endpoint hooks/mutations from leaves.\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 cursorParam = opts.cursorParam ?? 'cursor';\n const getNextCursor = opts.getNextCursor ?? defaultGetNextCursor;\n const environment =\n opts.environment ?? undefined;\n const { emit: emitDebug, mode: debugMode } = createDebugEmitter<Names>(opts.debug, environment);\n const isVerboseDebug = debugMode === 'complete';\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 /**\n * Invalidate a set of queries sharing the given prefix.\n * @param prefix Key parts shared by matching endpoints.\n * @param exact When true, invalidate only exact key matches.\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 /**\n * Build the client surface for a single leaf (query/mutation/infinite query).\n * @param leaf Leaf describing the endpoint.\n * @param rqOpts Optional React Query configuration.\n * @returns Helper object exposing getQueryKeys/invalidate/setData/useEndpoint/fetch.\n */\n function buildInternal<L extends AnyLeaf>(\n leaf: L,\n rqOpts?: QueryBuildOptionsFor<L> | InfiniteBuildOptionsFor<L> | MutationBuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ): BuiltForLeaf<L> {\n const isGet = leaf.method === 'get';\n const isFeed = !!leaf.cfg.feed;\n const leafCfg = isFeed\n ? {\n ...leaf.cfg,\n querySchema: augmentFeedQuerySchema(leaf.cfg.querySchema),\n outputSchema: augmentFeedOutputSchema(leaf.cfg.outputSchema),\n }\n : leaf.cfg;\n const method = toUpper(leaf.method);\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema);\n const leafLabel = `${leaf.method.toUpperCase()} ${String(leaf.path)}`;\n const debugName = meta?.name;\n const emit = (event: RouteClientDebugEvent) => emitDebug(event, debugName);\n emit({ type: 'build', leaf: leafLabel });\n\n // --- key/invalidate/setData shared helpers ---\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 = isGet && isFeed ? stripKey(query as any, cursorParam) : (query as any);\n return buildCacheKey({\n leaf,\n params: params as any,\n query: qForKey,\n }) as unknown as QueryKeysFor<L, A>;\n };\n\n /**\n * Invalidate the React Query cache for this exact leaf invocation.\n * @param tuple Optional params/query tuple.\n */\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple);\n await queryClient.invalidateQueries({ queryKey, exact: true });\n emit({ type: 'invalidate', key: queryKey, exact: true });\n };\n\n /**\n * Update the cache entries for this leaf.\n * @param args Tuple whose first entry is the updater and optional params/query follow.\n */\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args;\n const k = getQueryKeys(...(rest as ArgsTuple<L>));\n let next: InferOutput<L> | InfiniteData<InferOutput<L>> | undefined;\n if (isGet && isFeed) {\n next = queryClient.setQueryData<InfiniteData<InferOutput<L>> | undefined>(\n k,\n (prev) => (typeof updater === 'function' ? (updater as any)(prev) : (updater as any)),\n ) as any;\n } else {\n next = queryClient.setQueryData<InferOutput<L> | undefined>(\n k,\n (prev) => (typeof updater === 'function' ? (updater as any)(prev) : (updater as any)),\n ) as any;\n }\n emit({ type: 'setData', key: k });\n return next as any;\n };\n\n const buildOnReceive = (\n rqOpts as { onReceive?: ((data: InferOutput<L>) => void) | undefined } | undefined\n )?.onReceive;\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>;\n body?: InferBody<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 options?.queryOverride ?? ((a as any)?.query as InferQuery<L> | undefined);\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n );\n\n let payload: InferBody<L> | FormData | undefined;\n const acceptsBody = Boolean(leafCfg.bodySchema);\n const requiresBody = options?.requireBody ?? (!isGet && acceptsBody);\n if (typeof options?.body !== 'undefined') {\n const normalizedBody = zParse<InferBody<L>>(options.body, leafCfg.bodySchema);\n const isMultipart = Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0;\n payload = isMultipart ? toFormData(normalizedBody as any) : normalizedBody;\n } else if (requiresBody) {\n throw new Error('Body is required when invoking a mutation fetch.');\n }\n\n const startedAt = Date.now();\n const detail = isVerboseDebug ? { params: normalizedParams, query: normalizedQuery } : undefined;\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 try {\n const out = await fetcher<unknown>(\n payload === undefined ? { url, method } : { url, method, body: payload },\n );\n const parsed = zParse<InferOutput<L>>(out, leafCfg.outputSchema);\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'success',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug ? { params: normalizedParams, query: normalizedQuery, output: parsed } : undefined,\n ),\n );\n\n options?.onReceive?.(parsed);\n return parsed;\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 = (\n ...tupleWithBody: InferBody<L> extends never ? ArgsTuple<L> : [...ArgsTuple<L>, InferBody<L>]\n ): Promise<InferOutput<L>> => {\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 InferBody<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, { body, onReceive: buildOnReceive, requireBody: false });\n };\n\n // --- Infinite GET ---\n if (isGet && isFeed) {\n const useEndpoint: BuiltInfinite<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'infiniteGet' });\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 = (rqOpts ?? {}) as InfiniteBuildOptionsFor<L>;\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>());\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOptions?.onReceive?.(data);\n listenersRef.current.forEach((listener) => listener(data));\n },\n [],\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 // Normalize once; we’ll inject the cursor per page below.\n const { normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n );\n const queryResult = useInfiniteQuery<\n InferOutput<L>,\n unknown,\n InfiniteData<InferOutput<L>>,\n QueryKey,\n Cursor\n >({\n ...buildOptions,\n queryKey: getQueryKeys(...tuple),\n initialPageParam: undefined,\n getNextPageParam: (lastPage) => getNextCursor(lastPage),\n placeholderData: keepPreviousData,\n queryFn: ({ pageParam }) => {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [cursorParam]: pageParam } : {}),\n };\n return fetchEndpoint(tuple, {\n queryOverride: pageQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n });\n },\n // NOTE: TData is InfiniteData<T>, so we don't need a select here.\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n // --- Plain GET ---\n if (isGet) {\n const useEndpoint: BuiltQuery<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'get' });\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 = (rqOpts ?? {}) as QueryBuildOptionsFor<L>;\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>());\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOptions?.onReceive?.(data);\n listenersRef.current.forEach((listener) => listener(data));\n },\n [],\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 buildUrl({ ...leaf, cfg: leafCfg } as L, baseUrl, params, query);\n const queryResult = useQuery<InferOutput<L>, unknown, InferOutput<L>, QueryKey>({\n ...buildOptions,\n queryKey: getQueryKeys(...tuple),\n placeholderData: keepPreviousData,\n queryFn: () =>\n fetchEndpoint(tuple, {\n onReceive: notifyOnReceive,\n }),\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n\n // --- Mutation (POST/PUT/PATCH/DELETE) ---\n const mutationBuildOptions = (rqOpts ?? {}) as MutationBuildOptionsFor<L>;\n const fetchMutation: BuiltMutation<L>['fetch'] = async (\n ...tupleWithBody: Prettify<[...ArgsTuple<L>, InferBody<L>]>\n ) => {\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 InferBody<L>;\n const result = await fetchEndpoint(tuple, {\n body,\n onReceive: (data) => mutationBuildOptions?.onReceive?.(data),\n requireBody: true,\n });\n\n return result;\n };\n\n const useEndpoint: BuiltMutation<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'mutation' });\n const tuple = toArgsTuple(args);\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((listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener);\n return () => {\n listenersRef.current.delete(listener);\n };\n }, []);\n\n const mutationResult = useMutation<InferOutput<L>, unknown, InferBody<L>, unknown>({\n ...mutationBuildOptions,\n mutationKey: getQueryKeys(...tuple),\n mutationFn: async (body: InferBody<L>) => {\n const result = await fetchMutation(...([...tuple, body] as [...ArgsTuple<L>, InferBody<L>]));\n notifyListeners(result);\n return result;\n },\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n\n return {\n queryClient,\n invalidate,\n build: buildInternal as RouteClient<Names>['build'],\n };\n}\n\n/**\n * Curry a route client with a registry of leaves so callers can build endpoints by name.\n * @param routeClient The route client instance created via `createRouteClient`.\n * @param routes Object map of named leaves (e.g., a registry’s `byKey` or a curated subset).\n * @returns Function that builds endpoints by supplying the route name instead of the leaf itself.\n */\nexport function buildRouter<\n Routes extends Record<PropertyKey, AnyLeaf>,\n Names extends string = string,\n>(routeClient: RouteClient<Names>, routes: Routes): RouterBuilder<Routes, Names> {\n const buildLeaf = routeClient.build as <L extends AnyLeaf>(\n leaf: L,\n options?: BuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ) => BuiltForLeaf<L>;\n\n return ((key, opts, meta) =>\n buildLeaf(routes[key], opts as BuildOptionsFor<Routes[typeof key]>, meta)) as RouterBuilder<\n Routes,\n Names\n >;\n}\n\n// -------------------------------------------------------------------------------------\n// Multipart helper\n// -------------------------------------------------------------------------------------\nfunction toFormData(body: Record<string, any>): FormData {\n const fd = new FormData();\n for (const [k, v] of Object.entries(body ?? {})) {\n if (v == null) continue;\n if (Array.isArray(v)) v.forEach((item, i) => fd.append(`${k}[${i}]`, item as any));\n else fd.append(k, v as any);\n }\n return fd;\n}\n","// socket.client.sys.ts\n\nimport type { Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n SysEventName,\n} from '@emeryld/rrroutes-contract';\nimport { SocketClient } from './socket.client.index';\n\nexport type MaybeSocket = Socket | null;\n\nexport type SysEventMap<T extends EventMap, C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput> = {\n 'sys:connect': (args: { socket: Socket; client: SocketClient<T, C> }) => Promise<void> | void;\n 'sys:disconnect': (args: { socket: Socket; client: SocketClient<T, C>; reason: string }) => Promise<void> | void;\n 'sys:reconnect': (args: { socket: Socket; attempt: number; client: SocketClient<T, C> }) => Promise<void> | void;\n 'sys:connect_error': (args: { socket: Socket; client: SocketClient<T, C>; error: string }) => Promise<void> | void;\n 'sys:ping': (args: {\n socket: Socket;\n client: SocketClient<T, C>;\n }) => Promise<SocketSchemaOutput<C['pingPayload']>> | SocketSchemaOutput<C['pingPayload']>;\n 'sys:pong': (args: {\n socket: Socket;\n client: SocketClient<T, C>;\n payload: SocketSchemaOutput<C['pongPayload']>;\n }) => Promise<void> | void;\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 '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>(metaSchema: Meta): RoomPayloadSchema<Meta> =>\n z.object({\n rooms: roomValueSchema,\n meta: metaSchema,\n });\n","// socket.client.context.tsx\n\nimport * as React from 'react';\nimport { Socket } from 'socket.io-client';\nimport {\n SocketClient,\n SocketClientOptions,\n ClientCtx,\n ServerEnvelope,\n} from './socket.client.index';\nimport {\n EventMap,\n SocketConnectionConfigOutput,\n Payload,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\n\n/** === Provider-side debug === */\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<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>;\n };\n\nexport type SocketProviderDebugOptions = {\n verbose?: boolean;\n logger?: (e: SocketProviderDebugEvent) => void;\n} & {\n [P in SocketProviderDebugEvent['type']]?: boolean;\n};\n\n/** === Types for runtime socket injection === */\ntype BaseOptions<T extends EventMap, C extends SocketConnectionConfigOutput> = Omit<\n SocketClientOptions<T, C>,\n 'socket'\n>;\n\ntype ProviderRuntimeSocket =\n | { socket: Socket | null }\n | { getSocket: () => Socket | Promise<Socket> };\n\ntype SocketProviderProps<T extends EventMap, C extends SocketConnectionConfigOutput> = React.PropsWithChildren<{\n events: T;\n baseOptions: BaseOptions<T, C>;\n /** show while waiting for async socket; should not use the socket context */\n fallback?: React.ReactNode;\n providerDebug?: SocketProviderDebugOptions;\n destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n} & ProviderRuntimeSocket>;\n\nconst SocketCtx = React.createContext<SocketClient<any, SocketConnectionConfigOutput> | null>(null);\n\nfunction dbg(dbgOpts: SocketProviderDebugOptions | undefined, e: SocketProviderDebugEvent) {\n if (!dbgOpts?.logger) return;\n if (!dbgOpts[e.type]) return;\n dbgOpts.logger(e);\n}\n\ntype HookDebugSnapshot = Record<string, unknown>;\ntype HookIdentifier = Extract<SocketProviderDebugEvent, { type: 'hook' }>['phase'];\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 // Fallback heuristic for socket.io client instances\n return (\n ('connected' in anyVal || 'recovered' in anyVal) &&\n typeof anyVal.on === 'function' &&\n typeof anyVal.emit === 'function'\n );\n}\n\nfunction describeSocketLike(value: { id?: string; connected?: boolean; recovered?: boolean } | null): HookDebugValue {\n if (!value) return null;\n const id = value.id ?? 'unknown';\n const connected = value.connected ?? false;\n const recovered = 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 (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n return value as HookDebugValue;\n }\n if (valueType === 'bigint' || valueType === 'symbol') return String(value);\n if (valueType === 'function') return `[function ${(value as Function).name || 'anonymous'}]`;\n if (Array.isArray(value)) return `[array length=${value.length}]`;\n\n if (isProbablySocket(value)) {\n return describeSocketLike(value);\n }\n\n const ctorName = (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\nfunction summarizeEvents(events: unknown): HookDebugValue {\n if (!events || typeof events !== 'object') 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\nfunction summarizeBaseOptions(options: unknown): HookDebugValue {\n if (!options || typeof options !== 'object') 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\nfunction 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<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>\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\n return { type: 'hook', phase: hook, reason, changes: changed };\n}\n\nfunction 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\nexport function buildSocketProvider<T extends EventMap, C extends SocketConnectionConfigOutput>(args: {\n events: T;\n options: Omit<BaseOptions<T, C>, 'debug'> & {\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 & { fallback?: React.ReactNode; destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']> }\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: Parameters<typeof useSocketConnection<T, K, C>>[0],\n ) => useSocketConnection<T, K, C>(p),\n };\n}\n\nfunction SocketProvider<T extends EventMap, C extends SocketConnectionConfigOutput>(props: SocketProviderProps<T, C>) {\n const { events, baseOptions, children, fallback, providerDebug, destroyLeaveMeta } = props;\n\n // Async sockets are resolved into this state.\n const [resolvedSocket, setResolvedSocket] = React.useState<Socket | null>(null);\n\n // Single source of truth for \"the socket we should use right now\".\n const socket: Socket | null = 'socket' in props ? props.socket ?? null : resolvedSocket;\n\n const providerDebugRef = React.useRef<SocketProviderDebugOptions | undefined>();\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, { type: 'resolve', phase: 'cancelled' });\n return;\n }\n if (!s) {\n dbg(providerDebugRef.current, { type: 'resolve', phase: 'socketMissing' });\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, { type: 'resolve', phase: 'error', err: String(err) });\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [resolvedSocket]);\n\n // Focus hook debug on high-signal data, not full objects\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, { type: 'client', phase: 'init', missing: true });\n return null;\n }\n const c = new SocketClient<T, C>(events, { ...baseOptions, socket });\n dbg(providerDebugRef.current, { type: 'client', phase: 'init', missing: false });\n return c;\n }, [events, baseOptions, socket]);\n\n // Keep latest destroyLeaveMeta in a ref so changing its identity does not\n // retrigger the destroy effect and cause repeated client.destroy() calls.\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(destroyLeaveMetaRef.current, 'destroyLeaveMeta'),\n },\n });\n\n return () => {\n if (client) {\n client.destroy(destroyLeaveMetaRef.current);\n dbg(providerDebugRef.current, { type: 'client', phase: 'destroy' });\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\nexport function useSocketClient<T extends EventMap, C extends SocketConnectionConfigOutput>(): SocketClient<T, C> {\n const ctx = React.useContext(SocketCtx);\n if (!ctx) throw new Error('SocketClient not found. Wrap with <SocketProvider>.');\n return ctx as unknown as SocketClient<T, C>;\n}\n\ntype Rooms = string[] | string | undefined;\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>; ctx: ClientCtx },\n ) => void;\n onCleanup?: () => void;\n autoJoin?: boolean;\n autoLeave?: boolean;\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n};\n\nexport function useSocketConnection<T extends EventMap, K extends keyof T & string, C extends SocketConnectionConfigOutput>(\n args: UseSocketConnectionArgs<T, K, C>,\n) {\n const { event, rooms, onMessage, onCleanup, autoJoin = true, autoLeave = true } = 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\n React.useEffect(() => {\n if (autoJoin && normalizedRooms.length > 0) client.joinRooms(normalizedRooms, args.joinMeta);\n const unsubscribe = client.on(event, onMessage);\n\n return () => {\n unsubscribe();\n if (autoLeave && normalizedRooms.length > 0) client.leaveRooms(normalizedRooms, args.leaveMeta);\n if (onCleanup) onCleanup();\n };\n }, [client, event, onMessage, autoJoin, autoLeave, ...normalizedRooms]);\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type {\n AnyLeaf,\n EventMap,\n InferOutput,\n Payload,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\nimport type {\n BuiltInfinite,\n BuiltQuery,\n DataShape,\n InfiniteUseEndpointResultFor,\n QueryUseEndpointResultFor,\n UseEndpointArgs,\n} from '../../routesV3.client.types';\nimport type { ClientCtx, ServerEnvelope, SocketClient } from '../socket.client.index';\n\ntype RoomsInput = string | string[] | undefined | null;\n\ntype SocketedBuilt<L extends AnyLeaf> = L['cfg']['feed'] extends true\n ? BuiltInfinite<L>\n : BuiltQuery<L>;\n\ntype SocketedRouteResult<L extends AnyLeaf> = (L['cfg']['feed'] extends true\n ? InfiniteUseEndpointResultFor<L>\n : QueryUseEndpointResultFor<L>) & { rooms: string[] };\n\nexport type SocketedRouteOptions<\n L extends AnyLeaf,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n> = {\n built: SocketedBuilt<L>;\n toRooms: (data: InferOutput<L>) => {\n rooms: RoomsInput;\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n };\n applyMessage: {\n [K in keyof Events & string]?: (\n prev: DataShape<L> | undefined,\n payload: Payload<Events, K>,\n meta: { envelope: ServerEnvelope<Events, K>; ctx: ClientCtx },\n ) => DataShape<L> | undefined;\n };\n useSocketClient: () => SocketClient<Events, C>;\n};\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\ntype RoomState<C extends SocketConnectionConfigOutput> = {\n rooms: string[];\n joinMeta?: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta?: SocketSchemaOutput<C['leaveMetaMessage']>;\n};\n\nfunction mergeRoomState<L extends AnyLeaf, C extends SocketConnectionConfigOutput>(\n prev: RoomState<C>,\n toRoomsResult: ReturnType<SocketedRouteOptions<L, any, C>['toRooms']>,\n): 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\nfunction roomsFromData<L extends AnyLeaf, C extends SocketConnectionConfigOutput>(\n data: DataShape<L> | undefined,\n toRooms: SocketedRouteOptions<L, any, C>['toRooms'],\n): RoomState<C> {\n if (data == null) return { rooms: [] };\n\n let state: RoomState<C> = { rooms: [] };\n const add = (input: InferOutput<L>) => {\n state = mergeRoomState(state, toRooms(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\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 AnyLeaf,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(options: SocketedRouteOptions<L, Events, C>) {\n const { built, toRooms, applyMessage, useSocketClient } = options;\n\n return (...useArgs: UseEndpointArgs<L>): SocketedRouteResult<L> => {\n const client = useSocketClient();\n const endpointResult = built.useEndpoint(...useArgs) as SocketedRouteResult<L>;\n const argsKey = useMemo(() => JSON.stringify(useArgs[0] ?? null), [useArgs]);\n\n const [roomState, setRoomState] = useState<RoomState<C>>(() =>\n roomsFromData(endpointResult.data as DataShape<L> | undefined, toRooms),\n );\n const roomsKey = useMemo(() => roomState.rooms.join('|'), [roomState.rooms]);\n const joinMetaKey = useMemo(() => JSON.stringify(roomState.joinMeta ?? null), [roomState.joinMeta]);\n const leaveMetaKey = useMemo(() => JSON.stringify(roomState.leaveMeta ?? null), [roomState.leaveMeta]);\n\n useEffect(() => {\n const unsubscribe = endpointResult.onReceive((data) => {\n setRoomState((prev) => mergeRoomState(prev, toRooms(data as InferOutput<L>)));\n });\n return unsubscribe;\n }, [endpointResult, toRooms]);\n\n useEffect(() => {\n setRoomState(roomsFromData(endpointResult.data as DataShape<L> | undefined, toRooms));\n }, [endpointResult.data, toRooms]);\n\n useEffect(() => {\n if (roomState.rooms.length === 0) return;\n const {joinMeta, leaveMeta} = roomState;\n if (!joinMeta || !leaveMeta) return;\n let active = true;\n (async () => {\n try {\n await client.joinRooms(roomState.rooms, joinMeta);\n } catch {\n // ignore join failures; hook should not throw\n }\n })();\n return () => {\n if (!active || roomState.rooms.length === 0) return;\n active = false;\n void client.leaveRooms(roomState.rooms, leaveMeta).catch(() => {});\n };\n }, [client, roomsKey, roomState.joinMeta, roomState.leaveMeta, joinMetaKey, leaveMetaKey]);\n\n useEffect(() => {\n const entries = Object.entries(applyMessage).filter(\n ([_event, fn]) => typeof fn === 'function',\n ) as Array<\n [\n keyof Events & string,\n (\n prev: DataShape<L> | undefined,\n payload: Payload<Events, keyof Events & string>,\n meta: { envelope: ServerEnvelope<Events, keyof Events & string>; ctx: ClientCtx },\n ) => DataShape<L> | undefined\n ]\n >;\n\n const unsubscribes = entries.map(([ev, fn]) =>\n client.on(ev, (payload, meta) => {\n built.setData((prev) => {\n const next = fn(prev, payload as any, meta as any);\n setRoomState(roomsFromData(next as DataShape<L> | undefined, toRooms));\n return next;\n }, ...(useArgs as UseEndpointArgs<L>));\n }),\n );\n return () => unsubscribes.forEach((u) => u?.());\n }, [client, applyMessage, built, argsKey, toRooms]);\n\n return { ...endpointResult, rooms: roomState.rooms };\n };\n}\n","// socket.client.index.ts\n\nimport type { ManagerOptions, Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n Payload,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\nimport type { MaybeSocket, RoomPayloadSchema, SysEventMap } from './socket.client.sys';\nimport { buildRoomPayloadSchema } from './socket.client.sys';\nimport { SocketClientDebugEvent, SocketClientConfigSnapshot } from './socket.client.debug';\n\n\nexport type ServerEnvelope<T extends EventMap, K extends keyof T & string> = {\n eventName: K;\n sentAt: string | Date;\n sentTo: string[];\n data?: Payload<T, K>;\n metadata?: Record<string, unknown>;\n};\n\nexport type ClientCtx = {\n receivedAt: Date;\n latencyMs?: number;\n nsp?: string;\n socketId?: string;\n rooms?: 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 config: C;\n environment?: 'development' | 'production';\n debug?: SocketClientDebugOptions<keyof T & string>;\n heartbeat?: HeartbeatClientOptions;\n sys: SysEventMap<T, C>;\n};\n\ntype HandlerEntry<T extends EventMap, K extends keyof T & string> = {\n orig: (payload: Payload<T, K>, meta: { envelope: ServerEnvelope<T, K>; ctx: ClientCtx }) => void;\n wrapped: (envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>) => void;\n errorWrapped: (e: unknown) => void;\n};\n\nexport class SocketClient<T extends EventMap, C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput> {\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(socket: MaybeSocket): SocketClientConfigSnapshot | null {\n if (!socket) return null;\n const manager = (socket.io ?? 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' ? manager.engine.transport?.name : undefined;\n const readyState = 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: typeof opts.autoConnect === 'boolean' ? opts.autoConnect : undefined,\n reconnection: typeof opts.reconnection === 'boolean' ? opts.reconnection : undefined,\n reconnectionAttempts:\n typeof opts.reconnectionAttempts === 'number' ? opts.reconnectionAttempts : undefined,\n reconnectionDelay:\n typeof opts.reconnectionDelay === 'number' ? opts.reconnectionDelay : undefined,\n reconnectionDelayMax:\n typeof opts.reconnectionDelayMax === 'number' ? opts.reconnectionDelayMax : undefined,\n timeout: typeof opts.timeout === 'number' ? opts.timeout : undefined,\n hostname: typeof opts.hostname === 'string' ? opts.hostname : undefined,\n port: typeof opts.port === 'number' || typeof opts.port === 'string' ? opts.port : 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(error: z.ZodError<any>): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined;\n return { issues: error.issues };\n }\n\n private getVerboseDetails(details: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined;\n return details;\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 = async() => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'connect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onConnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot('connect_event');\n await this.getSysEvent('sys:connect')({\n socket: this.socket,\n client: this,\n });\n };\n\n this.onReconnect = async (attempt) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'reconnect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onReconnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n attempt,\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot('reconnect_event');\n await this.getSysEvent('sys:reconnect')({\n attempt,\n socket: this.socket,\n client: this,\n });\n };\n\n this.onDisconnect = async (reason) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'disconnect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onDisconnect handler');\n }\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 await this.getSysEvent('sys:disconnect')({\n reason: String(reason),\n socket: this.socket,\n client: this,\n });\n };\n\n this.onConnectError = async (err) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'connect_error_event', err: 'Socket is null' });\n throw new Error('Socket is null in onConnectError handler');\n }\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 await this.getSysEvent('sys:connect_error')({\n error: String(err),\n socket: this.socket,\n client: this,\n });\n };\n\n this.onPong =async (raw: unknown) => {\n if (!this.socket) {\n this.dbg({ type: 'heartbeat', phase: 'pong_recv', err: 'Socket is null' });\n throw new Error('Socket is null in onPong handler');\n }\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 await this.getSysEvent('sys:pong')({\n socket: this.socket,\n payload: validated as SocketSchemaOutput<(typeof this.config)['pongPayload']>,\n client: this,\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>>(name: K): 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 d.logger(e);\n }\n\n /** internal stats snapshot */\n stats(): ClientStatsSnapshot {\n const rooms = Array.from(this.roomCounts.entries()).map(([room, count]) => ({ room, count }));\n const handlers = Array.from(this.handlerMap.entries()).map(([event, set]) => ({\n event,\n handlers: set.size,\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('[socket] ping schema validation failed', check.error.issues);\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 this.hbTimer = setInterval(tick, this.hb.intervalMs);\n tick();\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(rooms: string[] | string, meta: SocketSchemaOutput<C['joinMetaMessage']>):Promise<()=> Promise<void>> {\n if (!this.socket) {\n this.dbg({ type: 'room', phase: 'join', rooms: this.toArray(rooms), err: 'Socket is null' });\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(rooms: string[] | string, meta: SocketSchemaOutput<C['leaveMetaMessage']>): Promise<void> {\n if (!this.socket) {\n this.dbg({ type: 'room', phase: 'leave', rooms: this.toArray(rooms), err: 'Socket is null' });\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: (payload: Payload<T, K>, meta: { envelope: ServerEnvelope<T, K>; ctx: ClientCtx }) => 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({ type: 'register', phase: 'register', event, err: 'Socket is null' });\n return () => {};\n }\n\n const socket = this.socket;\n\n const wrapped = (envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>) => {\n const maybeEnvelope = envelopeOrRaw as any;\n const rawData = maybeEnvelope?.data ?? maybeEnvelope;\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\n const receivedAt = new Date();\n const sentAt = maybeEnvelope?.sentAt ? new Date(maybeEnvelope.sentAt) : undefined;\n\n const meta = {\n envelope: {\n eventName: (maybeEnvelope?.eventName ?? event) as K,\n sentAt: maybeEnvelope?.sentAt ?? receivedAt.toISOString(),\n sentTo: maybeEnvelope?.sentTo ?? [],\n data: undefined,\n metadata: maybeEnvelope?.metadata,\n },\n ctx: {\n receivedAt,\n latencyMs: sentAt ? Math.max(0, receivedAt.getTime() - sentAt.getTime()) : undefined,\n nsp: this.getNamespace(socket),\n socketId: socket.id,\n socket,\n },\n } as const;\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 handler(parsed.data as any, meta as any);\n };\n\n const errorWrapped = (e: unknown) => {\n this.dbg({ type: 'receive', event, err: String(e) });\n };\n\n socket.on(String(event), wrapped);\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> = { orig: handler, wrapped, errorWrapped };\n set.add(entry);\n\n return () => {\n socket.off(String(event), wrapped);\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(leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>): 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 \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\nexport * from './socket.client.context';\nexport * from './socket.client.sys';\nexport * from './socketedRoute/socket.client.helper';\n"],"mappings":"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","names":["useEndpoint","z","useEffect","useMemo","useState","useSocketClient"]}
1
+ {"version":3,"sources":["../src/routesV3.client.fetch.ts","../src/routesV3.client.index.ts","../src/sockets/socket.client.sys.ts","../src/sockets/socket.client.context.tsx","../src/sockets/socketedRoute/socket.client.helper.ts","../src/sockets/socket.client.index.ts"],"sourcesContent":["// routesV3.client.fetch.ts\n\nimport { Fetcher, FetchInput } from './routesV3.client.types';\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>(req: FetchInput): Promise<T> => {\n const headers: Record<string, string> = { ...(req.headers ?? {}) };\n const isFormData = 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 ? (req.body as any) : req.body == null ? undefined : JSON.stringify(req.body),\n });\n\n const text = await res.text();\n if (!res.ok) {\n const snippet = text.slice(0, 400);\n throw new Error(`[${res.status}] ${res.statusText} — ${snippet}`);\n }\n\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n};\n","// routesV3.client.ts\nimport { useCallback, useRef } from 'react';\nimport {\n keepPreviousData,\n useInfiniteQuery,\n useMutation,\n useQuery,\n type InfiniteData,\n type QueryKey,\n} from '@tanstack/react-query';\nimport { z, type ZodType } from 'zod';\nimport {\n HttpMethod,\n buildCacheKey,\n compilePath,\n} from '@emeryld/rrroutes-contract';\nimport type {\n AnyLeaf,\n InferBody,\n InferOutput,\n InferParams,\n InferQuery,\n Prettify,\n} from '@emeryld/rrroutes-contract';\nimport { defaultFetcher } from './routesV3.client.fetch';\nimport type {\n ArgsFor,\n ArgsTuple,\n BuildMeta,\n BuiltForLeaf,\n BuiltInfinite,\n BuiltMutation,\n BuiltQuery,\n BuildOptionsFor,\n Cursor,\n DataShape,\n InfiniteBuildOptionsFor,\n MutationBuildOptionsFor,\n QueryKeysFor,\n QueryBuildOptionsFor,\n RouteClient,\n RouteClientOptions,\n RouteClientDebugEvent,\n RouteClientDebugLogger,\n RouteClientDebugMode,\n RouteClientDebugOptions,\n RouteClientDebugToggleOptions,\n Updater,\n RouterBuilder,\n} from './routesV3.client.types';\n\n// -------------------------------------------------------------------------------------\n// Tiny helpers\n// -------------------------------------------------------------------------------------\n/**\n * Convert an HTTP method to uppercase (as expected by fetch).\n * @param m Lowercase HTTP method.\n * @returns Uppercase method string.\n */\nconst toUpper = (m: HttpMethod): Uppercase<HttpMethod> => m.toUpperCase() as Uppercase<HttpMethod>;\n\nconst defaultFeedQuerySchema = z.object({\n cursor: z.string().optional(),\n limit: z.coerce.number().min(1).max(100).default(20),\n});\n\nconst defaultFeedOutputSchema = z.object({\n items: z.array(z.unknown()),\n nextCursor: z.string().optional(),\n});\n\n/**\n * Parse the given value with the supplied schema (if present).\n * @param value Raw value to validate.\n * @param schema Optional Zod schema used for validation/coercion.\n * @returns The validated or original value.\n */\nfunction zParse<T>(value: unknown, schema?: ZodType): T {\n return schema ? (schema.parse(value) as T) : (value as T);\n}\n\n/**\n * Serialize a query object into a search string.\n * @param query Query params object (possibly undefined).\n * @returns Query string prefixed with `?`, or empty string.\n */\nfunction 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 == null) continue;\n if (Array.isArray(v)) {\n v.forEach((x) => {\n if (x == null) return;\n if (typeof x === 'object') {\n params.append(k, JSON.stringify(x));\n } else {\n params.append(k, String(x));\n }\n });\n continue;\n }\n if (typeof v === 'object') {\n params.set(k, JSON.stringify(v));\n continue;\n }\n params.set(k, String(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 * @param obj Source object.\n * @param key Property name to omit.\n * @returns Copy of the object without the specified key.\n */\nfunction stripKey<Q extends Record<string, unknown> | undefined>(obj: Q, key: string): 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 * @param p Page result returned from the server.\n * @returns Next cursor string, if present.\n */\nconst defaultGetNextCursor = (p: unknown): Cursor =>\n p && typeof p === 'object' && 'nextCursor' in p ? (p as any).nextCursor : undefined;\n\n// Debug logging --------------------------------------------------------------\nconst noopDebugLogger: RouteClientDebugLogger = () => {};\n\nconst defaultDebugLogger: RouteClientDebugLogger = (event: RouteClientDebugEvent) => {\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) => defaultDebugLogger(name ? { ...event, name } : event),\n mode: 'minimal',\n };\n }\n if (option === 'complete') {\n return {\n emit: (event, name) => 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 ? new Set<Names>(toggles.only) : 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// Split the variadic tuple at runtime\n/**\n * Extract the optional argument object from a variadic tuple.\n * @param args Tuple passed to a built endpoint helper.\n * @returns The argument object if present.\n */\nfunction extractArgs<L extends AnyLeaf>(args: ArgsTuple<L>): ArgsFor<L> | undefined {\n return (args as unknown as any[])[0] as any;\n}\n\nfunction toArgsTuple<L extends AnyLeaf>(args: ArgsFor<L> | undefined): ArgsTuple<L> {\n return (typeof args === 'undefined' ? [] : [args]) as ArgsTuple<L>;\n}\n\nfunction augmentFeedQuerySchema(schema: ZodType | undefined) {\n if (!schema) return defaultFeedQuerySchema;\n if (schema instanceof z.ZodObject) {\n const shape = (schema as any).shape ? (schema as any).shape : (schema as any)._def?.shape?.();\n return schema.extend({\n ...(shape ?? {}),\n cursor: defaultFeedQuerySchema.shape.cursor,\n limit: defaultFeedQuerySchema.shape.limit,\n });\n }\n return z.intersection(schema, defaultFeedQuerySchema);\n}\n\nfunction augmentFeedOutputSchema(schema: ZodType | undefined) {\n if (!schema) return defaultFeedOutputSchema;\n if (schema instanceof z.ZodObject) {\n const shape = (schema as any).shape ? (schema as any).shape : (schema as any)._def?.shape?.();\n const hasItems = Boolean(shape?.items);\n if (hasItems) return schema.extend({ nextCursor: z.string().optional() });\n return z.object({\n items: z.array(schema as ZodType),\n nextCursor: z.string().optional(),\n });\n }\n if (schema instanceof z.ZodArray) {\n return z.object({\n items: schema,\n nextCursor: z.string().optional(),\n });\n }\n return defaultFeedOutputSchema;\n}\n\n/**\n * Normalize params and query values, then construct a request URL for the given leaf.\n * @param leaf Leaf describing the endpoint.\n * @param baseUrl Optional base URL prepended to the path.\n * @param params Route parameters supplied by the caller.\n * @param query Query parameters supplied by the caller.\n * @returns Object containing the composed URL plus normalized params/query payloads.\n */\nfunction buildUrl<L extends AnyLeaf>(\n leaf: L,\n baseUrl: string,\n params: InferParams<L> | undefined,\n query: InferQuery<L> | undefined,\n) {\n const normalizedParams = zParse<InferParams<L>>(params, leaf.cfg.paramsSchema);\n const normalizedQuery = zParse<InferQuery<L>>(query, leaf.cfg.querySchema);\n const path = compilePath<L['path']>(leaf.path, (normalizedParams ?? {}) as any);\n const url = `${baseUrl ?? ''}${path}${toSearchString(normalizedQuery as any)}`;\n return { url, normalizedQuery, normalizedParams };\n}\n\n// -------------------------------------------------------------------------------------\n// Client factory\n// -------------------------------------------------------------------------------------\n/**\n * Construct typed React Query helpers backed by a routes-v3 registry leaf.\n * @param opts Route client configuration (query client, fetcher overrides, etc).\n * @returns Object that can build endpoint hooks/mutations from leaves.\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 cursorParam = opts.cursorParam ?? 'cursor';\n const getNextCursor = opts.getNextCursor ?? defaultGetNextCursor;\n const environment =\n opts.environment ?? undefined;\n const { emit: emitDebug, mode: debugMode } = createDebugEmitter<Names>(opts.debug, environment);\n const isVerboseDebug = debugMode === 'complete';\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 /**\n * Invalidate a set of queries sharing the given prefix.\n * @param prefix Key parts shared by matching endpoints.\n * @param exact When true, invalidate only exact key matches.\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 /**\n * Build the client surface for a single leaf (query/mutation/infinite query).\n * @param leaf Leaf describing the endpoint.\n * @param rqOpts Optional React Query configuration.\n * @returns Helper object exposing getQueryKeys/invalidate/setData/useEndpoint/fetch.\n */\n function buildInternal<L extends AnyLeaf>(\n leaf: L,\n rqOpts?: QueryBuildOptionsFor<L> | InfiniteBuildOptionsFor<L> | MutationBuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ): BuiltForLeaf<L> {\n const isGet = leaf.method === 'get';\n const isFeed = !!leaf.cfg.feed;\n const leafCfg = isFeed\n ? {\n ...leaf.cfg,\n querySchema: augmentFeedQuerySchema(leaf.cfg.querySchema),\n outputSchema: augmentFeedOutputSchema(leaf.cfg.outputSchema),\n }\n : leaf.cfg;\n const method = toUpper(leaf.method);\n const expectsArgs = Boolean(leafCfg.paramsSchema || leafCfg.querySchema);\n const leafLabel = `${leaf.method.toUpperCase()} ${String(leaf.path)}`;\n const debugName = meta?.name;\n const emit = (event: RouteClientDebugEvent) => emitDebug(event, debugName);\n emit({ type: 'build', leaf: leafLabel });\n\n // --- key/invalidate/setData shared helpers ---\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 = isGet && isFeed ? stripKey(query as any, cursorParam) : (query as any);\n return buildCacheKey({\n leaf,\n params: params as any,\n query: qForKey,\n }) as unknown as QueryKeysFor<L, A>;\n };\n\n /**\n * Invalidate the React Query cache for this exact leaf invocation.\n * @param tuple Optional params/query tuple.\n */\n const invalidateExact = async (...tuple: ArgsTuple<L>) => {\n const queryKey = getQueryKeys(...tuple);\n await queryClient.invalidateQueries({ queryKey, exact: true });\n emit({ type: 'invalidate', key: queryKey, exact: true });\n };\n\n /**\n * Update the cache entries for this leaf.\n * @param args Tuple whose first entry is the updater and optional params/query follow.\n */\n const setData = (...args: [Updater<DataShape<L>>, ...rest: ArgsTuple<L>]) => {\n const [updater, ...rest] = args;\n const k = getQueryKeys(...(rest as ArgsTuple<L>));\n let next: InferOutput<L> | InfiniteData<InferOutput<L>> | undefined;\n if (isGet && isFeed) {\n next = queryClient.setQueryData<InfiniteData<InferOutput<L>> | undefined>(\n k,\n (prev) => (typeof updater === 'function' ? (updater as any)(prev) : (updater as any)),\n ) as any;\n } else {\n next = queryClient.setQueryData<InferOutput<L> | undefined>(\n k,\n (prev) => (typeof updater === 'function' ? (updater as any)(prev) : (updater as any)),\n ) as any;\n }\n emit({ type: 'setData', key: k });\n return next as any;\n };\n\n const buildOnReceive = (\n rqOpts as { onReceive?: ((data: InferOutput<L>) => void) | undefined } | undefined\n )?.onReceive;\n\n const fetchEndpoint = async (\n tuple: ArgsTuple<L>,\n options?: {\n queryOverride?: InferQuery<L>;\n body?: InferBody<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 options?.queryOverride ?? ((a as any)?.query as InferQuery<L> | undefined);\n const { url, normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n );\n\n let payload: InferBody<L> | FormData | undefined;\n const acceptsBody = Boolean(leafCfg.bodySchema);\n const requiresBody = options?.requireBody ?? (!isGet && acceptsBody);\n if (typeof options?.body !== 'undefined') {\n const normalizedBody = zParse<InferBody<L>>(options.body, leafCfg.bodySchema);\n const isMultipart = Array.isArray(leafCfg.bodyFiles) && leafCfg.bodyFiles.length > 0;\n payload = isMultipart ? toFormData(normalizedBody as any) : normalizedBody;\n } else if (requiresBody) {\n throw new Error('Body is required when invoking a mutation fetch.');\n }\n\n const startedAt = Date.now();\n const detail = isVerboseDebug ? { params: normalizedParams, query: normalizedQuery } : undefined;\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 try {\n const out = await fetcher<unknown>(\n payload === undefined ? { url, method } : { url, method, body: payload },\n );\n const parsed = zParse<InferOutput<L>>(out, leafCfg.outputSchema);\n\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'success',\n method,\n url,\n leaf: leafLabel,\n durationMs: Date.now() - startedAt,\n },\n isVerboseDebug ? { params: normalizedParams, query: normalizedQuery, output: parsed } : undefined,\n ),\n );\n\n options?.onReceive?.(parsed);\n return parsed;\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 = (\n ...tupleWithBody: InferBody<L> extends never ? ArgsTuple<L> : [...ArgsTuple<L>, InferBody<L>]\n ): Promise<InferOutput<L>> => {\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 InferBody<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, { body, onReceive: buildOnReceive, requireBody: false });\n };\n\n // --- Infinite GET ---\n if (isGet && isFeed) {\n const useEndpoint: BuiltInfinite<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'infiniteGet' });\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 = (rqOpts ?? {}) as InfiniteBuildOptionsFor<L>;\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>());\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOptions?.onReceive?.(data);\n listenersRef.current.forEach((listener) => listener(data));\n },\n [],\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 // Normalize once; we’ll inject the cursor per page below.\n const { normalizedQuery, normalizedParams } = buildUrl(\n { ...leaf, cfg: leafCfg } as L,\n baseUrl,\n params,\n query,\n );\n const queryResult = useInfiniteQuery<\n InferOutput<L>,\n unknown,\n InfiniteData<InferOutput<L>>,\n QueryKey,\n Cursor\n >({\n ...buildOptions,\n queryKey: getQueryKeys(...tuple),\n initialPageParam: undefined,\n getNextPageParam: (lastPage) => getNextCursor(lastPage),\n placeholderData: keepPreviousData,\n queryFn: ({ pageParam }) => {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [cursorParam]: pageParam } : {}),\n };\n return fetchEndpoint(tuple, {\n queryOverride: pageQuery as InferQuery<L>,\n onReceive: notifyOnReceive,\n });\n },\n // NOTE: TData is InfiniteData<T>, so we don't need a select here.\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n // --- Plain GET ---\n if (isGet) {\n const useEndpoint: BuiltQuery<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'get' });\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 = (rqOpts ?? {}) as QueryBuildOptionsFor<L>;\n const listenersRef = useRef(new Set<(data: InferOutput<L>) => void>());\n const notifyOnReceive = useCallback(\n (data: InferOutput<L>) => {\n buildOptions?.onReceive?.(data);\n listenersRef.current.forEach((listener) => listener(data));\n },\n [],\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 buildUrl({ ...leaf, cfg: leafCfg } as L, baseUrl, params, query);\n const queryResult = useQuery<InferOutput<L>, unknown, InferOutput<L>, QueryKey>({\n ...buildOptions,\n queryKey: getQueryKeys(...tuple),\n placeholderData: keepPreviousData,\n queryFn: () =>\n fetchEndpoint(tuple, {\n onReceive: notifyOnReceive,\n }),\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n\n // --- Mutation (POST/PUT/PATCH/DELETE) ---\n const mutationBuildOptions = (rqOpts ?? {}) as MutationBuildOptionsFor<L>;\n const fetchMutation: BuiltMutation<L>['fetch'] = async (\n ...tupleWithBody: Prettify<[...ArgsTuple<L>, InferBody<L>]>\n ) => {\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 InferBody<L>;\n const result = await fetchEndpoint(tuple, {\n body,\n onReceive: (data) => mutationBuildOptions?.onReceive?.(data),\n requireBody: true,\n });\n\n return result;\n };\n\n const useEndpoint: BuiltMutation<L>['useEndpoint'] = (...useArgs) => {\n const args = useArgs[0] as ArgsFor<L> | undefined;\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'mutation' });\n const tuple = toArgsTuple(args);\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((listener: (data: InferOutput<L>) => void) => {\n listenersRef.current.add(listener);\n return () => {\n listenersRef.current.delete(listener);\n };\n }, []);\n\n const mutationResult = useMutation<InferOutput<L>, unknown, InferBody<L>, unknown>({\n ...mutationBuildOptions,\n mutationKey: getQueryKeys(...tuple),\n mutationFn: async (body: InferBody<L>) => {\n const result = await fetchMutation(...([...tuple, body] as [...ArgsTuple<L>, InferBody<L>]));\n notifyListeners(result);\n return result;\n },\n }, queryClient);\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 BuiltForLeaf<L>;\n }\n\n return {\n queryClient,\n invalidate,\n build: buildInternal as RouteClient<Names>['build'],\n };\n}\n\n/**\n * Curry a route client with a registry of leaves so callers can build endpoints by name.\n * @param routeClient The route client instance created via `createRouteClient`.\n * @param routes Object map of named leaves (e.g., a registry’s `byKey` or a curated subset).\n * @returns Function that builds endpoints by supplying the route name instead of the leaf itself.\n */\nexport function buildRouter<\n Routes extends Record<PropertyKey, AnyLeaf>,\n Names extends string = string,\n>(routeClient: RouteClient<Names>, routes: Routes): RouterBuilder<Routes, Names> {\n const buildLeaf = routeClient.build as <L extends AnyLeaf>(\n leaf: L,\n options?: BuildOptionsFor<L>,\n meta?: BuildMeta<Names>,\n ) => BuiltForLeaf<L>;\n\n return ((key, opts, meta) =>\n buildLeaf(routes[key], opts as BuildOptionsFor<Routes[typeof key]>, meta)) as RouterBuilder<\n Routes,\n Names\n >;\n}\n\n// -------------------------------------------------------------------------------------\n// Multipart helper\n// -------------------------------------------------------------------------------------\nfunction toFormData(body: Record<string, any>): FormData {\n const fd = new FormData();\n for (const [k, v] of Object.entries(body ?? {})) {\n if (v == null) continue;\n if (Array.isArray(v)) v.forEach((item, i) => fd.append(`${k}[${i}]`, item as any));\n else fd.append(k, v as any);\n }\n return fd;\n}\n","// socket.client.sys.ts\n\nimport type { Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n SysEventName,\n} from '@emeryld/rrroutes-contract';\nimport { SocketClient } from './socket.client.index';\n\nexport type MaybeSocket = Socket | null;\n\nexport type SysEventMap<T extends EventMap, C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput> = {\n 'sys:connect': (args: { socket: Socket; client: SocketClient<T, C> }) => Promise<void> | void;\n 'sys:disconnect': (args: { socket: Socket; client: SocketClient<T, C>; reason: string }) => Promise<void> | void;\n 'sys:reconnect': (args: { socket: Socket; attempt: number; client: SocketClient<T, C> }) => Promise<void> | void;\n 'sys:connect_error': (args: { socket: Socket; client: SocketClient<T, C>; error: string }) => Promise<void> | void;\n 'sys:ping': (args: {\n socket: Socket;\n client: SocketClient<T, C>;\n }) => Promise<SocketSchemaOutput<C['pingPayload']>> | SocketSchemaOutput<C['pingPayload']>;\n 'sys:pong': (args: {\n socket: Socket;\n client: SocketClient<T, C>;\n payload: SocketSchemaOutput<C['pongPayload']>;\n }) => Promise<void> | void;\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 '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>(metaSchema: Meta): RoomPayloadSchema<Meta> =>\n z.object({\n rooms: roomValueSchema,\n meta: metaSchema,\n });\n","// socket.client.context.tsx\n\nimport * as React from 'react';\nimport { Socket } from 'socket.io-client';\nimport {\n SocketClient,\n SocketClientOptions,\n ClientCtx,\n ServerEnvelope,\n} from './socket.client.index';\nimport {\n EventMap,\n SocketConnectionConfigOutput,\n Payload,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\n\n/** === Provider-side debug === */\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<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>;\n };\n\nexport type SocketProviderDebugOptions = {\n verbose?: boolean;\n logger?: (e: SocketProviderDebugEvent) => void;\n} & {\n [P in SocketProviderDebugEvent['type']]?: boolean;\n};\n\n/** === Types for runtime socket injection === */\ntype BaseOptions<T extends EventMap, C extends SocketConnectionConfigOutput> = Omit<\n SocketClientOptions<T, C>,\n 'socket'\n>;\n\ntype ProviderRuntimeSocket =\n | { socket: Socket | null }\n | { getSocket: () => Socket | Promise<Socket> };\n\ntype SocketProviderProps<T extends EventMap, C extends SocketConnectionConfigOutput> = React.PropsWithChildren<{\n events: T;\n baseOptions: BaseOptions<T, C>;\n /** show while waiting for async socket; should not use the socket context */\n fallback?: React.ReactNode;\n providerDebug?: SocketProviderDebugOptions;\n destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n} & ProviderRuntimeSocket>;\n\nconst SocketCtx = React.createContext<SocketClient<any, SocketConnectionConfigOutput> | null>(null);\n\nfunction dbg(dbgOpts: SocketProviderDebugOptions | undefined, e: SocketProviderDebugEvent) {\n if (!dbgOpts?.logger) return;\n if (!dbgOpts[e.type]) return;\n dbgOpts.logger(e);\n}\n\ntype HookDebugSnapshot = Record<string, unknown>;\ntype HookIdentifier = Extract<SocketProviderDebugEvent, { type: 'hook' }>['phase'];\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 // Fallback heuristic for socket.io client instances\n return (\n ('connected' in anyVal || 'recovered' in anyVal) &&\n typeof anyVal.on === 'function' &&\n typeof anyVal.emit === 'function'\n );\n}\n\nfunction describeSocketLike(value: { id?: string; connected?: boolean; recovered?: boolean } | null): HookDebugValue {\n if (!value) return null;\n const id = value.id ?? 'unknown';\n const connected = value.connected ?? false;\n const recovered = 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 (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n return value as HookDebugValue;\n }\n if (valueType === 'bigint' || valueType === 'symbol') return String(value);\n if (valueType === 'function') return `[function ${(value as Function).name || 'anonymous'}]`;\n if (Array.isArray(value)) return `[array length=${value.length}]`;\n\n if (isProbablySocket(value)) {\n return describeSocketLike(value);\n }\n\n const ctorName = (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\nfunction summarizeEvents(events: unknown): HookDebugValue {\n if (!events || typeof events !== 'object') 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\nfunction summarizeBaseOptions(options: unknown): HookDebugValue {\n if (!options || typeof options !== 'object') 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\nfunction 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<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>\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\n return { type: 'hook', phase: hook, reason, changes: changed };\n}\n\nfunction 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\nexport function buildSocketProvider<T extends EventMap, C extends SocketConnectionConfigOutput>(args: {\n events: T;\n options: Omit<BaseOptions<T, C>, 'debug'> & {\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 & { fallback?: React.ReactNode; destroyLeaveMeta: SocketSchemaOutput<C['leaveMetaMessage']> }\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: Parameters<typeof useSocketConnection<T, K, C>>[0],\n ) => useSocketConnection<T, K, C>(p),\n };\n}\n\nfunction SocketProvider<T extends EventMap, C extends SocketConnectionConfigOutput>(props: SocketProviderProps<T, C>) {\n const { events, baseOptions, children, fallback, providerDebug, destroyLeaveMeta } = props;\n\n // Async sockets are resolved into this state.\n const [resolvedSocket, setResolvedSocket] = React.useState<Socket | null>(null);\n\n // Single source of truth for \"the socket we should use right now\".\n const socket: Socket | null = 'socket' in props ? props.socket ?? null : resolvedSocket;\n\n const providerDebugRef = React.useRef<SocketProviderDebugOptions | undefined>();\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, { type: 'resolve', phase: 'cancelled' });\n return;\n }\n if (!s) {\n dbg(providerDebugRef.current, { type: 'resolve', phase: 'socketMissing' });\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, { type: 'resolve', phase: 'error', err: String(err) });\n });\n }\n\n return () => {\n cancelled = true;\n };\n }, [resolvedSocket]);\n\n // Focus hook debug on high-signal data, not full objects\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, { type: 'client', phase: 'init', missing: true });\n return null;\n }\n const c = new SocketClient<T, C>(events, { ...baseOptions, socket });\n dbg(providerDebugRef.current, { type: 'client', phase: 'init', missing: false });\n return c;\n }, [events, baseOptions, socket]);\n\n // Keep latest destroyLeaveMeta in a ref so changing its identity does not\n // retrigger the destroy effect and cause repeated client.destroy() calls.\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(destroyLeaveMetaRef.current, 'destroyLeaveMeta'),\n },\n });\n\n return () => {\n if (client) {\n client.destroy(destroyLeaveMetaRef.current);\n dbg(providerDebugRef.current, { type: 'client', phase: 'destroy' });\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\nexport function useSocketClient<T extends EventMap, C extends SocketConnectionConfigOutput>(): SocketClient<T, C> {\n const ctx = React.useContext(SocketCtx);\n if (!ctx) throw new Error('SocketClient not found. Wrap with <SocketProvider>.');\n return ctx as unknown as SocketClient<T, C>;\n}\n\ntype Rooms = string[] | string | undefined;\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>; ctx: ClientCtx },\n ) => void;\n onCleanup?: () => void;\n autoJoin?: boolean;\n autoLeave?: boolean;\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n};\n\nexport function useSocketConnection<T extends EventMap, K extends keyof T & string, C extends SocketConnectionConfigOutput>(\n args: UseSocketConnectionArgs<T, K, C>,\n) {\n const { event, rooms, onMessage, onCleanup, autoJoin = true, autoLeave = true } = 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\n React.useEffect(() => {\n if (autoJoin && normalizedRooms.length > 0) client.joinRooms(normalizedRooms, args.joinMeta);\n const unsubscribe = client.on(event, onMessage);\n\n return () => {\n unsubscribe();\n if (autoLeave && normalizedRooms.length > 0) client.leaveRooms(normalizedRooms, args.leaveMeta);\n if (onCleanup) onCleanup();\n };\n }, [client, event, onMessage, autoJoin, autoLeave, ...normalizedRooms]);\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport type {\n AnyLeaf,\n EventMap,\n InferOutput,\n Payload,\n SocketConnectionConfigOutput,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\nimport type {\n BuiltInfinite,\n BuiltQuery,\n DataShape,\n InfiniteUseEndpointResultFor,\n QueryUseEndpointResultFor,\n UseEndpointArgs,\n} from '../../routesV3.client.types';\nimport type { ClientCtx, ServerEnvelope, SocketClient } from '../socket.client.index';\n\ntype RoomsInput = string | string[] | undefined | null;\n\ntype SocketedBuilt<L extends AnyLeaf> = L['cfg']['feed'] extends true\n ? BuiltInfinite<L>\n : BuiltQuery<L>;\n\ntype SocketedRouteResult<L extends AnyLeaf> = (L['cfg']['feed'] extends true\n ? InfiniteUseEndpointResultFor<L>\n : QueryUseEndpointResultFor<L>) & { rooms: string[] };\n\nexport type SocketedRouteOptions<\n L extends AnyLeaf,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n> = {\n built: SocketedBuilt<L>;\n toRooms: (data: InferOutput<L>) => {\n rooms: RoomsInput;\n joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;\n };\n applySocket: {\n [K in keyof Events & string]?: (\n prev: DataShape<L> | undefined,\n payload: Payload<Events, K>,\n meta: { envelope: ServerEnvelope<Events, K>; ctx: ClientCtx },\n ) => DataShape<L> | undefined;\n };\n useSocketClient: () => SocketClient<Events, C>;\n};\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\ntype RoomState<C extends SocketConnectionConfigOutput> = {\n rooms: string[];\n joinMeta?: SocketSchemaOutput<C['joinMetaMessage']>;\n leaveMeta?: SocketSchemaOutput<C['leaveMetaMessage']>;\n};\n\nfunction mergeRoomState<L extends AnyLeaf, C extends SocketConnectionConfigOutput>(\n prev: RoomState<C>,\n toRoomsResult: ReturnType<SocketedRouteOptions<L, any, C>['toRooms']>,\n): 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\nfunction roomsFromData<L extends AnyLeaf, C extends SocketConnectionConfigOutput>(\n data: DataShape<L> | undefined,\n toRooms: SocketedRouteOptions<L, any, C>['toRooms'],\n): RoomState<C> {\n if (data == null) return { rooms: [] };\n\n let state: RoomState<C> = { rooms: [] };\n const add = (input: InferOutput<L>) => {\n state = mergeRoomState(state, toRooms(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\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 AnyLeaf,\n Events extends EventMap,\n C extends SocketConnectionConfigOutput,\n>(options: SocketedRouteOptions<L, Events, C>) {\n const { built, toRooms, applySocket, useSocketClient } = options;\n\n return (...useArgs: UseEndpointArgs<L>): SocketedRouteResult<L> => {\n const client = useSocketClient();\n const endpointResult = built.useEndpoint(...useArgs) as SocketedRouteResult<L>;\n const argsKey = useMemo(() => JSON.stringify(useArgs[0] ?? null), [useArgs]);\n\n const [roomState, setRoomState] = useState<RoomState<C>>(() =>\n roomsFromData(endpointResult.data as DataShape<L> | undefined, toRooms),\n );\n const roomsKey = useMemo(() => roomState.rooms.join('|'), [roomState.rooms]);\n const joinMetaKey = useMemo(() => JSON.stringify(roomState.joinMeta ?? null), [roomState.joinMeta]);\n const leaveMetaKey = useMemo(() => JSON.stringify(roomState.leaveMeta ?? null), [roomState.leaveMeta]);\n\n useEffect(() => {\n const unsubscribe = endpointResult.onReceive((data) => {\n setRoomState((prev) => mergeRoomState(prev, toRooms(data as InferOutput<L>)));\n });\n return unsubscribe;\n }, [endpointResult, toRooms]);\n\n useEffect(() => {\n setRoomState(roomsFromData(endpointResult.data as DataShape<L> | undefined, toRooms));\n }, [endpointResult.data, toRooms]);\n\n useEffect(() => {\n if (roomState.rooms.length === 0) return;\n const {joinMeta, leaveMeta} = roomState;\n if (!joinMeta || !leaveMeta) return;\n let active = true;\n (async () => {\n try {\n await client.joinRooms(roomState.rooms, joinMeta);\n } catch {\n // ignore join failures; hook should not throw\n }\n })();\n return () => {\n if (!active || roomState.rooms.length === 0) return;\n active = false;\n void client.leaveRooms(roomState.rooms, leaveMeta).catch(() => {});\n };\n }, [client, roomsKey, roomState.joinMeta, roomState.leaveMeta, joinMetaKey, leaveMetaKey]);\n\n useEffect(() => {\n const entries = Object.entries(applySocket).filter(\n ([_event, fn]) => typeof fn === 'function',\n ) as Array<\n [\n keyof Events & string,\n (\n prev: DataShape<L> | undefined,\n payload: Payload<Events, keyof Events & string>,\n meta: { envelope: ServerEnvelope<Events, keyof Events & string>; ctx: ClientCtx },\n ) => DataShape<L> | undefined\n ]\n >;\n\n const unsubscribes = entries.map(([ev, fn]) =>\n client.on(ev, (payload, meta) => {\n built.setData((prev) => {\n const next = fn(prev, payload as any, meta as any);\n setRoomState(roomsFromData(next as DataShape<L> | undefined, toRooms));\n return next;\n }, ...(useArgs as UseEndpointArgs<L>));\n }),\n );\n return () => unsubscribes.forEach((u) => u?.());\n }, [client, applySocket, built, argsKey, toRooms]);\n\n return { ...endpointResult, rooms: roomState.rooms };\n };\n}\n","// socket.client.index.ts\n\nimport type { ManagerOptions, Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type {\n EventMap,\n SocketConnectionConfigOutput,\n Payload,\n SocketSchemaOutput,\n} from '@emeryld/rrroutes-contract';\nimport type { MaybeSocket, RoomPayloadSchema, SysEventMap } from './socket.client.sys';\nimport { buildRoomPayloadSchema } from './socket.client.sys';\nimport { SocketClientDebugEvent, SocketClientConfigSnapshot } from './socket.client.debug';\n\n\nexport type ServerEnvelope<T extends EventMap, K extends keyof T & string> = {\n eventName: K;\n sentAt: string | Date;\n sentTo: string[];\n data?: Payload<T, K>;\n metadata?: Record<string, unknown>;\n};\n\nexport type ClientCtx = {\n receivedAt: Date;\n latencyMs?: number;\n nsp?: string;\n socketId?: string;\n rooms?: 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 config: C;\n environment?: 'development' | 'production';\n debug?: SocketClientDebugOptions<keyof T & string>;\n heartbeat?: HeartbeatClientOptions;\n sys: SysEventMap<T, C>;\n};\n\ntype HandlerEntry<T extends EventMap, K extends keyof T & string> = {\n orig: (payload: Payload<T, K>, meta: { envelope: ServerEnvelope<T, K>; ctx: ClientCtx }) => void;\n wrapped: (envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>) => void;\n errorWrapped: (e: unknown) => void;\n};\n\nexport class SocketClient<T extends EventMap, C extends SocketConnectionConfigOutput = SocketConnectionConfigOutput> {\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(socket: MaybeSocket): SocketClientConfigSnapshot | null {\n if (!socket) return null;\n const manager = (socket.io ?? 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' ? manager.engine.transport?.name : undefined;\n const readyState = 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: typeof opts.autoConnect === 'boolean' ? opts.autoConnect : undefined,\n reconnection: typeof opts.reconnection === 'boolean' ? opts.reconnection : undefined,\n reconnectionAttempts:\n typeof opts.reconnectionAttempts === 'number' ? opts.reconnectionAttempts : undefined,\n reconnectionDelay:\n typeof opts.reconnectionDelay === 'number' ? opts.reconnectionDelay : undefined,\n reconnectionDelayMax:\n typeof opts.reconnectionDelayMax === 'number' ? opts.reconnectionDelayMax : undefined,\n timeout: typeof opts.timeout === 'number' ? opts.timeout : undefined,\n hostname: typeof opts.hostname === 'string' ? opts.hostname : undefined,\n port: typeof opts.port === 'number' || typeof opts.port === 'string' ? opts.port : 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(error: z.ZodError<any>): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined;\n return { issues: error.issues };\n }\n\n private getVerboseDetails(details: Record<string, unknown>): Record<string, unknown> | undefined {\n if (!this.debug.verbose) return undefined;\n return details;\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 = async() => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'connect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onConnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'connect_event',\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot('connect_event');\n await this.getSysEvent('sys:connect')({\n socket: this.socket,\n client: this,\n });\n };\n\n this.onReconnect = async (attempt) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'reconnect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onReconnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'reconnect_event',\n attempt,\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot('reconnect_event');\n await this.getSysEvent('sys:reconnect')({\n attempt,\n socket: this.socket,\n client: this,\n });\n };\n\n this.onDisconnect = async (reason) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'disconnect_event', err: 'Socket is null' });\n throw new Error('Socket is null in onDisconnect handler');\n }\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 await this.getSysEvent('sys:disconnect')({\n reason: String(reason),\n socket: this.socket,\n client: this,\n });\n };\n\n this.onConnectError = async (err) => {\n if (!this.socket) {\n this.dbg({ type: 'connection', phase: 'connect_error_event', err: 'Socket is null' });\n throw new Error('Socket is null in onConnectError handler');\n }\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 await this.getSysEvent('sys:connect_error')({\n error: String(err),\n socket: this.socket,\n client: this,\n });\n };\n\n this.onPong =async (raw: unknown) => {\n if (!this.socket) {\n this.dbg({ type: 'heartbeat', phase: 'pong_recv', err: 'Socket is null' });\n throw new Error('Socket is null in onPong handler');\n }\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 await this.getSysEvent('sys:pong')({\n socket: this.socket,\n payload: validated as SocketSchemaOutput<(typeof this.config)['pongPayload']>,\n client: this,\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>>(name: K): 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 d.logger(e);\n }\n\n /** internal stats snapshot */\n stats(): ClientStatsSnapshot {\n const rooms = Array.from(this.roomCounts.entries()).map(([room, count]) => ({ room, count }));\n const handlers = Array.from(this.handlerMap.entries()).map(([event, set]) => ({\n event,\n handlers: set.size,\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('[socket] ping schema validation failed', check.error.issues);\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 this.hbTimer = setInterval(tick, this.hb.intervalMs);\n tick();\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(rooms: string[] | string, meta: SocketSchemaOutput<C['joinMetaMessage']>):Promise<()=> Promise<void>> {\n if (!this.socket) {\n this.dbg({ type: 'room', phase: 'join', rooms: this.toArray(rooms), err: 'Socket is null' });\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(rooms: string[] | string, meta: SocketSchemaOutput<C['leaveMetaMessage']>): Promise<void> {\n if (!this.socket) {\n this.dbg({ type: 'room', phase: 'leave', rooms: this.toArray(rooms), err: 'Socket is null' });\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: (payload: Payload<T, K>, meta: { envelope: ServerEnvelope<T, K>; ctx: ClientCtx }) => 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({ type: 'register', phase: 'register', event, err: 'Socket is null' });\n return () => {};\n }\n\n const socket = this.socket;\n\n const wrapped = (envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>) => {\n const maybeEnvelope = envelopeOrRaw as any;\n const rawData = maybeEnvelope?.data ?? maybeEnvelope;\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\n const receivedAt = new Date();\n const sentAt = maybeEnvelope?.sentAt ? new Date(maybeEnvelope.sentAt) : undefined;\n\n const meta = {\n envelope: {\n eventName: (maybeEnvelope?.eventName ?? event) as K,\n sentAt: maybeEnvelope?.sentAt ?? receivedAt.toISOString(),\n sentTo: maybeEnvelope?.sentTo ?? [],\n data: undefined,\n metadata: maybeEnvelope?.metadata,\n },\n ctx: {\n receivedAt,\n latencyMs: sentAt ? Math.max(0, receivedAt.getTime() - sentAt.getTime()) : undefined,\n nsp: this.getNamespace(socket),\n socketId: socket.id,\n socket,\n },\n } as const;\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 handler(parsed.data as any, meta as any);\n };\n\n const errorWrapped = (e: unknown) => {\n this.dbg({ type: 'receive', event, err: String(e) });\n };\n\n socket.on(String(event), wrapped);\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> = { orig: handler, wrapped, errorWrapped };\n set.add(entry);\n\n return () => {\n socket.off(String(event), wrapped);\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(leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>): 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 \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\nexport * from './socket.client.context';\nexport * from './socket.client.sys';\nexport * from './socketedRoute/socket.client.helper';\n"],"mappings":"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","names":["useEndpoint","z","useEffect","useMemo","useState","useSocketClient"]}
@@ -13,7 +13,7 @@ export type SocketedRouteOptions<L extends AnyLeaf, Events extends EventMap, C e
13
13
  joinMeta: SocketSchemaOutput<C['joinMetaMessage']>;
14
14
  leaveMeta: SocketSchemaOutput<C['leaveMetaMessage']>;
15
15
  };
16
- applyMessage: {
16
+ applySocket: {
17
17
  [K in keyof Events & string]?: (prev: DataShape<L> | undefined, payload: Payload<Events, K>, meta: {
18
18
  envelope: ServerEnvelope<Events, K>;
19
19
  ctx: ClientCtx;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emeryld/rrroutes-client",
3
- "version": "2.2.13",
3
+ "version": "2.2.14",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -19,7 +19,7 @@
19
19
  "dist"
20
20
  ],
21
21
  "dependencies": {
22
- "@emeryld/rrroutes-contract": "^2.1.6",
22
+ "@emeryld/rrroutes-contract": "^2.1.9",
23
23
  "zod": "^4.1.12"
24
24
  },
25
25
  "peerDependencies": {