statewire 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +14 -6
  2. package/dist/client/connection.d.ts +5 -1
  3. package/dist/client/connection.d.ts.map +1 -1
  4. package/dist/client/connection.js +19 -4
  5. package/dist/client/connection.js.map +1 -1
  6. package/dist/client/core.d.ts.map +1 -1
  7. package/dist/client/core.js +2 -0
  8. package/dist/client/core.js.map +1 -1
  9. package/dist/client/session.d.ts +15 -4
  10. package/dist/client/session.d.ts.map +1 -1
  11. package/dist/client/session.js +233 -52
  12. package/dist/client/session.js.map +1 -1
  13. package/dist/client/sessionStore.d.ts +5 -1
  14. package/dist/client/sessionStore.d.ts.map +1 -1
  15. package/dist/client/sessionStore.js +3 -1
  16. package/dist/client/sessionStore.js.map +1 -1
  17. package/dist/host/host.d.ts +1 -0
  18. package/dist/host/host.d.ts.map +1 -1
  19. package/dist/host/host.js.map +1 -1
  20. package/dist/host/http.d.ts.map +1 -1
  21. package/dist/host/http.js +27 -9
  22. package/dist/host/http.js.map +1 -1
  23. package/dist/host/socket.d.ts +10 -3
  24. package/dist/host/socket.d.ts.map +1 -1
  25. package/dist/host/socket.js +103 -39
  26. package/dist/host/socket.js.map +1 -1
  27. package/dist/host-internal.d.ts +9 -1
  28. package/dist/host-internal.d.ts.map +1 -1
  29. package/dist/host-internal.js +1 -1
  30. package/dist/index.d.ts +5 -3
  31. package/dist/index.js +3 -3
  32. package/dist/statewire.d.ts +33 -2
  33. package/dist/statewire.d.ts.map +1 -1
  34. package/dist/statewire.js +34 -3
  35. package/dist/statewire.js.map +1 -1
  36. package/dist/transports/fixtures.js +1 -0
  37. package/dist/transports/fixtures.js.map +1 -1
  38. package/dist/transports/remote.d.ts.map +1 -1
  39. package/dist/transports/remote.js +15 -8
  40. package/dist/transports/remote.js.map +1 -1
  41. package/dist/transports/sse.d.ts +2 -2
  42. package/dist/transports/sse.d.ts.map +1 -1
  43. package/dist/transports/sse.js +11 -11
  44. package/dist/transports/sse.js.map +1 -1
  45. package/dist/transports/testing.d.ts +1 -1
  46. package/dist/transports/testing.d.ts.map +1 -1
  47. package/dist/transports/testing.js +14 -6
  48. package/dist/transports/testing.js.map +1 -1
  49. package/dist/transports/ws.d.ts +2 -2
  50. package/dist/transports/ws.d.ts.map +1 -1
  51. package/dist/transports/ws.js +5 -5
  52. package/dist/transports/ws.js.map +1 -1
  53. package/dist/types.d.ts +7 -0
  54. package/dist/types.d.ts.map +1 -1
  55. package/dist/types.js.map +1 -1
  56. package/dist/util/randomId.js +1 -1
  57. package/dist/util/randomId.js.map +1 -1
  58. package/dist/wire/documents.d.ts +25 -2
  59. package/dist/wire/documents.d.ts.map +1 -1
  60. package/dist/wire/documents.js +27 -7
  61. package/dist/wire/documents.js.map +1 -1
  62. package/dist/wire/protocol.d.ts +55 -0
  63. package/dist/wire/protocol.d.ts.map +1 -0
  64. package/dist/wire/protocol.js +221 -0
  65. package/dist/wire/protocol.js.map +1 -0
  66. package/dist/wire/version.d.ts +1 -3
  67. package/dist/wire/version.d.ts.map +1 -1
  68. package/dist/wire/version.js +1 -3
  69. package/dist/wire/version.js.map +1 -1
  70. package/package.json +1 -1
  71. package/src/client/connection.ts +43 -13
  72. package/src/client/core.ts +6 -0
  73. package/src/client/session.ts +339 -42
  74. package/src/client/sessionStore.ts +8 -0
  75. package/src/host/host.ts +1 -0
  76. package/src/host/http.ts +36 -7
  77. package/src/host/socket.ts +141 -50
  78. package/src/host-internal.ts +12 -1
  79. package/src/index.ts +5 -2
  80. package/src/statewire.ts +109 -6
  81. package/src/transports/fixtures.ts +1 -1
  82. package/src/transports/remote.ts +16 -7
  83. package/src/transports/sse.ts +28 -18
  84. package/src/transports/testing.ts +12 -4
  85. package/src/transports/ws.ts +8 -8
  86. package/src/types.ts +11 -0
  87. package/src/util/randomId.ts +3 -3
  88. package/src/wire/documents.ts +126 -8
  89. package/src/wire/protocol.ts +327 -0
  90. package/src/wire/version.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","names":["useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","encodeValue","reviveValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_CONTEXT_VALUE_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireMetaEntry","StatewirePath","StatewireCmd","StatewireEnvelope","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","WireOp","op","path","value","meta","Admission","seq","method","applied","appliedSent","settled","ClientRec","id","lastSeq","ctxSeq","touched","context","results","Map","ts","cmd","inflight","principal","Conn","clientId","socket","Socket","open","sawFrame","lastSentAt","lease","auth","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CtxStatement","CmdStatement","params","ParsedFrame","ctx","isPlainObject","parseLane","statements","prev","statement","Number","isInteger","push","frameEncoder","TextEncoder","contextValue","ops","undefined","rejectUnknown","parseFrameValue","frame","unknown","filter","sort","lane","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","type","failure","fate","code","String","parseInitialFrame","headers","lanes","Response","status","values","some","SocketHostState","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","Set","pendingConns","pendingOps","pendingApplied","pendingCmds","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","recordOp","attach","next","nextState","state","nextCommands","commands","submit","setOnOp","closeConn","conn","delete","close","size","clearInterval","sendTo","data","now","send","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","idleLevel","work","isIdle","rec","flush","takeChanged","queueApplied","level","edge","cmds","appliedEntries","get","map","packet","idle","verdicts","list","set","queueCmd","notifyClientRecords","onClientRecordsChange","admittedThrough","entry","retain","newest","Math","max","min","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","admitFrame","through","ctxNew","s","cmdNew","hostCommandLoad","client","isSafeInteger","TypeError","at","dur","first","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","has","add","fromEntries","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","splice","gcClients","excess","changed","live","oldest","Registration","known","created","snapshot","hello","abort","resume","suspend","restoreClientRecords","records","ClientRecord","record","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","unmount"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { encodeValue, reviveValue } from \"../wire/meta\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_CONTEXT_VALUE_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireMetaEntry } from \"../wire/meta\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport type { StatewireCmd, StatewireEnvelope } from \"../client/connection\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype WireOp = {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireMetaEntry[];\n};\n\ntype Admission = {\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\nexport type ClientRec = {\n id: string;\n lastSeq: number;\n ctxSeq: number;\n touched: number;\n context: Record<string, unknown> | null;\n results: Map<number, { ts: number; cmd: StatewireCmd }>;\n inflight: Map<number, Admission>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\nexport type Conn = {\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CtxStatement = { seq: number; value: Record<string, unknown> };\ntype CmdStatement = {\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n ctx: CtxStatement[];\n cmd: CmdStatement[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseLane = (value: unknown): Record<string, unknown>[] => {\n if (!Array.isArray(value)) return violation(\"malformed frame\");\n if (value.length === 0) return violation(\"empty lane\");\n const statements: Record<string, unknown>[] = [];\n let prev: number | null = null;\n for (const statement of value) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n if (typeof seq !== \"number\" || !Number.isInteger(seq) || seq < 1) {\n return violation(\"malformed statement\");\n }\n if (prev !== null && seq !== prev + 1) return violation(\"malformed frame\");\n prev = seq;\n statements.push(statement);\n }\n return statements;\n};\n\nconst frameEncoder = new TextEncoder();\n\n/** v1 ctx statements state the context whole: one root replace with an object value. */\nconst contextValue = (ops: unknown): Record<string, unknown> => {\n if (!Array.isArray(ops) || ops.length !== 1) {\n throw new Error(\"context must be a single-op array\");\n }\n const op = ops[0] as Record<string, unknown> | null;\n if (\n !isPlainObject(op) ||\n op[\"op\"] !== \"replace\" ||\n !Array.isArray(op[\"path\"]) ||\n op[\"path\"].length !== 0\n ) {\n throw new Error(\"context op must be a root replace\");\n }\n const value =\n op[\"meta\"] !== undefined\n ? reviveValue(op[\"value\"], op[\"meta\"], { rejectUnknown: true })\n : op[\"value\"];\n if (!isPlainObject(value)) {\n throw new Error(\"context value must be an object\");\n }\n return value;\n};\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"ctx\" && key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const ctx: CtxStatement[] = [];\n if (frame[\"ctx\"] !== undefined) {\n const lane = frame[\"ctx\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many context statements\");\n }\n for (const statement of parseLane(lane)) {\n let value: Record<string, unknown>;\n try {\n value = contextValue(statement[\"ops\"]);\n } catch {\n return violation(\"invalid-context\");\n }\n if (\n frameEncoder.encode(JSON.stringify(value)).byteLength >\n MAX_CONTEXT_VALUE_BYTES\n ) {\n return violation(\"oversized-context\");\n }\n ctx.push({ seq: statement[\"seq\"] as number, value });\n }\n }\n const cmd: CmdStatement[] = [];\n if (frame[\"cmd\"] !== undefined) {\n const lane = frame[\"cmd\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many commands\");\n }\n for (const statement of parseLane(lane)) {\n const method = statement[\"method\"];\n if (typeof method !== \"string\" || !(\"params\" in statement)) {\n return violation(\"malformed statement\");\n }\n cmd.push({\n seq: statement[\"seq\"] as number,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n }\n return { ctx, cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireMetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeValue(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): StatewireCmd => {\n if (outcome.type === \"accepted\") {\n return { seq: adm.seq, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { seq: adm.seq, type: \"crashed\" };\n case \"failed\":\n return {\n seq: adm.seq,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n seq: adm.seq,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n seq: adm.seq,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n seq: adm.seq,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length\n ? parseFrameValue(lanes)\n : { ctx: [], cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, number[]>;\n pendingCmds: Map<string, StatewireCmd[]>;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeValue(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const rec of h.clients.values()) {\n if (rec.inflight.size > 0) return false;\n }\n return true;\n};\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const rec of h.clients.values()) {\n for (const adm of rec.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, rec.id, adm.seq);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n fin === undefined &&\n !edge\n ) {\n return;\n }\n h.idleWire = level;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const ops = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n const appliedEntries: StatewireCmd[] = (\n applied.get(conn.clientId) ?? []\n ).map((seq) => ({ seq, type: \"applied\" }));\n if (ops.length > 0) {\n const packet: StatewireEnvelope = {\n ops,\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n };\n sendTo(h, conn, JSON.stringify(packet));\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = cmds.get(conn.clientId) ?? [];\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, clientId: string, seq: number) => {\n const list = h.pendingApplied.get(clientId);\n if (list) list.push(seq);\n else h.pendingApplied.set(clientId, [seq]);\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, clientId: string, cmd: StatewireCmd) => {\n const list = h.pendingCmds.get(clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(clientId, [cmd]);\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n lastSeq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n touched: rec.touched,\n context: rec.context,\n results: [...rec.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (rec: ClientRec, cmd: StatewireCmd) => {\n const now = Date.now();\n rec.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...rec.results.keys());\n for (const [seq, entry] of rec.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n rec.results.delete(seq);\n }\n }\n while (rec.results.size > RESULT_LIMIT) {\n rec.results.delete(Math.min(...rec.results.keys()));\n }\n};\n\n/** Cmd-lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (rec: ClientRec): number =>\n Math.max(rec.lastSeq, ...rec.inflight.keys());\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, rec: ClientRec, seq: number) => {\n const cached = rec.results.get(seq);\n if (cached) {\n const newest = Math.max(...rec.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, rec.id, cached.cmd);\n return;\n }\n rec.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = rec.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, rec.id, seq);\n return;\n }\n queueCmd(h, rec.id, { seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n cmd: StatewireCmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n rec.inflight.delete(adm.seq);\n retain(rec, cmd);\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, rec.id, cmd);\n notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, rec, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n auth: unknown,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth,\n get context() {\n return rec.context;\n },\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n rec: ClientRec,\n statement: CmdStatement,\n auth: unknown,\n) => {\n const adm: Admission = {\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n rec.inflight.set(statement.seq, adm);\n notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, rec, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n rec,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, rec, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, rec, adm, { seq: adm.seq, type: \"result\", payload: names });\n return;\n }\n h.commandsHost!.submit!({\n method: statement.method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, auth),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, rec, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, rec, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, both lanes: absorbed statements answer from the record,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating both watermarks, nothing consumed. A gap is never a close.\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { seq: number; ctxSeq: number; retry?: number };\n };\n };\n\nexport const admitFrame = (\n h: SocketHostState,\n rec: ClientRec,\n frame: ParsedFrame,\n auth: unknown,\n): FrameAdmission => {\n rec.touched = Date.now();\n const through = admittedThrough(rec);\n for (const statement of frame.cmd) {\n if (statement.seq <= through) reemit(h, rec, statement.seq);\n }\n const ctxNew = frame.ctx.filter((s) => s.seq > rec.ctxSeq);\n const cmdNew = frame.cmd.filter((s) => s.seq > through);\n if (\n (ctxNew.length > 0 && ctxNew[0]!.seq !== rec.ctxSeq + 1) ||\n (cmdNew.length > 0 && cmdNew[0]!.seq !== through + 1)\n ) {\n notifyClientRecords(h);\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq } },\n };\n }\n if (cmdNew.length > 0) {\n let hostCommandLoad = 0;\n for (const client of h.clients.values()) {\n hostCommandLoad += client.inflight.size;\n }\n if (\n rec.inflight.size + cmdNew.length > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostCommandLoad + cmdNew.length > h.maxInflightCommands\n ) {\n return {\n type: \"refused\",\n syn: {\n syn: {\n seq: through,\n ctxSeq: rec.ctxSeq,\n retry: COMMAND_CAPACITY_RETRY_MS,\n },\n },\n };\n }\n }\n if ((ctxNew.length || cmdNew.length) && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq, retry } },\n };\n }\n }\n for (const statement of ctxNew) {\n rec.context = statement.value;\n rec.ctxSeq = statement.seq;\n }\n for (const statement of cmdNew) admitCmd(h, rec, statement, auth);\n if (cmdNew.length > 0) {\n // Memory host: admitted means retained — dur rides the admitting flush.\n queueCmd(h, rec.id, { seq: cmdNew.at(-1)!.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let frame: ParsedFrame;\n try {\n frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (frame.ctx.length === 0 && frame.cmd.length === 0) return;\n const rec = h.clients.get(conn.clientId)!;\n const admission = admitFrame(h, rec, frame, conn.auth);\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = normalizedHeaders(initial.headers);\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n options.onAuthorized?.(auth);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n const registration = register(h, clientId, socket, true, auth);\n if (registration === null) return;\n pending.connection = registration.connection;\n if (frame.ctx.length || frame.cmd.length) {\n const admission = admitFrame(h, registration.rec, frame, auth);\n if (admission.type === \"refused\")\n sendTo(h, registration.conn, JSON.stringify(admission.syn));\n }\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (live.has(rec.id) || rec.inflight.size > 0) continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n rec: ClientRec;\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n lastSeq: 0,\n ctxSeq: 0,\n touched: Date.now(),\n context: null,\n results: new Map(),\n inflight: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n clientId,\n socket,\n open: true,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n };\n h.conns.add(conn);\n gcClients(h);\n notifyClientRecords(h);\n ensureHeartbeat(h);\n const { value, meta } = encodeValue(h.stateHost!.snapshot());\n const hello: StatewireEnvelope = {\n ops: [\n {\n op: \"replace\",\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n },\n ],\n syn: {\n seq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n ...(h.idleWire && { idle: true }),\n },\n };\n sendTo(h, conn, JSON.stringify(hello));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { rec, conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n ...record,\n results: new Map(\n record.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * statement-lane client frames under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id, idle edges, and `fin` on\n * finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":";;;;;;;;;AAwBA,MAAa+B,eAAe;AAC5B,MAAaC,6BACX;;;AAIF,MAAaC,cAAcC,GAAYC,MAAwB;CAC7D,IAAIC,OAAOC,GAAGH,GAAGC,CAAC,GAAG,OAAO;CAC5B,IAAID,aAAaI,QAAQH,aAAaG,MACpC,OAAOJ,EAAEK,QAAQ,MAAMJ,EAAEI,QAAQ;CACnC,IAAIC,MAAMC,QAAQP,CAAC,KAAKM,MAAMC,QAAQN,CAAC,GACrC,OAAOD,EAAEQ,WAAWP,EAAEO,UAAUR,EAAES,OAAOC,GAAGC,MAAMZ,WAAWW,GAAGT,EAAEU,EAAE,CAAC;CAEvE,IACE,OAAOX,MAAM,YACb,OAAOC,MAAM,YACbD,MAAM,QACNC,MAAM,QACNC,OAAOU,eAAeZ,CAAC,MAAME,OAAOW,aACpCX,OAAOU,eAAeX,CAAC,MAAMC,OAAOW,WACpC;EACA,MAAMC,QAAQZ,OAAOa,KAAKf,CAAC;EAC3B,MAAMgB,QAAQd,OAAOa,KAAKd,CAAC;EAC3B,OACEa,MAAMN,WAAWQ,MAAMR,UACvBM,MAAML,OACHQ,QACCA,OAAOhB,KACPF,WACGC,EAA8BiB,MAC9BhB,EAA8BgB,IACjC,CACJ;CAEJ;CACA,OAAO;AACT;AAEA,MAAME,gBAAgB;AACtB,MAAMC,eAAe;AACrB,MAAMC,sBAAsB;AAC5B,MAAMC,kBAAkB;AACxB,MAAaC,2BAA2B;AACxC,MAAMC,oBAAoB;AAmD1B,MAAMyC,aAAaC,WAA0B;CAC3C,MAAMhE,OAAOiE,OAAO,IAAIC,MAAMF,MAAM,GAAG,EAAEG,MAAM,qBAAqB,CAAC;AACvE;AAEA,MAAMC,mBAAmBC,UACvBA,iBAAiBH,SAASG,MAAMF,SAAS,uBACrCE,MAAMC,UACN;AAeN,MAAMM,iBAAiBlD,UACrB,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACtB,MAAMC,QAAQqB,KAAK;AAErE,MAAMmD,aAAanD,UAA8C;CAC/D,IAAI,CAACtB,MAAMC,QAAQqB,KAAK,GAAG,OAAOqC,UAAU,iBAAiB;CAC7D,IAAIrC,MAAMpB,WAAW,GAAG,OAAOyD,UAAU,YAAY;CACrD,MAAMe,aAAwC,CAAA;CAC9C,IAAIC,OAAsB;CAC1B,KAAK,MAAMC,aAAatD,OAAO;EAC7B,IAAI,CAACkD,cAAcI,SAAS,GAAG,OAAOjB,UAAU,qBAAqB;EACrE,MAAMlC,MAAMmD,UAAU;EACtB,IAAI,OAAOnD,QAAQ,YAAY,CAACoD,OAAOC,UAAUrD,GAAG,KAAKA,MAAM,GAC7D,OAAOkC,UAAU,qBAAqB;EAExC,IAAIgB,SAAS,QAAQlD,QAAQkD,OAAO,GAAG,OAAOhB,UAAU,iBAAiB;EACzEgB,OAAOlD;EACPiD,WAAWK,KAAKH,SAAS;CAC3B;CACA,OAAOF;AACT;AAEA,MAAMM,eAAe,IAAIC,YAAY;;AAGrC,MAAMC,gBAAgBC,QAA0C;CAC9D,IAAI,CAACnF,MAAMC,QAAQkF,GAAG,KAAKA,IAAIjF,WAAW,GACxC,MAAM,IAAI4D,MAAM,mCAAmC;CAErD,MAAM1C,KAAK+D,IAAI;CACf,IACE,CAACX,cAAcpD,EAAE,KACjBA,GAAG,UAAU,aACb,CAACpB,MAAMC,QAAQmB,GAAG,OAAO,KACzBA,GAAG,OAAO,CAAClB,WAAW,GAEtB,MAAM,IAAI4D,MAAM,mCAAmC;CAErD,MAAMxC,QACJF,GAAG,YAAYgE,KAAAA,IACX7G,YAAY6C,GAAG,UAAUA,GAAG,SAAS,EAAEiE,eAAe,KAAK,CAAC,IAC5DjE,GAAG;CACT,IAAI,CAACoD,cAAclD,KAAK,GACtB,MAAM,IAAIwC,MAAM,iCAAiC;CAEnD,OAAOxC;AACT;AAEA,MAAagE,mBAAmBC,UAAgC;CAC9D,IAAI,CAACf,cAAce,KAAK,GAAG,OAAO5B,UAAU,iBAAiB;CAC7D,MAAMlD,OAAOb,OAAOa,KAAK8E,KAAK;CAC9B,IAAI9E,KAAKP,WAAW,GAAG,OAAOyD,UAAU,iBAAiB;CACzD,MAAM6B,UAAU/E,KAAKgF,QAAQ9E,QAAQA,QAAQ,SAASA,QAAQ,KAAK,CAAC,CAAC+E,KAAK;CAC1E,IAAIF,QAAQtF,SAAS,GACnB,OAAOyD,UAAU,uBAAuB6B,QAAQ,GAAE,EAAG;CACvD,MAAMjB,MAAsB,CAAA;CAC5B,IAAIgB,MAAM,WAAWH,KAAAA,GAAW;EAC9B,MAAMO,OAAOJ,MAAM;EACnB,IAAIvF,MAAMC,QAAQ0F,IAAI,KAAKA,KAAKzF,SAAAA,KAC9B,OAAOyD,UAAU,6BAA6B;EAEhD,KAAK,MAAMiB,aAAaH,UAAUkB,IAAI,GAAG;GACvC,IAAIrE;GACJ,IAAI;IACFA,QAAQ4D,aAAaN,UAAU,MAAM;GACvC,QAAQ;IACN,OAAOjB,UAAU,iBAAiB;GACpC;GACA,IACEqB,aAAaY,OAAOC,KAAKC,UAAUxE,KAAK,CAAC,CAAC,CAACyE,aAAAA,OAG3C,OAAOpC,UAAU,mBAAmB;GAEtCY,IAAIQ,KAAK;IAAEtD,KAAKmD,UAAU;IAAkBtD;GAAM,CAAC;EACrD;CACF;CACA,MAAMiB,MAAsB,CAAA;CAC5B,IAAIgD,MAAM,WAAWH,KAAAA,GAAW;EAC9B,MAAMO,OAAOJ,MAAM;EACnB,IAAIvF,MAAMC,QAAQ0F,IAAI,KAAKA,KAAKzF,SAAAA,KAC9B,OAAOyD,UAAU,mBAAmB;EAEtC,KAAK,MAAMiB,aAAaH,UAAUkB,IAAI,GAAG;GACvC,MAAMjE,SAASkD,UAAU;GACzB,IAAI,OAAOlD,WAAW,YAAY,EAAE,YAAYkD,YAC9C,OAAOjB,UAAU,qBAAqB;GAExCpB,IAAIwC,KAAK;IACPtD,KAAKmD,UAAU;IACflD;IACA2C,QAAQO,UAAU;IAClB,GAAIA,UAAU,YAAYQ,KAAAA,KAAa,EAAE7D,MAAMqD,UAAU,QAAQ;GACnE,CAAC;EACH;CACF;CACA,OAAO;EAAEL;EAAKhC;CAAI;AACpB;AAEA,MAAayD,cAAcC,QAA6B;CACtD,IAAIV;CACJ,IAAI;EACFA,QAAQM,KAAKK,MAAMD,GAAG;CACxB,QAAQ;EACN,OAAOtC,UAAU,iBAAiB;CACpC;CACA,OAAO2B,gBAAgBC,KAAK;AAC9B;AAEA,MAAMY,oBAAoBF,QACxBA,IAAI/F,SAAAA,WACJ8E,aAAaY,OAAOK,GAAG,CAAC,CAACF,aAAAA;AAI3B,MAAMK,iBACJC,YACuD;CACvD,IAAIA,YAAYjB,KAAAA,GAAW,OAAO,CAAC;CACnC,MAAM,EAAE9D,OAAOC,SAASjD,YAAY+H,OAAO;CAC3C,OAAO;EAAEA,SAAS/E;EAAO,GAAIC,SAAS6D,KAAAA,KAAa,EAAE7D,KAAK;CAAG;AAC/D;AAEA,MAAM+E,SAASC,KAAgBC,YAA2C;CACxE,IAAIA,QAAQC,SAAS,YACnB,OAAO;EAAEhF,KAAK8E,IAAI9E;EAAKgF,MAAM;EAAU,GAAGL,cAAcI,QAAQH,OAAO;CAAE;CAE3E,MAAMK,UACJF,QAAQvC,iBAAiB/F,qBAAqBsI,QAAQvC,MAAMyC,UAAU;CACxE,QAAQA,SAASC,MAAjB;EACE,KAAK,WACH,OAAO;GAAElF,KAAK8E,IAAI9E;GAAKgF,MAAM;EAAU;EACzC,KAAK,UACH,OAAO;GACLhF,KAAK8E,IAAI9E;GACTgF,MAAM;GACN,GAAIC,QAAQxC,YAAYkB,KAAAA,KAAa,EAAElB,SAASwC,QAAQxC,QAAQ;EAClE;EACF,KAAK;GACH,IAAIwC,QAAQE,SAASxB,KAAAA,GAAW;IAC9B,MAAMlB,UACJwC,QAAQE,SAAS,oBACb,oBAAoBL,IAAI7E,OAAM,KAC9BgF,QAAQxC;IACd,OAAO;KACLzC,KAAK8E,IAAI9E;KACTgF,MAAM;KACNG,MAAMF,QAAQE;KACd,GAAI1C,YAAYkB,KAAAA,KAAa,EAAElB,QAAQ;IACzC;GACF;GACA,OAAO;IACLzC,KAAK8E,IAAI9E;IACTgF,MAAM;IACN,GAAIC,QAAQxC,YAAYkB,KAAAA,KAAa,EAAElB,SAASwC,QAAQxC,QAAQ;IAChE,GAAGkC,cAAcM,QAAQL,OAAO;GAClC;EAEF,SACE,OAAO;GACL5E,KAAK8E,IAAI9E;GACTgF,MAAM;GACNvC,SACEsC,QAAQvC,iBAAiBH,QACrB0C,QAAQvC,MAAMC,UACd2C,OAAOL,QAAQvC,KAAK;EAC5B;CACJ;AACF;AAEA,MAAM6C,qBAAqBb,QAAgB;CACzC,IAAI3E;CACJ,IAAI;EACFA,QAAQuE,KAAKK,MAAMD,GAAG;CACxB,QAAQ;EACN,OAAOtC,UAAU,iBAAiB;CACpC;CACA,IAAI,CAACa,cAAclD,KAAK,GAAG,OAAOqC,UAAU,iBAAiB;CAC7D,MAAM,EAAEoD,SAAS,GAAGC,UAAU1F;CAC9B,IAAIyF,YAAY3B,KAAAA,GAAW,MAAM,IAAI6B,SAAS,MAAM,EAAEC,QAAQ,IAAI,CAAC;CACnE,IACE,CAAC1C,cAAcuC,OAAO,KACtBnH,OAAOuH,OAAOJ,OAAO,CAAC,CAACK,MAAMhH,MAAM,OAAOA,MAAM,QAAQ,GAExD,OAAOuD,UAAU,mBAAmB;CAEtC,OAAO;EACIoD;EACTxB,OAAO3F,OAAOa,KAAKuG,KAAK,CAAC,CAAC9G,SACtBoF,gBAAgB0B,KAAK,IACrB;GAAEzC,KAAK,CAAA;GAAIhC,KAAK,CAAA;EAAG;CACzB;AACF;AAwCA,MAAMsH,iBAAiBC,MAAuB;CAC5C,IAAIA,EAAEnB,kBAAkBmB,EAAEpB,UAAU;CACpCoB,EAAEnB,iBAAiB;CACnBmB,EAAEV,KAAK;AACT;AAEA,MAAMW,YACJD,GACA1I,OAKG;CACH,IAAIA,GAAGA,OAAO,aAAaA,GAAGA,OAAO,OAAO;EAC1C,MAAM,EAAEE,OAAOC,SAASjD,YAAY8C,GAAGE,KAAK;EAC5CwI,EAAE1B,WAAWrD,KAAK;GAAE,GAAG3D;GAAIE;GAAO,GAAIC,SAAS6D,KAAAA,KAAa,EAAE7D,KAAK;EAAG,CAAC;CACzE,OACEuI,EAAE1B,WAAWrD,KAAK3D,EAAE;CAEtByI,cAAcC,CAAC;AACjB;AAEA,MAAME,UAAUF,GAAoBG,SAA6B;CAC/D,IAAIA,SAASH,EAAEb,SAAS;CACxBa,EAAEb,UAAUgB;CACZ,MAAMC,YACJ,OAAOD,KAAKE,UAAU,YAAYF,KAAKE,UAAU,OAC7CpM,aAAakM,KAAKE,KAAK,IACvB/E,KAAAA;CACN,MAAMgF,eAAetM,gBAAgBmM,KAAKI,QAAQ;CAClD,IAAI,CAACH,aAAa,CAACE,cAAcE,QAC/B,MAAM,IAAIxG,MACR,qHACF;CAEF,IAAIoG,cAAcJ,EAAEhB,WAAW;EAC7BgB,EAAEhB,WAAWyB,QAAQ,IAAI;EACzBT,EAAEhB,YAAYoB;EACdJ,EAAEhB,UAAUyB,SAASnJ,OAAO2I,SAASD,GAAG1I,EAAE,CAAC;CAC7C;CACA0I,EAAEd,eAAeoB;AACnB;AAEA,MAAaI,aACXV,GACAW,MACA7D,MACAhD,WACG;CACH,IAAI,CAAC6G,KAAK3H,MAAM;CAChB2H,KAAK3H,OAAO;CACZgH,EAAE7B,MAAMyC,OAAOD,IAAI;CACnB,IAAI;EACFA,KAAK7H,OAAO+H,MAAM/D,MAAMhD,MAAM;CAChC,QAAQ,CACN;CAEF,IAAIkG,EAAE7B,MAAM2C,SAAS,KAAKd,EAAElB,mBAAmB,MAAM;EACnDiC,cAAcf,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;CACrB;AACF;AAEA,MAAakC,UAAUhB,GAAoBW,MAAYM,SAAiB;CACtE,IAAI,CAACN,KAAK3H,MAAM;CAChB2H,KAAKzH,aAAalD,KAAKkL,IAAI;CAC3B,IAAI;EACFP,KAAK7H,OAAOqI,KAAKF,IAAI;CACvB,QAAQ;EACNP,UAAUV,GAAGW,IAAI;CACnB;AACF;AAEA,MAAaS,qBAAqBpB,MAChCA,EAAE7B,MAAM2C,OACN,CAAC,GAAGd,EAAE3B,YAAY,CAAC,CAAC1C,QAAQgF,SAASA,KAAKrH,WAAW,CAAC,CAAClD,UACzD4J,EAAEtC;AAEJ,MAAM2D,mBAAmBrB,MAAuB;CAC9C,IAAIA,EAAElB,mBAAmB,QAAQkB,EAAExC,eAAe,GAAG;CACrDwC,EAAElB,iBAAiBC,kBAAkB;EACnC,MAAMmC,MAAMlL,KAAKkL,IAAI;EACrB,KAAK,MAAMP,QAAQ,CAAC,GAAGX,EAAE7B,KAAK,GAC5B,IAAI+C,MAAMP,KAAKzH,cAAc8G,EAAExC,aAAawD,OAAOhB,GAAGW,MAAM,IAAI;CAEpE,GAAGX,EAAExC,WAAW;CAChB,EAAGsB,eAAqDwC,QAAQ;AAClE;AAEA,MAAMC,kBAAkBvB,GAAoBwB,OAAe;CACzD,IAAIA,OAAOxB,EAAExC,aAAa;CAC1BwC,EAAExC,cAAcgE;CAChB,IAAIxB,EAAElB,mBAAmB,MAAM;EAC7BiC,cAAcf,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;EACnBuC,gBAAgBrB,CAAC;CACnB;AACF;AAEA,MAAMyB,aAAazB,MAAgC;CACjD,IAAIA,EAAEb,SAASuC,MAAMC,WAAW,OAAO,OAAO;CAC9C,KAAK,MAAMC,OAAO5B,EAAE9B,QAAQb,OAAO,GACjC,IAAIuE,IAAIlJ,SAASoI,OAAO,GAAG,OAAO;CAEpC,OAAO;AACT;AAEA,MAAae,SAAS7B,GAAoBL,QAA4B;CACpE9L,mBAAmB,CAAC,CAAC;CACrBmM,EAAEhB,WAAW8C,YAAY;CACzB,KAAK,MAAMF,OAAO5B,EAAE9B,QAAQb,OAAO,GACjC,KAAK,MAAMZ,OAAOmF,IAAIlJ,SAAS2E,OAAO,GACpC,IAAIZ,IAAI5E,WAAW,CAAC4E,IAAI1E,WAAW,CAAC0E,IAAI3E,aAAa;EACnD2E,IAAI3E,cAAc;EAClBiK,aAAa/B,GAAG4B,IAAI3J,IAAIwE,IAAI9E,GAAG;CACjC;CAGJ,MAAMqK,QAAQP,UAAUzB,CAAC;CACzB,MAAMiC,OAAOD,UAAUhC,EAAEvB;CACzB,IACEuB,EAAE1B,WAAWlI,WAAW,KACxB4J,EAAEzB,eAAeuC,SAAS,KAC1Bd,EAAExB,YAAYsC,SAAS,KACvBnB,QAAQrE,KAAAA,KACR,CAAC2G,MAED;CAEFjC,EAAEvB,WAAWuD;CACb,IAAIrC,QAAQrE,KAAAA,KAAa2G,QAAQD,SAAShC,EAAElC,WAC1C6B,MAAM,EAAE7F,QAAQ,OAAO;CAEzB,MAAMuB,MAAM2E,EAAE1B;CACd,MAAMzG,UAAUmI,EAAEzB;CAClB,MAAM2D,OAAOlC,EAAExB;CACfwB,EAAE1B,aAAa,CAAA;CACf0B,EAAEzB,iCAAiB,IAAIhG,IAAI;CAC3ByH,EAAExB,8BAAc,IAAIjG,IAAI;CAIxB,KAAK,MAAMoI,QAAQ,CAAC,GAAGX,EAAE7B,KAAK,GAAG;EAC/B,MAAMgE,kBACJtK,QAAQuK,IAAIzB,KAAK9H,QAAQ,KAAK,CAAA,EAAA,CAC9BwJ,KAAK1K,SAAS;GAAEA;GAAKgF,MAAM;EAAU,EAAE;EACzC,IAAItB,IAAIjF,SAAS,GAAG;GAClB,MAAMkM,SAA4B;IAChCjH;IACA,GAAI8G,eAAe/L,SAAS,KAAK,EAAEqC,KAAK0J,eAAe;IACvD,GAAIF,QAAQ,EAAEM,MAAMP,MAAM;GAC5B;GACAhB,OAAOhB,GAAGW,MAAM5E,KAAKC,UAAUsG,MAAM,CAAC;EACxC,OAAO,IAAIH,eAAe/L,SAAS,GACjC4K,OAAOhB,GAAGW,MAAM5E,KAAKC,UAAU,EAAEvD,KAAK0J,eAAe,CAAC,CAAC;EAEzD,MAAMK,WAAWN,KAAKE,IAAIzB,KAAK9H,QAAQ,KAAK,CAAA;EAC5C,IAAI2J,SAASpM,SAAS,GACpB4K,OAAOhB,GAAGW,MAAM5E,KAAKC,UAAU,EAAEvD,KAAK+J,SAAS,CAAC,CAAC;EAEnD,IAAIP,QAAQ5G,IAAIjF,WAAW,GACzB4K,OAAOhB,GAAGW,MAAM5E,KAAKC,UAAU,EAAEuG,MAAMP,MAAM,CAAC,CAAC;EAEjD,IAAIrC,QAAQrE,KAAAA,GAAW;GACrB0F,OAAOhB,GAAGW,MAAM5E,KAAKC,UAAU,EAAE2D,IAAI,CAAC,CAAC;GACvCe,UAAUV,GAAGW,IAAI;EACnB;CACF;AACF;AAEA,MAAMoB,gBAAgB/B,GAAoBnH,UAAkBlB,QAAgB;CAC1E,MAAM8K,OAAOzC,EAAEzB,eAAe6D,IAAIvJ,QAAQ;CAC1C,IAAI4J,MAAMA,KAAKxH,KAAKtD,GAAG;MAClBqI,EAAEzB,eAAemE,IAAI7J,UAAU,CAAClB,GAAG,CAAC;CACzCoI,cAAcC,CAAC;AACjB;AAEA,MAAM2C,YAAY3C,GAAoBnH,UAAkBJ,QAAsB;CAC5E,MAAMgK,OAAOzC,EAAExB,YAAY4D,IAAIvJ,QAAQ;CACvC,IAAI4J,MAAMA,KAAKxH,KAAKxC,GAAG;MAClBuH,EAAExB,YAAYkE,IAAI7J,UAAU,CAACJ,GAAG,CAAC;CACtCsH,cAAcC,CAAC;AACjB;AAEA,MAAM4C,uBAAuB5C,MAAuB;CAClDA,EAAEZ,aAAayD,wBACb,CAAC,GAAG7C,EAAE9B,QAAQb,OAAO,CAAC,CAAC,CAACgF,KAAKT,SAAS;EACpC3J,IAAI2J,IAAI3J;EACRC,SAAS4K,gBAAgBlB,GAAG;EAC5BzJ,QAAQyJ,IAAIzJ;EACZC,SAASwJ,IAAIxJ;EACbC,SAASuJ,IAAIvJ;EACbC,SAAS,CAAC,GAAGsJ,IAAItJ,OAAO,CAAC,CAAC+J,KAAK,CAAC1K,KAAKoL,YAAY;GAC/CpL;GACAa,IAAIuK,MAAMvK;GACVC,KAAKsK,MAAMtK;EACb,EAAE;EACFE,WAAWiJ,IAAIjJ;CACjB,EAAE,CACJ;AACF;AAEA,MAAMqK,UAAUpB,KAAgBnJ,QAAsB;CACpD,MAAMyI,MAAMlL,KAAKkL,IAAI;CACrBU,IAAItJ,QAAQoK,IAAIjK,IAAId,KAAK;EAAEa,IAAI0I;EAAKzI;CAAI,CAAC;CACzC,MAAMwK,SAASC,KAAKC,IAAI,GAAGvB,IAAItJ,QAAQ3B,KAAK,CAAC;CAC7C,KAAK,MAAM,CAACgB,KAAKoL,UAAUnB,IAAItJ,SAC7B,IAAIX,QAAQsL,UAAU/B,MAAM6B,MAAMvK,KAAKzB,eACrC6K,IAAItJ,QAAQsI,OAAOjJ,GAAG;CAG1B,OAAOiK,IAAItJ,QAAQwI,OAAO9J,cACxB4K,IAAItJ,QAAQsI,OAAOsC,KAAKE,IAAI,GAAGxB,IAAItJ,QAAQ3B,KAAK,CAAC,CAAC;AAEtD;;AAGA,MAAMmM,mBAAmBlB,QACvBsB,KAAKC,IAAIvB,IAAI1J,SAAS,GAAG0J,IAAIlJ,SAAS/B,KAAK,CAAC;AAK9C,MAAM0M,UAAUrD,GAAoB4B,KAAgBjK,QAAgB;CAClE,MAAM2L,SAAS1B,IAAItJ,QAAQ8J,IAAIzK,GAAG;CAClC,IAAI2L,QAAQ;EAEV,IAAI3L,QADWuL,KAAKC,IAAI,GAAGvB,IAAItJ,QAAQ3B,KAAK,CAChCsM,KAAUjN,KAAKkL,IAAI,IAAIoC,OAAO9K,MAAMzB,eAAe;GAC7D4L,SAAS3C,GAAG4B,IAAI3J,IAAIqL,OAAO7K,GAAG;GAC9B;EACF;EACAmJ,IAAItJ,QAAQsI,OAAOjJ,GAAG;EACtBiL,oBAAoB5C,CAAC;CACvB;CACA,MAAMvD,MAAMmF,IAAIlJ,SAAS0J,IAAIzK,GAAG;CAChC,IAAI8E,KAAK;EACP,IAAIA,IAAI5E,SAASkK,aAAa/B,GAAG4B,IAAI3J,IAAIN,GAAG;EAC5C;CACF;CACAgL,SAAS3C,GAAG4B,IAAI3J,IAAI;EAAEN;EAAKgF,MAAM;CAAU,CAAC;AAC9C;AAEA,MAAM4G,aACJvD,GACA4B,KACAnF,KACAhE,QACG;CACH,IAAIgE,IAAI1E,SAAS;CACjB0E,IAAI1E,UAAU;CACd6J,IAAIlJ,SAASkI,OAAOnE,IAAI9E,GAAG;CAC3BqL,OAAOpB,KAAKnJ,GAAG;CACfmJ,IAAI1J,UAAUgL,KAAKC,IAAIvB,IAAI1J,SAASuE,IAAI9E,GAAG;CAC3C8E,IAAI5E,UAAU;CACd8K,SAAS3C,GAAG4B,IAAI3J,IAAIQ,GAAG;CACvBmK,oBAAoB5C,CAAC;AACvB;AAEA,MAAMwD,cACJxD,GACA4B,KACAnF,KACAC,YACG6G,UAAUvD,GAAG4B,KAAKnF,KAAKD,MAAMC,KAAKC,OAAO,CAAC;AAE/C,MAAM+G,YACJzD,GACA4B,KACAxI,UAC0B;CAC1BP,UAAU+I,IAAI3J;CACdmB;CACA,IAAIf,UAAU;EACZ,OAAOuJ,IAAIvJ;CACb;CACA,IAAIsL,cAAc;EAChB,IAAI3D,EAAE9B,QAAQkE,IAAIR,IAAI3J,EAAE,MAAM2J,KAAK,OAAO;EAC1C,KAAK,MAAMjB,QAAQX,EAAE7B,OACnB,IAAIwC,KAAK9H,aAAa+I,IAAI3J,MAAM0I,KAAK3H,MAAM,OAAO;EAEpD,OAAO;CACT;AACF;AAEA,MAAM4K,mBACJ5D,GACA4B,KACAnF,KACArC,YAEAmJ,UAAUvD,GAAG4B,KAAKnF,KAAK;CACrB9E,KAAK8E,IAAI9E;CACTgF,MAAM;CACNG,MAAM;CACN1C;AACF,CAAC;AAEH,MAAMyJ,YACJ7D,GACA4B,KACA9G,WACA1B,SACG;CACH,MAAMqD,MAAiB;EACrB9E,KAAKmD,UAAUnD;EACfC,QAAQkD,UAAUlD;EAClBC,SAAS;EACTC,aAAa;EACbC,SAAS;CACX;CACA6J,IAAIlJ,SAASgK,IAAI5H,UAAUnD,KAAK8E,GAAG;CACnCmG,oBAAoB5C,CAAC;CACrB,IAAI,CAAC9J,MAAMC,QAAQ2E,UAAUP,MAAM,GAAG;EACpCqJ,gBAAgB5D,GAAG4B,KAAKnF,KAAK,yBAAyB;EACtD;CACF;CACA,IAAIlC,SAASO,UAAUP;CACvB,IAAIO,UAAUrD,SAAS6D,KAAAA,GACrB,IAAI;EACFf,SAAS9F,YAAY8F,QAAQO,UAAUrD,MAAM,EAC3C8D,eAAe,KACjB,CAAC;CACH,SAASpB,OAAO;EACdyJ,gBACE5D,GACA4B,KACAnF,KACA,mBAAoBtC,MAAgBC,SACtC;EACA;CACF;CAEF,IAAIU,UAAUlD,WAAW,sBAAsB;EAC7C,IAAI2C,OAAOnE,SAAS,GAAG;GACrBwN,gBAAgB5D,GAAG4B,KAAKnF,KAAK,oCAAoC;GACjE;EACF;EACA,MAAMqH,QAAQ,CACZ,GAAI9D,EAAEd,cAAc6E,UAAU,KAAK,CAAA,GACnC,oBAAoB,CACrB,CAACnI,KAAK;EACP2H,UAAUvD,GAAG4B,KAAKnF,KAAK;GAAE9E,KAAK8E,IAAI9E;GAAKgF,MAAM;GAAUJ,SAASuH;EAAM,CAAC;EACvE;CACF;CACA9D,EAAEd,aAAcsB,OAAQ;EACtB5I,QAAQkD,UAAUlD;EAClB2C;EACA1B,UAAU+I,IAAI3J;EACd+L,QAAQP,SAASzD,GAAG4B,KAAKxI,IAAI;EAC7B6K,iBAAiB;GACf,IAAIxH,IAAI1E,WAAW0E,IAAI5E,SAAS;GAChC4E,IAAI5E,UAAU;GACd+J,IAAI1J,UAAUgL,KAAKC,IAAIvB,IAAI1J,SAASuE,IAAI9E,GAAG;GAC3CiL,oBAAoB5C,CAAC;GACrBD,cAAcC,CAAC;EACjB;EACAkE,WAAWxH,YAAY8G,WAAWxD,GAAG4B,KAAKnF,KAAKC,OAAO;CACxD,CAAC,CAAC,CAACyH,OAAOhK,UAAmB;EAC3B,IAAI,CAACsC,IAAI1E,SAASyL,WAAWxD,GAAG4B,KAAKnF,KAAK;GAAEE,MAAM;GAAYxC;EAAM,CAAC;CACvE,CAAC;AACH;AAcA,MAAaoK,cACXvE,GACA4B,KACAnG,OACArC,SACmB;CACnBwI,IAAIxJ,UAAUpC,KAAKkL,IAAI;CACvB,MAAMsD,UAAU1B,gBAAgBlB,GAAG;CACnC,KAAK,MAAM9G,aAAaW,MAAMhD,KAC5B,IAAIqC,UAAUnD,OAAO6M,SAASnB,OAAOrD,GAAG4B,KAAK9G,UAAUnD,GAAG;CAE5D,MAAM8M,SAAShJ,MAAMhB,IAAIkB,QAAQ+I,MAAMA,EAAE/M,MAAMiK,IAAIzJ,MAAM;CACzD,MAAMwM,SAASlJ,MAAMhD,IAAIkD,QAAQ+I,MAAMA,EAAE/M,MAAM6M,OAAO;CACtD,IACGC,OAAOrO,SAAS,KAAKqO,OAAO,EAAE,CAAE9M,QAAQiK,IAAIzJ,SAAS,KACrDwM,OAAOvO,SAAS,KAAKuO,OAAO,EAAE,CAAEhN,QAAQ6M,UAAU,GACnD;EACA5B,oBAAoB5C,CAAC;EACrB,OAAO;GACLrD,MAAM;GACN0H,KAAK,EAAEA,KAAK;IAAE1M,KAAK6M;IAASrM,QAAQyJ,IAAIzJ;GAAO,EAAE;EACnD;CACF;CACA,IAAIwM,OAAOvO,SAAS,GAAG;EACrB,IAAIwO,kBAAkB;EACtB,KAAK,MAAMC,UAAU7E,EAAE9B,QAAQb,OAAO,GACpCuH,mBAAmBC,OAAOnM,SAASoI;EAErC,IACEc,IAAIlJ,SAASoI,OAAO6D,OAAOvO,SAAAA,OAC3BwO,kBAAkBD,OAAOvO,SAAS4J,EAAErC,qBAEpC,OAAO;GACLhB,MAAM;GACN0H,KAAK,EACHA,KAAK;IACH1M,KAAK6M;IACLrM,QAAQyJ,IAAIzJ;IACZmM,OAAO5P;GACT,EACF;EACF;CAEJ;CACA,KAAK+P,OAAOrO,UAAUuO,OAAOvO,WAAW4J,EAAEjC,UAAU;EAClD,MAAMuG,QAAQtE,EAAEjC,SAAS;EACzB,IAAIuG,UAAU,MAAM;GAClB,IAAI,CAACvJ,OAAO+J,cAAcR,KAAK,KAAKA,QAAQ,GAC1C,MAAM,IAAIS,UACR,yDACF;GACF,OAAO;IACLpI,MAAM;IACN0H,KAAK,EAAEA,KAAK;KAAE1M,KAAK6M;KAASrM,QAAQyJ,IAAIzJ;KAAQmM;IAAM,EAAE;GAC1D;EACF;CACF;CACA,KAAK,MAAMxJ,aAAa2J,QAAQ;EAC9B7C,IAAIvJ,UAAUyC,UAAUtD;EACxBoK,IAAIzJ,SAAS2C,UAAUnD;CACzB;CACA,KAAK,MAAMmD,aAAa6J,QAAQd,SAAS7D,GAAG4B,KAAK9G,WAAW1B,IAAI;CAChE,IAAIuL,OAAOvO,SAAS,GAElBuM,SAAS3C,GAAG4B,IAAI3J,IAAI;EAAEN,KAAKgN,OAAOK,GAAG,EAAE,CAAC,CAAErN;EAAKsN,KAAK;CAAK,CAAC;CAE5DrC,oBAAoB5C,CAAC;CACrBD,cAAcC,CAAC;CACf,OAAO,EAAErD,MAAM,KAAK;AACtB;AAEA,MAAMvC,WAAW4F,GAAoBW,MAAYM,SAAiB;CAChE,IAAI,CAACN,KAAK3H,QAAQgH,EAAEpB,YAAYoB,EAAEtB,aAAa,MAAM;CACrD,IAAIrC,iBAAiB4E,IAAI,GAAG;EAC1BD,OACEhB,GACAW,MACA5E,KAAKC,UAAU,EACb2D,KAAK;GACH7F,QAAQ;GACRM,SAAS;EACX,EACF,CAAC,CACH;EACAsG,UAAUV,GAAGW,MAAM,MAAM,iBAAiB;EAC1C;CACF;CACA,MAAMuE,QAAQ,CAACvE,KAAK1H;CACpB0H,KAAK1H,WAAW;CAChB,IAAIwC;CACJ,IAAI;EACFA,QAAQyJ,QAAQlI,kBAAkBiE,IAAI,CAAC,CAACxF,QAAQS,WAAW+E,IAAI;CACjE,SAAS9G,OAAO;EACd,MAAML,SAASI,gBAAgBC,KAAK;EACpC,IAAIL,WAAW,MAAM,MAAMK;EAC3B6G,OACEhB,GACAW,MACA5E,KAAKC,UAAU,EACb2D,KAAK;GACH7F,QAAQ;GACRM,SAASN;EACX,EACF,CAAC,CACH;EACA4G,UAAUV,GAAGW,MAAM,MAAM7G,MAAM;EAC/B;CACF;CACA,IAAI2B,MAAMhB,IAAIrE,WAAW,KAAKqF,MAAMhD,IAAIrC,WAAW,GAAG;CACtD,MAAMwL,MAAM5B,EAAE9B,QAAQkE,IAAIzB,KAAK9H,QAAQ;CACvC,MAAMsM,YAAYZ,WAAWvE,GAAG4B,KAAKnG,OAAOkF,KAAKvH,IAAI;CACrD,IAAI+L,UAAUxI,SAAS,WACrBqE,OAAOhB,GAAGW,MAAM5E,KAAKC,UAAUmJ,UAAUd,GAAG,CAAC;AAEjD;AAEA,MAAMe,gBACJpF,GACAqF,SACAvI,MACAhD,WACG;CACH,IAAI,CAACuL,QAAQrM,MAAM;CACnBqM,QAAQrM,OAAO;CACfgH,EAAE3B,aAAauC,OAAOyE,OAAO;CAC7B,IAAIA,QAAQ7L,UAAU,MAAM8L,aAAaD,QAAQ7L,KAAK;CACtD,IAAI;EACF6L,QAAQvM,OAAO+H,MAAM/D,MAAMhD,MAAM;CACnC,QAAQ,CACN;AAEJ;AAEA,MAAMyL,eAAeF,SAAsBpE,SAA0B;CACnE,IAAI,CAACoE,QAAQrM,MAAM,OAAO;CAC1B,IAAI;EACFqM,QAAQvM,OAAOqI,KAAKF,IAAI;EACxB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,MAAMuE,yBAAyB1M,WAA+C;CAC5E,IAAI;EACFA,OAAOqI,KACLpF,KAAKC,UAAU,EACb2D,KAAK;GACH7F,QAAQ;GACRgD,MAAM;GACN1C,SAASjD;EACX,EACF,CAAC,CACH;CACF,QAAQ,CACN;CAEF,IAAI;EACF2B,OAAO+H,MAAM,MAAM1J,wBAAwB;CAC7C,QAAQ,CACN;CAEF,OAAO;AACT;AAEA,MAAMsO,8BACJzF,GACAqF,SACAlL,UACG;CACH,MAAMuL,WAAWvL,iBAAiBgD,WAAWhD,QAAQ;CACrD,MAAMwL,eAAeD,UAAUtI,WAAW,OAAOsI,UAAUtI,WAAW;CACtE,MAAMA,SAASsI,UAAUtI;CACzB,MAAMhD,UAAUuL,eACZ,iBACAD,UAAUE,eACTxI,WAAW9B,KAAAA,IAAY,yBAAyB,QAAQ8B;CAC7DmI,YACEF,SACAtJ,KAAKC,UAAU,EACb2D,KAAK;EACH7F,QACEsD,WAAW,MACP,cACAuI,eACE,iBACA;EACRvL;EACA,GAAIgD,WAAW9B,KAAAA,KAAa,EAAE8B,OAAO;CACvC,EACF,CAAC,CACH;CACAgI,aAAapF,GAAGqF,SAASM,eAAe,OAAO,MAAMvL,OAAO;AAC9D;AAEA,MAAMyL,qBACJ5I,YAC2B;CAC3B,MAAM6I,uBAAO,IAAI1H,IAAY;CAC7B,KAAK,MAAMnE,QAAQnE,OAAOa,KAAKsG,OAAO,GAAG;EACvC,MAAMpG,MAAMoD,KAAK8L,YAAY;EAC7B,IAAID,KAAKE,IAAInP,GAAG,GAAG,MAAM,IAAIkO,UAAU,uBAAuB;EAC9De,KAAKG,IAAIpP,GAAG;CACd;CACA,OAAOf,OAAOoQ,YAAY,IAAIC,QAAQlJ,OAAO,CAAC;AAChD;AAEA,MAAMmJ,qBACJpG,GACAnH,UACAC,QACA0G,YACkD;CAClD,MAAMxB,YAAYgC,EAAEhC;CACpB,IAAIwB,QAAQ6G,eAAe,MAQzB,OAPqBE,SACnBvG,GACAnH,UACAC,QACA0G,QAAQ6G,eAAe,MACvB7G,QAAQpG,IAEHkN,CAAY,EAAE3M,cAAc;CAErC,MAAM6M,UAAU1J,MAAchD,WAAmB;EAC/C,IAAI;GACFhB,OAAO+H,MAAM/D,MAAMhD,MAAM;EAC3B,QAAQ,CACN;EAEF,OAAO;CACT;CACA,IAAIkG,EAAEpB,UAAU,OAAO4H,OAAO,MAAM,UAAU;CAC9C,IAAI,CAAC/Q,aAAagR,KAAK5N,QAAQ,GAAG,OAAO2N,OAAO,MAAM,mBAAmB;CACzE3E,MAAM7B,CAAC;CACP,IAAIA,EAAEtB,aAAa,MAAM;EACvB,IAAI;GACF5F,OAAOqI,KAAKpF,KAAKC,UAAU,EAAE2D,KAAKK,EAAEtB,SAAS,CAAC,CAAC;EACjD,QAAQ,CACN;EAEF,OAAO8H,OAAO,KAAM,UAAU;CAChC;CACA,MAAMnB,UAAuB;EAC3BvM;EACAE,MAAM;EACNM,aAAa;EACbC,QAAQ,CAAA;EACRC,OAAO;EACPG,YAAY;CACd;CACAqG,EAAE3B,aAAa4H,IAAIZ,OAAO;CAC1BA,QAAQ7L,QAAQE,iBAEZ+L,2BACEzF,GACAqF,SACA,IAAIlI,SAAS,MAAM,EAAEC,QAAQ,IAAI,CAAC,CACpC,GACF4C,EAAEvC,eACJ;CACA,QAASjE,MAA4C8H,QAAQ;CAC7D,OAAO;EACLzI;EACAuB,UAAU6G,SAAS;GACjB,IAAIoE,QAAQ1L,eAAe,MAAM;IAC/B0L,QAAQ1L,WAAWS,QAAQ6G,IAAI;IAC/B;GACF;GACA,IAAI,CAACoE,QAAQrM,QAAQgH,EAAEpB,YAAYoB,EAAEtB,aAAa,MAAM;GACxD,IAAIrC,iBAAiB4E,IAAI,GAAG;IAC1BsE,YACEF,SACAtJ,KAAKC,UAAU,EACb2D,KAAK;KACH7F,QAAQ;KACRM,SAAS;IACX,EACF,CAAC,CACH;IACAgL,aAAapF,GAAGqF,SAAS,MAAM,iBAAiB;IAChD;GACF;GACA,IAAIA,QAAQ/L,aAAa;IACvB+L,QAAQ9L,OAAO0B,KAAKgG,IAAI;IACxB;GACF;GACA,IAAIyF;GACJ,IAAI;IACFA,UAAU1J,kBAAkBiE,IAAI;GAClC,SAAS9G,OAAO;IACd,IAAIA,iBAAiBgD,UAAU;KAC7BsI,2BAA2BzF,GAAGqF,SAASlL,KAAK;KAC5C;IACF;IACA,MAAML,SAASI,gBAAgBC,KAAK;IACpC,IAAIL,WAAW,MAAM,MAAMK;IAC3BoL,YACEF,SACAtJ,KAAKC,UAAU,EACb2D,KAAK;KACH7F,QAAQ;KACRM,SAASN;IACX,EACF,CAAC,CACH;IACAsL,aAAapF,GAAGqF,SAAS,MAAMvL,MAAM;IACrC;GACF;GACA,MAAM2B,QAAQiL,QAAQjL;GACtB,IAAIwB;GACJ,IAAI;IACFA,UAAU4I,kBAAkBa,QAAQzJ,OAAO;GAC7C,QAAQ;IACNsI,YACEF,SACAtJ,KAAKC,UAAU,EACb2D,KAAK;KACH7F,QAAQ;KACRM,SAAS;IACX,EACF,CAAC,CACH;IACAgL,aAAapF,GAAGqF,SAAS,MAAM,mBAAmB;IAClD;GACF;GACA,IAAIjE,kBAAkBpB,CAAC,GAAG;IACxBuF,YACEF,SACAtJ,KAAKC,UAAU,EACb2D,KAAK;KACH7F,QAAQ;KACRgD,MAAM;KACN1C,SAASjD;IACX,EACF,CAAC,CACH;IACAiO,aAAapF,GAAGqF,SAAS,MAAMlO,wBAAwB;IACvD;GACF;GACAkO,QAAQ/L,cAAc;GACtBwG,QAAQ6G,QAAQ,CAAC,CACdC,WAAW5I,YAAY,EAAEf,QAAQ,CAAC,CAAC,CAAC,CACpC2J,MAAMxN,SAAS;IACd,IAAI,CAACiM,QAAQrM,QAAQgH,EAAEpB,YAAYoB,EAAEtB,aAAa,MAAM;IACxDc,QAAQqH,eAAezN,IAAI;IAC3BiM,QAAQrM,OAAO;IACfgH,EAAE3B,aAAauC,OAAOyE,OAAO;IAC7B,IAAIA,QAAQ7L,UAAU,MAAM8L,aAAaD,QAAQ7L,KAAK;IACtD,MAAM8M,eAAeC,SAASvG,GAAGnH,UAAUC,QAAQ,MAAMM,IAAI;IAC7D,IAAIkN,iBAAiB,MAAM;IAC3BjB,QAAQ1L,aAAa2M,aAAa3M;IAClC,IAAI8B,MAAMhB,IAAIrE,UAAUqF,MAAMhD,IAAIrC,QAAQ;KACxC,MAAM+O,YAAYZ,WAAWvE,GAAGsG,aAAa1E,KAAKnG,OAAOrC,IAAI;KAC7D,IAAI+L,UAAUxI,SAAS,WACrBqE,OAAOhB,GAAGsG,aAAa3F,MAAM5E,KAAKC,UAAUmJ,UAAUd,GAAG,CAAC;IAC9D;IACA,KAAK,MAAMpD,QAAQoE,QAAQ9L,OAAOuN,OAAO,CAAC,GACxCR,aAAa3M,WAAWS,QAAQ6G,IAAI;GACxC,CAAC,CAAC,CACDkD,OAAOhK,UAAmB;IACzB,IAAIkL,QAAQrM,MAAMyM,2BAA2BzF,GAAGqF,SAASlL,KAAK;GAChE,CAAC;EACL;EACA0G,aAAa;GACX,IAAIwE,QAAQ1L,eAAe,MAAM0L,QAAQ1L,WAAWkH,MAAM;QACrDuE,aAAapF,GAAGqF,OAAO;EAC9B;CACF;AACF;AAEA,MAAM0B,aAAa/G,MAAuB;CACxC,IAAIgH,SAAShH,EAAE9B,QAAQ4C,OAAOd,EAAEnC;CAChC,IAAImJ,UAAU,GAAG;CACjB,IAAIC,UAAU;CACd,MAAMC,OAAO,IAAI9I,IAAI,CAAC,GAAG4B,EAAE7B,KAAK,CAAC,CAACkE,KAAK1B,SAASA,KAAK9H,QAAQ,CAAC;CAC9D,MAAMsO,SAAS,CAAC,GAAGnH,EAAE9B,QAAQb,OAAO,CAAC,CAAC,CAACzB,MAAMhG,GAAGC,MAAMD,EAAEwC,UAAUvC,EAAEuC,OAAO;CAC3E,KAAK,MAAMwJ,OAAOuF,QAAQ;EACxB,IAAIH,UAAU,GAAG;EACjB,IAAIE,KAAKlB,IAAIpE,IAAI3J,EAAE,KAAK2J,IAAIlJ,SAASoI,OAAO,GAAG;EAC/Cd,EAAE9B,QAAQ0C,OAAOgB,IAAI3J,EAAE;EACvBgP,UAAU;EACVD,UAAU;CACZ;CACA,IAAIC,SAASrE,oBAAoB5C,CAAC;AACpC;AAQA,MAAauG,YACXvG,GACAnH,UACAC,QACAG,WAAW,OACXG,OAAgBkC,KAAAA,MACQ;CACxB,MAAMkL,UAAU1J,MAAchD,WAAmB;EAC/C,IAAI;GACFhB,OAAO+H,MAAM/D,MAAMhD,MAAM;EAC3B,QAAQ,CACN;EAEF,OAAO;CACT;CACA,IAAIkG,EAAEpB,UAAU,OAAO4H,OAAO,MAAM,UAAU;CAC9C,IAAI,CAAC/Q,aAAagR,KAAK5N,QAAQ,GAAG,OAAO2N,OAAO,MAAM,mBAAmB;CACzE3E,MAAM7B,CAAC;CACP,IAAIA,EAAEtB,aAAa,MAAM;EACvB,IAAI;GACF5F,OAAOqI,KAAKpF,KAAKC,UAAU,EAAE2D,KAAKK,EAAEtB,SAAS,CAAC,CAAC;EACjD,QAAQ,CACN;EAEF8H,OAAO,KAAM,UAAU;EACvB,OAAO;CACT;CACA,IAAIpF,kBAAkBpB,CAAC,GACrB,OAAOwF,sBAAsB1M,MAAM;CAErC,MAAMuO,QAAQrH,EAAE9B,QAAQkE,IAAIvJ,QAAQ;CACpC,IAAIwO,UAAU/L,KAAAA,KAAa,CAAC3F,WAAW0R,MAAM1O,WAAWS,IAAI,GAAG;EAC7D,IAAI;GACFN,OAAOqI,KACLpF,KAAKC,UAAU,EACb2D,KAAK;IACH7F,QAAQ;IACRM,SAAS1E;IACT0H,QAAQ;GACV,EACF,CAAC,CACH;EACF,QAAQ,CACN;EAEF,OAAOoJ,OAAO,MAAM9Q,0BAA0B;CAChD;CACA,MAAMkM,MACJyF,gBACO;EACL,MAAMC,UAAqB;GACzBrP,IAAIY;GACJX,SAAS;GACTC,QAAQ;GACRC,SAASpC,KAAKkL,IAAI;GAClB7I,SAAS;GACTC,yBAAS,IAAIC,IAAI;GACjBG,0BAAU,IAAIH,IAAI;GAClBI,WAAWS;EACb;EACA4G,EAAE9B,QAAQwE,IAAI7J,UAAUyO,OAAO;EAC/B,OAAOA;CACT,EAAA,CAAG;CACL1F,IAAIxJ,UAAUpC,KAAKkL,IAAI;CACvB,MAAMP,OAAa;EACjB9H;EACAC;EACAE,MAAM;EACNC;EACAC,YAAY;EACZC,OAAO;EACPC;CACF;CACA4G,EAAE7B,MAAM8H,IAAItF,IAAI;CAChBoG,UAAU/G,CAAC;CACX4C,oBAAoB5C,CAAC;CACrBqB,gBAAgBrB,CAAC;CACjB,MAAM,EAAExI,OAAOC,SAASjD,YAAYwL,EAAEhB,UAAWuI,SAAS,CAAC;CAC3D,MAAMC,QAA2B;EAC/BnM,KAAK,CACH;GACE/D,IAAI;GACJC,MAAM,CAAA;GACNC;GACA,GAAIC,SAAS6D,KAAAA,KAAa,EAAE7D,KAAK;EACnC,CAAC;EAEH4M,KAAK;GACH1M,KAAKmL,gBAAgBlB,GAAG;GACxBzJ,QAAQyJ,IAAIzJ;GACZ,GAAI6H,EAAEvB,YAAY,EAAE8D,MAAM,KAAK;EACjC;CACF;CACAvB,OAAOhB,GAAGW,MAAM5E,KAAKC,UAAUwL,KAAK,CAAC;CAMrC,OAAO;EAAE5F;EAAKjB;EAAMhH,YAAAA;GAJlBd;GACAuB,UAAU6G,SAAS7G,QAAQ4F,GAAGW,MAAMM,IAAI;GACxCJ,aAAaH,UAAUV,GAAGW,IAAI;EAEZhH;CAAW;AACjC;AAEA,MAAM4F,WACJS,GACAnH,UACAC,QACA0G,UAAsD,CAAC,MACL;CAClD,OAAO4G,kBAAkBpG,GAAGnH,UAAUC,QAAQ0G,OAAO;AACvD;AAEA,MAAME,UAAUM,GAAoBL,QAA2B;CAC7D,IACEA,IAAI2E,UAAUhJ,KAAAA,MACb,CAACP,OAAO+J,cAAcnF,IAAI2E,KAAK,KAAK3E,IAAI2E,QAAQ,IAEjD,MAAM,IAAItK,MAAM,qDAAqD;CAEvE,IAAIgG,EAAEtB,aAAa,QAAQsB,EAAEpB,UAAU;CACvCoB,EAAEd,cAAcuI,QAAQ;CACxBzH,EAAEtB,WAAWiB;CACb,KAAK,MAAM0F,WAAW,CAAC,GAAGrF,EAAE3B,YAAY,GAAG;EACzCkH,YAAYF,SAAStJ,KAAKC,UAAU,EAAE2D,IAAI,CAAC,CAAC;EAC5CyF,aAAapF,GAAGqF,SAAS,KAAM1F,IAAI7F,MAAM;CAC3C;CACA+H,MAAM7B,GAAGL,GAAG;AACd;AAEA,MAAM+H,UAAU1H,MAAuB;CACrCA,EAAEpB,WAAW;CACboB,EAAEhB,WAAWyB,SAASnJ,OAAO2I,SAASD,GAAG1I,EAAE,CAAC;AAC9C;AAEA,MAAMqQ,WAAW3H,MAAuB;CACtCA,EAAEpB,WAAW;CACb,IAAIoB,EAAElB,mBAAmB,MAAM;EAC7BiC,cAAcf,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;CACrB;CACAkB,EAAEhB,WAAWyB,QAAQ,IAAI;AAC3B;AAEA,MAAMmH,wBACJC,UAAyD,CAAA,MAEzD,IAAItP,IACFsP,QAAQxF,KAAK0F,WAAW,CACtBA,OAAO9P,IACP;CACE,GAAG8P;CACHzP,SAAS,IAAIC,IACXwP,OAAOzP,QAAQ+J,KAAK,EAAE1K,KAAKa,IAAIC,UAAU,CAACd,KAAK;EAAEa;EAAIC;CAAI,CAAC,CAAC,CAC7D;CACAC,0BAAU,IAAIH,IAAI;AACpB,CAAC,CACF,CACH;AAEF,MAAMyP,iBACJC,WACAzI,SACAJ,gBAIG;CACH,MAAM,CAACY,KAAKrM,eAAgC;EAC1C,MAAMyU,OAAwB;GAC5B5K,aAAa;GACbC,iBAAiB;GACjBC,gBAAgBxG;GAChByG,qBAAqB5I;GACrB6I,iBAAiBxG;GACjByG,mBAAmB5G;GACnB6G,WAAW;GACXC,UAAUzC,KAAAA;GACV0C,WAAW1C,KAAAA;GACX4C,SAAS0J,qBAAqBxI,aAAaiJ,aAAa;GACxDlK,uBAAO,IAAIC,IAAI;GACfC,8BAAc,IAAID,IAAI;GACtBE,YAAY,CAAA;GACZC,gCAAgB,IAAIhG,IAAI;GACxBiG,6BAAa,IAAIjG,IAAI;GACrBkG,UAAU;GACVC,UAAU;GACVE,UAAU;GACVC,gBAAgB;GAChBC,gBAAgB;GAChBE,WAAW;GACXE,cAAc;GACdC,SAAS;GACTC;GACAE,MAAMtK,4BAA4B;IAChCoT,KAAKvJ,iBAAiB;IACtBgD,MAAMuG,IAAI;GACZ,CAAC;GACD7I,UAAU1G,UAAUC,QAAQwP,mBAC1B/I,QAAQ6I,MAAMvP,UAAUC,QAAQwP,cAAc;GAChD5I,SAASC,QAAQD,OAAO0I,MAAMzI,GAAG;GACjCpK,SAASqK,YAAYpK,OAAY4S,MAAMxI,OAAO;GAC9CvK,SAASuK,cAAYtK,OAAY8S,MAAMxI,SAAO;EAChD;EACA,OAAOwI;CACT,CAAC;CACD7G,eAAevB,GAAGR,SAAS+I,uBAAuB,IAAM;CACxDvI,EAAEjC,WAAWyB,SAASzB;CACtBiC,EAAEvC,kBAAkB+B,SAAS/B,mBAAmB;CAChD,MAAMC,iBACJ8B,SAAS9B,mBAAmBpC,KAAAA,IACxBpE,kBACAsI,QAAQ9B;CACd,IAAI,CAAC3C,OAAOC,UAAU0C,cAAc,KAAKA,iBAAiB,GACxD,MAAM,IAAIqH,UAAU,2CAA2C;CAEjE/E,EAAEtC,iBAAiBA;CACnB,MAAMC,sBACJ6B,SAAS7B,wBAAwBrC,KAAAA,IAC7BvG,iCACAyK,QAAQ7B;CACd,IAAI,CAAC5C,OAAOC,UAAU2C,mBAAmB,KAAKA,sBAAsB,GAClE,MAAM,IAAIoH,UAAU,gDAAgD;CAEtE/E,EAAErC,sBAAsBA;CACxB,MAAMC,kBACJ4B,SAAS5B,oBAAoBtC,KAAAA,IACzBlE,oBACAoI,QAAQ5B;CACd,IAAI,CAAC7C,OAAOC,UAAU4C,eAAe,KAAKA,kBAAkB,GAC1D,MAAM,IAAImH,UAAU,4CAA4C;CAElE/E,EAAEpC,kBAAkBA;CACpBoC,EAAEnC,oBAAoB2B,SAAS3B,qBAAqB5G;CACpD+I,EAAElC,YAAY0B,SAAS1B,aAAa;CACpCkC,EAAEhC,YAAYwB,SAASxB;CACvB,MAAMxG,QAAQ1D,YAAYmU,SAAS;CACnC/H,OAAOF,GAAGxI,KAAK;CACf9D,gBAAgB;EACdwM,OAAOF,GAAGxI,KAAK;EACfuI,cAAcC,CAAC;CACjB,CAAC;CACDtM,gBAAgB;EACdgU,OAAO1H,CAAC;EACR,aAAa2H,QAAQ3H,CAAC;CACxB,GAAG,CAACA,CAAC,CAAC;CACN,OAAOA;AACT;;;;;;;;;AAUA,MAAawI,uBACXP,WACAzI,SACAJ,gBACqC;CACrC,MAAMqJ,uBAAiB;EAAA,OAAMT,cAAcC,WAAWzI,SAASJ,WAAW;CAAC;CAC3E,MAAMsJ,OAAO9U,cAAc6U,cAAc;CACzC,IAAI7J,WAAW;CACf,OAAO;EACLW,UAAU1G,UAAUC,QAAQwP,mBAC1BzU,mBACE6U,KAAKC,SAAS,CAAC,CAACpJ,QAAQ1G,UAAUC,QAAQwP,cAAc,CAC1D;EACF/S,SAASqK,YAAY/L,mBAAmB6U,KAAKC,SAAS,CAAC,CAACpT,OAAOqK,OAAO,CAAC;EACvEvK,SAASuK,YAAY/L,mBAAmB6U,KAAKC,SAAS,CAAC,CAACtT,OAAOuK,OAAO,CAAC;EACvEF,SAASC,QAAQ9L,mBAAmB6U,KAAKC,SAAS,CAAC,CAACjJ,OAAOC,GAAG,CAAC;EAC/DiJ,eAAe;GACb,IAAIhK,UAAU;GACdA,WAAW;GACX/K,mBACE6U,KAAKC,SAAS,CAAC,CAACjJ,OAAO;IAAE5F,QAAQ;IAAagD,MAAM;GAAU,CAAC,CACjE;GACA4L,KAAKG,QAAQ;EACf;CACF;AACF"}
