statewire 0.19.3 → 0.20.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 (73) hide show
  1. package/README.md +15 -1
  2. package/dist/client/connection.d.ts.map +1 -1
  3. package/dist/client/connection.js +5 -4
  4. package/dist/client/connection.js.map +1 -1
  5. package/dist/client/session.d.ts +8 -1
  6. package/dist/client/session.d.ts.map +1 -1
  7. package/dist/client/session.js +52 -12
  8. package/dist/client/session.js.map +1 -1
  9. package/dist/client/sessionStore.d.ts +2 -0
  10. package/dist/client/sessionStore.d.ts.map +1 -1
  11. package/dist/client/sessionStore.js.map +1 -1
  12. package/dist/client/timing.d.ts +2 -0
  13. package/dist/client/timing.d.ts.map +1 -1
  14. package/dist/client/timing.js +5 -4
  15. package/dist/client/timing.js.map +1 -1
  16. package/dist/host/host.d.ts +2 -1
  17. package/dist/host/host.d.ts.map +1 -1
  18. package/dist/host/host.js +6 -1
  19. package/dist/host/host.js.map +1 -1
  20. package/dist/host/http.js +1 -1
  21. package/dist/host/socket.d.ts +6 -1
  22. package/dist/host/socket.d.ts.map +1 -1
  23. package/dist/host/socket.js +79 -9
  24. package/dist/host/socket.js.map +1 -1
  25. package/dist/host-internal.d.ts +1 -1
  26. package/dist/host.d.ts +6 -0
  27. package/dist/host.d.ts.map +1 -1
  28. package/dist/index.d.ts +1 -1
  29. package/dist/statewire.d.ts +3 -0
  30. package/dist/statewire.d.ts.map +1 -1
  31. package/dist/statewire.js +22 -5
  32. package/dist/statewire.js.map +1 -1
  33. package/dist/transports/remote.d.ts.map +1 -1
  34. package/dist/transports/remote.js +3 -2
  35. package/dist/transports/remote.js.map +1 -1
  36. package/dist/transports/sse.d.ts +4 -0
  37. package/dist/transports/sse.d.ts.map +1 -1
  38. package/dist/transports/sse.js +5 -0
  39. package/dist/transports/sse.js.map +1 -1
  40. package/dist/transports/testing.d.ts +2 -0
  41. package/dist/transports/testing.d.ts.map +1 -1
  42. package/dist/transports/testing.js +11 -4
  43. package/dist/transports/testing.js.map +1 -1
  44. package/dist/types.d.ts +4 -0
  45. package/dist/types.d.ts.map +1 -1
  46. package/dist/types.js.map +1 -1
  47. package/dist/wire/context.d.ts +14 -0
  48. package/dist/wire/context.d.ts.map +1 -0
  49. package/dist/wire/context.js +31 -0
  50. package/dist/wire/context.js.map +1 -0
  51. package/dist/wire/limits.d.ts +2 -1
  52. package/dist/wire/limits.d.ts.map +1 -1
  53. package/dist/wire/limits.js +2 -1
  54. package/dist/wire/limits.js.map +1 -1
  55. package/dist/wire/protocol.d.ts +1 -1
  56. package/dist/wire/protocol.js +4 -4
  57. package/dist/wire/protocol.js.map +1 -1
  58. package/package.json +1 -1
  59. package/src/client/connection.ts +6 -3
  60. package/src/client/session.ts +74 -4
  61. package/src/client/sessionStore.ts +5 -1
  62. package/src/client/timing.ts +12 -7
  63. package/src/host/host.ts +9 -0
  64. package/src/host/socket.ts +121 -7
  65. package/src/host.ts +5 -0
  66. package/src/statewire.ts +29 -3
  67. package/src/transports/remote.ts +3 -0
  68. package/src/transports/sse.ts +7 -0
  69. package/src/transports/testing.ts +14 -3
  70. package/src/types.ts +12 -0
  71. package/src/wire/context.ts +40 -0
  72. package/src/wire/limits.ts +2 -0
  73. package/src/wire/protocol.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","names":["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","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","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","prev","statement","Number","isInteger","last","get","undefined","set","push","parseFrame","raw","JSON","parse","frameIsOversized","encode","byteLength","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","String","parseInitialFrame","headers","Response","status","values","some","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","stringify","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","has","diffView","ops","entry","number","attachOf","requireSelected","find","document","snapshot","mount","encoded","other","unmount","include","add","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","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","admitFrame","s","through","fresh","durableNew","first","clientLoad","hostLoad","isSafeInteger","TypeError","findLast","dur","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","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 { 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 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 = { cmd: CmdStatement[] };\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\").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 (lane.length === 0) 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 return { cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: 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 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 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\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\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) 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 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 h.current?.attaching?.(conn.attach);\n } catch (error) {\n 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","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,8 +1,8 @@
1
1
  import { StatewireHost } from "./host.js";
2
2
  import { StatewireProtocol } from "./wire/protocol.js";
3
+ import { WS_SUBPROTOCOL } from "./wire/version.js";
3
4
  import { StatewireSocketHost } from "./host/socket.js";
4
5
  import { clientIdFromUrl, textFrameOrClose } from "./host/adapter.js";
5
- import { WS_SUBPROTOCOL } from "./wire/version.js";
6
6
  //#region src/host-internal.d.ts
7
7
  declare namespace StatewireHostInternal {
8
8
  type Socket = {
package/dist/host.d.ts CHANGED
@@ -43,8 +43,12 @@ declare namespace StatewireHost {
43
43
  * optimistic overlay — before the handler settles (idempotent, a no-op after
44
44
  * settle). The command settles when the handler's returned promise does.
45
45
  */
46
+ type CommandsOptions = {
47
+ context?: () => Statewire.Context;
48
+ };
46
49
  type Ctx = {
47
50
  readonly caller: Caller;
51
+ readonly context: Statewire.Context;
48
52
  readonly attach: Attach;
49
53
  readonly signal: AbortSignal;
50
54
  readonly applied: () => void;
@@ -64,6 +68,8 @@ declare namespace StatewireHost {
64
68
  };
65
69
  /** The admitting attach's view: its ephemeral documents plus the shared documents included for it. */
66
70
  type Attach = {
71
+ readonly caller: Caller;
72
+ context: (protocol: string) => Statewire.Context;
67
73
  document: (protocol: string, key?: readonly string[]) => unknown;
68
74
  /** `protocol` must be ephemeral; the encoded value is bounded by `MAX_EPHEMERAL_DOCUMENT_BYTES`. */
69
75
  mount: (protocol: string, value: unknown, key?: readonly string[], main?: boolean) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","names":[],"sources":["../src/host.ts"],"mappings":";;;;;;;kBAYiB;OACH;aACD;IACT,QAAQ,GAAG,MAAM,QAAQ,OAAO,QAAQ;IACxC,WAAW;;OAGD,SAAS;;IAEnB,QAAQ,cAAc,UAAU;;IAEhC,gBAAgB;;OAGN;IACV;IACA;IACA;IACA;;OAGU,YAAY,UAAU;;IAEhC,UAAU,YAAY,IAAI,UAAU;;IAEpC,QACE,kBACA,gBACA;MAAY;MAAyB;;IAEvC,UAAU,kBAAkB;IAC5B,iBAAiB,oBAAoB;IACrC,iBAAiB;;;;;;;;;;OAWP;aACD,QAAQ;aACR,QAAQ;aACR,QAAQ;aACR;;;;;;;;;;OAWC;aACD;aACA;aACA;;;OAIC;IACV,WAAW,kBAAkB;;IAE7B,QACE,kBACA,gBACA,yBACA;IAEF,UAAU,kBAAkB;IAC5B,UAAU,kBAAkB;IAC5B,UAAU,kBAAkB;;OAGlB,gBAAgB,kBAAkB,UAAU,eACrD,WAAW,gBACP,MAAM,WAAW,UAAU,QAC3B,QAAQ,WAAW,UAAU;OAGxB;IACV;IASA;IACA;IACA;IACA;IACA;IACA"}
1
+ {"version":3,"file":"host.d.ts","names":[],"sources":["../src/host.ts"],"mappings":";;;;;;;kBAYiB;OACH;aACD;IACT,QAAQ,GAAG,MAAM,QAAQ,OAAO,QAAQ;IACxC,WAAW;;OAGD,SAAS;;IAEnB,QAAQ,cAAc,UAAU;;IAEhC,gBAAgB;;OAGN;IACV;IACA;IACA;IACA;;OAGU,YAAY,UAAU;;IAEhC,UAAU,YAAY,IAAI,UAAU;;IAEpC,QACE,kBACA,gBACA;MAAY;MAAyB;;IAEvC,UAAU,kBAAkB;IAC5B,iBAAiB,oBAAoB;IACrC,iBAAiB;;;;;;;;;;OAWP;IAAoB,gBAAgB,UAAU;;OAE9C;aACD,QAAQ;aACR,SAAS,UAAU;aACnB,QAAQ;aACR,QAAQ;aACR;;;;;;;;;;OAWC;aACD;aACA;aACA;;;OAIC;aACD,QAAQ;IACjB,UAAU,qBAAqB,UAAU;IACzC,WAAW,kBAAkB;;IAE7B,QACE,kBACA,gBACA,yBACA;IAEF,UAAU,kBAAkB;IAC5B,UAAU,kBAAkB;IAC5B,UAAU,kBAAkB;;OAGlB,gBAAgB,kBAAkB,UAAU,eACrD,WAAW,gBACP,MAAM,WAAW,UAAU,QAC3B,QAAQ,WAAW,UAAU;OAGxB;IACV;IASA;IACA;IACA;IACA;IACA;IACA"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { StatewireDocuments } from "./wire/documents.js";
2
2
  import { DEFAULT_PROTOCOL, StatewireProtocol } from "./wire/protocol.js";
3
+ import { StatewireDocument, decodeDocument, encodeDocument } from "./document.js";
3
4
  import { StatewireHttp } from "./transports/sse.js";
4
5
  import { StatewireClient, StatewireResource, useStatewire } from "./statewire.js";
5
6
  import { Statewire, StatewireSendError } from "./types.js";
6
- import { StatewireDocument, decodeDocument, encodeDocument } from "./document.js";
7
7
  import { StatewireWebsocket } from "./transports/ws.js";
8
8
  export { DEFAULT_PROTOCOL, type Statewire, StatewireClient, type StatewireDocument, type StatewireDocuments, StatewireHttp, type StatewireProtocol, StatewireResource, StatewireSendError, StatewireWebsocket, decodeDocument, encodeDocument, useStatewire };
@@ -17,6 +17,7 @@ declare class StatewireClient<TState, TCommands extends Statewire.Commands = Sta
17
17
  get documents(): StatewireDocuments.Source | undefined;
18
18
  get selection(): StatewireProtocol.Selection | undefined;
19
19
  invoke(protocol: string, method: string, params: readonly unknown[]): Promise<unknown>;
20
+ setContext(protocol: string, value: Statewire.Context): void;
20
21
  get isBusy(): boolean;
21
22
  get failed(): readonly StatewireClient.FailedCommand[];
22
23
  retryFailed(entry: StatewireClient.FailedCommand): Promise<unknown>;
@@ -27,6 +28,7 @@ declare class StatewireClient<TState, TCommands extends Statewire.Commands = Sta
27
28
  declare namespace StatewireClient {
28
29
  type Options<TState, TCommands extends Statewire.Commands = Statewire.Commands> = {
29
30
  protocol?: string;
31
+ context?: Readonly<Record<string, Statewire.Context>>;
30
32
  keyPrefixes?: Readonly<Record<string, readonly string[]>>;
31
33
  wireVersion?: StatewireProtocol.Range;
32
34
  applicationProtocols?: readonly StatewireProtocol.Offer[] | "*";
@@ -60,6 +62,7 @@ declare namespace StatewireClient {
60
62
  state: TState;
61
63
  documents: StatewireDocuments.Source | undefined;
62
64
  selection: StatewireProtocol.Selection | undefined;
65
+ setContext: (protocol: string, value: Statewire.Context) => void;
63
66
  invoke: (protocol: string, method: string, params: readonly unknown[]) => Promise<unknown>;
64
67
  /** Identity-stable across renders; reads the current canonical state without subscribing the caller. */
65
68
  getState: () => TState;
@@ -1 +1 @@
1
- {"version":3,"file":"statewire.d.ts","names":[],"sources":["../src/statewire.ts"],"mappings":"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"}
1
+ {"version":3,"file":"statewire.d.ts","names":[],"sources":["../src/statewire.ts"],"mappings":"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"}