statewire 0.22.0 → 0.22.1
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/host/socket.d.ts +5 -1
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +13 -5
- 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/package.json +1 -1
- package/src/host/socket.ts +21 -8
- package/src/host-internal.ts +2 -0
package/dist/host/socket.d.ts
CHANGED
|
@@ -63,6 +63,7 @@ export type Conn = {
|
|
|
63
63
|
auth: unknown;
|
|
64
64
|
authorizedAt: number | undefined;
|
|
65
65
|
leaseTimer: ReturnType<typeof setTimeout> | null;
|
|
66
|
+
timedLease: boolean;
|
|
66
67
|
lanes: Map<string, Lane>;
|
|
67
68
|
contexts: Map<string, Statewire.Context>;
|
|
68
69
|
documents: Map<string, StatewireHost.Document>;
|
|
@@ -107,6 +108,7 @@ export type SocketHostState = {
|
|
|
107
108
|
wireVersion: StatewireProtocol.Range;
|
|
108
109
|
heartbeatMs: number;
|
|
109
110
|
maxLeaseLifetimeMs: number | null;
|
|
111
|
+
leaseTimers: boolean;
|
|
110
112
|
wsInitTimeoutMs: number;
|
|
111
113
|
maxSubscribers: number;
|
|
112
114
|
maxInflightCommands: number;
|
|
@@ -168,7 +170,9 @@ export type Registration = {
|
|
|
168
170
|
* before the snapshot (their documents and answers ride the hello), durable
|
|
169
171
|
* ones after it. A violation in the attach frame closes the attach and throws.
|
|
170
172
|
*/
|
|
171
|
-
export declare const register: (h: SocketHostState, clientId: string, socket: StatewireHostInternal.Socket, sawFrame?: boolean, auth?: unknown, selection?: StatewireProtocol.Selection, frame?: ParsedFrame, authorizedAt?: number, included?: Pick<StatewireHostInternal.SocketConnectOptions, "included" | "onIncludedChange">
|
|
173
|
+
export declare const register: (h: SocketHostState, clientId: string, socket: StatewireHostInternal.Socket, sawFrame?: boolean, auth?: unknown, selection?: StatewireProtocol.Selection, frame?: ParsedFrame, authorizedAt?: number, included?: Pick<StatewireHostInternal.SocketConnectOptions, "included" | "onIncludedChange"> & {
|
|
174
|
+
timedLease?: boolean;
|
|
175
|
+
}) => Registration | null;
|
|
172
176
|
/**
|
|
173
177
|
* Transport-agnostic WS binding over a statewire/host transport:
|
|
174
178
|
* feed it sockets (anything with `send`/`close`) and raw text frames, and it
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/host/socket.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/host/socket.ts"],"names":[],"mappings":"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"}
|
package/dist/host/socket.js
CHANGED
|
@@ -256,7 +256,7 @@ const expireLease = (h, conn) => {
|
|
|
256
256
|
const armLeaseTimer = (h, conn) => {
|
|
257
257
|
if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);
|
|
258
258
|
conn.leaseTimer = null;
|
|
259
|
-
if (h.disposed || h.maxLeaseLifetimeMs === null || expireLease(h, conn)) return;
|
|
259
|
+
if (h.disposed || h.maxLeaseLifetimeMs === null || expireLease(h, conn) || !conn.timedLease) return;
|
|
260
260
|
const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt);
|
|
261
261
|
conn.leaseTimer = setTimeout(() => {
|
|
262
262
|
conn.leaseTimer = null;
|
|
@@ -276,7 +276,7 @@ const ensureHeartbeat = (h) => {
|
|
|
276
276
|
if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;
|
|
277
277
|
h.heartbeatTimer = setInterval(() => {
|
|
278
278
|
const now = Date.now();
|
|
279
|
-
for (const conn of [...h.conns]) if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, "{}");
|
|
279
|
+
for (const conn of [...h.conns]) if (now - conn.lastSentAt >= h.heartbeatMs && !expireLease(h, conn)) sendTo(h, conn, "{}");
|
|
280
280
|
}, h.heartbeatMs);
|
|
281
281
|
h.heartbeatTimer.unref?.();
|
|
282
282
|
};
|
|
@@ -434,7 +434,7 @@ const flush = (h, fin) => {
|
|
|
434
434
|
h.pendingApplied = /* @__PURE__ */ new Map();
|
|
435
435
|
h.pendingCmds = /* @__PURE__ */ new Map();
|
|
436
436
|
for (const conn of [...h.conns]) {
|
|
437
|
-
if (!conn.ready) continue;
|
|
437
|
+
if (!conn.ready || expireLease(h, conn)) continue;
|
|
438
438
|
const forConn = (list) => (list ?? []).filter((cmd) => selects(conn, cmd.protocol));
|
|
439
439
|
const ops = [...selects(conn, h.protocol.name) ? mainOps : [], ...diffView(h, conn)];
|
|
440
440
|
const cmd = [
|
|
@@ -811,7 +811,10 @@ const connectAuthorized = (h, clientId, socket, options) => {
|
|
|
811
811
|
} catch {}
|
|
812
812
|
return null;
|
|
813
813
|
}
|
|
814
|
-
return register(h, clientId, socket, options.authorized === true, options.auth, options.selection, void 0, options.authorizedAt,
|
|
814
|
+
return register(h, clientId, socket, options.authorized === true, options.auth, options.selection, void 0, options.authorizedAt, {
|
|
815
|
+
...options,
|
|
816
|
+
timedLease: h.leaseTimers
|
|
817
|
+
})?.connection ?? null;
|
|
815
818
|
}
|
|
816
819
|
const refuse = (code, reason) => {
|
|
817
820
|
try {
|
|
@@ -916,7 +919,10 @@ const connectAuthorized = (h, clientId, socket, options) => {
|
|
|
916
919
|
if (pending.timer !== null) clearTimeout(pending.timer);
|
|
917
920
|
let registration;
|
|
918
921
|
try {
|
|
919
|
-
registration = register(h, clientId, socket, true, auth, selection, frame, authorizedAt,
|
|
922
|
+
registration = register(h, clientId, socket, true, auth, selection, frame, authorizedAt, {
|
|
923
|
+
timedLease: h.leaseTimers,
|
|
924
|
+
...options.onIncludedChange !== void 0 && { onIncludedChange: options.onIncludedChange }
|
|
925
|
+
});
|
|
920
926
|
} catch (error) {
|
|
921
927
|
if (violationReason(error) === null) throw error;
|
|
922
928
|
return;
|
|
@@ -1019,6 +1025,7 @@ const register = (h, clientId, socket, sawFrame = false, auth = void 0, selectio
|
|
|
1019
1025
|
auth,
|
|
1020
1026
|
authorizedAt,
|
|
1021
1027
|
leaseTimer: null,
|
|
1028
|
+
timedLease: included.timedLease ?? true,
|
|
1022
1029
|
lanes: /* @__PURE__ */ new Map(),
|
|
1023
1030
|
contexts: /* @__PURE__ */ new Map(),
|
|
1024
1031
|
documents: /* @__PURE__ */ new Map(),
|
|
@@ -1164,6 +1171,7 @@ const useSocketHost = (transport, options, persistence) => {
|
|
|
1164
1171
|
wireVersion: { version: WIRE_VERSION },
|
|
1165
1172
|
heartbeatMs: 15e3,
|
|
1166
1173
|
maxLeaseLifetimeMs: 864e5,
|
|
1174
|
+
leaseTimers: persistence?.hibernatable !== true,
|
|
1167
1175
|
wsInitTimeoutMs: 5e3,
|
|
1168
1176
|
maxSubscribers: MAX_SUBSCRIBERS,
|
|
1169
1177
|
maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,
|
package/dist/host/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","names":["contextValue","captureContext","MAX_CONTEXT_BYTES","encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","authorizedAt","leaseTimer","ReturnType","setTimeout","contexts","Context","documents","Document","included","Set","onIncludedChange","IncludedDocument","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","ctx","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","hasOwn","prev","statement","Number","isInteger","last","get","undefined","set","push","NonNullable","seen","entry","some","includes","has","add","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","console","parseInitialFrame","headers","Response","status","values","SocketHostState","Definition","wireVersion","Range","heartbeatMs","maxLeaseLifetimeMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","clearTimeout","close","detached","size","clearInterval","sendTo","data","now","send","expiredAt","isFinite","leaseExpiredFin","expireLease","armLeaseTimer","delay","Math","min","unref","violate","atSubscriberLimit","ensureHeartbeat","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","diffView","ops","number","notifyIncluded","map","restoredIncluded","part","TypeError","attachOf","requireSelected","find","caller","callerOf","context","document","snapshot","mount","encoded","other","unmount","include","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","fromEntries","admittedThrough","retain","newest","max","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","validateContexts","selected","through","first","s","validateContext","installContexts","contextChanged","admitFrame","fresh","durableNew","clientLoad","hostLoad","isSafeInteger","findLast","dur","admission","closePending","pending","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","Pick","restored","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","reviveValue","serveStream","serveFrames"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { contextValue, captureContext } from \"../wire/context\";\nimport { MAX_CONTEXT_BYTES } from \"../wire/limits\";\nimport { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n authorizedAt: number | undefined;\n leaseTimer: ReturnType<typeof setTimeout> | null;\n lanes: Map<string, Lane>;\n contexts: Map<string, Statewire.Context>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n onIncludedChange:\n | ((included: readonly StatewireHostInternal.IncludedDocument[]) => void)\n | undefined;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n cmd: CmdStatement[];\n ctx?: { protocol: string; value: Statewire.Context }[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"cmd\" && key !== \"ctx\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"] ?? [];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (Object.hasOwn(frame, \"cmd\") && lane.length === 0)\n return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n const contexts = frame[\"ctx\"];\n const ctx: NonNullable<ParsedFrame[\"ctx\"]> = [];\n if (contexts !== undefined) {\n if (!Array.isArray(contexts) || contexts.length === 0)\n return violation(\"empty context lane\");\n const seen = new Set<string>();\n for (const entry of contexts) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n !Object.hasOwn(entry, \"value\") ||\n Object.keys(entry).some(\n (key) => ![\"protocol\", \"value\", \"meta\"].includes(key),\n )\n )\n return violation(\"malformed context\");\n const protocol = entry[\"protocol\"];\n if (seen.has(protocol)) return violation(\"duplicate context protocol\");\n seen.add(protocol);\n if (\n frameEncoder.encode(JSON.stringify(entry)).byteLength >\n MAX_CONTEXT_BYTES\n )\n return violation(\"context entry too large\");\n try {\n ctx.push({\n protocol,\n value: contextValue({\n value: entry[\"value\"],\n ...(entry[\"meta\"] !== undefined && { meta: entry[\"meta\"] }),\n }),\n });\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n }\n if (cmd.length === 0 && ctx.length === 0) return violation(\"empty frame\");\n return { cmd, ...(ctx.length > 0 && { ctx }) };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n console.error(\"statewire command failed\", outcome.error);\n return {\n ...at,\n type: \"failed\",\n message: \"the command failed\",\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length ? 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 maxLeaseLifetimeMs: number | null;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n if (conn.leaseTimer !== null) {\n clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst expiredAt = (h: SocketHostState, authorizedAt: number | undefined) => {\n const now = Date.now();\n return (\n authorizedAt === undefined ||\n !Number.isFinite(authorizedAt) ||\n authorizedAt < 0 ||\n authorizedAt > now ||\n (h.maxLeaseLifetimeMs !== null &&\n now - authorizedAt >= h.maxLeaseLifetimeMs)\n );\n};\n\nconst leaseExpiredFin = JSON.stringify({\n fin: { reason: \"reconnect\", code: \"lease-expired\" },\n});\n\nexport const expireLease = (h: SocketHostState, conn: Conn): boolean => {\n if (!conn.open || expiredAt(h, conn.authorizedAt)) {\n if (conn.open) {\n sendTo(h, conn, leaseExpiredFin);\n closeConn(h, conn, 1000, \"lease-expired\");\n }\n return true;\n }\n return false;\n};\n\nconst armLeaseTimer = (h: SocketHostState, conn: Conn) => {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n if (h.disposed || h.maxLeaseLifetimeMs === null || expireLease(h, conn))\n return;\n const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);\n conn.leaseTimer = setTimeout(\n () => {\n conn.leaseTimer = null;\n if (!expireLease(h, conn)) armLeaseTimer(h, conn);\n },\n Math.min(delay, 2_147_483_647),\n );\n (conn.leaseTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst notifyIncluded = (conn: Conn) =>\n conn.onIncludedChange?.(\n [...conn.included].map(\n (id) => JSON.parse(id) as StatewireHostInternal.IncludedDocument,\n ),\n );\n\nconst restoredIncluded = (\n included: readonly StatewireHostInternal.IncludedDocument[],\n): Set<string> =>\n new Set(\n included.map((entry) => {\n if (\n !Array.isArray(entry) ||\n entry.length !== 2 ||\n typeof entry[0] !== \"string\" ||\n !(\n entry[1] === null ||\n (Array.isArray(entry[1]) &&\n entry[1].every((part) => typeof part === \"string\"))\n )\n )\n throw new TypeError(\"statewire: invalid restored include\");\n return documentIdentity(entry[0], entry[1] ?? undefined);\n }),\n );\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n get caller() {\n return callerOf(h, h.clients.get(conn.clientId)!, conn);\n },\n context: (protocol) => {\n requireSelected(protocol);\n return captureContext(conn.contexts.get(protocol) ?? {});\n },\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n const id = documentIdentity(protocol, key);\n if (conn.included.has(id)) return;\n conn.included.add(id);\n notifyIncluded(conn);\n markViews(h);\n },\n exclude: (protocol, key) => {\n if (!conn.included.delete(documentIdentity(protocol, key))) return;\n notifyIncluded(conn);\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const cmd = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(cmd.length > 0 && { cmd }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (cmd.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n context: captureContext(conn.contexts.get(statement.protocol) ?? {}),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | { type: \"expired\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nconst validateContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const statement of frame.cmd) {\n if (!selects(conn, statement.protocol))\n return violation(\"unsupported protocol\");\n const selected = conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!;\n if (selected.record === \"ephemeral\") {\n const through = watermark(h, conn, statement.protocol);\n const first = frame.cmd.find(\n (s) => s.protocol === statement.protocol && s.seq > through,\n );\n if (first && first.seq !== through + 1)\n return violation(\"ephemeral lane gap\");\n }\n }\n for (const entry of frame.ctx ?? []) {\n if (!selects(conn, entry.protocol))\n return violation(\"unsupported context protocol\");\n try {\n h.current?.validateContext?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n};\n\nconst installContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const entry of frame.ctx ?? [])\n conn.contexts.set(entry.protocol, captureContext(entry.value));\n for (const entry of frame.ctx ?? [])\n h.current?.contextChanged?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n};\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n if (expireLease(h, conn)) return { type: \"expired\" };\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n if (expireLease(h, conn)) return { type: \"expired\" };\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null || expireLease(h, conn))\n return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0 && !frame.ctx?.length) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n if (expiredAt(h, options.authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1000, \"lease-expired\");\n } catch {\n /* peer already gone */\n }\n return null;\n }\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n undefined,\n options.authorizedAt,\n options,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const authorizedAt = Date.now();\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection, authorizedAt);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n authorizedAt,\n options.onIncludedChange === undefined\n ? {}\n : { onIncludedChange: options.onIncludedChange },\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n authorizedAt?: number,\n included: Pick<\n StatewireHostInternal.SocketConnectOptions,\n \"included\" | \"onIncludedChange\"\n > = {},\n): Registration | null => {\n const restored = restoredIncluded(included.included ?? []);\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n if (expiredAt(h, authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"lease-expired\");\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n authorizedAt,\n leaseTimer: null,\n lanes: new Map(),\n contexts: new Map(),\n documents: new Map(),\n included: restored,\n onIncludedChange: included.onIncludedChange,\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n try {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n const reason = violationReason(error);\n if (reason !== null) violate(h, conn, reason);\n else closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n armLeaseTimer(h, conn);\n if (!conn.open) return null;\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n if (expireLease(h, conn)) return null;\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n for (const conn of h.conns) armLeaseTimer(h, conn);\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n for (const conn of h.conns) {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n key: undefined,\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n maxLeaseLifetimeMs: 86_400_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 const maxLeaseLifetimeMs =\n options?.maxLeaseLifetimeMs === undefined\n ? 86_400_000\n : options.maxLeaseLifetimeMs;\n if (\n maxLeaseLifetimeMs !== null &&\n (!Number.isFinite(maxLeaseLifetimeMs) || maxLeaseLifetimeMs <= 0)\n ) {\n throw new TypeError(\n \"maxLeaseLifetimeMs must be finite and positive or null\",\n );\n }\n if (h.maxLeaseLifetimeMs !== maxLeaseLifetimeMs) {\n h.maxLeaseLifetimeMs = maxLeaseLifetimeMs;\n for (const conn of [...h.conns]) armLeaseTimer(h, conn);\n }\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"socket.js","names":["contextValue","captureContext","MAX_CONTEXT_BYTES","encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","authorizedAt","leaseTimer","ReturnType","setTimeout","timedLease","contexts","Context","documents","Document","included","Set","onIncludedChange","IncludedDocument","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","ctx","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","hasOwn","prev","statement","Number","isInteger","last","get","undefined","set","push","NonNullable","seen","entry","some","includes","has","add","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","console","parseInitialFrame","headers","Response","status","values","SocketHostState","Definition","wireVersion","Range","heartbeatMs","maxLeaseLifetimeMs","leaseTimers","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","clearTimeout","close","detached","size","clearInterval","sendTo","data","now","send","expiredAt","isFinite","leaseExpiredFin","expireLease","armLeaseTimer","delay","Math","min","unref","violate","atSubscriberLimit","ensureHeartbeat","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","diffView","ops","number","notifyIncluded","map","restoredIncluded","part","TypeError","attachOf","requireSelected","find","caller","callerOf","context","document","snapshot","mount","encoded","other","unmount","include","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","splice","idle","queueCmd","notifyClientRecords","onClientRecordsChange","fromEntries","admittedThrough","retain","newest","max","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","validateContexts","selected","through","first","s","validateContext","installContexts","contextChanged","admitFrame","fresh","durableNew","clientLoad","hostLoad","isSafeInteger","findLast","dur","admission","closePending","pending","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","Pick","restored","known","created","attaching","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","SocketHost","host","hibernatable","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","reviveValue","serveStream","serveFrames"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { contextValue, captureContext } from \"../wire/context\";\nimport { MAX_CONTEXT_BYTES } from \"../wire/limits\";\nimport { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n authorizedAt: number | undefined;\n leaseTimer: ReturnType<typeof setTimeout> | null;\n timedLease: boolean;\n lanes: Map<string, Lane>;\n contexts: Map<string, Statewire.Context>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n onIncludedChange:\n | ((included: readonly StatewireHostInternal.IncludedDocument[]) => void)\n | undefined;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n cmd: CmdStatement[];\n ctx?: { protocol: string; value: Statewire.Context }[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"cmd\" && key !== \"ctx\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"] ?? [];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (Object.hasOwn(frame, \"cmd\") && lane.length === 0)\n return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n const contexts = frame[\"ctx\"];\n const ctx: NonNullable<ParsedFrame[\"ctx\"]> = [];\n if (contexts !== undefined) {\n if (!Array.isArray(contexts) || contexts.length === 0)\n return violation(\"empty context lane\");\n const seen = new Set<string>();\n for (const entry of contexts) {\n if (\n !isPlainObject(entry) ||\n typeof entry[\"protocol\"] !== \"string\" ||\n !Object.hasOwn(entry, \"value\") ||\n Object.keys(entry).some(\n (key) => ![\"protocol\", \"value\", \"meta\"].includes(key),\n )\n )\n return violation(\"malformed context\");\n const protocol = entry[\"protocol\"];\n if (seen.has(protocol)) return violation(\"duplicate context protocol\");\n seen.add(protocol);\n if (\n frameEncoder.encode(JSON.stringify(entry)).byteLength >\n MAX_CONTEXT_BYTES\n )\n return violation(\"context entry too large\");\n try {\n ctx.push({\n protocol,\n value: contextValue({\n value: entry[\"value\"],\n ...(entry[\"meta\"] !== undefined && { meta: entry[\"meta\"] }),\n }),\n });\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n }\n if (cmd.length === 0 && ctx.length === 0) return violation(\"empty frame\");\n return { cmd, ...(ctx.length > 0 && { ctx }) };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n ...(failure.code !== undefined && { code: failure.code }),\n ...(message !== undefined && { message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n console.error(\"statewire command failed\", outcome.error);\n return {\n ...at,\n type: \"failed\",\n message: \"the command failed\",\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length ? 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 maxLeaseLifetimeMs: number | null;\n leaseTimers: boolean;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n if (conn.leaseTimer !== null) {\n clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst expiredAt = (h: SocketHostState, authorizedAt: number | undefined) => {\n const now = Date.now();\n return (\n authorizedAt === undefined ||\n !Number.isFinite(authorizedAt) ||\n authorizedAt < 0 ||\n authorizedAt > now ||\n (h.maxLeaseLifetimeMs !== null &&\n now - authorizedAt >= h.maxLeaseLifetimeMs)\n );\n};\n\nconst leaseExpiredFin = JSON.stringify({\n fin: { reason: \"reconnect\", code: \"lease-expired\" },\n});\n\nexport const expireLease = (h: SocketHostState, conn: Conn): boolean => {\n if (!conn.open || expiredAt(h, conn.authorizedAt)) {\n if (conn.open) {\n sendTo(h, conn, leaseExpiredFin);\n closeConn(h, conn, 1000, \"lease-expired\");\n }\n return true;\n }\n return false;\n};\n\nconst armLeaseTimer = (h: SocketHostState, conn: Conn) => {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n if (\n h.disposed ||\n h.maxLeaseLifetimeMs === null ||\n expireLease(h, conn) ||\n !conn.timedLease\n )\n return;\n const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);\n conn.leaseTimer = setTimeout(\n () => {\n conn.leaseTimer = null;\n if (!expireLease(h, conn)) armLeaseTimer(h, conn);\n },\n Math.min(delay, 2_147_483_647),\n );\n (conn.leaseTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs && !expireLease(h, conn))\n sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst notifyIncluded = (conn: Conn) =>\n conn.onIncludedChange?.(\n [...conn.included].map(\n (id) => JSON.parse(id) as StatewireHostInternal.IncludedDocument,\n ),\n );\n\nconst restoredIncluded = (\n included: readonly StatewireHostInternal.IncludedDocument[],\n): Set<string> =>\n new Set(\n included.map((entry) => {\n if (\n !Array.isArray(entry) ||\n entry.length !== 2 ||\n typeof entry[0] !== \"string\" ||\n !(\n entry[1] === null ||\n (Array.isArray(entry[1]) &&\n entry[1].every((part) => typeof part === \"string\"))\n )\n )\n throw new TypeError(\"statewire: invalid restored include\");\n return documentIdentity(entry[0], entry[1] ?? undefined);\n }),\n );\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n get caller() {\n return callerOf(h, h.clients.get(conn.clientId)!, conn);\n },\n context: (protocol) => {\n requireSelected(protocol);\n return captureContext(conn.contexts.get(protocol) ?? {});\n },\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n const id = documentIdentity(protocol, key);\n if (conn.included.has(id)) return;\n conn.included.add(id);\n notifyIncluded(conn);\n markViews(h);\n },\n exclude: (protocol, key) => {\n if (!conn.included.delete(documentIdentity(protocol, key))) return;\n notifyIncluded(conn);\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // One packet per flush: ops first, then applied entries, then verdicts.\n for (const conn of [...h.conns]) {\n if (!conn.ready || expireLease(h, conn)) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const cmd = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(cmd.length > 0 && { cmd }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (cmd.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n context: captureContext(conn.contexts.get(statement.protocol) ?? {}),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | { type: \"expired\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nconst validateContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const statement of frame.cmd) {\n if (!selects(conn, statement.protocol))\n return violation(\"unsupported protocol\");\n const selected = conn.selection.protocols.find(\n (p) => p.name === statement.protocol,\n )!;\n if (selected.record === \"ephemeral\") {\n const through = watermark(h, conn, statement.protocol);\n const first = frame.cmd.find(\n (s) => s.protocol === statement.protocol && s.seq > through,\n );\n if (first && first.seq !== through + 1)\n return violation(\"ephemeral lane gap\");\n }\n }\n for (const entry of frame.ctx ?? []) {\n if (!selects(conn, entry.protocol))\n return violation(\"unsupported context protocol\");\n try {\n h.current?.validateContext?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n } catch (error) {\n return violation(\n error instanceof Error ? error.message : \"invalid context\",\n );\n }\n }\n};\n\nconst installContexts = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n) => {\n for (const entry of frame.ctx ?? [])\n conn.contexts.set(entry.protocol, captureContext(entry.value));\n for (const entry of frame.ctx ?? [])\n h.current?.contextChanged?.(\n entry.protocol,\n captureContext(entry.value),\n conn.attach,\n );\n};\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n if (expireLease(h, conn)) return { type: \"expired\" };\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n if (expireLease(h, conn)) return { type: \"expired\" };\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null || expireLease(h, conn))\n return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n if (data === \"{}\") {\n if (conn.sawFrame) sendTo(h, conn, \"{}\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0 && !frame.ctx?.length) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n if (expiredAt(h, options.authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1000, \"lease-expired\");\n } catch {\n /* peer already gone */\n }\n return null;\n }\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n undefined,\n options.authorizedAt,\n { ...options, timedLease: h.leaseTimers },\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const authorizedAt = Date.now();\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection, authorizedAt);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n authorizedAt,\n {\n timedLease: h.leaseTimers,\n ...(options.onIncludedChange !== undefined && {\n onIncludedChange: options.onIncludedChange,\n }),\n },\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n authorizedAt?: number,\n included: Pick<\n StatewireHostInternal.SocketConnectOptions,\n \"included\" | \"onIncludedChange\"\n > & { timedLease?: boolean } = {},\n): Registration | null => {\n const restored = restoredIncluded(included.included ?? []);\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n if (expiredAt(h, authorizedAt)) {\n try {\n socket.send(leaseExpiredFin);\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"lease-expired\");\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n authorizedAt,\n leaseTimer: null,\n timedLease: included.timedLease ?? true,\n lanes: new Map(),\n contexts: new Map(),\n documents: new Map(),\n included: restored,\n onIncludedChange: included.onIncludedChange,\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n try {\n validateContexts(h, conn, frame);\n installContexts(h, conn, frame);\n h.current?.attaching?.(conn.attach);\n } catch (error) {\n const reason = violationReason(error);\n if (reason !== null) violate(h, conn, reason);\n else closeConn(h, conn, 1011, \"attach failed\");\n throw error;\n }\n gcClients(h);\n ensureHeartbeat(h);\n armLeaseTimer(h, conn);\n if (!conn.open) return null;\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n if (expireLease(h, conn)) return null;\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n ...(h.key !== undefined && { key: h.key }),\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n for (const conn of h.conns) armLeaseTimer(h, conn);\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n for (const conn of h.conns) {\n if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);\n conn.leaseTimer = null;\n }\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n key: undefined,\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n maxLeaseLifetimeMs: 86_400_000,\n leaseTimers: persistence?.hibernatable !== true,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n viewsDirty: false,\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.key = options?.key;\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n const maxLeaseLifetimeMs =\n options?.maxLeaseLifetimeMs === undefined\n ? 86_400_000\n : options.maxLeaseLifetimeMs;\n if (\n maxLeaseLifetimeMs !== null &&\n (!Number.isFinite(maxLeaseLifetimeMs) || maxLeaseLifetimeMs <= 0)\n ) {\n throw new TypeError(\n \"maxLeaseLifetimeMs must be finite and positive or null\",\n );\n }\n if (h.maxLeaseLifetimeMs !== maxLeaseLifetimeMs) {\n h.maxLeaseLifetimeMs = maxLeaseLifetimeMs;\n for (const conn of [...h.conns]) armLeaseTimer(h, conn);\n }\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
package/dist/host-internal.d.ts
CHANGED
|
@@ -69,6 +69,8 @@ export declare namespace StatewireHostInternal {
|
|
|
69
69
|
type SocketHostPersistence = {
|
|
70
70
|
clientRecords?: readonly ClientRecord[];
|
|
71
71
|
onClientRecordsChange?: (records: readonly ClientRecord[]) => void;
|
|
72
|
+
/** The adapter can evict the host while its WebSockets stay open: their leases arm no timer and are checked on every message, delivery and restore instead. */
|
|
73
|
+
hibernatable?: boolean;
|
|
72
74
|
};
|
|
73
75
|
type SocketHostOptions<TAuth = unknown> = {
|
|
74
76
|
protocol?: StatewireProtocol.Definition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-internal.d.ts","sourceRoot":"","sources":["../src/host-internal.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"host-internal.d.ts","sourceRoot":"","sources":["../src/host-internal.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/host/socket.ts
CHANGED
|
@@ -130,6 +130,7 @@ export type Conn = {
|
|
|
130
130
|
auth: unknown;
|
|
131
131
|
authorizedAt: number | undefined;
|
|
132
132
|
leaseTimer: ReturnType<typeof setTimeout> | null;
|
|
133
|
+
timedLease: boolean;
|
|
133
134
|
lanes: Map<string, Lane>;
|
|
134
135
|
contexts: Map<string, Statewire.Context>;
|
|
135
136
|
documents: Map<string, StatewireHost.Document>;
|
|
@@ -360,6 +361,7 @@ export type SocketHostState = {
|
|
|
360
361
|
wireVersion: StatewireProtocol.Range;
|
|
361
362
|
heartbeatMs: number;
|
|
362
363
|
maxLeaseLifetimeMs: number | null;
|
|
364
|
+
leaseTimers: boolean;
|
|
363
365
|
wsInitTimeoutMs: number;
|
|
364
366
|
maxSubscribers: number;
|
|
365
367
|
maxInflightCommands: number;
|
|
@@ -511,7 +513,12 @@ export const expireLease = (h: SocketHostState, conn: Conn): boolean => {
|
|
|
511
513
|
const armLeaseTimer = (h: SocketHostState, conn: Conn) => {
|
|
512
514
|
if (conn.leaseTimer !== null) clearTimeout(conn.leaseTimer);
|
|
513
515
|
conn.leaseTimer = null;
|
|
514
|
-
if (
|
|
516
|
+
if (
|
|
517
|
+
h.disposed ||
|
|
518
|
+
h.maxLeaseLifetimeMs === null ||
|
|
519
|
+
expireLease(h, conn) ||
|
|
520
|
+
!conn.timedLease
|
|
521
|
+
)
|
|
515
522
|
return;
|
|
516
523
|
const delay = h.maxLeaseLifetimeMs - (Date.now() - conn.authorizedAt!);
|
|
517
524
|
conn.leaseTimer = setTimeout(
|
|
@@ -543,7 +550,8 @@ const ensureHeartbeat = (h: SocketHostState) => {
|
|
|
543
550
|
h.heartbeatTimer = setInterval(() => {
|
|
544
551
|
const now = Date.now();
|
|
545
552
|
for (const conn of [...h.conns]) {
|
|
546
|
-
if (now - conn.lastSentAt >= h.heartbeatMs
|
|
553
|
+
if (now - conn.lastSentAt >= h.heartbeatMs && !expireLease(h, conn))
|
|
554
|
+
sendTo(h, conn, "{}");
|
|
547
555
|
}
|
|
548
556
|
}, h.heartbeatMs);
|
|
549
557
|
(h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();
|
|
@@ -785,7 +793,7 @@ export const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {
|
|
|
785
793
|
h.pendingCmds = new Map();
|
|
786
794
|
// One packet per flush: ops first, then applied entries, then verdicts.
|
|
787
795
|
for (const conn of [...h.conns]) {
|
|
788
|
-
if (!conn.ready) continue;
|
|
796
|
+
if (!conn.ready || expireLease(h, conn)) continue;
|
|
789
797
|
const forConn = (list: Cmd[] | undefined) =>
|
|
790
798
|
(list ?? []).filter((cmd) => selects(conn, cmd.protocol));
|
|
791
799
|
const ops = [
|
|
@@ -1377,7 +1385,7 @@ const connectAuthorized = (
|
|
|
1377
1385
|
options.selection,
|
|
1378
1386
|
undefined,
|
|
1379
1387
|
options.authorizedAt,
|
|
1380
|
-
options,
|
|
1388
|
+
{ ...options, timedLease: h.leaseTimers },
|
|
1381
1389
|
);
|
|
1382
1390
|
return registration?.connection ?? null;
|
|
1383
1391
|
}
|
|
@@ -1531,9 +1539,12 @@ const connectAuthorized = (
|
|
|
1531
1539
|
selection,
|
|
1532
1540
|
frame,
|
|
1533
1541
|
authorizedAt,
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1542
|
+
{
|
|
1543
|
+
timedLease: h.leaseTimers,
|
|
1544
|
+
...(options.onIncludedChange !== undefined && {
|
|
1545
|
+
onIncludedChange: options.onIncludedChange,
|
|
1546
|
+
}),
|
|
1547
|
+
},
|
|
1537
1548
|
);
|
|
1538
1549
|
} catch (error) {
|
|
1539
1550
|
if (violationReason(error) === null) throw error;
|
|
@@ -1600,7 +1611,7 @@ export const register = (
|
|
|
1600
1611
|
included: Pick<
|
|
1601
1612
|
StatewireHostInternal.SocketConnectOptions,
|
|
1602
1613
|
"included" | "onIncludedChange"
|
|
1603
|
-
> = {},
|
|
1614
|
+
> & { timedLease?: boolean } = {},
|
|
1604
1615
|
): Registration | null => {
|
|
1605
1616
|
const restored = restoredIncluded(included.included ?? []);
|
|
1606
1617
|
const refuse = (code: number, reason: string) => {
|
|
@@ -1676,6 +1687,7 @@ export const register = (
|
|
|
1676
1687
|
auth,
|
|
1677
1688
|
authorizedAt,
|
|
1678
1689
|
leaseTimer: null,
|
|
1690
|
+
timedLease: included.timedLease ?? true,
|
|
1679
1691
|
lanes: new Map(),
|
|
1680
1692
|
contexts: new Map(),
|
|
1681
1693
|
documents: new Map(),
|
|
@@ -1858,6 +1870,7 @@ const useSocketHost = (
|
|
|
1858
1870
|
wireVersion: { version: WIRE_VERSION },
|
|
1859
1871
|
heartbeatMs: 15_000,
|
|
1860
1872
|
maxLeaseLifetimeMs: 86_400_000,
|
|
1873
|
+
leaseTimers: persistence?.hibernatable !== true,
|
|
1861
1874
|
wsInitTimeoutMs: 5_000,
|
|
1862
1875
|
maxSubscribers: MAX_SUBSCRIBERS,
|
|
1863
1876
|
maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,
|
package/src/host-internal.ts
CHANGED
|
@@ -86,6 +86,8 @@ export namespace StatewireHostInternal {
|
|
|
86
86
|
export type SocketHostPersistence = {
|
|
87
87
|
clientRecords?: readonly ClientRecord[];
|
|
88
88
|
onClientRecordsChange?: (records: readonly ClientRecord[]) => void;
|
|
89
|
+
/** The adapter can evict the host while its WebSockets stay open: their leases arm no timer and are checked on every message, delivery and restore instead. */
|
|
90
|
+
hibernatable?: boolean;
|
|
89
91
|
};
|
|
90
92
|
|
|
91
93
|
export type SocketHostOptions<TAuth = unknown> = {
|