statewire 0.17.0 → 0.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/connection.js +3 -2
- package/dist/client/connection.js.map +1 -1
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +38 -6
- package/dist/client/session.js.map +1 -1
- package/dist/document.d.ts +25 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +88 -0
- package/dist/document.js.map +1 -0
- package/dist/host/draft.js +1 -1
- package/dist/host/socket.d.ts +2 -2
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +5 -5
- package/dist/host/socket.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/statewire.d.ts +2 -0
- package/dist/statewire.d.ts.map +1 -1
- package/dist/statewire.js.map +1 -1
- package/dist/wire/documents.js +3 -3
- package/dist/wire/documents.js.map +1 -1
- package/dist/wire/meta.d.ts +3 -18
- package/dist/wire/meta.d.ts.map +1 -1
- package/dist/wire/meta.js +8 -57
- package/dist/wire/meta.js.map +1 -1
- package/dist/wire/ops.js +1 -1
- package/package.json +1 -1
- package/src/client/session.ts +35 -9
- package/src/document.ts +185 -0
- package/src/host/socket.ts +8 -7
- package/src/index.ts +2 -0
- package/src/statewire.ts +6 -1
- package/src/wire/meta.ts +11 -94
package/dist/host/socket.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { encodeDocument, reviveDocumentValue } from "../document.js";
|
|
1
2
|
import { DEFAULT_PROTOCOL, WIRE_VERSION, negotiateProtocols } from "../wire/protocol.js";
|
|
2
|
-
import { encodeValue, reviveValue } from "../wire/meta.js";
|
|
3
3
|
import { applyDocumentOps, mainDocument } from "../wire/documents.js";
|
|
4
4
|
import { StatewireSendError } from "../types.js";
|
|
5
5
|
import { getCommandsHost, getStateHost } from "./host.js";
|
|
@@ -104,7 +104,7 @@ const parseFrame = (raw) => {
|
|
|
104
104
|
const frameIsOversized = (raw) => raw.length > 8388608 || frameEncoder.encode(raw).byteLength > 8388608;
|
|
105
105
|
const encodePayload = (payload) => {
|
|
106
106
|
if (payload === void 0) return {};
|
|
107
|
-
const { value, meta } =
|
|
107
|
+
const { value, meta } = encodeDocument(payload);
|
|
108
108
|
return {
|
|
109
109
|
payload: value,
|
|
110
110
|
...meta !== void 0 && { meta }
|
|
@@ -176,7 +176,7 @@ const scheduleFlush = (h) => {
|
|
|
176
176
|
};
|
|
177
177
|
const recordOp = (h, op) => {
|
|
178
178
|
if (op.op === "replace" || op.op === "add") {
|
|
179
|
-
const { value, meta } =
|
|
179
|
+
const { value, meta } = encodeDocument(op.value);
|
|
180
180
|
h.pendingOps.push({
|
|
181
181
|
...op,
|
|
182
182
|
value,
|
|
@@ -399,7 +399,7 @@ const admitCmd = (h, rec, statement, auth, selection) => {
|
|
|
399
399
|
}
|
|
400
400
|
let params = statement.params;
|
|
401
401
|
if (statement.meta !== void 0) try {
|
|
402
|
-
params =
|
|
402
|
+
params = reviveDocumentValue(params, statement.meta, { rejectUnknown: true });
|
|
403
403
|
} catch (error) {
|
|
404
404
|
rejectStatement(h, rec, adm, `invalid params: ${error.message}`);
|
|
405
405
|
return;
|
|
@@ -802,7 +802,7 @@ const register = (h, clientId, socket, sawFrame = false, auth = void 0, selectio
|
|
|
802
802
|
gcClients(h);
|
|
803
803
|
notifyClientRecords(h);
|
|
804
804
|
ensureHeartbeat(h);
|
|
805
|
-
const { value, meta } =
|
|
805
|
+
const { value, meta } = encodeDocument(h.stateHost.snapshot());
|
|
806
806
|
const hello = {
|
|
807
807
|
ops: [{
|
|
808
808
|
op: "mount",
|
package/dist/host/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","names":["DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","applyDocumentOps","mainDocument","StatewireDocuments","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","encodeValue","reviveValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_CONTEXT_VALUE_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireMetaEntry","StatewirePath","StatewireCmd","StatewireEnvelope","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","WireOp","op","path","value","meta","Admission","seq","method","applied","appliedSent","settled","ClientRec","id","lastSeq","ctxSeq","touched","context","contextDocuments","State","results","Map","ts","cmd","inflight","principal","Conn","selection","Selection","clientId","socket","Socket","open","sawFrame","lastSentAt","lease","auth","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CtxStatement","ops","CmdStatement","protocol","params","ParsedFrame","ctx","isPlainObject","parseLane","statements","prev","statement","Number","isInteger","push","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","undefined","lane","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","type","failure","fate","code","String","parseInitialFrame","headers","lanes","Response","status","values","some","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","Set","pendingConns","pendingOps","pendingApplied","pendingCmds","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","recordOp","attach","next","nextState","state","nextCommands","commands","submit","setOnOp","closeConn","conn","delete","close","size","clearInterval","sendTo","data","now","send","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","idleLevel","work","isIdle","rec","flush","takeChanged","queueApplied","level","edge","cmds","appliedEntries","get","map","packet","protocols","p","idle","verdicts","dur","list","set","queueCmd","notifyClientRecords","onClientRecordsChange","admittedThrough","documents","entry","retain","newest","Math","max","min","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","admitFrame","version","through","ctxNew","s","cmdNew","hostCommandLoad","client","isSafeInteger","TypeError","at","first","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","has","add","fromEntries","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","splice","gcClients","excess","changed","live","oldest","Registration","known","created","mode","snapshot","hello","main","abort","resume","suspend","restoreClientRecords","records","ClientRecord","record","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","unmount"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { applyDocumentOps, mainDocument } from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { encodeValue, reviveValue } from \"../wire/meta\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_CONTEXT_VALUE_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireMetaEntry } from \"../wire/meta\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport type { StatewireCmd, StatewireEnvelope } from \"../client/connection\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype WireOp = {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireMetaEntry[];\n};\n\ntype Admission = {\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\nexport type ClientRec = {\n id: string;\n lastSeq: number;\n ctxSeq: number;\n touched: number;\n context: Record<string, unknown> | null;\n contextDocuments: StatewireDocuments.State;\n results: Map<number, { ts: number; cmd: StatewireCmd }>;\n inflight: Map<number, Admission>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CtxStatement = { seq: number; ops: unknown[] };\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n ctx: CtxStatement[];\n cmd: CmdStatement[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseLane = (value: unknown): Record<string, unknown>[] => {\n if (!Array.isArray(value)) return violation(\"malformed frame\");\n if (value.length === 0) return violation(\"empty lane\");\n const statements: Record<string, unknown>[] = [];\n let prev: number | null = null;\n for (const statement of value) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n if (typeof seq !== \"number\" || !Number.isInteger(seq) || seq < 1) {\n return violation(\"malformed statement\");\n }\n if (prev !== null && seq !== prev + 1) return violation(\"malformed frame\");\n prev = seq;\n statements.push(statement);\n }\n return statements;\n};\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"ctx\" && key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const ctx: CtxStatement[] = [];\n if (frame[\"ctx\"] !== undefined) {\n const lane = frame[\"ctx\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many context statements\");\n }\n for (const statement of parseLane(lane)) {\n const ops = statement[\"ops\"];\n if (!Array.isArray(ops) || !ops.length)\n return violation(\"invalid-context\");\n if (\n frameEncoder.encode(JSON.stringify(ops)).byteLength >\n MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n ctx.push({ seq: statement[\"seq\"] as number, ops });\n }\n }\n const cmd: CmdStatement[] = [];\n if (frame[\"cmd\"] !== undefined) {\n const lane = frame[\"cmd\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many commands\");\n }\n for (const statement of parseLane(lane)) {\n const method = statement[\"method\"];\n if (\n typeof method !== \"string\" ||\n typeof statement[\"protocol\"] !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n cmd.push({\n protocol: statement[\"protocol\"] as string,\n seq: statement[\"seq\"] as number,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n }\n return { ctx, cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireMetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeValue(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): StatewireCmd => {\n if (outcome.type === \"accepted\") {\n return { seq: adm.seq, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { seq: adm.seq, type: \"crashed\" };\n case \"failed\":\n return {\n seq: adm.seq,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n seq: adm.seq,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n seq: adm.seq,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n seq: adm.seq,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length\n ? parseFrameValue(lanes)\n : { ctx: [], cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, number[]>;\n pendingCmds: Map<string, StatewireCmd[]>;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeValue(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const rec of h.clients.values()) {\n if (rec.inflight.size > 0) return false;\n }\n return true;\n};\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const rec of h.clients.values()) {\n for (const adm of rec.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, rec.id, adm.seq);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n fin === undefined &&\n !edge\n ) {\n return;\n }\n h.idleWire = level;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const ops = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n const appliedEntries: StatewireCmd[] = (\n applied.get(conn.clientId) ?? []\n ).map((seq) => ({ seq, type: \"applied\" }));\n if (ops.length > 0) {\n const packet: StatewireEnvelope = {\n ops: conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? ops\n : [],\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n };\n sendTo(h, conn, JSON.stringify(packet));\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = (cmds.get(conn.clientId) ?? []).map((cmd) =>\n conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? cmd\n : { seq: cmd.seq, ...(cmd.dur === undefined ? {} : { dur: cmd.dur }) },\n );\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, clientId: string, seq: number) => {\n const list = h.pendingApplied.get(clientId);\n if (list) list.push(seq);\n else h.pendingApplied.set(clientId, [seq]);\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, clientId: string, cmd: StatewireCmd) => {\n const list = h.pendingCmds.get(clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(clientId, [cmd]);\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n lastSeq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n touched: rec.touched,\n context: rec.context,\n contextDocuments: [...rec.contextDocuments.documents],\n results: [...rec.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (rec: ClientRec, cmd: StatewireCmd) => {\n const now = Date.now();\n rec.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...rec.results.keys());\n for (const [seq, entry] of rec.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n rec.results.delete(seq);\n }\n }\n while (rec.results.size > RESULT_LIMIT) {\n rec.results.delete(Math.min(...rec.results.keys()));\n }\n};\n\n/** Cmd-lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (rec: ClientRec): number =>\n Math.max(rec.lastSeq, ...rec.inflight.keys());\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, rec: ClientRec, seq: number) => {\n const cached = rec.results.get(seq);\n if (cached) {\n const newest = Math.max(...rec.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, rec.id, cached.cmd);\n return;\n }\n rec.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = rec.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, rec.id, seq);\n return;\n }\n queueCmd(h, rec.id, { seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n cmd: StatewireCmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n rec.inflight.delete(adm.seq);\n retain(rec, cmd);\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, rec.id, cmd);\n notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, rec, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n auth: unknown,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth,\n get context() {\n return rec.context;\n },\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n rec: ClientRec,\n statement: CmdStatement,\n auth: unknown,\n selection: StatewireProtocol.Selection,\n) => {\n const adm: Admission = {\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n rec.inflight.set(statement.seq, adm);\n notifyClientRecords(h);\n if (\n statement.protocol !== h.protocol.name ||\n !selection.protocols.some((p) => p.name === statement.protocol)\n ) {\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"unsupported-protocol\",\n message: \"command protocol was not negotiated\",\n });\n return;\n }\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, rec, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n rec,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, rec, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, rec, adm, { seq: adm.seq, type: \"result\", payload: names });\n return;\n }\n h.commandsHost!.submit!({\n method: statement.method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, auth),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, rec, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, rec, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, both lanes: absorbed statements answer from the record,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating both watermarks, nothing consumed. A gap is never a close.\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { seq: number; ctxSeq: number; retry?: number };\n };\n };\n\nexport const admitFrame = (\n h: SocketHostState,\n rec: ClientRec,\n frame: ParsedFrame,\n auth: unknown,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): FrameAdmission => {\n rec.touched = Date.now();\n const through = admittedThrough(rec);\n for (const statement of frame.cmd) {\n if (statement.seq <= through) reemit(h, rec, statement.seq);\n }\n const ctxNew = frame.ctx.filter((s) => s.seq > rec.ctxSeq);\n const cmdNew = frame.cmd.filter((s) => s.seq > through);\n if (\n (ctxNew.length > 0 && ctxNew[0]!.seq !== rec.ctxSeq + 1) ||\n (cmdNew.length > 0 && cmdNew[0]!.seq !== through + 1)\n ) {\n notifyClientRecords(h);\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq } },\n };\n }\n if (cmdNew.length > 0) {\n let hostCommandLoad = 0;\n for (const client of h.clients.values()) {\n hostCommandLoad += client.inflight.size;\n }\n if (\n rec.inflight.size + cmdNew.length > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostCommandLoad + cmdNew.length > h.maxInflightCommands\n ) {\n return {\n type: \"refused\",\n syn: {\n syn: {\n seq: through,\n ctxSeq: rec.ctxSeq,\n retry: COMMAND_CAPACITY_RETRY_MS,\n },\n },\n };\n }\n }\n if ((ctxNew.length || cmdNew.length) && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq, retry } },\n };\n }\n }\n let contextDocuments = rec.contextDocuments;\n try {\n for (const statement of ctxNew)\n contextDocuments = applyDocumentOps(\n contextDocuments,\n statement.ops,\n selection.protocols,\n true,\n );\n if (\n frameEncoder.encode(JSON.stringify([...contextDocuments.documents]))\n .byteLength > MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n } catch {\n return violation(\"invalid-context\");\n }\n rec.contextDocuments = contextDocuments;\n rec.context = (mainDocument(contextDocuments, h.protocol.name)?.value ??\n null) as Record<string, unknown> | null;\n if (ctxNew.length) rec.ctxSeq = ctxNew.at(-1)!.seq;\n for (const statement of cmdNew) admitCmd(h, rec, statement, auth, selection);\n if (cmdNew.length > 0) {\n // Memory host: admitted means retained — dur rides the admitting flush.\n queueCmd(h, rec.id, { seq: cmdNew.at(-1)!.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let frame: ParsedFrame;\n try {\n frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (frame.ctx.length === 0 && frame.cmd.length === 0) return;\n const rec = h.clients.get(conn.clientId)!;\n let admission: ReturnType<typeof admitFrame>;\n try {\n admission = admitFrame(h, rec, frame, conn.auth, conn.selection);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n const registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n );\n if (registration === null) return;\n pending.connection = registration.connection;\n if (frame.ctx.length || frame.cmd.length) {\n message(\n h,\n registration.conn,\n JSON.stringify({\n ...(frame.ctx.length ? { ctx: frame.ctx } : {}),\n ...(frame.cmd.length ? { cmd: frame.cmd } : {}),\n }),\n );\n }\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (live.has(rec.id) || rec.inflight.size > 0) continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n rec: ClientRec;\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n lastSeq: 0,\n ctxSeq: 0,\n touched: Date.now(),\n context: null,\n contextDocuments: { mode: \"mounted\", documents: new Map() },\n results: new Map(),\n inflight: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n };\n h.conns.add(conn);\n gcClients(h);\n notifyClientRecords(h);\n ensureHeartbeat(h);\n const { value, meta } = encodeValue(h.stateHost!.snapshot());\n const hello: StatewireEnvelope = {\n ops: [\n {\n op: \"mount\",\n protocol: h.protocol.name,\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n },\n ],\n syn: {\n ...selection,\n seq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n ...(h.idleWire && { idle: true }),\n },\n };\n if (!selection.protocols.some((p) => p.name === h.protocol.name))\n hello.ops = [];\n sendTo(h, conn, JSON.stringify(hello));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { rec, conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n ...record,\n contextDocuments: {\n mode: \"mounted\",\n documents: new Map(record.contextDocuments ?? []),\n },\n results: new Map(\n record.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * statement-lane client frames under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id, idle edges, and `fin` on\n * finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"socket.js","names":["encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","applyDocumentOps","mainDocument","StatewireDocuments","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_CONTEXT_VALUE_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","StatewireCmd","StatewireEnvelope","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","WireOp","op","path","value","meta","MetaEntry","Admission","seq","method","applied","appliedSent","settled","ClientRec","id","lastSeq","ctxSeq","touched","context","contextDocuments","State","results","Map","ts","cmd","inflight","principal","Conn","selection","Selection","clientId","socket","Socket","open","sawFrame","lastSentAt","lease","auth","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CtxStatement","ops","CmdStatement","protocol","params","ParsedFrame","ctx","isPlainObject","parseLane","statements","prev","statement","Number","isInteger","push","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","undefined","lane","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","type","failure","fate","code","String","parseInitialFrame","headers","lanes","Response","status","values","some","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","Set","pendingConns","pendingOps","pendingApplied","pendingCmds","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","recordOp","attach","next","nextState","state","nextCommands","commands","submit","setOnOp","closeConn","conn","delete","close","size","clearInterval","sendTo","data","now","send","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","idleLevel","work","isIdle","rec","flush","takeChanged","queueApplied","level","edge","cmds","appliedEntries","get","map","packet","protocols","p","idle","verdicts","dur","list","set","queueCmd","notifyClientRecords","onClientRecordsChange","admittedThrough","documents","entry","retain","newest","Math","max","min","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","admitFrame","version","through","ctxNew","s","cmdNew","hostCommandLoad","client","isSafeInteger","TypeError","at","first","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","has","add","fromEntries","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","splice","gcClients","excess","changed","live","oldest","Registration","known","created","mode","snapshot","hello","main","abort","resume","suspend","restoreClientRecords","records","ClientRecord","record","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","unmount"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { applyDocumentOps, mainDocument } from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_CONTEXT_VALUE_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport type { StatewireCmd, StatewireEnvelope } from \"../client/connection\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype WireOp = {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n};\n\ntype Admission = {\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\nexport type ClientRec = {\n id: string;\n lastSeq: number;\n ctxSeq: number;\n touched: number;\n context: Record<string, unknown> | null;\n contextDocuments: StatewireDocuments.State;\n results: Map<number, { ts: number; cmd: StatewireCmd }>;\n inflight: Map<number, Admission>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CtxStatement = { seq: number; ops: unknown[] };\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n ctx: CtxStatement[];\n cmd: CmdStatement[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseLane = (value: unknown): Record<string, unknown>[] => {\n if (!Array.isArray(value)) return violation(\"malformed frame\");\n if (value.length === 0) return violation(\"empty lane\");\n const statements: Record<string, unknown>[] = [];\n let prev: number | null = null;\n for (const statement of value) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n if (typeof seq !== \"number\" || !Number.isInteger(seq) || seq < 1) {\n return violation(\"malformed statement\");\n }\n if (prev !== null && seq !== prev + 1) return violation(\"malformed frame\");\n prev = seq;\n statements.push(statement);\n }\n return statements;\n};\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"ctx\" && key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const ctx: CtxStatement[] = [];\n if (frame[\"ctx\"] !== undefined) {\n const lane = frame[\"ctx\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many context statements\");\n }\n for (const statement of parseLane(lane)) {\n const ops = statement[\"ops\"];\n if (!Array.isArray(ops) || !ops.length)\n return violation(\"invalid-context\");\n if (\n frameEncoder.encode(JSON.stringify(ops)).byteLength >\n MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n ctx.push({ seq: statement[\"seq\"] as number, ops });\n }\n }\n const cmd: CmdStatement[] = [];\n if (frame[\"cmd\"] !== undefined) {\n const lane = frame[\"cmd\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many commands\");\n }\n for (const statement of parseLane(lane)) {\n const method = statement[\"method\"];\n if (\n typeof method !== \"string\" ||\n typeof statement[\"protocol\"] !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n cmd.push({\n protocol: statement[\"protocol\"] as string,\n seq: statement[\"seq\"] as number,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n }\n return { ctx, cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: 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): StatewireCmd => {\n if (outcome.type === \"accepted\") {\n return { seq: adm.seq, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { seq: adm.seq, type: \"crashed\" };\n case \"failed\":\n return {\n seq: adm.seq,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n seq: adm.seq,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n seq: adm.seq,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n seq: adm.seq,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length\n ? parseFrameValue(lanes)\n : { ctx: [], cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, number[]>;\n pendingCmds: Map<string, StatewireCmd[]>;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = 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 = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const rec of h.clients.values()) {\n if (rec.inflight.size > 0) return false;\n }\n return true;\n};\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const rec of h.clients.values()) {\n for (const adm of rec.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, rec.id, adm.seq);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n fin === undefined &&\n !edge\n ) {\n return;\n }\n h.idleWire = level;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const ops = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n const appliedEntries: StatewireCmd[] = (\n applied.get(conn.clientId) ?? []\n ).map((seq) => ({ seq, type: \"applied\" }));\n if (ops.length > 0) {\n const packet: StatewireEnvelope = {\n ops: conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? ops\n : [],\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n };\n sendTo(h, conn, JSON.stringify(packet));\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = (cmds.get(conn.clientId) ?? []).map((cmd) =>\n conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? cmd\n : { seq: cmd.seq, ...(cmd.dur === undefined ? {} : { dur: cmd.dur }) },\n );\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, clientId: string, seq: number) => {\n const list = h.pendingApplied.get(clientId);\n if (list) list.push(seq);\n else h.pendingApplied.set(clientId, [seq]);\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, clientId: string, cmd: StatewireCmd) => {\n const list = h.pendingCmds.get(clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(clientId, [cmd]);\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n lastSeq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n touched: rec.touched,\n context: rec.context,\n contextDocuments: [...rec.contextDocuments.documents],\n results: [...rec.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (rec: ClientRec, cmd: StatewireCmd) => {\n const now = Date.now();\n rec.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...rec.results.keys());\n for (const [seq, entry] of rec.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n rec.results.delete(seq);\n }\n }\n while (rec.results.size > RESULT_LIMIT) {\n rec.results.delete(Math.min(...rec.results.keys()));\n }\n};\n\n/** Cmd-lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (rec: ClientRec): number =>\n Math.max(rec.lastSeq, ...rec.inflight.keys());\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, rec: ClientRec, seq: number) => {\n const cached = rec.results.get(seq);\n if (cached) {\n const newest = Math.max(...rec.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, rec.id, cached.cmd);\n return;\n }\n rec.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = rec.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, rec.id, seq);\n return;\n }\n queueCmd(h, rec.id, { seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n cmd: StatewireCmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n rec.inflight.delete(adm.seq);\n retain(rec, cmd);\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, rec.id, cmd);\n notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, rec, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n auth: unknown,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth,\n get context() {\n return rec.context;\n },\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n rec: ClientRec,\n statement: CmdStatement,\n auth: unknown,\n selection: StatewireProtocol.Selection,\n) => {\n const adm: Admission = {\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n rec.inflight.set(statement.seq, adm);\n notifyClientRecords(h);\n if (\n statement.protocol !== h.protocol.name ||\n !selection.protocols.some((p) => p.name === statement.protocol)\n ) {\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"unsupported-protocol\",\n message: \"command protocol was not negotiated\",\n });\n return;\n }\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, rec, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n rec,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, rec, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, rec, adm, { seq: adm.seq, type: \"result\", payload: names });\n return;\n }\n h.commandsHost!.submit!({\n method: statement.method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, auth),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, rec, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, rec, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, both lanes: absorbed statements answer from the record,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating both watermarks, nothing consumed. A gap is never a close.\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { seq: number; ctxSeq: number; retry?: number };\n };\n };\n\nexport const admitFrame = (\n h: SocketHostState,\n rec: ClientRec,\n frame: ParsedFrame,\n auth: unknown,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): FrameAdmission => {\n rec.touched = Date.now();\n const through = admittedThrough(rec);\n for (const statement of frame.cmd) {\n if (statement.seq <= through) reemit(h, rec, statement.seq);\n }\n const ctxNew = frame.ctx.filter((s) => s.seq > rec.ctxSeq);\n const cmdNew = frame.cmd.filter((s) => s.seq > through);\n if (\n (ctxNew.length > 0 && ctxNew[0]!.seq !== rec.ctxSeq + 1) ||\n (cmdNew.length > 0 && cmdNew[0]!.seq !== through + 1)\n ) {\n notifyClientRecords(h);\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq } },\n };\n }\n if (cmdNew.length > 0) {\n let hostCommandLoad = 0;\n for (const client of h.clients.values()) {\n hostCommandLoad += client.inflight.size;\n }\n if (\n rec.inflight.size + cmdNew.length > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostCommandLoad + cmdNew.length > h.maxInflightCommands\n ) {\n return {\n type: \"refused\",\n syn: {\n syn: {\n seq: through,\n ctxSeq: rec.ctxSeq,\n retry: COMMAND_CAPACITY_RETRY_MS,\n },\n },\n };\n }\n }\n if ((ctxNew.length || cmdNew.length) && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq, retry } },\n };\n }\n }\n let contextDocuments = rec.contextDocuments;\n try {\n for (const statement of ctxNew)\n contextDocuments = applyDocumentOps(\n contextDocuments,\n statement.ops,\n selection.protocols,\n true,\n );\n if (\n frameEncoder.encode(JSON.stringify([...contextDocuments.documents]))\n .byteLength > MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n } catch {\n return violation(\"invalid-context\");\n }\n rec.contextDocuments = contextDocuments;\n rec.context = (mainDocument(contextDocuments, h.protocol.name)?.value ??\n null) as Record<string, unknown> | null;\n if (ctxNew.length) rec.ctxSeq = ctxNew.at(-1)!.seq;\n for (const statement of cmdNew) admitCmd(h, rec, statement, auth, selection);\n if (cmdNew.length > 0) {\n // Memory host: admitted means retained — dur rides the admitting flush.\n queueCmd(h, rec.id, { seq: cmdNew.at(-1)!.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let frame: ParsedFrame;\n try {\n frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (frame.ctx.length === 0 && frame.cmd.length === 0) return;\n const rec = h.clients.get(conn.clientId)!;\n let admission: ReturnType<typeof admitFrame>;\n try {\n admission = admitFrame(h, rec, frame, conn.auth, conn.selection);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n const registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n );\n if (registration === null) return;\n pending.connection = registration.connection;\n if (frame.ctx.length || frame.cmd.length) {\n message(\n h,\n registration.conn,\n JSON.stringify({\n ...(frame.ctx.length ? { ctx: frame.ctx } : {}),\n ...(frame.cmd.length ? { cmd: frame.cmd } : {}),\n }),\n );\n }\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (live.has(rec.id) || rec.inflight.size > 0) continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n rec: ClientRec;\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n lastSeq: 0,\n ctxSeq: 0,\n touched: Date.now(),\n context: null,\n contextDocuments: { mode: \"mounted\", documents: new Map() },\n results: new Map(),\n inflight: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n };\n h.conns.add(conn);\n gcClients(h);\n notifyClientRecords(h);\n ensureHeartbeat(h);\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n const hello: StatewireEnvelope = {\n ops: [\n {\n op: \"mount\",\n protocol: h.protocol.name,\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n },\n ],\n syn: {\n ...selection,\n seq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n ...(h.idleWire && { idle: true }),\n },\n };\n if (!selection.protocols.some((p) => p.name === h.protocol.name))\n hello.ops = [];\n sendTo(h, conn, JSON.stringify(hello));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { rec, conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n ...record,\n contextDocuments: {\n mode: \"mounted\",\n documents: new Map(record.contextDocuments ?? []),\n },\n results: new Map(\n record.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * statement-lane client frames under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id, idle edges, and `fin` on\n * finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,6 @@ import { StatewireProtocol } from "./wire/protocol.js";
|
|
|
3
3
|
import { StatewireHttp } from "./transports/sse.js";
|
|
4
4
|
import { StatewireClient, StatewireResource, useStatewire } from "./statewire.js";
|
|
5
5
|
import { Statewire, StatewireSendError } from "./types.js";
|
|
6
|
+
import { StatewireDocument, decodeDocument, encodeDocument } from "./document.js";
|
|
6
7
|
import { StatewireWebsocket } from "./transports/ws.js";
|
|
7
|
-
export { type Statewire, StatewireClient, type StatewireDocuments, StatewireHttp, type StatewireProtocol, StatewireResource, StatewireSendError, StatewireWebsocket, useStatewire };
|
|
8
|
+
export { type Statewire, StatewireClient, type StatewireDocument, type StatewireDocuments, StatewireHttp, type StatewireProtocol, StatewireResource, StatewireSendError, StatewireWebsocket, decodeDocument, encodeDocument, useStatewire };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { decodeDocument, encodeDocument } from "./document.js";
|
|
1
2
|
import { StatewireSendError } from "./types.js";
|
|
2
3
|
import { StatewireClient, StatewireResource, useStatewire } from "./statewire.js";
|
|
3
4
|
import { StatewireHttp } from "./transports/sse.js";
|
|
4
5
|
import { StatewireWebsocket } from "./transports/ws.js";
|
|
5
|
-
export { StatewireClient, StatewireHttp, StatewireResource, StatewireSendError, StatewireWebsocket, useStatewire };
|
|
6
|
+
export { StatewireClient, StatewireHttp, StatewireResource, StatewireSendError, StatewireWebsocket, decodeDocument, encodeDocument, useStatewire };
|
package/dist/statewire.d.ts
CHANGED
|
@@ -194,6 +194,8 @@ declare namespace StatewireClient {
|
|
|
194
194
|
seq: number;
|
|
195
195
|
ops: unknown[];
|
|
196
196
|
}[];
|
|
197
|
+
/** Recover the original wire's unpersisted single-document context after the next hello. */
|
|
198
|
+
recover?: "version-1";
|
|
197
199
|
};
|
|
198
200
|
commands: readonly SessionCommand[];
|
|
199
201
|
/** Terminal verdicts parked for the sharer that minted the seq (shared storage only). */
|
package/dist/statewire.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statewire.d.ts","names":[],"sources":["../src/statewire.ts"],"mappings":";;;;;;;cAiDa,eACX,QACA,kBAAkB,UAAU,WAAW,UAAU,UAEjD,SAAS,gBAAgB,QAAQ,QAAQ,eACxC,gBAAgB,QAAQ,QAAQ;cAuGtB,oBACX,QACA,kBAAkB,UAAU,WAAW,UAAU,UAEjD,SAAS,gBAAgB,QAAQ,QAAQ,eACxC,gBAAgB,gBAAgB,QAAQ,QAAQ;cAGtC,gBACX,QACA,kBAAkB,UAAU,WAAW,UAAU;mBAEhC;UACT;EAEI,YAAA,SAAS,gBAAgB,QAAQ,QAAQ;MAKjD,SAAS;MAIT,cAAc,gBAAgB;MAI9B,YAAY,UAAU,cAAc;MAIpC,aAAa,mBAAmB;MAGhC,aAAa,kBAAkB;EAGnC,OACE,kBACA,gBACA,6BACC;EAGH,cAAc;MAIV;EAIJ,WAAW,OAAO;MAId,mBAAmB,gBAAgB;EAIvC,YAAY,OAAO,gBAAgB,gBAAgB;EAInD,cAAc,OAAO,gBAAgB;EAIrC,UAAU;EAIV;;kBAOe;OACH,QACV,QACA,kBAAkB,UAAU,WAAW,UAAU;IAEjD;IACA,cAAc,SAAS;IACvB,cAAc,kBAAkB;IAChC,gCAAgC,kBAAkB;IAClD,WAAW,gBAAgB,UAAU,QAAQ;;IAE7C;MAEM,UAAU,gBAAgB;MAC1B,YAAY,gBAAgB,mBAAmB;;;IAIrD,eAAe;IACf,aAAa,WAAW,YAAY,SAAS;IAC7C,cAAc,YAAY,YAAY;IACtC,iBACE,OAAO,YAAY,SACnB;MAAO,SAAS,UAAU;;IAE5B,mBACE,QAAQ,UAAU,cAAc,YAChC;MAAO,OAAO,YAAY;;IAE5B,sBAAsB,YAAY;IAClC,WAAW,OAAO;;IAElB,kBACE,OAAO,YAAY,SACnB,OAAO;;OAIC,QACV,QACA,kBAAkB,UAAU,WAAW,UAAU;;IAGjD,OAAO;IACP,WAAW,mBAAmB;IAC9B,WAAW,kBAAkB;IAC7B,SACE,kBACA,gBACA,+BACG;IACL,gBAAgB;;IAEhB,gBAAgB;IAChB,YAAY;IACZ,UAAU,UAAU,cAAc;;IAElC;;IAEA,aAAa,OAAO;;IAEpB,iBAAiB;;IAEjB,cAAc,OAAO,kBAAkB;;IAEvC,gBAAgB,OAAO;;;OAIb;IAEN;IACA;IAOA;IACA;;IAGA;;IAEA;IACA;IACA;IACA;IACA;IACA;;IAEA;;OACM,aAAa;IACvB,QAAQ;IACR;;IAEA;;OAEU,mBAAmB;;;;;OAMnB,WACV,QACA,kBAAkB,UAAU,WAAW,UAAU,aAEjD,OAAO,QACP,SAAS,UAAU,QAAQ,YAC3B,KAAK;OAGK;IACV;IACA;IACA;;;;;;;OAQU,YAAY,WAAW,OAAO;;;;;;;;;;;;;OAc9B;IAEN;IACA;IACA;IACA;IACA;;IAEA;IAAgB;IAAiB;;IACjC;IAAiB;;IACjB;IAAiB;;IAEjB;IACA;IACA;;IAGA;IACA;;;OAIM,iBACV,SAAS;IACP;IACA;IACA;IACA;IACA;;;OAKQ;aACD;aACA,WAAW;aACX;aACA;aACA;aACA,SAAS;aACT;aACA;;;OAIC;IACV;IACA;IACA;MACE,MAAM,kBAAkB;MACxB,oBAAoB,kBAAkB;;IAExC;IACA;IACA;;;OAIU;IACV;IACA;IACA;IACA;
|
|
1
|
+
{"version":3,"file":"statewire.d.ts","names":[],"sources":["../src/statewire.ts"],"mappings":";;;;;;;cAiDa,eACX,QACA,kBAAkB,UAAU,WAAW,UAAU,UAEjD,SAAS,gBAAgB,QAAQ,QAAQ,eACxC,gBAAgB,QAAQ,QAAQ;cAuGtB,oBACX,QACA,kBAAkB,UAAU,WAAW,UAAU,UAEjD,SAAS,gBAAgB,QAAQ,QAAQ,eACxC,gBAAgB,gBAAgB,QAAQ,QAAQ;cAGtC,gBACX,QACA,kBAAkB,UAAU,WAAW,UAAU;mBAEhC;UACT;EAEI,YAAA,SAAS,gBAAgB,QAAQ,QAAQ;MAKjD,SAAS;MAIT,cAAc,gBAAgB;MAI9B,YAAY,UAAU,cAAc;MAIpC,aAAa,mBAAmB;MAGhC,aAAa,kBAAkB;EAGnC,OACE,kBACA,gBACA,6BACC;EAGH,cAAc;MAIV;EAIJ,WAAW,OAAO;MAId,mBAAmB,gBAAgB;EAIvC,YAAY,OAAO,gBAAgB,gBAAgB;EAInD,cAAc,OAAO,gBAAgB;EAIrC,UAAU;EAIV;;kBAOe;OACH,QACV,QACA,kBAAkB,UAAU,WAAW,UAAU;IAEjD;IACA,cAAc,SAAS;IACvB,cAAc,kBAAkB;IAChC,gCAAgC,kBAAkB;IAClD,WAAW,gBAAgB,UAAU,QAAQ;;IAE7C;MAEM,UAAU,gBAAgB;MAC1B,YAAY,gBAAgB,mBAAmB;;;IAIrD,eAAe;IACf,aAAa,WAAW,YAAY,SAAS;IAC7C,cAAc,YAAY,YAAY;IACtC,iBACE,OAAO,YAAY,SACnB;MAAO,SAAS,UAAU;;IAE5B,mBACE,QAAQ,UAAU,cAAc,YAChC;MAAO,OAAO,YAAY;;IAE5B,sBAAsB,YAAY;IAClC,WAAW,OAAO;;IAElB,kBACE,OAAO,YAAY,SACnB,OAAO;;OAIC,QACV,QACA,kBAAkB,UAAU,WAAW,UAAU;;IAGjD,OAAO;IACP,WAAW,mBAAmB;IAC9B,WAAW,kBAAkB;IAC7B,SACE,kBACA,gBACA,+BACG;IACL,gBAAgB;;IAEhB,gBAAgB;IAChB,YAAY;IACZ,UAAU,UAAU,cAAc;;IAElC;;IAEA,aAAa,OAAO;;IAEpB,iBAAiB;;IAEjB,cAAc,OAAO,kBAAkB;;IAEvC,gBAAgB,OAAO;;;OAIb;IAEN;IACA;IAOA;IACA;;IAGA;;IAEA;IACA;IACA;IACA;IACA;IACA;;IAEA;;OACM,aAAa;IACvB,QAAQ;IACR;;IAEA;;OAEU,mBAAmB;;;;;OAMnB,WACV,QACA,kBAAkB,UAAU,WAAW,UAAU,aAEjD,OAAO,QACP,SAAS,UAAU,QAAQ,YAC3B,KAAK;OAGK;IACV;IACA;IACA;;;;;;;OAQU,YAAY,WAAW,OAAO;;;;;;;;;;;;;OAc9B;IAEN;IACA;IACA;IACA;IACA;;IAEA;IAAgB;IAAiB;;IACjC;IAAiB;;IACjB;IAAiB;;IAEjB;IACA;IACA;;IAGA;IACA;;;OAIM,iBACV,SAAS;IACP;IACA;IACA;IACA;IACA;;;OAKQ;aACD;aACA,WAAW;aACX;aACA;aACA;aACA,SAAS;aACT;aACA;;;OAIC;IACV;IACA;IACA;MACE,MAAM,kBAAkB;MACxB,oBAAoB,kBAAkB;;IAExC;IACA;IACA;;;OAIU;IACV;IACA;IACA;IACA;MACE;MACA;QAAW;QAAa;;;MAExB;;IAEF,mBAAmB;;IAEnB,oBAAoB;;IAEpB,kBAAkB;;;OAIR;IACV;IACA,cAAc;IACd;IACA;IACA;IACA;;;OAIU;IACV,YAAY;IACZ,OAAO,QAAQ;;IAEf,WACE,QAAQ,eACR,SAAS,YAAY,gCAClB;;IAEL,QAAQ,GAAG,UAAU,IAAI,QAAQ,OAAO,QAAQ;;IAEhD,aAAa;;;OAIH,kBAAkB;IAAU,KAAK,cAAc;;OAE/C,gBACR,gBACE;IAAO;QAAyB,cAAc,QAAQ;OAEhD,cAAc,kBAAkB;IAC1C,eAAe;IACf;;IAEA;IACA,UAAU;IACV,eAAe,WAAW;IAC1B,gBAAgB;IAChB,YAAY,YAAY;IACxB,WAAW,OAAO;;IAElB;;OAGU,mBAAmB,kBAAkB;IAC/C,eAAe;IACf;;IAEA;IACA,UAAU;IACV;IACA,QACI,gCACO,yBAAyB,QAAQ;IAC5C,iBAAiB,aAAa,kCAAkC;IAChE,gBAAgB;IAChB,YAAY,YAAY;IACxB,WAAW,OAAO;;IAElB"}
|