statewire 0.18.2 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/connection.d.ts +8 -5
- package/dist/client/connection.d.ts.map +1 -1
- package/dist/client/connection.js +24 -13
- package/dist/client/connection.js.map +1 -1
- package/dist/client/session.d.ts +13 -15
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +291 -256
- package/dist/client/session.js.map +1 -1
- package/dist/client/timing.d.ts +2 -1
- package/dist/client/timing.d.ts.map +1 -1
- package/dist/client/timing.js +2 -1
- package/dist/client/timing.js.map +1 -1
- package/dist/host/engine.d.ts +2 -0
- package/dist/host/engine.d.ts.map +1 -1
- package/dist/host/engine.js +2 -0
- package/dist/host/engine.js.map +1 -1
- package/dist/host/host.d.ts +3 -1
- package/dist/host/host.d.ts.map +1 -1
- package/dist/host/host.js +38 -7
- package/dist/host/host.js.map +1 -1
- package/dist/host/http.d.ts.map +1 -1
- package/dist/host/http.js +8 -17
- package/dist/host/http.js.map +1 -1
- package/dist/host/socket.d.ts +47 -23
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +389 -245
- package/dist/host/socket.js.map +1 -1
- package/dist/host/synced.d.ts +9 -0
- package/dist/host/synced.d.ts.map +1 -0
- package/dist/host/synced.js +45 -0
- package/dist/host/synced.js.map +1 -0
- package/dist/host-internal.d.ts +20 -8
- package/dist/host-internal.d.ts.map +1 -1
- package/dist/host.d.ts +33 -9
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +2 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -1
- package/dist/statewire.d.ts +8 -10
- package/dist/statewire.d.ts.map +1 -1
- package/dist/statewire.js +0 -14
- package/dist/statewire.js.map +1 -1
- package/dist/storage.d.ts +2 -5
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +55 -41
- package/dist/storage.js.map +1 -1
- package/dist/transports/remote.d.ts.map +1 -1
- package/dist/transports/remote.js +1 -6
- package/dist/transports/remote.js.map +1 -1
- package/dist/transports/sse.d.ts +2 -5
- package/dist/transports/sse.d.ts.map +1 -1
- package/dist/transports/sse.js.map +1 -1
- package/dist/transports/testing.d.ts +7 -5
- package/dist/transports/testing.d.ts.map +1 -1
- package/dist/transports/testing.js +19 -19
- package/dist/transports/testing.js.map +1 -1
- package/dist/types.d.ts +3 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/wire/limits.d.ts +2 -2
- package/dist/wire/limits.js +2 -2
- package/dist/wire/limits.js.map +1 -1
- package/dist/wire/protocol.d.ts +6 -1
- package/dist/wire/protocol.d.ts.map +1 -1
- package/dist/wire/protocol.js +33 -12
- package/dist/wire/protocol.js.map +1 -1
- package/package.json +1 -1
- package/src/client/connection.ts +46 -33
- package/src/client/session.ts +434 -365
- package/src/client/timing.ts +2 -0
- package/src/host/engine.ts +3 -1
- package/src/host/host.ts +50 -3
- package/src/host/http.ts +22 -23
- package/src/host/socket.ts +550 -321
- package/src/host/synced.ts +60 -0
- package/src/host-internal.ts +21 -3
- package/src/host.ts +40 -8
- package/src/index.ts +1 -0
- package/src/statewire.ts +8 -30
- package/src/storage.ts +96 -79
- package/src/transports/remote.ts +0 -7
- package/src/transports/sse.ts +8 -3
- package/src/transports/testing.ts +34 -19
- package/src/types.ts +3 -5
- package/src/wire/limits.ts +1 -1
- package/src/wire/protocol.ts +40 -11
package/dist/host/socket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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","touched","results","Map","ts","cmd","inflight","principal","Conn","selection","Selection","clientId","socket","Socket","open","sawFrame","lastSentAt","lease","auth","ctxSeq","context","contextDocuments","State","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","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","through","ctxNew","s","cmdNew","hostCommandLoad","client","isSafeInteger","TypeError","documents","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","version","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 touched: number;\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\n// The ctx lane is attach scoped: a Conn is born with an empty context table\n// and outlives its socket so an admitted command keeps reading its last value.\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 ctxSeq: number;\n context: Record<string, unknown> | null;\n contextDocuments: StatewireDocuments.State;\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 touched: rec.touched,\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 conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get context() {\n return conn.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 conn: Conn,\n statement: CmdStatement,\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 !conn.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, conn),\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// (cmd) or the attach (ctx), then the new suffix is admitted whole or the\n// frame is refused whole via a {syn} stating both watermarks, nothing\n// 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 conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n const rec = h.clients.get(conn.clientId)!;\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 > conn.ctxSeq);\n const cmdNew = frame.cmd.filter((s) => s.seq > through);\n if (\n (ctxNew.length > 0 && ctxNew[0]!.seq !== conn.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: conn.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: conn.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: conn.ctxSeq, retry } },\n };\n }\n }\n let contextDocuments = conn.contextDocuments;\n try {\n for (const statement of ctxNew)\n contextDocuments = applyDocumentOps(\n contextDocuments,\n statement.ops,\n conn.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 conn.contextDocuments = contextDocuments;\n conn.context = (mainDocument(contextDocuments, h.protocol.name)?.value ??\n null) as Record<string, unknown> | null;\n if (ctxNew.length) conn.ctxSeq = ctxNew.at(-1)!.seq;\n for (const statement of cmdNew) admitCmd(h, rec, conn, statement);\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 let admission: ReturnType<typeof admitFrame>;\n try {\n admission = admitFrame(h, conn, frame);\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 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 touched: Date.now(),\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 ctxSeq: 0,\n context: null,\n contextDocuments: { mode: \"mounted\", documents: new Map() },\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: 0,\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 { 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 id: record.id,\n lastSeq: record.lastSeq,\n touched: record.touched,\n results: new Map(\n record.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n 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":";;;;;;;;;;;AAiCA,MAAasC,eAAe;AAC5B,MAAaC,6BACX;;;AAIF,MAAaC,cAAcC,GAAYC,MAAwB;CAC7D,IAAIC,OAAOC,GAAGH,GAAGC,CAAC,GAAG,OAAO;CAC5B,IAAID,aAAaI,QAAQH,aAAaG,MACpC,OAAOJ,EAAEK,QAAQ,MAAMJ,EAAEI,QAAQ;CACnC,IAAIC,MAAMC,QAAQP,CAAC,KAAKM,MAAMC,QAAQN,CAAC,GACrC,OAAOD,EAAEQ,WAAWP,EAAEO,UAAUR,EAAES,OAAOC,GAAGC,MAAMZ,WAAWW,GAAGT,EAAEU,EAAE,CAAC;CAEvE,IACE,OAAOX,MAAM,YACb,OAAOC,MAAM,YACbD,MAAM,QACNC,MAAM,QACNC,OAAOU,eAAeZ,CAAC,MAAME,OAAOW,aACpCX,OAAOU,eAAeX,CAAC,MAAMC,OAAOW,WACpC;EACA,MAAMC,QAAQZ,OAAOa,KAAKf,CAAC;EAC3B,MAAMgB,QAAQd,OAAOa,KAAKd,CAAC;EAC3B,OACEa,MAAMN,WAAWQ,MAAMR,UACvBM,MAAML,OACHQ,QACCA,OAAOhB,KACPF,WACGC,EAA8BiB,MAC9BhB,EAA8BgB,IACjC,CACJ;CAEJ;CACA,OAAO;AACT;AAEA,MAAME,gBAAgB;AACtB,MAAMC,eAAe;AACrB,MAAMC,sBAAsB;AAC5B,MAAMC,kBAAkB;AACxB,MAAaC,2BAA2B;AACxC,MAAMC,oBAAoB;AAuD1B,MAAM8C,aAAaC,WAA0B;CAC3C,MAAMrE,OAAOsE,OAAO,IAAIC,MAAMF,MAAM,GAAG,EAAEG,MAAM,qBAAqB,CAAC;AACvE;AAEA,MAAMC,mBAAmBC,UACvBA,iBAAiBH,SAASG,MAAMF,SAAS,uBACrCE,MAAMC,UACN;AAgBN,MAAMQ,iBAAiBzD,UACrB,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACtB,MAAMC,QAAQqB,KAAK;AAErE,MAAM0D,aAAa1D,UAA8C;CAC/D,IAAI,CAACtB,MAAMC,QAAQqB,KAAK,GAAG,OAAO0C,UAAU,iBAAiB;CAC7D,IAAI1C,MAAMpB,WAAW,GAAG,OAAO8D,UAAU,YAAY;CACrD,MAAMiB,aAAwC,CAAA;CAC9C,IAAIC,OAAsB;CAC1B,KAAK,MAAMC,aAAa7D,OAAO;EAC7B,IAAI,CAACyD,cAAcI,SAAS,GAAG,OAAOnB,UAAU,qBAAqB;EACrE,MAAMtC,MAAMyD,UAAU;EACtB,IAAI,OAAOzD,QAAQ,YAAY,CAAC0D,OAAOC,UAAU3D,GAAG,KAAKA,MAAM,GAC7D,OAAOsC,UAAU,qBAAqB;EAExC,IAAIkB,SAAS,QAAQxD,QAAQwD,OAAO,GAAG,OAAOlB,UAAU,iBAAiB;EACzEkB,OAAOxD;EACPuD,WAAWK,KAAKH,SAAS;CAC3B;CACA,OAAOF;AACT;AAEA,MAAMM,eAAe,IAAIC,YAAY;AAErC,MAAaC,mBAAmBC,UAAgC;CAC9D,IAAI,CAACX,cAAcW,KAAK,GAAG,OAAO1B,UAAU,iBAAiB;CAC7D,MAAMvD,OAAOb,OAAOa,KAAKiF,KAAK;CAC9B,IAAIjF,KAAKP,WAAW,GAAG,OAAO8D,UAAU,iBAAiB;CACzD,MAAM2B,UAAUlF,KAAKmF,QAAQjF,QAAQA,QAAQ,SAASA,QAAQ,KAAK,CAAC,CAACkF,KAAK;CAC1E,IAAIF,QAAQzF,SAAS,GACnB,OAAO8D,UAAU,uBAAuB2B,QAAQ,GAAE,EAAG;CACvD,MAAMb,MAAsB,CAAA;CAC5B,IAAIY,MAAM,WAAWI,KAAAA,GAAW;EAC9B,MAAMC,OAAOL,MAAM;EACnB,IAAI1F,MAAMC,QAAQ8F,IAAI,KAAKA,KAAK7F,SAAAA,KAC9B,OAAO8D,UAAU,6BAA6B;EAEhD,KAAK,MAAMmB,aAAaH,UAAUe,IAAI,GAAG;GACvC,MAAMtB,MAAMU,UAAU;GACtB,IAAI,CAACnF,MAAMC,QAAQwE,GAAG,KAAK,CAACA,IAAIvE,QAC9B,OAAO8D,UAAU,iBAAiB;GACpC,IACEuB,aAAaS,OAAOC,KAAKC,UAAUzB,GAAG,CAAC,CAAC,CAAC0B,aAAAA,OAGzC,OAAOnC,UAAU,mBAAmB;GACtCc,IAAIQ,KAAK;IAAE5D,KAAKyD,UAAU;IAAkBV;GAAI,CAAC;EACnD;CACF;CACA,MAAMnC,MAAsB,CAAA;CAC5B,IAAIoD,MAAM,WAAWI,KAAAA,GAAW;EAC9B,MAAMC,OAAOL,MAAM;EACnB,IAAI1F,MAAMC,QAAQ8F,IAAI,KAAKA,KAAK7F,SAAAA,KAC9B,OAAO8D,UAAU,mBAAmB;EAEtC,KAAK,MAAMmB,aAAaH,UAAUe,IAAI,GAAG;GACvC,MAAMpE,SAASwD,UAAU;GACzB,IACE,OAAOxD,WAAW,YAClB,OAAOwD,UAAU,gBAAgB,YACjC,EAAE,YAAYA,YAEd,OAAOnB,UAAU,qBAAqB;GAExC1B,IAAIgD,KAAK;IACPX,UAAUQ,UAAU;IACpBzD,KAAKyD,UAAU;IACfxD;IACAiD,QAAQO,UAAU;IAClB,GAAIA,UAAU,YAAYW,KAAAA,KAAa,EAAEvE,MAAM4D,UAAU,QAAQ;GACnE,CAAC;EACH;CACF;CACA,OAAO;EAAEL;EAAKxC;CAAI;AACpB;AAEA,MAAa8D,cAAcC,QAA6B;CACtD,IAAIX;CACJ,IAAI;EACFA,QAAQO,KAAKK,MAAMD,GAAG;CACxB,QAAQ;EACN,OAAOrC,UAAU,iBAAiB;CACpC;CACA,OAAOyB,gBAAgBC,KAAK;AAC9B;AAEA,MAAMa,oBAAoBF,QACxBA,IAAInG,SAAAA,WACJqF,aAAaS,OAAOK,GAAG,CAAC,CAACF,aAAAA;AAI3B,MAAMK,iBACJC,YACgE;CAChE,IAAIA,YAAYX,KAAAA,GAAW,OAAO,CAAC;CACnC,MAAM,EAAExE,OAAOC,SAAStE,eAAewJ,OAAO;CAC9C,OAAO;EAAEA,SAASnF;EAAO,GAAIC,SAASuE,KAAAA,KAAa,EAAEvE,KAAK;CAAG;AAC/D;AAEA,MAAMmF,SAASC,KAAgBC,YAA2C;CACxE,IAAIA,QAAQC,SAAS,YACnB,OAAO;EAAEnF,KAAKiF,IAAIjF;EAAKmF,MAAM;EAAU,GAAGL,cAAcI,QAAQH,OAAO;CAAE;CAE3E,MAAMK,UACJF,QAAQtC,iBAAiBnG,qBAAqByI,QAAQtC,MAAMwC,UAAU;CACxE,QAAQA,SAASC,MAAjB;EACE,KAAK,WACH,OAAO;GAAErF,KAAKiF,IAAIjF;GAAKmF,MAAM;EAAU;EACzC,KAAK,UACH,OAAO;GACLnF,KAAKiF,IAAIjF;GACTmF,MAAM;GACN,GAAIC,QAAQvC,YAAYuB,KAAAA,KAAa,EAAEvB,SAASuC,QAAQvC,QAAQ;EAClE;EACF,KAAK;GACH,IAAIuC,QAAQE,SAASlB,KAAAA,GAAW;IAC9B,MAAMvB,UACJuC,QAAQE,SAAS,oBACb,oBAAoBL,IAAIhF,OAAM,KAC9BmF,QAAQvC;IACd,OAAO;KACL7C,KAAKiF,IAAIjF;KACTmF,MAAM;KACNG,MAAMF,QAAQE;KACd,GAAIzC,YAAYuB,KAAAA,KAAa,EAAEvB,QAAQ;IACzC;GACF;GACA,OAAO;IACL7C,KAAKiF,IAAIjF;IACTmF,MAAM;IACN,GAAIC,QAAQvC,YAAYuB,KAAAA,KAAa,EAAEvB,SAASuC,QAAQvC,QAAQ;IAChE,GAAGiC,cAAcM,QAAQL,OAAO;GAClC;EAEF,SACE,OAAO;GACL/E,KAAKiF,IAAIjF;GACTmF,MAAM;GACNtC,SACEqC,QAAQtC,iBAAiBH,QACrByC,QAAQtC,MAAMC,UACd0C,OAAOL,QAAQtC,KAAK;EAC5B;CACJ;AACF;AAEA,MAAM4C,qBAAqBb,QAAgB;CACzC,IAAI/E;CACJ,IAAI;EACFA,QAAQ2E,KAAKK,MAAMD,GAAG;CACxB,QAAQ;EACN,OAAOrC,UAAU,iBAAiB;CACpC;CACA,IAAI,CAACe,cAAczD,KAAK,GAAG,OAAO0C,UAAU,iBAAiB;CAC7D,MAAM,EAAEmD,SAAS,GAAGC,UAAU9F;CAC9B,IAAI6F,YAAYrB,KAAAA,GAAW,MAAM,IAAIuB,SAAS,MAAM,EAAEC,QAAQ,IAAI,CAAC;CACnE,IACE,CAACvC,cAAcoC,OAAO,KACtBvH,OAAO2H,OAAOJ,OAAO,CAAC,CAACK,MAAMpH,MAAM,OAAOA,MAAM,QAAQ,GAExD,OAAO4D,UAAU,mBAAmB;CAEtC,OAAO;EACImD;EACTzB,OAAO9F,OAAOa,KAAK2G,KAAK,CAAC,CAAClH,SACtBuF,gBAAgB2B,KAAK,IACrB;GAAEtC,KAAK,CAAA;GAAIxC,KAAK,CAAA;EAAG;CACzB;AACF;AA0CA,MAAM8H,iBAAiBC,MAAuB;CAC5C,IAAIA,EAAEnB,kBAAkBmB,EAAEpB,UAAU;CACpCoB,EAAEnB,iBAAiB;CACnBmB,EAAEV,KAAK;AACT;AAEA,MAAMW,YACJD,GACAjJ,OAKG;CACH,IAAIA,GAAGA,OAAO,aAAaA,GAAGA,OAAO,OAAO;EAC1C,MAAM,EAAEE,OAAOC,SAAStE,eAAemE,GAAGE,KAAK;EAC/C+I,EAAE1B,WAAWrD,KAAK;GAAE,GAAGlE;GAAIE;GAAO,GAAIC,SAASuE,KAAAA,KAAa,EAAEvE,KAAK;EAAG,CAAC;CACzE,OACE8I,EAAE1B,WAAWrD,KAAKlE,EAAE;CAEtBgJ,cAAcC,CAAC;AACjB;AAEA,MAAME,UAAUF,GAAoBG,SAA6B;CAC/D,IAAIA,SAASH,EAAEb,SAAS;CACxBa,EAAEb,UAAUgB;CACZ,MAAMC,YACJ,OAAOD,KAAKE,UAAU,YAAYF,KAAKE,UAAU,OAC7C1M,aAAawM,KAAKE,KAAK,IACvB5E,KAAAA;CACN,MAAM6E,eAAe5M,gBAAgByM,KAAKI,QAAQ;CAClD,IAAI,CAACH,aAAa,CAACE,cAAcE,QAC/B,MAAM,IAAI1G,MACR,qHACF;CAEF,IAAIsG,cAAcJ,EAAEhB,WAAW;EAC7BgB,EAAEhB,WAAWyB,QAAQ,IAAI;EACzBT,EAAEhB,YAAYoB;EACdJ,EAAEhB,UAAUyB,SAAS1J,OAAOkJ,SAASD,GAAGjJ,EAAE,CAAC;CAC7C;CACAiJ,EAAEd,eAAeoB;AACnB;AAEA,MAAaI,aACXV,GACAW,MACAhE,MACA/C,WACG;CACH,IAAI,CAAC+G,KAAKjI,MAAM;CAChBiI,KAAKjI,OAAO;CACZsH,EAAE7B,MAAMyC,OAAOD,IAAI;CACnB,IAAI;EACFA,KAAKnI,OAAOqI,MAAMlE,MAAM/C,MAAM;CAChC,QAAQ,CACN;CAEF,IAAIoG,EAAE7B,MAAM2C,SAAS,KAAKd,EAAElB,mBAAmB,MAAM;EACnDiC,cAAcf,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;CACrB;AACF;AAEA,MAAakC,UAAUhB,GAAoBW,MAAYM,SAAiB;CACtE,IAAI,CAACN,KAAKjI,MAAM;CAChBiI,KAAK/H,aAAanD,KAAKyL,IAAI;CAC3B,IAAI;EACFP,KAAKnI,OAAO2I,KAAKF,IAAI;CACvB,QAAQ;EACNP,UAAUV,GAAGW,IAAI;CACnB;AACF;AAEA,MAAaS,qBAAqBpB,MAChCA,EAAE7B,MAAM2C,OACN,CAAC,GAAGd,EAAE3B,YAAY,CAAC,CAAC9C,QAAQoF,SAASA,KAAKvH,WAAW,CAAC,CAACvD,UACzDmK,EAAEtC;AAEJ,MAAM2D,mBAAmBrB,MAAuB;CAC9C,IAAIA,EAAElB,mBAAmB,QAAQkB,EAAExC,eAAe,GAAG;CACrDwC,EAAElB,iBAAiBC,kBAAkB;EACnC,MAAMmC,MAAMzL,KAAKyL,IAAI;EACrB,KAAK,MAAMP,QAAQ,CAAC,GAAGX,EAAE7B,KAAK,GAC5B,IAAI+C,MAAMP,KAAK/H,cAAcoH,EAAExC,aAAawD,OAAOhB,GAAGW,MAAM,IAAI;CAEpE,GAAGX,EAAExC,WAAW;CAChB,EAAGsB,eAAqDwC,QAAQ;AAClE;AAEA,MAAMC,kBAAkBvB,GAAoBwB,OAAe;CACzD,IAAIA,OAAOxB,EAAExC,aAAa;CAC1BwC,EAAExC,cAAcgE;CAChB,IAAIxB,EAAElB,mBAAmB,MAAM;EAC7BiC,cAAcf,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;EACnBuC,gBAAgBrB,CAAC;CACnB;AACF;AAEA,MAAMyB,aAAazB,MAAgC;CACjD,IAAIA,EAAEb,SAASuC,MAAMC,WAAW,OAAO,OAAO;CAC9C,KAAK,MAAMC,OAAO5B,EAAE9B,QAAQhB,OAAO,GACjC,IAAI0E,IAAI1J,SAAS4I,OAAO,GAAG,OAAO;CAEpC,OAAO;AACT;AAEA,MAAae,SAAS7B,GAAoBL,QAA4B;CACpEpM,mBAAmB,CAAC,CAAC;CACrByM,EAAEhB,WAAW8C,YAAY;CACzB,KAAK,MAAMF,OAAO5B,EAAE9B,QAAQhB,OAAO,GACjC,KAAK,MAAMZ,OAAOsF,IAAI1J,SAASgF,OAAO,GACpC,IAAIZ,IAAI/E,WAAW,CAAC+E,IAAI7E,WAAW,CAAC6E,IAAI9E,aAAa;EACnD8E,IAAI9E,cAAc;EAClBuK,aAAa/B,GAAG4B,IAAIjK,IAAI2E,IAAIjF,GAAG;CACjC;CAGJ,MAAM2K,QAAQP,UAAUzB,CAAC;CACzB,MAAMiC,OAAOD,UAAUhC,EAAEvB;CACzB,IACEuB,EAAE1B,WAAWzI,WAAW,KACxBmK,EAAEzB,eAAeuC,SAAS,KAC1Bd,EAAExB,YAAYsC,SAAS,KACvBnB,QAAQlE,KAAAA,KACR,CAACwG,MAED;CAEFjC,EAAEvB,WAAWuD;CACb,IAAIrC,QAAQlE,KAAAA,KAAawG,QAAQD,SAAShC,EAAElC,WAC1C6B,MAAM,EAAE/F,QAAQ,OAAO;CAEzB,MAAMQ,MAAM4F,EAAE1B;CACd,MAAM/G,UAAUyI,EAAEzB;CAClB,MAAM2D,OAAOlC,EAAExB;CACfwB,EAAE1B,aAAa,CAAA;CACf0B,EAAEzB,iCAAiB,IAAIxG,IAAI;CAC3BiI,EAAExB,8BAAc,IAAIzG,IAAI;CAIxB,KAAK,MAAM4I,QAAQ,CAAC,GAAGX,EAAE7B,KAAK,GAAG;EAC/B,MAAMgE,kBACJ5K,QAAQ6K,IAAIzB,KAAKpI,QAAQ,KAAK,CAAA,EAAA,CAC9B8J,KAAKhL,SAAS;GAAEA;GAAKmF,MAAM;EAAU,EAAE;EACzC,IAAIpC,IAAIvE,SAAS,GAAG;GAClB,MAAMyM,SAA4B;IAChClI,KAAKuG,KAAKtI,UAAUkK,UAAUpF,MAAMqF,MAAMA,EAAEzI,SAASiG,EAAE1F,SAASP,IAAI,IAChEK,MACA,CAAA;IACJ,GAAI+H,eAAetM,SAAS,KAAK,EAAEoC,KAAKkK,eAAe;IACvD,GAAIF,QAAQ,EAAEQ,MAAMT,MAAM;GAC5B;GACAhB,OAAOhB,GAAGW,MAAM/E,KAAKC,UAAUyG,MAAM,CAAC;EACxC,OAAO,IAAIH,eAAetM,SAAS,GACjCmL,OAAOhB,GAAGW,MAAM/E,KAAKC,UAAU,EAAE5D,KAAKkK,eAAe,CAAC,CAAC;EAEzD,MAAMO,YAAYR,KAAKE,IAAIzB,KAAKpI,QAAQ,KAAK,CAAA,EAAA,CAAI8J,KAAKpK,QACpD0I,KAAKtI,UAAUkK,UAAUpF,MAAMqF,MAAMA,EAAEzI,SAASiG,EAAE1F,SAASP,IAAI,IAC3D9B,MACA;GAAEZ,KAAKY,IAAIZ;GAAK,GAAIY,IAAI0K,QAAQlH,KAAAA,IAAY,CAAC,IAAI,EAAEkH,KAAK1K,IAAI0K,IAAI;EAAG,CACzE;EACA,IAAID,SAAS7M,SAAS,GACpBmL,OAAOhB,GAAGW,MAAM/E,KAAKC,UAAU,EAAE5D,KAAKyK,SAAS,CAAC,CAAC;EAEnD,IAAIT,QAAQ7H,IAAIvE,WAAW,GACzBmL,OAAOhB,GAAGW,MAAM/E,KAAKC,UAAU,EAAE4G,MAAMT,MAAM,CAAC,CAAC;EAEjD,IAAIrC,QAAQlE,KAAAA,GAAW;GACrBuF,OAAOhB,GAAGW,MAAM/E,KAAKC,UAAU,EAAE8D,IAAI,CAAC,CAAC;GACvCe,UAAUV,GAAGW,IAAI;EACnB;CACF;AACF;AAEA,MAAMoB,gBAAgB/B,GAAoBzH,UAAkBlB,QAAgB;CAC1E,MAAMuL,OAAO5C,EAAEzB,eAAe6D,IAAI7J,QAAQ;CAC1C,IAAIqK,MAAMA,KAAK3H,KAAK5D,GAAG;MAClB2I,EAAEzB,eAAesE,IAAItK,UAAU,CAAClB,GAAG,CAAC;CACzC0I,cAAcC,CAAC;AACjB;AAEA,MAAM8C,YAAY9C,GAAoBzH,UAAkBN,QAAsB;CAC5E,MAAM2K,OAAO5C,EAAExB,YAAY4D,IAAI7J,QAAQ;CACvC,IAAIqK,MAAMA,KAAK3H,KAAKhD,GAAG;MAClB+H,EAAExB,YAAYqE,IAAItK,UAAU,CAACN,GAAG,CAAC;CACtC8H,cAAcC,CAAC;AACjB;AAEA,MAAM+C,uBAAuB/C,MAAuB;CAClDA,EAAEZ,aAAa4D,wBACb,CAAC,GAAGhD,EAAE9B,QAAQhB,OAAO,CAAC,CAAC,CAACmF,KAAKT,SAAS;EACpCjK,IAAIiK,IAAIjK;EACRC,SAASqL,gBAAgBrB,GAAG;EAC5B/J,SAAS+J,IAAI/J;EACbC,SAAS,CAAC,GAAG8J,IAAI9J,OAAO,CAAC,CAACuK,KAAK,CAAChL,KAAK6L,YAAY;GAC/C7L;GACAW,IAAIkL,MAAMlL;GACVC,KAAKiL,MAAMjL;EACb,EAAE;EACFE,WAAWyJ,IAAIzJ;CACjB,EAAE,CACJ;AACF;AAEA,MAAMgL,UAAUvB,KAAgB3J,QAAsB;CACpD,MAAMiJ,MAAMzL,KAAKyL,IAAI;CACrBU,IAAI9J,QAAQ+K,IAAI5K,IAAIZ,KAAK;EAAEW,IAAIkJ;EAAKjJ;CAAI,CAAC;CACzC,MAAMmL,SAASC,KAAKC,IAAI,GAAG1B,IAAI9J,QAAQ1B,KAAK,CAAC;CAC7C,KAAK,MAAM,CAACiB,KAAK6L,UAAUtB,IAAI9J,SAC7B,IAAIT,QAAQ+L,UAAUlC,MAAMgC,MAAMlL,KAAKxB,eACrCoL,IAAI9J,QAAQ8I,OAAOvJ,GAAG;CAG1B,OAAOuK,IAAI9J,QAAQgJ,OAAOrK,cACxBmL,IAAI9J,QAAQ8I,OAAOyC,KAAKE,IAAI,GAAG3B,IAAI9J,QAAQ1B,KAAK,CAAC,CAAC;AAEtD;;AAGA,MAAM6M,mBAAmBrB,QACvByB,KAAKC,IAAI1B,IAAIhK,SAAS,GAAGgK,IAAI1J,SAAS9B,KAAK,CAAC;AAK9C,MAAMoN,UAAUxD,GAAoB4B,KAAgBvK,QAAgB;CAClE,MAAMoM,SAAS7B,IAAI9J,QAAQsK,IAAI/K,GAAG;CAClC,IAAIoM,QAAQ;EAEV,IAAIpM,QADWgM,KAAKC,IAAI,GAAG1B,IAAI9J,QAAQ1B,KAAK,CAChCgN,KAAU3N,KAAKyL,IAAI,IAAIuC,OAAOzL,MAAMxB,eAAe;GAC7DsM,SAAS9C,GAAG4B,IAAIjK,IAAI8L,OAAOxL,GAAG;GAC9B;EACF;EACA2J,IAAI9J,QAAQ8I,OAAOvJ,GAAG;EACtB0L,oBAAoB/C,CAAC;CACvB;CACA,MAAM1D,MAAMsF,IAAI1J,SAASkK,IAAI/K,GAAG;CAChC,IAAIiF,KAAK;EACP,IAAIA,IAAI/E,SAASwK,aAAa/B,GAAG4B,IAAIjK,IAAIN,GAAG;EAC5C;CACF;CACAyL,SAAS9C,GAAG4B,IAAIjK,IAAI;EAAEN;EAAKmF,MAAM;CAAU,CAAC;AAC9C;AAEA,MAAMkH,aACJ1D,GACA4B,KACAtF,KACArE,QACG;CACH,IAAIqE,IAAI7E,SAAS;CACjB6E,IAAI7E,UAAU;CACdmK,IAAI1J,SAAS0I,OAAOtE,IAAIjF,GAAG;CAC3B8L,OAAOvB,KAAK3J,GAAG;CACf2J,IAAIhK,UAAUyL,KAAKC,IAAI1B,IAAIhK,SAAS0E,IAAIjF,GAAG;CAC3CiF,IAAI/E,UAAU;CACduL,SAAS9C,GAAG4B,IAAIjK,IAAIM,GAAG;CACvB8K,oBAAoB/C,CAAC;AACvB;AAEA,MAAM2D,cACJ3D,GACA4B,KACAtF,KACAC,YACGmH,UAAU1D,GAAG4B,KAAKtF,KAAKD,MAAMC,KAAKC,OAAO,CAAC;AAE/C,MAAMqH,YACJ5D,GACA4B,KACAjB,UAC0B;CAC1BpI,UAAUqJ,IAAIjK;CACdmB,MAAM6H,KAAK7H;CACX,IAAIE,UAAU;EACZ,OAAO2H,KAAK3H;CACd;CACA,IAAI8K,cAAc;EAChB,IAAI9D,EAAE9B,QAAQkE,IAAIR,IAAIjK,EAAE,MAAMiK,KAAK,OAAO;EAC1C,KAAK,MAAMjB,QAAQX,EAAE7B,OACnB,IAAIwC,KAAKpI,aAAaqJ,IAAIjK,MAAMgJ,KAAKjI,MAAM,OAAO;EAEpD,OAAO;CACT;AACF;AAEA,MAAMqL,mBACJ/D,GACA4B,KACAtF,KACApC,YAEAwJ,UAAU1D,GAAG4B,KAAKtF,KAAK;CACrBjF,KAAKiF,IAAIjF;CACTmF,MAAM;CACNG,MAAM;CACNzC;AACF,CAAC;AAEH,MAAM8J,YACJhE,GACA4B,KACAjB,MACA7F,cACG;CACH,MAAMwB,MAAiB;EACrBjF,KAAKyD,UAAUzD;EACfC,QAAQwD,UAAUxD;EAClBC,SAAS;EACTC,aAAa;EACbC,SAAS;CACX;CACAmK,IAAI1J,SAAS2K,IAAI/H,UAAUzD,KAAKiF,GAAG;CACnCyG,oBAAoB/C,CAAC;CACrB,IACElF,UAAUR,aAAa0F,EAAE1F,SAASP,QAClC,CAAC4G,KAAKtI,UAAUkK,UAAUpF,MAAMqF,MAAMA,EAAEzI,SAASe,UAAUR,QAAQ,GACnE;EACAoJ,UAAU1D,GAAG4B,KAAKtF,KAAK;GACrBjF,KAAKiF,IAAIjF;GACTmF,MAAM;GACNG,MAAM;GACNzC,SAAS;EACX,CAAC;EACD;CACF;CACA,IAAI,CAACvE,MAAMC,QAAQkF,UAAUP,MAAM,GAAG;EACpCwJ,gBAAgB/D,GAAG4B,KAAKtF,KAAK,yBAAyB;EACtD;CACF;CACA,IAAI/B,SAASO,UAAUP;CACvB,IAAIO,UAAU5D,SAASuE,KAAAA,GACrB,IAAI;EACFlB,SAASrG,oBAAYqG,QAAQO,UAAU5D,MAAM,EAC3C+M,eAAe,KACjB,CAAC;CACH,SAAShK,OAAO;EACd8J,gBACE/D,GACA4B,KACAtF,KACA,mBAAoBrC,MAAgBC,SACtC;EACA;CACF;CAEF,IAAIY,UAAUxD,WAAW,sBAAsB;EAC7C,IAAIiD,OAAO1E,SAAS,GAAG;GACrBkO,gBAAgB/D,GAAG4B,KAAKtF,KAAK,oCAAoC;GACjE;EACF;EACA,MAAM4H,QAAQ,CACZ,GAAIlE,EAAEd,cAAciF,UAAU,KAAK,CAAA,GACnC,oBAAoB,CACrB,CAAC3I,KAAK;EACPkI,UAAU1D,GAAG4B,KAAKtF,KAAK;GAAEjF,KAAKiF,IAAIjF;GAAKmF,MAAM;GAAUJ,SAAS8H;EAAM,CAAC;EACvE;CACF;CACAlE,EAAEd,aAAcsB,OAAQ;EACtBlJ,QAAQwD,UAAUxD;EAClBiD;EACAhC,UAAUqJ,IAAIjK;EACdyM,QAAQR,SAAS5D,GAAG4B,KAAKjB,IAAI;EAC7B0D,iBAAiB;GACf,IAAI/H,IAAI7E,WAAW6E,IAAI/E,SAAS;GAChC+E,IAAI/E,UAAU;GACdqK,IAAIhK,UAAUyL,KAAKC,IAAI1B,IAAIhK,SAAS0E,IAAIjF,GAAG;GAC3C0L,oBAAoB/C,CAAC;GACrBD,cAAcC,CAAC;EACjB;EACAsE,WAAW/H,YAAYoH,WAAW3D,GAAG4B,KAAKtF,KAAKC,OAAO;CACxD,CAAC,CAAC,CAACgI,OAAOtK,UAAmB;EAC3B,IAAI,CAACqC,IAAI7E,SAASkM,WAAW3D,GAAG4B,KAAKtF,KAAK;GAAEE,MAAM;GAAYvC;EAAM,CAAC;CACvE,CAAC;AACH;AAeA,MAAa0K,cACX3E,GACAW,MACAtF,UACmB;CACnB,MAAMuG,MAAM5B,EAAE9B,QAAQkE,IAAIzB,KAAKpI,QAAQ;CACvCqJ,IAAI/J,UAAUpC,KAAKyL,IAAI;CACvB,MAAM0D,UAAU3B,gBAAgBrB,GAAG;CACnC,KAAK,MAAM9G,aAAaO,MAAMpD,KAC5B,IAAI6C,UAAUzD,OAAOuN,SAASpB,OAAOxD,GAAG4B,KAAK9G,UAAUzD,GAAG;CAE5D,MAAMwN,SAASxJ,MAAMZ,IAAIc,QAAQuJ,MAAMA,EAAEzN,MAAMsJ,KAAK5H,MAAM;CAC1D,MAAMgM,SAAS1J,MAAMpD,IAAIsD,QAAQuJ,MAAMA,EAAEzN,MAAMuN,OAAO;CACtD,IACGC,OAAOhP,SAAS,KAAKgP,OAAO,EAAE,CAAExN,QAAQsJ,KAAK5H,SAAS,KACtDgM,OAAOlP,SAAS,KAAKkP,OAAO,EAAE,CAAE1N,QAAQuN,UAAU,GACnD;EACA7B,oBAAoB/C,CAAC;EACrB,OAAO;GACLxD,MAAM;GACNiI,KAAK,EAAEA,KAAK;IAAEpN,KAAKuN;IAAS7L,QAAQ4H,KAAK5H;GAAO,EAAE;EACpD;CACF;CACA,IAAIgM,OAAOlP,SAAS,GAAG;EACrB,IAAImP,kBAAkB;EACtB,KAAK,MAAMC,UAAUjF,EAAE9B,QAAQhB,OAAO,GACpC8H,mBAAmBC,OAAO/M,SAAS4I;EAErC,IACEc,IAAI1J,SAAS4I,OAAOiE,OAAOlP,SAAAA,OAC3BmP,kBAAkBD,OAAOlP,SAASmK,EAAErC,qBAEpC,OAAO;GACLnB,MAAM;GACNiI,KAAK,EACHA,KAAK;IACHpN,KAAKuN;IACL7L,QAAQ4H,KAAK5H;IACb2L,OAAOvQ;GACT,EACF;EACF;CAEJ;CACA,KAAK0Q,OAAOhP,UAAUkP,OAAOlP,WAAWmK,EAAEjC,UAAU;EAClD,MAAM2G,QAAQ1E,EAAEjC,SAAS;EACzB,IAAI2G,UAAU,MAAM;GAClB,IAAI,CAAC3J,OAAOmK,cAAcR,KAAK,KAAKA,QAAQ,GAC1C,MAAM,IAAIS,UACR,yDACF;GACF,OAAO;IACL3I,MAAM;IACNiI,KAAK,EAAEA,KAAK;KAAEpN,KAAKuN;KAAS7L,QAAQ4H,KAAK5H;KAAQ2L;IAAM,EAAE;GAC3D;EACF;CACF;CACA,IAAIzL,mBAAmB0H,KAAK1H;CAC5B,IAAI;EACF,KAAK,MAAM6B,aAAa+J,QACtB5L,mBAAmBhG,iBACjBgG,kBACA6B,UAAUV,KACVuG,KAAKtI,UAAUkK,WACf,IACF;EACF,IACErH,aAAaS,OAAOC,KAAKC,UAAU,CAAC,GAAG5C,iBAAiBmM,SAAS,CAAC,CAAC,CAAC,CACjEtJ,aAAAA,OAEH,OAAOnC,UAAU,mBAAmB;CACxC,QAAQ;EACN,OAAOA,UAAU,iBAAiB;CACpC;CACAgH,KAAK1H,mBAAmBA;CACxB0H,KAAK3H,UAAW9F,aAAa+F,kBAAkB+G,EAAE1F,SAASP,IAAI,CAAC,EAAE9C,SAC/D;CACF,IAAI4N,OAAOhP,QAAQ8K,KAAK5H,SAAS8L,OAAOQ,GAAG,EAAE,CAAC,CAAEhO;CAChD,KAAK,MAAMyD,aAAaiK,QAAQf,SAAShE,GAAG4B,KAAKjB,MAAM7F,SAAS;CAChE,IAAIiK,OAAOlP,SAAS,GAElBiN,SAAS9C,GAAG4B,IAAIjK,IAAI;EAAEN,KAAK0N,OAAOM,GAAG,EAAE,CAAC,CAAEhO;EAAKsL,KAAK;CAAK,CAAC;CAE5DI,oBAAoB/C,CAAC;CACrBD,cAAcC,CAAC;CACf,OAAO,EAAExD,MAAM,KAAK;AACtB;AAEA,MAAMtC,WAAW8F,GAAoBW,MAAYM,SAAiB;CAChE,IAAI,CAACN,KAAKjI,QAAQsH,EAAEpB,YAAYoB,EAAEtB,aAAa,MAAM;CACrD,IAAIxC,iBAAiB+E,IAAI,GAAG;EAC1BD,OACEhB,GACAW,MACA/E,KAAKC,UAAU,EACb8D,KAAK;GACH/F,QAAQ;GACRM,SAAS;EACX,EACF,CAAC,CACH;EACAwG,UAAUV,GAAGW,MAAM,MAAM,iBAAiB;EAC1C;CACF;CACA,MAAM2E,QAAQ,CAAC3E,KAAKhI;CACpBgI,KAAKhI,WAAW;CAChB,IAAI0C;CACJ,IAAI;EACFA,QAAQiK,QAAQzI,kBAAkBoE,IAAI,CAAC,CAAC5F,QAAQU,WAAWkF,IAAI;CACjE,SAAShH,OAAO;EACd,MAAML,SAASI,gBAAgBC,KAAK;EACpC,IAAIL,WAAW,MAAM,MAAMK;EAC3B+G,OACEhB,GACAW,MACA/E,KAAKC,UAAU,EACb8D,KAAK;GACH/F,QAAQ;GACRM,SAASN;EACX,EACF,CAAC,CACH;EACA8G,UAAUV,GAAGW,MAAM,MAAM/G,MAAM;EAC/B;CACF;CACA,IAAIyB,MAAMZ,IAAI5E,WAAW,KAAKwF,MAAMpD,IAAIpC,WAAW,GAAG;CACtD,IAAI0P;CACJ,IAAI;EACFA,YAAYZ,WAAW3E,GAAGW,MAAMtF,KAAK;CACvC,SAASpB,OAAO;EACd,MAAML,SAASI,gBAAgBC,KAAK;EACpC,IAAIL,WAAW,MAAM,MAAMK;EAC3B+G,OACEhB,GACAW,MACA/E,KAAKC,UAAU,EAAE8D,KAAK;GAAE/F,QAAQ;GAAkBM,SAASN;EAAO,EAAE,CAAC,CACvE;EACA8G,UAAUV,GAAGW,MAAM,MAAM/G,MAAM;EAC/B;CACF;CACA,IAAI2L,UAAU/I,SAAS,WACrBwE,OAAOhB,GAAGW,MAAM/E,KAAKC,UAAU0J,UAAUd,GAAG,CAAC;AAEjD;AAEA,MAAMe,gBACJxF,GACAyF,SACA9I,MACA/C,WACG;CACH,IAAI,CAAC6L,QAAQ/M,MAAM;CACnB+M,QAAQ/M,OAAO;CACfsH,EAAE3B,aAAauC,OAAO6E,OAAO;CAC7B,IAAIA,QAAQnM,UAAU,MAAMoM,aAAaD,QAAQnM,KAAK;CACtD,IAAI;EACFmM,QAAQjN,OAAOqI,MAAMlE,MAAM/C,MAAM;CACnC,QAAQ,CACN;AAEJ;AAEA,MAAM+L,eAAeF,SAAsBxE,SAA0B;CACnE,IAAI,CAACwE,QAAQ/M,MAAM,OAAO;CAC1B,IAAI;EACF+M,QAAQjN,OAAO2I,KAAKF,IAAI;EACxB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,MAAM2E,yBAAyBpN,WAA+C;CAC5E,IAAI;EACFA,OAAO2I,KACLvF,KAAKC,UAAU,EACb8D,KAAK;GACH/F,QAAQ;GACR+C,MAAM;GACNzC,SAAStD;EACX,EACF,CAAC,CACH;CACF,QAAQ,CACN;CAEF,IAAI;EACF4B,OAAOqI,MAAM,MAAMjK,wBAAwB;CAC7C,QAAQ,CACN;CAEF,OAAO;AACT;AAEA,MAAMiP,8BACJ7F,GACAyF,SACAxL,UACG;CACH,MAAM6L,WAAW7L,iBAAiB+C,WAAW/C,QAAQ;CACrD,MAAM8L,eAAeD,UAAU7I,WAAW,OAAO6I,UAAU7I,WAAW;CACtE,MAAMA,SAAS6I,UAAU7I;CACzB,MAAM/C,UAAU6L,eACZ,iBACAD,UAAUE,eACT/I,WAAWxB,KAAAA,IAAY,yBAAyB,QAAQwB;CAC7D0I,YACEF,SACA7J,KAAKC,UAAU,EACb8D,KAAK;EACH/F,QACEqD,WAAW,MACP,cACA8I,eACE,iBACA;EACR7L;EACA,GAAI+C,WAAWxB,KAAAA,KAAa,EAAEwB,OAAO;CACvC,EACF,CAAC,CACH;CACAuI,aAAaxF,GAAGyF,SAASM,eAAe,OAAO,MAAM7L,OAAO;AAC9D;AAEA,MAAM+L,qBACJnJ,YAC2B;CAC3B,MAAMoJ,uBAAO,IAAI9H,IAAY;CAC7B,KAAK,MAAMrE,QAAQxE,OAAOa,KAAK0G,OAAO,GAAG;EACvC,MAAMxG,MAAMyD,KAAKoM,YAAY;EAC7B,IAAID,KAAKE,IAAI9P,GAAG,GAAG,MAAM,IAAI6O,UAAU,uBAAuB;EAC9De,KAAKG,IAAI/P,GAAG;CACd;CACA,OAAOf,OAAO+Q,YAAY,IAAIC,QAAQzJ,OAAO,CAAC;AAChD;AAEA,MAAM0J,qBACJxG,GACAzH,UACAC,QACAgH,YACkD;CAClD,MAAMxB,YAAYgC,EAAEhC;CACpB,IAAIwB,QAAQiH,eAAe,MASzB,OARqBE,SACnB3G,GACAzH,UACAC,QACAgH,QAAQiH,eAAe,MACvBjH,QAAQ1G,MACR0G,QAAQnH,SAEHqO,CAAY,EAAEjN,cAAc;CAErC,MAAMmN,UAAUjK,MAAc/C,WAAmB;EAC/C,IAAI;GACFpB,OAAOqI,MAAMlE,MAAM/C,MAAM;EAC3B,QAAQ,CACN;EAEF,OAAO;CACT;CACA,IAAIoG,EAAEpB,UAAU,OAAOgI,OAAO,MAAM,UAAU;CAC9C,IAAI,CAAC1R,aAAa2R,KAAKtO,QAAQ,GAAG,OAAOqO,OAAO,MAAM,mBAAmB;CACzE/E,MAAM7B,CAAC;CACP,IAAIA,EAAEtB,aAAa,MAAM;EACvB,IAAI;GACFlG,OAAO2I,KAAKvF,KAAKC,UAAU,EAAE8D,KAAKK,EAAEtB,SAAS,CAAC,CAAC;EACjD,QAAQ,CACN;EAEF,OAAOkI,OAAO,KAAM,UAAU;CAChC;CACA,MAAMnB,UAAuB;EAC3BjN;EACAE,MAAM;EACNU,aAAa;EACbC,QAAQ,CAAA;EACRC,OAAO;EACPG,YAAY;CACd;CACAuG,EAAE3B,aAAagI,IAAIZ,OAAO;CAC1BA,QAAQnM,QAAQE,iBAEZqM,2BACE7F,GACAyF,SACA,IAAIzI,SAAS,MAAM,EAAEC,QAAQ,IAAI,CAAC,CACpC,GACF+C,EAAEvC,eACJ;CACA,QAASnE,MAA4CgI,QAAQ;CAC7D,OAAO;EACL/I;EACA2B,UAAU+G,SAAS;GACjB,IAAIwE,QAAQhM,eAAe,MAAM;IAC/BgM,QAAQhM,WAAWS,QAAQ+G,IAAI;IAC/B;GACF;GACA,IAAI,CAACwE,QAAQ/M,QAAQsH,EAAEpB,YAAYoB,EAAEtB,aAAa,MAAM;GACxD,IAAIxC,iBAAiB+E,IAAI,GAAG;IAC1B0E,YACEF,SACA7J,KAAKC,UAAU,EACb8D,KAAK;KACH/F,QAAQ;KACRM,SAAS;IACX,EACF,CAAC,CACH;IACAsL,aAAaxF,GAAGyF,SAAS,MAAM,iBAAiB;IAChD;GACF;GACA,IAAIA,QAAQrM,aAAa;IACvBqM,QAAQpM,OAAO4B,KAAKgG,IAAI;IACxB;GACF;GACA,IAAI6F;GACJ,IAAI;IACFA,UAAUjK,kBAAkBoE,IAAI;GAClC,SAAShH,OAAO;IACd,IAAIA,iBAAiB+C,UAAU;KAC7B6I,2BAA2B7F,GAAGyF,SAASxL,KAAK;KAC5C;IACF;IACA,MAAML,SAASI,gBAAgBC,KAAK;IACpC,IAAIL,WAAW,MAAM,MAAMK;IAC3B0L,YACEF,SACA7J,KAAKC,UAAU,EACb8D,KAAK;KACH/F,QAAQ;KACRM,SAASN;IACX,EACF,CAAC,CACH;IACA4L,aAAaxF,GAAGyF,SAAS,MAAM7L,MAAM;IACrC;GACF;GACA,MAAMyB,QAAQyL,QAAQzL;GACtB,IAAIyB;GACJ,IAAI;IACFA,UAAU;KACR,GAAGmJ,kBAAkBa,QAAQhK,OAAO;KACpC,GAAGmJ,kBAAkBzG,QAAQ1C,WAAW,CAAC,CAAC;IAC5C;GACF,QAAQ;IACN6I,YACEF,SACA7J,KAAKC,UAAU,EACb8D,KAAK;KACH/F,QAAQ;KACRM,SAAS;IACX,EACF,CAAC,CACH;IACAsL,aAAaxF,GAAGyF,SAAS,MAAM,mBAAmB;IAClD;GACF;GACA,IAAIrE,kBAAkBpB,CAAC,GAAG;IACxB2F,YACEF,SACA7J,KAAKC,UAAU,EACb8D,KAAK;KACH/F,QAAQ;KACR+C,MAAM;KACNzC,SAAStD;IACX,EACF,CAAC,CACH;IACA4O,aAAaxF,GAAGyF,SAAS,MAAM7O,wBAAwB;IACvD;GACF;GACA6O,QAAQrM,cAAc;GACtB0G,QAAQiH,QAAQ,CAAC,CACdC,WAAWhJ,YAAY,EAAElB,QAAQ,CAAC,CAAC,CAAC,CACpCkK,MAAMlO,SAAS;IACd,IAAI,CAAC2M,QAAQ/M,QAAQsH,EAAEpB,YAAYoB,EAAEtB,aAAa,MAAM;IACxD,MAAMrG,YAAYtF,mBAChB,IAAIwT,QAAQzJ,OAAO,GACnBkD,EAAE1C,aACF,CAAC0C,EAAE1F,QAAQ,CACb;IACA,IAAI,SAASjC,WAAW;KACtBsN,YAAYF,SAAS7J,KAAKC,UAAUxD,SAAS,CAAC;KAC9CmN,aAAaxF,GAAGyF,SAAS,MAAMpN,UAAUsH,IAAIzF,OAAO;KACpD;IACF;IACAsF,QAAQyH,eAAenO,MAAMT,SAAS;IACtCoN,QAAQ/M,OAAO;IACfsH,EAAE3B,aAAauC,OAAO6E,OAAO;IAC7B,IAAIA,QAAQnM,UAAU,MAAMoM,aAAaD,QAAQnM,KAAK;IACtD,MAAMoN,eAAeC,SACnB3G,GACAzH,UACAC,QACA,MACAM,MACAT,SACF;IACA,IAAIqO,iBAAiB,MAAM;IAC3BjB,QAAQhM,aAAaiN,aAAajN;IAClC,IAAI4B,MAAMZ,IAAI5E,UAAUwF,MAAMpD,IAAIpC,QAChCqE,QACE8F,GACA0G,aAAa/F,MACb/E,KAAKC,UAAU;KACb,GAAIR,MAAMZ,IAAI5E,SAAS,EAAE4E,KAAKY,MAAMZ,IAAI,IAAI,CAAC;KAC7C,GAAIY,MAAMpD,IAAIpC,SAAS,EAAEoC,KAAKoD,MAAMpD,IAAI,IAAI,CAAC;IAC/C,CAAC,CACH;IAEF,KAAK,MAAMgJ,QAAQwE,QAAQpM,OAAO6N,OAAO,CAAC,GACxCR,aAAajN,WAAWS,QAAQ+G,IAAI;GACxC,CAAC,CAAC,CACDsD,OAAOtK,UAAmB;IACzB,IAAIwL,QAAQ/M,MAAMmN,2BAA2B7F,GAAGyF,SAASxL,KAAK;GAChE,CAAC;EACL;EACA4G,aAAa;GACX,IAAI4E,QAAQhM,eAAe,MAAMgM,QAAQhM,WAAWoH,MAAM;QACrD2E,aAAaxF,GAAGyF,OAAO;EAC9B;CACF;AACF;AAEA,MAAM0B,aAAanH,MAAuB;CACxC,IAAIoH,SAASpH,EAAE9B,QAAQ4C,OAAOd,EAAEnC;CAChC,IAAIuJ,UAAU,GAAG;CACjB,IAAIC,UAAU;CACd,MAAMC,OAAO,IAAIlJ,IAAI,CAAC,GAAG4B,EAAE7B,KAAK,CAAC,CAACkE,KAAK1B,SAASA,KAAKpI,QAAQ,CAAC;CAC9D,MAAMgP,SAAS,CAAC,GAAGvH,EAAE9B,QAAQhB,OAAO,CAAC,CAAC,CAAC1B,MAAMnG,GAAGC,MAAMD,EAAEwC,UAAUvC,EAAEuC,OAAO;CAC3E,KAAK,MAAM+J,OAAO2F,QAAQ;EACxB,IAAIH,UAAU,GAAG;EACjB,IAAIE,KAAKlB,IAAIxE,IAAIjK,EAAE,KAAKiK,IAAI1J,SAAS4I,OAAO,GAAG;EAC/Cd,EAAE9B,QAAQ0C,OAAOgB,IAAIjK,EAAE;EACvB0P,UAAU;EACVD,UAAU;CACZ;CACA,IAAIC,SAAStE,oBAAoB/C,CAAC;AACpC;AAOA,MAAa2G,YACX3G,GACAzH,UACAC,QACAG,WAAW,OACXG,OAAgB2C,KAAAA,GAChBpD,YAAyC;CACvCoP,SAASzH,EAAE1C,YAAYmK;CACvBlF,WAAW,CAAC;EAAExI,MAAMiG,EAAE1F,SAASP;EAAM0N,SAASzH,EAAE1F,SAASmN;CAAQ,CAAC;AACpE,MACwB;CACxB,MAAMb,UAAUjK,MAAc/C,WAAmB;EAC/C,IAAI;GACFpB,OAAOqI,MAAMlE,MAAM/C,MAAM;EAC3B,QAAQ,CACN;EAEF,OAAO;CACT;CACA,IAAIoG,EAAEpB,UAAU,OAAOgI,OAAO,MAAM,UAAU;CAC9C,IAAI,CAAC1R,aAAa2R,KAAKtO,QAAQ,GAAG,OAAOqO,OAAO,MAAM,mBAAmB;CACzE/E,MAAM7B,CAAC;CACP,IAAIA,EAAEtB,aAAa,MAAM;EACvB,IAAI;GACFlG,OAAO2I,KAAKvF,KAAKC,UAAU,EAAE8D,KAAKK,EAAEtB,SAAS,CAAC,CAAC;EACjD,QAAQ,CACN;EAEFkI,OAAO,KAAM,UAAU;EACvB,OAAO;CACT;CACA,IAAIxF,kBAAkBpB,CAAC,GACrB,OAAO4F,sBAAsBpN,MAAM;CAErC,MAAMkP,QAAQ1H,EAAE9B,QAAQkE,IAAI7J,QAAQ;CACpC,IAAImP,UAAUjM,KAAAA,KAAa,CAACrG,WAAWsS,MAAMvP,WAAWW,IAAI,GAAG;EAC7D,IAAI;GACFN,OAAO2I,KACLvF,KAAKC,UAAU,EACb8D,KAAK;IACH/F,QAAQ;IACRM,SAAS/E;IACT8H,QAAQ;GACV,EACF,CAAC,CACH;EACF,QAAQ,CACN;EAEF,OAAO2J,OAAO,MAAMzR,0BAA0B;CAChD;CACA,MAAMyM,MACJ8F,gBACO;EACL,MAAMC,UAAqB;GACzBhQ,IAAIY;GACJX,SAAS;GACTC,SAASpC,KAAKyL,IAAI;GAClBpJ,yBAAS,IAAIC,IAAI;GACjBG,0BAAU,IAAIH,IAAI;GAClBI,WAAWW;EACb;EACAkH,EAAE9B,QAAQ2E,IAAItK,UAAUoP,OAAO;EAC/B,OAAOA;CACT,EAAA,CAAG;CACL/F,IAAI/J,UAAUpC,KAAKyL,IAAI;CACvB,MAAMP,OAAa;EACjBtI;EACAE;EACAC;EACAE,MAAM;EACNC;EACAC,YAAY;EACZC,OAAO;EACPC;EACAC,QAAQ;EACRC,SAAS;EACTC,kBAAkB;GAAE2O,MAAM;GAAWxC,2BAAW,IAAIrN,IAAI;EAAE;CAC5D;CACAiI,EAAE7B,MAAMkI,IAAI1F,IAAI;CAChBwG,UAAUnH,CAAC;CACX+C,oBAAoB/C,CAAC;CACrBqB,gBAAgBrB,CAAC;CACjB,MAAM,EAAE/I,OAAOC,SAAStE,eAAeoN,EAAEhB,UAAW6I,SAAS,CAAC;CAC9D,MAAMC,QAA2B;EAC/B1N,KAAK,CACH;GACErD,IAAI;GACJuD,UAAU0F,EAAE1F,SAASP;GACrBgO,MAAM;GACN9Q;GACA,GAAIC,SAASuE,KAAAA,KAAa,EAAEvE,KAAK;EACnC,CAAC;EAEHuN,KAAK;GACH,GAAGpM;GACHhB,KAAK4L,gBAAgBrB,GAAG;GACxB7I,QAAQ;GACR,GAAIiH,EAAEvB,YAAY,EAAEgE,MAAM,KAAK;EACjC;CACF;CACA,IAAI,CAACpK,UAAUkK,UAAUpF,MAAMqF,MAAMA,EAAEzI,SAASiG,EAAE1F,SAASP,IAAI,GAC7D+N,MAAM1N,MAAM,CAAA;CACd4G,OAAOhB,GAAGW,MAAM/E,KAAKC,UAAUiM,KAAK,CAAC;CAMrC,OAAO;EAAEnH;EAAMlH,YAAAA;GAJblB;GACA2B,UAAU+G,SAAS/G,QAAQ8F,GAAGW,MAAMM,IAAI;GACxCJ,aAAaH,UAAUV,GAAGW,IAAI;EAEjBlH;CAAW;AAC5B;AAEA,MAAM8F,WACJS,GACAzH,UACAC,QACAgH,UAAsD,CAAC,MACL;CAClD,OAAOgH,kBAAkBxG,GAAGzH,UAAUC,QAAQgH,OAAO;AACvD;AAEA,MAAME,UAAUM,GAAoBL,QAA2B;CAC7D,IACEA,IAAI+E,UAAUjJ,KAAAA,MACb,CAACV,OAAOmK,cAAcvF,IAAI+E,KAAK,KAAK/E,IAAI+E,QAAQ,IAEjD,MAAM,IAAI5K,MAAM,qDAAqD;CAEvE,IAAIkG,EAAEtB,aAAa,QAAQsB,EAAEpB,UAAU;CACvCoB,EAAEd,cAAc8I,QAAQ;CACxBhI,EAAEtB,WAAWiB;CACb,KAAK,MAAM8F,WAAW,CAAC,GAAGzF,EAAE3B,YAAY,GAAG;EACzCsH,YAAYF,SAAS7J,KAAKC,UAAU,EAAE8D,IAAI,CAAC,CAAC;EAC5C6F,aAAaxF,GAAGyF,SAAS,KAAM9F,IAAI/F,MAAM;CAC3C;CACAiI,MAAM7B,GAAGL,GAAG;AACd;AAEA,MAAMsI,UAAUjI,MAAuB;CACrCA,EAAEpB,WAAW;CACboB,EAAEhB,WAAWyB,SAAS1J,OAAOkJ,SAASD,GAAGjJ,EAAE,CAAC;AAC9C;AAEA,MAAMmR,WAAWlI,MAAuB;CACtCA,EAAEpB,WAAW;CACb,IAAIoB,EAAElB,mBAAmB,MAAM;EAC7BiC,cAAcf,EAAElB,cAAc;EAC9BkB,EAAElB,iBAAiB;CACrB;CACAkB,EAAEhB,WAAWyB,QAAQ,IAAI;AAC3B;AAEA,MAAM0H,wBACJC,UAAyD,CAAA,MAEzD,IAAIrQ,IACFqQ,QAAQ/F,KAAKiG,WAAW,CACtBA,OAAO3Q,IACP;CACEA,IAAI2Q,OAAO3Q;CACXC,SAAS0Q,OAAO1Q;CAChBC,SAASyQ,OAAOzQ;CAChBC,SAAS,IAAIC,IACXuQ,OAAOxQ,QAAQuK,KAAK,EAAEhL,KAAKW,IAAIC,UAAU,CAACZ,KAAK;EAAEW;EAAIC;CAAI,CAAC,CAAC,CAC7D;CACAC,0BAAU,IAAIH,IAAI;CAClBI,WAAWmQ,OAAOnQ;AACpB,CAAC,CACF,CACH;AAEF,MAAMoQ,iBACJC,WACAhJ,SACAJ,gBAIG;CACH,MAAM,CAACY,KAAK3M,eAAgC;EAC1C,MAAMsV,OAAwB;GAC5BrO,UAAU;IAAEP,MAAMlH;IAAkB4U,SAAS3U;GAAa;GAC1DwK,aAAa,EAAEmK,SAAS3U,aAAa;GACrC0K,aAAa;GACbC,iBAAiB;GACjBC,gBAAgB/G;GAChBgH,qBAAqBnJ;GACrBoJ,iBAAiB/G;GACjBgH,mBAAmBnH;GACnBoH,WAAW;GACXC,UAAUtC,KAAAA;GACVuC,WAAWvC,KAAAA;GACXyC,SAASiK,qBAAqB/I,aAAawJ,aAAa;GACxDzK,uBAAO,IAAIC,IAAI;GACfC,8BAAc,IAAID,IAAI;GACtBE,YAAY,CAAA;GACZC,gCAAgB,IAAIxG,IAAI;GACxByG,6BAAa,IAAIzG,IAAI;GACrB0G,UAAU;GACVC,UAAU;GACVE,UAAU;GACVC,gBAAgB;GAChBC,gBAAgB;GAChBE,WAAW;GACXE,cAAc;GACdC,SAAS;GACTC;GACAE,MAAM7K,4BAA4B;IAChCkU,KAAK9J,iBAAiB;IACtBgD,MAAM8G,IAAI;GACZ,CAAC;GACDpJ,UAAUhH,UAAUC,QAAQqQ,mBAC1BtJ,QAAQoJ,MAAMpQ,UAAUC,QAAQqQ,cAAc;GAChDnJ,SAASC,QAAQD,OAAOiJ,MAAMhJ,GAAG;GACjC3K,SAAS4K,YAAY3K,OAAY0T,MAAM/I,OAAO;GAC9C9K,SAAS8K,cAAY7K,OAAY4T,MAAM/I,SAAO;EAChD;EACA,OAAO+I;CACT,CAAC;CACD3I,EAAE1F,WAAWkF,SAASlF,YAAY;EAChCP,MAAAA;EACA0N,SAAAA;CACF;CACAzH,EAAE1C,cAAckC,SAASlC,eAAe,EAAEmK,SAAAA,aAAsB;CAChElG,eAAevB,GAAGR,SAASsJ,uBAAuB,IAAM;CACxD9I,EAAEjC,WAAWyB,SAASzB;CACtBiC,EAAEvC,kBAAkB+B,SAAS/B,mBAAmB;CAChD,MAAMC,iBACJ8B,SAAS9B,mBAAmBjC,KAAAA,IACxB9E,kBACA6I,QAAQ9B;CACd,IAAI,CAAC3C,OAAOC,UAAU0C,cAAc,KAAKA,iBAAiB,GACxD,MAAM,IAAIyH,UAAU,2CAA2C;CAEjEnF,EAAEtC,iBAAiBA;CACnB,MAAMC,sBACJ6B,SAAS7B,wBAAwBlC,KAAAA,IAC7BjH,iCACAgL,QAAQ7B;CACd,IAAI,CAAC5C,OAAOC,UAAU2C,mBAAmB,KAAKA,sBAAsB,GAClE,MAAM,IAAIwH,UAAU,gDAAgD;CAEtEnF,EAAErC,sBAAsBA;CACxB,MAAMC,kBACJ4B,SAAS5B,oBAAoBnC,KAAAA,IACzB5E,oBACA2I,QAAQ5B;CACd,IAAI,CAAC7C,OAAOC,UAAU4C,eAAe,KAAKA,kBAAkB,GAC1D,MAAM,IAAIuH,UAAU,4CAA4C;CAElEnF,EAAEpC,kBAAkBA;CACpBoC,EAAEnC,oBAAoB2B,SAAS3B,qBAAqBnH;CACpDsJ,EAAElC,YAAY0B,SAAS1B,aAAa;CACpCkC,EAAEhC,YAAYwB,SAASxB;CACvB,MAAM/G,QAAQzD,YAAYgV,SAAS;CACnCtI,OAAOF,GAAG/I,KAAK;CACf7D,gBAAgB;EACd8M,OAAOF,GAAG/I,KAAK;EACf8I,cAAcC,CAAC;CACjB,CAAC;CACD5M,gBAAgB;EACd6U,OAAOjI,CAAC;EACR,aAAakI,QAAQlI,CAAC;CACxB,GAAG,CAACA,CAAC,CAAC;CACN,OAAOA;AACT;;;;;;;;;AAUA,MAAa+I,uBACXP,WACAhJ,SACAJ,gBACqC;CACrC,MAAM4J,uBAAiB;EAAA,OAAMT,cAAcC,WAAWhJ,SAASJ,WAAW;CAAC;CAC3E,MAAM6J,OAAO3V,cAAc0V,cAAc;CACzC,IAAIpK,WAAW;CACf,OAAO;EACLW,UAAUhH,UAAUC,QAAQqQ,mBAC1BtV,mBACE0V,KAAKC,SAAS,CAAC,CAAC3J,QAAQhH,UAAUC,QAAQqQ,cAAc,CAC1D;EACF7T,SAAS4K,YAAYrM,mBAAmB0V,KAAKC,SAAS,CAAC,CAAClU,OAAO4K,OAAO,CAAC;EACvE9K,SAAS8K,YAAYrM,mBAAmB0V,KAAKC,SAAS,CAAC,CAACpU,OAAO8K,OAAO,CAAC;EACvEF,SAASC,QAAQpM,mBAAmB0V,KAAKC,SAAS,CAAC,CAACxJ,OAAOC,GAAG,CAAC;EAC/DwJ,eAAe;GACb,IAAIvK,UAAU;GACdA,WAAW;GACXrL,mBACE0V,KAAKC,SAAS,CAAC,CAACxJ,OAAO;IAAE9F,QAAQ;IAAa+C,MAAM;GAAU,CAAC,CACjE;GACAsM,KAAKG,QAAQ;EACf;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"socket.js","names":["encodeDocument","DEFAULT_PROTOCOL","WIRE_VERSION","negotiateProtocols","StatewireProtocol","useEffect","useState","createTapRoot","flushTapSync","useResource","ResourceElement","documentIdentity","getCommandsHost","getStateHost","CommandsHost","CommandsOutcome","StatewireSendError","Statewire","StatewireHost","StatewireHostInternal","reviveValue","sanitizeValue","COMMAND_CAPACITY_RETRY_MS","MAX_COMMANDS_PER_FRAME","MAX_EPHEMERAL_DOCUMENT_BYTES","MAX_FRAME_BODY_BYTES","MAX_INFLIGHT_COMMANDS_PER_CLIENT","MAX_INFLIGHT_COMMANDS_PER_HOST","createMacrotaskPoster","StatewireDocument","StatewirePath","frames","serveFrames","stream","serveStream","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","authEquals","a","b","Object","is","Date","getTime","Array","isArray","length","every","v","i","getPrototypeOf","prototype","keysA","keys","keysB","key","Record","RESULT_TTL_MS","RESULT_LIMIT","CLIENT_RECORD_LIMIT","MAX_SUBSCRIBERS","SUBSCRIBER_LIMIT_MESSAGE","STREAM_QUEUE_SIZE","Cmd","WireOp","op","doc","path","value","meta","MetaEntry","protocol","main","Admission","seq","method","applied","appliedSent","settled","Lane","clientId","conn","Conn","lastSeq","results","Map","ts","cmd","inflight","ClientRec","id","touched","lanes","principal","selection","Selection","socket","Socket","open","ready","sawFrame","lastSentAt","lease","auth","documents","Document","included","Set","view","nextDoc","pendingApplied","pendingCmds","attach","Attach","PendingConn","authorizing","queued","timer","ReturnType","setTimeout","connection","SocketConnection","violation","reason","assign","Error","name","violationReason","error","message","CmdStatement","params","ParsedFrame","isPlainObject","frameEncoder","TextEncoder","parseFrameValue","frame","unknown","filter","sort","lane","prev","statement","Number","isInteger","last","get","undefined","set","push","parseFrame","raw","JSON","parse","frameIsOversized","encode","byteLength","encodePayload","payload","cmdOf","adm","outcome","at","type","failure","fate","code","String","parseInitialFrame","headers","Response","status","values","some","SocketHostState","Definition","wireVersion","Range","heartbeatMs","wsInitTimeoutMs","maxSubscribers","maxInflightCommands","streamQueueSize","clientRecordLimit","finOnIdle","pushback","authorize","SocketHostOptions","clients","conns","pendingConns","pendingOps","viewsDirty","idleWire","finished","Fin","disposed","flushScheduled","heartbeatTimer","setInterval","stateHost","StateHost","commandsHost","current","persistence","SocketHostPersistence","post","connect","options","SocketConnectOptions","finish","fin","request","Request","Promise","scheduleFlush","h","markViews","recordOp","next","nextState","state","nextCommands","commands","submit","setOnOp","setOnDocuments","closeConn","delete","close","detached","size","clearInterval","sendTo","data","now","send","violate","stringify","atSubscriberLimit","ensureHeartbeat","unref","setHeartbeatMs","ms","durableLanes","rec","allLanes","idleLevel","work","isIdle","selects","protocols","p","viewOf","shared","hostMain","record","has","diffView","ops","entry","number","attachOf","requireSelected","find","document","snapshot","mount","encoded","other","unmount","include","add","exclude","flush","takeChanged","queueApplied","level","edge","mainOps","cmds","forConn","list","appliedEntries","splice","idle","verdicts","queueCmd","notifyClientRecords","onClientRecordsChange","map","fromEntries","admittedThrough","retain","newest","Math","max","min","watermark","laneOf","ephemeral","reemit","cached","settleCmd","settleWire","callerOf","Caller","isConnected","rejectStatement","admitCmd","rejectUnknown","names","methods","caller","onApplied","onSettle","catch","FrameAdmission","syn","retry","refusal","admitFrame","s","through","fresh","durableNew","first","clientLoad","hostLoad","isSafeInteger","TypeError","findLast","dur","admission","closePending","pending","clearTimeout","sendPending","refuseSubscriberLimit","rejectPendingAuthorization","response","unauthorized","statusText","normalizedHeaders","seen","toLowerCase","Headers","connectAuthorized","authorized","registration","register","refuse","test","initial","resolve","then","onAuthorized","Registration","gcClients","excess","changed","live","oldest","version","known","created","isEphemeral","early","late","admit","statements","earlyAdmission","answers","hello","lateAdmission","abort","resume","suspend","restoreClientRecords","records","ClientRecord","entries","useSocketHost","transport","Pick","SocketHost","host","clientRecords","connectOptions","heartbeatIntervalMs","StatewireSocketHost","SocketHostRoot","root","getValue","dispose"],"sources":["../../src/host/socket.ts"],"sourcesContent":["import { encodeDocument } from \"../document\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n negotiateProtocols,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useState } from \"react\";\nimport { createTapRoot, flushTapSync, useResource } from \"@assistant-ui/tap\";\nimport type { ResourceElement } from \"@assistant-ui/tap\";\nimport { documentIdentity, getCommandsHost, getStateHost } from \"./host\";\nimport type { CommandsHost, CommandsOutcome } from \"./host\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireHost } from \"../host\";\nimport type { StatewireHostInternal } from \"../host-internal\";\nimport { reviveValue } from \"../wire/meta\";\nimport { sanitizeValue } from \"../wire/ops\";\nimport {\n COMMAND_CAPACITY_RETRY_MS,\n MAX_COMMANDS_PER_FRAME,\n MAX_EPHEMERAL_DOCUMENT_BYTES,\n MAX_FRAME_BODY_BYTES,\n MAX_INFLIGHT_COMMANDS_PER_CLIENT,\n MAX_INFLIGHT_COMMANDS_PER_HOST,\n} from \"../wire/limits\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport type { StatewireDocument } from \"../document\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { frames as serveFrames, stream as serveStream } from \"./http\";\n\nexport const CLIENT_ID_RE = /^[A-Za-z0-9._~-]{1,256}$/;\nexport const PRINCIPAL_MISMATCH_MESSAGE =\n \"client id is bound to another principal\";\n\n/** Structural equality over auth values: primitives, Dates, arrays, and plain\n * objects compare by value; anything else by identity. */\nexport const authEquals = (a: unknown, b: unknown): boolean => {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => authEquals(v, b[i]));\n }\n if (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n Object.getPrototypeOf(a) === Object.prototype &&\n Object.getPrototypeOf(b) === Object.prototype\n ) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n return (\n keysA.length === keysB.length &&\n keysA.every(\n (key) =>\n key in b &&\n authEquals(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key],\n ),\n )\n );\n }\n return false;\n};\n\nconst RESULT_TTL_MS = 30_000;\nconst RESULT_LIMIT = 256;\nconst CLIENT_RECORD_LIMIT = 1024;\nconst MAX_SUBSCRIBERS = 1024;\nexport const SUBSCRIBER_LIMIT_MESSAGE = \"stream subscriber limit reached\";\nconst STREAM_QUEUE_SIZE = 256;\n\ntype Cmd = StatewireHostInternal.Cmd;\n\ntype WireOp = {\n op: string;\n doc?: number;\n path?: StatewirePath;\n value?: unknown;\n meta?: StatewireDocument.MetaEntry[];\n protocol?: string;\n key?: readonly string[];\n main?: boolean;\n};\n\ntype Admission = {\n protocol: string;\n seq: number;\n method: string;\n applied: boolean;\n appliedSent: boolean;\n settled: boolean;\n};\n\n/** One statement lane: durable lanes live on the client record, ephemeral lanes on the attach. */\ntype Lane = {\n protocol: string;\n clientId: string;\n conn: Conn | null;\n lastSeq: number;\n results: Map<number, { ts: number; cmd: Cmd }>;\n inflight: Map<number, Admission>;\n};\n\nexport type ClientRec = {\n id: string;\n touched: number;\n lanes: Map<string, Lane>;\n /** The auth captured at the record's first attach; later attaches must match. */\n principal: unknown;\n};\n\n// A Conn outlives its socket so an admitted command keeps its attach view.\nexport type Conn = {\n selection: StatewireProtocol.Selection;\n clientId: string;\n socket: StatewireHostInternal.Socket;\n open: boolean;\n ready: boolean;\n sawFrame: boolean;\n lastSentAt: number;\n lease: string | null;\n /** The awaited `authorize` return captured at this attach's authorization. */\n auth: unknown;\n lanes: Map<string, Lane>;\n documents: Map<string, StatewireHost.Document>;\n included: Set<string>;\n view: Map<string, { doc: number; value: unknown }>;\n nextDoc: number;\n pendingApplied: Cmd[];\n pendingCmds: Cmd[];\n attach: StatewireHost.Attach;\n};\n\ntype PendingConn = {\n socket: StatewireHostInternal.Socket;\n open: boolean;\n authorizing: boolean;\n queued: string[];\n timer: ReturnType<typeof setTimeout> | null;\n connection: StatewireHostInternal.SocketConnection | null;\n};\n\n// ─── frame parsing ──────────────────────────────────────\n\nconst violation = (reason: string): never => {\n throw Object.assign(new Error(reason), { name: \"StatewireViolation\" });\n};\n\nconst violationReason = (error: unknown): string | null =>\n error instanceof Error && error.name === \"StatewireViolation\"\n ? error.message\n : null;\n\ntype CmdStatement = {\n protocol: string;\n seq: number;\n method: string;\n params: unknown;\n meta?: unknown;\n};\n\nexport type ParsedFrame = { cmd: CmdStatement[] };\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst frameEncoder = new TextEncoder();\n\nexport const parseFrameValue = (frame: unknown): ParsedFrame => {\n if (!isPlainObject(frame)) return violation(\"malformed frame\");\n const keys = Object.keys(frame);\n if (keys.length === 0) return violation(\"malformed frame\");\n const unknown = keys.filter((key) => key !== \"cmd\").sort();\n if (unknown.length > 0)\n return violation(`unknown frame key: '${unknown[0]}'`);\n const lane = frame[\"cmd\"];\n if (!Array.isArray(lane)) return violation(\"malformed frame\");\n if (lane.length === 0) return violation(\"empty lane\");\n if (lane.length > MAX_COMMANDS_PER_FRAME)\n return violation(\"too many commands\");\n const prev = new Map<string, number>();\n const cmd: CmdStatement[] = [];\n for (const statement of lane) {\n if (!isPlainObject(statement)) return violation(\"malformed statement\");\n const seq = statement[\"seq\"];\n const method = statement[\"method\"];\n const protocol = statement[\"protocol\"];\n if (\n typeof seq !== \"number\" ||\n !Number.isInteger(seq) ||\n seq < 1 ||\n typeof method !== \"string\" ||\n typeof protocol !== \"string\" ||\n !(\"params\" in statement)\n ) {\n return violation(\"malformed statement\");\n }\n const last = prev.get(protocol);\n if (last !== undefined && seq !== last + 1)\n return violation(\"malformed frame\");\n prev.set(protocol, seq);\n cmd.push({\n protocol,\n seq,\n method,\n params: statement[\"params\"],\n ...(statement[\"meta\"] !== undefined && { meta: statement[\"meta\"] }),\n });\n }\n return { cmd };\n};\n\nexport const parseFrame = (raw: string): ParsedFrame => {\n let frame: unknown;\n try {\n frame = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n return parseFrameValue(frame);\n};\n\nconst frameIsOversized = (raw: string): boolean =>\n raw.length > MAX_FRAME_BODY_BYTES ||\n frameEncoder.encode(raw).byteLength > MAX_FRAME_BODY_BYTES;\n\n// ─── verdict encoding ───────────────────────────────────\n\nconst encodePayload = (\n payload: unknown,\n): { payload?: unknown; meta?: StatewireDocument.MetaEntry[] } => {\n if (payload === undefined) return {};\n const { value, meta } = encodeDocument(payload);\n return { payload: value, ...(meta !== undefined && { meta }) };\n};\n\nconst cmdOf = (adm: Admission, outcome: CommandsOutcome): Cmd => {\n const at = { protocol: adm.protocol, seq: adm.seq };\n if (outcome.type === \"accepted\") {\n return { ...at, type: \"result\", ...encodePayload(outcome.payload) };\n }\n const failure =\n outcome.error instanceof StatewireSendError ? outcome.error.failure : null;\n switch (failure?.fate) {\n case \"crashed\":\n return { ...at, type: \"crashed\" };\n case \"failed\":\n return {\n ...at,\n type: \"failed\",\n ...(failure.message !== undefined && { message: failure.message }),\n };\n case \"rejected\": {\n if (failure.code !== undefined) {\n const message =\n failure.code === \"unknown-command\"\n ? `unknown method: '${adm.method}'`\n : failure.message;\n return {\n ...at,\n type: \"rejected\",\n code: failure.code,\n ...(message !== undefined && { message }),\n };\n }\n return {\n ...at,\n type: \"rejected\",\n ...(failure.message !== undefined && { message: failure.message }),\n ...encodePayload(failure.payload),\n };\n }\n default:\n return {\n ...at,\n type: \"failed\",\n message:\n outcome.error instanceof Error\n ? outcome.error.message\n : String(outcome.error),\n };\n }\n};\n\nconst parseInitialFrame = (raw: string) => {\n let value: unknown;\n try {\n value = JSON.parse(raw);\n } catch {\n return violation(\"malformed frame\");\n }\n if (!isPlainObject(value)) return violation(\"malformed frame\");\n const { headers, ...lanes } = value;\n if (headers === undefined) throw new Response(null, { status: 401 });\n if (\n !isPlainObject(headers) ||\n Object.values(headers).some((v) => typeof v !== \"string\")\n ) {\n return violation(\"malformed headers\");\n }\n return {\n headers: headers as Record<string, string>,\n frame: Object.keys(lanes).length ? parseFrameValue(lanes) : { cmd: [] },\n };\n};\n\n// ─── host ───────────────────────────────────────────────\n\nexport type SocketHostState = {\n protocol: StatewireProtocol.Definition;\n wireVersion: StatewireProtocol.Range;\n heartbeatMs: number;\n wsInitTimeoutMs: number;\n maxSubscribers: number;\n maxInflightCommands: number;\n streamQueueSize: number;\n clientRecordLimit: number;\n finOnIdle: boolean;\n pushback: (() => number | null) | undefined;\n authorize: StatewireHostInternal.SocketHostOptions[\"authorize\"];\n clients: Map<string, ClientRec>;\n conns: Set<Conn>;\n pendingConns: Set<PendingConn>;\n pendingOps: WireOp[];\n pendingApplied: Map<string, Cmd[]>;\n pendingCmds: Map<string, Cmd[]>;\n viewsDirty: boolean;\n idleWire: boolean;\n finished: StatewireHost.Fin | null;\n disposed: boolean;\n flushScheduled: boolean;\n heartbeatTimer: ReturnType<typeof setInterval> | null;\n stateHost: StatewireHost.StateHost | null;\n commandsHost: CommandsHost | null;\n current: Statewire<unknown> | null;\n persistence: StatewireHostInternal.SocketHostPersistence | undefined;\n post: () => void;\n connect: (\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options?: StatewireHostInternal.SocketConnectOptions,\n ) => StatewireHostInternal.SocketConnection | null;\n finish: (fin: StatewireHost.Fin) => void;\n stream: (request: Request) => Promise<Response>;\n frames: (request: Request) => Promise<Response>;\n};\n\nconst scheduleFlush = (h: SocketHostState) => {\n if (h.flushScheduled || h.disposed) return;\n h.flushScheduled = true;\n h.post();\n};\n\nconst markViews = (h: SocketHostState) => {\n h.viewsDirty = true;\n scheduleFlush(h);\n};\n\nconst recordOp = (\n h: SocketHostState,\n op: {\n op: string;\n path?: StatewirePath;\n value?: unknown;\n },\n) => {\n if (op.op === \"replace\" || op.op === \"add\") {\n const { value, meta } = encodeDocument(op.value);\n h.pendingOps.push({ ...op, value, ...(meta !== undefined && { meta }) });\n } else {\n h.pendingOps.push(op);\n }\n scheduleFlush(h);\n};\n\nconst attach = (h: SocketHostState, next: Statewire<unknown>) => {\n if (next === h.current) return;\n h.current = next;\n const nextState =\n typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined;\n const nextCommands = getCommandsHost(next.commands);\n if (!nextState || !nextCommands?.submit) {\n throw new Error(\n \"StatewireSocketHost requires a statewire/host transport (useStatewireState with object state, useStatewireCommands)\",\n );\n }\n if (nextState !== h.stateHost) {\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n h.stateHost = nextState;\n h.stateHost.setOnOp((op) => recordOp(h, op));\n h.stateHost.setOnDocuments(() => markViews(h));\n }\n h.commandsHost = nextCommands;\n};\n\nexport const closeConn = (\n h: SocketHostState,\n conn: Conn,\n code?: number,\n reason?: string,\n) => {\n if (!conn.open) return;\n conn.open = false;\n h.conns.delete(conn);\n try {\n conn.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n h.current?.detached?.(conn.attach);\n if (h.conns.size === 0 && h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n};\n\nexport const sendTo = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open) return;\n conn.lastSentAt = Date.now();\n try {\n conn.socket.send(data);\n } catch {\n closeConn(h, conn);\n }\n};\n\nconst violate = (h: SocketHostState, conn: Conn, reason: string) => {\n sendTo(\n h,\n conn,\n JSON.stringify({ fin: { reason: \"protocol-error\", message: reason } }),\n );\n closeConn(h, conn, 1008, reason);\n};\n\nexport const atSubscriberLimit = (h: SocketHostState): boolean =>\n h.conns.size +\n [...h.pendingConns].filter((conn) => conn.authorizing).length >=\n h.maxSubscribers;\n\nconst ensureHeartbeat = (h: SocketHostState) => {\n if (h.heartbeatTimer !== null || h.heartbeatMs <= 0) return;\n h.heartbeatTimer = setInterval(() => {\n const now = Date.now();\n for (const conn of [...h.conns]) {\n if (now - conn.lastSentAt >= h.heartbeatMs) sendTo(h, conn, \"{}\");\n }\n }, h.heartbeatMs);\n (h.heartbeatTimer as unknown as { unref?: () => void }).unref?.();\n};\n\nconst setHeartbeatMs = (h: SocketHostState, ms: number) => {\n if (ms === h.heartbeatMs) return;\n h.heartbeatMs = ms;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n ensureHeartbeat(h);\n }\n};\n\nconst durableLanes = function* (h: SocketHostState) {\n for (const rec of h.clients.values()) yield* rec.lanes.values();\n};\n\nconst allLanes = function* (h: SocketHostState) {\n yield* durableLanes(h);\n for (const conn of h.conns) yield* conn.lanes.values();\n};\n\nconst idleLevel = (h: SocketHostState): boolean => {\n if (h.current?.work?.isIdle === false) return false;\n for (const lane of allLanes(h)) {\n if (lane.inflight.size > 0) return false;\n }\n return true;\n};\n\nconst selects = (conn: Conn, protocol: string) =>\n conn.selection.protocols.some((p) => p.name === protocol);\n\n// ─── views ──────────────────────────────────────────────\n\nconst viewOf = (\n h: SocketHostState,\n conn: Conn,\n): Map<string, StatewireHost.Document> => {\n const view = new Map<string, StatewireHost.Document>();\n const shared = h.stateHost!.documents();\n const hostMain = documentIdentity(h.protocol.name);\n for (const p of conn.selection.protocols) {\n if (p.record === \"ephemeral\") {\n for (const [id, doc] of conn.documents)\n if (doc.protocol === p.name) view.set(id, doc);\n } else {\n for (const [id, doc] of shared) {\n if (\n doc.protocol === p.name &&\n id !== hostMain &&\n (doc.main || conn.included.has(id))\n )\n view.set(id, doc);\n }\n }\n }\n return view;\n};\n\nconst diffView = (h: SocketHostState, conn: Conn): WireOp[] => {\n const current = viewOf(h, conn);\n const ops: WireOp[] = [];\n for (const [id, entry] of conn.view) {\n if (current.has(id)) continue;\n conn.view.delete(id);\n ops.push({ op: \"unmount\", doc: entry.doc });\n }\n for (const [id, doc] of current) {\n const entry = conn.view.get(id);\n if (entry !== undefined && entry.value === doc.value) continue;\n const { value, meta } = encodeDocument(doc.value);\n if (entry === undefined) {\n const number = conn.nextDoc++;\n conn.view.set(id, { doc: number, value: doc.value });\n ops.push({\n op: \"mount\",\n doc: number,\n protocol: doc.protocol,\n ...(doc.key !== null && { key: doc.key }),\n ...(doc.main && { main: true }),\n value,\n ...(meta !== undefined && { meta }),\n });\n } else {\n entry.value = doc.value;\n ops.push({\n op: \"replace\",\n doc: entry.doc,\n path: [],\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n }\n return ops;\n};\n\nconst attachOf = (h: SocketHostState, conn: Conn): StatewireHost.Attach => {\n const requireSelected = (protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined)\n throw new Error(`statewire: protocol ${protocol} was not negotiated`);\n return entry;\n };\n return {\n document: (protocol, key) => {\n if (key === undefined && protocol === h.protocol.name)\n return h.stateHost!.snapshot();\n const view = viewOf(h, conn);\n if (key !== undefined)\n return view.get(documentIdentity(protocol, key))?.value;\n for (const doc of view.values())\n if (doc.protocol === protocol && doc.main) return doc.value;\n return undefined;\n },\n mount: (protocol, value, key, main = key === undefined) => {\n if (requireSelected(protocol).record !== \"ephemeral\")\n throw new Error(`statewire: protocol ${protocol} is not ephemeral`);\n const encoded = encodeDocument(value);\n if (\n frameEncoder.encode(JSON.stringify(encoded)).byteLength >\n MAX_EPHEMERAL_DOCUMENT_BYTES\n )\n throw new Error(\"statewire: oversized ephemeral document\");\n const id = documentIdentity(protocol, key);\n if (main) {\n for (const [other, doc] of conn.documents) {\n if (doc.protocol === protocol && doc.main && other !== id)\n throw new Error(\n `statewire: ${protocol} already has a main document`,\n );\n }\n }\n conn.documents.set(id, {\n protocol,\n key: key === undefined ? null : [...key],\n main,\n value: sanitizeValue(value),\n });\n markViews(h);\n },\n unmount: (protocol, key) => {\n if (!conn.documents.delete(documentIdentity(protocol, key)))\n throw new Error(\"statewire: document is not mounted\");\n markViews(h);\n },\n include: (protocol, key) => {\n if (requireSelected(protocol).record !== undefined)\n throw new Error(`statewire: protocol ${protocol} is not durable`);\n conn.included.add(documentIdentity(protocol, key));\n markViews(h);\n },\n exclude: (protocol, key) => {\n conn.included.delete(documentIdentity(protocol, key));\n markViews(h);\n },\n };\n};\n\n// ─── flush ──────────────────────────────────────────────\n\nexport const flush = (h: SocketHostState, fin?: StatewireHost.Fin) => {\n flushTapSync(() => {});\n h.stateHost?.takeChanged();\n for (const lane of allLanes(h)) {\n for (const adm of lane.inflight.values()) {\n if (adm.applied && !adm.settled && !adm.appliedSent) {\n adm.appliedSent = true;\n queueApplied(h, lane, adm);\n }\n }\n }\n const level = idleLevel(h);\n const edge = level !== h.idleWire;\n if (\n h.pendingOps.length === 0 &&\n h.pendingApplied.size === 0 &&\n h.pendingCmds.size === 0 &&\n !h.viewsDirty &&\n fin === undefined &&\n !edge &&\n ![...h.conns].some(\n (conn) => conn.pendingApplied.length > 0 || conn.pendingCmds.length > 0,\n )\n ) {\n return;\n }\n h.idleWire = level;\n h.viewsDirty = false;\n if (fin === undefined && edge && level && h.finOnIdle) {\n fin = { reason: \"idle\" };\n }\n const mainOps = h.pendingOps;\n const applied = h.pendingApplied;\n const cmds = h.pendingCmds;\n h.pendingOps = [];\n h.pendingApplied = new Map();\n h.pendingCmds = new Map();\n // Applied entries anchor to their effects: piggybacked on the ops packet\n // when one is flushing, standalone otherwise. Terminal verdicts ride their\n // own packet.\n for (const conn of [...h.conns]) {\n if (!conn.ready) continue;\n const forConn = (list: Cmd[] | undefined) =>\n (list ?? []).filter((cmd) => selects(conn, cmd.protocol));\n const ops = [\n ...(selects(conn, h.protocol.name) ? mainOps : []),\n ...diffView(h, conn),\n ];\n const appliedEntries = [\n ...forConn(applied.get(conn.clientId)),\n ...conn.pendingApplied.splice(0),\n ];\n if (ops.length > 0) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n ops,\n ...(appliedEntries.length > 0 && { cmd: appliedEntries }),\n ...(edge && { idle: level }),\n }),\n );\n } else if (appliedEntries.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: appliedEntries }));\n }\n const verdicts = [\n ...forConn(cmds.get(conn.clientId)),\n ...conn.pendingCmds.splice(0),\n ];\n if (verdicts.length > 0) {\n sendTo(h, conn, JSON.stringify({ cmd: verdicts }));\n }\n if (edge && ops.length === 0) {\n sendTo(h, conn, JSON.stringify({ idle: level }));\n }\n if (fin !== undefined) {\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n }\n};\n\nconst queueApplied = (h: SocketHostState, lane: Lane, adm: Admission) => {\n const cmd: Cmd = { protocol: adm.protocol, seq: adm.seq, type: \"applied\" };\n if (lane.conn !== null) lane.conn.pendingApplied.push(cmd);\n else {\n const list = h.pendingApplied.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingApplied.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst queueCmd = (h: SocketHostState, lane: Lane, cmd: Cmd) => {\n if (lane.conn !== null) lane.conn.pendingCmds.push(cmd);\n else {\n const list = h.pendingCmds.get(lane.clientId);\n if (list) list.push(cmd);\n else h.pendingCmds.set(lane.clientId, [cmd]);\n }\n scheduleFlush(h);\n};\n\nconst notifyClientRecords = (h: SocketHostState) => {\n h.persistence?.onClientRecordsChange?.(\n [...h.clients.values()].map((rec) => ({\n id: rec.id,\n touched: rec.touched,\n lanes: Object.fromEntries(\n [...rec.lanes.values()].map((lane) => [\n lane.protocol,\n {\n lastSeq: admittedThrough(lane),\n results: [...lane.results].map(([seq, entry]) => ({\n seq,\n ts: entry.ts,\n cmd: entry.cmd,\n })),\n },\n ]),\n ),\n principal: rec.principal,\n })),\n );\n};\n\nconst retain = (lane: Lane, cmd: Cmd) => {\n const now = Date.now();\n lane.results.set(cmd.seq, { ts: now, cmd });\n const newest = Math.max(...lane.results.keys());\n for (const [seq, entry] of lane.results) {\n if (seq !== newest && now - entry.ts > RESULT_TTL_MS) {\n lane.results.delete(seq);\n }\n }\n while (lane.results.size > RESULT_LIMIT) {\n lane.results.delete(Math.min(...lane.results.keys()));\n }\n};\n\n/** Lane watermark: the last statement admitted, settled or not. */\nconst admittedThrough = (lane: Lane): number =>\n Math.max(lane.lastSeq, ...lane.inflight.keys());\n\nconst watermark = (h: SocketHostState, conn: Conn, protocol: string) => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol)!;\n const lane =\n entry.record === \"ephemeral\"\n ? conn.lanes.get(protocol)\n : h.clients.get(conn.clientId)?.lanes.get(protocol);\n return lane === undefined ? 0 : admittedThrough(lane);\n};\n\nconst laneOf = (h: SocketHostState, conn: Conn, protocol: string): Lane => {\n const entry = conn.selection.protocols.find((p) => p.name === protocol);\n if (entry === undefined) return violation(\"unsupported protocol\");\n const ephemeral = entry.record === \"ephemeral\";\n const lanes = ephemeral ? conn.lanes : h.clients.get(conn.clientId)!.lanes;\n let lane = lanes.get(protocol);\n if (lane === undefined) {\n lane = {\n protocol,\n clientId: conn.clientId,\n conn: ephemeral ? conn : null,\n lastSeq: 0,\n results: new Map(),\n inflight: new Map(),\n };\n lanes.set(protocol, lane);\n }\n return lane;\n};\n\n// A re-asked seq never re-runs: the stored verdict re-emits, an applied\n// inflight run re-answers applied; one not yet applied answers nothing (its\n// answers ride the stream when ready), an evicted verdict answers expired.\nconst reemit = (h: SocketHostState, lane: Lane, seq: number) => {\n const cached = lane.results.get(seq);\n if (cached) {\n const newest = Math.max(...lane.results.keys());\n if (seq === newest || Date.now() - cached.ts <= RESULT_TTL_MS) {\n queueCmd(h, lane, cached.cmd);\n return;\n }\n lane.results.delete(seq);\n notifyClientRecords(h);\n }\n const adm = lane.inflight.get(seq);\n if (adm) {\n if (adm.applied) queueApplied(h, lane, adm);\n return;\n }\n queueCmd(h, lane, { protocol: lane.protocol, seq, type: \"expired\" });\n};\n\nconst settleCmd = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n cmd: Cmd,\n) => {\n if (adm.settled) return;\n adm.settled = true;\n lane.inflight.delete(adm.seq);\n retain(lane, cmd);\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n adm.applied = true;\n queueCmd(h, lane, cmd);\n if (lane.conn === null) notifyClientRecords(h);\n};\n\nconst settleWire = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n outcome: CommandsOutcome,\n) => settleCmd(h, lane, adm, cmdOf(adm, outcome));\n\nconst callerOf = (\n h: SocketHostState,\n rec: ClientRec,\n conn: Conn,\n): StatewireHost.Caller => ({\n clientId: rec.id,\n auth: conn.auth,\n get isConnected() {\n if (h.clients.get(rec.id) !== rec) return false;\n for (const conn of h.conns) {\n if (conn.clientId === rec.id && conn.open) return true;\n }\n return false;\n },\n});\n\nconst rejectStatement = (\n h: SocketHostState,\n lane: Lane,\n adm: Admission,\n message: string,\n) =>\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"rejected\",\n code: \"invalid-params\",\n message,\n });\n\nconst admitCmd = (\n h: SocketHostState,\n lane: Lane,\n conn: Conn,\n statement: CmdStatement,\n) => {\n const rec = h.clients.get(conn.clientId)!;\n const adm: Admission = {\n protocol: statement.protocol,\n seq: statement.seq,\n method: statement.method,\n applied: false,\n appliedSent: false,\n settled: false,\n };\n lane.inflight.set(statement.seq, adm);\n if (lane.conn === null) notifyClientRecords(h);\n if (!Array.isArray(statement.params)) {\n rejectStatement(h, lane, adm, \"params must be an array\");\n return;\n }\n let params = statement.params;\n if (statement.meta !== undefined) {\n try {\n params = reviveValue(params, statement.meta, {\n rejectUnknown: true,\n }) as unknown[];\n } catch (error) {\n rejectStatement(\n h,\n lane,\n adm,\n `invalid params: ${(error as Error).message}`,\n );\n return;\n }\n }\n if (statement.method === \"statewire/commands\") {\n if (params.length > 0) {\n rejectStatement(h, lane, adm, \"statewire/commands takes no params\");\n return;\n }\n const names = [\n ...(h.commandsHost?.methods?.() ?? []),\n \"statewire/commands\",\n ].sort();\n settleCmd(h, lane, adm, {\n protocol: adm.protocol,\n seq: adm.seq,\n type: \"result\",\n payload: names,\n });\n return;\n }\n // Subprotocol methods are registered under their full wire name.\n const method =\n statement.protocol === h.protocol.name\n ? statement.method\n : `${statement.protocol}/${statement.method}`;\n h.commandsHost!.submit!({\n method,\n params,\n clientId: rec.id,\n caller: callerOf(h, rec, conn),\n attach: conn.attach,\n onApplied: () => {\n if (adm.settled || adm.applied) return;\n adm.applied = true;\n lane.lastSeq = Math.max(lane.lastSeq, adm.seq);\n if (lane.conn === null) notifyClientRecords(h);\n scheduleFlush(h);\n },\n onSettle: (outcome) => settleWire(h, lane, adm, outcome),\n }).catch((error: unknown) => {\n if (!adm.settled) settleWire(h, lane, adm, { type: \"rejected\", error });\n });\n};\n\n// One admission law, every lane: absorbed statements answer from their lane,\n// then the new suffix is admitted whole or the frame is refused whole via a\n// {syn} stating every lane's watermark, nothing consumed. A durable gap is\n// never a close; an ephemeral gap is a violation (the lane has no replay).\nexport type FrameAdmission =\n | { type: \"ok\" }\n | {\n type: \"refused\";\n syn: {\n syn: { protocols: { name: string; seq: number }[]; retry?: number };\n };\n };\n\nconst refusal = (\n h: SocketHostState,\n conn: Conn,\n retry?: number,\n): FrameAdmission => ({\n type: \"refused\",\n syn: {\n syn: {\n protocols: conn.selection.protocols.map((p) => ({\n name: p.name,\n seq: watermark(h, conn, p.name),\n })),\n ...(retry !== undefined && { retry }),\n },\n },\n});\n\nexport const admitFrame = (\n h: SocketHostState,\n conn: Conn,\n frame: ParsedFrame,\n): FrameAdmission => {\n const rec = h.clients.get(conn.clientId)!;\n rec.touched = Date.now();\n const lanes = new Map(\n frame.cmd.map((s) => [s.protocol, laneOf(h, conn, s.protocol)]),\n );\n const through = new Map(\n [...lanes].map(([protocol, lane]) => [protocol, admittedThrough(lane)]),\n );\n const fresh = frame.cmd.filter((s) => s.seq > through.get(s.protocol)!);\n for (const s of frame.cmd) {\n if (s.seq <= through.get(s.protocol)!)\n reemit(h, lanes.get(s.protocol)!, s.seq);\n }\n let durableNew = 0;\n for (const [protocol, lane] of lanes) {\n const first = fresh.find((s) => s.protocol === protocol);\n if (first === undefined) continue;\n if (first.seq !== through.get(protocol)! + 1) {\n if (lane.conn !== null) return violation(\"ephemeral lane gap\");\n notifyClientRecords(h);\n return refusal(h, conn);\n }\n if (lane.conn === null)\n durableNew += fresh.filter((s) => s.protocol === protocol).length;\n }\n if (durableNew > 0) {\n let clientLoad = 0;\n for (const lane of rec.lanes.values()) clientLoad += lane.inflight.size;\n let hostLoad = 0;\n for (const lane of durableLanes(h)) hostLoad += lane.inflight.size;\n if (\n clientLoad + durableNew > MAX_INFLIGHT_COMMANDS_PER_CLIENT ||\n hostLoad + durableNew > h.maxInflightCommands\n ) {\n return refusal(h, conn, COMMAND_CAPACITY_RETRY_MS);\n }\n }\n if (fresh.length > 0 && h.pushback) {\n const retry = h.pushback();\n if (retry !== null) {\n if (!Number.isSafeInteger(retry) || retry < 0)\n throw new TypeError(\n \"pushback must return a nonnegative safe integer or null\",\n );\n return refusal(h, conn, retry);\n }\n }\n for (const s of fresh) admitCmd(h, lanes.get(s.protocol)!, conn, s);\n for (const [protocol, lane] of lanes) {\n const last = fresh.findLast((s) => s.protocol === protocol);\n // Memory host: admitted means retained — dur rides the admitting flush.\n if (last !== undefined && lane.conn === null)\n queueCmd(h, lane, { protocol, seq: last.seq, dur: true });\n }\n notifyClientRecords(h);\n scheduleFlush(h);\n return { type: \"ok\" };\n};\n\nconst message = (h: SocketHostState, conn: Conn, data: string) => {\n if (!conn.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendTo(\n h,\n conn,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closeConn(h, conn, 1009, \"frame too large\");\n return;\n }\n const first = !conn.sawFrame;\n conn.sawFrame = true;\n let admission: ReturnType<typeof admitFrame>;\n try {\n const frame = first ? parseInitialFrame(data).frame : parseFrame(data);\n if (frame.cmd.length === 0) return;\n admission = admitFrame(h, conn, frame);\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n return;\n }\n if (admission.type === \"refused\") {\n sendTo(h, conn, JSON.stringify(admission.syn));\n }\n};\n\nconst closePending = (\n h: SocketHostState,\n pending: PendingConn,\n code?: number,\n reason?: string,\n) => {\n if (!pending.open) return;\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n try {\n pending.socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n};\n\nconst sendPending = (pending: PendingConn, data: string): boolean => {\n if (!pending.open) return false;\n try {\n pending.socket.send(data);\n return true;\n } catch {\n return false;\n }\n};\n\nconst refuseSubscriberLimit = (socket: StatewireHostInternal.Socket): null => {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n try {\n socket.close(1013, SUBSCRIBER_LIMIT_MESSAGE);\n } catch {\n /* peer already gone */\n }\n return null;\n};\n\nconst rejectPendingAuthorization = (\n h: SocketHostState,\n pending: PendingConn,\n error: unknown,\n) => {\n const response = error instanceof Response ? error : null;\n const unauthorized = response?.status === 401 || response?.status === 403;\n const status = response?.status;\n const message = unauthorized\n ? \"unauthorized\"\n : response?.statusText ||\n (status === undefined ? \"authorization failed\" : `HTTP ${status}`);\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason:\n status === 403\n ? \"forbidden\"\n : unauthorized\n ? \"unauthorized\"\n : \"error\",\n message,\n ...(status !== undefined && { status }),\n },\n }),\n );\n closePending(h, pending, unauthorized ? 1008 : 1011, message);\n};\n\nconst normalizedHeaders = (\n headers: Record<string, string>,\n): Record<string, string> => {\n const seen = new Set<string>();\n for (const name of Object.keys(headers)) {\n const key = name.toLowerCase();\n if (seen.has(key)) throw new TypeError(\"duplicate header name\");\n seen.add(key);\n }\n return Object.fromEntries(new Headers(headers));\n};\n\nconst connectAuthorized = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions,\n): StatewireHostInternal.SocketConnection | null => {\n const authorize = h.authorize;\n if (options.authorized === true) {\n const registration = register(\n h,\n clientId,\n socket,\n options.authorized === true,\n options.auth,\n options.selection,\n );\n return registration?.connection ?? null;\n }\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n return refuse(1000, \"finished\");\n }\n const pending: PendingConn = {\n socket,\n open: true,\n authorizing: false,\n queued: [],\n timer: null,\n connection: null,\n };\n h.pendingConns.add(pending);\n pending.timer = setTimeout(\n () =>\n rejectPendingAuthorization(\n h,\n pending,\n new Response(null, { status: 401 }),\n ),\n h.wsInitTimeoutMs,\n );\n (pending.timer as unknown as { unref?: () => void }).unref?.();\n return {\n clientId,\n message: (data) => {\n if (pending.connection !== null) {\n pending.connection.message(data);\n return;\n }\n if (!pending.open || h.disposed || h.finished !== null) return;\n if (frameIsOversized(data)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"frame too large\",\n },\n }),\n );\n closePending(h, pending, 1009, \"frame too large\");\n return;\n }\n if (pending.authorizing) {\n pending.queued.push(data);\n return;\n }\n let initial: ReturnType<typeof parseInitialFrame>;\n try {\n initial = parseInitialFrame(data);\n } catch (error) {\n if (error instanceof Response) {\n rejectPendingAuthorization(h, pending, error);\n return;\n }\n const reason = violationReason(error);\n if (reason === null) throw error;\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: reason,\n },\n }),\n );\n closePending(h, pending, 1008, reason);\n return;\n }\n const frame = initial.frame;\n let headers: Record<string, string>;\n try {\n headers = {\n ...normalizedHeaders(initial.headers),\n ...normalizedHeaders(options.headers ?? {}),\n };\n } catch {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"protocol-error\",\n message: \"malformed headers\",\n },\n }),\n );\n closePending(h, pending, 1008, \"malformed headers\");\n return;\n }\n if (atSubscriberLimit(h)) {\n sendPending(\n pending,\n JSON.stringify({\n fin: {\n reason: \"reconnect\",\n code: \"overloaded\",\n message: SUBSCRIBER_LIMIT_MESSAGE,\n },\n }),\n );\n closePending(h, pending, 1013, SUBSCRIBER_LIMIT_MESSAGE);\n return;\n }\n pending.authorizing = true;\n Promise.resolve()\n .then(() => authorize?.({ headers }))\n .then((auth) => {\n if (!pending.open || h.disposed || h.finished !== null) return;\n const selection = negotiateProtocols(\n new Headers(headers),\n h.wireVersion,\n [h.protocol],\n );\n if (\"fin\" in selection) {\n sendPending(pending, JSON.stringify(selection));\n closePending(h, pending, 1008, selection.fin.message);\n return;\n }\n options.onAuthorized?.(auth, selection);\n pending.open = false;\n h.pendingConns.delete(pending);\n if (pending.timer !== null) clearTimeout(pending.timer);\n let registration: Registration | null;\n try {\n registration = register(\n h,\n clientId,\n socket,\n true,\n auth,\n selection,\n frame,\n );\n } catch (error) {\n if (violationReason(error) === null) throw error;\n return;\n }\n if (registration === null) return;\n pending.connection = registration.connection;\n for (const data of pending.queued.splice(0))\n registration.connection.message(data);\n })\n .catch((error: unknown) => {\n if (pending.open) rejectPendingAuthorization(h, pending, error);\n });\n },\n close: () => {\n if (pending.connection !== null) pending.connection.close();\n else closePending(h, pending);\n },\n };\n};\n\nconst gcClients = (h: SocketHostState) => {\n let excess = h.clients.size - h.clientRecordLimit;\n if (excess <= 0) return;\n let changed = false;\n const live = new Set([...h.conns].map((conn) => conn.clientId));\n const oldest = [...h.clients.values()].sort((a, b) => a.touched - b.touched);\n for (const rec of oldest) {\n if (excess <= 0) break;\n if (\n live.has(rec.id) ||\n [...rec.lanes.values()].some((lane) => lane.inflight.size > 0)\n )\n continue;\n h.clients.delete(rec.id);\n changed = true;\n excess -= 1;\n }\n if (changed) notifyClientRecords(h);\n};\n\nexport type Registration = {\n conn: Conn;\n connection: StatewireHostInternal.SocketConnection;\n};\n\n/**\n * Attach a socket: ephemeral-lane statements of the attach frame are admitted\n * before the snapshot (their documents and answers ride the hello), durable\n * ones after it. A violation in the attach frame closes the attach and throws.\n */\nexport const register = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n sawFrame = false,\n auth: unknown = undefined,\n selection: StatewireProtocol.Selection = {\n version: h.wireVersion.version,\n protocols: [{ name: h.protocol.name, version: h.protocol.version }],\n },\n frame: ParsedFrame = { cmd: [] },\n): Registration | null => {\n const refuse = (code: number, reason: string) => {\n try {\n socket.close(code, reason);\n } catch {\n /* peer already gone */\n }\n return null;\n };\n if (h.disposed) return refuse(1001, \"disposed\");\n if (!CLIENT_ID_RE.test(clientId)) return refuse(1008, \"invalid client id\");\n flush(h);\n if (h.finished !== null) {\n try {\n socket.send(JSON.stringify({ fin: h.finished }));\n } catch {\n /* peer already gone */\n }\n refuse(1000, \"finished\");\n return null;\n }\n if (atSubscriberLimit(h)) {\n return refuseSubscriberLimit(socket);\n }\n const known = h.clients.get(clientId);\n if (known !== undefined && !authEquals(known.principal, auth)) {\n try {\n socket.send(\n JSON.stringify({\n fin: {\n reason: \"forbidden\",\n message: PRINCIPAL_MISMATCH_MESSAGE,\n status: 403,\n },\n }),\n );\n } catch {\n /* peer already gone */\n }\n return refuse(1008, PRINCIPAL_MISMATCH_MESSAGE);\n }\n const rec =\n known ??\n (() => {\n const created: ClientRec = {\n id: clientId,\n touched: Date.now(),\n lanes: new Map(),\n principal: auth,\n };\n h.clients.set(clientId, created);\n return created;\n })();\n rec.touched = Date.now();\n const conn: Conn = {\n selection,\n clientId,\n socket,\n open: true,\n ready: false,\n sawFrame,\n lastSentAt: 0,\n lease: null,\n auth,\n lanes: new Map(),\n documents: new Map(),\n included: new Set(),\n view: new Map(),\n nextDoc: 1,\n pendingApplied: [],\n pendingCmds: [],\n attach: undefined!,\n };\n conn.attach = attachOf(h, conn);\n h.conns.add(conn);\n gcClients(h);\n ensureHeartbeat(h);\n const isEphemeral = (s: CmdStatement) =>\n selection.protocols.find((p) => p.name === s.protocol)?.record ===\n \"ephemeral\";\n const early = frame.cmd.filter(isEphemeral);\n const late = frame.cmd.filter((s) => !isEphemeral(s));\n const admit = (statements: CmdStatement[]) => {\n if (statements.length === 0) return null;\n try {\n return admitFrame(h, conn, { cmd: statements });\n } catch (error) {\n const reason = violationReason(error);\n if (reason === null) throw error;\n violate(h, conn, reason);\n throw error;\n }\n };\n const earlyAdmission = admit(early);\n if (early.length > 0) flush(h);\n notifyClientRecords(h);\n const ops: WireOp[] = [];\n if (selects(conn, h.protocol.name)) {\n const { value, meta } = encodeDocument(h.stateHost!.snapshot());\n ops.push({\n op: \"mount\",\n protocol: h.protocol.name,\n main: true,\n value,\n ...(meta !== undefined && { meta }),\n });\n }\n ops.push(...diffView(h, conn));\n const answers = [\n ...conn.pendingApplied.splice(0),\n ...conn.pendingCmds.splice(0),\n ];\n const hello = {\n ops,\n syn: {\n version: selection.version,\n protocols: selection.protocols.map((p) => ({\n ...p,\n seq: p.record === \"ephemeral\" ? 0 : watermark(h, conn, p.name),\n })),\n ...(h.idleWire && { idle: true }),\n },\n ...(answers.length > 0 && { cmd: answers }),\n };\n conn.ready = true;\n sendTo(h, conn, JSON.stringify(hello));\n if (earlyAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(earlyAdmission.syn));\n const lateAdmission = admit(late);\n if (lateAdmission?.type === \"refused\")\n sendTo(h, conn, JSON.stringify(lateAdmission.syn));\n const connection: StatewireHostInternal.SocketConnection = {\n clientId,\n message: (data) => message(h, conn, data),\n close: () => closeConn(h, conn),\n };\n return { conn, connection };\n};\n\nconst connect = (\n h: SocketHostState,\n clientId: string,\n socket: StatewireHostInternal.Socket,\n options: StatewireHostInternal.SocketConnectOptions = {},\n): StatewireHostInternal.SocketConnection | null => {\n return connectAuthorized(h, clientId, socket, options);\n};\n\nconst finish = (h: SocketHostState, fin: StatewireHost.Fin) => {\n if (\n fin.retry !== undefined &&\n (!Number.isSafeInteger(fin.retry) || fin.retry < 0)\n ) {\n throw new Error(\"statewire: retry must be a nonnegative safe integer\");\n }\n if (h.finished !== null || h.disposed) return;\n h.commandsHost?.abort?.();\n h.finished = fin;\n for (const pending of [...h.pendingConns]) {\n sendPending(pending, JSON.stringify({ fin }));\n closePending(h, pending, 1000, fin.reason);\n }\n flush(h, fin);\n};\n\nconst resume = (h: SocketHostState) => {\n h.disposed = false;\n h.stateHost?.setOnOp((op) => recordOp(h, op));\n h.stateHost?.setOnDocuments(() => markViews(h));\n};\n\nconst suspend = (h: SocketHostState) => {\n h.disposed = true;\n if (h.heartbeatTimer !== null) {\n clearInterval(h.heartbeatTimer);\n h.heartbeatTimer = null;\n }\n h.stateHost?.setOnOp(null);\n h.stateHost?.setOnDocuments(null);\n};\n\nconst restoreClientRecords = (\n records: readonly StatewireHostInternal.ClientRecord[] = [],\n): Map<string, ClientRec> =>\n new Map(\n records.map((record) => [\n record.id,\n {\n id: record.id,\n touched: record.touched,\n lanes: new Map(\n Object.entries(record.lanes).map(([protocol, lane]) => [\n protocol,\n {\n protocol,\n clientId: record.id,\n conn: null,\n lastSeq: lane.lastSeq,\n results: new Map(\n lane.results.map(({ seq, ts, cmd }) => [seq, { ts, cmd }]),\n ),\n inflight: new Map(),\n },\n ]),\n ),\n principal: record.principal,\n },\n ]),\n );\n\nconst useSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): Pick<\n StatewireHostInternal.SocketHost,\n \"connect\" | \"finish\" | \"stream\" | \"frames\"\n> => {\n const [h] = useState((): SocketHostState => {\n const host: SocketHostState = {\n protocol: { name: DEFAULT_PROTOCOL, version: WIRE_VERSION },\n wireVersion: { version: WIRE_VERSION },\n heartbeatMs: 15_000,\n wsInitTimeoutMs: 5_000,\n maxSubscribers: MAX_SUBSCRIBERS,\n maxInflightCommands: MAX_INFLIGHT_COMMANDS_PER_HOST,\n streamQueueSize: STREAM_QUEUE_SIZE,\n clientRecordLimit: CLIENT_RECORD_LIMIT,\n finOnIdle: false,\n pushback: undefined,\n authorize: undefined,\n clients: restoreClientRecords(persistence?.clientRecords),\n conns: new Set(),\n pendingConns: new Set(),\n pendingOps: [],\n pendingApplied: new Map(),\n pendingCmds: new Map(),\n viewsDirty: false,\n idleWire: true,\n finished: null,\n disposed: false,\n flushScheduled: false,\n heartbeatTimer: null,\n stateHost: null,\n commandsHost: null,\n current: null,\n persistence,\n post: createMacrotaskPoster(() => {\n host.flushScheduled = false;\n flush(host);\n }),\n connect: (clientId, socket, connectOptions) =>\n connect(host, clientId, socket, connectOptions),\n finish: (fin) => finish(host, fin),\n stream: (request) => serveStream(host, request),\n frames: (request) => serveFrames(host, request),\n };\n return host;\n });\n h.protocol = options?.protocol ?? {\n name: DEFAULT_PROTOCOL,\n version: WIRE_VERSION,\n };\n h.wireVersion = options?.wireVersion ?? { version: WIRE_VERSION };\n setHeartbeatMs(h, options?.heartbeatIntervalMs ?? 15_000);\n h.pushback = options?.pushback;\n h.wsInitTimeoutMs = options?.wsInitTimeoutMs ?? 5_000;\n const maxSubscribers =\n options?.maxSubscribers === undefined\n ? MAX_SUBSCRIBERS\n : options.maxSubscribers;\n if (!Number.isInteger(maxSubscribers) || maxSubscribers < 1) {\n throw new TypeError(\"maxSubscribers must be a positive integer\");\n }\n h.maxSubscribers = maxSubscribers;\n const maxInflightCommands =\n options?.maxInflightCommands === undefined\n ? MAX_INFLIGHT_COMMANDS_PER_HOST\n : options.maxInflightCommands;\n if (!Number.isInteger(maxInflightCommands) || maxInflightCommands < 1) {\n throw new TypeError(\"maxInflightCommands must be a positive integer\");\n }\n h.maxInflightCommands = maxInflightCommands;\n const streamQueueSize =\n options?.streamQueueSize === undefined\n ? STREAM_QUEUE_SIZE\n : options.streamQueueSize;\n if (!Number.isInteger(streamQueueSize) || streamQueueSize < 1) {\n throw new TypeError(\"streamQueueSize must be a positive integer\");\n }\n h.streamQueueSize = streamQueueSize;\n h.clientRecordLimit = options?.clientRecordLimit ?? CLIENT_RECORD_LIMIT;\n h.finOnIdle = options?.finOnIdle ?? false;\n h.authorize = options?.authorize;\n const value = useResource(transport) as Statewire<unknown>;\n attach(h, value);\n useEffect(() => {\n attach(h, value);\n scheduleFlush(h);\n });\n useEffect(() => {\n resume(h);\n return () => suspend(h);\n }, [h]);\n return h;\n};\n\n/**\n * Transport-agnostic WS binding over a statewire/host transport:\n * feed it sockets (anything with `send`/`close`) and raw text frames, and it\n * speaks the Statewire packet protocol — snapshot-first hello with `syn`,\n * per-protocol statement lanes under one admission law, `{cmd}` answer\n * arrays fanned out to every attach of a client id (durable lanes) or the\n * admitting attach (ephemeral lanes), per-attach document views, idle edges,\n * and `fin` on finish.\n */\nexport const StatewireSocketHost = (\n transport: ResourceElement<Statewire>,\n options?: StatewireHostInternal.SocketHostOptions,\n persistence?: StatewireHostInternal.SocketHostPersistence,\n): StatewireHostInternal.SocketHost => {\n const SocketHostRoot = () => useSocketHost(transport, options, persistence);\n const root = createTapRoot(SocketHostRoot);\n let disposed = false;\n return {\n connect: (clientId, socket, connectOptions) =>\n flushTapSync(() =>\n root.getValue().connect(clientId, socket, connectOptions),\n ),\n stream: (request) => flushTapSync(() => root.getValue().stream(request)),\n frames: (request) => flushTapSync(() => root.getValue().frames(request)),\n finish: (fin) => flushTapSync(() => root.getValue().finish(fin)),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n flushTapSync(() =>\n root.getValue().finish({ reason: \"reconnect\", code: \"evicted\" }),\n );\n root.unmount();\n },\n };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { StatewireHost } from "../host.js";
|
|
2
|
+
//#region src/host/synced.d.ts
|
|
3
|
+
/** `set`/`patch` handlers for an ephemeral subprotocol's main document; spread into `useStatewireCommands`. */
|
|
4
|
+
declare const syncedDocument: (protocol: string) => {
|
|
5
|
+
[x: string]: (this: StatewireHost.Ctx, value: unknown) => void;
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
export { syncedDocument };
|
|
9
|
+
//# sourceMappingURL=synced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synced.d.ts","names":[],"sources":["../../src/host/synced.ts"],"mappings":";;;cAqBa,iBAAkB;GACQ,aAAA,MAAA,cAAc,KAAG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { StatewireReject } from "./engine.js";
|
|
2
|
+
import { applyDocumentOps } from "../wire/documents.js";
|
|
3
|
+
//#region src/host/synced.ts
|
|
4
|
+
const PATCH_OPS = /* @__PURE__ */ new Set([
|
|
5
|
+
"add",
|
|
6
|
+
"replace",
|
|
7
|
+
"remove"
|
|
8
|
+
]);
|
|
9
|
+
const mount = (attach, protocol, value) => {
|
|
10
|
+
try {
|
|
11
|
+
attach.mount(protocol, value, void 0, true);
|
|
12
|
+
} catch (error) {
|
|
13
|
+
throw new StatewireReject(error.message, { code: "oversized-document" });
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
/** `set`/`patch` handlers for an ephemeral subprotocol's main document; spread into `useStatewireCommands`. */
|
|
17
|
+
const syncedDocument = (protocol) => ({
|
|
18
|
+
[`${protocol}/set`]: function(value) {
|
|
19
|
+
mount(this.attach, protocol, value);
|
|
20
|
+
},
|
|
21
|
+
[`${protocol}/patch`]: function(ops) {
|
|
22
|
+
const value = this.attach.document(protocol);
|
|
23
|
+
if (value === void 0) throw new StatewireReject("no document is set", { code: "no-document" });
|
|
24
|
+
if (!Array.isArray(ops) || !ops.every((op) => typeof op === "object" && op !== null && !Array.isArray(op) && PATCH_OPS.has(op.op) && !("doc" in op))) throw new StatewireReject("invalid patch", { code: "invalid-patch" });
|
|
25
|
+
let next;
|
|
26
|
+
try {
|
|
27
|
+
next = applyDocumentOps({
|
|
28
|
+
mode: "mounted",
|
|
29
|
+
documents: /* @__PURE__ */ new Map([[0, {
|
|
30
|
+
key: null,
|
|
31
|
+
protocol,
|
|
32
|
+
main: true,
|
|
33
|
+
value
|
|
34
|
+
}]])
|
|
35
|
+
}, ops, void 0, true).documents.get(0).value;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
throw new StatewireReject(error.message, { code: "invalid-patch" });
|
|
38
|
+
}
|
|
39
|
+
mount(this.attach, protocol, next);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { syncedDocument };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=synced.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synced.js","names":["StatewireReject","applyDocumentOps","StatewireHost","PATCH_OPS","Set","mount","attach","Attach","protocol","value","undefined","error","Error","message","code","syncedDocument","this","Ctx","ops","document","Array","isArray","every","op","has","next","mode","documents","Map","key","main","get"],"sources":["../../src/host/synced.ts"],"sourcesContent":["import { StatewireReject } from \"./engine\";\nimport { applyDocumentOps } from \"../wire/documents\";\nimport type { StatewireHost } from \"../host\";\n\nconst PATCH_OPS = new Set([\"add\", \"replace\", \"remove\"]);\n\nconst mount = (\n attach: StatewireHost.Attach,\n protocol: string,\n value: unknown,\n) => {\n try {\n attach.mount(protocol, value, undefined, true);\n } catch (error) {\n throw new StatewireReject((error as Error).message, {\n code: \"oversized-document\",\n });\n }\n};\n\n/** `set`/`patch` handlers for an ephemeral subprotocol's main document; spread into `useStatewireCommands`. */\nexport const syncedDocument = (protocol: string) => ({\n [`${protocol}/set`]: function (this: StatewireHost.Ctx, value: unknown) {\n mount(this.attach, protocol, value);\n },\n [`${protocol}/patch`]: function (this: StatewireHost.Ctx, ops: unknown) {\n const value = this.attach.document(protocol);\n if (value === undefined)\n throw new StatewireReject(\"no document is set\", { code: \"no-document\" });\n if (\n !Array.isArray(ops) ||\n !ops.every(\n (op) =>\n typeof op === \"object\" &&\n op !== null &&\n !Array.isArray(op) &&\n PATCH_OPS.has((op as { op?: unknown }).op as string) &&\n !(\"doc\" in op),\n )\n )\n throw new StatewireReject(\"invalid patch\", { code: \"invalid-patch\" });\n let next: unknown;\n try {\n next = applyDocumentOps(\n {\n mode: \"mounted\",\n documents: new Map([[0, { key: null, protocol, main: true, value }]]),\n },\n ops,\n undefined,\n true,\n ).documents.get(0)!.value;\n } catch (error) {\n throw new StatewireReject((error as Error).message, {\n code: \"invalid-patch\",\n });\n }\n mount(this.attach, protocol, next);\n },\n});\n"],"mappings":";;;AAIA,MAAMG,4BAAY,IAAIC,IAAI;CAAC;CAAO;CAAW;AAAQ,CAAC;AAEtD,MAAMC,SACJC,QACAE,UACAC,UACG;CACH,IAAI;EACFH,OAAOD,MAAMG,UAAUC,OAAOC,KAAAA,GAAW,IAAI;CAC/C,SAASC,OAAO;EACd,MAAM,IAAIX,gBAAiBW,MAAgBE,SAAS,EAClDC,MAAM,qBACR,CAAC;CACH;AACF;;AAGA,MAAaC,kBAAkBP,cAAsB;CACnD,CAAC,GAAGA,SAAQ,QAAS,SAAmCC,OAAgB;EACtEJ,MAAM,KAAKC,QAAQE,UAAUC,KAAK;CACpC;CACA,CAAC,GAAGD,SAAQ,UAAW,SAAmCU,KAAc;EACtE,MAAMT,QAAQ,KAAKH,OAAOa,SAASX,QAAQ;EAC3C,IAAIC,UAAUC,KAAAA,GACZ,MAAM,IAAIV,gBAAgB,sBAAsB,EAAEc,MAAM,cAAc,CAAC;EACzE,IACE,CAACM,MAAMC,QAAQH,GAAG,KAClB,CAACA,IAAII,OACFC,OACC,OAAOA,OAAO,YACdA,OAAO,QACP,CAACH,MAAMC,QAAQE,EAAE,KACjBpB,UAAUqB,IAAKD,GAAwBA,EAAY,KACnD,EAAE,SAASA,GACf,GAEA,MAAM,IAAIvB,gBAAgB,iBAAiB,EAAEc,MAAM,gBAAgB,CAAC;EACtE,IAAIW;EACJ,IAAI;GACFA,OAAOxB,iBACL;IACEyB,MAAM;IACNC,2BAAW,IAAIC,IAAI,CAAC,CAAC,GAAG;KAAEC,KAAK;KAAMrB;KAAUsB,MAAM;KAAMrB;IAAM,CAAC,CAAC,CAAC;GACtE,GACAS,KACAR,KAAAA,GACA,IACF,CAAC,CAACiB,UAAUI,IAAI,CAAC,CAAC,CAAEtB;EACtB,SAASE,OAAO;GACd,MAAM,IAAIX,gBAAiBW,MAAgBE,SAAS,EAClDC,MAAM,gBACR,CAAC;EACH;EACAT,MAAM,KAAKC,QAAQE,UAAUiB,IAAI;CACnC;AACF"}
|
package/dist/host-internal.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { StatewireProtocol } from "./wire/protocol.js";
|
|
2
1
|
import { StatewireHost } from "./host.js";
|
|
3
|
-
import {
|
|
2
|
+
import { StatewireProtocol } from "./wire/protocol.js";
|
|
4
3
|
import { StatewireSocketHost } from "./host/socket.js";
|
|
5
4
|
import { clientIdFromUrl, textFrameOrClose } from "./host/adapter.js";
|
|
6
5
|
import { WS_SUBPROTOCOL } from "./wire/version.js";
|
|
@@ -34,15 +33,28 @@ declare namespace StatewireHostInternal {
|
|
|
34
33
|
finish: (fin: StatewireHost.Fin) => void;
|
|
35
34
|
dispose: () => void;
|
|
36
35
|
};
|
|
36
|
+
type Cmd = {
|
|
37
|
+
protocol: string;
|
|
38
|
+
seq: number;
|
|
39
|
+
type?: "applied" | "result" | "rejected" | "failed" | "crashed" | "expired";
|
|
40
|
+
code?: string;
|
|
41
|
+
message?: string;
|
|
42
|
+
payload?: unknown;
|
|
43
|
+
meta?: unknown;
|
|
44
|
+
/** Cumulative per lane: resending through this seq will never be needed. */
|
|
45
|
+
dur?: boolean;
|
|
46
|
+
};
|
|
37
47
|
type ClientRecord = {
|
|
38
48
|
id: string;
|
|
39
|
-
lastSeq: number;
|
|
40
49
|
touched: number;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
lanes: Readonly<Record<string, {
|
|
51
|
+
lastSeq: number;
|
|
52
|
+
results: readonly {
|
|
53
|
+
seq: number;
|
|
54
|
+
ts: number;
|
|
55
|
+
cmd: Cmd;
|
|
56
|
+
}[];
|
|
57
|
+
}>>;
|
|
46
58
|
principal: unknown;
|
|
47
59
|
};
|
|
48
60
|
type SocketHostPersistence = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-internal.d.ts","names":[],"sources":["../src/host-internal.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"host-internal.d.ts","names":[],"sources":["../src/host-internal.ts"],"mappings":";;;;;;kBAMiB;OACH;IACV,OAAO;IACP,QAAQ,eAAe;;OAGb;aACD;IACT,UAAU;IACV;;OAGU;;IAEV,UAAU;;IAEV;IACA,YAAY,kBAAkB;;IAE9B;;IAEA,gBACE,eACA,WAAW,kBAAkB;;OAIrB;;IAEV,UACE,kBACA,QAAQ,QACR,UAAU,yBACP;IACL,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,SAAS,YAAY,QAAQ;IACtC,SAAS,KAAK,cAAc;IAC5B;;OAGU;IACV;IACA;IACA;IACA;IACA;IACA;IACA;;IAEA;;OAGU;IACV;IACA;IACA,OAAO,SACL;MAGI;MACA;QAAoB;QAAa;QAAY,KAAK;;;IAIxD;;OAGU;IACV,yBAAyB;IACzB,yBAAyB,kBAAkB;;OAGjC,kBAAkB;IAC5B,WAAW,kBAAkB;IAC7B,cAAc,kBAAkB;;IAEhC,aAAa;MACX,SAAS;UACL,QAAQ,QAAQ;;IAEtB;IACA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;IAEA;;OAGU,MAAM,cAAc"}
|