statewire 0.19.0 → 0.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/connection.d.ts.map +1 -1
- package/dist/client/connection.js +2 -1
- package/dist/client/connection.js.map +1 -1
- package/dist/client/core.d.ts +2 -0
- package/dist/client/core.d.ts.map +1 -1
- package/dist/client/core.js +8 -3
- package/dist/client/core.js.map +1 -1
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +11 -15
- package/dist/client/session.js.map +1 -1
- package/dist/client/sessionStore.d.ts +5 -1
- package/dist/client/sessionStore.d.ts.map +1 -1
- package/dist/client/sessionStore.js +3 -1
- package/dist/client/sessionStore.js.map +1 -1
- package/dist/client/timing.d.ts +1 -0
- package/dist/client/timing.d.ts.map +1 -1
- package/dist/client/timing.js +1 -0
- package/dist/client/timing.js.map +1 -1
- package/dist/host/socket.d.ts +1 -0
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +26 -16
- package/dist/host/socket.js.map +1 -1
- package/dist/host-internal.d.ts +2 -0
- package/dist/host-internal.d.ts.map +1 -1
- package/dist/statewire.d.ts +8 -3
- package/dist/statewire.d.ts.map +1 -1
- package/dist/statewire.js +21 -13
- package/dist/statewire.js.map +1 -1
- package/dist/transports/remote.js +13 -9
- package/dist/transports/remote.js.map +1 -1
- package/dist/transports/testing.js +2 -1
- package/dist/transports/testing.js.map +1 -1
- package/dist/transports/ws.d.ts.map +1 -1
- package/dist/transports/ws.js +4 -0
- package/dist/transports/ws.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/src/client/connection.ts +6 -1
- package/src/client/core.ts +10 -3
- package/src/client/session.ts +20 -10
- package/src/client/sessionStore.ts +3 -0
- package/src/client/timing.ts +1 -0
- package/src/host/socket.ts +27 -27
- package/src/host-internal.ts +2 -0
- package/src/statewire.ts +63 -22
- package/src/transports/remote.ts +22 -12
- package/src/transports/testing.ts +4 -3
- package/src/transports/ws.ts +6 -0
- package/src/types.ts +2 -0
package/dist/host/socket.js
CHANGED
|
@@ -106,22 +106,16 @@ const cmdOf = (adm, outcome) => {
|
|
|
106
106
|
type: "failed",
|
|
107
107
|
...failure.message !== void 0 && { message: failure.message }
|
|
108
108
|
};
|
|
109
|
-
case "rejected":
|
|
110
|
-
|
|
111
|
-
const message = failure.code === "unknown-command" ? `unknown method: '${adm.method}'` : failure.message;
|
|
112
|
-
return {
|
|
113
|
-
...at,
|
|
114
|
-
type: "rejected",
|
|
115
|
-
code: failure.code,
|
|
116
|
-
...message !== void 0 && { message }
|
|
117
|
-
};
|
|
118
|
-
}
|
|
109
|
+
case "rejected": {
|
|
110
|
+
const message = failure.code === "unknown-command" ? `unknown method: '${adm.method}'` : failure.message;
|
|
119
111
|
return {
|
|
120
112
|
...at,
|
|
121
113
|
type: "rejected",
|
|
122
|
-
...failure.
|
|
114
|
+
...failure.code !== void 0 && { code: failure.code },
|
|
115
|
+
...message !== void 0 && { message },
|
|
123
116
|
...encodePayload(failure.payload)
|
|
124
117
|
};
|
|
118
|
+
}
|
|
125
119
|
default: return {
|
|
126
120
|
...at,
|
|
127
121
|
type: "failed",
|
|
@@ -359,15 +353,18 @@ const flush = (h, fin) => {
|
|
|
359
353
|
if (!conn.ready) continue;
|
|
360
354
|
const forConn = (list) => (list ?? []).filter((cmd) => selects(conn, cmd.protocol));
|
|
361
355
|
const ops = [...selects(conn, h.protocol.name) ? mainOps : [], ...diffView(h, conn)];
|
|
362
|
-
const
|
|
356
|
+
const cmd = [
|
|
357
|
+
...forConn(applied.get(conn.clientId)),
|
|
358
|
+
...conn.pendingApplied.splice(0),
|
|
359
|
+
...forConn(cmds.get(conn.clientId)),
|
|
360
|
+
...conn.pendingCmds.splice(0)
|
|
361
|
+
];
|
|
363
362
|
if (ops.length > 0) sendTo(h, conn, JSON.stringify({
|
|
364
363
|
ops,
|
|
365
|
-
...
|
|
364
|
+
...cmd.length > 0 && { cmd },
|
|
366
365
|
...edge && { idle: level }
|
|
367
366
|
}));
|
|
368
|
-
else if (
|
|
369
|
-
const verdicts = [...forConn(cmds.get(conn.clientId)), ...conn.pendingCmds.splice(0)];
|
|
370
|
-
if (verdicts.length > 0) sendTo(h, conn, JSON.stringify({ cmd: verdicts }));
|
|
367
|
+
else if (cmd.length > 0) sendTo(h, conn, JSON.stringify({ cmd }));
|
|
371
368
|
if (edge && ops.length === 0) sendTo(h, conn, JSON.stringify({ idle: level }));
|
|
372
369
|
if (fin !== void 0) {
|
|
373
370
|
sendTo(h, conn, JSON.stringify({ fin }));
|
|
@@ -620,6 +617,10 @@ const message = (h, conn, data) => {
|
|
|
620
617
|
closeConn(h, conn, 1009, "frame too large");
|
|
621
618
|
return;
|
|
622
619
|
}
|
|
620
|
+
if (data === "{}") {
|
|
621
|
+
if (conn.sawFrame) sendTo(h, conn, "{}");
|
|
622
|
+
return;
|
|
623
|
+
}
|
|
623
624
|
const first = !conn.sawFrame;
|
|
624
625
|
conn.sawFrame = true;
|
|
625
626
|
let admission;
|
|
@@ -897,6 +898,12 @@ const register = (h, clientId, socket, sawFrame = false, auth = void 0, selectio
|
|
|
897
898
|
};
|
|
898
899
|
conn.attach = attachOf(h, conn);
|
|
899
900
|
h.conns.add(conn);
|
|
901
|
+
try {
|
|
902
|
+
h.current?.attaching?.(conn.attach);
|
|
903
|
+
} catch (error) {
|
|
904
|
+
closeConn(h, conn, 1011, "attach failed");
|
|
905
|
+
throw error;
|
|
906
|
+
}
|
|
900
907
|
gcClients(h);
|
|
901
908
|
ensureHeartbeat(h);
|
|
902
909
|
const isEphemeral = (s) => selection.protocols.find((p) => p.name === s.protocol)?.record === "ephemeral";
|
|
@@ -922,6 +929,7 @@ const register = (h, clientId, socket, sawFrame = false, auth = void 0, selectio
|
|
|
922
929
|
ops.push({
|
|
923
930
|
op: "mount",
|
|
924
931
|
protocol: h.protocol.name,
|
|
932
|
+
...h.key !== void 0 && { key: h.key },
|
|
925
933
|
main: true,
|
|
926
934
|
value,
|
|
927
935
|
...meta !== void 0 && { meta }
|
|
@@ -1006,6 +1014,7 @@ const useSocketHost = (transport, options, persistence) => {
|
|
|
1006
1014
|
name: DEFAULT_PROTOCOL,
|
|
1007
1015
|
version: WIRE_VERSION
|
|
1008
1016
|
},
|
|
1017
|
+
key: void 0,
|
|
1009
1018
|
wireVersion: { version: WIRE_VERSION },
|
|
1010
1019
|
heartbeatMs: 15e3,
|
|
1011
1020
|
wsInitTimeoutMs: 5e3,
|
|
@@ -1047,6 +1056,7 @@ const useSocketHost = (transport, options, persistence) => {
|
|
|
1047
1056
|
name: "default",
|
|
1048
1057
|
version: "2026-09-13"
|
|
1049
1058
|
};
|
|
1059
|
+
h.key = options?.key;
|
|
1050
1060
|
h.wireVersion = options?.wireVersion ?? { version: "2026-09-13" };
|
|
1051
1061
|
setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15e3);
|
|
1052
1062
|
h.pushback = options?.pushback;
|
package/dist/host/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","names":["encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","documents","Document","included","Set","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","prev","statement","Number","isInteger","last","get","undefined","set","push","parseFrame","raw","JSON","parse","frameIsOversized","encode","byteLength","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","String","parseInitialFrame","headers","Response","status","values","some","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","close","detached","size","clearInterval","sendTo","data","now","send","violate","stringify","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","has","diffView","ops","entry","number","attachOf","requireSelected","find","document","snapshot","mount","encoded","other","unmount","include","add","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","appliedEntries","splice","idle","verdicts","queueCmd","notifyClientRecords","onClientRecordsChange","map","fromEntries","admittedThrough","retain","newest","Math","max","min","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","admitFrame","s","through","fresh","durableNew","first","clientLoad","hostLoad","isSafeInteger","TypeError","findLast","dur","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","known","created","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n lanes: Map<string, Lane>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = { cmd: CmdStatement[] };\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (lane.length === 0) return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n return { cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n ...at,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n ...at,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length ? parseFrameValue(lanes) : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n conn.included.add(documentIdentity(protocol, key));\n markViews(h);\n },\n exclude: (protocol, key) => {\n conn.included.delete(documentIdentity(protocol, key));\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n if (!conn.ready) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const appliedEntries = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = [\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n lanes: new Map(),\n documents: new Map(),\n included: new Set(),\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n gcClients(h);\n ensureHeartbeat(h);\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n viewsDirty: false,\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"socket.js","names":["encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","documents","Document","included","Set","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","prev","statement","Number","isInteger","last","get","undefined","set","push","parseFrame","raw","JSON","parse","frameIsOversized","encode","byteLength","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","String","parseInitialFrame","headers","Response","status","values","some","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","close","detached","size","clearInterval","sendTo","data","now","send","violate","stringify","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","has","diffView","ops","entry","number","attachOf","requireSelected","find","document","snapshot","mount","encoded","other","unmount","include","add","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","map","fromEntries","admittedThrough","retain","newest","Math","max","min","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","admitFrame","s","through","fresh","durableNew","first","clientLoad","hostLoad","isSafeInteger","TypeError","findLast","dur","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n lanes: Map<string, Lane>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = { cmd: CmdStatement[] };\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (lane.length === 0) return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n return { cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n ...at,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length ? parseFrameValue(lanes) : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n key: readonly string[] | undefined;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n conn.included.add(documentIdentity(protocol, key));\n markViews(h);\n },\n exclude: (protocol, key) => {\n conn.included.delete(documentIdentity(protocol, key));\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const cmd = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(cmd.length > 0 && { cmd }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (cmd.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n lanes: new Map(),\n documents: new Map(),\n included: new Set(),\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n try {\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n key: undefined,\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n viewsDirty: false,\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.key = options?.key;\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
package/dist/host-internal.d.ts
CHANGED
|
@@ -63,6 +63,8 @@ declare namespace StatewireHostInternal {
|
|
|
63
63
|
};
|
|
64
64
|
type SocketHostOptions<TAuth = unknown> = {
|
|
65
65
|
protocol?: StatewireProtocol.Definition;
|
|
66
|
+
/** Key of the host protocol's main document. */
|
|
67
|
+
key?: readonly string[];
|
|
66
68
|
wireVersion?: StatewireProtocol.Range;
|
|
67
69
|
/** Gates every attach; the awaited return value is the attach's auth, exposed to command handlers as `this.caller.auth`. The first attach binds the client id's record to this value; a later attach whose value is not structurally equal is refused (HTTP 403, socket close 1008). */
|
|
68
70
|
authorize?: (ctx: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-internal.d.ts","names":[],"sources":["../src/host-internal.ts"],"mappings":";;;;;;kBAMiB;OACH;IACV,OAAO;IACP,QAAQ,eAAe;;OAGb;aACD;IACT,UAAU;IACV;;OAGU;;IAEV,UAAU;;IAEV;IACA,YAAY,kBAAkB;;IAE9B;;IAEA,gBACE,eACA,WAAW,kBAAkB;;OAIrB;;IAEV,UACE,kBACA,QAAQ,QACR,UAAU,yBACP;IACL,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,KAAK,cAAc;IAC5B;;OAGU;IACV;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA;;OAGU;IACV;IACA;IACA,OAAO,SACL;MAGI;MACA;QAAoB;QAAa;QAAY,KAAK;;;IAIxD;;OAGU;IACV,yBAAyB;IACzB,yBAAyB,kBAAkB;;OAGjC,kBAAkB;IAC5B,WAAW,kBAAkB;
|
|
1
|
+
{"version":3,"file":"host-internal.d.ts","names":[],"sources":["../src/host-internal.ts"],"mappings":";;;;;;kBAMiB;OACH;IACV,OAAO;IACP,QAAQ,eAAe;;OAGb;aACD;IACT,UAAU;IACV;;OAGU;;IAEV,UAAU;;IAEV;IACA,YAAY,kBAAkB;;IAE9B;;IAEA,gBACE,eACA,WAAW,kBAAkB;;OAIrB;;IAEV,UACE,kBACA,QAAQ,QACR,UAAU,yBACP;IACL,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,KAAK,cAAc;IAC5B;;OAGU;IACV;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA;;OAGU;IACV;IACA;IACA,OAAO,SACL;MAGI;MACA;QAAoB;QAAa;QAAY,KAAK;;;IAIxD;;OAGU;IACV,yBAAyB;IACzB,yBAAyB,kBAAkB;;OAGjC,kBAAkB;IAC5B,WAAW,kBAAkB;;IAE7B;IACA,cAAc,kBAAkB;;IAEhC,aAAa;MACX,SAAS;UACL,QAAQ,QAAQ;;IAEtB;IACA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;OAGU,MAAM,cAAc"}
|
package/dist/statewire.d.ts
CHANGED
|
@@ -31,6 +31,8 @@ declare namespace StatewireClient {
|
|
|
31
31
|
wireVersion?: StatewireProtocol.Range;
|
|
32
32
|
applicationProtocols?: readonly StatewireProtocol.Offer[] | "*";
|
|
33
33
|
transport: ResourceElement<Statewire<TState, TCommands>>;
|
|
34
|
+
/** The session does not exist on the server yet: the transport's first attach waits for the first command send; the transport's own `isNew` wins. */
|
|
35
|
+
isNew?: boolean;
|
|
34
36
|
/** Durable session: the mounted storage holds this client's lane identity and its un-durable commands, which resend on the next attach. */
|
|
35
37
|
storage?: {
|
|
36
38
|
session?: ResourceElement<SessionStorage> | undefined;
|
|
@@ -40,6 +42,8 @@ declare namespace StatewireClient {
|
|
|
40
42
|
initialState?: TState;
|
|
41
43
|
optimistic?: Optimistic<NonNullable<TState>, TCommands>;
|
|
42
44
|
materialize?: Materialize<NonNullable<TState>>;
|
|
45
|
+
/** Republishes through `materialize` when it changes (`Object.is`); `materialize` itself is read fresh on every publish. */
|
|
46
|
+
materializeKey?: unknown;
|
|
43
47
|
onStateChange?: (state: NonNullable<TState>, ctx: {
|
|
44
48
|
changes: Statewire.Changes;
|
|
45
49
|
}) => void;
|
|
@@ -114,9 +118,10 @@ declare namespace StatewireClient {
|
|
|
114
118
|
clientId?: string;
|
|
115
119
|
};
|
|
116
120
|
/**
|
|
117
|
-
* Mutate the draft to
|
|
118
|
-
*
|
|
119
|
-
* optimistic folds on every
|
|
121
|
+
* Mutate the draft to fold client-known facts into the state: server-accepted,
|
|
122
|
+
* still-uncommitted intents (e.g. dispatch records into messages) or the live
|
|
123
|
+
* state of a sibling statewire. Runs after the optimistic folds on every
|
|
124
|
+
* published state; `materializeKey` republishes when the facts change.
|
|
120
125
|
*/
|
|
121
126
|
type Materialize<TState> = (draft: TState) => void;
|
|
122
127
|
/**
|