statewire 0.19.0 → 0.19.2

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 (51) hide show
  1. package/dist/client/connection.d.ts.map +1 -1
  2. package/dist/client/connection.js +2 -1
  3. package/dist/client/connection.js.map +1 -1
  4. package/dist/client/core.d.ts +2 -0
  5. package/dist/client/core.d.ts.map +1 -1
  6. package/dist/client/core.js +8 -3
  7. package/dist/client/core.js.map +1 -1
  8. package/dist/client/session.d.ts.map +1 -1
  9. package/dist/client/session.js +11 -15
  10. package/dist/client/session.js.map +1 -1
  11. package/dist/client/sessionStore.d.ts +5 -1
  12. package/dist/client/sessionStore.d.ts.map +1 -1
  13. package/dist/client/sessionStore.js +3 -1
  14. package/dist/client/sessionStore.js.map +1 -1
  15. package/dist/client/timing.d.ts +1 -0
  16. package/dist/client/timing.d.ts.map +1 -1
  17. package/dist/client/timing.js +1 -0
  18. package/dist/client/timing.js.map +1 -1
  19. package/dist/host/socket.d.ts +1 -0
  20. package/dist/host/socket.d.ts.map +1 -1
  21. package/dist/host/socket.js +26 -16
  22. package/dist/host/socket.js.map +1 -1
  23. package/dist/host-internal.d.ts +2 -0
  24. package/dist/host-internal.d.ts.map +1 -1
  25. package/dist/statewire.d.ts +8 -3
  26. package/dist/statewire.d.ts.map +1 -1
  27. package/dist/statewire.js +21 -13
  28. package/dist/statewire.js.map +1 -1
  29. package/dist/transports/remote.js +13 -9
  30. package/dist/transports/remote.js.map +1 -1
  31. package/dist/transports/testing.js +2 -1
  32. package/dist/transports/testing.js.map +1 -1
  33. package/dist/transports/ws.d.ts.map +1 -1
  34. package/dist/transports/ws.js +4 -0
  35. package/dist/transports/ws.js.map +1 -1
  36. package/dist/types.d.ts +2 -0
  37. package/dist/types.d.ts.map +1 -1
  38. package/dist/types.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/client/connection.ts +6 -1
  41. package/src/client/core.ts +10 -3
  42. package/src/client/session.ts +20 -10
  43. package/src/client/sessionStore.ts +3 -0
  44. package/src/client/timing.ts +1 -0
  45. package/src/host/socket.ts +27 -27
  46. package/src/host-internal.ts +2 -0
  47. package/src/statewire.ts +63 -22
  48. package/src/transports/remote.ts +22 -12
  49. package/src/transports/testing.ts +4 -3
  50. package/src/transports/ws.ts +6 -0
  51. package/src/types.ts +2 -0
@@ -106,22 +106,16 @@ const cmdOf = (adm, outcome) => {
106
106
  type: "failed",
107
107
  ...failure.message !== void 0 && { message: failure.message }
108
108
  };
109
- case "rejected":
110
- if (failure.code !== void 0) {
111
- const message = failure.code === "unknown-command" ? `unknown method: '${adm.method}'` : failure.message;
112
- return {
113
- ...at,
114
- type: "rejected",
115
- code: failure.code,
116
- ...message !== void 0 && { message }
117
- };
118
- }
109
+ case "rejected": {
110
+ const message = failure.code === "unknown-command" ? `unknown method: '${adm.method}'` : failure.message;
119
111
  return {
120
112
  ...at,
121
113
  type: "rejected",
122
- ...failure.message !== void 0 && { message: failure.message },
114
+ ...failure.code !== void 0 && { code: failure.code },
115
+ ...message !== void 0 && { message },
123
116
  ...encodePayload(failure.payload)
124
117
  };
118
+ }
125
119
  default: return {
126
120
  ...at,
127
121
  type: "failed",
@@ -359,15 +353,18 @@ const flush = (h, fin) => {
359
353
  if (!conn.ready) continue;
360
354
  const forConn = (list) => (list ?? []).filter((cmd) => selects(conn, cmd.protocol));
361
355
  const ops = [...selects(conn, h.protocol.name) ? mainOps : [], ...diffView(h, conn)];
362
- const appliedEntries = [...forConn(applied.get(conn.clientId)), ...conn.pendingApplied.splice(0)];
356
+ const cmd = [
357
+ ...forConn(applied.get(conn.clientId)),
358
+ ...conn.pendingApplied.splice(0),
359
+ ...forConn(cmds.get(conn.clientId)),
360
+ ...conn.pendingCmds.splice(0)
361
+ ];
363
362
  if (ops.length > 0) sendTo(h, conn, JSON.stringify({
364
363
  ops,
365
- ...appliedEntries.length > 0 && { cmd: appliedEntries },
364
+ ...cmd.length > 0 && { cmd },
366
365
  ...edge && { idle: level }
367
366
  }));
368
- else if (appliedEntries.length > 0) sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));
369
- const verdicts = [...forConn(cmds.get(conn.clientId)), ...conn.pendingCmds.splice(0)];
370
- if (verdicts.length > 0) sendTo(h, conn, JSON.stringify({ cmd: verdicts }));
367
+ else if (cmd.length > 0) sendTo(h, conn, JSON.stringify({ cmd }));
371
368
  if (edge && ops.length === 0) sendTo(h, conn, JSON.stringify({ idle: level }));
