statewire 0.24.1 → 0.24.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","names":["contextValue","captureContext","MAX_CONTEXT_BYTES","encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","DEFAULT_PROTOCOL_VERSION","GAP_FILL_VERSION","MIN_SERVED_WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","authorizedAt","leaseTimer","ReturnType","setTimeout","timedLease","contexts","Context","documents","Document","included","Set","onIncludedChange","IncludedDocument","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","ctx","res","SERVED_WIRE","Range","version","minVersion","gapFills","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","initial","unknown","filter","sort","lane","hasOwn","prev","statement","Number","isInteger","last","get","undefined","set","push","NonNullable","seen","entry","some","includes","has","add","encode","JSON","stringify","byteLength","cursors","isSafeInteger","r","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","console","parseInitialFrame","headers","Response","status","values","SocketHostState","Definition","wireVersion","heartbeatMs","maxLeaseLifetimeMs","leaseTimers","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","clearTimeout","close","detached","size","clearInterval","sendTo","data","now","send","expiredAt","isFinite","leaseExpiredFin","expireLease","armLeaseTimer","delay","Math","min","unref","violate","atSubscriberLimit","ensureHeartbeat","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","diffView","ops","number","notifyIncluded","map","restoredIncluded","part","TypeError","attachOf","requireSelected","find","caller","callerOf","context","document","snapshot","mount","encoded","other","unmount","include","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","fromEntries","admittedThrough","retain","newest","max","watermark","laneOf","ephemeral","reemit","cached","MAX_EXPIRED","gapFill","cursor","through","answers","settleCmd","settleWire","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","validateContexts","selected","first","s","validateContext","installContexts","contextChanged","admitFrame","fresh","durableNew","clientLoad","hostLoad","findLast","dur","admission","closePending","pending","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","Pick","restored","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","SocketHost","host","hibernatable","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","reviveValue","serveStream","serveFrames"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { contextValue, captureContext } from \"../wire/context\";\nimport { MAX_CONTEXT_BYTES } from \"../wire/limits\";\nimport { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n DEFAULT_PROTOCOL_VERSION,\n GAP_FILL_VERSION,\n MIN_SERVED_WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n authorizedAt: number | undefined;\n leaseTimer: ReturnType<typeof setTimeout> | null;\n timedLease: boolean;\n lanes: Map<string, Lane>;\n contexts: Map<string, Statewire.Context>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n onIncludedChange:\n | ((included: readonly StatewireHostInternal.IncludedDocument[]) => void)\n | undefined;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n cmd: CmdStatement[];\n ctx?: { protocol: string; value: Statewire.Context }[];\n /** Attach only: per lane, the seq through which the client holds every verdict. */\n res?: { protocol: string; seq: number }[];\n};\n\nconst SERVED_WIRE: StatewireProtocol.Range = {\n version: WIRE_VERSION,\n minVersion: MIN_SERVED_WIRE_VERSION,\n};\n\nconst gapFills = (selection: StatewireProtocol.Selection) =>\n selection.version >= GAP_FILL_VERSION;\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 = (\n frame: unknown,\n initial = false,\n): 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\n .filter(\n (key) => key !== \"cmd\" && key !== \"ctx\" && (!initial || key !== \"res\"),\n )\n .sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"] ?? [];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (Object.hasOwn(frame, \"cmd\") && lane.length === 0)\n return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n const contexts = frame[\"ctx\"];\n const ctx: NonNullable<ParsedFrame[\"ctx\"]> = [];\n if (contexts !== undefined) {\n if (!Array.isArray(contexts) || contexts.length === 0)\n return violation(\"empty context lane\");\n const seen = new Set<string>();\n for (const entry of contexts) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n !Object.hasOwn(entry, \"value\") ||\n Object.keys(entry).some(\n (key) => ![\"protocol\", \"value\", \"meta\"].includes(key),\n )\n )\n return violation(\"malformed context\");\n const protocol = entry[\"protocol\"];\n if (seen.has(protocol)) return violation(\"duplicate context protocol\");\n seen.add(protocol);\n if (\n frameEncoder.encode(JSON.stringify(entry)).byteLength >\n MAX_CONTEXT_BYTES\n )\n return violation(\"context entry too large\");\n try {\n ctx.push({\n protocol,\n value: contextValue({\n value: entry[\"value\"],\n ...(entry[\"meta\"] !== undefined && { meta: entry[\"meta\"] }),\n }),\n });\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n }\n const cursors = frame[\"res\"];\n const res: NonNullable<ParsedFrame[\"res\"]> = [];\n if (cursors !== undefined) {\n if (!Array.isArray(cursors) || cursors.length === 0)\n return violation(\"empty results cursor\");\n for (const entry of cursors) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n typeof entry[\"seq\"] !== \"number\" ||\n !Number.isSafeInteger(entry[\"seq\"]) ||\n entry[\"seq\"] < 0 ||\n Object.keys(entry).length !== 2 ||\n res.some((r) => r.protocol === entry[\"protocol\"])\n )\n return violation(\"malformed results cursor\");\n res.push({ protocol: entry[\"protocol\"], seq: entry[\"seq\"] });\n }\n }\n if (cmd.length === 0 && ctx.length === 0 && res.length === 0)\n return violation(\"empty frame\");\n return {\n cmd,\n ...(ctx.length > 0 && { ctx }),\n ...(res.length > 0 && { res }),\n };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n console.error(\"statewire command failed\", outcome.error);\n return {\n ...at,\n type: \"failed\",\n message: \"the command failed\",\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length\n ? parseFrameValue(lanes, true)\n : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n key: readonly string[] | undefined;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n maxLeaseLifetimeMs: number | null;\n leaseTimers: boolean;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n if (conn.leaseTimer !== null) {\n clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst expiredAt = (h: SocketHostState, authorizedAt: number | undefined) => {\n const now = Date.now();\n return (\n authorizedAt === undefined ||\n !Number.isFinite(authorizedAt) ||\n authorizedAt < 0 ||\n authorizedAt > now ||\n (h.maxLeaseLifetimeMs !== null &&\n now - authorizedAt >= h.maxLeaseLifetimeMs)\n );\n};\n\nconst leaseExpiredFin = JSON.stringify({\n fin: { reason: \"reconnect\", code: \"lease-expired\" },\n});\n\nexport const expireLease = (h: SocketHostState, conn: Conn): boolean => {\n if (!conn.open || expiredAt(h, conn.authorizedAt)) {\n if (conn.open) {\n sendTo(h, conn, leaseExpiredFin);\n closeConn(h, conn, 1000, \"lease-expired\");\n }\n return true;\n }\n return false;\n};\n\nconst armLeaseTimer = (h: SocketHostState, conn: Conn) => {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n if (\n h.disposed ||\n h.maxLeaseLifetimeMs === null ||\n expireLease(h, conn) ||\n !conn.timedLease\n )\n return;\n const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);\n conn.leaseTimer = setTimeout(\n () => {\n conn.leaseTimer = null;\n if (!expireLease(h, conn)) armLeaseTimer(h, conn);\n },\n Math.min(delay, 2_147_483_647),\n );\n (conn.leaseTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs && !expireLease(h, conn))\n sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst notifyIncluded = (conn: Conn) =>\n conn.onIncludedChange?.(\n [...conn.included].map(\n (id) => JSON.parse(id) as StatewireHostInternal.IncludedDocument,\n ),\n );\n\nconst restoredIncluded = (\n included: readonly StatewireHostInternal.IncludedDocument[],\n): Set<string> =>\n new Set(\n included.map((entry) => {\n if (\n !Array.isArray(entry) ||\n entry.length !== 2 ||\n typeof entry[0] !== \"string\" ||\n !(\n entry[1] === null ||\n (Array.isArray(entry[1]) &&\n entry[1].every((part) => typeof part === \"string\"))\n )\n )\n throw new TypeError(\"statewire: invalid restored include\");\n return documentIdentity(entry[0], entry[1] ?? undefined);\n }),\n );\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n get caller() {\n return callerOf(h, h.clients.get(conn.clientId)!, conn);\n },\n context: (protocol) => {\n requireSelected(protocol);\n return captureContext(conn.contexts.get(protocol) ?? {});\n },\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n const id = documentIdentity(protocol, key);\n if (conn.included.has(id)) return;\n conn.included.add(id);\n notifyIncluded(conn);\n markViews(h);\n },\n exclude: (protocol, key) => {\n if (!conn.included.delete(documentIdentity(protocol, key))) return;\n notifyIncluded(conn);\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready || expireLease(h, conn)) 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\n// The attach's results cursor: every retained verdict above it re-emits and\n// every applied inflight run answers applied, all on the hello. Expired\n// answers cover at most MAX_EXPIRED seqs past the cursor per lane: retained\n// verdicts and inflight runs are bounded on their own.\nconst MAX_EXPIRED = 4096;\n\nconst gapFill = (\n h: SocketHostState,\n conn: Conn,\n res: NonNullable<ParsedFrame[\"res\"]>,\n) => {\n const rec = h.clients.get(conn.clientId);\n if (rec === undefined) return;\n for (const { protocol, seq: cursor } of res) {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined || entry.record === \"ephemeral\") continue;\n const lane = rec.lanes.get(protocol);\n if (lane === undefined) continue;\n const through = admittedThrough(lane);\n const newest = lane.results.size > 0 ? Math.max(...lane.results.keys()) : 0;\n const answers = new Map<number, Cmd>();\n for (const [seq, cached] of lane.results) {\n if (seq <= cursor || seq > through) continue;\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS)\n answers.set(seq, cached.cmd);\n }\n for (const [seq, adm] of lane.inflight) {\n if (seq > cursor && adm.applied)\n conn.pendingApplied.push({ protocol, seq, type: \"applied\" });\n }\n const last = Math.min(through, cursor + MAX_EXPIRED);\n for (let seq = cursor + 1; seq <= last; seq++) {\n if (!answers.has(seq) && !lane.inflight.has(seq))\n answers.set(seq, { protocol, seq, type: \"expired\" });\n }\n for (const seq of [...answers.keys()].sort((a, b) => a - b))\n conn.pendingCmds.push(answers.get(seq)!);\n }\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n context: captureContext(conn.contexts.get(statement.protocol) ?? {}),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | { type: \"expired\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nconst validateContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const statement of frame.cmd) {\n if (!selects(conn, statement.protocol))\n return violation(\"unsupported protocol\");\n const selected = conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!;\n if (selected.record === \"ephemeral\") {\n const through = watermark(h, conn, statement.protocol);\n const first = frame.cmd.find(\n (s) => s.protocol === statement.protocol && s.seq > through,\n );\n if (first && first.seq !== through + 1)\n return violation(\"ephemeral lane gap\");\n }\n }\n for (const entry of frame.ctx ?? []) {\n if (!selects(conn, entry.protocol))\n return violation(\"unsupported context protocol\");\n try {\n h.current?.validateContext?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n};\n\nconst installContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const entry of frame.ctx ?? [])\n conn.contexts.set(entry.protocol, captureContext(entry.value));\n for (const entry of frame.ctx ?? [])\n h.current?.contextChanged?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n};\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n if (expireLease(h, conn)) return { type: \"expired\" };\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n if (gapFills(conn.selection) && fresh.length < frame.cmd.length)\n return violation(\"re-sent seq at or below the watermark\");\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n if (expireLease(h, conn)) return { type: \"expired\" };\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null || expireLease(h, conn))\n return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.res !== undefined) {\n if (!gapFills(conn.selection))\n return violate(h, conn, \"unknown frame key: 'res'\");\n gapFill(h, conn, frame.res);\n scheduleFlush(h);\n }\n if (frame.cmd.length === 0 && !frame.ctx?.length) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n if (expiredAt(h, options.authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1000, \"lease-expired\");\n } catch {\n /* peer already gone */\n }\n return null;\n }\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n undefined,\n options.authorizedAt,\n { ...options, timedLease: h.leaseTimers },\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const authorizedAt = Date.now();\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection, authorizedAt);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n authorizedAt,\n {\n timedLease: h.leaseTimers,\n ...(options.onIncludedChange !== undefined && {\n onIncludedChange: options.onIncludedChange,\n }),\n },\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n authorizedAt?: number,\n included: Pick<\n StatewireHostInternal.SocketConnectOptions,\n \"included\" | \"onIncludedChange\"\n > & { timedLease?: boolean } = {},\n): Registration | null => {\n const restored = restoredIncluded(included.included ?? []);\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n if (expiredAt(h, authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"lease-expired\");\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n authorizedAt,\n leaseTimer: null,\n timedLease: included.timedLease ?? true,\n lanes: new Map(),\n contexts: new Map(),\n documents: new Map(),\n included: restored,\n onIncludedChange: included.onIncludedChange,\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n if (frame.res !== undefined && !gapFills(selection)) {\n violate(h, conn, \"unknown frame key: 'res'\");\n return violation(\"unknown frame key: 'res'\");\n }\n try {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n const reason = violationReason(error);\n if (reason !== null) violate(h, conn, reason);\n else closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n armLeaseTimer(h, conn);\n if (!conn.open) return null;\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n if (expireLease(h, conn)) return null;\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n if (frame.res !== undefined) gapFill(h, conn, frame.res);\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n for (const conn of h.conns) armLeaseTimer(h, conn);\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n for (const conn of h.conns) {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: DEFAULT_PROTOCOL_VERSION },\n key: undefined,\n wireVersion: SERVED_WIRE,\n heartbeatMs: 15_000,\n maxLeaseLifetimeMs: 86_400_000,\n leaseTimers: persistence?.hibernatable !== true,\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: DEFAULT_PROTOCOL_VERSION,\n };\n h.key = options?.key;\n h.wireVersion = options?.wireVersion ?? SERVED_WIRE;\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n const maxLeaseLifetimeMs =\n options?.maxLeaseLifetimeMs === undefined\n ? 86_400_000\n : options.maxLeaseLifetimeMs;\n if (\n maxLeaseLifetimeMs !== null &&\n (!Number.isFinite(maxLeaseLifetimeMs) || maxLeaseLifetimeMs <= 0)\n ) {\n throw new TypeError(\n \"maxLeaseLifetimeMs must be finite and positive or null\",\n );\n }\n if (h.maxLeaseLifetimeMs !== maxLeaseLifetimeMs) {\n h.maxLeaseLifetimeMs = maxLeaseLifetimeMs;\n for (const conn of [...h.conns]) armLeaseTimer(h, conn);\n }\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"socket.js","names":["contextValue","captureContext","MAX_CONTEXT_BYTES","encodeDocument","DEFAULT_PROTOCOL","DEFAULT_PROTOCOL_VERSION","GAP_FILL_VERSION","MIN_SERVED_WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","authorizedAt","leaseTimer","ReturnType","setTimeout","timedLease","contexts","Context","documents","Document","included","Set","onIncludedChange","IncludedDocument","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","ctx","res","SERVED_WIRE","Range","version","minVersion","gapFills","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","initial","unknown","filter","sort","lane","hasOwn","prev","statement","Number","isInteger","last","get","undefined","set","push","NonNullable","seen","entry","some","includes","has","add","encode","JSON","stringify","byteLength","cursors","isSafeInteger","r","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","console","parseInitialFrame","headers","Response","status","values","SocketHostState","Definition","wireVersion","heartbeatMs","maxLeaseLifetimeMs","leaseTimers","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","clearTimeout","close","detached","size","clearInterval","sendTo","data","now","send","expiredAt","isFinite","leaseExpiredFin","expireLease","armLeaseTimer","delay","Math","min","unref","violate","atSubscriberLimit","ensureHeartbeat","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","diffView","ops","number","notifyIncluded","map","restoredIncluded","part","TypeError","attachOf","requireSelected","find","caller","callerOf","context","document","snapshot","mount","encoded","other","unmount","include","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","fromEntries","admittedThrough","retain","newest","max","watermark","laneOf","ephemeral","reemit","cached","MAX_EXPIRED","gapFill","cursor","through","answers","settleCmd","settleWire","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","validateContexts","selected","first","s","validateContext","installContexts","contextChanged","admitFrame","fresh","durableNew","clientLoad","hostLoad","findLast","dur","admission","closePending","pending","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","Pick","restored","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","SocketHost","host","hibernatable","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","reviveValue","serveStream","serveFrames"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { contextValue, captureContext } from \"../wire/context\";\nimport { MAX_CONTEXT_BYTES } from \"../wire/limits\";\nimport { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n DEFAULT_PROTOCOL_VERSION,\n GAP_FILL_VERSION,\n MIN_SERVED_WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n authorizedAt: number | undefined;\n leaseTimer: ReturnType<typeof setTimeout> | null;\n timedLease: boolean;\n lanes: Map<string, Lane>;\n contexts: Map<string, Statewire.Context>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n onIncludedChange:\n | ((included: readonly StatewireHostInternal.IncludedDocument[]) => void)\n | undefined;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n cmd: CmdStatement[];\n ctx?: { protocol: string; value: Statewire.Context }[];\n /** Attach only: per lane, the seq through which the client holds every verdict. */\n res?: { protocol: string; seq: number }[];\n};\n\n// This host serves through the gap-fill wire: it names no attach to retire.\nconst SERVED_WIRE: StatewireProtocol.Range = {\n version: GAP_FILL_VERSION,\n minVersion: MIN_SERVED_WIRE_VERSION,\n};\n\nconst gapFills = (selection: StatewireProtocol.Selection) =>\n selection.version >= GAP_FILL_VERSION;\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 = (\n frame: unknown,\n initial = false,\n): 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\n .filter(\n (key) => key !== \"cmd\" && key !== \"ctx\" && (!initial || key !== \"res\"),\n )\n .sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"] ?? [];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (Object.hasOwn(frame, \"cmd\") && lane.length === 0)\n return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n const contexts = frame[\"ctx\"];\n const ctx: NonNullable<ParsedFrame[\"ctx\"]> = [];\n if (contexts !== undefined) {\n if (!Array.isArray(contexts) || contexts.length === 0)\n return violation(\"empty context lane\");\n const seen = new Set<string>();\n for (const entry of contexts) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n !Object.hasOwn(entry, \"value\") ||\n Object.keys(entry).some(\n (key) => ![\"protocol\", \"value\", \"meta\"].includes(key),\n )\n )\n return violation(\"malformed context\");\n const protocol = entry[\"protocol\"];\n if (seen.has(protocol)) return violation(\"duplicate context protocol\");\n seen.add(protocol);\n if (\n frameEncoder.encode(JSON.stringify(entry)).byteLength >\n MAX_CONTEXT_BYTES\n )\n return violation(\"context entry too large\");\n try {\n ctx.push({\n protocol,\n value: contextValue({\n value: entry[\"value\"],\n ...(entry[\"meta\"] !== undefined && { meta: entry[\"meta\"] }),\n }),\n });\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n }\n const cursors = frame[\"res\"];\n const res: NonNullable<ParsedFrame[\"res\"]> = [];\n if (cursors !== undefined) {\n if (!Array.isArray(cursors) || cursors.length === 0)\n return violation(\"empty results cursor\");\n for (const entry of cursors) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n typeof entry[\"seq\"] !== \"number\" ||\n !Number.isSafeInteger(entry[\"seq\"]) ||\n entry[\"seq\"] < 0 ||\n Object.keys(entry).length !== 2 ||\n res.some((r) => r.protocol === entry[\"protocol\"])\n )\n return violation(\"malformed results cursor\");\n res.push({ protocol: entry[\"protocol\"], seq: entry[\"seq\"] });\n }\n }\n if (cmd.length === 0 && ctx.length === 0 && res.length === 0)\n return violation(\"empty frame\");\n return {\n cmd,\n ...(ctx.length > 0 && { ctx }),\n ...(res.length > 0 && { res }),\n };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n console.error(\"statewire command failed\", outcome.error);\n return {\n ...at,\n type: \"failed\",\n message: \"the command failed\",\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length\n ? parseFrameValue(lanes, true)\n : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n key: readonly string[] | undefined;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n maxLeaseLifetimeMs: number | null;\n leaseTimers: boolean;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n if (conn.leaseTimer !== null) {\n clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst expiredAt = (h: SocketHostState, authorizedAt: number | undefined) => {\n const now = Date.now();\n return (\n authorizedAt === undefined ||\n !Number.isFinite(authorizedAt) ||\n authorizedAt < 0 ||\n authorizedAt > now ||\n (h.maxLeaseLifetimeMs !== null &&\n now - authorizedAt >= h.maxLeaseLifetimeMs)\n );\n};\n\nconst leaseExpiredFin = JSON.stringify({\n fin: { reason: \"reconnect\", code: \"lease-expired\" },\n});\n\nexport const expireLease = (h: SocketHostState, conn: Conn): boolean => {\n if (!conn.open || expiredAt(h, conn.authorizedAt)) {\n if (conn.open) {\n sendTo(h, conn, leaseExpiredFin);\n closeConn(h, conn, 1000, \"lease-expired\");\n }\n return true;\n }\n return false;\n};\n\nconst armLeaseTimer = (h: SocketHostState, conn: Conn) => {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n if (\n h.disposed ||\n h.maxLeaseLifetimeMs === null ||\n expireLease(h, conn) ||\n !conn.timedLease\n )\n return;\n const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);\n conn.leaseTimer = setTimeout(\n () => {\n conn.leaseTimer = null;\n if (!expireLease(h, conn)) armLeaseTimer(h, conn);\n },\n Math.min(delay, 2_147_483_647),\n );\n (conn.leaseTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs && !expireLease(h, conn))\n sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst notifyIncluded = (conn: Conn) =>\n conn.onIncludedChange?.(\n [...conn.included].map(\n (id) => JSON.parse(id) as StatewireHostInternal.IncludedDocument,\n ),\n );\n\nconst restoredIncluded = (\n included: readonly StatewireHostInternal.IncludedDocument[],\n): Set<string> =>\n new Set(\n included.map((entry) => {\n if (\n !Array.isArray(entry) ||\n entry.length !== 2 ||\n typeof entry[0] !== \"string\" ||\n !(\n entry[1] === null ||\n (Array.isArray(entry[1]) &&\n entry[1].every((part) => typeof part === \"string\"))\n )\n )\n throw new TypeError(\"statewire: invalid restored include\");\n return documentIdentity(entry[0], entry[1] ?? undefined);\n }),\n );\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n get caller() {\n return callerOf(h, h.clients.get(conn.clientId)!, conn);\n },\n context: (protocol) => {\n requireSelected(protocol);\n return captureContext(conn.contexts.get(protocol) ?? {});\n },\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n const id = documentIdentity(protocol, key);\n if (conn.included.has(id)) return;\n conn.included.add(id);\n notifyIncluded(conn);\n markViews(h);\n },\n exclude: (protocol, key) => {\n if (!conn.included.delete(documentIdentity(protocol, key))) return;\n notifyIncluded(conn);\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready || expireLease(h, conn)) 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\n// The attach's results cursor: every retained verdict above it re-emits and\n// every applied inflight run answers applied, all on the hello. Expired\n// answers cover at most MAX_EXPIRED seqs past the cursor per lane: retained\n// verdicts and inflight runs are bounded on their own.\nconst MAX_EXPIRED = 4096;\n\nconst gapFill = (\n h: SocketHostState,\n conn: Conn,\n res: NonNullable<ParsedFrame[\"res\"]>,\n) => {\n const rec = h.clients.get(conn.clientId);\n if (rec === undefined) return;\n for (const { protocol, seq: cursor } of res) {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined || entry.record === \"ephemeral\") continue;\n const lane = rec.lanes.get(protocol);\n if (lane === undefined) continue;\n const through = admittedThrough(lane);\n const newest = lane.results.size > 0 ? Math.max(...lane.results.keys()) : 0;\n const answers = new Map<number, Cmd>();\n for (const [seq, cached] of lane.results) {\n if (seq <= cursor || seq > through) continue;\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS)\n answers.set(seq, cached.cmd);\n }\n for (const [seq, adm] of lane.inflight) {\n if (seq > cursor && adm.applied)\n conn.pendingApplied.push({ protocol, seq, type: \"applied\" });\n }\n const last = Math.min(through, cursor + MAX_EXPIRED);\n for (let seq = cursor + 1; seq <= last; seq++) {\n if (!answers.has(seq) && !lane.inflight.has(seq))\n answers.set(seq, { protocol, seq, type: \"expired\" });\n }\n for (const seq of [...answers.keys()].sort((a, b) => a - b))\n conn.pendingCmds.push(answers.get(seq)!);\n }\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n context: captureContext(conn.contexts.get(statement.protocol) ?? {}),\n version: conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!.version,\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | { type: \"expired\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nconst validateContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const statement of frame.cmd) {\n if (!selects(conn, statement.protocol))\n return violation(\"unsupported protocol\");\n const selected = conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!;\n if (selected.record === \"ephemeral\") {\n const through = watermark(h, conn, statement.protocol);\n const first = frame.cmd.find(\n (s) => s.protocol === statement.protocol && s.seq > through,\n );\n if (first && first.seq !== through + 1)\n return violation(\"ephemeral lane gap\");\n }\n }\n for (const entry of frame.ctx ?? []) {\n if (!selects(conn, entry.protocol))\n return violation(\"unsupported context protocol\");\n try {\n h.current?.validateContext?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n};\n\nconst installContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const entry of frame.ctx ?? [])\n conn.contexts.set(entry.protocol, captureContext(entry.value));\n for (const entry of frame.ctx ?? [])\n h.current?.contextChanged?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n};\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n if (expireLease(h, conn)) return { type: \"expired\" };\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n if (gapFills(conn.selection) && fresh.length < frame.cmd.length)\n return violation(\"re-sent seq at or below the watermark\");\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n if (expireLease(h, conn)) return { type: \"expired\" };\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null || expireLease(h, conn))\n return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.res !== undefined) {\n if (!gapFills(conn.selection))\n return violate(h, conn, \"unknown frame key: 'res'\");\n gapFill(h, conn, frame.res);\n scheduleFlush(h);\n }\n if (frame.cmd.length === 0 && !frame.ctx?.length) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n if (expiredAt(h, options.authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1000, \"lease-expired\");\n } catch {\n /* peer already gone */\n }\n return null;\n }\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n undefined,\n options.authorizedAt,\n { ...options, timedLease: h.leaseTimers },\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const authorizedAt = Date.now();\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection, authorizedAt);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n authorizedAt,\n {\n timedLease: h.leaseTimers,\n ...(options.onIncludedChange !== undefined && {\n onIncludedChange: options.onIncludedChange,\n }),\n },\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n authorizedAt?: number,\n included: Pick<\n StatewireHostInternal.SocketConnectOptions,\n \"included\" | \"onIncludedChange\"\n > & { timedLease?: boolean } = {},\n): Registration | null => {\n const restored = restoredIncluded(included.included ?? []);\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n if (expiredAt(h, authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"lease-expired\");\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n authorizedAt,\n leaseTimer: null,\n timedLease: included.timedLease ?? true,\n lanes: new Map(),\n contexts: new Map(),\n documents: new Map(),\n included: restored,\n onIncludedChange: included.onIncludedChange,\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n if (frame.res !== undefined && !gapFills(selection)) {\n violate(h, conn, \"unknown frame key: 'res'\");\n return violation(\"unknown frame key: 'res'\");\n }\n try {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n const reason = violationReason(error);\n if (reason !== null) violate(h, conn, reason);\n else closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n armLeaseTimer(h, conn);\n if (!conn.open) return null;\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n if (expireLease(h, conn)) return null;\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n if (frame.res !== undefined) gapFill(h, conn, frame.res);\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n for (const conn of h.conns) armLeaseTimer(h, conn);\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n for (const conn of h.conns) {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: DEFAULT_PROTOCOL_VERSION },\n key: undefined,\n wireVersion: SERVED_WIRE,\n heartbeatMs: 15_000,\n maxLeaseLifetimeMs: 86_400_000,\n leaseTimers: persistence?.hibernatable !== true,\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: DEFAULT_PROTOCOL_VERSION,\n };\n h.key = options?.key;\n h.wireVersion = options?.wireVersion ?? SERVED_WIRE;\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n const maxLeaseLifetimeMs =\n options?.maxLeaseLifetimeMs === undefined\n ? 86_400_000\n : options.maxLeaseLifetimeMs;\n if (\n maxLeaseLifetimeMs !== null &&\n (!Number.isFinite(maxLeaseLifetimeMs) || maxLeaseLifetimeMs <= 0)\n ) {\n throw new TypeError(\n \"maxLeaseLifetimeMs must be finite and positive or null\",\n );\n }\n if (h.maxLeaseLifetimeMs !== maxLeaseLifetimeMs) {\n h.maxLeaseLifetimeMs = maxLeaseLifetimeMs;\n for (const conn of [...h.conns]) armLeaseTimer(h, conn);\n }\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
package/dist/host.d.ts CHANGED
@@ -34,20 +34,26 @@ export declare namespace StatewireHost {
34
34
  documents: () => ReadonlyMap<string, Document>;
35
35
  setOnDocuments: (listener: (() => void) | null) => void;
36
36
  };
37
+ /** What `this.context` and `this.version` read for a call made on the proxy (in-process dispatch). */
38
+ type CommandsOptions = {
39
+ context?: () => Statewire.Context;
40
+ version?: string;
41
+ };
37
42
  /**
38
43
  * Per-invocation handle bound as `this` of a command handler: `caller` is
39
44
  * the submitting client, `attach` the admitting attach's document view
40
- * (in-process dispatch has none — reading it throws), `applied()` states the
41
- * broadcast state now contains the command's effects — the client drops its
42
- * optimistic overlay — before the handler settles (idempotent, a no-op after
43
- * settle). The command settles when the handler's returned promise does.
45
+ * (in-process dispatch has none — reading it throws), `version` the
46
+ * command protocol's version that attach negotiated (in-process dispatch
47
+ * reads `CommandsOptions.version`; without one, reading it throws),
48
+ * `applied()` states the broadcast state now contains the command's effects
49
+ * — the client drops its optimistic overlay — before the handler settles
50
+ * (idempotent, a no-op after settle). The command settles when the
51
+ * handler's returned promise does.
44
52
  */
45
- type CommandsOptions = {
46
- context?: () => Statewire.Context;
47
- };
48
53
  type Ctx = {
49
54
  readonly caller: Caller;
50
55
  readonly context: Statewire.Context;
56
+ readonly version: string;
51
57
  readonly attach: Attach;
52
58
  readonly signal: AbortSignal;
53
59
  readonly applied: () => void;