statewire 0.20.0 → 0.22.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 (143) hide show
  1. package/dist/client/changes.d.ts +3 -6
  2. package/dist/client/changes.d.ts.map +1 -1
  3. package/dist/client/changes.js +1 -2
  4. package/dist/client/connection.d.ts +80 -83
  5. package/dist/client/connection.d.ts.map +1 -1
  6. package/dist/client/connection.js +20 -7
  7. package/dist/client/connection.js.map +1 -1
  8. package/dist/client/core.d.ts +39 -41
  9. package/dist/client/core.d.ts.map +1 -1
  10. package/dist/client/core.js +2 -3
  11. package/dist/client/session.d.ts +93 -93
  12. package/dist/client/session.d.ts.map +1 -1
  13. package/dist/client/session.js +47 -23
  14. package/dist/client/session.js.map +1 -1
  15. package/dist/client/sessionStore.d.ts +11 -14
  16. package/dist/client/sessionStore.d.ts.map +1 -1
  17. package/dist/client/sessionStore.js +1 -2
  18. package/dist/client/storageError.d.ts +2 -5
  19. package/dist/client/storageError.d.ts.map +1 -1
  20. package/dist/client/storageError.js +1 -2
  21. package/dist/client/timing.d.ts +11 -14
  22. package/dist/client/timing.d.ts.map +1 -1
  23. package/dist/client/timing.js +1 -2
  24. package/dist/document.d.ts +17 -20
  25. package/dist/document.d.ts.map +1 -1
  26. package/dist/document.js +1 -2
  27. package/dist/host/adapter.d.ts +4 -7
  28. package/dist/host/adapter.d.ts.map +1 -1
  29. package/dist/host/adapter.js +1 -2
  30. package/dist/host/draft.d.ts +13 -16
  31. package/dist/host/draft.d.ts.map +1 -1
  32. package/dist/host/draft.js +1 -2
  33. package/dist/host/engine.d.ts +7 -10
  34. package/dist/host/engine.d.ts.map +1 -1
  35. package/dist/host/engine.js +1 -2
  36. package/dist/host/host.d.ts +42 -45
  37. package/dist/host/host.d.ts.map +1 -1
  38. package/dist/host/host.js +15 -13
  39. package/dist/host/host.js.map +1 -1
  40. package/dist/host/http.d.ts +4 -7
  41. package/dist/host/http.d.ts.map +1 -1
  42. package/dist/host/http.js +15 -11
  43. package/dist/host/http.js.map +1 -1
  44. package/dist/host/socket.d.ts +145 -140
  45. package/dist/host/socket.d.ts.map +1 -1
  46. package/dist/host/socket.js +99 -17
  47. package/dist/host/socket.js.map +1 -1
  48. package/dist/host/synced.d.ts +3 -6
  49. package/dist/host/synced.d.ts.map +1 -1
  50. package/dist/host/synced.js +1 -2
  51. package/dist/host/work.d.ts +2 -5
  52. package/dist/host/work.d.ts.map +1 -1
  53. package/dist/host/work.js +1 -2
  54. package/dist/host-internal.d.ts +99 -90
  55. package/dist/host-internal.d.ts.map +1 -1
  56. package/dist/host.d.ts +90 -91
  57. package/dist/host.d.ts.map +1 -1
  58. package/dist/index.d.ts +11 -8
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +1 -1
  61. package/dist/statewire.d.ts +265 -268
  62. package/dist/statewire.d.ts.map +1 -1
  63. package/dist/statewire.js +7 -7
  64. package/dist/statewire.js.map +1 -1
  65. package/dist/storage.d.ts +23 -26
  66. package/dist/storage.d.ts.map +1 -1
  67. package/dist/storage.js +1 -2
  68. package/dist/transports/fake-sse.d.ts +7 -10
  69. package/dist/transports/fake-sse.d.ts.map +1 -1
  70. package/dist/transports/fake-sse.js +1 -2
  71. package/dist/transports/fixtures.d.ts +19 -25
  72. package/dist/transports/fixtures.d.ts.map +1 -1
  73. package/dist/transports/fixtures.js +1 -2
  74. package/dist/transports/remote.d.ts +8 -11
  75. package/dist/transports/remote.d.ts.map +1 -1
  76. package/dist/transports/remote.js +1 -2
  77. package/dist/transports/sse-parser.d.ts +1 -4
  78. package/dist/transports/sse-parser.d.ts.map +1 -1
  79. package/dist/transports/sse-parser.js +1 -2
  80. package/dist/transports/sse.d.ts +50 -52
  81. package/dist/transports/sse.d.ts.map +1 -1
  82. package/dist/transports/sse.js +9 -3
  83. package/dist/transports/sse.js.map +1 -1
  84. package/dist/transports/testing.d.ts +31 -34
  85. package/dist/transports/testing.d.ts.map +1 -1
  86. package/dist/transports/testing.js +1 -2
  87. package/dist/transports/ws.d.ts +5 -7
  88. package/dist/transports/ws.d.ts.map +1 -1
  89. package/dist/transports/ws.js +3 -4
  90. package/dist/transports/ws.js.map +1 -1
  91. package/dist/types.d.ts +81 -78
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/types.js +1 -2
  94. package/dist/util/draftTraps.d.ts +2 -4
  95. package/dist/util/draftTraps.d.ts.map +1 -1
  96. package/dist/util/draftTraps.js +1 -2
  97. package/dist/util/macrotask.d.ts +1 -4
  98. package/dist/util/macrotask.d.ts.map +1 -1
  99. package/dist/util/macrotask.js +1 -2
  100. package/dist/util/methodProxy.d.ts +1 -4
  101. package/dist/util/methodProxy.d.ts.map +1 -1
  102. package/dist/util/methodProxy.js +1 -2
  103. package/dist/util/randomId.d.ts +1 -4
  104. package/dist/util/randomId.d.ts.map +1 -1
  105. package/dist/util/randomId.js +1 -2
  106. package/dist/util/recordMutations.d.ts +5 -7
  107. package/dist/util/recordMutations.d.ts.map +1 -1
  108. package/dist/util/recordMutations.js +1 -2
  109. package/dist/util/statePath.d.ts +9 -12
  110. package/dist/util/statePath.d.ts.map +1 -1
  111. package/dist/util/statePath.js +1 -2
  112. package/dist/wire/context.d.ts +7 -12
  113. package/dist/wire/context.d.ts.map +1 -1
  114. package/dist/wire/context.js +2 -3
  115. package/dist/wire/documents.d.ts +36 -39
  116. package/dist/wire/documents.d.ts.map +1 -1
  117. package/dist/wire/documents.js +2 -3
  118. package/dist/wire/documents.js.map +1 -1
  119. package/dist/wire/limits.d.ts +7 -10
  120. package/dist/wire/limits.d.ts.map +1 -1
  121. package/dist/wire/limits.js +1 -2
  122. package/dist/wire/meta.d.ts +9 -11
  123. package/dist/wire/meta.d.ts.map +1 -1
  124. package/dist/wire/meta.js +1 -2
  125. package/dist/wire/meta.js.map +1 -1
  126. package/dist/wire/ops.d.ts +9 -12
  127. package/dist/wire/ops.d.ts.map +1 -1
  128. package/dist/wire/ops.js +1 -2
  129. package/dist/wire/protocol.d.ts +53 -56
  130. package/dist/wire/protocol.d.ts.map +1 -1
  131. package/dist/wire/protocol.js +1 -2
  132. package/dist/wire/version.d.ts +1 -4
  133. package/dist/wire/version.d.ts.map +1 -1
  134. package/dist/wire/version.js +1 -2
  135. package/package.json +6 -6
  136. package/src/client/connection.ts +25 -15
  137. package/src/client/session.ts +54 -15
  138. package/src/host/host.ts +9 -3
  139. package/src/host/http.ts +37 -5
  140. package/src/host/socket.ts +158 -9
  141. package/src/host-internal.ts +14 -0
  142. package/src/statewire.ts +11 -6
  143. package/src/transports/sse.ts +12 -0
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","names":["contextValue","captureContext","MAX_CONTEXT_BYTES","encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","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","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","contexts","Context","documents","Document","included","Set","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","ctx","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","hasOwn","prev","statement","Number","isInteger","last","get","undefined","set","push","NonNullable","seen","entry","some","includes","has","add","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","String","parseInitialFrame","headers","Response","status","values","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","close","detached","size","clearInterval","sendTo","data","now","send","violate","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","diffView","ops","number","attachOf","requireSelected","find","caller","callerOf","context","document","snapshot","mount","encoded","other","unmount","include","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","map","fromEntries","admittedThrough","retain","newest","Math","max","min","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","validateContexts","selected","through","first","s","validateContext","installContexts","contextChanged","admitFrame","fresh","durableNew","clientLoad","hostLoad","isSafeInteger","TypeError","findLast","dur","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { contextValue, captureContext } from \"../wire/context\";\nimport { MAX_CONTEXT_BYTES } from \"../wire/limits\";\nimport { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, 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 { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_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 { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\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 Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: 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 lanes: Map<string, Lane>;\n contexts: Map<string, Statewire.Context>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\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 CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n cmd: CmdStatement[];\n ctx?: { protocol: string; value: Statewire.Context }[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\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 !== \"cmd\" && key !== \"ctx\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"] ?? [];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (Object.hasOwn(frame, \"cmd\") && lane.length === 0)\n return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n const contexts = frame[\"ctx\"];\n const ctx: NonNullable<ParsedFrame[\"ctx\"]> = [];\n if (contexts !== undefined) {\n if (!Array.isArray(contexts) || contexts.length === 0)\n return violation(\"empty context lane\");\n const seen = new Set<string>();\n for (const entry of contexts) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n !Object.hasOwn(entry, \"value\") ||\n Object.keys(entry).some(\n (key) => ![\"protocol\", \"value\", \"meta\"].includes(key),\n )\n )\n return violation(\"malformed context\");\n const protocol = entry[\"protocol\"];\n if (seen.has(protocol)) return violation(\"duplicate context protocol\");\n seen.add(protocol);\n if (\n frameEncoder.encode(JSON.stringify(entry)).byteLength >\n MAX_CONTEXT_BYTES\n )\n return violation(\"context entry too large\");\n try {\n ctx.push({\n protocol,\n value: contextValue({\n value: entry[\"value\"],\n ...(entry[\"meta\"] !== undefined && { meta: entry[\"meta\"] }),\n }),\n });\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n }\n if (cmd.length === 0 && ctx.length === 0) return violation(\"empty frame\");\n return { cmd, ...(ctx.length > 0 && { ctx }) };\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?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, 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 { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n ...at,\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 ? parseFrameValue(lanes) : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n key: readonly string[] | undefined;\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, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\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 markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\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 } = encodeDocument(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?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\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 h.current?.detached?.(conn.attach);\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\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\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 durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n get caller() {\n return callerOf(h, h.clients.get(conn.clientId)!, conn);\n },\n context: (protocol) => {\n requireSelected(protocol);\n return captureContext(conn.contexts.get(protocol) ?? {});\n },\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n conn.included.add(documentIdentity(protocol, key));\n markViews(h);\n },\n exclude: (protocol, key) => {\n conn.included.delete(documentIdentity(protocol, key));\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\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 !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = 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 // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const cmd = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(cmd.length > 0 && { cmd }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (cmd.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd }));\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, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\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, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\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 lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, 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 lane,\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, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n context: captureContext(conn.contexts.get(statement.protocol) ?? {}),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nconst validateContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const statement of frame.cmd) {\n if (!selects(conn, statement.protocol))\n return violation(\"unsupported protocol\");\n const selected = conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!;\n if (selected.record === \"ephemeral\") {\n const through = watermark(h, conn, statement.protocol);\n const first = frame.cmd.find(\n (s) => s.protocol === statement.protocol && s.seq > through,\n );\n if (first && first.seq !== through + 1)\n return violation(\"ephemeral lane gap\");\n }\n }\n for (const entry of frame.ctx ?? []) {\n if (!selects(conn, entry.protocol))\n return violation(\"unsupported context protocol\");\n try {\n h.current?.validateContext?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n};\n\nconst installContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const entry of frame.ctx ?? [])\n conn.contexts.set(entry.protocol, captureContext(entry.value));\n for (const entry of frame.ctx ?? [])\n h.current?.contextChanged?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n};\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && 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 refusal(h, conn, retry);\n }\n }\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.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 if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0 && !frame.ctx?.length) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, 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 let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\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 (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n 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 conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\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 frame: ParsedFrame = { cmd: [] },\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 touched: Date.now(),\n lanes: 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 ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n lanes: new Map(),\n contexts: new Map(),\n documents: new Map(),\n included: new Set(),\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n try {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n const reason = violationReason(error);\n if (reason !== null) violate(h, conn, reason);\n else closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { 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 h.stateHost?.setOnDocuments(() => markViews(h));\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 h.stateHost?.setOnDocuments(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 id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\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 key: undefined,\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 viewsDirty: false,\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.key = options?.key;\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 * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on 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
+ {"version":3,"file":"socket.js","names":["contextValue","captureContext","MAX_CONTEXT_BYTES","encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","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","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","authorizedAt","leaseTimer","ReturnType","setTimeout","contexts","Context","documents","Document","included","Set","onIncludedChange","IncludedDocument","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","ctx","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","hasOwn","prev","statement","Number","isInteger","last","get","undefined","set","push","NonNullable","seen","entry","some","includes","has","add","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","console","parseInitialFrame","headers","Response","status","values","SocketHostState","Definition","wireVersion","Range","heartbeatMs","maxLeaseLifetimeMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","clearTimeout","close","detached","size","clearInterval","sendTo","data","now","send","expiredAt","isFinite","leaseExpiredFin","expireLease","armLeaseTimer","delay","Math","min","unref","violate","atSubscriberLimit","ensureHeartbeat","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","diffView","ops","number","notifyIncluded","map","restoredIncluded","part","TypeError","attachOf","requireSelected","find","caller","callerOf","context","document","snapshot","mount","encoded","other","unmount","include","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","fromEntries","admittedThrough","retain","newest","max","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","validateContexts","selected","through","first","s","validateContext","installContexts","contextChanged","admitFrame","fresh","durableNew","clientLoad","hostLoad","isSafeInteger","findLast","dur","admission","closePending","pending","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","Pick","restored","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","reviveValue","serveStream","serveFrames"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { contextValue, captureContext } from \"../wire/context\";\nimport { MAX_CONTEXT_BYTES } from \"../wire/limits\";\nimport { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, 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 { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_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 { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\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 Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: 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 authorizedAt: number | undefined;\n leaseTimer: ReturnType<typeof setTimeout> | null;\n lanes: Map<string, Lane>;\n contexts: Map<string, Statewire.Context>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n onIncludedChange:\n | ((included: readonly StatewireHostInternal.IncludedDocument[]) => void)\n | undefined;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\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 CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n cmd: CmdStatement[];\n ctx?: { protocol: string; value: Statewire.Context }[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\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 !== \"cmd\" && key !== \"ctx\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"] ?? [];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (Object.hasOwn(frame, \"cmd\") && lane.length === 0)\n return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n const contexts = frame[\"ctx\"];\n const ctx: NonNullable<ParsedFrame[\"ctx\"]> = [];\n if (contexts !== undefined) {\n if (!Array.isArray(contexts) || contexts.length === 0)\n return violation(\"empty context lane\");\n const seen = new Set<string>();\n for (const entry of contexts) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n !Object.hasOwn(entry, \"value\") ||\n Object.keys(entry).some(\n (key) => ![\"protocol\", \"value\", \"meta\"].includes(key),\n )\n )\n return violation(\"malformed context\");\n const protocol = entry[\"protocol\"];\n if (seen.has(protocol)) return violation(\"duplicate context protocol\");\n seen.add(protocol);\n if (\n frameEncoder.encode(JSON.stringify(entry)).byteLength >\n MAX_CONTEXT_BYTES\n )\n return violation(\"context entry too large\");\n try {\n ctx.push({\n protocol,\n value: contextValue({\n value: entry[\"value\"],\n ...(entry[\"meta\"] !== undefined && { meta: entry[\"meta\"] }),\n }),\n });\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n }\n if (cmd.length === 0 && ctx.length === 0) return violation(\"empty frame\");\n return { cmd, ...(ctx.length > 0 && { ctx }) };\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?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, 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 { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n console.error(\"statewire command failed\", outcome.error);\n return {\n ...at,\n type: \"failed\",\n message: \"the command failed\",\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 ? parseFrameValue(lanes) : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n key: readonly string[] | undefined;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n maxLeaseLifetimeMs: number | null;\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, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\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 markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\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 } = encodeDocument(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?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\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 if (conn.leaseTimer !== null) {\n clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\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\nconst expiredAt = (h: SocketHostState, authorizedAt: number | undefined) => {\n const now = Date.now();\n return (\n authorizedAt === undefined ||\n !Number.isFinite(authorizedAt) ||\n authorizedAt < 0 ||\n authorizedAt > now ||\n (h.maxLeaseLifetimeMs !== null &&\n now - authorizedAt >= h.maxLeaseLifetimeMs)\n );\n};\n\nconst leaseExpiredFin = JSON.stringify({\n fin: { reason: \"reconnect\", code: \"lease-expired\" },\n});\n\nexport const expireLease = (h: SocketHostState, conn: Conn): boolean => {\n if (!conn.open || expiredAt(h, conn.authorizedAt)) {\n if (conn.open) {\n sendTo(h, conn, leaseExpiredFin);\n closeConn(h, conn, 1000, \"lease-expired\");\n }\n return true;\n }\n return false;\n};\n\nconst armLeaseTimer = (h: SocketHostState, conn: Conn) => {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n if (h.disposed || h.maxLeaseLifetimeMs === null || expireLease(h, conn))\n return;\n const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);\n conn.leaseTimer = setTimeout(\n () => {\n conn.leaseTimer = null;\n if (!expireLease(h, conn)) armLeaseTimer(h, conn);\n },\n Math.min(delay, 2_147_483_647),\n );\n (conn.leaseTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\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 durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst notifyIncluded = (conn: Conn) =>\n conn.onIncludedChange?.(\n [...conn.included].map(\n (id) => JSON.parse(id) as StatewireHostInternal.IncludedDocument,\n ),\n );\n\nconst restoredIncluded = (\n included: readonly StatewireHostInternal.IncludedDocument[],\n): Set<string> =>\n new Set(\n included.map((entry) => {\n if (\n !Array.isArray(entry) ||\n entry.length !== 2 ||\n typeof entry[0] !== \"string\" ||\n !(\n entry[1] === null ||\n (Array.isArray(entry[1]) &&\n entry[1].every((part) => typeof part === \"string\"))\n )\n )\n throw new TypeError(\"statewire: invalid restored include\");\n return documentIdentity(entry[0], entry[1] ?? undefined);\n }),\n );\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n get caller() {\n return callerOf(h, h.clients.get(conn.clientId)!, conn);\n },\n context: (protocol) => {\n requireSelected(protocol);\n return captureContext(conn.contexts.get(protocol) ?? {});\n },\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n const id = documentIdentity(protocol, key);\n if (conn.included.has(id)) return;\n conn.included.add(id);\n notifyIncluded(conn);\n markViews(h);\n },\n exclude: (protocol, key) => {\n if (!conn.included.delete(documentIdentity(protocol, key))) return;\n notifyIncluded(conn);\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\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 !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = 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 // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const cmd = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(cmd.length > 0 && { cmd }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (cmd.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd }));\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, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\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, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\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 lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, 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 lane,\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, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n context: captureContext(conn.contexts.get(statement.protocol) ?? {}),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | { type: \"expired\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nconst validateContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const statement of frame.cmd) {\n if (!selects(conn, statement.protocol))\n return violation(\"unsupported protocol\");\n const selected = conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!;\n if (selected.record === \"ephemeral\") {\n const through = watermark(h, conn, statement.protocol);\n const first = frame.cmd.find(\n (s) => s.protocol === statement.protocol && s.seq > through,\n );\n if (first && first.seq !== through + 1)\n return violation(\"ephemeral lane gap\");\n }\n }\n for (const entry of frame.ctx ?? []) {\n if (!selects(conn, entry.protocol))\n return violation(\"unsupported context protocol\");\n try {\n h.current?.validateContext?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n};\n\nconst installContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const entry of frame.ctx ?? [])\n conn.contexts.set(entry.protocol, captureContext(entry.value));\n for (const entry of frame.ctx ?? [])\n h.current?.contextChanged?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n};\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n if (expireLease(h, conn)) return { type: \"expired\" };\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && 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 refusal(h, conn, retry);\n }\n }\n if (expireLease(h, conn)) return { type: \"expired\" };\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.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 || expireLease(h, conn))\n 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 if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0 && !frame.ctx?.length) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, 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 if (expiredAt(h, options.authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1000, \"lease-expired\");\n } catch {\n /* peer already gone */\n }\n return null;\n }\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n undefined,\n options.authorizedAt,\n options,\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 authorizedAt = Date.now();\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, authorizedAt);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n authorizedAt,\n options.onIncludedChange === undefined\n ? {}\n : { onIncludedChange: options.onIncludedChange },\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\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 (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n 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 conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\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 frame: ParsedFrame = { cmd: [] },\n authorizedAt?: number,\n included: Pick<\n StatewireHostInternal.SocketConnectOptions,\n \"included\" | \"onIncludedChange\"\n > = {},\n): Registration | null => {\n const restored = restoredIncluded(included.included ?? []);\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 if (expiredAt(h, authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"lease-expired\");\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 touched: Date.now(),\n lanes: 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 ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n authorizedAt,\n leaseTimer: null,\n lanes: new Map(),\n contexts: new Map(),\n documents: new Map(),\n included: restored,\n onIncludedChange: included.onIncludedChange,\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n try {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n const reason = violationReason(error);\n if (reason !== null) violate(h, conn, reason);\n else closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n armLeaseTimer(h, conn);\n if (!conn.open) return null;\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n if (expireLease(h, conn)) return null;\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { 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 h.stateHost?.setOnDocuments(() => markViews(h));\n for (const conn of h.conns) armLeaseTimer(h, conn);\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n for (const conn of h.conns) {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(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 id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\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 key: undefined,\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n maxLeaseLifetimeMs: 86_400_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 viewsDirty: false,\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.key = options?.key;\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n const maxLeaseLifetimeMs =\n options?.maxLeaseLifetimeMs === undefined\n ? 86_400_000\n : options.maxLeaseLifetimeMs;\n if (\n maxLeaseLifetimeMs !== null &&\n (!Number.isFinite(maxLeaseLifetimeMs) || maxLeaseLifetimeMs <= 0)\n ) {\n throw new TypeError(\n \"maxLeaseLifetimeMs must be finite and positive or null\",\n );\n }\n if (h.maxLeaseLifetimeMs !== maxLeaseLifetimeMs) {\n h.maxLeaseLifetimeMs = maxLeaseLifetimeMs;\n for (const conn of [...h.conns]) armLeaseTimer(h, conn);\n }\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 * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on 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,9 +1,6 @@
1
- import { StatewireHost } from "../host.js";
2
- //#region src/host/synced.d.ts
1
+ import type { StatewireHost } from "../host.js";
3
2
  /** `set`/`patch` handlers for an ephemeral subprotocol's main document; spread into `useStatewireCommands`. */
4
- declare const syncedDocument: (protocol: string) => {
5
- [x: string]: (this: StatewireHost.Ctx, value: unknown) => void;
3
+ export declare const syncedDocument: (protocol: string) => {
4
+ [x: string]: (this: StatewireHost.Ctx, value: unknown) => void;
6
5
  };
7
- //#endregion
8
- export { syncedDocument };
9
6
  //# sourceMappingURL=synced.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"synced.d.ts","names":[],"sources":["../../src/host/synced.ts"],"mappings":";;;cAqBa,iBAAkB;GACQ,aAAA,MAAA,cAAc,KAAG"}
1
+ {"version":3,"file":"synced.d.ts","sourceRoot":"","sources":["../../src/host/synced.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAgB;AAkB7C,+GAA+G;AAC/G,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM;wBACR,aAAa,CAAC,GAAG,SAAS,OAAO;CAqCtE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { StatewireReject } from "./engine.js";
2
2
  import { applyDocumentOps } from "../wire/documents.js";
3
- //#region src/host/synced.ts
3
+ // src/host/synced.ts
4
4
  const PATCH_OPS = /* @__PURE__ */ new Set([
5
5
  "add",
6
6
  "replace",
@@ -39,7 +39,6 @@ const syncedDocument = (protocol) => ({
39
39
  mount(this.attach, protocol, next);
40
40
  }
41
41
  });
42
- //#endregion
43
42
  export { syncedDocument };
44
43
 
45
44
  //# sourceMappingURL=synced.js.map
@@ -1,7 +1,4 @@
1
- import { StatewireHost } from "../host.js";
2
- //#region src/host/work.d.ts
1
+ import type { StatewireHost } from "../host.js";
3
2
  /** Track background tasks and scheduled callbacks in the host's idle status. */
4
- declare const useStatewireWork: () => StatewireHost.Work;
5
- //#endregion
6
- export { useStatewireWork };
3
+ export declare const useStatewireWork: () => StatewireHost.Work;
7
4
  //# sourceMappingURL=work.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"work.d.ts","names":[],"sources":["../../src/host/work.ts"],"mappings":";;;cAIa,wBAAuB,cAAc"}
1
+ {"version":3,"file":"work.d.ts","sourceRoot":"","sources":["../../src/host/work.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAgB;AAE7C,gFAAgF;AAChF,eAAO,MAAM,gBAAgB,QAAO,aAAa,CAAC,IA6CjD,CAAC"}
package/dist/host/work.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useState } from "@assistant-ui/tap/react-shim";
2
- //#region src/host/work.ts
2
+ // src/host/work.ts
3
3
  /** Track background tasks and scheduled callbacks in the host's idle status. */
4
4
  const useStatewireWork = () => {
5
5
  const [, notify] = useState(0);
@@ -47,7 +47,6 @@ const useStatewireWork = () => {
47
47
  }));
48
48
  return work;
49
49
  };
50
- //#endregion
51
50
  export { useStatewireWork };
52
51
 
53
52
  //# sourceMappingURL=work.js.map