372
369
  if (fin !== void 0) {
373
370
  sendTo(h, conn, JSON.stringify({ fin }));
@@ -620,6 +617,10 @@ const message = (h, conn, data) => {
620
617
  closeConn(h, conn, 1009, "frame too large");
621
618
  return;
622
619
  }
620
+ if (data === "{}") {
621
+ if (conn.sawFrame) sendTo(h, conn, "{}");
622
+ return;
623
+ }
623
624
  const first = !conn.sawFrame;
624
625
  conn.sawFrame = true;
625
626
  let admission;
@@ -897,6 +898,12 @@ const register = (h, clientId, socket, sawFrame = false, auth = void 0, selectio
897
898
  };
898
899
  conn.attach = attachOf(h, conn);
899
900
  h.conns.add(conn);
901
+ try {
902
+ h.current?.attaching?.(conn.attach);
903
+ } catch (error) {
904
+ closeConn(h, conn, 1011, "attach failed");
905
+ throw error;
906
+ }
900
907
  gcClients(h);
901
908
  ensureHeartbeat(h);
902
909
  const isEphemeral = (s) => selection.protocols.find((p) => p.name === s.protocol)?.record === "ephemeral";
@@ -922,6 +929,7 @@ const register = (h, clientId, socket, sawFrame = false, auth = void 0, selectio
922
929
  ops.push({
923
930
  op: "mount",
924
931
  protocol: h.protocol.name,
932
+ ...h.key !== void 0 && { key: h.key },
925
933
  main: true,
926
934
  value,
927
935
  ...meta !== void 0 && { meta }
@@ -1006,6 +1014,7 @@ const useSocketHost = (transport, options, persistence) => {
1006
1014
  name: DEFAULT_PROTOCOL,
1007
1015
  version: WIRE_VERSION
1008
1016
  },
1017
+ key: void 0,
1009
1018
  wireVersion: { version: WIRE_VERSION },
1010
1019
  heartbeatMs: 15e3,
1011
1020
  wsInitTimeoutMs: 5e3,
@@ -1047,6 +1056,7 @@ const useSocketHost = (transport, options, persistence) => {
1047
1056
  name: "default",
1048
1057
  version: "2026-09-13"
1049
1058
  };
1059
+ h.key = options?.key;
1050
1060
  h.wireVersion = options?.wireVersion ?? { version: "2026-09-13" };
1051
1061
  setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15e3);
1052
1062
  h.pushback = options?.pushback;
@@ -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","appliedEntries","splice","idle","verdicts","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","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 if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n ...at,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.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 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 // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n 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 appliedEntries = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = [\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, 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 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 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 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 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.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":["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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"}
@@ -63,6 +63,8 @@ declare namespace StatewireHostInternal {
63
63
  };
64
64
  type SocketHostOptions<TAuth = unknown> = {
65
65
  protocol?: StatewireProtocol.Definition;
66
+ /** Key of the host protocol's main document. */
67
+ key?: readonly string[];
66
68
  wireVersion?: StatewireProtocol.Range;
67
69
  /** Gates every attach; the awaited return value is the attach's auth, exposed to command handlers as `this.caller.auth`. The first attach binds the client id's record to this value; a later attach whose value is not structurally equal is refused (HTTP 403, socket close 1008). */
68
70
  authorize?: (ctx: {
@@ -1 +1 @@
1
- {"version":3,"file":"host-internal.d.ts","names":[],"sources":["../src/host-internal.ts"],"mappings":";;;;;;kBAMiB;OACH;IACV,OAAO;IACP,QAAQ,eAAe;;OAGb;aACD;IACT,UAAU;IACV;;OAGU;;IAEV,UAAU;;IAEV;IACA,YAAY,kBAAkB;;IAE9B;;IAEA,gBACE,eACA,WAAW,kBAAkB;;OAIrB;;IAEV,UACE,kBACA,QAAQ,QACR,UAAU,yBACP;IACL,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,KAAK,cAAc;IAC5B;;OAGU;IACV;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA;;OAGU;IACV;IACA;IACA,OAAO,SACL;MAGI;MACA;QAAoB;QAAa;QAAY,KAAK;;;IAIxD;;OAGU;IACV,yBAAyB;IACzB,yBAAyB,kBAAkB;;OAGjC,kBAAkB;IAC5B,WAAW,kBAAkB;IAC7B,cAAc,kBAAkB;;IAEhC,aAAa;MACX,SAAS;UACL,QAAQ,QAAQ;;IAEtB;IACA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;OAGU,MAAM,cAAc"}
1
+ {"version":3,"file":"host-internal.d.ts","names":[],"sources":["../src/host-internal.ts"],"mappings":";;;;;;kBAMiB;OACH;IACV,OAAO;IACP,QAAQ,eAAe;;OAGb;aACD;IACT,UAAU;IACV;;OAGU;;IAEV,UAAU;;IAEV;IACA,YAAY,kBAAkB;;IAE9B;;IAEA,gBACE,eACA,WAAW,kBAAkB;;OAIrB;;IAEV,UACE,kBACA,QAAQ,QACR,UAAU,yBACP;IACL,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,KAAK,cAAc;IAC5B;;OAGU;IACV;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA;;OAGU;IACV;IACA;IACA,OAAO,SACL;MAGI;MACA;QAAoB;QAAa;QAAY,KAAK;;;IAIxD;;OAGU;IACV,yBAAyB;IACzB,yBAAyB,kBAAkB;;OAGjC,kBAAkB;IAC5B,WAAW,kBAAkB;;IAE7B;IACA,cAAc,kBAAkB;;IAEhC,aAAa;MACX,SAAS;UACL,QAAQ,QAAQ;;IAEtB;IACA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;OAGU,MAAM,cAAc"}
@@ -31,6 +31,8 @@ declare namespace StatewireClient {
31
31
  wireVersion?: StatewireProtocol.Range;
32
32
  applicationProtocols?: readonly StatewireProtocol.Offer[] | "*";
33
33
  transport: ResourceElement<Statewire<TState, TCommands>>;
34
+ /** The session does not exist on the server yet: the transport's first attach waits for the first command send; the transport's own `isNew` wins. */
35
+ isNew?: boolean;
34
36
  /** Durable session: the mounted storage holds this client's lane identity and its un-durable commands, which resend on the next attach. */
35
37
  storage?: {
36
38
  session?: ResourceElement<SessionStorage> | undefined;
@@ -40,6 +42,8 @@ declare namespace StatewireClient {
40
42
  initialState?: TState;
41
43
  optimistic?: Optimistic<NonNullable<TState>, TCommands>;
42
44
  materialize?: Materialize<NonNullable<TState>>;
45
+ /** Republishes through `materialize` when it changes (`Object.is`); `materialize` itself is read fresh on every publish. */
46
+ materializeKey?: unknown;
43
47
  onStateChange?: (state: NonNullable<TState>, ctx: {
44
48
  changes: Statewire.Changes;
45
49
  }) => void;
@@ -114,9 +118,10 @@ declare namespace StatewireClient {
114
118
  clientId?: string;
115
119
  };
116
120
  /**
117
- * Mutate the draft to make server-accepted, still-uncommitted intents in
118
- * the state concrete (e.g. dispatch records into messages). Runs after the
119
- * optimistic folds on every published state.
121
+ * Mutate the draft to fold client-known facts into the state: server-accepted,
122
+ * still-uncommitted intents (e.g. dispatch records into messages) or the live
123
+ * state of a sibling statewire. Runs after the optimistic folds on every
124
+ * published state; `materializeKey` republishes when the facts change.
120
125
  */
121
126
  type Materialize<TState> = (draft: TState) => void;
122
127
  /**