@emeryld/rrroutes-client 2.1.0 → 2.1.1

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/dist/index.cjs CHANGED
@@ -35,7 +35,9 @@ __export(index_exports, {
35
35
  buildRoomPayloadSchema: () => buildRoomPayloadSchema,
36
36
  buildSocketProvider: () => buildSocketProvider,
37
37
  createRouteClient: () => createRouteClient,
38
- defaultFetcher: () => defaultFetcher
38
+ defaultFetcher: () => defaultFetcher,
39
+ useSocketClient: () => useSocketClient,
40
+ useSocketConnection: () => useSocketConnection
39
41
  });
40
42
  module.exports = __toCommonJS(index_exports);
41
43
 
@@ -526,6 +528,7 @@ function buildSocketProvider(args) {
526
528
  {
527
529
  events,
528
530
  baseOptions,
531
+ providerDebug: baseOptions.debug,
529
532
  ...props
530
533
  }
531
534
  ),
@@ -559,7 +562,7 @@ function SocketProvider(props) {
559
562
  return;
560
563
  }
561
564
  if (!s) {
562
- dbg(providerDebugRef.current, { type: "resolve", phase: "missing" });
565
+ dbg(providerDebugRef.current, { type: "resolve", phase: "socketMissing" });
563
566
  return;
564
567
  }
565
568
  setResolvedSocket(s);
@@ -658,23 +661,20 @@ var SocketClient = class {
658
661
  this.dbg({
659
662
  type: "lifecycle",
660
663
  phase: "init",
661
- socketId: this.socket.id,
662
- details: {
663
- heartbeatIntervalMs: this.hb.intervalMs,
664
- heartbeatTimeoutMs: this.hb.timeoutMs,
665
- environment: this.environment
666
- }
664
+ heartbeatIntervalMs: this.hb.intervalMs,
665
+ heartbeatTimeoutMs: this.hb.timeoutMs,
666
+ environment: this.environment
667
667
  });
668
668
  this.logSocketConfigSnapshot("constructor");
669
669
  }
