statewire 0.17.0 → 0.17.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/client/connection.js +3 -2
- package/dist/client/connection.js.map +1 -1
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +6 -5
- package/dist/client/session.js.map +1 -1
- package/dist/document.d.ts +25 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +88 -0
- package/dist/document.js.map +1 -0
- package/dist/host/draft.js +1 -1
- package/dist/host/socket.d.ts +2 -2
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +5 -5
- package/dist/host/socket.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/wire/documents.js +3 -3
- package/dist/wire/documents.js.map +1 -1
- package/dist/wire/meta.d.ts +3 -18
- package/dist/wire/meta.d.ts.map +1 -1
- package/dist/wire/meta.js +8 -57
- package/dist/wire/meta.js.map +1 -1
- package/dist/wire/ops.js +1 -1
- package/package.json +1 -1
- package/src/client/session.ts +4 -8
- package/src/document.ts +185 -0
- package/src/host/socket.ts +8 -7
- package/src/index.ts +2 -0
- package/src/wire/meta.ts +11 -94
package/dist/host/socket.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { encodeDocument, reviveDocumentValue } from "../document.js";
|
|
1
2
|
import { DEFAULT_PROTOCOL, WIRE_VERSION, negotiateProtocols } from "../wire/protocol.js";
|
|
2
|
-
import { encodeValue, reviveValue } from "../wire/meta.js";
|
|
3
3
|
import { applyDocumentOps, mainDocument } from "../wire/documents.js";
|
|
4
4
|
import { StatewireSendError } from "../types.js";
|
|
5
5
|
import { getCommandsHost, getStateHost } from "./host.js";
|
|
@@ -104,7 +104,7 @@ const parseFrame = (raw) => {
|
|
|
104
104
|
const frameIsOversized = (raw) => raw.length > 8388608 || frameEncoder.encode(raw).byteLength > 8388608;
|
|
105
105
|
const encodePayload = (payload) => {
|
|
106
106
|
if (payload === void 0) return {};
|
|
107
|
-
const { value, meta } =
|
|
107
|
+
const { value, meta } = encodeDocument(payload);
|
|
108
108
|
return {
|
|
109
109
|
payload: value,
|
|
110
110
|
...meta !== void 0 && { meta }
|
|
@@ -176,7 +176,7 @@ const scheduleFlush = (h) => {
|
|
|
176
176
|
};
|
|
177
177
|
const recordOp = (h, op) => {
|
|
178
178
|
if (op.op === "replace" || op.op === "add") {
|
|
179
|
-
const { value, meta } =
|
|
179
|
+
const { value, meta } = encodeDocument(op.value);
|
|
180
180
|
h.pendingOps.push({
|
|
181
181
|
...op,
|
|
182
182
|
value,
|
|
@@ -399,7 +399,7 @@ const admitCmd = (h, rec, statement, auth, selection) => {
|
|
|
399
399
|
}
|
|
400
400
|
let params = statement.params;
|
|
401
401
|
if (statement.meta !== void 0) try {
|
|
402
|
-
params =
|
|
402
|
+
params = reviveDocumentValue(params, statement.meta, { rejectUnknown: true });
|
|
403
403
|
} catch (error) {
|
|
404
404
|
rejectStatement(h, rec, adm, `invalid params: ${error.message}`);
|
|
405
405
|
return;
|
|
@@ -802,7 +802,7 @@ const register = (h, clientId, socket, sawFrame = false, auth = void 0, selectio
|
|
|
802
802
|
gcClients(h);
|
|
803
803
|
notifyClientRecords(h);
|
|
804
804
|
ensureHeartbeat(h);
|
|
805
|
-
const { value, meta } =
|
|
805
|
+
const { value, meta } = encodeDocument(h.stateHost.snapshot());
|
|
806
806
|
const hello = {
|
|
807
807
|
ops: [{
|
|
808
808
|
op: "mount",
|
package/dist/host/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","names":["DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","applyDocumentOps","mainDocument","StatewireDocuments","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","encodeValue","reviveValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_CONTEXT_VALUE_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireMetaEntry","StatewirePath","StatewireCmd","StatewireEnvelope","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","WireOp","op","path","value","meta","Admission","seq","method","applied","appliedSent","settled","ClientRec","id","lastSeq","ctxSeq","touched","context","contextDocuments","State","results","Map","ts","cmd","inflight","principal","Conn","selection","Selection","clientId","socket","Socket","open","sawFrame","lastSentAt","lease","auth","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CtxStatement","ops","CmdStatement","protocol","params","ParsedFrame","ctx","isPlainObject","parseLane","statements","prev","statement","Number","isInteger","push","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","undefined","lane","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","type","failure","fate","code","String","parseInitialFrame","headers","lanes","Response","status","values","some","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","Set","pendingConns","pendingOps","pendingApplied","pendingCmds","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","recordOp","attach","next","nextState","state","nextCommands","commands","submit","setOnOp","closeConn","conn","delete","close","size","clearInterval","sendTo","data","now","send","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","idleLevel","work","isIdle","rec","flush","takeChanged","queueApplied","level","edge","cmds","appliedEntries","get","map","packet","protocols","p","idle","verdicts","dur","list","set","queueCmd","notifyClientRecords","onClientRecordsChange","admittedThrough","documents","entry","retain","newest","Math","max","min","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","admitFrame","version","through","ctxNew","s","cmdNew","hostCommandLoad","client","isSafeInteger","TypeError","at","first","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","has","add","fromEntries","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","splice","gcClients","excess","changed","live","oldest","Registration","known","created","mode","snapshot","hello","main","abort","resume","suspend","restoreClientRecords","records","ClientRecord","record","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","unmount"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { applyDocumentOps, mainDocument } from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { encodeValue, reviveValue } from \"../wire/meta\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_CONTEXT_VALUE_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireMetaEntry } from \"../wire/meta\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport type { StatewireCmd, StatewireEnvelope } from \"../client/connection\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype WireOp = {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireMetaEntry[];\n};\n\ntype Admission = {\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\nexport type ClientRec = {\n id: string;\n lastSeq: number;\n ctxSeq: number;\n touched: number;\n context: Record<string, unknown> | null;\n contextDocuments: StatewireDocuments.State;\n results: Map<number, { ts: number; cmd: StatewireCmd }>;\n inflight: Map<number, Admission>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CtxStatement = { seq: number; ops: unknown[] };\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n ctx: CtxStatement[];\n cmd: CmdStatement[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseLane = (value: unknown): Record<string, unknown>[] => {\n if (!Array.isArray(value)) return violation(\"malformed frame\");\n if (value.length === 0) return violation(\"empty lane\");\n const statements: Record<string, unknown>[] = [];\n let prev: number | null = null;\n for (const statement of value) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n if (typeof seq !== \"number\" || !Number.isInteger(seq) || seq < 1) {\n return violation(\"malformed statement\");\n }\n if (prev !== null && seq !== prev + 1) return violation(\"malformed frame\");\n prev = seq;\n statements.push(statement);\n }\n return statements;\n};\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"ctx\" && key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const ctx: CtxStatement[] = [];\n if (frame[\"ctx\"] !== undefined) {\n const lane = frame[\"ctx\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many context statements\");\n }\n for (const statement of parseLane(lane)) {\n const ops = statement[\"ops\"];\n if (!Array.isArray(ops) || !ops.length)\n return violation(\"invalid-context\");\n if (\n frameEncoder.encode(JSON.stringify(ops)).byteLength >\n MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n ctx.push({ seq: statement[\"seq\"] as number, ops });\n }\n }\n const cmd: CmdStatement[] = [];\n if (frame[\"cmd\"] !== undefined) {\n const lane = frame[\"cmd\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many commands\");\n }\n for (const statement of parseLane(lane)) {\n const method = statement[\"method\"];\n if (\n typeof method !== \"string\" ||\n typeof statement[\"protocol\"] !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n cmd.push({\n protocol: statement[\"protocol\"] as string,\n seq: statement[\"seq\"] as number,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n }\n return { ctx, cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireMetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeValue(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): StatewireCmd => {\n if (outcome.type === \"accepted\") {\n return { seq: adm.seq, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { seq: adm.seq, type: \"crashed\" };\n case \"failed\":\n return {\n seq: adm.seq,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n seq: adm.seq,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n seq: adm.seq,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n seq: adm.seq,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length\n ? parseFrameValue(lanes)\n : { ctx: [], cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, number[]>;\n pendingCmds: Map<string, StatewireCmd[]>;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeValue(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const rec of h.clients.values()) {\n if (rec.inflight.size > 0) return false;\n }\n return true;\n};\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const rec of h.clients.values()) {\n for (const adm of rec.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, rec.id, adm.seq);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n fin === undefined &&\n !edge\n ) {\n return;\n }\n h.idleWire = level;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const ops = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n const appliedEntries: StatewireCmd[] = (\n applied.get(conn.clientId) ?? []\n ).map((seq) => ({ seq, type: \"applied\" }));\n if (ops.length > 0) {\n const packet: StatewireEnvelope = {\n ops: conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? ops\n : [],\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n };\n sendTo(h, conn, JSON.stringify(packet));\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = (cmds.get(conn.clientId) ?? []).map((cmd) =>\n conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? cmd\n : { seq: cmd.seq, ...(cmd.dur === undefined ? {} : { dur: cmd.dur }) },\n );\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, clientId: string, seq: number) => {\n const list = h.pendingApplied.get(clientId);\n if (list) list.push(seq);\n else h.pendingApplied.set(clientId, [seq]);\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, clientId: string, cmd: StatewireCmd) => {\n const list = h.pendingCmds.get(clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(clientId, [cmd]);\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n lastSeq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n touched: rec.touched,\n context: rec.context,\n contextDocuments: [...rec.contextDocuments.documents],\n results: [...rec.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (rec: ClientRec, cmd: StatewireCmd) => {\n const now = Date.now();\n rec.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...rec.results.keys());\n for (const [seq, entry] of rec.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n rec.results.delete(seq);\n }\n }\n while (rec.results.size > RESULT_LIMIT) {\n rec.results.delete(Math.min(...rec.results.keys()));\n }\n};\n\n/** Cmd-lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (rec: ClientRec): number =>\n Math.max(rec.lastSeq, ...rec.inflight.keys());\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, rec: ClientRec, seq: number) => {\n const cached = rec.results.get(seq);\n if (cached) {\n const newest = Math.max(...rec.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, rec.id, cached.cmd);\n return;\n }\n rec.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = rec.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, rec.id, seq);\n return;\n }\n queueCmd(h, rec.id, { seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n cmd: StatewireCmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n rec.inflight.delete(adm.seq);\n retain(rec, cmd);\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, rec.id, cmd);\n notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, rec, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n auth: unknown,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth,\n get context() {\n return rec.context;\n },\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n rec: ClientRec,\n statement: CmdStatement,\n auth: unknown,\n selection: StatewireProtocol.Selection,\n) => {\n const adm: Admission = {\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n rec.inflight.set(statement.seq, adm);\n notifyClientRecords(h);\n if (\n statement.protocol !== h.protocol.name ||\n !selection.protocols.some((p) => p.name === statement.protocol)\n ) {\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"unsupported-protocol\",\n message: \"command protocol was not negotiated\",\n });\n return;\n }\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, rec, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n rec,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, rec, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, rec, adm, { seq: adm.seq, type: \"result\", payload: names });\n return;\n }\n h.commandsHost!.submit!({\n method: statement.method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, auth),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, rec, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, rec, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, both lanes: absorbed statements answer from the record,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating both watermarks, nothing consumed. A gap is never a close.\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { seq: number; ctxSeq: number; retry?: number };\n };\n };\n\nexport const admitFrame = (\n h: SocketHostState,\n rec: ClientRec,\n frame: ParsedFrame,\n auth: unknown,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): FrameAdmission => {\n rec.touched = Date.now();\n const through = admittedThrough(rec);\n for (const statement of frame.cmd) {\n if (statement.seq <= through) reemit(h, rec, statement.seq);\n }\n const ctxNew = frame.ctx.filter((s) => s.seq > rec.ctxSeq);\n const cmdNew = frame.cmd.filter((s) => s.seq > through);\n if (\n (ctxNew.length > 0 && ctxNew[0]!.seq !== rec.ctxSeq + 1) ||\n (cmdNew.length > 0 && cmdNew[0]!.seq !== through + 1)\n ) {\n notifyClientRecords(h);\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq } },\n };\n }\n if (cmdNew.length > 0) {\n let hostCommandLoad = 0;\n for (const client of h.clients.values()) {\n hostCommandLoad += client.inflight.size;\n }\n if (\n rec.inflight.size + cmdNew.length > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostCommandLoad + cmdNew.length > h.maxInflightCommands\n ) {\n return {\n type: \"refused\",\n syn: {\n syn: {\n seq: through,\n ctxSeq: rec.ctxSeq,\n retry: COMMAND_CAPACITY_RETRY_MS,\n },\n },\n };\n }\n }\n if ((ctxNew.length || cmdNew.length) && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq, retry } },\n };\n }\n }\n let contextDocuments = rec.contextDocuments;\n try {\n for (const statement of ctxNew)\n contextDocuments = applyDocumentOps(\n contextDocuments,\n statement.ops,\n selection.protocols,\n true,\n );\n if (\n frameEncoder.encode(JSON.stringify([...contextDocuments.documents]))\n .byteLength > MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n } catch {\n return violation(\"invalid-context\");\n }\n rec.contextDocuments = contextDocuments;\n rec.context = (mainDocument(contextDocuments, h.protocol.name)?.value ??\n null) as Record<string, unknown> | null;\n if (ctxNew.length) rec.ctxSeq = ctxNew.at(-1)!.seq;\n for (const statement of cmdNew) admitCmd(h, rec, statement, auth, selection);\n if (cmdNew.length > 0) {\n // Memory host: admitted means retained — dur rides the admitting flush.\n queueCmd(h, rec.id, { seq: cmdNew.at(-1)!.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let frame: ParsedFrame;\n try {\n frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (frame.ctx.length === 0 && frame.cmd.length === 0) return;\n const rec = h.clients.get(conn.clientId)!;\n let admission: ReturnType<typeof admitFrame>;\n try {\n admission = admitFrame(h, rec, frame, conn.auth, conn.selection);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n const registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n );\n if (registration === null) return;\n pending.connection = registration.connection;\n if (frame.ctx.length || frame.cmd.length) {\n message(\n h,\n registration.conn,\n JSON.stringify({\n ...(frame.ctx.length ? { ctx: frame.ctx } : {}),\n ...(frame.cmd.length ? { cmd: frame.cmd } : {}),\n }),\n );\n }\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (live.has(rec.id) || rec.inflight.size > 0) continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n rec: ClientRec;\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n lastSeq: 0,\n ctxSeq: 0,\n touched: Date.now(),\n context: null,\n contextDocuments: { mode: \"mounted\", documents: new Map() },\n results: new Map(),\n inflight: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n };\n h.conns.add(conn);\n gcClients(h);\n notifyClientRecords(h);\n ensureHeartbeat(h);\n const { value, meta } = encodeValue(h.stateHost!.snapshot());\n const hello: StatewireEnvelope = {\n ops: [\n {\n op: \"mount\",\n protocol: h.protocol.name,\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n },\n ],\n syn: {\n ...selection,\n seq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n ...(h.idleWire && { idle: true }),\n },\n };\n if (!selection.protocols.some((p) => p.name === h.protocol.name))\n hello.ops = [];\n sendTo(h, conn, JSON.stringify(hello));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { rec, conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n ...record,\n contextDocuments: {\n mode: \"mounted\",\n documents: new Map(record.contextDocuments ?? []),\n },\n results: new Map(\n record.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * statement-lane client frames under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id, idle edges, and `fin` on\n * finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"socket.js","names":["encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","applyDocumentOps","mainDocument","StatewireDocuments","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_CONTEXT_VALUE_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","StatewireCmd","StatewireEnvelope","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","WireOp","op","path","value","meta","MetaEntry","Admission","seq","method","applied","appliedSent","settled","ClientRec","id","lastSeq","ctxSeq","touched","context","contextDocuments","State","results","Map","ts","cmd","inflight","principal","Conn","selection","Selection","clientId","socket","Socket","open","sawFrame","lastSentAt","lease","auth","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CtxStatement","ops","CmdStatement","protocol","params","ParsedFrame","ctx","isPlainObject","parseLane","statements","prev","statement","Number","isInteger","push","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","undefined","lane","encode","JSON","stringify","byteLength","parseFrame","raw","parse","frameIsOversized","encodePayload","payload","cmdOf","adm","outcome","type","failure","fate","code","String","parseInitialFrame","headers","lanes","Response","status","values","some","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","Set","pendingConns","pendingOps","pendingApplied","pendingCmds","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","recordOp","attach","next","nextState","state","nextCommands","commands","submit","setOnOp","closeConn","conn","delete","close","size","clearInterval","sendTo","data","now","send","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","idleLevel","work","isIdle","rec","flush","takeChanged","queueApplied","level","edge","cmds","appliedEntries","get","map","packet","protocols","p","idle","verdicts","dur","list","set","queueCmd","notifyClientRecords","onClientRecordsChange","admittedThrough","documents","entry","retain","newest","Math","max","min","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","admitFrame","version","through","ctxNew","s","cmdNew","hostCommandLoad","client","isSafeInteger","TypeError","at","first","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","has","add","fromEntries","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","splice","gcClients","excess","changed","live","oldest","Registration","known","created","mode","snapshot","hello","main","abort","resume","suspend","restoreClientRecords","records","ClientRecord","record","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose","unmount"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { applyDocumentOps, mainDocument } from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_CONTEXT_VALUE_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport type { StatewireCmd, StatewireEnvelope } from \"../client/connection\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype WireOp = {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n};\n\ntype Admission = {\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\nexport type ClientRec = {\n id: string;\n lastSeq: number;\n ctxSeq: number;\n touched: number;\n context: Record<string, unknown> | null;\n contextDocuments: StatewireDocuments.State;\n results: Map<number, { ts: number; cmd: StatewireCmd }>;\n inflight: Map<number, Admission>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CtxStatement = { seq: number; ops: unknown[] };\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = {\n ctx: CtxStatement[];\n cmd: CmdStatement[];\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst parseLane = (value: unknown): Record<string, unknown>[] => {\n if (!Array.isArray(value)) return violation(\"malformed frame\");\n if (value.length === 0) return violation(\"empty lane\");\n const statements: Record<string, unknown>[] = [];\n let prev: number | null = null;\n for (const statement of value) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n if (typeof seq !== \"number\" || !Number.isInteger(seq) || seq < 1) {\n return violation(\"malformed statement\");\n }\n if (prev !== null && seq !== prev + 1) return violation(\"malformed frame\");\n prev = seq;\n statements.push(statement);\n }\n return statements;\n};\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"ctx\" && key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const ctx: CtxStatement[] = [];\n if (frame[\"ctx\"] !== undefined) {\n const lane = frame[\"ctx\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many context statements\");\n }\n for (const statement of parseLane(lane)) {\n const ops = statement[\"ops\"];\n if (!Array.isArray(ops) || !ops.length)\n return violation(\"invalid-context\");\n if (\n frameEncoder.encode(JSON.stringify(ops)).byteLength >\n MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n ctx.push({ seq: statement[\"seq\"] as number, ops });\n }\n }\n const cmd: CmdStatement[] = [];\n if (frame[\"cmd\"] !== undefined) {\n const lane = frame[\"cmd\"];\n if (Array.isArray(lane) && lane.length > MAX_COMMANDS_PER_FRAME) {\n return violation(\"too many commands\");\n }\n for (const statement of parseLane(lane)) {\n const method = statement[\"method\"];\n if (\n typeof method !== \"string\" ||\n typeof statement[\"protocol\"] !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n cmd.push({\n protocol: statement[\"protocol\"] as string,\n seq: statement[\"seq\"] as number,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n }\n return { ctx, cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): StatewireCmd => {\n if (outcome.type === \"accepted\") {\n return { seq: adm.seq, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { seq: adm.seq, type: \"crashed\" };\n case \"failed\":\n return {\n seq: adm.seq,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n seq: adm.seq,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n seq: adm.seq,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n seq: adm.seq,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length\n ? parseFrameValue(lanes)\n : { ctx: [], cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, number[]>;\n pendingCmds: Map<string, StatewireCmd[]>;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const rec of h.clients.values()) {\n if (rec.inflight.size > 0) return false;\n }\n return true;\n};\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const rec of h.clients.values()) {\n for (const adm of rec.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, rec.id, adm.seq);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n fin === undefined &&\n !edge\n ) {\n return;\n }\n h.idleWire = level;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const ops = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n const appliedEntries: StatewireCmd[] = (\n applied.get(conn.clientId) ?? []\n ).map((seq) => ({ seq, type: \"applied\" }));\n if (ops.length > 0) {\n const packet: StatewireEnvelope = {\n ops: conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? ops\n : [],\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n };\n sendTo(h, conn, JSON.stringify(packet));\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = (cmds.get(conn.clientId) ?? []).map((cmd) =>\n conn.selection.protocols.some((p) => p.name === h.protocol.name)\n ? cmd\n : { seq: cmd.seq, ...(cmd.dur === undefined ? {} : { dur: cmd.dur }) },\n );\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, clientId: string, seq: number) => {\n const list = h.pendingApplied.get(clientId);\n if (list) list.push(seq);\n else h.pendingApplied.set(clientId, [seq]);\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, clientId: string, cmd: StatewireCmd) => {\n const list = h.pendingCmds.get(clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(clientId, [cmd]);\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n lastSeq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n touched: rec.touched,\n context: rec.context,\n contextDocuments: [...rec.contextDocuments.documents],\n results: [...rec.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (rec: ClientRec, cmd: StatewireCmd) => {\n const now = Date.now();\n rec.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...rec.results.keys());\n for (const [seq, entry] of rec.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n rec.results.delete(seq);\n }\n }\n while (rec.results.size > RESULT_LIMIT) {\n rec.results.delete(Math.min(...rec.results.keys()));\n }\n};\n\n/** Cmd-lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (rec: ClientRec): number =>\n Math.max(rec.lastSeq, ...rec.inflight.keys());\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, rec: ClientRec, seq: number) => {\n const cached = rec.results.get(seq);\n if (cached) {\n const newest = Math.max(...rec.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, rec.id, cached.cmd);\n return;\n }\n rec.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = rec.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, rec.id, seq);\n return;\n }\n queueCmd(h, rec.id, { seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n cmd: StatewireCmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n rec.inflight.delete(adm.seq);\n retain(rec, cmd);\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, rec.id, cmd);\n notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, rec, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n auth: unknown,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth,\n get context() {\n return rec.context;\n },\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n rec: ClientRec,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n rec: ClientRec,\n statement: CmdStatement,\n auth: unknown,\n selection: StatewireProtocol.Selection,\n) => {\n const adm: Admission = {\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n rec.inflight.set(statement.seq, adm);\n notifyClientRecords(h);\n if (\n statement.protocol !== h.protocol.name ||\n !selection.protocols.some((p) => p.name === statement.protocol)\n ) {\n settleCmd(h, rec, adm, {\n seq: adm.seq,\n type: \"rejected\",\n code: \"unsupported-protocol\",\n message: \"command protocol was not negotiated\",\n });\n return;\n }\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, rec, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n rec,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, rec, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, rec, adm, { seq: adm.seq, type: \"result\", payload: names });\n return;\n }\n h.commandsHost!.submit!({\n method: statement.method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, auth),\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n rec.lastSeq = Math.max(rec.lastSeq, adm.seq);\n notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, rec, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, rec, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, both lanes: absorbed statements answer from the record,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating both watermarks, nothing consumed. A gap is never a close.\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { seq: number; ctxSeq: number; retry?: number };\n };\n };\n\nexport const admitFrame = (\n h: SocketHostState,\n rec: ClientRec,\n frame: ParsedFrame,\n auth: unknown,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): FrameAdmission => {\n rec.touched = Date.now();\n const through = admittedThrough(rec);\n for (const statement of frame.cmd) {\n if (statement.seq <= through) reemit(h, rec, statement.seq);\n }\n const ctxNew = frame.ctx.filter((s) => s.seq > rec.ctxSeq);\n const cmdNew = frame.cmd.filter((s) => s.seq > through);\n if (\n (ctxNew.length > 0 && ctxNew[0]!.seq !== rec.ctxSeq + 1) ||\n (cmdNew.length > 0 && cmdNew[0]!.seq !== through + 1)\n ) {\n notifyClientRecords(h);\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq } },\n };\n }\n if (cmdNew.length > 0) {\n let hostCommandLoad = 0;\n for (const client of h.clients.values()) {\n hostCommandLoad += client.inflight.size;\n }\n if (\n rec.inflight.size + cmdNew.length > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostCommandLoad + cmdNew.length > h.maxInflightCommands\n ) {\n return {\n type: \"refused\",\n syn: {\n syn: {\n seq: through,\n ctxSeq: rec.ctxSeq,\n retry: COMMAND_CAPACITY_RETRY_MS,\n },\n },\n };\n }\n }\n if ((ctxNew.length || cmdNew.length) && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return {\n type: \"refused\",\n syn: { syn: { seq: through, ctxSeq: rec.ctxSeq, retry } },\n };\n }\n }\n let contextDocuments = rec.contextDocuments;\n try {\n for (const statement of ctxNew)\n contextDocuments = applyDocumentOps(\n contextDocuments,\n statement.ops,\n selection.protocols,\n true,\n );\n if (\n frameEncoder.encode(JSON.stringify([...contextDocuments.documents]))\n .byteLength > MAX_CONTEXT_VALUE_BYTES\n )\n return violation(\"oversized-context\");\n } catch {\n return violation(\"invalid-context\");\n }\n rec.contextDocuments = contextDocuments;\n rec.context = (mainDocument(contextDocuments, h.protocol.name)?.value ??\n null) as Record<string, unknown> | null;\n if (ctxNew.length) rec.ctxSeq = ctxNew.at(-1)!.seq;\n for (const statement of cmdNew) admitCmd(h, rec, statement, auth, selection);\n if (cmdNew.length > 0) {\n // Memory host: admitted means retained — dur rides the admitting flush.\n queueCmd(h, rec.id, { seq: cmdNew.at(-1)!.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let frame: ParsedFrame;\n try {\n frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (frame.ctx.length === 0 && frame.cmd.length === 0) return;\n const rec = h.clients.get(conn.clientId)!;\n let admission: ReturnType<typeof admitFrame>;\n try {\n admission = admitFrame(h, rec, frame, conn.auth, conn.selection);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n const registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n );\n if (registration === null) return;\n pending.connection = registration.connection;\n if (frame.ctx.length || frame.cmd.length) {\n message(\n h,\n registration.conn,\n JSON.stringify({\n ...(frame.ctx.length ? { ctx: frame.ctx } : {}),\n ...(frame.cmd.length ? { cmd: frame.cmd } : {}),\n }),\n );\n }\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (live.has(rec.id) || rec.inflight.size > 0) continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n rec: ClientRec;\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n lastSeq: 0,\n ctxSeq: 0,\n touched: Date.now(),\n context: null,\n contextDocuments: { mode: \"mounted\", documents: new Map() },\n results: new Map(),\n inflight: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n };\n h.conns.add(conn);\n gcClients(h);\n notifyClientRecords(h);\n ensureHeartbeat(h);\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n const hello: StatewireEnvelope = {\n ops: [\n {\n op: \"mount\",\n protocol: h.protocol.name,\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n },\n ],\n syn: {\n ...selection,\n seq: admittedThrough(rec),\n ctxSeq: rec.ctxSeq,\n ...(h.idleWire && { idle: true }),\n },\n };\n if (!selection.protocols.some((p) => p.name === h.protocol.name))\n hello.ops = [];\n sendTo(h, conn, JSON.stringify(hello));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { rec, conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n ...record,\n contextDocuments: {\n mode: \"mounted\",\n documents: new Map(record.contextDocuments ?? []),\n },\n results: new Map(\n record.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * statement-lane client frames under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id, idle edges, and `fin` on\n * finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,6 @@ import { StatewireProtocol } from "./wire/protocol.js";
|
|
|
3
3
|
import { StatewireHttp } from "./transports/sse.js";
|
|
4
4
|
import { StatewireClient, StatewireResource, useStatewire } from "./statewire.js";
|
|
5
5
|
import { Statewire, StatewireSendError } from "./types.js";
|
|
6
|
+
import { StatewireDocument, decodeDocument, encodeDocument } from "./document.js";
|
|
6
7
|
import { StatewireWebsocket } from "./transports/ws.js";
|
|
7
|
-
export { type Statewire, StatewireClient, type StatewireDocuments, StatewireHttp, type StatewireProtocol, StatewireResource, StatewireSendError, StatewireWebsocket, useStatewire };
|
|
8
|
+
export { type Statewire, StatewireClient, type StatewireDocument, type StatewireDocuments, StatewireHttp, type StatewireProtocol, StatewireResource, StatewireSendError, StatewireWebsocket, decodeDocument, encodeDocument, useStatewire };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { decodeDocument, encodeDocument } from "./document.js";
|
|
1
2
|
import { StatewireSendError } from "./types.js";
|
|
2
3
|
import { StatewireClient, StatewireResource, useStatewire } from "./statewire.js";
|
|
3
4
|
import { StatewireHttp } from "./transports/sse.js";
|
|
4
5
|
import { StatewireWebsocket } from "./transports/ws.js";
|
|
5
|
-
export { StatewireClient, StatewireHttp, StatewireResource, StatewireSendError, StatewireWebsocket, useStatewire };
|
|
6
|
+
export { StatewireClient, StatewireHttp, StatewireResource, StatewireSendError, StatewireWebsocket, decodeDocument, encodeDocument, useStatewire };
|
package/dist/wire/documents.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { reviveDocumentValue } from "../document.js";
|
|
1
2
|
import { protocolToken } from "./protocol.js";
|
|
2
3
|
import { applyOps } from "./ops.js";
|
|
3
|
-
import { reviveValue } from "./meta.js";
|
|
4
4
|
//#region src/wire/documents.ts
|
|
5
5
|
const invalid = (message) => {
|
|
6
6
|
throw new Error(`statewire: protocol error: ${message}`);
|
|
@@ -50,7 +50,7 @@ const applyDocumentOps = (previous, ops, protocols, strict = false) => {
|
|
|
50
50
|
key: op.key === void 0 ? null : op.key,
|
|
51
51
|
...op.protocol === void 0 ? {} : { protocol: op.protocol },
|
|
52
52
|
...op.main === void 0 ? {} : { main: op.main },
|
|
53
|
-
value: op.meta === void 0 ? op.value :
|
|
53
|
+
value: op.meta === void 0 ? op.value : reviveDocumentValue(op.value, op.meta, { rejectUnknown: strict })
|
|
54
54
|
});
|
|
55
55
|
if (doc === 0) changedPaths.push([]);
|
|
56
56
|
} else if (op.op === "unmount") {
|
|
@@ -65,7 +65,7 @@ const applyDocumentOps = (previous, ops, protocols, strict = false) => {
|
|
|
65
65
|
if (!Array.isArray(op.path) || !op.path.every((part) => typeof part === "string" || typeof part === "number" && Number.isSafeInteger(part) && part >= 0)) invalid("operation requires a valid path");
|
|
66
66
|
if (op.op !== "remove" && !("value" in op)) invalid("operation requires a value");
|
|
67
67
|
const { doc: _doc, meta, ...mutation } = op;
|
|
68
|
-
if (meta !== void 0) mutation.value =
|
|
68
|
+
if (meta !== void 0) mutation.value = reviveDocumentValue(mutation.value, meta, { rejectUnknown: strict });
|
|
69
69
|
const applied = applyOps(document.value, [mutation]);
|
|
70
70
|
documents.set(doc, {
|
|
71
71
|
...document,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.js","names":["applyOps","reviveValue","protocolToken","StatewirePath","StatewireDocuments","CacheEntry","version","value","Storage","namespace","load","identity","save","entry","subscribe","listener","Source","get","protocol","key","prefix","list","ReadonlyMap","Document","main","State","mode","documents","invalid","message","Error","applyDocumentOps","previous","ops","protocols","name","strict","undefined","length","Map","changedPaths","raw","Array","isArray","op","Record","doc","Number","isSafeInteger","includes","_doc","unknown","path","set","has","every","test","some","p","values","d","JSON","stringify","meta","rejectUnknown","push","document","delete","part","mutation","applied","state","mainDocument","find","resolveDocumentKey","slice","findDocument","resolved"],"sources":["../../src/wire/documents.ts"],"sourcesContent":["import { applyOps } from \"./ops\";\nimport { reviveValue } from \"./meta\";\nimport { protocolToken } from \"./protocol\";\nimport type { StatewirePath } from \"./ops\";\n\nexport namespace StatewireDocuments {\n export type CacheEntry = { version: string; value: unknown };\n export type Storage = {\n namespace?: string;\n load: (identity: readonly string[]) => CacheEntry | undefined;\n save: (identity: readonly string[], entry: CacheEntry) => void;\n subscribe?: (listener: () => void) => () => void;\n };\n export type Source = {\n get: (\n protocol: string,\n key?: readonly string[],\n prefix?: readonly string[],\n ) => unknown;\n list: () => ReadonlyMap<number, Document>;\n subscribe: (listener: () => void) => () => void;\n };\n export type Document = {\n key: readonly string[] | null;\n protocol?: string;\n main?: boolean;\n value: unknown;\n };\n export type State = {\n mode: \"mounted\" | \"keyless\" | null;\n documents: ReadonlyMap<number, Document>;\n };\n}\n\nconst invalid: (message: string) => never = (message) => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nexport const applyDocumentOps = (\n previous: StatewireDocuments.State,\n ops: readonly unknown[],\n protocols?: readonly { name: string; version: string }[],\n strict = false,\n) => {\n let mode =\n previous.mode ??\n (protocols !== undefined && ops.length === 0 ? \"mounted\" : null);\n const documents = new Map(previous.documents);\n const changedPaths: StatewirePath[] = [];\n for (const raw of ops) {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n invalid(\"operation must be an object\");\n }\n const op = raw as Record<string, unknown>;\n const doc = op.doc === undefined ? 0 : op.doc;\n if (typeof doc !== \"number\" || !Number.isSafeInteger(doc) || doc < 0) {\n invalid(\"doc must be a nonnegative safe integer\");\n }\n if (\n ![\"mount\", \"unmount\", \"add\", \"replace\", \"remove\"].includes(\n op.op as string,\n )\n ) {\n if (strict) invalid(\"unknown context operation\");\n const { doc: _doc, ...unknown } = op;\n applyOps(undefined, [unknown]);\n continue;\n }\n if (protocols !== undefined && mode === null && op.op !== \"mount\")\n invalid(\"negotiated state must start with mounts\");\n if (mode === null) {\n if (op.op === \"mount\") mode = \"mounted\";\n else if (\n op.op === \"replace\" &&\n doc === 0 &&\n Array.isArray(op.path) &&\n op.path.length === 0 &&\n \"value\" in op\n ) {\n mode = \"keyless\";\n documents.set(0, { key: null, value: undefined });\n } else\n invalid(\n \"first operation must mount a document or replace document 0 at the root\",\n );\n }\n if (\n mode === \"keyless\" &&\n (doc !== 0 || op.op === \"mount\" || op.op === \"unmount\")\n ) {\n invalid(\"keyless mode only supports mutations of document 0\");\n }\n if (op.op === \"mount\") {\n if (documents.has(doc)) invalid(\"document is already mounted\");\n if (\n (op.key !== undefined &&\n (!Array.isArray(op.key) ||\n !op.key.every((key) => typeof key === \"string\"))) ||\n !(\"value\" in op)\n ) {\n invalid(\"mount requires value and an optional key array\");\n }\n if (\n op.protocol !== undefined &&\n (typeof op.protocol !== \"string\" ||\n !protocolToken.test(op.protocol) ||\n op.protocol === \"*\")\n )\n invalid(\"invalid mount protocol\");\n if (\n protocols !== undefined &&\n !protocols.some((p) => p.name === op.protocol)\n )\n invalid(\"mount protocol was not negotiated\");\n if (op.main !== undefined && typeof op.main !== \"boolean\")\n invalid(\"main must be boolean\");\n if (\n op.main === true &&\n [...documents.values()].some(\n (d) => d.protocol === op.protocol && d.main,\n )\n )\n invalid(\"protocol already has a main document\");\n if (\n op.key !== undefined &&\n [...documents.values()].some(\n (d) =>\n d.protocol === op.protocol &&\n JSON.stringify(d.key) === JSON.stringify(op.key),\n )\n )\n invalid(\"protocol document key is already mounted\");\n documents.set(doc, {\n key: op.key === undefined ? null : (op.key as string[]),\n ...(op.protocol === undefined\n ? {}\n : { protocol: op.protocol as string }),\n ...(op.main === undefined ? {} : { main: op.main as boolean }),\n value:\n op.meta === undefined\n ? op.value\n : reviveValue(op.value, op.meta, { rejectUnknown: strict }),\n });\n if (doc === 0) changedPaths.push([]);\n } else if (op.op === \"unmount\") {\n const document = documents.get(doc);\n if (\n protocols !== undefined &&\n document !== undefined &&\n !protocols.some((p) => p.name === document.protocol)\n )\n invalid(\"document protocol was not negotiated\");\n if (!documents.delete(doc)) invalid(\"document is not mounted\");\n if (doc === 0) changedPaths.push([]);\n } else if (op.op === \"add\" || op.op === \"replace\" || op.op === \"remove\") {\n const document = documents.get(doc);\n if (\n protocols !== undefined &&\n document !== undefined &&\n !protocols.some((p) => p.name === document.protocol)\n )\n invalid(\"document protocol was not negotiated\");\n if (!document) invalid(\"document is not mounted\");\n if (\n !Array.isArray(op.path) ||\n !op.path.every(\n (part) =>\n typeof part === \"string\" ||\n (typeof part === \"number\" &&\n Number.isSafeInteger(part) &&\n part >= 0),\n )\n ) {\n invalid(\"operation requires a valid path\");\n }\n if (op.op !== \"remove\" && !(\"value\" in op))\n invalid(\"operation requires a value\");\n const { doc: _doc, meta, ...mutation } = op;\n if (meta !== undefined)\n mutation.value = reviveValue(mutation.value, meta, {\n rejectUnknown: strict,\n });\n const applied = applyOps(document.value, [mutation]);\n documents.set(doc, { ...document, value: applied.state });\n if (doc === 0) changedPaths.push(...applied.changedPaths);\n }\n }\n if (mode === null) invalid(\"hello missing snapshot\");\n return { mode, documents, changedPaths };\n};\n\nexport const mainDocument = (\n state: StatewireDocuments.State,\n protocol: string,\n) =>\n [...state.documents.values()].find(\n (document) => document.protocol === protocol && document.main,\n );\n\nexport const resolveDocumentKey = (\n key: readonly string[],\n prefix?: readonly string[],\n) =>\n key[0] === \".\"\n ? prefix === undefined\n ? undefined\n : [...prefix, ...key.slice(1)]\n : key;\n\nexport const findDocument = (\n state: StatewireDocuments.State,\n protocol: string,\n key?: readonly string[],\n prefix?: readonly string[],\n) => {\n if (key === undefined) return mainDocument(state, protocol);\n const resolved = resolveDocumentKey(key, prefix);\n return [...state.documents.values()].find(\n (document) =>\n document.protocol === protocol &&\n document.key !== null &&\n (JSON.stringify(document.key) === JSON.stringify(key) ||\n (resolved !== undefined &&\n JSON.stringify(resolveDocumentKey(document.key, prefix)) ===\n JSON.stringify(resolved))),\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"documents.js","names":["applyOps","reviveValue","protocolToken","StatewirePath","StatewireDocuments","CacheEntry","version","value","Storage","namespace","load","identity","save","entry","subscribe","listener","Source","get","protocol","key","prefix","list","ReadonlyMap","Document","main","State","mode","documents","invalid","message","Error","applyDocumentOps","previous","ops","protocols","name","strict","undefined","length","Map","changedPaths","raw","Array","isArray","op","Record","doc","Number","isSafeInteger","includes","_doc","unknown","path","set","has","every","test","some","p","values","d","JSON","stringify","meta","rejectUnknown","push","document","delete","part","mutation","applied","state","mainDocument","find","resolveDocumentKey","slice","findDocument","resolved"],"sources":["../../src/wire/documents.ts"],"sourcesContent":["import { applyOps } from \"./ops\";\nimport { reviveValue } from \"./meta\";\nimport { protocolToken } from \"./protocol\";\nimport type { StatewirePath } from \"./ops\";\n\nexport namespace StatewireDocuments {\n export type CacheEntry = { version: string; value: unknown };\n export type Storage = {\n namespace?: string;\n load: (identity: readonly string[]) => CacheEntry | undefined;\n save: (identity: readonly string[], entry: CacheEntry) => void;\n subscribe?: (listener: () => void) => () => void;\n };\n export type Source = {\n get: (\n protocol: string,\n key?: readonly string[],\n prefix?: readonly string[],\n ) => unknown;\n list: () => ReadonlyMap<number, Document>;\n subscribe: (listener: () => void) => () => void;\n };\n export type Document = {\n key: readonly string[] | null;\n protocol?: string;\n main?: boolean;\n value: unknown;\n };\n export type State = {\n mode: \"mounted\" | \"keyless\" | null;\n documents: ReadonlyMap<number, Document>;\n };\n}\n\nconst invalid: (message: string) => never = (message) => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nexport const applyDocumentOps = (\n previous: StatewireDocuments.State,\n ops: readonly unknown[],\n protocols?: readonly { name: string; version: string }[],\n strict = false,\n) => {\n let mode =\n previous.mode ??\n (protocols !== undefined && ops.length === 0 ? \"mounted\" : null);\n const documents = new Map(previous.documents);\n const changedPaths: StatewirePath[] = [];\n for (const raw of ops) {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n invalid(\"operation must be an object\");\n }\n const op = raw as Record<string, unknown>;\n const doc = op.doc === undefined ? 0 : op.doc;\n if (typeof doc !== \"number\" || !Number.isSafeInteger(doc) || doc < 0) {\n invalid(\"doc must be a nonnegative safe integer\");\n }\n if (\n ![\"mount\", \"unmount\", \"add\", \"replace\", \"remove\"].includes(\n op.op as string,\n )\n ) {\n if (strict) invalid(\"unknown context operation\");\n const { doc: _doc, ...unknown } = op;\n applyOps(undefined, [unknown]);\n continue;\n }\n if (protocols !== undefined && mode === null && op.op !== \"mount\")\n invalid(\"negotiated state must start with mounts\");\n if (mode === null) {\n if (op.op === \"mount\") mode = \"mounted\";\n else if (\n op.op === \"replace\" &&\n doc === 0 &&\n Array.isArray(op.path) &&\n op.path.length === 0 &&\n \"value\" in op\n ) {\n mode = \"keyless\";\n documents.set(0, { key: null, value: undefined });\n } else\n invalid(\n \"first operation must mount a document or replace document 0 at the root\",\n );\n }\n if (\n mode === \"keyless\" &&\n (doc !== 0 || op.op === \"mount\" || op.op === \"unmount\")\n ) {\n invalid(\"keyless mode only supports mutations of document 0\");\n }\n if (op.op === \"mount\") {\n if (documents.has(doc)) invalid(\"document is already mounted\");\n if (\n (op.key !== undefined &&\n (!Array.isArray(op.key) ||\n !op.key.every((key) => typeof key === \"string\"))) ||\n !(\"value\" in op)\n ) {\n invalid(\"mount requires value and an optional key array\");\n }\n if (\n op.protocol !== undefined &&\n (typeof op.protocol !== \"string\" ||\n !protocolToken.test(op.protocol) ||\n op.protocol === \"*\")\n )\n invalid(\"invalid mount protocol\");\n if (\n protocols !== undefined &&\n !protocols.some((p) => p.name === op.protocol)\n )\n invalid(\"mount protocol was not negotiated\");\n if (op.main !== undefined && typeof op.main !== \"boolean\")\n invalid(\"main must be boolean\");\n if (\n op.main === true &&\n [...documents.values()].some(\n (d) => d.protocol === op.protocol && d.main,\n )\n )\n invalid(\"protocol already has a main document\");\n if (\n op.key !== undefined &&\n [...documents.values()].some(\n (d) =>\n d.protocol === op.protocol &&\n JSON.stringify(d.key) === JSON.stringify(op.key),\n )\n )\n invalid(\"protocol document key is already mounted\");\n documents.set(doc, {\n key: op.key === undefined ? null : (op.key as string[]),\n ...(op.protocol === undefined\n ? {}\n : { protocol: op.protocol as string }),\n ...(op.main === undefined ? {} : { main: op.main as boolean }),\n value:\n op.meta === undefined\n ? op.value\n : reviveValue(op.value, op.meta, { rejectUnknown: strict }),\n });\n if (doc === 0) changedPaths.push([]);\n } else if (op.op === \"unmount\") {\n const document = documents.get(doc);\n if (\n protocols !== undefined &&\n document !== undefined &&\n !protocols.some((p) => p.name === document.protocol)\n )\n invalid(\"document protocol was not negotiated\");\n if (!documents.delete(doc)) invalid(\"document is not mounted\");\n if (doc === 0) changedPaths.push([]);\n } else if (op.op === \"add\" || op.op === \"replace\" || op.op === \"remove\") {\n const document = documents.get(doc);\n if (\n protocols !== undefined &&\n document !== undefined &&\n !protocols.some((p) => p.name === document.protocol)\n )\n invalid(\"document protocol was not negotiated\");\n if (!document) invalid(\"document is not mounted\");\n if (\n !Array.isArray(op.path) ||\n !op.path.every(\n (part) =>\n typeof part === \"string\" ||\n (typeof part === \"number\" &&\n Number.isSafeInteger(part) &&\n part >= 0),\n )\n ) {\n invalid(\"operation requires a valid path\");\n }\n if (op.op !== \"remove\" && !(\"value\" in op))\n invalid(\"operation requires a value\");\n const { doc: _doc, meta, ...mutation } = op;\n if (meta !== undefined)\n mutation.value = reviveValue(mutation.value, meta, {\n rejectUnknown: strict,\n });\n const applied = applyOps(document.value, [mutation]);\n documents.set(doc, { ...document, value: applied.state });\n if (doc === 0) changedPaths.push(...applied.changedPaths);\n }\n }\n if (mode === null) invalid(\"hello missing snapshot\");\n return { mode, documents, changedPaths };\n};\n\nexport const mainDocument = (\n state: StatewireDocuments.State,\n protocol: string,\n) =>\n [...state.documents.values()].find(\n (document) => document.protocol === protocol && document.main,\n );\n\nexport const resolveDocumentKey = (\n key: readonly string[],\n prefix?: readonly string[],\n) =>\n key[0] === \".\"\n ? prefix === undefined\n ? undefined\n : [...prefix, ...key.slice(1)]\n : key;\n\nexport const findDocument = (\n state: StatewireDocuments.State,\n protocol: string,\n key?: readonly string[],\n prefix?: readonly string[],\n) => {\n if (key === undefined) return mainDocument(state, protocol);\n const resolved = resolveDocumentKey(key, prefix);\n return [...state.documents.values()].find(\n (document) =>\n document.protocol === protocol &&\n document.key !== null &&\n (JSON.stringify(document.key) === JSON.stringify(key) ||\n (resolved !== undefined &&\n JSON.stringify(resolveDocumentKey(document.key, prefix)) ===\n JSON.stringify(resolved))),\n );\n};\n"],"mappings":"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"}
|
package/dist/wire/meta.d.ts
CHANGED
|
@@ -1,29 +1,14 @@
|
|
|
1
|
+
import { StatewireDocument, reviveDocumentValue } from "../document.js";
|
|
1
2
|
//#region src/wire/meta.d.ts
|
|
2
|
-
type StatewireMetaEntry = {
|
|
3
|
-
path: (string | number)[];
|
|
4
|
-
type: string;
|
|
5
|
-
};
|
|
6
|
-
/** Revive meta-typed locations inside a wire value (in place). Clients skip
|
|
7
|
-
* unknown types; hosts pass `rejectUnknown` to fault on them instead. */
|
|
8
|
-
declare const reviveValue: (value: unknown, meta: unknown, { rejectUnknown }?: {
|
|
9
|
-
rejectUnknown?: boolean | undefined;
|
|
10
|
-
}) => unknown;
|
|
11
3
|
declare const reviveOps: (ops: unknown[]) => unknown[];
|
|
12
4
|
declare const reviveResponse: <T extends {
|
|
13
5
|
payload?: unknown;
|
|
14
6
|
meta?: unknown;
|
|
15
7
|
}>(response: T) => T;
|
|
16
|
-
/** Encode Date instances inside command params as canonical ISO strings,
|
|
17
|
-
* recording their paths (starting at the param index) in meta. */
|
|
18
8
|
declare const encodeParams: (params: readonly unknown[]) => {
|
|
19
9
|
params: unknown[];
|
|
20
|
-
meta?:
|
|
21
|
-
};
|
|
22
|
-
/** Encode Date instances inside a wire value, recording their paths in meta. */
|
|
23
|
-
declare const encodeValue: (value: unknown) => {
|
|
24
|
-
value: unknown;
|
|
25
|
-
meta?: StatewireMetaEntry[];
|
|
10
|
+
meta?: StatewireDocument.MetaEntry[];
|
|
26
11
|
};
|
|
27
12
|
//#endregion
|
|
28
|
-
export {
|
|
13
|
+
export { encodeParams, reviveOps, reviveResponse, reviveDocumentValue as reviveValue };
|
|
29
14
|
//# sourceMappingURL=meta.d.ts.map
|
package/dist/wire/meta.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta.d.ts","names":[],"sources":["../../src/wire/meta.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"meta.d.ts","names":[],"sources":["../../src/wire/meta.ts"],"mappings":";;cAQa,YAAa;cAOb,iBAAkB;EAAY;EAAmB;GAC5D,UAAU,MACT;cAMU,eACX;EACG;EAAmB,OAAO,kBAAkB"}
|