1
+ {"version":3,"file":"socket.js","names":["DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","applyDocumentOps","mainDocument","StatewireDocuments","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","encodeValue","reviveValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_CONTEXT_VALUE_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireMetaEntry","StatewirePath","StatewireCmd","StatewireEnvelope","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","WireOp","op","path","value","meta","Admission","seq","method","applied","appliedSent","settled","ClientRec","id","lastSeq","ctxSeq","touched","context","contextDocuments","State","results","Map","ts","cmd","inflight","principal","Conn","selection","Selection","clientId","socket","Socket","open","sawFrame","lastSentAt","lease","auth","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CtxStatement","ops","CmdStatement","protocol","params","ParsedFrame","ctx","isPlainObject","parseLane","statements","prev","statement","Number","isInteger","push","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","undefined","lane","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","type","failure","fate","code","String","parseInitialFrame","headers","lanes","Response","status","values","some","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","Set","pendingConns","pendingOps","pendingApplied","pendingCmds","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","recordOp","attach","next","nextState","state","nextCommands","commands","submit","setOnOp","closeConn","conn","delete","close","size","clearInterval","sendTo","data","now","send","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","idleLevel","work","isIdle","rec","flush","takeChanged","queueApplied","level","edge","cmds","appliedEntries","get","map","packet","protocols","p","idle","verdicts","dur","list","set","queueCmd","notifyClientRecords","onClientRecordsChange","admittedThrough","documents","entry","retain","newest","Math","max","min","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","admitFrame","version","through","ctxNew","s","cmdNew","hostCommandLoad","client","isSafeInteger","TypeError","at","first","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","has","add","fromEntries","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","splice","gcClients","excess","changed","live","oldest","Registration","known","created","mode","snapshot","hello","main","abort","resume","suspend","restoreClientRecords","records","ClientRecord","record","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","unmount"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { applyDocumentOps, mainDocument } from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { encodeValue, reviveValue } from \"../wire/meta\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_CONTEXT_VALUE_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireMetaEntry } from \"../wire/meta\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport type { StatewireCmd, StatewireEnvelope } from \"../client/connection\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype WireOp = {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireMetaEntry[];\n};\n\ntype Admission = {\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\nexport type ClientRec = {\n id: string;\n lastSeq: number;\n ctxSeq: number;\n touched: number;\n context: Record<string, unknown> | null;\n contextDocuments: StatewireDocuments.State;\n results: Map<number, { ts: number; cmd: StatewireCmd }>;\n inflight: Map<number, Admission>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CtxStatement = { seq: number; ops: unknown[] };\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n ctx: CtxStatement[];\n cmd: CmdStatement[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseLane = (value: unknown): Record<string, unknown>[] => {\n if (!Array.isArray(value)) return violation(\"malformed frame\");\n if (value.length === 0) return violation(\"empty lane\");\n const statements: Record<string, unknown>[] = [];\n let prev: number | null = null;\n for (const statement of value) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n if (typeof seq !== \"number\" || !Number.isInteger(seq) || seq < 1) {\n return violation(\"malformed statement\");\n }\n if (prev !== null && seq !== prev + 1) return violation(\"malformed frame\");\n prev = seq;\n statements.push(statement);\n }\n return statements;\n};\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"ctx\" && key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const ctx: CtxStatement[] = [];\n if (frame[\"ctx\"] !== undefined) {\n const lane = frame[\"ctx\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many context statements\");\n }\n for (const statement of parseLane(lane)) {\n const ops = statement[\"ops\"];\n if (!Array.isArray(ops) || !ops.length)\n return violation(\"invalid-context\");\n if (\n frameEncoder.encode(JSON.stringify(ops)).byteLength >\n MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n ctx.push({ seq: statement[\"seq\"] as number, ops });\n }\n }\n const cmd: CmdStatement[] = [];\n if (frame[\"cmd\"] !== undefined) {\n const lane = frame[\"cmd\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many commands\");\n }\n for (const statement of parseLane(lane)) {\n const method = statement[\"method\"];\n if (\n typeof method !== \"string\" ||\n typeof statement[\"protocol\"] !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n cmd.push({\n protocol: statement[\"protocol\"] as string,\n seq: statement[\"seq\"] as number,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n }\n return { ctx, cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireMetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeValue(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): StatewireCmd => {\n if (outcome.type === \"accepted\") {\n return { seq: adm.seq, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { seq: adm.seq, type: \"crashed\" };\n case \"failed\":\n return {\n seq: adm.seq,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n seq: adm.seq,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n seq: adm.seq,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n seq: adm.seq,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length\n ? parseFrameValue(lanes)\n : { ctx: [], cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, number[]>;\n pendingCmds: Map<string, StatewireCmd[]>;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeValue(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const rec of h.clients.values()) {\n if (rec.inflight.size > 0) return false;\n }\n return true;\n};\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const rec of h.clients.values()) {\n for (const adm of rec.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, rec.id, adm.seq);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n fin === undefined &&\n !edge\n ) {\n return;\n }\n h.idleWire = level;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const ops = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n const appliedEntries: StatewireCmd[] = (\n applied.get(conn.clientId) ?? []\n ).map((seq) => ({ seq, type: \"applied\" }));\n if (ops.length > 0) {\n const packet: StatewireEnvelope = {\n ops: conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? ops\n : [],\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n };\n sendTo(h, conn, JSON.stringify(packet));\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = (cmds.get(conn.clientId) ?? []).map((cmd) =>\n conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? cmd\n : { seq: cmd.seq, ...(cmd.dur === undefined ? {} : { dur: cmd.dur }) },\n );\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, clientId: string, seq: number) => {\n const list = h.pendingApplied.get(clientId);\n if (list) list.push(seq);\n else h.pendingApplied.set(clientId, [seq]);\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, clientId: string, cmd: StatewireCmd) => {\n const list = h.pendingCmds.get(clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(clientId, [cmd]);\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n lastSeq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n touched: rec.touched,\n context: rec.context,\n contextDocuments: [...rec.contextDocuments.documents],\n results: [...rec.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (rec: ClientRec, cmd: StatewireCmd) => {\n const now = Date.now();\n rec.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...rec.results.keys());\n for (const [seq, entry] of rec.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n rec.results.delete(seq);\n }\n }\n while (rec.results.size > RESULT_LIMIT) {\n rec.results.delete(Math.min(...rec.results.keys()));\n }\n};\n\n/** Cmd-lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (rec: ClientRec): number =>\n Math.max(rec.lastSeq, ...rec.inflight.keys());\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, rec: ClientRec, seq: number) => {\n const cached = rec.results.get(seq);\n if (cached) {\n const newest = Math.max(...rec.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, rec.id, cached.cmd);\n return;\n }\n rec.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = rec.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, rec.id, seq);\n return;\n }\n queueCmd(h, rec.id, { seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n cmd: StatewireCmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n rec.inflight.delete(adm.seq);\n retain(rec, cmd);\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, rec.id, cmd);\n notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, rec, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n auth: unknown,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth,\n get context() {\n return rec.context;\n },\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n rec: ClientRec,\n statement: CmdStatement,\n auth: unknown,\n selection: StatewireProtocol.Selection,\n) => {\n const adm: Admission = {\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n rec.inflight.set(statement.seq, adm);\n notifyClientRecords(h);\n if (\n statement.protocol !== h.protocol.name ||\n !selection.protocols.some((p) => p.name === statement.protocol)\n ) {\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"unsupported-protocol\",\n message: \"command protocol was not negotiated\",\n });\n return;\n }\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, rec, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n rec,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, rec, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, rec, adm, { seq: adm.seq, type: \"result\", payload: names });\n return;\n }\n h.commandsHost!.submit!({\n method: statement.method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, auth),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, rec, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, rec, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, both lanes: absorbed statements answer from the record,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating both watermarks, nothing consumed. A gap is never a close.\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { seq: number; ctxSeq: number; retry?: number };\n };\n };\n\nexport const admitFrame = (\n h: SocketHostState,\n rec: ClientRec,\n frame: ParsedFrame,\n auth: unknown,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): FrameAdmission => {\n rec.touched = Date.now();\n const through = admittedThrough(rec);\n for (const statement of frame.cmd) {\n if (statement.seq <= through) reemit(h, rec, statement.seq);\n }\n const ctxNew = frame.ctx.filter((s) => s.seq > rec.ctxSeq);\n const cmdNew = frame.cmd.filter((s) => s.seq > through);\n if (\n (ctxNew.length > 0 && ctxNew[0]!.seq !== rec.ctxSeq + 1) ||\n (cmdNew.length > 0 && cmdNew[0]!.seq !== through + 1)\n ) {\n notifyClientRecords(h);\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq } },\n };\n }\n if (cmdNew.length > 0) {\n let hostCommandLoad = 0;\n for (const client of h.clients.values()) {\n hostCommandLoad += client.inflight.size;\n }\n if (\n rec.inflight.size + cmdNew.length > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostCommandLoad + cmdNew.length > h.maxInflightCommands\n ) {\n return {\n type: \"refused\",\n syn: {\n syn: {\n seq: through,\n ctxSeq: rec.ctxSeq,\n retry: COMMAND_CAPACITY_RETRY_MS,\n },\n },\n };\n }\n }\n if ((ctxNew.length || cmdNew.length) && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq, retry } },\n };\n }\n }\n let contextDocuments = rec.contextDocuments;\n try {\n for (const statement of ctxNew)\n contextDocuments = applyDocumentOps(\n contextDocuments,\n statement.ops,\n selection.protocols,\n true,\n );\n if (\n frameEncoder.encode(JSON.stringify([...contextDocuments.documents]))\n .byteLength > MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n } catch {\n return violation(\"invalid-context\");\n }\n rec.contextDocuments = contextDocuments;\n rec.context = (mainDocument(contextDocuments, h.protocol.name)?.value ??\n null) as Record<string, unknown> | null;\n if (ctxNew.length) rec.ctxSeq = ctxNew.at(-1)!.seq;\n for (const statement of cmdNew) admitCmd(h, rec, statement, auth, selection);\n if (cmdNew.length > 0) {\n // Memory host: admitted means retained — dur rides the admitting flush.\n queueCmd(h, rec.id, { seq: cmdNew.at(-1)!.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let frame: ParsedFrame;\n try {\n frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (frame.ctx.length === 0 && frame.cmd.length === 0) return;\n const rec = h.clients.get(conn.clientId)!;\n let admission: ReturnType<typeof admitFrame>;\n try {\n admission = admitFrame(h, rec, frame, conn.auth, conn.selection);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n const registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n );\n if (registration === null) return;\n pending.connection = registration.connection;\n if (frame.ctx.length || frame.cmd.length) {\n message(\n h,\n registration.conn,\n JSON.stringify({\n ...(frame.ctx.length ? { ctx: frame.ctx } : {}),\n ...(frame.cmd.length ? { cmd: frame.cmd } : {}),\n }),\n );\n }\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (live.has(rec.id) || rec.inflight.size > 0) continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n rec: ClientRec;\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n lastSeq: 0,\n ctxSeq: 0,\n touched: Date.now(),\n context: null,\n contextDocuments: { mode: \"mounted\", documents: new Map() },\n results: new Map(),\n inflight: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n };\n h.conns.add(conn);\n gcClients(h);\n notifyClientRecords(h);\n ensureHeartbeat(h);\n const { value, meta } = encodeValue(h.stateHost!.snapshot());\n const hello: StatewireEnvelope = {\n ops: [\n {\n op: \"mount\",\n protocol: h.protocol.name,\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n },\n ],\n syn: {\n ...selection,\n seq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n ...(h.idleWire && { idle: true }),\n },\n };\n if (!selection.protocols.some((p) => p.name === h.protocol.name))\n hello.ops = [];\n sendTo(h, conn, JSON.stringify(hello));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { rec, conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n ...record,\n contextDocuments: {\n mode: \"mounted\",\n documents: new Map(record.contextDocuments ?? []),\n },\n results: new Map(\n record.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * statement-lane client frames under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id, idle edges, and `fin` on\n * finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { StatewireDocuments } from "./wire/documents.js";
2
+ import { StatewireProtocol } from "./wire/protocol.js";
1
3
  import { StatewireHost } from "./host.js";
2
4
  import { StatewireCmd } from "./client/connection.js";
3
5
  import { StatewireSocketHost } from "./host/socket.js";
@@ -15,12 +17,15 @@ declare namespace StatewireHostInternal {
15
17
  close: () => void;
16
18
  };
17
19
  type SocketConnectOptions = {
20
+ /** Upgrade headers take precedence over initialization headers. */
21
+ headers?: Record<string, string>;
18
22
  /** The adapter restored this socket from an already-authorized session. */
19
23
  authorized?: boolean;
24
+ selection?: StatewireProtocol.Selection;
20
25
  /** The restored session's captured auth value; it must satisfy the client record's principal binding. */
21
26
  auth?: unknown;
22
27
  /** Persist authorization (and the captured auth value) before the first snapshot is released. */
23
- onAuthorized?: (auth: unknown) => void;
28
+ onAuthorized?: (auth: unknown, selection: StatewireProtocol.Selection) => void;
24
29
  };
25
30
  type SocketHost = {
26
31
  /** Null means refused: the socket was told (fin and/or close) and is dead. */
@@ -36,6 +41,7 @@ declare namespace StatewireHostInternal {
36
41
  ctxSeq: number;
37
42
  touched: number;
38
43
  context: Record<string, unknown> | null;
44
+ contextDocuments?: readonly [number, StatewireDocuments.Document][];
39
45
  results: readonly {
40
46
  seq: number;
41
47
  ts: number;
@@ -48,6 +54,8 @@ declare namespace StatewireHostInternal {
48
54
  onClientRecordsChange?: (records: readonly ClientRecord[]) => void;
49
55
  };
50
56
  type SocketHostOptions<TAuth = unknown> = {
57
+ protocol?: StatewireProtocol.Definition;
58
+ wireVersion?: StatewireProtocol.Range;
51
59
  /** Gates every attach; the awaited return value is the attach's auth, exposed to command handlers as `this.caller.auth`. The first attach binds the client id's record to this value; a later attach whose value is not structurally equal is refused (HTTP 403, socket close 1008). */
52
60
  authorize?: (ctx: {
53
61
  headers: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"host-internal.d.ts","names":[],"sources":["../src/host-internal.ts"],"mappings":";;;;;;kBAMiB;OACH;IACV,OAAO;IACP,QAAQ,eAAe;;OAGb;aACD;IACT,UAAU;IACV;;OAGU;;IAEV;;IAEA;;IAEA,gBAAgB;;OAGN;;IAEV,UACE,kBACA,QAAQ,QACR,UAAU,yBACP;IACL,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,KAAK,cAAc;IAC5B;;OAGU;IACV;IACA;IACA;IACA;IACA,SAAS;IACT;MAAoB;MAAa;MAAY,KAAK;;IAClD;;OAGU;IACV,yBAAyB;IACzB,yBAAyB,kBAAkB;;OAGjC,kBAAkB;;IAE5B,aAAa;MACX,SAAS;UACL,QAAQ,QAAQ;;IAEtB;IACA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;OAGU,MAAM,cAAc"}
1
+ {"version":3,"file":"host-internal.d.ts","names":[],"sources":["../src/host-internal.ts"],"mappings":";;;;;;;;kBAQiB;OACH;IACV,OAAO;IACP,QAAQ,eAAe;;OAGb;aACD;IACT,UAAU;IACV;;OAGU;;IAEV,UAAU;;IAEV;IACA,YAAY,kBAAkB;;IAE9B;;IAEA,gBACE,eACA,WAAW,kBAAkB;;OAIrB;;IAEV,UACE,kBACA,QAAQ,QACR,UAAU,yBACP;IACL,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,KAAK,cAAc;IAC5B;;OAGU;IACV;IACA;IACA;IACA;IACA,SAAS;IACT,qCAAqC,mBAAmB;IACxD;MAAoB;MAAa;MAAY,KAAK;;IAClD;;OAGU;IACV,yBAAyB;IACzB,yBAAyB,kBAAkB;;OAGjC,kBAAkB;IAC5B,WAAW,kBAAkB;IAC7B,cAAc,kBAAkB;;IAEhC,aAAa;MACX,SAAS;UACL,QAAQ,QAAQ;;IAEtB;IACA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;OAGU,MAAM,cAAc"}
@@ -1,4 +1,4 @@
1
- import { WS_SUBPROTOCOL } from "./wire/version.js";
2
1
  import { StatewireSocketHost } from "./host/socket.js";
3
2
  import { clientIdFromUrl, textFrameOrClose } from "./host/adapter.js";
3
+ import { WS_SUBPROTOCOL } from "./wire/version.js";
4
4
  export { StatewireSocketHost, WS_SUBPROTOCOL, clientIdFromUrl, textFrameOrClose };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { StatewireSSE } from "./transports/sse.js";
1
+ import { StatewireDocuments } from "./wire/documents.js";
2
+ import { StatewireProtocol } from "./wire/protocol.js";
3
+ import { StatewireHttp } from "./transports/sse.js";
2
4
  import { StatewireClient, StatewireResource, useStatewire } from "./statewire.js";
3
5
  import { Statewire, StatewireSendError } from "./types.js";
4
- import { StatewireWS } from "./transports/ws.js";
5
- export { type Statewire, StatewireClient, StatewireResource, StatewireSSE, StatewireSendError, StatewireWS, useStatewire };
6
+ import { StatewireWebsocket } from "./transports/ws.js";
7
+ export { type Statewire, StatewireClient, type StatewireDocuments, StatewireHttp, type StatewireProtocol, StatewireResource, StatewireSendError, StatewireWebsocket, useStatewire };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { StatewireSendError } from "./types.js";
2
2
  import { StatewireClient, StatewireResource, useStatewire } from "./statewire.js";
3
- import { StatewireSSE } from "./transports/sse.js";
4
- import { StatewireWS } from "./transports/ws.js";
5
- export { StatewireClient, StatewireResource, StatewireSSE, StatewireSendError, StatewireWS, useStatewire };
3
+ import { StatewireHttp } from "./transports/sse.js";
4
+ import { StatewireWebsocket } from "./transports/ws.js";
5
+ export { StatewireClient, StatewireHttp, StatewireResource, StatewireSendError, StatewireWebsocket, useStatewire };
@@ -1,3 +1,5 @@
1
+ import { StatewireDocuments } from "./wire/documents.js";
2
+ import { StatewireProtocol } from "./wire/protocol.js";
1
3
  import { StatewireHost } from "./host.js";
2
4
  import { TERMINAL } from "./client/connection.js";
3
5
  import { Statewire } from "./types.js";
@@ -12,6 +14,10 @@ declare class StatewireClient<TState, TCommands extends Statewire.Commands = Sta
12
14
  get state(): TState;
13
15
  get connection(): StatewireClient.Connection;
14
16
  get commands(): Statewire.CommandsProxy<TCommands>;
17
+ get documents(): StatewireDocuments.Source | undefined;
18
+ get selection(): StatewireProtocol.Selection | undefined;
19
+ invoke(protocol: string, method: string, params: readonly unknown[]): Promise<unknown>;
20
+ updateContext(ops: readonly unknown[]): void;
15
21
  get isBusy(): boolean;
16
22
  setContext(value: Record<string, unknown>): void;
17
23
  get failed(): readonly StatewireClient.FailedCommand[];
@@ -22,10 +28,15 @@ declare class StatewireClient<TState, TCommands extends Statewire.Commands = Sta
22
28
  }
23
29
  declare namespace StatewireClient {
24
30
  type Options<TState, TCommands extends Statewire.Commands = Statewire.Commands> = {
31
+ protocol?: string;
32
+ keyPrefixes?: Readonly<Record<string, readonly string[]>>;
33
+ wireVersion?: StatewireProtocol.Range;
34
+ applicationProtocols?: readonly StatewireProtocol.Offer[] | "*";
25
35
  transport: ResourceElement<Statewire<TState, TCommands>>;
26
36
  /** Durable session: the mounted storage holds this client's lane identity and its un-durable commands, which resend on the next attach. */
27
37
  storage?: {
28
38
  session?: ResourceElement<SessionStorage> | undefined;
39
+ documents?: ResourceElement<StatewireDocuments.Storage> | undefined;
29
40
  } | undefined;
30
41
  /** Served as the canonical state until the attach snapshot; own commands fold over it. */
31
42
  initialState?: TState;
@@ -45,6 +56,10 @@ declare namespace StatewireClient {
45
56
  type Helpers<TState, TCommands extends Statewire.Commands = Statewire.Commands> = {
46
57
  /** The statewire's state type — remote statewires include `undefined` until the first attach snapshot applies. */
47
58
  state: TState;
59
+ documents: StatewireDocuments.Source | undefined;
60
+ selection: StatewireProtocol.Selection | undefined;
61
+ invoke: (protocol: string, method: string, params: readonly unknown[]) => Promise<unknown>;
62
+ updateContext: (ops: readonly unknown[]) => void;
48
63
  /** Identity-stable across renders; reads the current canonical state without subscribing the caller. */
49
64
  getState: () => TState;
50
65
  connection: Connection;
@@ -147,6 +162,8 @@ declare namespace StatewireClient {
147
162
  }>) => "requeue" | "drop";
148
163
  /** A non-accepted send retained for the user: the wire statement, its failure, and its original clocks. */
149
164
  type FailedCommand = {
165
+ readonly protocol: string;
166
+ readonly produced?: SessionCommand["produced"];
150
167
  readonly command: string;
151
168
  readonly params: readonly unknown[];
152
169
  readonly meta?: unknown;
@@ -157,6 +174,11 @@ declare namespace StatewireClient {
157
174
  /** A command as persisted while un-durable: its lane seq plus the wire statement. */
158
175
  type SessionCommand = {
159
176
  seq: number;
177
+ protocol: string;
178
+ produced?: {
179
+ wire: StatewireProtocol.Range;
180
+ protocols: readonly StatewireProtocol.Offer[] | "*";
181
+ };
160
182
  method: string;
161
183
  params: unknown[];
162
184
  meta?: unknown;
@@ -166,6 +188,13 @@ declare namespace StatewireClient {
166
188
  clientId: string;
167
189
  nextSeq: number;
168
190
  ctxNextSeq: number;
191
+ context?: {
192
+ ops: unknown[];
193
+ pending: {
194
+ seq: number;
195
+ ops: unknown[];
196
+ }[];
197
+ };
169
198
  commands: readonly SessionCommand[];
170
199
  /** Terminal verdicts parked for the sharer that minted the seq (shared storage only). */
171
200
  verdicts?: readonly SessionVerdict[];
@@ -185,6 +214,8 @@ declare namespace StatewireClient {
185
214
  type SessionStorage = {
186
215
  load: () => SessionRecord | null;
187
216
  save: (record: SessionRecord) => void;
217
+ /** Upgrade incompatible stored commands; null discards the old record and starts a new client identity. */
218
+ migrate?: (record: SessionRecord, current: NonNullable<SessionCommand["produced"]>) => SessionRecord | null;
188
219
  /** Serializes record mutations across sharers; presence marks the storage shared. */
189
220
  lock?: <T>(fn: () => T | Promise<T>) => Promise<T>;
190
221
  /** Notifies of record saves by other sharers; returns unsubscribe. Required alongside `lock`. */
@@ -197,7 +228,7 @@ declare namespace StatewireClient {
197
228
  type HeadersOption = HeadersInit | ((ctx: {
198
229
  staleAuth: boolean;
199
230
  }) => HeadersInit | Promise<HeadersInit>);
200
- type SSEOptions = {
231
+ type HttpOptions = StatewireProtocol.Options & {
201
232
  sessionStore?: SessionStorage | undefined;
202
233
  url: string;
203
234
  /** The session does not exist on the server yet: the first attach waits for the first command send (or an explicit `reconnect()`). */
@@ -210,7 +241,7 @@ declare namespace StatewireClient {
210
241
  /** The broadcast idle flag's rising edge: the instance went quiet. */
211
242
  onDone?: () => void;
212
243
  };
213
- type WSOptions = {
244
+ type WebsocketOptions = StatewireProtocol.Options & {
214
245
  sessionStore?: SessionStorage | undefined;
215
246
  url: string;
216
247
  /** The session does not exist on the server yet: the first attach waits for the first command send (or an explicit `reconnect()`). */
@@ -1 +1 @@
1
- {"version":3,"file":"statewire.d.ts","names":[],"sources":["../src/statewire.ts"],"mappings":";;;;;cAiCa,eACX,QACA,kBAAkB,UAAU,WAAW,UAAU,UAEjD,SAAS,gBAAgB,QAAQ,QAAQ,eACxC,gBAAgB,QAAQ,QAAQ;cA6DtB,oBACX,QACA,kBAAkB,UAAU,WAAW,UAAU,UAEjD,SAAS,gBAAgB,QAAQ,QAAQ,eACxC,gBAAgB,gBAAgB,QAAQ,QAAQ;cAGtC,gBACX,QACA,kBAAkB,UAAU,WAAW,UAAU;mBAEhC;UACT;EAEI,YAAA,SAAS,gBAAgB,QAAQ,QAAQ;MAKjD,SAAS;MAIT,cAAc,gBAAgB;MAI9B,YAAY,UAAU,cAAc;MAIpC;EAIJ,WAAW,OAAO;MAId,mBAAmB,gBAAgB;EAIvC,YAAY,OAAO,gBAAgB,gBAAgB;EAInD,cAAc,OAAO,gBAAgB;EAIrC,UAAU;EAIV;;kBAOe;OACH,QACV,QACA,kBAAkB,UAAU,WAAW,UAAU;IAEjD,WAAW,gBAAgB,UAAU,QAAQ;;IAE7C;MACM,UAAU,gBAAgB;;;IAGhC,eAAe;IACf,aAAa,WAAW,YAAY,SAAS;IAC7C,cAAc,YAAY,YAAY;IACtC,iBACE,OAAO,YAAY,SACnB;MAAO,SAAS,UAAU;;IAE5B,mBACE,QAAQ,UAAU,cAAc,YAChC;MAAO,OAAO,YAAY;;IAE5B,sBAAsB,YAAY;IAClC,WAAW,OAAO;;IAElB,kBACE,OAAO,YAAY,SACnB,OAAO;;OAIC,QACV,QACA,kBAAkB,UAAU,WAAW,UAAU;;IAGjD,OAAO;;IAEP,gBAAgB;IAChB,YAAY;IACZ,UAAU,UAAU,cAAc;;IAElC;;IAEA,aAAa,OAAO;;IAEpB,iBAAiB;;IAEjB,cAAc,OAAO,kBAAkB;;IAEvC,gBAAgB,OAAO;;;OAIb;IAEN;IACA;IAOA;IACA;;IAGA;;IAEA;IACA;IACA;IACA;IACA;IACA;;IAEA;;OACM,aAAa;IACvB,QAAQ;IACR;;IAEA;;OAEU,mBAAmB;;;;;OAMnB,WACV,QACA,kBAAkB,UAAU,WAAW,UAAU,aAEjD,OAAO,QACP,SAAS,UAAU,QAAQ,YAC3B,KAAK;OAGK;IACV;IACA;IACA;;;;;;;OAQU,YAAY,WAAW,OAAO;;;;;;;;;;;;;OAc9B;IAEN;IACA;IACA;IACA;IACA;;IAEA;IAAgB;IAAiB;;IACjC;IAAiB;;IACjB;IAAiB;;IAEjB;IACA;IACA;;IAGA;IACA;;;OAIM,iBACV,SAAS;IACP;IACA;IACA;IACA;IACA;;;OAKQ;aACD;aACA;aACA;aACA,SAAS;aACT;aACA;;;OAIC;IACV;IACA;IACA;IACA;;;OAIU;IACV;IACA;IACA;IACA,mBAAmB;;IAEnB,oBAAoB;;IAEpB,kBAAkB;;;OAIR;IACV;IACA,cAAc;IACd;IACA;IACA;IACA;;;OAIU;IACV,YAAY;IACZ,OAAO,QAAQ;;IAEf,QAAQ,GAAG,UAAU,IAAI,QAAQ,OAAO,QAAQ;;IAEhD,aAAa;;;OAIH,kBAAkB;IAAU,KAAK,cAAc;;OAE/C,gBACR,gBACE;IAAO;QAAyB,cAAc,QAAQ;OAEhD;IACV,eAAe;IACf;;IAEA;IACA,UAAU;IACV,eAAe,WAAW;IAC1B,gBAAgB;IAChB,YAAY,YAAY;IACxB,WAAW,OAAO;;IAElB;;OAGU;IACV,eAAe;IACf;;IAEA;IACA,UAAU;IACV;IACA,QACI,gCACO,yBAAyB,QAAQ;IAC5C,iBAAiB,aAAa,kCAAkC;IAChE,gBAAgB;IAChB,YAAY,YAAY;IACxB,WAAW,OAAO;;IAElB"}
1
+ {"version":3,"file":"statewire.d.ts","names":[],"sources":["../src/statewire.ts"],"mappings":"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"}