670
670
  this.onConnect = () => {
671
671
  if (!this.socket) {
672
- this.dbg({ type: "connection", phase: "connect", err: "Socket is null" });
672
+ this.dbg({ type: "connection", phase: "connect_event", err: "Socket is null" });
673
673
  throw new Error("Socket is null in onConnect handler");
674
674
  }
675
675
  this.dbg({
676
676
  type: "connection",
677
- phase: "connect",
677
+ phase: "connect_event",
678
678
  id: this.socket.id,
679
679
  details: {
680
680
  nsp: this.getNamespace(this.socket)
@@ -688,12 +688,12 @@ var SocketClient = class {
688
688
  };
689
689
  this.onReconnect = (attempt) => {
690
690
  if (!this.socket) {
691
- this.dbg({ type: "connection", phase: "reconnect", err: "Socket is null" });
691
+ this.dbg({ type: "connection", phase: "reconnect_event", err: "Socket is null" });
692
692
  throw new Error("Socket is null in onReconnect handler");
693
693
  }
694
694
  this.dbg({
695
695
  type: "connection",
696
- phase: "reconnect",
696
+ phase: "reconnect_event",
697
697
  attempt,
698
698
  id: this.socket.id,
699
699
  details: {
@@ -709,12 +709,12 @@ var SocketClient = class {
709
709
  };
710
710
  this.onDisconnect = (reason) => {
711
711
  if (!this.socket) {
712
- this.dbg({ type: "connection", phase: "disconnect", err: "Socket is null" });
712
+ this.dbg({ type: "connection", phase: "disconnect_event", err: "Socket is null" });
713
713
  throw new Error("Socket is null in onDisconnect handler");
714
714
  }
715
715
  this.dbg({
716
716
  type: "connection",
717
- phase: "disconnect",
717
+ phase: "disconnect_event",
718
718
  reason: String(reason),
719
719
  details: {
720
720
  roomsTracked: this.roomCounts.size
@@ -729,12 +729,12 @@ var SocketClient = class {
729
729
  };
730
730
  this.onConnectError = (err) => {
731
731
  if (!this.socket) {
732
- this.dbg({ type: "connection", phase: "connect_error", err: "Socket is null" });
732
+ this.dbg({ type: "connection", phase: "connect_error_event", err: "Socket is null" });
733
733
  throw new Error("Socket is null in onConnectError handler");
734
734
  }
735
735
  this.dbg({
736
736
  type: "connection",
737
- phase: "connect_error",
737
+ phase: "connect_error_event",
738
738
  err: String(err),
739
739
  details: this.getVerboseDetails({ rawError: err })
740
740
  });
@@ -883,7 +883,7 @@ var SocketClient = class {
883
883
  * call it yourself from any sysHandler to change when heartbeats start.
884
884
  */
885
885
  startHeartbeat() {
886
- this.stopHeartbeat();
886
+ this.stopHeartbeat("stop_before_start");
887
887
  if (!this.socket) {
888
888
  this.dbg({
889
889
  type: "heartbeat",
@@ -944,7 +944,7 @@ var SocketClient = class {
944
944
  * This is called by the default 'sys:disconnect' handler, but you can also
945
945
  * call it yourself from any sysHandler to fully control heartbeat lifecycle.
946
946
  */
947
- stopHeartbeat() {
947
+ stopHeartbeat(reason) {
948
948
  const hadTimer = Boolean(this.hbTimer);
949
949
  if (this.hbTimer) {
950
950
  clearInterval(this.hbTimer);
@@ -953,9 +953,8 @@ var SocketClient = class {
953
953
  this.dbg({
954
954
  type: "heartbeat",
955
955
  phase: "stop",
956
- details: {
957
- hadTimer
958
- }
956
+ reason,
957
+ hadTimer
959
958
  });
960
959
  }
961
960
  emit(event, payload, metadata) {
@@ -1149,7 +1148,7 @@ var SocketClient = class {
1149
1148
  * Call when disposing the client instance.
1150
1149
  */
1151
1150
  destroy(leaveMeta) {
1152
- this.stopHeartbeat();
1151
+ this.stopHeartbeat("destroy");
1153
1152
  const socket = this.socket;
1154
1153
  this.dbg({
1155
1154
  type: "lifecycle",
@@ -1200,7 +1199,7 @@ var SocketClient = class {
1200
1199
  });
1201
1200
  return;
1202
1201
  }
1203
- this.stopHeartbeat();
1202
+ this.stopHeartbeat("disconnect");
1204
1203
  this.socket.disconnect();
1205
1204
  this.dbg({
1206
1205
  type: "connection",
@@ -1239,6 +1238,8 @@ var SocketClient = class {
1239
1238
  buildRoomPayloadSchema,
1240
1239
  buildSocketProvider,
1241
1240
  createRouteClient,
1242
- defaultFetcher
1241
+ defaultFetcher,
1242
+ useSocketClient,
1243
+ useSocketConnection
1243
1244
  });
1244
1245
  //# sourceMappingURL=index.cjs.map
@@ -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/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 {\n keepPreviousData,\n useInfiniteQuery,\n useMutation,\n useQuery,\n type InfiniteData,\n type QueryKey,\n} from '@tanstack/react-query';\nimport 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} 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 Cursor,\n DataShape,\n InfiniteBuildOptionsFor,\n MutationBuildOptionsFor,\n QueryBuildOptionsFor,\n RouteClient,\n RouteClientOptions,\n RouteClientDebugEvent,\n RouteClientDebugLogger,\n RouteClientDebugMode,\n RouteClientDebugOptions,\n RouteClientDebugToggleOptions,\n Updater,\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\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\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 key/invalidate/setData/useEndpoint.\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 method = toUpper(leaf.method);\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 key = (...tuple: ArgsTuple<L>): QueryKey => {\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({ leaf, params: params as any, query: qForKey }) as unknown as QueryKey;\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 = key(...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 = key(...(rest as ArgsTuple<L>));\n if (isGet && isFeed) {\n queryClient.setQueryData<InfiniteData<InferOutput<L>> | undefined>(k, (prev) =>\n typeof updater === 'function' ? (updater as any)(prev) : (updater as any),\n );\n } else {\n queryClient.setQueryData<InferOutput<L> | undefined>(k, (prev) =>\n typeof updater === 'function' ? (updater as any)(prev) : (updater as any),\n );\n }\n emit({ type: 'setData', key: k });\n };\n\n // --- Infinite GET ---\n if (isGet && isFeed) {\n const useEndpoint: BuiltInfinite<L>['useEndpoint'] = (...tuple) => {\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'infiniteGet' });\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\n // Normalize once; we’ll inject the cursor per page below.\n const { normalizedQuery, normalizedParams } = buildUrl(leaf, baseUrl, params, query);\n return useInfiniteQuery<\n InferOutput<L>,\n unknown,\n InfiniteData<InferOutput<L>>,\n QueryKey,\n Cursor\n >({\n ...(rqOpts as InfiniteBuildOptionsFor<L>),\n queryKey: key(...tuple),\n initialPageParam: undefined,\n getNextPageParam: (lastPage) => getNextCursor(lastPage),\n placeholderData: keepPreviousData,\n queryFn: async ({ pageParam }) => {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [cursorParam]: pageParam } : {}),\n };\n const { url } = buildUrl(leaf, baseUrl, params, pageQuery);\n const startedAt = Date.now();\n const detail = isVerboseDebug ? { params: normalizedParams, query: pageQuery } : undefined;\n emit(\n decorateDebugEvent(\n { type: 'fetch', stage: 'start', method, url, leaf: leafLabel },\n detail,\n ),\n );\n try {\n const out = await fetcher<unknown>({ url, method });\n const parsed = zParse<InferOutput<L>>(out, leaf.cfg.outputSchema);\n\n // call onReceive after fetch and validation\n (rqOpts as InfiniteBuildOptionsFor<L> & { onReceive?: (data: InferOutput<L>) => void })\n ?.onReceive?.(parsed);\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: pageQuery, output: parsed } : undefined,\n ),\n );\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 error,\n },\n detail,\n ),\n );\n throw error;\n }\n },\n // NOTE: TData is InfiniteData<T>, so we don't need a select here.\n }, queryClient);\n };\n\n return {\n key,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n } as BuiltForLeaf<L>;\n }\n // --- Plain GET ---\n if (isGet) {\n const useEndpoint: BuiltQuery<L>['useEndpoint'] = (...tuple) => {\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'get' });\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\n const { url, normalizedQuery, normalizedParams } = buildUrl(leaf, baseUrl, params, query);\n return useQuery<InferOutput<L>, unknown, InferOutput<L>, QueryKey>({\n ...(rqOpts as QueryBuildOptionsFor<L>),\n queryKey: key(...tuple),\n placeholderData: keepPreviousData,\n queryFn: async () => {\n const startedAt = Date.now();\n const detail = isVerboseDebug\n ? { params: normalizedParams, query: normalizedQuery }\n : undefined;\n emit(\n decorateDebugEvent(\n { type: 'fetch', stage: 'start', method, url, leaf: leafLabel },\n detail,\n ),\n );\n try {\n const out = await fetcher<unknown>({ url, method });\n const parsed = zParse<InferOutput<L>>(out, leaf.cfg.outputSchema);\n\n // call onReceive after fetch and validation\n (rqOpts as QueryBuildOptionsFor<L> & { onReceive?: (data: InferOutput<L>) => void })\n ?.onReceive?.(parsed);\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\n ? { params: normalizedParams, query: normalizedQuery, output: parsed }\n : undefined,\n ),\n );\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 error,\n },\n detail,\n ),\n );\n throw error;\n }\n },\n }, queryClient);\n };\n\n return {\n key,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n } as BuiltForLeaf<L>;\n }\n\n // --- Mutation (POST/PUT/PATCH/DELETE) ---\n const fetchEndpoint: BuiltMutation<L>['fetch'] = async (\n ...tupleWithBody: [...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 args = extractArgs<L>(tuple);\n const params = (args as any)?.params as InferParams<L> | undefined;\n const query = (args as any)?.query as InferQuery<L> | undefined;\n\n const { url, normalizedQuery, normalizedParams } = buildUrl(leaf, baseUrl, params, query);\n const normalizedBody = zParse<InferBody<L>>(body, leaf.cfg.bodySchema);\n\n const isMultipart = Array.isArray(leaf.cfg.bodyFiles) && leaf.cfg.bodyFiles.length > 0;\n const payload = isMultipart ? toFormData(normalizedBody as any) : normalizedBody;\n\n const startedAt = Date.now();\n const detail = isVerboseDebug\n ? { params: normalizedParams, query: normalizedQuery }\n : undefined;\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method,\n url,\n leaf: leafLabel,\n body: payload,\n },\n detail,\n ),\n );\n try {\n const out = await fetcher<unknown>({ url, method, body: payload });\n const parsed = zParse<InferOutput<L>>(out, leaf.cfg.outputSchema);\n\n // call onReceive after fetch and validation\n (rqOpts as MutationBuildOptionsFor<L> & { onReceive?: (data: InferOutput<L>) => void })\n ?.onReceive?.(parsed);\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\n ? { params: normalizedParams, query: normalizedQuery, output: parsed }\n : undefined,\n ),\n );\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 body: payload,\n error,\n },\n detail,\n ),\n );\n throw error;\n }\n };\n\n const useEndpoint: BuiltMutation<L>['useEndpoint'] = (...tuple) => {\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'mutation' });\n return useMutation<InferOutput<L>, unknown, InferBody<L>, unknown>({\n ...(rqOpts as MutationBuildOptionsFor<L>),\n mutationKey: key(...tuple),\n mutationFn: (body: InferBody<L>) =>\n fetchEndpoint(...([...tuple, body] as [...ArgsTuple<L>, InferBody<L>])),\n }, queryClient);\n };\n\n return {\n key,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n fetch: fetchEndpoint,\n } as BuiltForLeaf<L>;\n }\n\n return {\n queryClient,\n invalidate,\n build: buildInternal as RouteClient<Names>['build'],\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 { EventMap, SocketConnectionConfig, SysEventName } from '@emeryld/rrroutes-contract';\nimport { SocketClient } from './socket.client.index';\n\nexport type MaybeSocket = Socket | null;\n\ntype BaseSysLifecycleArgs = {\n socket: MaybeSocket;\n next: () => void;\n startHeartbeat: () => void;\n stopHeartbeat: () => void;\n};\n\nexport type SysConnectHandlerArgs = BaseSysLifecycleArgs & {\n name: Extract<SysEventName, 'sys:connect'>;\n phase: 'connect';\n};\n\nexport type SysReconnectHandlerArgs = BaseSysLifecycleArgs & {\n name: Extract<SysEventName, 'sys:reconnect'>;\n phase: 'reconnect';\n attempt: number;\n};\n\nexport type SysDisconnectHandlerArgs = BaseSysLifecycleArgs & {\n name: Extract<SysEventName, 'sys:disconnect'>;\n phase: 'disconnect';\n reason: string;\n};\n\nexport type SysConnectErrorHandlerArgs = BaseSysLifecycleArgs & {\n name: Extract<SysEventName, 'sys:connect_error'>;\n phase: 'connect_error';\n error: unknown;\n};\n\nexport type SysPingHandlerArgs<C extends SocketConnectionConfig = SocketConnectionConfig> = {\n name: Extract<SysEventName, 'sys:ping'>;\n socket: MaybeSocket;\n buildDefaultPayload: () => z.input<C['pingPayload']>;\n send: (payload: z.input<C['pingPayload']>) => void;\n next: () => void;\n startHeartbeat: () => void;\n stopHeartbeat: () => void;\n};\n\nexport type SysPongHandlerArgs<C extends SocketConnectionConfig = SocketConnectionConfig> = {\n name: Extract<SysEventName, 'sys:pong'>;\n socket: MaybeSocket;\n raw: z.output<C['pongPayload']>;\n latencyMs?: number;\n next: () => void;\n startHeartbeat: () => void;\n stopHeartbeat: () => void;\n};\n\nexport type SysRoomHandlerArgs<Meta extends z.ZodTypeAny = z.ZodTypeAny> = {\n name: Extract<SysEventName, 'sys:room_join' | 'sys:room_leave'>;\n socket: MaybeSocket;\n rooms: string[];\n meta: z.output<Meta>;\n next: () => void;\n startHeartbeat: () => void;\n stopHeartbeat: () => void;\n};\n\nexport type SysConnectHandler = (args: SysConnectHandlerArgs) => void;\nexport type SysReconnectHandler = (args: SysReconnectHandlerArgs) => void;\nexport type SysDisconnectHandler = (args: SysDisconnectHandlerArgs) => void;\nexport type SysConnectErrorHandler = (args: SysConnectErrorHandlerArgs) => void;\nexport type SysPingHandler<C extends SocketConnectionConfig = SocketConnectionConfig> = (\n args: SysPingHandlerArgs<C>,\n) => void;\nexport type SysPongHandler<C extends SocketConnectionConfig = SocketConnectionConfig> = (\n args: SysPongHandlerArgs<C>,\n) => void;\nexport type SysRoomHandler<Meta extends z.ZodTypeAny = z.ZodTypeAny> = (\n args: SysRoomHandlerArgs<Meta>,\n) => void;\n\nexport type SysEventMap<T extends EventMap,C extends SocketConnectionConfig = SocketConnectionConfig> = {\n 'sys:connect': (args:{socket:Socket, client:SocketClient<T, C>})=> void \n 'sys:disconnect': (args:{socket:Socket, client:SocketClient<T, C>, reason:string})=>void;\n 'sys:reconnect': (args:{socket:Socket, attempt: number, client:SocketClient<T, C>})=>void;\n 'sys:connect_error': (args:{socket:Socket, client:SocketClient<T, C>, error:string})=>void ;\n 'sys:ping': (args:{socket:Socket, client:SocketClient<T, C>})=> z.output<C['pingPayload']>;\n 'sys:pong': (args:{socket:Socket, client:SocketClient<T, C>, payload: z.output<C['pongPayload']>})=>void ;\n 'sys:room_join': (args:{socket:Socket, client:SocketClient<T, C>, rooms: string|string[], meta: z.output<C['joinMetaMessage']>})=>boolean ;\n 'sys:room_leave': (args:{socket:Socket, client:SocketClient<T, C>, rooms: string|string[], meta: z.output<C['joinMetaMessage']>})=>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 { z } from 'zod';\nimport {\n SocketClient,\n SocketClientOptions,\n ClientCtx,\n Payload,\n ServerEnvelope,\n} from './socket.client.index';\nimport { EventMap, SocketConnectionConfig } 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 | { type: 'resolve'; phase: 'start' | 'ok' | 'error' | 'missing' | 'cancelled'; err?: string }\n | { type: 'client'; phase: 'init' | 'destroy', missing?: boolean }\n | { type: 'render'; hasClient: boolean }\n | {\n type: 'hook';\n hook: '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 SocketConnectionConfig> = Omit<SocketClientOptions<T, C>, 'socket'>;\n\ntype ProviderRuntimeSocket =\n | { socket: Socket | null }\n | { getSocket: () => Socket | Promise<Socket> };\n\ntype SocketProviderProps<T extends EventMap, C extends SocketConnectionConfig> = 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: z.output<C['leaveMetaMessage']>;\n} & ProviderRuntimeSocket>;\n\nconst SocketCtx = React.createContext<SocketClient<any, SocketConnectionConfig> | 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' }>['hook'];\n\nfunction safeDescribeHookValue(value: unknown): HookDebugValue {\n if (value == null) return value as null | undefined;\n const valueType = typeof value;\n if (valueType === 'string' || valueType === 'number' || valueType === 'boolean') return value as HookDebugValue;\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 if (value instanceof Socket) {\n const socket = value as Socket & { id?: string; connected?: boolean };\n return `[Socket id=${socket.id ?? 'unknown'} connected=${socket.connected ?? false}]`;\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 createHookDebugEvent(prev: HookDebugSnapshot | null, next: HookDebugSnapshot, hook: HookIdentifier): Extract<SocketProviderDebugEvent, { type: 'hook' }> | null {\n const reason: HookDebugReason = prev ? 'change' : 'init';\n const changed = Object.keys(next).reduce<Array<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>>((acc, dependency) => {\n const prevValue = prev ? prev[dependency] : undefined;\n const nextValue = next[dependency];\n if (!prev || !Object.is(prevValue, nextValue)) {\n acc.push({ dependency, previous: safeDescribeHookValue(prevValue), next: safeDescribeHookValue(nextValue) });\n }\n return acc;\n }, []);\n\n if (!changed.length) return null;\n\n return { type: 'hook', hook, reason, changes: changed };\n}\n\nfunction trackHookTrigger({ ref, hook, providerDebug, snapshot }: { ref: React.MutableRefObject<HookDebugSnapshot | null>; hook: HookIdentifier; providerDebug?: SocketProviderDebugOptions; snapshot: HookDebugSnapshot }) {\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 SocketConnectionConfig>(args: {\n events: T;\n options: BaseOptions<T, C>;\n}) {\n const { events, options: baseOptions } = args;\n\n return {\n SocketProvider: (\n props: React.PropsWithChildren<\n ProviderRuntimeSocket & { fallback?: React.ReactNode; providerDebug?: SocketProviderDebugOptions; destroyLeaveMeta: z.output<C['leaveMetaMessage']> }\n >\n ) => (\n <SocketProvider<T, C>\n events={events}\n baseOptions={baseOptions}\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 SocketConnectionConfig>(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 =\n '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: { resolvedSocket },\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: 'missing' });\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resolvedSocket]);\n\n trackHookTrigger({\n ref: clientMemoDebugRef,\n hook: 'client_memo',\n providerDebug: providerDebugRef.current,\n snapshot: { events, baseOptions, socket },\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 React.useEffect(() => {\n trackHookTrigger({\n ref: destroyEffectDebugRef,\n hook: 'destroy_effect',\n providerDebug: providerDebugRef.current,\n snapshot: { client, destroyLeaveMeta },\n });\n return () => {\n if (client) {\n client.destroy(destroyLeaveMeta);\n dbg(providerDebugRef.current, { type: 'client', phase: 'destroy' });\n }\n };\n }, [client, destroyLeaveMeta]);\n\n dbg(providerDebugRef.current, { type: 'render', hasClient:!!client });\n return <SocketCtx.Provider value={client}>{client==null? fallback?? children:children}</SocketCtx.Provider>;\n}\n\nfunction useSocketClient<T extends EventMap, C extends SocketConnectionConfig>(): 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 SocketConnectionConfig,\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 deps?: React.DependencyList;\n joinMeta: z.output<C['joinMetaMessage']>;\n leaveMeta: z.output<C['leaveMetaMessage']>;\n};\n\nfunction useSocketConnection<T extends EventMap, K extends keyof T & string, C extends SocketConnectionConfig>(\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 }, args.deps ?? [client, event, onMessage, autoJoin, autoLeave, ...normalizedRooms]);\n}\n","// socket.client.index.ts\n\nimport type { ManagerOptions, Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type { EventMap, SocketConnectionConfig } 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\nexport type Payload<T extends EventMap, K extends keyof T> = z.infer<T[K]['message']>;\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\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 SocketConnectionConfig = SocketConnectionConfig,\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 SocketConnectionConfig = SocketConnectionConfig> {\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 ? { err: 'Socket is missing. ' } : { socketId: this.socket?.id,\n snapshot: snapshot,})\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\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 socketId: this.socket.id,\n details: {\n heartbeatIntervalMs: this.hb.intervalMs,\n heartbeatTimeoutMs: this.hb.timeoutMs,\n environment: this.environment,\n },\n });\n this.logSocketConfigSnapshot('constructor');\n }\n\n /* socket lifecycle → connection bucket, now sys map aware */\n this.onConnect = () => {\n if(!this.socket){\n this.dbg({ type: 'connection', phase: 'connect', err: 'Socket is null' });\n throw new Error('Socket is null in onConnect handler');\n }\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_event');\n this.getSysEvent('sys:connect')({\n socket: this.socket,\n client: this,\n });\n };\n\n this.onReconnect = (attempt) => {\n if(!this.socket){\n this.dbg({ type: 'connection', phase: 'reconnect', err: 'Socket is null' });\n throw new Error('Socket is null in onReconnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'reconnect',\n attempt,\n id: this.socket.id,\n details: {\n nsp: this.getNamespace(this.socket),\n },\n });\n this.logSocketConfigSnapshot( 'reconnect_event');\n this.getSysEvent('sys:reconnect')({\n attempt,\n socket: this.socket,\n client: this,\n });\n };\n\n this.onDisconnect = (reason) => {\n if(!this.socket){\n this.dbg({ type: 'connection', phase: 'disconnect', err: 'Socket is null' });\n throw new Error('Socket is null in onDisconnect handler');\n }\n this.dbg({\n type: 'connection',\n phase: 'disconnect',\n reason: String(reason),\n details: {\n roomsTracked: this.roomCounts.size,\n },\n });\n this.logSocketConfigSnapshot( 'disconnect_event');\n this.getSysEvent('sys:disconnect')({\n reason: String(reason),\n socket: this.socket,\n client:this,\n });\n };\n\n this.onConnectError = (err) => {\n if(!this.socket){\n this.dbg({ type: 'connection', phase: 'connect_error', 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',\n err: String(err),\n details: this.getVerboseDetails({ rawError: err }),\n });\n this.logSocketConfigSnapshot( 'connect_error_event');\n this.getSysEvent('sys:connect_error')({\n error: String(err),\n socket: this.socket,\n client:this,\n });\n };\n\n this.onPong = (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 this.getSysEvent('sys:pong')({\n socket: this.socket,\n payload: validated as z.output<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();\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 = () => {\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 \n const payload = 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() {\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 details: {\n hadTimer,\n },\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 joinRooms(rooms: string[] | string, meta: z.output<C['joinMetaMessage']>): 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 !this.getSysEvent('sys:room_join')({\n rooms,\n meta,\n socket:this.socket,\n client:this\n })){\n this.dbg({ type: 'room', phase: 'join', rooms: this.toArray(rooms), err: 'sys:room_join handler aborted join' });\n return;\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;\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 }\n\n leaveRooms(rooms: string[] | string, meta: z.output<C['leaveMetaMessage']>): 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 !this.getSysEvent('sys:room_leave')({\n rooms,\n meta,\n socket:this.socket,\n client:this\n })){\n this.dbg({ type: 'room', phase: 'leave', rooms: this.toArray(rooms), err: 'sys:room_leave handler aborted leave' });\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 = (\n envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>,\n ) => {\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 destroy(leaveMeta: z.output<C['leaveMetaMessage']>): void {\n // stop heartbeat timer\n this.stopHeartbeat();\n\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\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 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();\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';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACSO,IAAM,iBAA0B,OAAU,QAAgC;AAC/E,QAAM,UAAkC,EAAE,GAAI,IAAI,WAAW,CAAC,EAAG;AACjE,QAAM,aAAa,OAAO,aAAa,eAAe,IAAI,gBAAgB;AAC1E,MAAI,CAAC,YAAY;AACf,0DAA4B;AAC5B,8CAAsB;AAAA,EACxB;AAEA,QAAM,MAAM,MAAM,MAAM,IAAI,KAAK;AAAA,IAC/B,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA,MAAM,aAAc,IAAI,OAAe,IAAI,QAAQ,OAAO,SAAY,KAAK,UAAU,IAAI,IAAI;AAAA,EAC/F,CAAC;AAED,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,UAAU,KAAK,MAAM,GAAG,GAAG;AACjC,UAAM,IAAI,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,UAAU,WAAM,OAAO,EAAE;AAAA,EAClE;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACjCA,yBAOO;AAEP,+BAIO;AAwCP,IAAM,UAAU,CAAC,MAAyC,EAAE,YAAY;AAQxE,SAAS,OAAU,OAAgB,QAAqB;AACtD,SAAO,SAAU,OAAO,MAAM,KAAK,IAAW;AAChD;AAOA,SAAS,eAAe,OAA4C;AAClE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,IAAI,gBAAgB;AACnC,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,QAAI,KAAK,KAAM;AACf,QAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,QAAE,QAAQ,CAAC,MAAM;AACf,YAAI,KAAK,KAAM;AACf,YAAI,OAAO,MAAM,UAAU;AACzB,iBAAO,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC;AAAA,QACpC,OAAO;AACL,iBAAO,OAAO,GAAG,OAAO,CAAC,CAAC;AAAA,QAC5B;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,QAAI,OAAO,MAAM,UAAU;AACzB,aAAO,IAAI,GAAG,KAAK,UAAU,CAAC,CAAC;AAC/B;AAAA,IACF;AACA,WAAO,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,EACzB;AACA,QAAM,IAAI,OAAO,SAAS;AAC1B,SAAO,IAAI,IAAI,CAAC,KAAK;AACvB;AAQA,SAAS,SAAwD,KAAQ,KAAgB;AACvF,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,EAAE,CAAC,GAAG,GAAG,OAAO,GAAG,KAAK,IAAI;AAClC,SAAO;AACT;AAOA,IAAM,uBAAuB,CAAC,MAC5B,KAAK,OAAO,MAAM,YAAY,gBAAgB,IAAK,EAAU,aAAa;AAK5E,IAAM,qBAA6C,CAAC,UAAiC;AACnF,MAAI,OAAO,YAAY,YAAa;AACpC,QAAM,KAAK,QAAQ,SAAS,QAAQ;AACpC,MAAI,KAAK,SAAS,qBAAqB,KAAK;AAC9C;AAEA,IAAM,kBAAmD;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOA,IAAM,WAAW,MAAM;AAAC;AAExB,SAAS,mBACP,QACA,aACqB;AACrB,QAAM,WAAgC,EAAE,MAAM,UAAU,MAAM,UAAU;AAExE,MAAI,eAAe,YAAY,YAAY,MAAM,cAAc;AAC7D,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI,WAAW,QAAQ,WAAW,WAAW;AAC3C,WAAO;AAAA,MACL,MAAM,CAAC,OAAO,SAAS,mBAAmB,OAAO,EAAE,GAAG,OAAO,KAAK,IAAI,KAAK;AAAA,MAC3E,MAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,WAAW,YAAY;AACzB,WAAO;AAAA,MACL,MAAM,CAAC,OAAO,SAAS,mBAAmB,OAAO,EAAE,GAAG,OAAO,KAAK,IAAI,KAAK;AAAA,MAC3E,MAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,OAAO,WAAW,YAAY;AAChC,WAAO;AAAA,MACL,MAAM,CAAC,OAAO,SAAS,OAAO,OAAO,EAAE,GAAG,OAAO,KAAK,IAAI,KAAK;AAAA,MAC/D,MAAM;AAAA,IACR;AAAA,EACF;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,UAAU;AAChB,UAAM,UAAU,QAAQ,QAAQ,OAAO;AACvC,UAAM,eAAe,gBAAgB,OAAO,CAAC,SAAS,QAAQ,IAAI,CAAC;AACnE,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO,EAAE,MAAM,UAAU,MAAM,UAAU,aAAa,UAAU;AAAA,IAClE;AACA,UAAM,YAAY,IAAI,IAAmC,YAAY;AACrE,UAAM,UACJ,QAAQ,QAAQ,QAAQ,KAAK,SAAS,IAAI,IAAI,IAAW,QAAQ,IAAI,IAAI;AAC3E,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,OAAoC,CAAC,OAAO,SAAS;AACzD,UAAI,CAAC,UAAU,IAAI,MAAM,IAAI,EAAG;AAChC,UAAI,SAAS;AACX,YAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,EAAG;AAAA,MACnC;AACA,aAAO,OAAO,EAAE,GAAG,OAAO,KAAK,IAAI,KAAK;AAAA,IAC1C;AACA,WAAO,EAAE,MAAM,MAAM,UAAU,aAAa,UAAU;AAAA,EACxD;AAEA,SAAO;AACT;AAQA,SAAS,YAA+B,MAA4C;AAClF,SAAQ,KAA0B,CAAC;AACrC;AAUA,SAAS,SACP,MACA,SACA,QACA,OACA;AACA,QAAM,mBAAmB,OAAuB,QAAQ,KAAK,IAAI,YAAY;AAC7E,QAAM,kBAAkB,OAAsB,OAAO,KAAK,IAAI,WAAW;AACzE,QAAM,WAAO,sCAAuB,KAAK,MAAO,oBAAoB,CAAC,CAAS;AAC9E,QAAM,MAAM,GAAG,WAAW,EAAE,GAAG,IAAI,GAAG,eAAe,eAAsB,CAAC;AAC5E,SAAO,EAAE,KAAK,iBAAiB,iBAAiB;AAClD;AAUO,SAAS,kBACd,MACoB;AACpB,QAAM,cAAc,KAAK;AACzB,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,UAAU,KAAK;AACrB,QAAM,cAAc,KAAK,eAAe;AACxC,QAAM,gBAAgB,KAAK,iBAAiB;AAC5C,QAAM,cACJ,KAAK,eAAe;AACtB,QAAM,EAAE,MAAM,WAAW,MAAM,UAAU,IAAI,mBAA0B,KAAK,OAAO,WAAW;AAC9F,QAAM,iBAAiB,cAAc;AACrC,QAAM,qBAAqB,CACzB,OACA,YAC0B;AAC1B,QAAI,CAAC,kBAAkB,CAAC,QAAS,QAAO;AACxC,WAAO,EAAE,GAAG,OAAO,GAAG,QAAQ;AAAA,EAChC;AAOA,iBAAe,WAAW,QAAkB,QAAQ,OAAO;AACzD,UAAM,WAAW;AACjB,UAAM,YAAY,kBAAkB,EAAE,UAAU,MAAM,CAAC;AACvD,cAAU,EAAE,MAAM,cAAc,KAAK,UAAU,MAAM,CAAC;AAAA,EACxD;AAQA,WAAS,cACP,MACA,QACA,MACiB;AACjB,UAAM,QAAQ,KAAK,WAAW;AAC9B,UAAM,SAAS,CAAC,CAAC,KAAK,IAAI;AAC1B,UAAM,SAAS,QAAQ,KAAK,MAAM;AAClC,UAAM,YAAY,GAAG,KAAK,OAAO,YAAY,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC;AACnE,UAAM,YAAY,MAAM;AACxB,UAAM,OAAO,CAAC,UAAiC,UAAU,OAAO,SAAS;AACzE,SAAK,EAAE,MAAM,SAAS,MAAM,UAAU,CAAC;AAGvC,UAAM,MAAM,IAAI,UAAkC;AAChD,YAAM,IAAI,YAAe,KAAK;AAC9B,YAAM,SAAU,GAAW;AAC3B,YAAM,QAAS,GAAW;AAC1B,YAAM,UAAU,SAAS,SAAS,SAAS,OAAc,WAAW,IAAK;AACzE,iBAAO,wCAAc,EAAE,MAAM,QAAuB,OAAO,QAAQ,CAAC;AAAA,IACtE;AAMA,UAAM,kBAAkB,UAAU,UAAwB;AACxD,YAAM,WAAW,IAAI,GAAG,KAAK;AAC7B,YAAM,YAAY,kBAAkB,EAAE,UAAU,OAAO,KAAK,CAAC;AAC7D,WAAK,EAAE,MAAM,cAAc,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,IACzD;AAMA,UAAM,UAAU,IAAI,SAAyD;AAC3E,YAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAC3B,YAAM,IAAI,IAAI,GAAI,IAAqB;AACvC,UAAI,SAAS,QAAQ;AACnB,oBAAY;AAAA,UAAuD;AAAA,UAAG,CAAC,SACrE,OAAO,YAAY,aAAc,QAAgB,IAAI,IAAK;AAAA,QAC5D;AAAA,MACF,OAAO;AACL,oBAAY;AAAA,UAAyC;AAAA,UAAG,CAAC,SACvD,OAAO,YAAY,aAAc,QAAgB,IAAI,IAAK;AAAA,QAC5D;AAAA,MACF;AACA,WAAK,EAAE,MAAM,WAAW,KAAK,EAAE,CAAC;AAAA,IAClC;AAGA,QAAI,SAAS,QAAQ;AACnB,YAAMA,eAA+C,IAAI,UAAU;AACjE,aAAK,EAAE,MAAM,eAAe,MAAM,WAAW,SAAS,cAAc,CAAC;AACrE,cAAM,IAAI,YAAe,KAAK;AAC9B,cAAM,SAAU,GAAW;AAC3B,cAAM,QAAS,GAAW;AAG1B,cAAM,EAAE,iBAAiB,iBAAiB,IAAI,SAAS,MAAM,SAAS,QAAQ,KAAK;AACnF,mBAAO,qCAML;AAAA,UACA,GAAI;AAAA,UACJ,UAAU,IAAI,GAAG,KAAK;AAAA,UACtB,kBAAkB;AAAA,UAClB,kBAAkB,CAAC,aAAa,cAAc,QAAQ;AAAA,UACtD,iBAAiB;AAAA,UACjB,SAAS,OAAO,EAAE,UAAU,MAAM;AAChC,kBAAM,YAAY;AAAA,cAChB,GAAI;AAAA,cACJ,GAAI,YAAY,EAAE,CAAC,WAAW,GAAG,UAAU,IAAI,CAAC;AAAA,YAClD;AACA,kBAAM,EAAE,IAAI,IAAI,SAAS,MAAM,SAAS,QAAQ,SAAS;AACzD,kBAAM,YAAY,KAAK,IAAI;AAC3B,kBAAM,SAAS,iBAAiB,EAAE,QAAQ,kBAAkB,OAAO,UAAU,IAAI;AACjF;AAAA,cACE;AAAA,gBACE,EAAE,MAAM,SAAS,OAAO,SAAS,QAAQ,KAAK,MAAM,UAAU;AAAA,gBAC9D;AAAA,cACF;AAAA,YACF;AACA,gBAAI;AACF,oBAAM,MAAM,MAAM,QAAiB,EAAE,KAAK,OAAO,CAAC;AAClD,oBAAM,SAAS,OAAuB,KAAK,KAAK,IAAI,YAAY;AAGhE,cAAC,QACG,YAAY,MAAM;AAEtB;AAAA,gBACE;AAAA,kBACE;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA,MAAM;AAAA,oBACN,YAAY,KAAK,IAAI,IAAI;AAAA,kBAC3B;AAAA,kBACA,iBAAiB,EAAE,QAAQ,kBAAkB,OAAO,WAAW,QAAQ,OAAO,IAAI;AAAA,gBACpF;AAAA,cACF;AACA,qBAAO;AAAA,YACT,SAAS,OAAO;AACd;AAAA,gBACE;AAAA,kBACE;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA,MAAM;AAAA,oBACN,YAAY,KAAK,IAAI,IAAI;AAAA,oBACzB;AAAA,kBACF;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AACA,oBAAM;AAAA,YACR;AAAA,UACF;AAAA;AAAA,QAEF,GAAG,WAAW;AAAA,MAChB;AAEA,aAAO;AAAA,QACL;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,aAAAA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO;AACT,YAAMA,eAA4C,IAAI,UAAU;AAC9D,aAAK,EAAE,MAAM,eAAe,MAAM,WAAW,SAAS,MAAM,CAAC;AAC7D,cAAM,IAAI,YAAe,KAAK;AAC9B,cAAM,SAAU,GAAW;AAC3B,cAAM,QAAS,GAAW;AAE1B,cAAM,EAAE,KAAK,iBAAiB,iBAAiB,IAAI,SAAS,MAAM,SAAS,QAAQ,KAAK;AACxF,mBAAO,6BAA4D;AAAA,UACjE,GAAI;AAAA,UACJ,UAAU,IAAI,GAAG,KAAK;AAAA,UACtB,iBAAiB;AAAA,UACjB,SAAS,YAAY;AACnB,kBAAM,YAAY,KAAK,IAAI;AAC3B,kBAAM,SAAS,iBACX,EAAE,QAAQ,kBAAkB,OAAO,gBAAgB,IACnD;AACJ;AAAA,cACE;AAAA,gBACE,EAAE,MAAM,SAAS,OAAO,SAAS,QAAQ,KAAK,MAAM,UAAU;AAAA,gBAC9D;AAAA,cACF;AAAA,YACF;AACA,gBAAI;AACF,oBAAM,MAAM,MAAM,QAAiB,EAAE,KAAK,OAAO,CAAC;AAClD,oBAAM,SAAS,OAAuB,KAAK,KAAK,IAAI,YAAY;AAGhE,cAAC,QACG,YAAY,MAAM;AAEtB;AAAA,gBACE;AAAA,kBACE;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA,MAAM;AAAA,oBACN,YAAY,KAAK,IAAI,IAAI;AAAA,kBAC3B;AAAA,kBACA,iBACI,EAAE,QAAQ,kBAAkB,OAAO,iBAAiB,QAAQ,OAAO,IACnE;AAAA,gBACN;AAAA,cACF;AACA,qBAAO;AAAA,YACT,SAAS,OAAO;AACd;AAAA,gBACE;AAAA,kBACE;AAAA,oBACE,MAAM;AAAA,oBACN,OAAO;AAAA,oBACP;AAAA,oBACA;AAAA,oBACA,MAAM;AAAA,oBACN,YAAY,KAAK,IAAI,IAAI;AAAA,oBACzB;AAAA,kBACF;AAAA,kBACA;AAAA,gBACF;AAAA,cACF;AACA,oBAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,GAAG,WAAW;AAAA,MAChB;AAEA,aAAO;AAAA,QACL;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,QACA,aAAAA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAA2C,UAC5C,kBACA;AACH,UAAI,cAAc,WAAW,GAAG;AAC9B,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACpE;AACA,YAAM,YAAY,cAAc,SAAS;AACzC,YAAM,QAAQ,cAAc,MAAM,GAAG,SAAS;AAC9C,YAAM,OAAO,cAAc,SAAS;AACpC,YAAM,OAAO,YAAe,KAAK;AACjC,YAAM,SAAU,MAAc;AAC9B,YAAM,QAAS,MAAc;AAE7B,YAAM,EAAE,KAAK,iBAAiB,iBAAiB,IAAI,SAAS,MAAM,SAAS,QAAQ,KAAK;AACxF,YAAM,iBAAiB,OAAqB,MAAM,KAAK,IAAI,UAAU;AAErE,YAAM,cAAc,MAAM,QAAQ,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,UAAU,SAAS;AACrF,YAAM,UAAU,cAAc,WAAW,cAAqB,IAAI;AAElE,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,SAAS,iBACX,EAAE,QAAQ,kBAAkB,OAAO,gBAAgB,IACnD;AACJ;AAAA,QACE;AAAA,UACE;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,YACP;AAAA,YACA;AAAA,YACA,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI;AACF,cAAM,MAAM,MAAM,QAAiB,EAAE,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACjE,cAAM,SAAS,OAAuB,KAAK,KAAK,IAAI,YAAY;AAGhE,QAAC,QACG,YAAY,MAAM;AAEtB;AAAA,UACE;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,cACP;AAAA,cACA;AAAA,cACA,MAAM;AAAA,cACN,YAAY,KAAK,IAAI,IAAI;AAAA,YAC3B;AAAA,YACA,iBACI,EAAE,QAAQ,kBAAkB,OAAO,iBAAiB,QAAQ,OAAO,IACnE;AAAA,UACN;AAAA,QACF;AACA,eAAO;AAAA,MACT,SAAS,OAAO;AACd;AAAA,UACE;AAAA,YACE;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,cACP;AAAA,cACA;AAAA,cACA,MAAM;AAAA,cACN,YAAY,KAAK,IAAI,IAAI;AAAA,cACzB,MAAM;AAAA,cACN;AAAA,YACF;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,cAA+C,IAAI,UAAU;AACjE,WAAK,EAAE,MAAM,eAAe,MAAM,WAAW,SAAS,WAAW,CAAC;AAClE,iBAAO,gCAA4D;AAAA,QACjE,GAAI;AAAA,QACJ,aAAa,IAAI,GAAG,KAAK;AAAA,QACzB,YAAY,CAAC,SACX,cAAc,GAAI,CAAC,GAAG,OAAO,IAAI,CAAqC;AAAA,MAC1E,GAAG,WAAW;AAAA,IAChB;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAKA,SAAS,WAAW,MAAqC;AACvD,QAAM,KAAK,IAAI,SAAS;AACxB,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAAC,GAAG;AAC/C,QAAI,KAAK,KAAM;AACf,QAAI,MAAM,QAAQ,CAAC,EAAG,GAAE,QAAQ,CAAC,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,IAAW,CAAC;AAAA,QAC5E,IAAG,OAAO,GAAG,CAAQ;AAAA,EAC5B;AACA,SAAO;AACT;;;AC1lBA,iBAAkB;AA2FlB,IAAM,kBAAkB,aAAE,MAAM,CAAC,aAAE,MAAM,aAAE,OAAO,CAAC,GAAG,aAAE,OAAO,CAAC,CAAC;AAO1D,IAAM,yBAAyB,CAA4B,eAChE,aAAE,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AACR,CAAC;;;ACvGH,YAAuB;AACvB,oBAAuB;AAkHjB;AAjEN,IAAM,YAAkB,oBAAgE,IAAI;AAE5F,SAAS,IAAI,SAAiD,GAA6B;AACzF,MAAI,CAAC,SAAS,OAAQ;AACtB,MAAI,CAAC,QAAQ,EAAE,IAAI,EAAG;AACtB,UAAQ,OAAO,CAAC;AAClB;AAKA,SAAS,sBAAsB,OAAgC;AAC7D,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,YAAY,OAAO;AACzB,MAAI,cAAc,YAAY,cAAc,YAAY,cAAc,UAAW,QAAO;AACxF,MAAI,cAAc,YAAY,cAAc,SAAU,QAAO,OAAO,KAAK;AACzE,MAAI,cAAc,WAAY,QAAO,aAAc,MAAmB,QAAQ,WAAW;AACzF,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,iBAAiB,MAAM,MAAM;AAC9D,MAAI,iBAAiB,sBAAQ;AAC3B,UAAM,SAAS;AACf,WAAO,cAAc,OAAO,MAAM,SAAS,cAAc,OAAO,aAAa,KAAK;AAAA,EACpF;AACA,QAAM,WAAY,MAA8C,aAAa,QAAQ;AACrF,QAAM,OAAO,OAAO,KAAK,KAAgC;AACzD,QAAM,aAAa,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAC5C,QAAM,SAAS,KAAK,SAAS,IAAI,YAAO;AACxC,SAAO,IAAI,QAAQ,SAAS,UAAU,GAAG,MAAM;AACjD;AAEA,SAAS,qBAAqB,MAAgC,MAAyB,MAAkF;AACvK,QAAM,SAA0B,OAAO,WAAW;AAClD,QAAM,UAAU,OAAO,KAAK,IAAI,EAAE,OAAsF,CAAC,KAAK,eAAe;AAC3I,UAAM,YAAY,OAAO,KAAK,UAAU,IAAI;AAC5C,UAAM,YAAY,KAAK,UAAU;AACjC,QAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,WAAW,SAAS,GAAG;AAC7C,UAAI,KAAK,EAAE,YAAY,UAAU,sBAAsB,SAAS,GAAG,MAAM,sBAAsB,SAAS,EAAE,CAAC;AAAA,IAC7G;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,SAAO,EAAE,MAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ;AACxD;AAEA,SAAS,iBAAiB,EAAE,KAAK,MAAM,eAAe,SAAS,GAA6J;AAC1N,QAAM,OAAO,IAAI;AACjB,MAAI,UAAU;AACd,MAAI,CAAC,eAAe,UAAU,CAAC,eAAe,KAAM;AACpD,QAAM,QAAQ,qBAAqB,MAAM,UAAU,IAAI;AACvD,MAAI,MAAO,KAAI,eAAe,KAAK;AACrC;AAEO,SAAS,oBAA0E,MAGvF;AACD,QAAM,EAAE,QAAQ,SAAS,YAAY,IAAI;AAEzC,SAAO;AAAA,IACL,gBAAgB,CACd,UAIA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,MAAM,gBAAsB;AAAA,IAC7C,qBAAqB,CACnB,MACG,oBAA6B,CAAC;AAAA,EACrC;AACF;AAEA,SAAS,eAAqE,OAAkC;AAC9G,QAAM,EAAE,QAAQ,aAAa,UAAU,UAAU,eAAe,iBAAiB,IAAI;AAGrF,QAAM,CAAC,gBAAgB,iBAAiB,IAAU,eAAwB,IAAI;AAG9E,QAAM,SACJ,YAAY,QAAQ,MAAM,UAAU,OAAO;AAE7C,QAAM,mBAAyB,aAA+C;AAC9E,mBAAiB,UAAU;AAE3B,QAAM,wBAA8B,aAAiC,IAAI;AACzE,QAAM,qBAA2B,aAAiC,IAAI;AACtE,QAAM,wBAA8B,aAAiC,IAAI;AAEzE,EAAM,gBAAU,MAAM;AACpB,qBAAiB;AAAA,MACf,KAAK;AAAA,MACL,MAAM;AAAA,MACN,eAAe,iBAAiB;AAAA,MAChC,UAAU,EAAE,eAAe;AAAA,IAC7B,CAAC;AACD,QAAI,EAAE,eAAe,OAAQ;AAE7B,QAAI,YAAY;AAChB,QAAI,iBAAiB,SAAS,EAAE,MAAM,WAAW,OAAO,QAAQ,CAAC;AAEjE,QAAI,CAAC,gBAAgB;AACnB,cAAQ,QAAQ,MAAM,UAAU,CAAC,EAC9B,KAAK,CAAC,MAAM;AACX,YAAI,WAAW;AACb,cAAI,iBAAiB,SAAS,EAAE,MAAM,WAAW,OAAO,YAAY,CAAC;AACrE;AAAA,QACF;AACA,YAAI,CAAC,GAAG;AACN,cAAI,iBAAiB,SAAS,EAAE,MAAM,WAAW,OAAO,UAAU,CAAC;AACnE;AAAA,QACF;AACA,0BAAkB,CAAC;AACnB,YAAI,iBAAiB,SAAS,EAAE,MAAM,WAAW,OAAO,KAAK,CAAC;AAAA,MAChE,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,YAAI,UAAW;AACf,YAAI,iBAAiB,SAAS,EAAE,MAAM,WAAW,OAAO,SAAS,KAAK,OAAO,GAAG,EAAE,CAAC;AAAA,MACrF,CAAC;AAAA,IACL;AAEA,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EAEF,GAAG,CAAC,cAAc,CAAC;AAEnB,mBAAiB;AAAA,IACf,KAAK;AAAA,IACL,MAAM;AAAA,IACN,eAAe,iBAAiB;AAAA,IAChC,UAAU,EAAE,QAAQ,aAAa,OAAO;AAAA,EAC1C,CAAC;AAED,QAAM,SAAe,cAAQ,MAAM;AACjC,QAAI,CAAC,QAAQ;AACX,UAAI,iBAAiB,SAAS,EAAE,MAAM,UAAU,OAAO,QAAQ,SAAQ,KAAK,CAAC;AAC7E,aAAO;AAAA,IACT;AACA,UAAM,IAAI,IAAI,aAAmB,QAAQ,EAAE,GAAG,aAAa,OAAO,CAAC;AACnE,QAAI,iBAAiB,SAAS,EAAE,MAAM,UAAU,OAAO,QAAQ,SAAQ,MAAM,CAAC;AAC9E,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,aAAa,MAAM,CAAC;AAEhC,EAAM,gBAAU,MAAM;AACpB,qBAAiB;AAAA,MACf,KAAK;AAAA,MACL,MAAM;AAAA,MACN,eAAe,iBAAiB;AAAA,MAChC,UAAU,EAAE,QAAQ,iBAAiB;AAAA,IACvC,CAAC;AACD,WAAO,MAAM;AACX,UAAI,QAAQ;AACV,eAAO,QAAQ,gBAAgB;AAC/B,YAAI,iBAAiB,SAAS,EAAE,MAAM,UAAU,OAAO,UAAU,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,gBAAgB,CAAC;AAE7B,MAAI,iBAAiB,SAAS,EAAE,MAAM,UAAW,WAAU,CAAC,CAAC,OAAO,CAAC;AACrE,SAAO,4CAAC,UAAU,UAAV,EAAmB,OAAO,QAAS,oBAAQ,OAAM,YAAW,WAAS,UAAS;AACxF;AAEA,SAAS,kBAA4F;AACnG,QAAM,MAAY,iBAAW,SAAS;AACtC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,qDAAqD;AAC/E,SAAO;AACT;AAuBA,SAAS,oBACP,MACA;AACA,QAAM,EAAE,OAAO,OAAO,WAAW,WAAW,WAAW,MAAM,YAAY,KAAK,IAAI;AAClF,QAAM,SAAS,gBAAsB;AAErC,QAAM,kBAAwB;AAAA,IAC5B,MAAO,SAAS,OAAO,CAAC,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAAA,IACjE,CAAC,KAAK;AAAA,EACR;AAEA,EAAM,gBAAU,MAAM;AACpB,QAAI,YAAY,gBAAgB,SAAS,EAAG,QAAO,UAAU,iBAAiB,KAAK,QAAQ;AAC3F,UAAM,cAAc,OAAO,GAAG,OAAO,SAAS;AAE9C,WAAO,MAAM;AACX,kBAAY;AACZ,UAAI,aAAa,gBAAgB,SAAS,EAAG,QAAO,WAAW,iBAAiB,KAAK,SAAS;AAC9F,UAAI,UAAW,WAAU;AAAA,IAC3B;AAAA,EACF,GAAG,KAAK,QAAQ,CAAC,QAAQ,OAAO,WAAW,UAAU,WAAW,GAAG,eAAe,CAAC;AACrF;;;ACrLO,IAAM,eAAN,MAAkG;AAAA,EA4FvG,YAAY,QAAW,MAAiC;AA/ExD,SAAQ,UAAiD;AAUzD;AAAA,SAAiB,aAAa,oBAAI,IAAoB;AACtD,SAAiB,aAAa,oBAAI,IAAuC;AAqEvE,SAAK,SAAS;AACd,SAAK,SAAS,KAAK,UAAU;AAE7B,SAAK,cAAc,KAAK,eAAe;AACvC,SAAK,QAAQ,KAAK,SAAS,CAAC;AAC5B,SAAK,SAAS,KAAK;AACnB,SAAK,YAAY,KAAK;AACtB,SAAK,iBAAiB,uBAAuB,KAAK,OAAO,eAAe;AACxE,SAAK,kBAAkB,uBAAuB,KAAK,OAAO,gBAAgB;AAG1E,UAAM,KAAK,KAAK,aAAa,CAAC;AAC9B,SAAK,KAAK;AAAA,MACR,YAAY,GAAG,cAAc;AAAA,MAC7B,WAAW,GAAG,aAAa;AAAA,IAC7B;AAEA,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACP,CAAC;AAAA,IACH,OAAO;AACL,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU,KAAK,OAAO;AAAA,QACtB,SAAS;AAAA,UACP,qBAAqB,KAAK,GAAG;AAAA,UAC7B,oBAAoB,KAAK,GAAG;AAAA,UAC5B,aAAa,KAAK;AAAA,QACpB;AAAA,MACF,CAAC;AACD,WAAK,wBAAwB,aAAa;AAAA,IAC5C;AAGA,SAAK,YAAY,MAAM;AACrB,UAAG,CAAC,KAAK,QAAO;AACd,aAAK,IAAI,EAAE,MAAM,cAAc,OAAO,WAAW,KAAK,iBAAiB,CAAC;AACxE,cAAM,IAAI,MAAM,qCAAqC;AAAA,MACvD;AACA,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,IAAI,KAAK,OAAO;AAAA,QAChB,SAAS;AAAA,UACP,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,QACpC;AAAA,MACF,CAAC;AACD,WAAK,wBAAyB,eAAe;AAC7C,WAAK,YAAY,aAAa,EAAE;AAAA,QAC9B,QAAQ,KAAK;AAAA,QACb,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,SAAK,cAAc,CAAC,YAAY;AAC9B,UAAG,CAAC,KAAK,QAAO;AACd,aAAK,IAAI,EAAE,MAAM,cAAc,OAAO,aAAa,KAAK,iBAAiB,CAAC;AAC1E,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AACA,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP;AAAA,QACA,IAAI,KAAK,OAAO;AAAA,QAChB,SAAS;AAAA,UACP,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,QACpC;AAAA,MACF,CAAC;AACD,WAAK,wBAAyB,iBAAiB;AAC/C,WAAK,YAAY,eAAe,EAAE;AAAA,QAChC;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,SAAK,eAAe,CAAC,WAAW;AAC9B,UAAG,CAAC,KAAK,QAAO;AACd,aAAK,IAAI,EAAE,MAAM,cAAc,OAAO,cAAc,KAAK,iBAAiB,CAAC;AAC3E,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AACA,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,OAAO,MAAM;AAAA,QACrB,SAAS;AAAA,UACP,cAAc,KAAK,WAAW;AAAA,QAChC;AAAA,MACF,CAAC;AACD,WAAK,wBAAyB,kBAAkB;AAChD,WAAK,YAAY,gBAAgB,EAAE;AAAA,QACjC,QAAQ,OAAO,MAAM;AAAA,QACrB,QAAQ,KAAK;AAAA,QACb,QAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,SAAK,iBAAiB,CAAC,QAAQ;AAC7B,UAAG,CAAC,KAAK,QAAO;AACd,aAAK,IAAI,EAAE,MAAM,cAAc,OAAO,iBAAiB,KAAK,iBAAiB,CAAC;AAC9E,cAAM,IAAI,MAAM,0CAA0C;AAAA,MAC5D;AACA,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK,OAAO,GAAG;AAAA,QACf,SAAS,KAAK,kBAAkB,EAAE,UAAU,IAAI,CAAC;AAAA,MACnD,CAAC;AACD,WAAK,wBAAyB,qBAAqB;AACnD,WAAK,YAAY,mBAAmB,EAAE;AAAA,QACpC,OAAO,OAAO,GAAG;AAAA,QACjB,QAAQ,KAAK;AAAA,QACb,QAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,SAAK,SAAS,CAAC,QAAiB;AAC9B,UAAG,CAAC,KAAK,QAAO;AACd,aAAK,IAAI,EAAE,MAAM,aAAa,OAAO,aAAa,KAAK,iBAAiB,CAAC;AACzE,cAAM,IAAI,MAAM,kCAAkC;AAAA,MACpD;AACA,YAAM,SAAS,KAAK,OAAO,YAAY,UAAU,GAAG;AACpD,UAAI,CAAC,OAAO,SAAS;AACnB,aAAK,IAAI;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,KAAK,mCAAmC,OAAO,MAAM,OAAO;AAAA,UAC5D,SAAS,KAAK,qBAAqB,OAAO,KAAK;AAAA,QACjD,CAAC;AACD;AAAA,MACF;AACA,YAAM,YAAY,OAAO;AACvB,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AAEH,WAAK,YAAY,UAAU,EAAE;AAAA,QAC3B,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,GAAG,WAAW,KAAK,SAAS;AACxC,WAAK,OAAO,GAAG,aAAa,KAAK,WAAW;AAC5C,WAAK,OAAO,GAAG,cAAc,KAAK,YAAY;AAC9C,WAAK,OAAO,GAAG,iBAAiB,KAAK,cAAc;AACnD,WAAK,OAAO,GAAG,YAAY,KAAK,MAAM;AAAA,IACxC;AAAA,EACF;AAAA,EAhOQ,qBAAqB,QAAwD;AACnF,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,UAAW,OAAO,MAAM;AAC9B,UAAM,OAAmC;AAAA,MACvC,KAAK,KAAK,aAAa,MAAM;AAAA,IAC/B;AACA,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,OAAQ,QAAQ,QAAQ,CAAC;AAC/B,UAAM,aAAa,MAAM,QAAQ,KAAK,UAAU,IAC5C,KAAK,WAAW,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,IAChE;AACJ,UAAM,gBACJ,OAAO,QAAQ,QAAQ,WAAW,SAAS,WAAW,QAAQ,OAAO,WAAW,OAAO;AACzF,UAAM,aAAa,OAAO,QAAQ,gBAAgB,WAAW,QAAQ,cAAc;AACnF,UAAM,MAAM,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;AAE5D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,KAAK;AAAA,MACL,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,MAClD,WAAW,iBAAiB,aAAa,CAAC;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,aAAa,OAAO,KAAK,gBAAgB,YAAY,KAAK,cAAc;AAAA,MACxE,cAAc,OAAO,KAAK,iBAAiB,YAAY,KAAK,eAAe;AAAA,MAC3E,sBACE,OAAO,KAAK,yBAAyB,WAAW,KAAK,uBAAuB;AAAA,MAC9E,mBACE,OAAO,KAAK,sBAAsB,WAAW,KAAK,oBAAoB;AAAA,MACxE,sBACE,OAAO,KAAK,yBAAyB,WAAW,KAAK,uBAAuB;AAAA,MAC9E,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AAAA,MAC3D,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,MAC9D,MAAM,OAAO,KAAK,SAAS,YAAY,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,MACnF,QAAQ,OAAO,KAAK,WAAW,YAAY,KAAK,SAAS;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,wBAAwB,QAAsB;AACpD,QAAI,CAAC,KAAK,MAAM,UAAU,CAAC,KAAK,MAAM,OAAQ;AAC9C,UAAM,WAAW,KAAK,qBAAqB,KAAK,MAAM;AACtD,SAAK,IAAI;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACR,GAAI,YAAY,OAAO,EAAE,KAAK,sBAAsB,IAAI;AAAA,QAAO,UAAU,KAAK,QAAQ;AAAA,QACrF;AAAA,MAAmB;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEQ,qBAAqB,OAA6D;AACxF,QAAI,CAAC,KAAK,MAAM,QAAS,QAAO;AAChC,WAAO,EAAE,QAAQ,MAAM,OAAO;AAAA,EAChC;AAAA,EAEQ,kBAAkB,SAAuE;AAC/F,QAAI,CAAC,KAAK,MAAM,QAAS,QAAO;AAChC,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,QAAyC;AAC5D,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,MAAO,OAAe;AAC5B,WAAO,OAAO,QAAQ,WAAW,MAAM;AAAA,EACzC;AAAA,EAkKQ,YAA8C,MAA8B;AAClF,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;AAAA,EAEQ,IAAI,GAAgC;AAC1C,UAAM,IAAI,KAAK;AACf,QAAI,CAAC,EAAE,OAAQ;AACf,QAAI,CAAC,EAAE,EAAE,IAAI,EAAG;AAChB,QAAI,EAAE,QAAQ,WAAW,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE,KAAY,EAAG;AAChE,MAAE,OAAO,CAAC;AAAA,EACZ;AAAA;AAAA,EAGA,QAA6B;AAC3B,UAAM,QAAQ,MAAM,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE;AAC5F,UAAM,WAAW,MAAM,KAAK,KAAK,WAAW,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO;AAAA,MAC5E;AAAA,MACA,UAAU,IAAI;AAAA,IAChB,EAAE;AACF,WAAO;AAAA,MACL,YAAY,MAAM;AAAA,MAClB,eAAe,SAAS,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,UAAU,CAAC;AAAA,MAC1D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,QAAQ,OAAqC;AACnD,WAAO,SAAS,OAAO,CAAC,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAAA,EACnE;AAAA,EAEQ,sBAAsB,OAAiB;AAC7C,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,KAAK,WAAW,IAAI,IAAI,KAAK;AAC1C,YAAM,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;AACjC,UAAI,SAAS,EAAG,MAAK,WAAW,OAAO,IAAI;AAAA,UACtC,MAAK,WAAW,IAAI,MAAM,IAAI;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,uBAAuB,OAAiB;AAC9C,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,KAAK,WAAW,IAAI,IAAI,KAAK;AAC1C,WAAK,WAAW,IAAI,MAAM,OAAO,CAAC;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB;AACf,SAAK,cAAc;AACnB,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACP,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,KAAK;AAEpB,SAAK,IAAI;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,QACP,YAAY,KAAK,GAAG;AAAA,QACpB,WAAW,KAAK,GAAG;AAAA,MACrB;AAAA,IACF,CAAC;AAED,UAAM,OAAO,MAAM;AACjB,UAAI,CAAC,QAAQ;AACX,aAAK,IAAI;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,KAAK;AAAA,QACP,CAAC;AACD;AAAA,MACF;AAGA,YAAM,UAAU,KAAK,YAAY,UAAU,EAAE;AAAA,QAC3C;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,QAAQ,KAAK,OAAO,YAAY,UAAU,OAAO;AACvD,UAAI,CAAC,MAAM,SAAS;AAClB,aAAK,IAAI;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,KAAK;AAAA,UACL,SAAS,KAAK,qBAAqB,MAAM,KAAK;AAAA,QAChD,CAAC;AACD,YAAI,KAAK,gBAAgB,eAAe;AAEtC,kBAAQ,KAAK,0CAA0C,MAAM,MAAM,MAAM;AAAA,QAC3E;AACA;AAAA,MACF;AACA,YAAM,aAAa,MAAM;AACzB,aAAO,KAAK,YAAY,UAAU;AAClC,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,SAAK,UAAU,YAAY,MAAM,KAAK,GAAG,UAAU;AACnD,SAAK;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAgB;AACd,UAAM,WAAW,QAAQ,KAAK,OAAO;AACrC,QAAI,KAAK,SAAS;AAChB,oBAAc,KAAK,OAAO;AAC1B,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,IAAI;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,KACE,OACA,SACA,UACM;AACN,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,IAAI,EAAE,MAAM,QAAQ,OAAO,KAAK,iBAAiB,CAAC;AACvD;AAAA,IACF;AACA,UAAM,SAAS,KAAK,OAAO,KAAK,EAAE;AAClC,UAAM,SAAS,OAAO,UAAU,OAAO;AACvC,QAAI,CAAC,OAAO,SAAS;AACnB,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,KAAK;AAAA,QACL,SAAS,KAAK,qBAAqB,OAAO,KAAK;AAAA,MACjD,CAAC;AACD,YAAM,IAAI,MAAM,wBAAwB,KAAK,MAAM,OAAO,MAAM,OAAO,EAAE;AAAA,IAC3E;AAEA,SAAK,OAAO,KAAK,OAAO,KAAK,GAAG,OAAO,IAAI;AAC3C,SAAK,IAAI;AAAA,MACP,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,OAA0B,MAA4C;AAC9E,QAAG,CAAC,KAAK,QAAO;AACd,WAAK,IAAI,EAAE,MAAM,QAAQ,OAAO,QAAQ,OAAO,KAAK,QAAQ,KAAK,GAAG,KAAK,iBAAiB,CAAC;AAC3F,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QACM,CAAC,KAAK,YAAY,eAAe,EAAE;AAAA,MACrC;AAAA,MACA;AAAA,MACA,QAAO,KAAK;AAAA,MACZ,QAAO;AAAA,IACT,CAAC,GAAE;AACD,WAAK,IAAI,EAAE,MAAM,QAAQ,OAAO,QAAQ,OAAO,KAAK,QAAQ,KAAK,GAAG,KAAK,qCAAqC,CAAC;AAC/G;AAAA,IACF;AACF,UAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,UAAM,SAAmB,CAAC;AAC1B,eAAW,KAAK,MAAM;AACpB,YAAM,QAAQ,KAAK,WAAW,IAAI,CAAC,KAAK,KAAK;AAC7C,WAAK,WAAW,IAAI,GAAG,IAAI;AAC3B,UAAI,SAAS,EAAG,QAAO,KAAK,CAAC;AAAA,IAC/B;AACA,QAAI,OAAO,SAAS,KAAK,KAAK,QAAQ;AACpC,YAAM,gBAAgB,KAAK,eAAe,UAAU;AAAA,QAClD,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAED,UAAI,CAAC,cAAc,SAAS;AAC1B,aAAK,sBAAsB,MAAM;AACjC,aAAK,IAAI;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,KAAK;AAAA,UACL,SAAS,KAAK,qBAAqB,cAAc,KAAK;AAAA,QACxD,CAAC;AACD;AAAA,MACF;AACA,YAAM,UAAU,cAAc;AAC9B,YAAM,kBAAkB,KAAK,QAAQ,QAAQ,KAAK;AAChD,WAAK,OAAO,KAAK,iBAAiB,OAAO;AACzC,WAAK,IAAI,EAAE,MAAM,QAAQ,OAAO,QAAQ,OAAO,gBAAgB,CAAC;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,WAAW,OAA0B,MAA6C;AAChF,QAAG,CAAC,KAAK,QAAO;AACd,WAAK,IAAI,EAAE,MAAM,QAAQ,OAAO,SAAS,OAAO,KAAK,QAAQ,KAAK,GAAG,KAAK,iBAAiB,CAAC;AAC5F,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,QACM,CAAC,KAAK,YAAY,gBAAgB,EAAE;AAAA,MACtC;AAAA,MACA;AAAA,MACA,QAAO,KAAK;AAAA,MACZ,QAAO;AAAA,IACT,CAAC,GAAE;AACD,WAAK,IAAI,EAAE,MAAM,QAAQ,OAAO,SAAS,OAAO,KAAK,QAAQ,KAAK,GAAG,KAAK,uCAAuC,CAAC;AAClH;AAAA,IACF;AACF,UAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,UAAM,UAAoB,CAAC;AAC3B,eAAW,KAAK,MAAM;AACpB,YAAM,OAAO,KAAK,WAAW,IAAI,CAAC,KAAK;AACvC,YAAM,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC;AACjC,UAAI,SAAS,KAAK,OAAO,EAAG,SAAQ,KAAK,CAAC;AAC1C,UAAI,SAAS,EAAG,MAAK,WAAW,OAAO,CAAC;AAAA,UACnC,MAAK,WAAW,IAAI,GAAG,IAAI;AAAA,IAClC;AACA,QAAI,QAAQ,SAAS,KAAK,KAAK,QAAQ;AACrC,YAAM,gBAAgB,KAAK,gBAAgB,UAAU;AAAA,QACnD,OAAO;AAAA,QACP;AAAA,MACF,CAAC;AAED,UAAI,CAAC,cAAc,SAAS;AAC1B,aAAK,uBAAuB,OAAO;AACnC,aAAK,IAAI;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,KAAK;AAAA,UACL,SAAS,KAAK,qBAAqB,cAAc,KAAK;AAAA,QACxD,CAAC;AACD;AAAA,MACF;AAEA,YAAM,UAAU,cAAc;AAC9B,YAAM,kBAAkB,KAAK,QAAQ,QAAQ,KAAK;AAClD,WAAK,OAAO,KAAK,kBAAkB,OAAO;AAC1C,WAAK,IAAI,EAAE,MAAM,QAAQ,OAAO,SAAS,OAAO,gBAAgB,CAAC;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,GACE,OACA,SACY;AACZ,UAAM,SAAS,KAAK,OAAO,KAAK,EAAE;AAElC,SAAK,IAAI,EAAE,MAAM,YAAY,OAAO,YAAY,MAAM,CAAC;AAEvD,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,IAAI,EAAE,MAAM,YAAY,OAAO,YAAY,OAAO,KAAK,iBAAiB,CAAC;AAC9E,aAAO,MAAM;AAAA,MAAC;AAAA,IAChB;AAEA,UAAM,SAAS,KAAK;AAEpB,UAAM,UAAU,CACd,kBACG;AACH,YAAM,gBAAgB;AACtB,YAAM,UAAU,eAAe,QAAQ;AAEvC,YAAM,SAAS,OAAO,UAAU,OAAO;AACvC,UAAI,CAAC,OAAO,SAAS;AACnB,aAAK,IAAI;AAAA,UACP,MAAM;AAAA,UACN;AAAA,UACA,KAAK;AAAA,UACL,SAAS,KAAK,qBAAqB,OAAO,KAAK;AAAA,QACjD,CAAC;AACD;AAAA,MACF;AAEA,YAAM,aAAa,oBAAI,KAAK;AAC5B,YAAM,SAAS,eAAe,SAAS,IAAI,KAAK,cAAc,MAAM,IAAI;AAExE,YAAM,OAAO;AAAA,QACX,UAAU;AAAA,UACR,WAAY,eAAe,aAAa;AAAA,UACxC,QAAQ,eAAe,UAAU,WAAW,YAAY;AAAA,UACxD,QAAQ,eAAe,UAAU,CAAC;AAAA,UAClC,MAAM;AAAA,UACN,UAAU,eAAe;AAAA,QAC3B;AAAA,QACA,KAAK;AAAA,UACH;AAAA,UACA,WAAW,SAAS,KAAK,IAAI,GAAG,WAAW,QAAQ,IAAI,OAAO,QAAQ,CAAC,IAAI;AAAA,UAC3E,KAAK,KAAK,aAAa,MAAM;AAAA,UAC7B,UAAU,OAAO;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAEA,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN;AAAA,QACA,UAAU,KAAK,MAAM,UACjB;AAAA,UACE,WAAW,KAAK,SAAS;AAAA,UACzB,QAAQ,KAAK,SAAS;AAAA,UACtB,QAAQ,KAAK,SAAS;AAAA,UACtB,UAAU,KAAK,SAAS;AAAA,QAC1B,IACA;AAAA,MACN,CAAC;AAED,cAAQ,OAAO,MAAa,IAAW;AAAA,IACzC;AAEA,UAAM,eAAe,CAAC,MAAe;AACnC,WAAK,IAAI,EAAE,MAAM,WAAW,OAAO,KAAK,OAAO,CAAC,EAAC,CAAC;AAAA,IACpD;AAEA,WAAO,GAAG,OAAO,KAAK,GAAG,OAAO;AAChC,WAAO,GAAG,GAAG,OAAO,KAAK,CAAC,UAAU,YAAY;AAEhD,QAAI,MAAM,KAAK,WAAW,IAAI,OAAO,KAAK,CAAC;AAC3C,QAAI,CAAC,KAAK;AACR,YAAM,oBAAI,IAAI;AACd,WAAK,WAAW,IAAI,OAAO,KAAK,GAAG,GAAG;AAAA,IACxC;AACA,UAAM,QAA4B,EAAE,MAAM,SAAS,SAAS,aAAa;AACzE,QAAI,IAAI,KAAK;AAEb,WAAO,MAAM;AACX,aAAO,IAAI,OAAO,KAAK,GAAG,OAAO;AACjC,aAAO,IAAI,GAAG,OAAO,KAAK,CAAC,UAAU,YAAY;AACjD,YAAM,IAAI,KAAK,WAAW,IAAI,OAAO,KAAK,CAAC;AAC3C,UAAI,GAAG;AACL,UAAE,OAAO,KAAK;AACd,YAAI,EAAE,SAAS,EAAG,MAAK,WAAW,OAAO,OAAO,KAAK,CAAC;AAAA,MACxD;AACA,WAAK,IAAI,EAAE,MAAM,YAAY,OAAO,cAAc,MAAM,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,WAAkD;AAExD,SAAK,cAAc;AAEnB,UAAM,SAAS,KAAK;AACpB,SAAK,IAAI;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,QAAQ;AAAA,MAClB,SAAS;AAAA,QACP,cAAc,KAAK,WAAW;AAAA,QAC9B,eAAe,KAAK,WAAW;AAAA,MACjC;AAAA,IACF,CAAC;AAGD,QAAI,QAAQ;AACV,aAAO,IAAI,WAAW,KAAK,SAAS;AACpC,aAAO,IAAI,aAAa,KAAK,WAAW;AACxC,aAAO,IAAI,cAAc,KAAK,YAAY;AAC1C,aAAO,IAAI,iBAAiB,KAAK,cAAc;AAC/C,aAAO,IAAI,YAAY,KAAK,MAAM;AAGlC,iBAAW,CAAC,OAAO,GAAG,KAAK,KAAK,WAAW,QAAQ,GAAG;AACpD,mBAAW,SAAS,KAAK;AACvB,iBAAO,IAAI,OAAO,KAAK,GAAG,MAAM,OAAO;AACvC,iBAAO,IAAI,GAAG,OAAO,KAAK,CAAC,UAAU,MAAM,YAAY;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AACA,SAAK,WAAW,MAAM;AAGtB,UAAM,UAAU,MAAM,KAAK,KAAK,WAAW,QAAQ,CAAC,EACjD,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC,EAC/B,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AACvB,QAAI,QAAQ,SAAS,KAAK,QAAQ;AAChC,WAAK,WAAW,SAAQ,SAAS;AAAA,IACnC;AACA,SAAK,WAAW,MAAM;AACtB,SAAK,IAAI;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU,QAAQ;AAAA,MAClB,SAAS;AAAA,QACP,cAAc,KAAK,WAAW;AAAA,QAC9B,eAAe,KAAK,WAAW;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,aAAmB;AACjB,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,KAAK;AAAA,MACP,CAAC;AACD;AAAA,IACF;AACA,SAAK,cAAc;AACnB,SAAK,OAAO,WAAW;AACvB,SAAK,IAAI;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,MACpC;AAAA,IACF,CAAC;AACD,SAAK,wBAAyB,iBAAiB;AAAA,EACjD;AAAA,EAEA,UAAgB;AACd,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,IAAI;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACP,CAAC;AACD;AAAA,IACF;AACA,SAAK,OAAO,QAAQ;AACpB,SAAK,IAAI;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,IAAI,KAAK,OAAO,MAAM;AAAA,MACtB,SAAS;AAAA,QACP,KAAK,KAAK,aAAa,KAAK,MAAM;AAAA,MACpC;AAAA,IACF,CAAC;AACD,SAAK,wBAAyB,cAAc;AAAA,EAC9C;AACF;","names":["useEndpoint"]}
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/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 {\n keepPreviousData,\n useInfiniteQuery,\n useMutation,\n useQuery,\n type InfiniteData,\n type QueryKey,\n} from '@tanstack/react-query';\nimport 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} 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 Cursor,\n DataShape,\n InfiniteBuildOptionsFor,\n MutationBuildOptionsFor,\n QueryBuildOptionsFor,\n RouteClient,\n RouteClientOptions,\n RouteClientDebugEvent,\n RouteClientDebugLogger,\n RouteClientDebugMode,\n RouteClientDebugOptions,\n RouteClientDebugToggleOptions,\n Updater,\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\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\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 key/invalidate/setData/useEndpoint.\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 method = toUpper(leaf.method);\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 key = (...tuple: ArgsTuple<L>): QueryKey => {\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({ leaf, params: params as any, query: qForKey }) as unknown as QueryKey;\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 = key(...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 = key(...(rest as ArgsTuple<L>));\n if (isGet && isFeed) {\n queryClient.setQueryData<InfiniteData<InferOutput<L>> | undefined>(k, (prev) =>\n typeof updater === 'function' ? (updater as any)(prev) : (updater as any),\n );\n } else {\n queryClient.setQueryData<InferOutput<L> | undefined>(k, (prev) =>\n typeof updater === 'function' ? (updater as any)(prev) : (updater as any),\n );\n }\n emit({ type: 'setData', key: k });\n };\n\n // --- Infinite GET ---\n if (isGet && isFeed) {\n const useEndpoint: BuiltInfinite<L>['useEndpoint'] = (...tuple) => {\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'infiniteGet' });\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\n // Normalize once; we’ll inject the cursor per page below.\n const { normalizedQuery, normalizedParams } = buildUrl(leaf, baseUrl, params, query);\n return useInfiniteQuery<\n InferOutput<L>,\n unknown,\n InfiniteData<InferOutput<L>>,\n QueryKey,\n Cursor\n >({\n ...(rqOpts as InfiniteBuildOptionsFor<L>),\n queryKey: key(...tuple),\n initialPageParam: undefined,\n getNextPageParam: (lastPage) => getNextCursor(lastPage),\n placeholderData: keepPreviousData,\n queryFn: async ({ pageParam }) => {\n const pageQuery = {\n ...(normalizedQuery as any),\n ...(pageParam ? { [cursorParam]: pageParam } : {}),\n };\n const { url } = buildUrl(leaf, baseUrl, params, pageQuery);\n const startedAt = Date.now();\n const detail = isVerboseDebug ? { params: normalizedParams, query: pageQuery } : undefined;\n emit(\n decorateDebugEvent(\n { type: 'fetch', stage: 'start', method, url, leaf: leafLabel },\n detail,\n ),\n );\n try {\n const out = await fetcher<unknown>({ url, method });\n const parsed = zParse<InferOutput<L>>(out, leaf.cfg.outputSchema);\n\n // call onReceive after fetch and validation\n (rqOpts as InfiniteBuildOptionsFor<L> & { onReceive?: (data: InferOutput<L>) => void })\n ?.onReceive?.(parsed);\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: pageQuery, output: parsed } : undefined,\n ),\n );\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 error,\n },\n detail,\n ),\n );\n throw error;\n }\n },\n // NOTE: TData is InfiniteData<T>, so we don't need a select here.\n }, queryClient);\n };\n\n return {\n key,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n } as BuiltForLeaf<L>;\n }\n // --- Plain GET ---\n if (isGet) {\n const useEndpoint: BuiltQuery<L>['useEndpoint'] = (...tuple) => {\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'get' });\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\n const { url, normalizedQuery, normalizedParams } = buildUrl(leaf, baseUrl, params, query);\n return useQuery<InferOutput<L>, unknown, InferOutput<L>, QueryKey>({\n ...(rqOpts as QueryBuildOptionsFor<L>),\n queryKey: key(...tuple),\n placeholderData: keepPreviousData,\n queryFn: async () => {\n const startedAt = Date.now();\n const detail = isVerboseDebug\n ? { params: normalizedParams, query: normalizedQuery }\n : undefined;\n emit(\n decorateDebugEvent(\n { type: 'fetch', stage: 'start', method, url, leaf: leafLabel },\n detail,\n ),\n );\n try {\n const out = await fetcher<unknown>({ url, method });\n const parsed = zParse<InferOutput<L>>(out, leaf.cfg.outputSchema);\n\n // call onReceive after fetch and validation\n (rqOpts as QueryBuildOptionsFor<L> & { onReceive?: (data: InferOutput<L>) => void })\n ?.onReceive?.(parsed);\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\n ? { params: normalizedParams, query: normalizedQuery, output: parsed }\n : undefined,\n ),\n );\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 error,\n },\n detail,\n ),\n );\n throw error;\n }\n },\n }, queryClient);\n };\n\n return {\n key,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n } as BuiltForLeaf<L>;\n }\n\n // --- Mutation (POST/PUT/PATCH/DELETE) ---\n const fetchEndpoint: BuiltMutation<L>['fetch'] = async (\n ...tupleWithBody: [...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 args = extractArgs<L>(tuple);\n const params = (args as any)?.params as InferParams<L> | undefined;\n const query = (args as any)?.query as InferQuery<L> | undefined;\n\n const { url, normalizedQuery, normalizedParams } = buildUrl(leaf, baseUrl, params, query);\n const normalizedBody = zParse<InferBody<L>>(body, leaf.cfg.bodySchema);\n\n const isMultipart = Array.isArray(leaf.cfg.bodyFiles) && leaf.cfg.bodyFiles.length > 0;\n const payload = isMultipart ? toFormData(normalizedBody as any) : normalizedBody;\n\n const startedAt = Date.now();\n const detail = isVerboseDebug\n ? { params: normalizedParams, query: normalizedQuery }\n : undefined;\n emit(\n decorateDebugEvent(\n {\n type: 'fetch',\n stage: 'start',\n method,\n url,\n leaf: leafLabel,\n body: payload,\n },\n detail,\n ),\n );\n try {\n const out = await fetcher<unknown>({ url, method, body: payload });\n const parsed = zParse<InferOutput<L>>(out, leaf.cfg.outputSchema);\n\n // call onReceive after fetch and validation\n (rqOpts as MutationBuildOptionsFor<L> & { onReceive?: (data: InferOutput<L>) => void })\n ?.onReceive?.(parsed);\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\n ? { params: normalizedParams, query: normalizedQuery, output: parsed }\n : undefined,\n ),\n );\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 body: payload,\n error,\n },\n detail,\n ),\n );\n throw error;\n }\n };\n\n const useEndpoint: BuiltMutation<L>['useEndpoint'] = (...tuple) => {\n emit({ type: 'useEndpoint', leaf: leafLabel, variant: 'mutation' });\n return useMutation<InferOutput<L>, unknown, InferBody<L>, unknown>({\n ...(rqOpts as MutationBuildOptionsFor<L>),\n mutationKey: key(...tuple),\n mutationFn: (body: InferBody<L>) =>\n fetchEndpoint(...([...tuple, body] as [...ArgsTuple<L>, InferBody<L>])),\n }, queryClient);\n };\n\n return {\n key,\n invalidate: invalidateExact,\n setData: setData as any,\n useEndpoint,\n fetch: fetchEndpoint,\n } as BuiltForLeaf<L>;\n }\n\n return {\n queryClient,\n invalidate,\n build: buildInternal as RouteClient<Names>['build'],\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 { EventMap, SocketConnectionConfig, SysEventName } from '@emeryld/rrroutes-contract';\nimport { SocketClient } from './socket.client.index';\n\nexport type MaybeSocket = Socket | null;\n\ntype BaseSysLifecycleArgs = {\n socket: MaybeSocket;\n next: () => void;\n startHeartbeat: () => void;\n stopHeartbeat: () => void;\n};\n\nexport type SysConnectHandlerArgs = BaseSysLifecycleArgs & {\n name: Extract<SysEventName, 'sys:connect'>;\n phase: 'connect';\n};\n\nexport type SysReconnectHandlerArgs = BaseSysLifecycleArgs & {\n name: Extract<SysEventName, 'sys:reconnect'>;\n phase: 'reconnect';\n attempt: number;\n};\n\nexport type SysDisconnectHandlerArgs = BaseSysLifecycleArgs & {\n name: Extract<SysEventName, 'sys:disconnect'>;\n phase: 'disconnect';\n reason: string;\n};\n\nexport type SysConnectErrorHandlerArgs = BaseSysLifecycleArgs & {\n name: Extract<SysEventName, 'sys:connect_error'>;\n phase: 'connect_error';\n error: unknown;\n};\n\nexport type SysPingHandlerArgs<C extends SocketConnectionConfig = SocketConnectionConfig> = {\n name: Extract<SysEventName, 'sys:ping'>;\n socket: MaybeSocket;\n buildDefaultPayload: () => z.input<C['pingPayload']>;\n send: (payload: z.input<C['pingPayload']>) => void;\n next: () => void;\n startHeartbeat: () => void;\n stopHeartbeat: () => void;\n};\n\nexport type SysPongHandlerArgs<C extends SocketConnectionConfig = SocketConnectionConfig> = {\n name: Extract<SysEventName, 'sys:pong'>;\n socket: MaybeSocket;\n raw: z.output<C['pongPayload']>;\n latencyMs?: number;\n next: () => void;\n startHeartbeat: () => void;\n stopHeartbeat: () => void;\n};\n\nexport type SysRoomHandlerArgs<Meta extends z.ZodTypeAny = z.ZodTypeAny> = {\n name: Extract<SysEventName, 'sys:room_join' | 'sys:room_leave'>;\n socket: MaybeSocket;\n rooms: string[];\n meta: z.output<Meta>;\n next: () => void;\n startHeartbeat: () => void;\n stopHeartbeat: () => void;\n};\n\nexport type SysConnectHandler = (args: SysConnectHandlerArgs) => void;\nexport type SysReconnectHandler = (args: SysReconnectHandlerArgs) => void;\nexport type SysDisconnectHandler = (args: SysDisconnectHandlerArgs) => void;\nexport type SysConnectErrorHandler = (args: SysConnectErrorHandlerArgs) => void;\nexport type SysPingHandler<C extends SocketConnectionConfig = SocketConnectionConfig> = (\n args: SysPingHandlerArgs<C>,\n) => void;\nexport type SysPongHandler<C extends SocketConnectionConfig = SocketConnectionConfig> = (\n args: SysPongHandlerArgs<C>,\n) => void;\nexport type SysRoomHandler<Meta extends z.ZodTypeAny = z.ZodTypeAny> = (\n args: SysRoomHandlerArgs<Meta>,\n) => void;\n\nexport type SysEventMap<T extends EventMap,C extends SocketConnectionConfig = SocketConnectionConfig> = {\n 'sys:connect': (args:{socket:Socket, client:SocketClient<T, C>})=> void \n 'sys:disconnect': (args:{socket:Socket, client:SocketClient<T, C>, reason:string})=>void;\n 'sys:reconnect': (args:{socket:Socket, attempt: number, client:SocketClient<T, C>})=>void;\n 'sys:connect_error': (args:{socket:Socket, client:SocketClient<T, C>, error:string})=>void ;\n 'sys:ping': (args:{socket:Socket, client:SocketClient<T, C>})=> z.output<C['pingPayload']>;\n 'sys:pong': (args:{socket:Socket, client:SocketClient<T, C>, payload: z.output<C['pongPayload']>})=>void ;\n 'sys:room_join': (args:{socket:Socket, client:SocketClient<T, C>, rooms: string|string[], meta: z.output<C['joinMetaMessage']>})=>boolean ;\n 'sys:room_leave': (args:{socket:Socket, client:SocketClient<T, C>, rooms: string|string[], meta: z.output<C['joinMetaMessage']>})=>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 { z } from 'zod';\nimport {\n SocketClient,\n SocketClientOptions,\n ClientCtx,\n Payload,\n ServerEnvelope,\n} from './socket.client.index';\nimport { EventMap, SocketConnectionConfig } 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 | { type: 'resolve'; phase: 'start' | 'ok' | 'error' | 'socketMissing' | 'cancelled'; err?: string }\n | { type: 'client'; phase: 'init' | 'destroy', missing?: boolean }\n | { type: 'render'; hasClient: boolean }\n | {\n type: 'hook';\n hook: '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 SocketConnectionConfig> = Omit<SocketClientOptions<T, C>, 'socket'>;\n\ntype ProviderRuntimeSocket =\n | { socket: Socket | null }\n | { getSocket: () => Socket | Promise<Socket> };\n\ntype SocketProviderProps<T extends EventMap, C extends SocketConnectionConfig> = 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: z.output<C['leaveMetaMessage']>;\n} & ProviderRuntimeSocket>;\n\nconst SocketCtx = React.createContext<SocketClient<any, SocketConnectionConfig> | 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' }>['hook'];\n\nfunction safeDescribeHookValue(value: unknown): HookDebugValue {\n if (value == null) return value as null | undefined;\n const valueType = typeof value;\n if (valueType === 'string' || valueType === 'number' || valueType === 'boolean') return value as HookDebugValue;\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 if (value instanceof Socket) {\n const socket = value as Socket & { id?: string; connected?: boolean };\n return `[Socket id=${socket.id ?? 'unknown'} connected=${socket.connected ?? false}]`;\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 createHookDebugEvent(prev: HookDebugSnapshot | null, next: HookDebugSnapshot, hook: HookIdentifier): Extract<SocketProviderDebugEvent, { type: 'hook' }> | null {\n const reason: HookDebugReason = prev ? 'change' : 'init';\n const changed = Object.keys(next).reduce<Array<{ dependency: string; previous: HookDebugValue; next: HookDebugValue }>>((acc, dependency) => {\n const prevValue = prev ? prev[dependency] : undefined;\n const nextValue = next[dependency];\n if (!prev || !Object.is(prevValue, nextValue)) {\n acc.push({ dependency, previous: safeDescribeHookValue(prevValue), next: safeDescribeHookValue(nextValue) });\n }\n return acc;\n }, []);\n\n if (!changed.length) return null;\n\n return { type: 'hook', hook, reason, changes: changed };\n}\n\nfunction trackHookTrigger({ ref, hook, providerDebug, snapshot }: { ref: React.MutableRefObject<HookDebugSnapshot | null>; hook: HookIdentifier; providerDebug?: SocketProviderDebugOptions; snapshot: HookDebugSnapshot }) {\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 SocketConnectionConfig>(args: {\n events: T;\n options: Omit<BaseOptions<T, C>, 'debug'> & {debug: BaseOptions<T, C>['debug'] & SocketProviderDebugOptions};\n}) {\n const { events, options: baseOptions } = args;\n\n return {\n SocketProvider: (\n props: React.PropsWithChildren<\n ProviderRuntimeSocket & { fallback?: React.ReactNode; destroyLeaveMeta: z.output<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 SocketConnectionConfig>(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 =\n '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: { resolvedSocket },\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 // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [resolvedSocket]);\n\n trackHookTrigger({\n ref: clientMemoDebugRef,\n hook: 'client_memo',\n providerDebug: providerDebugRef.current,\n snapshot: { events, baseOptions, socket },\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 React.useEffect(() => {\n trackHookTrigger({\n ref: destroyEffectDebugRef,\n hook: 'destroy_effect',\n providerDebug: providerDebugRef.current,\n snapshot: { client, destroyLeaveMeta },\n });\n return () => {\n if (client) {\n client.destroy(destroyLeaveMeta);\n dbg(providerDebugRef.current, { type: 'client', phase: 'destroy' });\n }\n };\n }, [client, destroyLeaveMeta]);\n\n dbg(providerDebugRef.current, { type: 'render', hasClient:!!client });\n return <SocketCtx.Provider value={client}>{client==null? fallback?? children:children}</SocketCtx.Provider>;\n}\n\nexport function useSocketClient<T extends EventMap, C extends SocketConnectionConfig>(): 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 SocketConnectionConfig,\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 deps?: React.DependencyList;\n joinMeta: z.output<C['joinMetaMessage']>;\n leaveMeta: z.output<C['leaveMetaMessage']>;\n};\n\nexport function useSocketConnection<T extends EventMap, K extends keyof T & string, C extends SocketConnectionConfig>(\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 }, args.deps ?? [client, event, onMessage, autoJoin, autoLeave, ...normalizedRooms]);\n}\n","// socket.client.index.ts\n\nimport type { ManagerOptions, Socket } from 'socket.io-client';\nimport { z } from 'zod';\nimport type { EventMap, SocketConnectionConfig } 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\nexport type Payload<T extends EventMap, K extends keyof T> = z.infer<T[K]['message']>;\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\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 SocketConnectionConfig = SocketConnectionConfig,\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 SocketConnectionConfig = SocketConnectionConfig> {\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 ? { err: 'Socket is missing. ' } : { socketId: this.socket?.id,\n snapshot: snapshot,})\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\n const hb = opts.heartbeat ?? {};\n this.hb = {\n intervalMs: hb.intervalMs ?? 15_000,\n timeoutMs: hb.timeoutMs ?? 7_500,\n };\n\n if (!this.socket) {\n this.dbg({\n type: 'lifecycle',\n phase: 'init',\n err: 'Socket reference is null during initialization',\n });\n } else {\n this.dbg({\n type: 'lifecycle',\n phase: 'init',\n heartbeatIntervalMs: this.hb.intervalMs,\n heartbeatTimeoutMs: this.hb.timeoutMs,\n environment: this.environment,\n });\n this.logSocketConfigSnapshot('constructor');\n }\n\n /* socket lifecycle → connection bucket, now sys map aware */\n this.onConnect = () => {\n if(!this.socket){\n this.dbg({ 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 this.getSysEvent('sys:connect')({\n socket: this.socket,\n client: this,\n });\n };\n\n this.onReconnect = (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 this.getSysEvent('sys:reconnect')({\n attempt,\n socket: this.socket,\n client: this,\n });\n };\n\n this.onDisconnect = (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 this.getSysEvent('sys:disconnect')({\n reason: String(reason),\n socket: this.socket,\n client:this,\n });\n };\n\n this.onConnectError = (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 this.getSysEvent('sys:connect_error')({\n error: String(err),\n socket: this.socket,\n client:this,\n });\n };\n\n this.onPong = (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 this.getSysEvent('sys:pong')({\n socket: this.socket,\n payload: validated as z.output<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 = () => {\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 \n const payload = 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 joinRooms(rooms: string[] | string, meta: z.output<C['joinMetaMessage']>): 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 !this.getSysEvent('sys:room_join')({\n rooms,\n meta,\n socket:this.socket,\n client:this\n })){\n this.dbg({ type: 'room', phase: 'join', rooms: this.toArray(rooms), err: 'sys:room_join handler aborted join' });\n return;\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;\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 }\n\n leaveRooms(rooms: string[] | string, meta: z.output<C['leaveMetaMessage']>): 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 !this.getSysEvent('sys:room_leave')({\n rooms,\n meta,\n socket:this.socket,\n client:this\n })){\n this.dbg({ type: 'room', phase: 'leave', rooms: this.toArray(rooms), err: 'sys:room_leave handler aborted leave' });\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 = (\n envelopeOrRaw: ServerEnvelope<T, K> | Payload<T, K>,\n ) => {\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 destroy(leaveMeta: z.output<C['leaveMetaMessage']>): void {\n // stop heartbeat timer\n this.stopHeartbeat('destroy');\n\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\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 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';\n"],"mappings":"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","names":["useEndpoint"]}