statewire 0.18.1 → 0.18.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/session.d.ts +1 -1
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +48 -188
- package/dist/client/session.js.map +1 -1
- package/dist/host/http.d.ts.map +1 -1
- package/dist/host/http.js +2 -3
- package/dist/host/http.js.map +1 -1
- package/dist/host/socket.d.ts +4 -5
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +33 -44
- package/dist/host/socket.js.map +1 -1
- package/dist/host-internal.d.ts +0 -4
- package/dist/host-internal.d.ts.map +1 -1
- package/dist/host.d.ts +1 -1
- package/dist/statewire.d.ts +1 -11
- package/dist/statewire.d.ts.map +1 -1
- package/dist/statewire.js.map +1 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +6 -55
- package/dist/storage.js.map +1 -1
- package/dist/transports/sse.d.ts +1 -1
- package/dist/transports/sse.js.map +1 -1
- package/dist/transports/testing.js +2 -1
- package/dist/transports/testing.js.map +1 -1
- package/package.json +1 -1
- package/src/client/session.ts +67 -211
- package/src/host/http.ts +2 -9
- package/src/host/socket.ts +38 -46
- package/src/host-internal.ts +0 -4
- package/src/host.ts +1 -1
- package/src/statewire.ts +1 -8
- package/src/storage.ts +8 -92
- package/src/transports/sse.ts +1 -1
- package/src/transports/testing.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":["encodeDocument","wrapStorageError","DEFAULT_PROTOCOL","WIRE_VERSION","protocolOffers","inRange","StatewireProtocol","applyDocumentOps","mainDocument","findDocument","resolveDocumentKey","StatewireDocuments","useContext","useEffect","useState","StatewirePath","MAX_COMMANDS_PER_FRAME","TERMINAL","StatewireCmd","StatewireSyn","encodeParams","reviveResponse","reviveValue","bindCommandsHost","CommandsInvocation","CommandsListener","Statewire","StatewireClient","DocumentStorageContext","SessionStorageContext","createMemorySessionStore","backoff","createMethodProxy","randomId","newClientId","StatewireSendError","RemoteLink","StatewireFrame","StatewireRemoteProps","WireCommand","protocol","produced","NonNullable","SessionCommand","method","params","meta","Pending","seq","command","inv","attempted","posted","applied","resolve","payload","reject","error","CtxPending","ops","protocolError","message","Error","rejectedSend","failure","SendFailure","Promise","result","catch","AttachState","StatewireSessionOptions","Options","sessionStore","SessionStorage","onSessionLost","OnSessionLost","onDone","Shared","txq","parked","SessionVerdict","unsubscribe","Session","options","selection","Selection","contextDocuments","State","record","SessionRecord","ctx","recordPersisted","hydrated","ready","storageError","persistedRecord","store","documentStore","Storage","shared","ephemeral","deactivated","sessionKnown","durableSeq","resumeAt","idle","ctxOps","ctxPending","lanesOnAttach","attachLaneSeqs","ReadonlySet","frameFailures","pending","canonical","documentListeners","Set","documents","lastPublished","changed","source","StateSource","attach","attachEpoch","running","pumping","transport","waiters","lifecycle","notify","commands","Record","publish","s","wake","waiter","waitForWake","r","push","sleepUntilWake","delayMs","clearTimeout","timer","setTimeout","filter","w","storageFailed","cause","entry","setRecord","save","backlog","p","map","mergeBacklog","own","known","foreign","c","has","sort","a","b","MAX_PARKED_VERDICTS","syncBacklogInner","splice","parkedSeqs","v","verdicts","length","slice","unchanged","every","i","undefined","syncBacklog","transactBackground","transact","fn","run","then","lock","stored","load","clientId","adoptReset","context","mode","Map","persistence","flush","done","setIdle","level","cover","onApplied","onCovered","NO_FAILED","FailedCommand","failedCommands","failed","retainFailedInner","ts","retainFailed","settleEntry","outcome","ok","onSettle","type","rides","settleAll","detach","const","batch","detachFailure","predecessorLost","some","fate","restateContext","ctxNextSeq","settleLost","entries","rebaseRecord","adopt","held","survivors","old","enqueueInner","pump","resetRecord","nextSeq","ephemeralDetach","rejectedFailure","cmd","code","outcomeOf","String","TERMINAL_CMD_TYPES","parkVerdict","handleCmd","Number","isSafeInteger","dur","Math","max","find","consumeVerdicts","consumed","verdict","add","size","handleCmds","cmds","ingestOps","protocols","next","get","value","applicationProtocols","Object","fromEntries","id","d","key","JSON","stringify","changedPaths","cacheDocuments","document","values","keyPrefixes","version","name","namespace","publishIngested","listener","snapCtxClock","ctxWm","recover","main","encoded","op","path","contextSnapshot","ctxAligned","sessionLostInner","seqWm","handleHello","syn","attachCmd","attachCtx","reconcile","adoptStored","ctxWatermark","ctxSeq","persistContext","handleOps","handleRefusal","watermark","retry","Date","now","firstCmd","firstCtx","cmdGap","ctxGap","handleDetach","handleFinish","reason","isFinished","Lanes","frame","cmdEntries","ctxEntries","buildLanes","persisted","at","_produced","takeAttachLanes","wanted","lanes","persistBeforeSend","connection","status","reconnect","resumeDelay","epoch","send","includes","onPosted","start","subscribe","stop","setTransport","onStart","enqueue","offers","offer","sendCommand","wire","wireVersion","findFailed","f","unknownFailed","takeFailed","found","discardFailed","retryFailed","current","doc","changeContext","build","submit","previous","operations","_doc","rest","updateContext","setContext","Array","isArray","keys","documentSource","Source","prefix","mounted","absolute","cached","list","delete","invokeProtocol","storedCommandCompatible","loadSessionRecord","migrate","useStatewireSession","defaultStore","session","beforeAttach","onHello","args","onOps","onCmds","onRefusal","onIdle","onDetach","onFinish","snapshot","takeChanged","setOnChange","setListener"],"sources":["../../src/client/session.ts"],"sourcesContent":["import { encodeDocument } from \"../document\";\nimport { wrapStorageError } from \"./storageError\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n protocolOffers,\n inRange,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport {\n applyDocumentOps,\n mainDocument,\n findDocument,\n resolveDocumentKey,\n} from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useContext, useEffect, useState } from \"react\";\n\nimport type { StatewirePath } from \"../wire/ops\";\nimport { MAX_COMMANDS_PER_FRAME } from \"../wire/limits\";\nimport { TERMINAL } from \"./connection\";\nimport type { StatewireCmd, StatewireSyn } from \"./connection\";\nimport { encodeParams, reviveResponse, reviveValue } from \"../wire/meta\";\nimport { bindCommandsHost } from \"../host/host\";\nimport type { CommandsInvocation, CommandsListener } from \"../host/host\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport {\n DocumentStorageContext,\n SessionStorageContext,\n createMemorySessionStore,\n} from \"./sessionStore\";\nimport { backoff } from \"./timing\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport { randomId as newClientId } from \"../util/randomId\";\nimport { StatewireSendError } from \"../types\";\nimport type {\n RemoteLink,\n StatewireFrame,\n StatewireRemoteProps,\n} from \"../transports/sse\";\n\ntype WireCommand = {\n protocol: string;\n produced?: NonNullable<StatewireClient.SessionCommand[\"produced\"]>;\n method: string;\n params: unknown[];\n meta?: unknown;\n};\n\ntype Pending = {\n readonly seq: number;\n readonly command: WireCommand;\n readonly inv: CommandsInvocation;\n /** A send carrying this statement may have reached the server. */\n attempted: boolean;\n /** In the resend queue when false. */\n posted: boolean;\n /** The server acknowledged admission; the terminal verdict is still due. */\n applied: boolean;\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\ntype CtxPending = {\n readonly seq: number;\n readonly ops: unknown[];\n posted: boolean;\n};\n\nconst protocolError = (message: string): never => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nconst rejectedSend = (\n failure: StatewireClient.SendFailure,\n): Promise<unknown> => {\n const result = Promise.reject<unknown>(new StatewireSendError(failure));\n result.catch(() => {});\n return result;\n};\n\ntype AttachState = \"detached\" | \"attached\" | \"finished\";\n\nexport type StatewireSessionOptions = StatewireProtocol.Options & {\n sessionStore?: StatewireClient.SessionStorage | undefined;\n onSessionLost?: StatewireClient.OnSessionLost | undefined;\n onDone?: (() => void) | undefined;\n};\n\ntype Shared = {\n txq: Promise<void>;\n parked: StatewireClient.SessionVerdict[];\n unsubscribe: (() => void) | null;\n};\n\ntype Session = {\n options: StatewireSessionOptions;\n selection: StatewireProtocol.Selection | undefined;\n contextDocuments: StatewireDocuments.State;\n record: StatewireClient.SessionRecord;\n ctx: StatewireRemoteProps;\n recordPersisted: boolean;\n hydrated: boolean;\n ready: Promise<void> | undefined;\n storageError: unknown;\n persistedRecord: StatewireClient.SessionRecord | null;\n store: StatewireClient.SessionStorage;\n documentStore: StatewireDocuments.Storage | undefined;\n shared: Shared | false;\n ephemeral: boolean;\n /** An ephemeral record died with its attach: the storage is off for good. */\n deactivated: boolean;\n sessionKnown: boolean;\n durableSeq: number;\n resumeAt: number;\n idle: boolean;\n onSessionLost: StatewireClient.OnSessionLost | undefined;\n onDone: (() => void) | undefined;\n ctxOps: unknown[] | undefined;\n ctxPending: CtxPending[];\n lanesOnAttach: boolean;\n attachLaneSeqs: readonly [ReadonlySet<number>, ReadonlySet<number>];\n frameFailures: number;\n pending: Pending[];\n canonical: unknown;\n documentListeners: Set<() => void>;\n documents: StatewireDocuments.State;\n lastPublished: unknown;\n changed: StatewirePath[];\n source: Statewire.StateSource;\n attach: AttachState;\n attachEpoch: number;\n running: boolean;\n pumping: boolean;\n transport: RemoteLink | null;\n waiters: (() => void)[];\n lifecycle: CommandsListener | null;\n notify: () => void;\n commands: Record<string, (...params: unknown[]) => Promise<unknown>>;\n};\n\nconst publish = (s: Session) => {\n if (s.canonical === s.lastPublished) return;\n s.lastPublished = s.canonical;\n s.notify();\n};\n\nconst wake = (s: Session) => {\n const waiters = s.waiters;\n s.waiters = [];\n for (const waiter of waiters) waiter();\n};\n\nconst waitForWake = (s: Session) => new Promise<void>((r) => s.waiters.push(r));\n\nconst sleepUntilWake = (s: Session, delayMs: number) =>\n new Promise<void>((resolve) => {\n const waiter = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n s.waiters = s.waiters.filter((w) => w !== waiter);\n resolve();\n }, delayMs);\n s.waiters.push(waiter);\n });\n\nconst storageFailed = (s: Session, cause: unknown) => {\n const error = wrapStorageError(cause);\n s.storageError = error;\n for (const entry of s.pending) entry.reject(error);\n s.transport?.storageFailed(error);\n};\n\nconst setRecord = (s: Session, record: StatewireClient.SessionRecord) => {\n s.record = record;\n if (!s.deactivated) {\n try {\n s.store.save(record);\n } catch (cause) {\n storageFailed(s, cause);\n throw s.storageError;\n }\n }\n};\n\nconst backlog = (s: Session): StatewireClient.SessionCommand[] =>\n s.pending\n .filter((p) => p.seq > s.durableSeq)\n .map((p) => ({ seq: p.seq, ...p.command }));\n\nconst mergeBacklog = (s: Session): StatewireClient.SessionCommand[] => {\n const own = backlog(s);\n if (!s.shared) return own;\n const known = new Set(s.pending.map((p) => p.seq));\n const foreign = s.record.commands.filter(\n (c) => !known.has(c.seq) && c.seq > s.durableSeq,\n );\n return [...foreign, ...own].sort((a, b) => a.seq - b.seq);\n};\n\nconst MAX_PARKED_VERDICTS = 64;\n\n// Storage holds what a reload must resend: a command leaves at its dur, at a\n// server verdict, or at a record reset — never at a local channel death.\nconst syncBacklogInner = (s: Session) => {\n const parked = s.shared ? s.shared.parked.splice(0) : [];\n const parkedSeqs = new Set(parked.map((v) => v.seq));\n const commands = mergeBacklog(s).filter((c) => !parkedSeqs.has(c.seq));\n const verdicts =\n parked.length > 0\n ? [...(s.record.verdicts ?? []), ...parked].slice(-MAX_PARKED_VERDICTS)\n : s.record.verdicts;\n const unchanged =\n verdicts === s.record.verdicts &&\n commands.length === s.record.commands.length &&\n commands.every((c, i) => c.seq === s.record.commands[i]!.seq);\n if (unchanged) return;\n setRecord(s, {\n ...s.record,\n commands,\n ...(verdicts !== undefined && { verdicts }),\n });\n};\n\nconst syncBacklog = (s: Session) => {\n if (!s.shared) return syncBacklogInner(s);\n transactBackground(s, () => syncBacklogInner(s));\n};\n\n// Every record mutation over shared storage is a locked read-modify-write.\nconst transact = (s: Session, fn: () => void): Promise<void> => {\n if (!s.shared || s.deactivated) {\n fn();\n return Promise.resolve();\n }\n const shared = s.shared;\n const run = shared.txq.then(() =>\n s.store.lock!(async () => {\n const stored = s.store.load();\n if (stored !== null && stored.clientId !== s.record.clientId) {\n adoptReset(s, stored);\n } else if (stored !== null) {\n s.record = stored;\n if (stored.context !== undefined) {\n const posted = new Set(\n s.ctxPending.filter((p) => p.posted).map((p) => p.seq),\n );\n s.ctxOps = stored.context.ops;\n s.contextDocuments = applyDocumentOps(\n { mode: \"mounted\", documents: new Map() },\n stored.context.ops,\n );\n s.ctxPending = stored.context.pending.map((p) => ({\n ...p,\n posted: posted.has(p.seq),\n }));\n }\n }\n fn();\n const persistence = s.store.flush?.();\n if (persistence) await persistence;\n }),\n );\n const result = run.catch((cause: unknown) => {\n storageFailed(s, cause);\n throw s.storageError;\n });\n shared.txq = result.then(\n () => {},\n () => {},\n );\n return result;\n};\n\nconst transactBackground = (s: Session, fn: () => void, done?: () => void) => {\n void transact(s, fn).then(done, () => {});\n};\n\nconst setIdle = (s: Session, level: boolean) => {\n if (level === s.idle) return;\n s.idle = level;\n s.notify();\n if (level) s.onDone?.();\n};\n\nconst cover = (s: Session, entry: Pending) => {\n if (entry.applied) return;\n entry.applied = true;\n s.lifecycle?.onApplied(entry.inv);\n s.lifecycle?.onCovered?.(entry.inv);\n};\n\nconst NO_FAILED: readonly StatewireClient.FailedCommand[] = [];\n\nexport const failedCommands = (\n s: Session,\n): readonly StatewireClient.FailedCommand[] => s.record.failed ?? NO_FAILED;\n\nconst retainFailedInner = (\n s: Session,\n entry: Pending,\n failure: StatewireClient.SendFailure,\n) => {\n setRecord(s, {\n ...s.record,\n failed: [\n ...(s.record.failed ?? []),\n {\n protocol: entry.command.protocol,\n ...(entry.command.produced !== undefined && {\n produced: entry.command.produced,\n }),\n command: entry.command.method,\n params: entry.command.params,\n ...(entry.command.meta !== undefined && { meta: entry.command.meta }),\n failure,\n ts: entry.inv.ts,\n seq: entry.seq,\n },\n ],\n });\n s.notify();\n};\n\nconst retainFailed = (\n s: Session,\n entry: Pending,\n failure: StatewireClient.SendFailure,\n) => {\n if (!s.shared) {\n retainFailedInner(s, entry, failure);\n return;\n }\n transactBackground(s, () => retainFailedInner(s, entry, failure));\n};\n\nconst settleEntry = (\n s: Session,\n entry: Pending,\n outcome:\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure },\n) => {\n s.pending = s.pending.filter((p) => p !== entry);\n if (outcome.ok) {\n entry.resolve(outcome.payload);\n s.lifecycle?.onSettle(entry.inv, {\n type: \"accepted\",\n payload: outcome.payload,\n });\n } else {\n // A statement the record still carries resends on the next attach; only\n // invocations the record no longer owns become failed history.\n const rides =\n (outcome.failure.cause === \"unmount\" ||\n outcome.failure.cause === \"stream-gone\") &&\n entry.seq > s.durableSeq;\n if (!rides) retainFailed(s, entry, outcome.failure);\n entry.reject(new StatewireSendError(outcome.failure));\n s.lifecycle?.onSettle(entry.inv, {\n type: \"rejected\",\n error: new StatewireSendError(outcome.failure),\n });\n }\n};\n\nconst settleAll = (s: Session, detach: \"unmount\" | \"gone\") => {\n const cause =\n detach === \"unmount\" ? (\"unmount\" as const) : (\"stream-gone\" as const);\n const batch = s.pending;\n const detachFailure = (entry: Pending): StatewireClient.SendFailure => {\n if (!entry.attempted) {\n const predecessorLost = batch.some(\n (p) => p.seq < entry.seq && p.attempted,\n );\n return predecessorLost\n ? { fate: \"aborted\", cause, predecessorLost }\n : { fate: \"aborted\", cause };\n }\n return { fate: \"lost\", cause };\n };\n for (const entry of [...batch]) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, { ok: false, failure: detachFailure(entry) });\n }\n};\n\nconst restateContext = (s: Session) => {\n s.ctxPending = [];\n if (s.ctxOps === undefined) return;\n const seq = s.record.ctxNextSeq;\n setRecord(s, { ...s.record, ctxNextSeq: seq + 1 });\n s.ctxPending.push({ seq, ops: s.ctxOps, posted: false });\n};\n\nconst settleLost = (s: Session, entries: Pending[]) => {\n for (const entry of entries) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"lost\", cause: \"session-lost\" },\n });\n }\n};\n\n// The server-side record's dedup memory is gone: history that may have\n// reached a server settles lost — the new hello's snapshot is the only\n// truth about what survived — and never-attempted statements re-stamp\n// on the adopted lane clocks.\nconst rebaseRecord = (s: Session, adopt: () => void) => {\n const held = [...s.pending];\n const survivors = held.filter((p) => !p.attempted && !p.applied);\n settleLost(\n s,\n held.filter((p) => p.attempted || p.applied),\n );\n s.pending = [];\n s.durableSeq = 0;\n // Failed entries are user-owned history: they ride through every record replacement.\n const failed = s.record.failed;\n adopt();\n if (failed !== undefined && s.record.failed !== failed) {\n setRecord(s, {\n ...s.record,\n failed: [...(s.record.failed ?? []), ...failed],\n });\n }\n for (const old of survivors) {\n s.lifecycle?.onCovered?.(old.inv);\n enqueueInner(s, old.command, old.inv.params, old.resolve, old.reject);\n }\n restateContext(s);\n publish(s);\n wake(s);\n void pump(s);\n};\n\nconst resetRecord = (s: Session, clientId: string) =>\n rebaseRecord(s, () =>\n setRecord(s, { clientId, nextSeq: 1, ctxNextSeq: 1, commands: [] }),\n );\n\n// Another sharer replaced the record's identity: their reset settles our\n// attempted history and our survivors re-stamp on the stored clocks.\nconst adoptReset = (s: Session, stored: StatewireClient.SessionRecord) =>\n rebaseRecord(s, () => {\n s.record = stored;\n });\n\n// The record died with the attach: mint a fresh id for the next one.\nconst ephemeralDetach = (s: Session) => {\n s.ephemeral = false;\n s.sessionKnown = false;\n resetRecord(s, newClientId());\n};\n\nconst rejectedFailure = (cmd: StatewireCmd): StatewireClient.SendFailure => {\n return {\n fate: \"rejected\",\n cause: \"server\",\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n };\n};\n\nconst outcomeOf = (\n cmd: StatewireCmd,\n):\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure } => {\n switch (cmd.type) {\n case \"result\":\n return { ok: true, payload: reviveResponse(cmd).payload };\n case \"rejected\":\n return { ok: false, failure: rejectedFailure(reviveResponse(cmd)) };\n case \"failed\":\n return {\n ok: false,\n failure: {\n fate: \"failed\",\n cause: \"server\",\n ...(cmd.message !== undefined && { message: cmd.message }),\n },\n };\n case \"crashed\":\n return { ok: false, failure: { fate: \"crashed\", cause: \"server\" } };\n case \"expired\":\n return { ok: false, failure: { fate: \"expired\", cause: \"server\" } };\n default:\n return protocolError(`unknown cmd type: ${String(cmd.type)}`);\n }\n};\n\nconst TERMINAL_CMD_TYPES: ReadonlySet<string> = new Set(TERMINAL);\n\nconst parkVerdict = (s: Session, cmd: StatewireCmd) => {\n if (!s.shared || !TERMINAL_CMD_TYPES.has(cmd.type!)) return;\n s.shared.parked.push({\n seq: cmd.seq,\n type: cmd.type as StatewireClient.SessionVerdict[\"type\"],\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n ...(cmd.meta !== undefined && { meta: cmd.meta }),\n });\n};\n\nconst handleCmd = (s: Session, cmd: StatewireCmd) => {\n if (!Number.isSafeInteger(cmd.seq) || cmd.seq <= 0) {\n protocolError(\"cmd.seq must be a positive safe integer\");\n }\n if (cmd.dur === true) {\n s.durableSeq = Math.max(s.durableSeq, cmd.seq);\n for (const entry of s.pending) {\n if (entry.seq <= s.durableSeq) entry.posted = true;\n }\n }\n if (cmd.type === undefined) return;\n const entry = s.pending.find((p) => p.seq === cmd.seq);\n if (cmd.type === \"applied\") {\n if (entry) cover(s, entry);\n return;\n }\n if (!entry) return;\n parkVerdict(s, cmd);\n cover(s, entry);\n settleEntry(s, entry, outcomeOf(cmd));\n};\n\nconst consumeVerdicts = (s: Session) => {\n const verdicts = s.record.verdicts ?? [];\n const consumed = new Set<number>();\n for (const verdict of verdicts) {\n const entry = s.pending.find((p) => p.seq === verdict.seq);\n if (!entry) continue;\n consumed.add(verdict.seq);\n cover(s, entry);\n settleEntry(s, entry, outcomeOf(verdict as StatewireCmd));\n }\n if (consumed.size === 0) return;\n setRecord(s, {\n ...s.record,\n commands: s.record.commands.filter((c) => !consumed.has(c.seq)),\n verdicts: verdicts.filter((v) => !consumed.has(v.seq)),\n });\n publish(s);\n wake(s);\n};\n\nconst handleCmds = (s: Session, cmds: StatewireCmd[]) => {\n for (const cmd of cmds) handleCmd(s, cmd);\n syncBacklog(s);\n wake(s);\n};\n\nconst ingestOps = (s: Session, ops: unknown[]) => {\n const applied = applyDocumentOps(s.documents, ops, s.selection?.protocols);\n s.documents = applied;\n const next =\n s.selection === undefined\n ? applied.documents.get(0)?.value\n : s.options.applicationProtocols === \"*\"\n ? Object.fromEntries(\n [...applied.documents].map(([id, d]) => [\n `${d.protocol}:${d.key === null ? id : JSON.stringify(d.key)}`,\n d.value,\n ]),\n )\n : mainDocument(applied, s.options.protocol ?? DEFAULT_PROTOCOL)?.value;\n if (next !== s.canonical)\n s.changed.push(\n ...(applied.changedPaths.length ? applied.changedPaths : [[]]),\n );\n s.canonical = next;\n};\n\nconst cacheDocuments = (s: Session) => {\n if (s.documentStore && s.selection) {\n for (const document of s.documents.documents.values()) {\n if (!document.protocol || !document.key) continue;\n const key = resolveDocumentKey(\n document.key,\n s.options.keyPrefixes?.[document.protocol],\n );\n const version = s.selection.protocols.find(\n (p) => p.name === document.protocol,\n )?.version;\n if (key !== undefined && version !== undefined)\n s.documentStore.save(\n [s.documentStore.namespace ?? \"\", document.protocol, ...key],\n { version, value: document.value },\n );\n }\n }\n};\n\nconst publishIngested = (s: Session) => {\n publish(s);\n cacheDocuments(s);\n for (const listener of s.documentListeners) listener();\n wake(s);\n};\n\n// A hello's cmd watermark may understate a durable record (cold host, tray\n// unloaded): held seqs resend as-is and the frame's answer arbitrates —\n// absorption where the record survived, a gap refusal where it did not.\nconst snapCtxClock = (s: Session, ctxWm: number) => {\n if (s.record.context?.recover === \"version-1\") {\n const document = s.contextDocuments.documents.get(0);\n if (s.contextDocuments.documents.size !== 1 || !document?.main)\n throw new Error(\n \"statewire: version-1 context recovery requires one main document at doc 0\",\n );\n const encoded = encodeDocument(document.value);\n const ops = [\n {\n ...(ctxWm === 0\n ? { op: \"mount\", protocol: document.protocol, main: true }\n : { op: \"replace\", path: [] }),\n ...encoded,\n },\n ];\n s.ctxPending = [{ seq: ctxWm + 1, ops, posted: false }];\n setRecord(s, {\n ...s.record,\n ctxNextSeq: ctxWm + 2,\n context: {\n ops: contextSnapshot(s.contextDocuments),\n pending: s.ctxPending,\n },\n });\n return;\n }\n const ctxAligned =\n s.ctxPending.every((c, i) => c.seq === ctxWm + 1 + i) &&\n s.record.ctxNextSeq === ctxWm + s.ctxPending.length + 1;\n if (!ctxAligned) {\n if (ctxWm > 0)\n throw new Error(\n \"statewire: context history is missing; use a new client id\",\n );\n setRecord(s, { ...s.record, ctxNextSeq: ctxWm + 1 });\n restateContext(s);\n }\n};\n\n// The refusal's watermarks are exact: every held statement above them was\n// never admitted by the live record, and the first unposted seq being beyond\n// watermark+1 proves the record that admitted the missing prefix is gone —\n// its history settles lost and the lane clocks restart at the watermarks.\nconst sessionLostInner = (s: Session, seqWm: number, ctxWm: number) => {\n const held = [...s.pending];\n settleLost(s, held);\n s.pending = [];\n s.durableSeq = seqWm;\n setRecord(s, {\n clientId: s.record.clientId,\n nextSeq: seqWm + 1,\n ctxNextSeq: s.record.ctxNextSeq,\n commands: [],\n ...(s.record.failed !== undefined && { failed: s.record.failed }),\n });\n snapCtxClock(s, ctxWm);\n if (\n held.length > 0 &&\n s.onSessionLost?.(held.map((p) => p.inv)) === \"requeue\"\n ) {\n for (const old of held) {\n enqueueInner(\n s,\n old.command,\n old.inv.params,\n () => {},\n () => {},\n );\n }\n }\n publish(s);\n wake(s);\n};\n\nconst handleHello = (\n s: Session,\n { ops, syn }: { ops: unknown[]; syn: StatewireSyn },\n) => {\n if (syn.record !== undefined && syn.record !== \"ephemeral\") {\n protocolError(`unknown record: ${String(syn.record)}`);\n }\n s.selection =\n syn.version === undefined || syn.protocols === undefined\n ? undefined\n : { version: syn.version, protocols: syn.protocols };\n s.documents = { mode: null, documents: new Map() };\n ingestOps(s, ops);\n s.attach = \"attached\";\n s.attachEpoch += 1;\n s.frameFailures = 0;\n s.resumeAt = 0;\n s.ephemeral = syn.record === \"ephemeral\";\n if (s.ephemeral) s.deactivated = true;\n const [attachCmd, attachCtx] = s.attachLaneSeqs;\n s.attachLaneSeqs = [new Set(), new Set()];\n const reconcile = () => {\n if (s.shared) adoptStored(s);\n // Resending unsettled statements is exactly-once-safe: absorbed replays\n // re-emit their stored verdicts (applied while still in flight).\n s.durableSeq = syn.seq ?? 0;\n for (const entry of s.pending) {\n entry.posted = attachCmd.has(entry.seq);\n }\n const ctxWatermark = syn.ctxSeq ?? 0;\n s.ctxPending = s.ctxPending.filter((c) => c.seq > ctxWatermark);\n for (const c of s.ctxPending) c.posted = attachCtx.has(c.seq);\n snapCtxClock(s, ctxWatermark);\n if (s.ctxOps !== undefined) persistContext(s);\n syncBacklogInner(s);\n s.sessionKnown = true;\n };\n if (!s.shared || s.deactivated) {\n reconcile();\n publishIngested(s);\n void pump(s);\n return;\n }\n transactBackground(s, reconcile, () => {\n publishIngested(s);\n void pump(s);\n });\n};\n\nconst handleOps = (\n s: Session,\n { ops, cmds }: { ops: unknown[]; cmds: StatewireCmd[] },\n) => {\n ingestOps(s, ops);\n for (const cmd of cmds) handleCmd(s, cmd);\n syncBacklog(s);\n publishIngested(s);\n};\n\n// A retry-less {syn} refusal is the one session-loss verdict: a cmd gap\n// against its exact watermark settles the held history lost; a pushback\n// (retry present) or a gapless refusal only reconciles the resend queues.\nconst handleRefusal = (s: Session, syn: StatewireSyn) => {\n const { seq, ctxSeq } = syn;\n if (typeof seq === \"number\") {\n const watermark = Math.max(seq, s.durableSeq);\n for (const entry of s.pending) entry.posted = entry.seq <= watermark;\n }\n if (typeof ctxSeq === \"number\") {\n s.ctxPending = s.ctxPending.filter((c) => c.seq > ctxSeq);\n for (const c of s.ctxPending) c.posted = false;\n if (s.ctxOps !== undefined) persistContext(s);\n }\n if (typeof syn.retry === \"number\") {\n s.resumeAt = Date.now() + syn.retry;\n wake(s);\n void pump(s);\n return;\n }\n const firstCmd = s.pending.find((p) => !p.posted);\n const firstCtx = s.ctxPending.find((c) => !c.posted);\n const cmdGap =\n typeof seq === \"number\" &&\n firstCmd !== undefined &&\n firstCmd.seq > Math.max(seq, s.durableSeq) + 1;\n const ctxGap =\n typeof ctxSeq === \"number\" &&\n firstCtx !== undefined &&\n firstCtx.seq > ctxSeq + 1;\n if (cmdGap || ctxGap) {\n transactBackground(\n s,\n () => {\n if (cmdGap) sessionLostInner(s, seq!, ctxSeq ?? 0);\n else snapCtxClock(s, ctxSeq!);\n },\n () => {\n wake(s);\n void pump(s);\n },\n );\n return;\n }\n wake(s);\n void pump(s);\n};\n\nconst handleDetach = (s: Session) => {\n if (s.attach === \"attached\") s.attach = \"detached\";\n if (s.ephemeral) ephemeralDetach(s);\n wake(s);\n};\n\nconst handleFinish = (s: Session, { reason }: { reason: string }) => {\n if (reason === \"reconnect\" || reason === \"error\") return;\n s.attach = \"finished\";\n settleAll(s, \"gone\");\n publish(s);\n wake(s);\n};\n\nconst isFinished = (s: Session) => s.attach === \"finished\";\n\ntype Lanes = {\n frame: StatewireFrame;\n cmdEntries: Pending[];\n ctxEntries: CtxPending[];\n};\n\n// A lane must be strictly consecutive within a frame: the first unposted run\n// per lane rides now, later runs ride follow-up frames.\nconst buildLanes = (s: Session, persisted = false): Lanes | null => {\n const ctxEntries: CtxPending[] = [];\n for (const entry of s.ctxPending) {\n if (entry.posted) continue;\n if (\n persisted &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= s.persistedRecord.ctxNextSeq)\n )\n break;\n if (ctxEntries.length >= MAX_COMMANDS_PER_FRAME) break;\n if (ctxEntries.length > 0 && entry.seq !== ctxEntries.at(-1)!.seq + 1)\n break;\n ctxEntries.push(entry);\n }\n const cmdEntries: Pending[] = [];\n for (const entry of s.pending) {\n if (entry.posted) continue;\n if (\n persisted &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= s.persistedRecord.nextSeq)\n )\n break;\n if (cmdEntries.length >= MAX_COMMANDS_PER_FRAME) break;\n if (cmdEntries.length > 0 && entry.seq !== cmdEntries.at(-1)!.seq + 1)\n break;\n cmdEntries.push(entry);\n }\n if (ctxEntries.length === 0 && cmdEntries.length === 0) return null;\n return {\n frame: {\n ...(ctxEntries.length > 0 && {\n ctx: ctxEntries.map((c) => ({ ops: c.ops, seq: c.seq })),\n }),\n ...(cmdEntries.length > 0 && {\n cmd: cmdEntries.map((p) => {\n const { produced: _produced, ...command } = p.command;\n return { ...command, seq: p.seq };\n }),\n }),\n },\n cmdEntries,\n ctxEntries,\n };\n};\n\nconst takeAttachLanes = (s: Session): StatewireFrame | null => {\n s.attachLaneSeqs = [new Set(), new Set()];\n const wanted = s.lanesOnAttach;\n s.lanesOnAttach = false;\n if (!wanted || !s.sessionKnown || s.record.context?.recover !== undefined)\n return null;\n const lanes = buildLanes(s, true);\n if (!lanes) return null;\n s.attachLaneSeqs = [\n new Set(lanes.cmdEntries.map((p) => p.seq)),\n new Set(lanes.ctxEntries.map((c) => c.seq)),\n ];\n for (const entry of lanes.cmdEntries) entry.attempted = true;\n return lanes.frame;\n};\n\nconst persistBeforeSend = (s: Session): void | Promise<void> => {\n if (s.storageError !== undefined) throw s.storageError;\n if (!s.hydrated) return s.ready!.then(() => persistBeforeSend(s));\n const record = s.record;\n try {\n const pending = s.store.flush?.();\n if (pending)\n return pending.then(\n () => {\n s.persistedRecord = record;\n },\n (cause: unknown) => {\n throw wrapStorageError(cause);\n },\n );\n s.persistedRecord = record;\n } catch (cause) {\n throw wrapStorageError(cause);\n }\n};\n\nconst pump = async (s: Session) => {\n if (s.pumping) return;\n s.pumping = true;\n try {\n while (s.running && !isFinished(s)) {\n if (!s.hydrated) await s.ready;\n const transport = s.transport;\n if (buildLanes(s) === null) return;\n if (s.attach !== \"attached\" || !transport) {\n if (\n (transport?.connection.status === \"standby\" &&\n transport.connection.reason === \"idle\") ||\n (transport?.parked && s.pending.length > 0)\n ) {\n transport.connection.reconnect();\n }\n await waitForWake(s);\n continue;\n }\n const resumeDelay = s.resumeAt - Date.now();\n if (resumeDelay > 0) {\n await sleepUntilWake(s, resumeDelay);\n continue;\n }\n const lanes = buildLanes(s);\n if (!lanes) continue;\n const epoch = s.attachEpoch;\n const persistence = persistBeforeSend(s);\n if (persistence) await persistence;\n if (!s.running || isFinished(s)) return;\n if (epoch !== s.attachEpoch || s.attach !== \"attached\") continue;\n for (const entry of lanes.cmdEntries) entry.attempted = true;\n let result;\n try {\n // Shared storage: the lock across the send keeps per-lane arrival\n // ordered across sharers during attach handover.\n const send = () => transport.send(lanes.frame);\n result = await (s.shared && !s.deactivated\n ? s.store.lock!(send)\n : send());\n } catch {\n if (!s.running || isFinished(s)) return;\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n continue;\n }\n if (!s.running) return;\n s.frameFailures = 0;\n if (result.type === \"ok\") {\n if (epoch === s.attachEpoch) {\n for (const entry of lanes.cmdEntries) {\n if (s.pending.includes(entry)) {\n entry.posted = true;\n s.lifecycle?.onPosted?.(entry.inv);\n }\n }\n for (const entry of lanes.ctxEntries) entry.posted = true;\n }\n } else if (result.type === \"refusal\") {\n if (epoch === s.attachEpoch) handleRefusal(s, result.syn);\n } else if (result.type === \"stale-lease\") {\n // A POST outlived its attach: reattach first, the hello arbitrates.\n if (epoch === s.attachEpoch) {\n transport.connection.reconnect();\n await waitForWake(s);\n }\n } else if (result.type === \"no-lease\") {\n // No out-of-band write channel: the frame rides a fresh attach.\n if (epoch === s.attachEpoch) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n while (s.running && !isFinished(s) && epoch === s.attachEpoch) {\n await waitForWake(s);\n }\n }\n }\n }\n } catch (error) {\n storageFailed(s, error);\n } finally {\n s.pumping = false;\n }\n};\n\nconst start = (s: Session) => {\n s.running = true;\n if (!s.hydrated) {\n void s.ready!.then(\n () => {\n if (s.running) start(s);\n },\n () => {},\n );\n return;\n }\n if (s.shared) {\n s.shared.unsubscribe = s.store.subscribe!(() => {\n transactBackground(s, () => consumeVerdicts(s));\n });\n s.running = true;\n transactBackground(\n s,\n () => {\n if (s.store.load() === null) s.store.save(s.record);\n s.recordPersisted = true;\n adoptStored(s);\n consumeVerdicts(s);\n },\n () => void pump(s),\n );\n return;\n }\n if (!s.recordPersisted) {\n s.recordPersisted = true;\n s.store.save(s.record);\n }\n adoptStored(s);\n s.running = true;\n void pump(s);\n};\n\nconst stop = (s: Session) => {\n s.running = false;\n if (s.shared) {\n s.shared.unsubscribe?.();\n s.shared.unsubscribe = null;\n }\n wake(s);\n settleAll(s, \"unmount\");\n};\n\nconst setTransport = (s: Session, transport: RemoteLink) => {\n if (s.transport === transport) return;\n s.transport = transport;\n wake(s);\n};\n\nconst enqueueInner = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n) => {\n const seq = Math.max(s.record.nextSeq, s.durableSeq + 1);\n const entry: Pending = {\n seq,\n command,\n inv: {\n protocol: command.protocol,\n method: command.method,\n params,\n ts: Date.now(),\n seq,\n clientId: s.record.clientId,\n },\n attempted: false,\n posted: false,\n applied: false,\n resolve,\n reject,\n };\n s.pending.push(entry);\n setRecord(s, { ...s.record, nextSeq: seq + 1, commands: mergeBacklog(s) });\n s.lifecycle?.onStart(entry.inv);\n};\n\nconst enqueue = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n) => {\n if (!s.shared) {\n enqueueInner(s, command, params, resolve, reject);\n wake(s);\n void pump(s);\n return;\n }\n void transact(s, () => {\n if (!s.running) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"unmount\" }));\n return;\n }\n if (isFinished(s)) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"stream-gone\" }));\n return;\n }\n enqueueInner(s, command, params, resolve, reject);\n }).then(() => {\n wake(s);\n void pump(s);\n }, reject);\n};\n\n// A stored command may have reached a server: attempted settles it lost,\n// never aborted, when a channel death ends the session.\nconst adoptStored = (s: Session) => {\n const known = new Set(s.pending.map((p) => p.seq));\n const stored = s.record.commands.filter((c) => !known.has(c.seq));\n if (stored.length === 0) return;\n for (const { seq, ...command } of stored) {\n const offers = protocolOffers(s.options);\n if (\n offers !== \"*\" &&\n !offers.some((offer) => offer.name === command.protocol)\n )\n continue;\n const params =\n command.meta === undefined\n ? command.params\n : (reviveValue([...command.params], command.meta) as unknown[]);\n const entry: Pending = {\n seq,\n command,\n inv: {\n protocol: command.protocol,\n method: command.method,\n params,\n ts: Date.now(),\n seq,\n clientId: s.record.clientId,\n },\n attempted: true,\n posted: false,\n applied: false,\n resolve: () => {},\n reject: () => {},\n };\n s.pending.push(entry);\n s.lifecycle?.onStart(entry.inv);\n }\n s.pending.sort((a, b) => a.seq - b.seq);\n};\n\nconst sendCommand = (\n s: Session,\n method: string,\n params: readonly unknown[],\n protocol = s.options.protocol ?? DEFAULT_PROTOCOL,\n): Promise<unknown> => {\n if (!s.hydrated) {\n const result = s.ready!.then(() =>\n sendCommand(s, method, params, protocol),\n );\n result.catch(() => {});\n return result;\n }\n if (s.storageError !== undefined) {\n const result = Promise.reject(s.storageError);\n result.catch(() => {});\n return result;\n }\n if (!s.running) {\n return rejectedSend({ fate: \"aborted\", cause: \"unmount\" });\n }\n if (isFinished(s)) {\n return rejectedSend({ fate: \"aborted\", cause: \"stream-gone\" });\n }\n const result = new Promise<unknown>((resolve, reject) => {\n const { params: encoded, meta } = encodeParams(params);\n enqueue(\n s,\n {\n protocol,\n produced: {\n wire: s.options.wireVersion ?? { version: WIRE_VERSION },\n protocols:\n protocolOffers(s.options) === \"*\" && s.selection\n ? s.selection.protocols\n : protocolOffers(s.options),\n },\n method,\n params: encoded,\n ...(meta !== undefined && { meta }),\n },\n params,\n resolve,\n reject,\n );\n });\n result.catch(() => {});\n return result;\n};\n\nconst findFailed = (\n s: Session,\n entry: StatewireClient.FailedCommand,\n): StatewireClient.FailedCommand | undefined =>\n (s.record.failed ?? []).find(\n (f) =>\n f.seq === entry.seq && f.ts === entry.ts && f.command === entry.command,\n );\n\nconst unknownFailed = (entry: StatewireClient.FailedCommand) =>\n new Error(`statewire: unknown failed command \"${entry.command}\"`);\n\nconst takeFailed = (\n s: Session,\n entry: StatewireClient.FailedCommand,\n): StatewireClient.FailedCommand => {\n const failed = s.record.failed ?? [];\n const found = findFailed(s, entry);\n if (found === undefined) throw unknownFailed(entry);\n setRecord(s, { ...s.record, failed: failed.filter((f) => f !== found) });\n s.notify();\n return found;\n};\n\nexport const discardFailed = (\n s: Session,\n entry: StatewireClient.FailedCommand,\n): void => {\n if (!s.shared) {\n takeFailed(s, entry);\n return;\n }\n if (findFailed(s, entry) === undefined) throw unknownFailed(entry);\n transactBackground(s, () => {\n if (findFailed(s, entry) !== undefined) takeFailed(s, entry);\n });\n};\n\nexport const retryFailed = (\n s: Session,\n entry: StatewireClient.FailedCommand,\n): Promise<unknown> => {\n if (!s.running) {\n return rejectedSend({ fate: \"aborted\", cause: \"unmount\" });\n }\n if (isFinished(s)) {\n return rejectedSend({ fate: \"aborted\", cause: \"stream-gone\" });\n }\n const found = findFailed(s, entry);\n if (found === undefined) throw unknownFailed(entry);\n const params =\n found.meta === undefined\n ? found.params\n : (reviveValue([...found.params], found.meta) as unknown[]);\n const result = new Promise<unknown>((resolve, reject) => {\n const retry = () => {\n if (!s.running) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"unmount\" }));\n return;\n }\n if (isFinished(s)) {\n reject(\n new StatewireSendError({ fate: \"aborted\", cause: \"stream-gone\" }),\n );\n return;\n }\n const current = findFailed(s, entry);\n if (current === undefined) {\n reject(unknownFailed(entry));\n return;\n }\n takeFailed(s, current);\n enqueueInner(\n s,\n {\n protocol: current.protocol,\n ...(current.produced !== undefined && { produced: current.produced }),\n method: current.command,\n params: [...current.params],\n ...(current.meta !== undefined && { meta: current.meta }),\n },\n params,\n resolve,\n reject,\n );\n };\n if (!s.shared) {\n retry();\n wake(s);\n void pump(s);\n return;\n }\n void transact(s, retry).then(() => {\n wake(s);\n void pump(s);\n }, reject);\n });\n result.catch(() => {});\n return result;\n};\n\nconst contextSnapshot = (documents: StatewireDocuments.State) =>\n [...documents.documents].map(([doc, d]) => {\n const encoded = encodeDocument(d.value);\n return {\n op: \"mount\",\n ...(doc === 0 ? {} : { doc }),\n protocol: d.protocol,\n ...(d.main ? { main: true } : {}),\n ...(d.key === null ? {} : { key: d.key }),\n value: encoded.value,\n ...(encoded.meta === undefined ? {} : { meta: encoded.meta }),\n };\n });\n\nconst persistContext = (s: Session) => {\n const ops = contextSnapshot(s.contextDocuments);\n s.ctxOps = ops;\n setRecord(s, {\n ...s.record,\n context: {\n ops,\n ...(s.record.context?.recover === undefined\n ? {}\n : { recover: s.record.context.recover }),\n pending: s.ctxPending.map(({ seq, ops }) => ({ seq, ops })),\n },\n });\n};\n\nconst changeContext = (\n s: Session,\n build: (documents: StatewireDocuments.State) => readonly unknown[],\n): void => {\n if (!s.hydrated) {\n void s\n .ready!.then(() => changeContext(s, build))\n .catch((cause: unknown) => {\n const error = wrapStorageError(cause);\n s.storageError = error;\n s.transport?.storageFailed(error);\n });\n return;\n }\n if (!s.running || isFinished(s)) return;\n const submit = () => {\n if (!s.running || isFinished(s)) return;\n const previous =\n s.record.context === undefined\n ? s.contextDocuments\n : applyDocumentOps(\n { mode: \"mounted\", documents: new Map() },\n s.record.context.ops,\n );\n const operations = build(previous);\n if (!operations.length)\n throw new Error(\"statewire: context operations must not be empty\");\n const offers = protocolOffers(s.options);\n const protocols =\n s.selection?.protocols ?? (offers === \"*\" ? undefined : offers);\n s.contextDocuments = applyDocumentOps(\n previous,\n operations,\n protocols,\n true,\n );\n const seq = s.record.ctxNextSeq;\n s.ctxPending = [\n ...s.ctxPending,\n {\n seq,\n ops: operations.map((op) => {\n const value = op as Record<string, unknown>;\n if (value[\"doc\"] !== 0) return value;\n const { doc: _doc, ...rest } = value;\n return rest;\n }),\n posted: false,\n },\n ];\n s.record = { ...s.record, ctxNextSeq: seq + 1 };\n persistContext(s);\n };\n if (!s.shared) {\n submit();\n wake(s);\n void pump(s);\n } else\n transactBackground(s, submit, () => {\n wake(s);\n void pump(s);\n });\n};\n\nexport const updateContext = (s: Session, operations: readonly unknown[]) =>\n changeContext(s, () => operations);\n\nconst setContext = (\n s: Session,\n value: Record<string, unknown>,\n protocol = s.options.protocol ?? DEFAULT_PROTOCOL,\n): void => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n throw new Error(\"statewire: context must be a plain object\");\n const encoded = encodeDocument(value);\n changeContext(s, (documents) => {\n const found = [...documents.documents].find(\n ([, d]) => d.protocol === protocol && d.main,\n );\n const doc = found?.[0] ?? Math.max(-1, ...documents.documents.keys()) + 1;\n return [\n {\n ...(found === undefined\n ? { op: \"mount\", protocol, main: true }\n : { op: \"replace\", path: [] }),\n ...(doc === 0 ? {} : { doc }),\n value: encoded.value,\n ...(encoded.meta === undefined ? {} : { meta: encoded.meta }),\n },\n ];\n });\n};\n\nexport const documentSource = (s: Session): StatewireDocuments.Source => ({\n get: (protocol, key, prefix = s.options.keyPrefixes?.[protocol]) => {\n const mounted = findDocument(s.documents, protocol, key, prefix);\n if (mounted !== undefined) return mounted.value;\n if (!s.documentStore || key === undefined) return undefined;\n const absolute = resolveDocumentKey(key, prefix);\n if (absolute === undefined) return undefined;\n const cached = s.documentStore.load([\n s.documentStore.namespace ?? \"\",\n protocol,\n ...absolute,\n ]);\n if (cached === undefined) return undefined;\n const offers = protocolOffers(s.options);\n const offer =\n offers === \"*\"\n ? s.selection?.protocols.find((p) => p.name === protocol)\n : offers.find((p) => p.name === protocol);\n return offer !== undefined && inRange(cached.version, offer)\n ? cached.value\n : undefined;\n },\n list: () => s.documents.documents,\n subscribe: (listener) => {\n s.documentListeners.add(listener);\n return () => {\n s.documentListeners.delete(listener);\n };\n },\n});\n\nexport const invokeProtocol = (\n s: Session,\n protocol: string,\n method: string,\n params: readonly unknown[],\n) => sendCommand(s, method, params, protocol);\n\nconst storedCommandCompatible = (\n command: StatewireClient.SessionCommand,\n current: NonNullable<StatewireClient.SessionCommand[\"produced\"]>,\n) => {\n if (\n !command.produced ||\n !command.protocol ||\n !inRange(command.produced.wire.version, current.wire)\n )\n return false;\n const previous = command.produced.protocols;\n if (current.protocols === \"*\") return true;\n if (previous === \"*\") return false;\n const produced = previous.find((p) => p.name === command.protocol);\n const offer = current.protocols.find((p) => p.name === command.protocol);\n return (\n produced !== undefined &&\n offer !== undefined &&\n inRange(produced.version, offer)\n );\n};\n\nconst loadSessionRecord = (\n store: StatewireClient.SessionStorage,\n options: StatewireSessionOptions,\n) => {\n let stored = store.load();\n if (stored !== null && !Array.isArray(stored.commands))\n throw new Error(\n \"statewire: session storage loaded a record without a commands array\",\n );\n const current = {\n wire: options.wireVersion ?? { version: WIRE_VERSION },\n protocols: protocolOffers(options),\n };\n if (\n stored !== null &&\n !stored.commands.every((command) =>\n storedCommandCompatible(command, current),\n )\n ) {\n if (!store.migrate)\n throw new Error(\"statewire: stored commands require a storage migration\");\n stored = store.migrate(stored, current);\n if (\n stored !== null &&\n !stored.commands.every((command) =>\n storedCommandCompatible(command, current),\n )\n )\n throw new Error(\"statewire: migrated commands are incompatible\");\n if (stored !== null) store.save(stored);\n }\n if (stored !== null && !Array.isArray(stored.commands)) {\n throw new Error(\n \"statewire: session storage loaded a record without a commands array\",\n );\n }\n const record = stored ?? {\n clientId: newClientId(),\n nextSeq: 1,\n ctxNextSeq: 1,\n commands: [],\n };\n if (stored === null) store.save(record);\n return { record, stored };\n};\n\nexport const useStatewireSession = (\n options: StatewireSessionOptions,\n): Session => {\n const [defaultStore] = useState(createMemorySessionStore);\n const mounted = useContext(SessionStorageContext);\n const documentStore = useContext(DocumentStorageContext);\n if (options.sessionStore !== undefined && mounted !== undefined) {\n throw new Error(\n \"statewire: session storage is set twice — drop the transport's sessionStore or the client's storage.session\",\n );\n }\n const store = options.sessionStore ?? mounted ?? defaultStore;\n if ((store.lock === undefined) !== (store.subscribe === undefined)) {\n throw new Error(\n \"statewire: session storage must provide lock and subscribe together\",\n );\n }\n const [s] = useState((): Session => {\n const { record, stored } =\n store.ready === undefined\n ? loadSessionRecord(store, options)\n : {\n record: {\n clientId: newClientId(),\n nextSeq: 1,\n ctxNextSeq: 1,\n commands: [],\n },\n stored: null,\n };\n const session: Session = {\n options,\n selection: undefined,\n contextDocuments:\n stored?.context === undefined\n ? { mode: \"mounted\", documents: new Map() }\n : applyDocumentOps(\n { mode: \"mounted\", documents: new Map() },\n stored.context.ops,\n ),\n record,\n ctx: {\n beforeAttach: () => persistBeforeSend(session),\n get clientId() {\n return session.record.clientId;\n },\n takeAttachLanes: () => takeAttachLanes(session),\n onHello: (args) => handleHello(session, args),\n onOps: (args) => handleOps(session, args),\n onCmds: (cmds) => handleCmds(session, cmds),\n onRefusal: (syn) => handleRefusal(session, syn),\n onIdle: (level) => setIdle(session, level),\n onDetach: () => handleDetach(session),\n onFinish: (args) => handleFinish(session, args),\n },\n recordPersisted: store.ready === undefined,\n hydrated: store.ready === undefined,\n ready: undefined,\n storageError: undefined,\n persistedRecord: store.ready === undefined ? record : null,\n store,\n documentStore,\n shared:\n store.lock !== undefined\n ? { txq: Promise.resolve(), parked: [], unsubscribe: null }\n : false,\n ephemeral: false,\n deactivated: false,\n sessionKnown: false,\n durableSeq: 0,\n resumeAt: 0,\n idle: false,\n onSessionLost: undefined,\n onDone: undefined,\n ctxOps: stored?.context?.ops,\n ctxPending:\n stored?.context?.pending.map((p) => ({ ...p, posted: false })) ?? [],\n lanesOnAttach: false,\n attachLaneSeqs: [new Set(), new Set()],\n frameFailures: 0,\n pending: [],\n canonical: undefined,\n documentListeners: new Set(),\n documents: { mode: null, documents: new Map() },\n lastPublished: undefined,\n changed: [],\n source: {\n snapshot: () => session.canonical,\n takeChanged: () => {\n const changed = session.changed;\n session.changed = [];\n return changed;\n },\n setOnChange: (listener) => {\n session.notify = listener ?? (() => {});\n },\n },\n attach: \"detached\",\n attachEpoch: 0,\n running: false,\n pumping: false,\n transport: null,\n waiters: [],\n lifecycle: null,\n notify: () => {},\n commands: createMethodProxy((method, params) =>\n sendCommand(session, method, params),\n ),\n };\n if (store.ready !== undefined) {\n session.ready = store.ready.then(() => {\n const { record } = loadSessionRecord(store, session.options);\n session.record = record;\n session.contextDocuments =\n record.context === undefined\n ? { mode: \"mounted\", documents: new Map() }\n : applyDocumentOps(\n { mode: \"mounted\", documents: new Map() },\n record.context.ops,\n );\n session.ctxOps = record.context?.ops;\n session.ctxPending =\n record.context?.pending.map((entry) => ({\n ...entry,\n posted: false,\n })) ?? [];\n session.recordPersisted = true;\n session.hydrated = true;\n if (session.running) session.notify();\n });\n session.ready = session.ready.catch((cause: unknown) => {\n const error = wrapStorageError(cause);\n session.storageError = error;\n session.transport?.storageFailed(error);\n throw error;\n });\n session.ready.catch(() => {});\n }\n bindCommandsHost(session.commands, {\n setListener: (listener) => {\n session.lifecycle = listener;\n },\n });\n return session;\n });\n if ((store.lock !== undefined) !== (s.shared !== false)) {\n throw new Error(\n \"statewire: session storage changed sharedness across renders — lock/subscribe must be present from the first render or never\",\n );\n }\n s.options = options;\n s.store = store;\n s.documentStore = documentStore;\n s.onSessionLost = options.onSessionLost;\n s.onDone = options.onDone;\n const keyPrefixes = JSON.stringify(options.keyPrefixes);\n useEffect(() => {\n cacheDocuments(s);\n }, [s, documentStore, keyPrefixes]);\n useEffect(\n () =>\n documentStore?.subscribe?.(() => {\n for (const listener of s.documentListeners) listener();\n }),\n [s, documentStore],\n );\n useEffect(() => {\n start(s);\n return () => stop(s);\n }, [s]);\n return s;\n};\n\nexport { setContext, setTransport };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","names":["encodeDocument","wrapStorageError","DEFAULT_PROTOCOL","WIRE_VERSION","protocolOffers","inRange","StatewireProtocol","applyDocumentOps","mainDocument","findDocument","resolveDocumentKey","StatewireDocuments","useContext","useEffect","useState","StatewirePath","MAX_COMMANDS_PER_FRAME","TERMINAL","StatewireCmd","StatewireSyn","encodeParams","reviveResponse","reviveValue","bindCommandsHost","CommandsInvocation","CommandsListener","Statewire","StatewireClient","DocumentStorageContext","SessionStorageContext","createMemorySessionStore","backoff","createMethodProxy","randomId","newClientId","StatewireSendError","RemoteLink","StatewireFrame","StatewireRemoteProps","WireCommand","protocol","produced","NonNullable","SessionCommand","method","params","meta","Pending","seq","command","inv","attempted","posted","applied","resolve","payload","reject","error","CtxPending","ops","protocolError","message","Error","rejectedSend","failure","SendFailure","Promise","result","catch","AttachState","StatewireSessionOptions","Options","sessionStore","SessionStorage","onSessionLost","OnSessionLost","onDone","Shared","txq","parked","SessionVerdict","unsubscribe","Session","options","selection","Selection","contextDocuments","State","record","SessionRecord","ctx","recordPersisted","hydrated","ready","storageError","persistedRecord","store","documentStore","Storage","shared","ephemeral","deactivated","sessionKnown","durableSeq","resumeAt","idle","ctxNextSeq","ctxPending","lanesOnAttach","attachLaneSeqs","ReadonlySet","frameFailures","pending","canonical","documentListeners","Set","documents","lastPublished","changed","source","StateSource","attach","attachEpoch","running","pumping","transport","waiters","lifecycle","notify","commands","Record","publish","s","wake","waiter","waitForWake","r","push","sleepUntilWake","delayMs","clearTimeout","timer","setTimeout","filter","w","storageFailed","cause","entry","setRecord","save","backlog","p","map","mergeBacklog","own","known","foreign","c","has","sort","a","b","MAX_PARKED_VERDICTS","syncBacklogInner","splice","parkedSeqs","v","verdicts","length","slice","unchanged","every","i","undefined","syncBacklog","transactBackground","transact","fn","run","then","lock","stored","load","clientId","adoptReset","persistence","flush","done","setIdle","level","cover","onApplied","onCovered","NO_FAILED","FailedCommand","failedCommands","failed","retainFailedInner","ts","retainFailed","settleEntry","outcome","ok","onSettle","type","rides","settleAll","detach","const","batch","detachFailure","predecessorLost","some","fate","settleLost","entries","rebaseRecord","adopt","held","survivors","old","enqueueInner","pump","resetRecord","nextSeq","ephemeralDetach","rejectedFailure","cmd","code","outcomeOf","String","TERMINAL_CMD_TYPES","parkVerdict","handleCmd","Number","isSafeInteger","dur","Math","max","find","consumeVerdicts","consumed","verdict","add","size","handleCmds","cmds","ingestOps","protocols","next","get","value","applicationProtocols","Object","fromEntries","id","d","key","JSON","stringify","changedPaths","cacheDocuments","document","values","keyPrefixes","version","name","namespace","publishIngested","listener","sessionLostInner","seqWm","handleHello","syn","ctxSeq","mode","Map","attachCmd","attachCtx","reconcile","adoptStored","handleOps","handleRefusal","watermark","firstCtx","retry","Date","now","firstCmd","cmdGap","handleDetach","handleFinish","reason","isFinished","Lanes","frame","cmdEntries","ctxEntries","buildLanes","cmdGate","at","_produced","resetContextLane","contextSnapshot","takeAttachLanes","wanted","lanes","persistBeforeSend","connection","status","reconnect","resumeDelay","epoch","send","includes","onPosted","start","subscribe","stop","setTransport","onStart","enqueue","offers","offer","sendCommand","encoded","wire","wireVersion","findFailed","f","unknownFailed","takeFailed","found","discardFailed","retryFailed","current","doc","op","main","changeContext","build","operations","_doc","rest","updateContext","setContext","Array","isArray","keys","path","documentSource","Source","prefix","mounted","absolute","cached","list","delete","invokeProtocol","storedCommandCompatible","previous","loadSessionRecord","migrate","useStatewireSession","defaultStore","session","beforeAttach","onHello","args","onOps","onCmds","onRefusal","onIdle","onDetach","onFinish","snapshot","takeChanged","setOnChange","setListener"],"sources":["../../src/client/session.ts"],"sourcesContent":["import { encodeDocument } from \"../document\";\nimport { wrapStorageError } from \"./storageError\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n protocolOffers,\n inRange,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport {\n applyDocumentOps,\n mainDocument,\n findDocument,\n resolveDocumentKey,\n} from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useContext, useEffect, useState } from \"react\";\n\nimport type { StatewirePath } from \"../wire/ops\";\nimport { MAX_COMMANDS_PER_FRAME } from \"../wire/limits\";\nimport { TERMINAL } from \"./connection\";\nimport type { StatewireCmd, StatewireSyn } from \"./connection\";\nimport { encodeParams, reviveResponse, reviveValue } from \"../wire/meta\";\nimport { bindCommandsHost } from \"../host/host\";\nimport type { CommandsInvocation, CommandsListener } from \"../host/host\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport {\n DocumentStorageContext,\n SessionStorageContext,\n createMemorySessionStore,\n} from \"./sessionStore\";\nimport { backoff } from \"./timing\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport { randomId as newClientId } from \"../util/randomId\";\nimport { StatewireSendError } from \"../types\";\nimport type {\n RemoteLink,\n StatewireFrame,\n StatewireRemoteProps,\n} from \"../transports/sse\";\n\ntype WireCommand = {\n protocol: string;\n produced?: NonNullable<StatewireClient.SessionCommand[\"produced\"]>;\n method: string;\n params: unknown[];\n meta?: unknown;\n};\n\ntype Pending = {\n readonly seq: number;\n readonly command: WireCommand;\n readonly inv: CommandsInvocation;\n /** A send carrying this statement may have reached the server. */\n attempted: boolean;\n /** In the resend queue when false. */\n posted: boolean;\n /** The server acknowledged admission; the terminal verdict is still due. */\n applied: boolean;\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\ntype CtxPending = {\n readonly seq: number;\n readonly ops: unknown[];\n posted: boolean;\n};\n\nconst protocolError = (message: string): never => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nconst rejectedSend = (\n failure: StatewireClient.SendFailure,\n): Promise<unknown> => {\n const result = Promise.reject<unknown>(new StatewireSendError(failure));\n result.catch(() => {});\n return result;\n};\n\ntype AttachState = \"detached\" | \"attached\" | \"finished\";\n\nexport type StatewireSessionOptions = StatewireProtocol.Options & {\n sessionStore?: StatewireClient.SessionStorage | undefined;\n onSessionLost?: StatewireClient.OnSessionLost | undefined;\n onDone?: (() => void) | undefined;\n};\n\ntype Shared = {\n txq: Promise<void>;\n parked: StatewireClient.SessionVerdict[];\n unsubscribe: (() => void) | null;\n};\n\ntype Session = {\n options: StatewireSessionOptions;\n selection: StatewireProtocol.Selection | undefined;\n contextDocuments: StatewireDocuments.State;\n record: StatewireClient.SessionRecord;\n ctx: StatewireRemoteProps;\n recordPersisted: boolean;\n hydrated: boolean;\n ready: Promise<void> | undefined;\n storageError: unknown;\n persistedRecord: StatewireClient.SessionRecord | null;\n store: StatewireClient.SessionStorage;\n documentStore: StatewireDocuments.Storage | undefined;\n shared: Shared | false;\n ephemeral: boolean;\n /** An ephemeral record died with its attach: the storage is off for good. */\n deactivated: boolean;\n sessionKnown: boolean;\n durableSeq: number;\n resumeAt: number;\n idle: boolean;\n onSessionLost: StatewireClient.OnSessionLost | undefined;\n onDone: (() => void) | undefined;\n ctxNextSeq: number;\n ctxPending: CtxPending[];\n lanesOnAttach: boolean;\n attachLaneSeqs: readonly [ReadonlySet<number>, ReadonlySet<number>];\n frameFailures: number;\n pending: Pending[];\n canonical: unknown;\n documentListeners: Set<() => void>;\n documents: StatewireDocuments.State;\n lastPublished: unknown;\n changed: StatewirePath[];\n source: Statewire.StateSource;\n attach: AttachState;\n attachEpoch: number;\n running: boolean;\n pumping: boolean;\n transport: RemoteLink | null;\n waiters: (() => void)[];\n lifecycle: CommandsListener | null;\n notify: () => void;\n commands: Record<string, (...params: unknown[]) => Promise<unknown>>;\n};\n\nconst publish = (s: Session) => {\n if (s.canonical === s.lastPublished) return;\n s.lastPublished = s.canonical;\n s.notify();\n};\n\nconst wake = (s: Session) => {\n const waiters = s.waiters;\n s.waiters = [];\n for (const waiter of waiters) waiter();\n};\n\nconst waitForWake = (s: Session) => new Promise<void>((r) => s.waiters.push(r));\n\nconst sleepUntilWake = (s: Session, delayMs: number) =>\n new Promise<void>((resolve) => {\n const waiter = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n s.waiters = s.waiters.filter((w) => w !== waiter);\n resolve();\n }, delayMs);\n s.waiters.push(waiter);\n });\n\nconst storageFailed = (s: Session, cause: unknown) => {\n const error = wrapStorageError(cause);\n s.storageError = error;\n for (const entry of s.pending) entry.reject(error);\n s.transport?.storageFailed(error);\n};\n\nconst setRecord = (s: Session, record: StatewireClient.SessionRecord) => {\n s.record = record;\n if (!s.deactivated) {\n try {\n s.store.save(record);\n } catch (cause) {\n storageFailed(s, cause);\n throw s.storageError;\n }\n }\n};\n\nconst backlog = (s: Session): StatewireClient.SessionCommand[] =>\n s.pending\n .filter((p) => p.seq > s.durableSeq)\n .map((p) => ({ seq: p.seq, ...p.command }));\n\nconst mergeBacklog = (s: Session): StatewireClient.SessionCommand[] => {\n const own = backlog(s);\n if (!s.shared) return own;\n const known = new Set(s.pending.map((p) => p.seq));\n const foreign = s.record.commands.filter(\n (c) => !known.has(c.seq) && c.seq > s.durableSeq,\n );\n return [...foreign, ...own].sort((a, b) => a.seq - b.seq);\n};\n\nconst MAX_PARKED_VERDICTS = 64;\n\n// Storage holds what a reload must resend: a command leaves at its dur, at a\n// server verdict, or at a record reset — never at a local channel death.\nconst syncBacklogInner = (s: Session) => {\n const parked = s.shared ? s.shared.parked.splice(0) : [];\n const parkedSeqs = new Set(parked.map((v) => v.seq));\n const commands = mergeBacklog(s).filter((c) => !parkedSeqs.has(c.seq));\n const verdicts =\n parked.length > 0\n ? [...(s.record.verdicts ?? []), ...parked].slice(-MAX_PARKED_VERDICTS)\n : s.record.verdicts;\n const unchanged =\n verdicts === s.record.verdicts &&\n commands.length === s.record.commands.length &&\n commands.every((c, i) => c.seq === s.record.commands[i]!.seq);\n if (unchanged) return;\n setRecord(s, {\n ...s.record,\n commands,\n ...(verdicts !== undefined && { verdicts }),\n });\n};\n\nconst syncBacklog = (s: Session) => {\n if (!s.shared) return syncBacklogInner(s);\n transactBackground(s, () => syncBacklogInner(s));\n};\n\n// Every record mutation over shared storage is a locked read-modify-write.\nconst transact = (s: Session, fn: () => void): Promise<void> => {\n if (!s.shared || s.deactivated) {\n fn();\n return Promise.resolve();\n }\n const shared = s.shared;\n const run = shared.txq.then(() =>\n s.store.lock!(async () => {\n const stored = s.store.load();\n if (stored !== null && stored.clientId !== s.record.clientId) {\n adoptReset(s, stored);\n } else if (stored !== null) {\n s.record = stored;\n }\n fn();\n const persistence = s.store.flush?.();\n if (persistence) await persistence;\n }),\n );\n const result = run.catch((cause: unknown) => {\n storageFailed(s, cause);\n throw s.storageError;\n });\n shared.txq = result.then(\n () => {},\n () => {},\n );\n return result;\n};\n\nconst transactBackground = (s: Session, fn: () => void, done?: () => void) => {\n void transact(s, fn).then(done, () => {});\n};\n\nconst setIdle = (s: Session, level: boolean) => {\n if (level === s.idle) return;\n s.idle = level;\n s.notify();\n if (level) s.onDone?.();\n};\n\nconst cover = (s: Session, entry: Pending) => {\n if (entry.applied) return;\n entry.applied = true;\n s.lifecycle?.onApplied(entry.inv);\n s.lifecycle?.onCovered?.(entry.inv);\n};\n\nconst NO_FAILED: readonly StatewireClient.FailedCommand[] = [];\n\nexport const failedCommands = (\n s: Session,\n): readonly StatewireClient.FailedCommand[] => s.record.failed ?? NO_FAILED;\n\nconst retainFailedInner = (\n s: Session,\n entry: Pending,\n failure: StatewireClient.SendFailure,\n) => {\n setRecord(s, {\n ...s.record,\n failed: [\n ...(s.record.failed ?? []),\n {\n protocol: entry.command.protocol,\n ...(entry.command.produced !== undefined && {\n produced: entry.command.produced,\n }),\n command: entry.command.method,\n params: entry.command.params,\n ...(entry.command.meta !== undefined && { meta: entry.command.meta }),\n failure,\n ts: entry.inv.ts,\n seq: entry.seq,\n },\n ],\n });\n s.notify();\n};\n\nconst retainFailed = (\n s: Session,\n entry: Pending,\n failure: StatewireClient.SendFailure,\n) => {\n if (!s.shared) {\n retainFailedInner(s, entry, failure);\n return;\n }\n transactBackground(s, () => retainFailedInner(s, entry, failure));\n};\n\nconst settleEntry = (\n s: Session,\n entry: Pending,\n outcome:\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure },\n) => {\n s.pending = s.pending.filter((p) => p !== entry);\n if (outcome.ok) {\n entry.resolve(outcome.payload);\n s.lifecycle?.onSettle(entry.inv, {\n type: \"accepted\",\n payload: outcome.payload,\n });\n } else {\n // A statement the record still carries resends on the next attach; only\n // invocations the record no longer owns become failed history.\n const rides =\n (outcome.failure.cause === \"unmount\" ||\n outcome.failure.cause === \"stream-gone\") &&\n entry.seq > s.durableSeq;\n if (!rides) retainFailed(s, entry, outcome.failure);\n entry.reject(new StatewireSendError(outcome.failure));\n s.lifecycle?.onSettle(entry.inv, {\n type: \"rejected\",\n error: new StatewireSendError(outcome.failure),\n });\n }\n};\n\nconst settleAll = (s: Session, detach: \"unmount\" | \"gone\") => {\n const cause =\n detach === \"unmount\" ? (\"unmount\" as const) : (\"stream-gone\" as const);\n const batch = s.pending;\n const detachFailure = (entry: Pending): StatewireClient.SendFailure => {\n if (!entry.attempted) {\n const predecessorLost = batch.some(\n (p) => p.seq < entry.seq && p.attempted,\n );\n return predecessorLost\n ? { fate: \"aborted\", cause, predecessorLost }\n : { fate: \"aborted\", cause };\n }\n return { fate: \"lost\", cause };\n };\n for (const entry of [...batch]) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, { ok: false, failure: detachFailure(entry) });\n }\n};\n\nconst settleLost = (s: Session, entries: Pending[]) => {\n for (const entry of entries) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"lost\", cause: \"session-lost\" },\n });\n }\n};\n\n// The server-side record's dedup memory is gone: history that may have\n// reached a server settles lost — the new hello's snapshot is the only\n// truth about what survived — and never-attempted statements re-stamp\n// on the adopted lane clocks.\nconst rebaseRecord = (s: Session, adopt: () => void) => {\n const held = [...s.pending];\n const survivors = held.filter((p) => !p.attempted && !p.applied);\n settleLost(\n s,\n held.filter((p) => p.attempted || p.applied),\n );\n s.pending = [];\n s.durableSeq = 0;\n // Failed entries are user-owned history: they ride through every record replacement.\n const failed = s.record.failed;\n adopt();\n if (failed !== undefined && s.record.failed !== failed) {\n setRecord(s, {\n ...s.record,\n failed: [...(s.record.failed ?? []), ...failed],\n });\n }\n for (const old of survivors) {\n s.lifecycle?.onCovered?.(old.inv);\n enqueueInner(s, old.command, old.inv.params, old.resolve, old.reject);\n }\n publish(s);\n wake(s);\n void pump(s);\n};\n\nconst resetRecord = (s: Session, clientId: string) =>\n rebaseRecord(s, () => setRecord(s, { clientId, nextSeq: 1, commands: [] }));\n\n// Another sharer replaced the record's identity: their reset settles our\n// attempted history and our survivors re-stamp on the stored clocks.\nconst adoptReset = (s: Session, stored: StatewireClient.SessionRecord) =>\n rebaseRecord(s, () => {\n s.record = stored;\n });\n\n// The record died with the attach: mint a fresh id for the next one.\nconst ephemeralDetach = (s: Session) => {\n s.ephemeral = false;\n s.sessionKnown = false;\n resetRecord(s, newClientId());\n};\n\nconst rejectedFailure = (cmd: StatewireCmd): StatewireClient.SendFailure => {\n return {\n fate: \"rejected\",\n cause: \"server\",\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n };\n};\n\nconst outcomeOf = (\n cmd: StatewireCmd,\n):\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure } => {\n switch (cmd.type) {\n case \"result\":\n return { ok: true, payload: reviveResponse(cmd).payload };\n case \"rejected\":\n return { ok: false, failure: rejectedFailure(reviveResponse(cmd)) };\n case \"failed\":\n return {\n ok: false,\n failure: {\n fate: \"failed\",\n cause: \"server\",\n ...(cmd.message !== undefined && { message: cmd.message }),\n },\n };\n case \"crashed\":\n return { ok: false, failure: { fate: \"crashed\", cause: \"server\" } };\n case \"expired\":\n return { ok: false, failure: { fate: \"expired\", cause: \"server\" } };\n default:\n return protocolError(`unknown cmd type: ${String(cmd.type)}`);\n }\n};\n\nconst TERMINAL_CMD_TYPES: ReadonlySet<string> = new Set(TERMINAL);\n\nconst parkVerdict = (s: Session, cmd: StatewireCmd) => {\n if (!s.shared || !TERMINAL_CMD_TYPES.has(cmd.type!)) return;\n s.shared.parked.push({\n seq: cmd.seq,\n type: cmd.type as StatewireClient.SessionVerdict[\"type\"],\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n ...(cmd.meta !== undefined && { meta: cmd.meta }),\n });\n};\n\nconst handleCmd = (s: Session, cmd: StatewireCmd) => {\n if (!Number.isSafeInteger(cmd.seq) || cmd.seq <= 0) {\n protocolError(\"cmd.seq must be a positive safe integer\");\n }\n if (cmd.dur === true) {\n s.durableSeq = Math.max(s.durableSeq, cmd.seq);\n for (const entry of s.pending) {\n if (entry.seq <= s.durableSeq) entry.posted = true;\n }\n }\n if (cmd.type === undefined) return;\n const entry = s.pending.find((p) => p.seq === cmd.seq);\n if (cmd.type === \"applied\") {\n if (entry) cover(s, entry);\n return;\n }\n if (!entry) return;\n parkVerdict(s, cmd);\n cover(s, entry);\n settleEntry(s, entry, outcomeOf(cmd));\n};\n\nconst consumeVerdicts = (s: Session) => {\n const verdicts = s.record.verdicts ?? [];\n const consumed = new Set<number>();\n for (const verdict of verdicts) {\n const entry = s.pending.find((p) => p.seq === verdict.seq);\n if (!entry) continue;\n consumed.add(verdict.seq);\n cover(s, entry);\n settleEntry(s, entry, outcomeOf(verdict as StatewireCmd));\n }\n if (consumed.size === 0) return;\n setRecord(s, {\n ...s.record,\n commands: s.record.commands.filter((c) => !consumed.has(c.seq)),\n verdicts: verdicts.filter((v) => !consumed.has(v.seq)),\n });\n publish(s);\n wake(s);\n};\n\nconst handleCmds = (s: Session, cmds: StatewireCmd[]) => {\n for (const cmd of cmds) handleCmd(s, cmd);\n syncBacklog(s);\n wake(s);\n};\n\nconst ingestOps = (s: Session, ops: unknown[]) => {\n const applied = applyDocumentOps(s.documents, ops, s.selection?.protocols);\n s.documents = applied;\n const next =\n s.selection === undefined\n ? applied.documents.get(0)?.value\n : s.options.applicationProtocols === \"*\"\n ? Object.fromEntries(\n [...applied.documents].map(([id, d]) => [\n `${d.protocol}:${d.key === null ? id : JSON.stringify(d.key)}`,\n d.value,\n ]),\n )\n : mainDocument(applied, s.options.protocol ?? DEFAULT_PROTOCOL)?.value;\n if (next !== s.canonical)\n s.changed.push(\n ...(applied.changedPaths.length ? applied.changedPaths : [[]]),\n );\n s.canonical = next;\n};\n\nconst cacheDocuments = (s: Session) => {\n if (s.documentStore && s.selection) {\n for (const document of s.documents.documents.values()) {\n if (!document.protocol || !document.key) continue;\n const key = resolveDocumentKey(\n document.key,\n s.options.keyPrefixes?.[document.protocol],\n );\n const version = s.selection.protocols.find(\n (p) => p.name === document.protocol,\n )?.version;\n if (key !== undefined && version !== undefined)\n s.documentStore.save(\n [s.documentStore.namespace ?? \"\", document.protocol, ...key],\n { version, value: document.value },\n );\n }\n }\n};\n\nconst publishIngested = (s: Session) => {\n publish(s);\n cacheDocuments(s);\n for (const listener of s.documentListeners) listener();\n wake(s);\n};\n\n// The refusal's watermark is exact: every held statement above it was never\n// admitted by the live record, and the first unposted seq being beyond\n// watermark+1 proves the record that admitted the missing prefix is gone —\n// its history settles lost and the cmd clock restarts at the watermark.\nconst sessionLostInner = (s: Session, seqWm: number) => {\n const held = [...s.pending];\n settleLost(s, held);\n s.pending = [];\n s.durableSeq = seqWm;\n setRecord(s, {\n clientId: s.record.clientId,\n nextSeq: seqWm + 1,\n commands: [],\n ...(s.record.failed !== undefined && { failed: s.record.failed }),\n });\n if (\n held.length > 0 &&\n s.onSessionLost?.(held.map((p) => p.inv)) === \"requeue\"\n ) {\n for (const old of held) {\n enqueueInner(\n s,\n old.command,\n old.inv.params,\n () => {},\n () => {},\n );\n }\n }\n publish(s);\n wake(s);\n};\n\nconst handleHello = (\n s: Session,\n { ops, syn }: { ops: unknown[]; syn: StatewireSyn },\n) => {\n if (syn.record !== undefined && syn.record !== \"ephemeral\") {\n protocolError(`unknown record: ${String(syn.record)}`);\n }\n if (syn.ctxSeq !== undefined && syn.ctxSeq !== 0) {\n protocolError(`hello ctxSeq must be 0, got ${syn.ctxSeq}`);\n }\n s.selection =\n syn.version === undefined || syn.protocols === undefined\n ? undefined\n : { version: syn.version, protocols: syn.protocols };\n s.documents = { mode: null, documents: new Map() };\n ingestOps(s, ops);\n s.attach = \"attached\";\n s.attachEpoch += 1;\n s.frameFailures = 0;\n s.resumeAt = 0;\n s.ephemeral = syn.record === \"ephemeral\";\n if (s.ephemeral) s.deactivated = true;\n const [attachCmd, attachCtx] = s.attachLaneSeqs;\n s.attachLaneSeqs = [new Set(), new Set()];\n const reconcile = () => {\n if (s.shared) adoptStored(s);\n // Resending unsettled statements is exactly-once-safe: absorbed replays\n // re-emit their stored verdicts (applied while still in flight).\n s.durableSeq = syn.seq ?? 0;\n for (const entry of s.pending) {\n entry.posted = attachCmd.has(entry.seq);\n }\n for (const c of s.ctxPending) c.posted = attachCtx.has(c.seq);\n syncBacklogInner(s);\n s.sessionKnown = true;\n };\n if (!s.shared || s.deactivated) {\n reconcile();\n publishIngested(s);\n void pump(s);\n return;\n }\n transactBackground(s, reconcile, () => {\n publishIngested(s);\n void pump(s);\n });\n};\n\nconst handleOps = (\n s: Session,\n { ops, cmds }: { ops: unknown[]; cmds: StatewireCmd[] },\n) => {\n ingestOps(s, ops);\n for (const cmd of cmds) handleCmd(s, cmd);\n syncBacklog(s);\n publishIngested(s);\n};\n\n// A retry-less {syn} refusal is the one session-loss verdict: a cmd gap\n// against its exact watermark settles the held history lost; a pushback\n// (retry present) or a gapless refusal only reconciles the resend queues.\nconst handleRefusal = (s: Session, syn: StatewireSyn) => {\n const { seq, ctxSeq } = syn;\n if (typeof seq === \"number\") {\n const watermark = Math.max(seq, s.durableSeq);\n for (const entry of s.pending) entry.posted = entry.seq <= watermark;\n }\n if (typeof ctxSeq === \"number\") {\n s.ctxPending = s.ctxPending.filter((c) => c.seq > ctxSeq);\n for (const c of s.ctxPending) c.posted = false;\n const firstCtx = s.ctxPending.find((c) => !c.posted);\n if (firstCtx !== undefined && firstCtx.seq > ctxSeq + 1) {\n protocolError(\n `ctx gap on a live attach: seq ${firstCtx.seq} after watermark ${ctxSeq}`,\n );\n }\n }\n if (typeof syn.retry === \"number\") {\n s.resumeAt = Date.now() + syn.retry;\n wake(s);\n void pump(s);\n return;\n }\n const firstCmd = s.pending.find((p) => !p.posted);\n const cmdGap =\n typeof seq === \"number\" &&\n firstCmd !== undefined &&\n firstCmd.seq > Math.max(seq, s.durableSeq) + 1;\n if (cmdGap) {\n transactBackground(\n s,\n () => sessionLostInner(s, seq),\n () => {\n wake(s);\n void pump(s);\n },\n );\n return;\n }\n wake(s);\n void pump(s);\n};\n\nconst handleDetach = (s: Session) => {\n if (s.attach === \"attached\") s.attach = \"detached\";\n if (s.ephemeral) ephemeralDetach(s);\n wake(s);\n};\n\nconst handleFinish = (s: Session, { reason }: { reason: string }) => {\n if (reason === \"reconnect\" || reason === \"error\") return;\n s.attach = \"finished\";\n settleAll(s, \"gone\");\n publish(s);\n wake(s);\n};\n\nconst isFinished = (s: Session) => s.attach === \"finished\";\n\ntype Lanes = {\n frame: StatewireFrame;\n cmdEntries: Pending[];\n ctxEntries: CtxPending[];\n};\n\n// A lane must be strictly consecutive within a frame: the first unposted run\n// per lane rides now, later runs ride follow-up frames.\nconst buildLanes = (\n s: Session,\n cmdGate: \"persisted\" | \"all\" | \"none\" = \"all\",\n): Lanes | null => {\n const ctxEntries: CtxPending[] = [];\n for (const entry of s.ctxPending) {\n if (entry.posted) continue;\n if (ctxEntries.length >= MAX_COMMANDS_PER_FRAME) break;\n if (ctxEntries.length > 0 && entry.seq !== ctxEntries.at(-1)!.seq + 1)\n break;\n ctxEntries.push(entry);\n }\n const cmdEntries: Pending[] = [];\n for (const entry of s.pending) {\n if (cmdGate === \"none\") break;\n if (entry.posted) continue;\n if (\n cmdGate === \"persisted\" &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= s.persistedRecord.nextSeq)\n )\n break;\n if (cmdEntries.length >= MAX_COMMANDS_PER_FRAME) break;\n if (cmdEntries.length > 0 && entry.seq !== cmdEntries.at(-1)!.seq + 1)\n break;\n cmdEntries.push(entry);\n }\n if (ctxEntries.length === 0 && cmdEntries.length === 0) return null;\n return {\n frame: {\n ...(ctxEntries.length > 0 && {\n ctx: ctxEntries.map((c) => ({ ops: c.ops, seq: c.seq })),\n }),\n ...(cmdEntries.length > 0 && {\n cmd: cmdEntries.map((p) => {\n const { produced: _produced, ...command } = p.command;\n return { ...command, seq: p.seq };\n }),\n }),\n },\n cmdEntries,\n ctxEntries,\n };\n};\n\n// Context is attach scoped: every attach starts at ctx seq 0 with an empty\n// table, so the full context restates at seq 1 on the attach frame.\nconst resetContextLane = (s: Session) => {\n const ops = contextSnapshot(s.contextDocuments);\n s.ctxPending = ops.length === 0 ? [] : [{ seq: 1, ops, posted: false }];\n s.ctxNextSeq = s.ctxPending.length + 1;\n};\n\nconst takeAttachLanes = (s: Session): StatewireFrame | null => {\n s.attachLaneSeqs = [new Set(), new Set()];\n resetContextLane(s);\n const wanted = s.lanesOnAttach;\n s.lanesOnAttach = false;\n const lanes = buildLanes(s, wanted && s.sessionKnown ? \"persisted\" : \"none\");\n if (!lanes) return null;\n s.attachLaneSeqs = [\n new Set(lanes.cmdEntries.map((p) => p.seq)),\n new Set(lanes.ctxEntries.map((c) => c.seq)),\n ];\n for (const entry of lanes.cmdEntries) entry.attempted = true;\n return lanes.frame;\n};\n\nconst persistBeforeSend = (s: Session): void | Promise<void> => {\n if (s.storageError !== undefined) throw s.storageError;\n if (!s.hydrated) return s.ready!.then(() => persistBeforeSend(s));\n const record = s.record;\n try {\n const pending = s.store.flush?.();\n if (pending)\n return pending.then(\n () => {\n s.persistedRecord = record;\n },\n (cause: unknown) => {\n throw wrapStorageError(cause);\n },\n );\n s.persistedRecord = record;\n } catch (cause) {\n throw wrapStorageError(cause);\n }\n};\n\nconst pump = async (s: Session) => {\n if (s.pumping) return;\n s.pumping = true;\n try {\n while (s.running && !isFinished(s)) {\n if (!s.hydrated) await s.ready;\n const transport = s.transport;\n if (buildLanes(s) === null) return;\n if (s.attach !== \"attached\" || !transport) {\n if (\n (transport?.connection.status === \"standby\" &&\n transport.connection.reason === \"idle\") ||\n (transport?.parked && s.pending.length > 0)\n ) {\n transport.connection.reconnect();\n }\n await waitForWake(s);\n continue;\n }\n const resumeDelay = s.resumeAt - Date.now();\n if (resumeDelay > 0) {\n await sleepUntilWake(s, resumeDelay);\n continue;\n }\n const lanes = buildLanes(s);\n if (!lanes) continue;\n const epoch = s.attachEpoch;\n const persistence = persistBeforeSend(s);\n if (persistence) await persistence;\n if (!s.running || isFinished(s)) return;\n if (epoch !== s.attachEpoch || s.attach !== \"attached\") continue;\n for (const entry of lanes.cmdEntries) entry.attempted = true;\n let result;\n try {\n // Shared storage: the lock across the send keeps per-lane arrival\n // ordered across sharers during attach handover.\n const send = () => transport.send(lanes.frame);\n result = await (s.shared && !s.deactivated\n ? s.store.lock!(send)\n : send());\n } catch {\n if (!s.running || isFinished(s)) return;\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n continue;\n }\n if (!s.running) return;\n s.frameFailures = 0;\n if (result.type === \"ok\") {\n if (epoch === s.attachEpoch) {\n for (const entry of lanes.cmdEntries) {\n if (s.pending.includes(entry)) {\n entry.posted = true;\n s.lifecycle?.onPosted?.(entry.inv);\n }\n }\n for (const entry of lanes.ctxEntries) entry.posted = true;\n }\n } else if (result.type === \"refusal\") {\n if (epoch === s.attachEpoch) handleRefusal(s, result.syn);\n } else if (result.type === \"stale-lease\") {\n // A POST outlived its attach: reattach first, the hello arbitrates.\n if (epoch === s.attachEpoch) {\n transport.connection.reconnect();\n await waitForWake(s);\n }\n } else if (result.type === \"no-lease\") {\n // No out-of-band write channel: the frame rides a fresh attach.\n if (epoch === s.attachEpoch) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n while (s.running && !isFinished(s) && epoch === s.attachEpoch) {\n await waitForWake(s);\n }\n }\n }\n }\n } catch (error) {\n storageFailed(s, error);\n } finally {\n s.pumping = false;\n }\n};\n\nconst start = (s: Session) => {\n s.running = true;\n if (!s.hydrated) {\n void s.ready!.then(\n () => {\n if (s.running) start(s);\n },\n () => {},\n );\n return;\n }\n if (s.shared) {\n s.shared.unsubscribe = s.store.subscribe!(() => {\n transactBackground(s, () => consumeVerdicts(s));\n });\n s.running = true;\n transactBackground(\n s,\n () => {\n if (s.store.load() === null) s.store.save(s.record);\n s.recordPersisted = true;\n adoptStored(s);\n consumeVerdicts(s);\n },\n () => void pump(s),\n );\n return;\n }\n if (!s.recordPersisted) {\n s.recordPersisted = true;\n s.store.save(s.record);\n }\n adoptStored(s);\n s.running = true;\n void pump(s);\n};\n\nconst stop = (s: Session) => {\n s.running = false;\n if (s.shared) {\n s.shared.unsubscribe?.();\n s.shared.unsubscribe = null;\n }\n wake(s);\n settleAll(s, \"unmount\");\n};\n\nconst setTransport = (s: Session, transport: RemoteLink) => {\n if (s.transport === transport) return;\n s.transport = transport;\n wake(s);\n};\n\nconst enqueueInner = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n) => {\n const seq = Math.max(s.record.nextSeq, s.durableSeq + 1);\n const entry: Pending = {\n seq,\n command,\n inv: {\n protocol: command.protocol,\n method: command.method,\n params,\n ts: Date.now(),\n seq,\n clientId: s.record.clientId,\n },\n attempted: false,\n posted: false,\n applied: false,\n resolve,\n reject,\n };\n s.pending.push(entry);\n setRecord(s, { ...s.record, nextSeq: seq + 1, commands: mergeBacklog(s) });\n s.lifecycle?.onStart(entry.inv);\n};\n\nconst enqueue = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n) => {\n if (!s.shared) {\n enqueueInner(s, command, params, resolve, reject);\n wake(s);\n void pump(s);\n return;\n }\n void transact(s, () => {\n if (!s.running) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"unmount\" }));\n return;\n }\n if (isFinished(s)) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"stream-gone\" }));\n return;\n }\n enqueueInner(s, command, params, resolve, reject);\n }).then(() => {\n wake(s);\n void pump(s);\n }, reject);\n};\n\n// A stored command may have reached a server: attempted settles it lost,\n// never aborted, when a channel death ends the session.\nconst adoptStored = (s: Session) => {\n const known = new Set(s.pending.map((p) => p.seq));\n const stored = s.record.commands.filter((c) => !known.has(c.seq));\n if (stored.length === 0) return;\n for (const { seq, ...command } of stored) {\n const offers = protocolOffers(s.options);\n if (\n offers !== \"*\" &&\n !offers.some((offer) => offer.name === command.protocol)\n )\n continue;\n const params =\n command.meta === undefined\n ? command.params\n : (reviveValue([...command.params], command.meta) as unknown[]);\n const entry: Pending = {\n seq,\n command,\n inv: {\n protocol: command.protocol,\n method: command.method,\n params,\n ts: Date.now(),\n seq,\n clientId: s.record.clientId,\n },\n attempted: true,\n posted: false,\n applied: false,\n resolve: () => {},\n reject: () => {},\n };\n s.pending.push(entry);\n s.lifecycle?.onStart(entry.inv);\n }\n s.pending.sort((a, b) => a.seq - b.seq);\n};\n\nconst sendCommand = (\n s: Session,\n method: string,\n params: readonly unknown[],\n protocol = s.options.protocol ?? DEFAULT_PROTOCOL,\n): Promise<unknown> => {\n if (!s.hydrated) {\n const result = s.ready!.then(() =>\n sendCommand(s, method, params, protocol),\n );\n result.catch(() => {});\n return result;\n }\n if (s.storageError !== undefined) {\n const result = Promise.reject(s.storageError);\n result.catch(() => {});\n return result;\n }\n if (!s.running) {\n return rejectedSend({ fate: \"aborted\", cause: \"unmount\" });\n }\n if (isFinished(s)) {\n return rejectedSend({ fate: \"aborted\", cause: \"stream-gone\" });\n }\n const result = new Promise<unknown>((resolve, reject) => {\n const { params: encoded, meta } = encodeParams(params);\n enqueue(\n s,\n {\n protocol,\n produced: {\n wire: s.options.wireVersion ?? { version: WIRE_VERSION },\n protocols:\n protocolOffers(s.options) === \"*\" && s.selection\n ? s.selection.protocols\n : protocolOffers(s.options),\n },\n method,\n params: encoded,\n ...(meta !== undefined && { meta }),\n },\n params,\n resolve,\n reject,\n );\n });\n result.catch(() => {});\n return result;\n};\n\nconst findFailed = (\n s: Session,\n entry: StatewireClient.FailedCommand,\n): StatewireClient.FailedCommand | undefined =>\n (s.record.failed ?? []).find(\n (f) =>\n f.seq === entry.seq && f.ts === entry.ts && f.command === entry.command,\n );\n\nconst unknownFailed = (entry: StatewireClient.FailedCommand) =>\n new Error(`statewire: unknown failed command \"${entry.command}\"`);\n\nconst takeFailed = (\n s: Session,\n entry: StatewireClient.FailedCommand,\n): StatewireClient.FailedCommand => {\n const failed = s.record.failed ?? [];\n const found = findFailed(s, entry);\n if (found === undefined) throw unknownFailed(entry);\n setRecord(s, { ...s.record, failed: failed.filter((f) => f !== found) });\n s.notify();\n return found;\n};\n\nexport const discardFailed = (\n s: Session,\n entry: StatewireClient.FailedCommand,\n): void => {\n if (!s.shared) {\n takeFailed(s, entry);\n return;\n }\n if (findFailed(s, entry) === undefined) throw unknownFailed(entry);\n transactBackground(s, () => {\n if (findFailed(s, entry) !== undefined) takeFailed(s, entry);\n });\n};\n\nexport const retryFailed = (\n s: Session,\n entry: StatewireClient.FailedCommand,\n): Promise<unknown> => {\n if (!s.running) {\n return rejectedSend({ fate: \"aborted\", cause: \"unmount\" });\n }\n if (isFinished(s)) {\n return rejectedSend({ fate: \"aborted\", cause: \"stream-gone\" });\n }\n const found = findFailed(s, entry);\n if (found === undefined) throw unknownFailed(entry);\n const params =\n found.meta === undefined\n ? found.params\n : (reviveValue([...found.params], found.meta) as unknown[]);\n const result = new Promise<unknown>((resolve, reject) => {\n const retry = () => {\n if (!s.running) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"unmount\" }));\n return;\n }\n if (isFinished(s)) {\n reject(\n new StatewireSendError({ fate: \"aborted\", cause: \"stream-gone\" }),\n );\n return;\n }\n const current = findFailed(s, entry);\n if (current === undefined) {\n reject(unknownFailed(entry));\n return;\n }\n takeFailed(s, current);\n enqueueInner(\n s,\n {\n protocol: current.protocol,\n ...(current.produced !== undefined && { produced: current.produced }),\n method: current.command,\n params: [...current.params],\n ...(current.meta !== undefined && { meta: current.meta }),\n },\n params,\n resolve,\n reject,\n );\n };\n if (!s.shared) {\n retry();\n wake(s);\n void pump(s);\n return;\n }\n void transact(s, retry).then(() => {\n wake(s);\n void pump(s);\n }, reject);\n });\n result.catch(() => {});\n return result;\n};\n\nconst contextSnapshot = (documents: StatewireDocuments.State) =>\n [...documents.documents].map(([doc, d]) => {\n const encoded = encodeDocument(d.value);\n return {\n op: \"mount\",\n ...(doc === 0 ? {} : { doc }),\n protocol: d.protocol,\n ...(d.main ? { main: true } : {}),\n ...(d.key === null ? {} : { key: d.key }),\n value: encoded.value,\n ...(encoded.meta === undefined ? {} : { meta: encoded.meta }),\n };\n });\n\nconst changeContext = (\n s: Session,\n build: (documents: StatewireDocuments.State) => readonly unknown[],\n): void => {\n if (!s.running || isFinished(s)) return;\n const operations = build(s.contextDocuments);\n if (!operations.length)\n throw new Error(\"statewire: context operations must not be empty\");\n const offers = protocolOffers(s.options);\n const protocols =\n s.selection?.protocols ?? (offers === \"*\" ? undefined : offers);\n s.contextDocuments = applyDocumentOps(\n s.contextDocuments,\n operations,\n protocols,\n true,\n );\n s.ctxPending = [\n ...s.ctxPending,\n {\n seq: s.ctxNextSeq++,\n ops: operations.map((op) => {\n const value = op as Record<string, unknown>;\n if (value[\"doc\"] !== 0) return value;\n const { doc: _doc, ...rest } = value;\n return rest;\n }),\n posted: false,\n },\n ];\n wake(s);\n void pump(s);\n};\n\nexport const updateContext = (s: Session, operations: readonly unknown[]) =>\n changeContext(s, () => operations);\n\nconst setContext = (\n s: Session,\n value: Record<string, unknown>,\n protocol = s.options.protocol ?? DEFAULT_PROTOCOL,\n): void => {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n throw new Error(\"statewire: context must be a plain object\");\n const encoded = encodeDocument(value);\n changeContext(s, (documents) => {\n const found = [...documents.documents].find(\n ([, d]) => d.protocol === protocol && d.main,\n );\n const doc = found?.[0] ?? Math.max(-1, ...documents.documents.keys()) + 1;\n return [\n {\n ...(found === undefined\n ? { op: \"mount\", protocol, main: true }\n : { op: \"replace\", path: [] }),\n ...(doc === 0 ? {} : { doc }),\n value: encoded.value,\n ...(encoded.meta === undefined ? {} : { meta: encoded.meta }),\n },\n ];\n });\n};\n\nexport const documentSource = (s: Session): StatewireDocuments.Source => ({\n get: (protocol, key, prefix = s.options.keyPrefixes?.[protocol]) => {\n const mounted = findDocument(s.documents, protocol, key, prefix);\n if (mounted !== undefined) return mounted.value;\n if (!s.documentStore || key === undefined) return undefined;\n const absolute = resolveDocumentKey(key, prefix);\n if (absolute === undefined) return undefined;\n const cached = s.documentStore.load([\n s.documentStore.namespace ?? \"\",\n protocol,\n ...absolute,\n ]);\n if (cached === undefined) return undefined;\n const offers = protocolOffers(s.options);\n const offer =\n offers === \"*\"\n ? s.selection?.protocols.find((p) => p.name === protocol)\n : offers.find((p) => p.name === protocol);\n return offer !== undefined && inRange(cached.version, offer)\n ? cached.value\n : undefined;\n },\n list: () => s.documents.documents,\n subscribe: (listener) => {\n s.documentListeners.add(listener);\n return () => {\n s.documentListeners.delete(listener);\n };\n },\n});\n\nexport const invokeProtocol = (\n s: Session,\n protocol: string,\n method: string,\n params: readonly unknown[],\n) => sendCommand(s, method, params, protocol);\n\nconst storedCommandCompatible = (\n command: StatewireClient.SessionCommand,\n current: NonNullable<StatewireClient.SessionCommand[\"produced\"]>,\n) => {\n if (\n !command.produced ||\n !command.protocol ||\n !inRange(command.produced.wire.version, current.wire)\n )\n return false;\n const previous = command.produced.protocols;\n if (current.protocols === \"*\") return true;\n if (previous === \"*\") return false;\n const produced = previous.find((p) => p.name === command.protocol);\n const offer = current.protocols.find((p) => p.name === command.protocol);\n return (\n produced !== undefined &&\n offer !== undefined &&\n inRange(produced.version, offer)\n );\n};\n\nconst loadSessionRecord = (\n store: StatewireClient.SessionStorage,\n options: StatewireSessionOptions,\n) => {\n let stored = store.load();\n if (stored !== null && !Array.isArray(stored.commands))\n throw new Error(\n \"statewire: session storage loaded a record without a commands array\",\n );\n const current = {\n wire: options.wireVersion ?? { version: WIRE_VERSION },\n protocols: protocolOffers(options),\n };\n if (\n stored !== null &&\n !stored.commands.every((command) =>\n storedCommandCompatible(command, current),\n )\n ) {\n if (!store.migrate)\n throw new Error(\"statewire: stored commands require a storage migration\");\n stored = store.migrate(stored, current);\n if (\n stored !== null &&\n !stored.commands.every((command) =>\n storedCommandCompatible(command, current),\n )\n )\n throw new Error(\"statewire: migrated commands are incompatible\");\n if (stored !== null) store.save(stored);\n }\n if (stored !== null && !Array.isArray(stored.commands)) {\n throw new Error(\n \"statewire: session storage loaded a record without a commands array\",\n );\n }\n const record = stored ?? {\n clientId: newClientId(),\n nextSeq: 1,\n commands: [],\n };\n if (stored === null) store.save(record);\n return record;\n};\n\nexport const useStatewireSession = (\n options: StatewireSessionOptions,\n): Session => {\n const [defaultStore] = useState(createMemorySessionStore);\n const mounted = useContext(SessionStorageContext);\n const documentStore = useContext(DocumentStorageContext);\n if (options.sessionStore !== undefined && mounted !== undefined) {\n throw new Error(\n \"statewire: session storage is set twice — drop the transport's sessionStore or the client's storage.session\",\n );\n }\n const store = options.sessionStore ?? mounted ?? defaultStore;\n if ((store.lock === undefined) !== (store.subscribe === undefined)) {\n throw new Error(\n \"statewire: session storage must provide lock and subscribe together\",\n );\n }\n const [s] = useState((): Session => {\n const record =\n store.ready === undefined\n ? loadSessionRecord(store, options)\n : { clientId: newClientId(), nextSeq: 1, commands: [] };\n const session: Session = {\n options,\n selection: undefined,\n contextDocuments: { mode: \"mounted\", documents: new Map() },\n record,\n ctx: {\n beforeAttach: () => persistBeforeSend(session),\n get clientId() {\n return session.record.clientId;\n },\n takeAttachLanes: () => takeAttachLanes(session),\n onHello: (args) => handleHello(session, args),\n onOps: (args) => handleOps(session, args),\n onCmds: (cmds) => handleCmds(session, cmds),\n onRefusal: (syn) => handleRefusal(session, syn),\n onIdle: (level) => setIdle(session, level),\n onDetach: () => handleDetach(session),\n onFinish: (args) => handleFinish(session, args),\n },\n recordPersisted: store.ready === undefined,\n hydrated: store.ready === undefined,\n ready: undefined,\n storageError: undefined,\n persistedRecord: store.ready === undefined ? record : null,\n store,\n documentStore,\n shared:\n store.lock !== undefined\n ? { txq: Promise.resolve(), parked: [], unsubscribe: null }\n : false,\n ephemeral: false,\n deactivated: false,\n sessionKnown: false,\n durableSeq: 0,\n resumeAt: 0,\n idle: false,\n onSessionLost: undefined,\n onDone: undefined,\n ctxNextSeq: 1,\n ctxPending: [],\n lanesOnAttach: false,\n attachLaneSeqs: [new Set(), new Set()],\n frameFailures: 0,\n pending: [],\n canonical: undefined,\n documentListeners: new Set(),\n documents: { mode: null, documents: new Map() },\n lastPublished: undefined,\n changed: [],\n source: {\n snapshot: () => session.canonical,\n takeChanged: () => {\n const changed = session.changed;\n session.changed = [];\n return changed;\n },\n setOnChange: (listener) => {\n session.notify = listener ?? (() => {});\n },\n },\n attach: \"detached\",\n attachEpoch: 0,\n running: false,\n pumping: false,\n transport: null,\n waiters: [],\n lifecycle: null,\n notify: () => {},\n commands: createMethodProxy((method, params) =>\n sendCommand(session, method, params),\n ),\n };\n if (store.ready !== undefined) {\n session.ready = store.ready.then(() => {\n session.record = loadSessionRecord(store, session.options);\n session.recordPersisted = true;\n session.hydrated = true;\n if (session.running) session.notify();\n });\n session.ready = session.ready.catch((cause: unknown) => {\n const error = wrapStorageError(cause);\n session.storageError = error;\n session.transport?.storageFailed(error);\n throw error;\n });\n session.ready.catch(() => {});\n }\n bindCommandsHost(session.commands, {\n setListener: (listener) => {\n session.lifecycle = listener;\n },\n });\n return session;\n });\n if ((store.lock !== undefined) !== (s.shared !== false)) {\n throw new Error(\n \"statewire: session storage changed sharedness across renders — lock/subscribe must be present from the first render or never\",\n );\n }\n s.options = options;\n s.store = store;\n s.documentStore = documentStore;\n s.onSessionLost = options.onSessionLost;\n s.onDone = options.onDone;\n const keyPrefixes = JSON.stringify(options.keyPrefixes);\n useEffect(() => {\n cacheDocuments(s);\n }, [s, documentStore, keyPrefixes]);\n useEffect(\n () =>\n documentStore?.subscribe?.(() => {\n for (const listener of s.documentListeners) listener();\n }),\n [s, documentStore],\n );\n useEffect(() => {\n start(s);\n return () => stop(s);\n }, [s]);\n return s;\n};\n\nexport { setContext, setTransport };\n"],"mappings":"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"}
|
package/dist/host/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","names":[],"sources":["../../src/host/http.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"http.d.ts","names":[],"sources":["../../src/host/http.ts"],"mappings":";;;cAiUa,SACX,GAAG,iBACH,SAAS,YACR,QAAQ;cAkCE,SACX,GAAG,iBACH,SAAS,YACR,QAAQ"}
|
package/dist/host/http.js
CHANGED
|
@@ -132,7 +132,7 @@ const streamResponse = (attachment, lease) => {
|
|
|
132
132
|
};
|
|
133
133
|
const admitAttachFrame = (h, registration, frame) => {
|
|
134
134
|
if (frame.ctx.length === 0 && frame.cmd.length === 0) return;
|
|
135
|
-
const admission = admitFrame(h, registration.
|
|
135
|
+
const admission = admitFrame(h, registration.conn, frame);
|
|
136
136
|
if (admission.type === "refused") sendTo(h, registration.conn, JSON.stringify(admission.syn));
|
|
137
137
|
};
|
|
138
138
|
const getStream = async (h, request) => {
|
|
@@ -222,7 +222,6 @@ const frames = async (h, request) => {
|
|
|
222
222
|
const leased = lease === null ? void 0 : [...h.conns].find((conn) => conn.open && conn.lease === lease);
|
|
223
223
|
if (h.disposed || h.finished !== null || leased === void 0) return Response.json({ error: "stale-lease" }, { status: 423 });
|
|
224
224
|
const clientId = leased.clientId;
|
|
225
|
-
const rec = h.clients.get(clientId);
|
|
226
225
|
const raw = await readFrameBody(request);
|
|
227
226
|
if (raw === null) return Response.json({ error: "frame body too large" }, { status: 413 });
|
|
228
227
|
let frame;
|
|
@@ -235,7 +234,7 @@ const frames = async (h, request) => {
|
|
|
235
234
|
if (!leased.open || h.disposed || h.finished !== null) return Response.json({ error: "stale-lease" }, { status: 423 });
|
|
236
235
|
let admission;
|
|
237
236
|
try {
|
|
238
|
-
admission = admitFrame(h,
|
|
237
|
+
admission = admitFrame(h, leased, frame);
|
|
239
238
|
} catch (error) {
|
|
240
239
|
if (!(error instanceof Error) || error.name !== "StatewireViolation") throw error;
|
|
241
240
|
return violationResponse(h, clientId, error.message);
|
package/dist/host/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","names":["StatewireHost","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","SUBSCRIBER_LIMIT_MESSAGE","admitFrame","atSubscriberLimit","authEquals","closeConn","flush","parseFrame","parseFrameValue","register","sendTo","ParsedFrame","Registration","SocketHostState","MAX_FRAME_BODY_BYTES","negotiateProtocols","StatewireProtocol","CLIENT_ID_HEADER","LEASE_HEADER","encoder","TextEncoder","laggardFin","encode","readFrameBody","request","Request","Promise","declared","headers","get","Number","body","cancel","catch","reader","getReader","chunks","Uint8Array","size","done","value","read","length","push","offset","chunk","set","TextDecoder","decode","invalidClientIdReason","clientId","test","clientIdResponse","response","Response","json","detail","status","reason","headersOf","Record","Object","fromEntries","authorize","h","auth","refused","error","subscriberLimitResponse","principalMismatchResponse","rec","clients","undefined","principal","mintLease","bytes","crypto","getRandomValues","btoa","String","fromCharCode","replaceAll","replace","SseAttachment","ReadableStream","registration","activateBackpressure","attachSse","selection","Selection","controller","ReadableStreamDefaultController","connection","open","backpressureActive","start","next","close","highWaterMark","streamQueueSize","socket","send","data","desiredSize","enqueue","frame","streamResponse","attachment","lease","admitAttachFrame","ctx","cmd","admission","conn","type","JSON","stringify","syn","getStream","authorized","client","mismatch","wireVersion","protocol","fin","postStream","raw","trim","parse","Error","name","message","stream","method","Allow","finClient","Fin","conns","violationResponse","frames","leased","find","disposed","finished","ReturnType","retry","Math","ceil"],"sources":["../../src/host/http.ts"],"sourcesContent":["import type { StatewireHost } from \"../host\";\nimport {\n CLIENT_ID_RE,\n PRINCIPAL_MISMATCH_MESSAGE,\n SUBSCRIBER_LIMIT_MESSAGE,\n admitFrame,\n atSubscriberLimit,\n authEquals,\n closeConn,\n flush,\n parseFrame,\n parseFrameValue,\n register,\n sendTo,\n} from \"./socket\";\nimport type { ParsedFrame, Registration, SocketHostState } from \"./socket\";\nimport { MAX_FRAME_BODY_BYTES } from \"../wire/limits\";\nimport { negotiateProtocols } from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\n\nexport { MAX_FRAME_BODY_BYTES } from \"../wire/limits\";\n\nconst CLIENT_ID_HEADER = \"Statewire-Client-Id\";\nconst LEASE_HEADER = \"Statewire-Lease\";\nconst encoder = new TextEncoder();\nconst laggardFin = encoder.encode(\n 'data: {\"fin\":{\"reason\":\"reconnect\",\"code\":\"client-fell-behind\"}}\\n\\n',\n);\nconst readFrameBody = async (request: Request): Promise<string | null> => {\n const declared = request.headers.get(\"content-length\");\n if (declared !== null && Number(declared) > MAX_FRAME_BODY_BYTES) {\n await request.body?.cancel(\"frame body too large\").catch(() => {});\n return null;\n }\n if (request.body === null) return \"\";\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.length;\n if (size > MAX_FRAME_BODY_BYTES) {\n await reader.cancel(\"frame body too large\").catch(() => {});\n return null;\n }\n chunks.push(value);\n }\n const body = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.length;\n }\n return new TextDecoder().decode(body);\n};\n\nconst invalidClientIdReason = (clientId: string): string | null => {\n if (clientId === \"\") return \"id must be non-empty\";\n if (clientId.length > 256) return \"id must be at most 256 characters\";\n if (!CLIENT_ID_RE.test(clientId)) {\n return \"id must contain only [A-Za-z0-9._~-]\";\n }\n return null;\n};\n\nconst clientIdResponse = (\n request: Request,\n): { clientId: string } | { response: Response } => {\n const clientId = request.headers.get(CLIENT_ID_HEADER);\n if (clientId === null) {\n return {\n response: Response.json(\n { detail: `missing ${CLIENT_ID_HEADER} header` },\n { status: 400 },\n ),\n };\n }\n const reason = invalidClientIdReason(clientId);\n if (reason !== null) {\n return {\n response: Response.json(\n { detail: `invalid ${CLIENT_ID_HEADER}: ${reason}` },\n { status: 400 },\n ),\n };\n }\n return { clientId };\n};\n\nconst headersOf = (request: Request): Record<string, string> =>\n Object.fromEntries(request.headers);\n\nconst authorize = async (\n h: SocketHostState,\n headers: Record<string, string>,\n): Promise<{ auth: unknown } | { refused: Response }> => {\n try {\n return { auth: await h.authorize?.({ headers }) };\n } catch (error) {\n if (error instanceof Response) return { refused: error };\n throw error;\n }\n};\n\nconst subscriberLimitResponse = (): Response =>\n Response.json({ detail: SUBSCRIBER_LIMIT_MESSAGE }, { status: 503 });\n\n// No awaits between this check and register: the binding cannot race.\nconst principalMismatchResponse = (\n h: SocketHostState,\n clientId: string,\n auth: unknown,\n): Response | null => {\n const rec = h.clients.get(clientId);\n if (rec !== undefined && !authEquals(rec.principal, auth)) {\n return Response.json(\n { detail: PRINCIPAL_MISMATCH_MESSAGE },\n { status: 403 },\n );\n }\n return null;\n};\n\nconst mintLease = (): string => {\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n return btoa(String.fromCharCode(...bytes))\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n};\n\ntype SseAttachment = {\n body: ReadableStream<Uint8Array>;\n registration: Registration | null;\n activateBackpressure: () => void;\n};\n\nconst attachSse = (\n h: SocketHostState,\n clientId: string,\n auth: unknown,\n selection: StatewireProtocol.Selection,\n): SseAttachment => {\n let controller: ReadableStreamDefaultController<Uint8Array>;\n let connection: Registration[\"connection\"] | null = null;\n let open = true;\n let backpressureActive = false;\n const body = new ReadableStream(\n {\n start: (next) => {\n controller = next;\n },\n cancel: () => {\n open = false;\n connection?.close();\n },\n },\n { highWaterMark: h.streamQueueSize },\n );\n const socket = {\n send: (data: string) => {\n if (!open) return;\n if (\n backpressureActive &&\n controller.desiredSize !== null &&\n controller.desiredSize <= 0\n ) {\n open = false;\n try {\n controller.enqueue(laggardFin);\n controller.close();\n } catch {\n /* stream already gone */\n }\n connection?.close();\n return;\n }\n const frame = data === \"{}\" ? \": ping\\n\\n\" : `data: ${data}\\n\\n`;\n try {\n controller.enqueue(encoder.encode(frame));\n } catch {\n open = false;\n connection?.close();\n }\n },\n close: () => {\n if (!open) return;\n open = false;\n try {\n controller.close();\n } catch {\n return;\n }\n },\n };\n const registration = register(h, clientId, socket, false, auth, selection);\n connection = registration?.connection ?? null;\n if (!open) connection?.close();\n return {\n body,\n registration,\n activateBackpressure: () => {\n backpressureActive = true;\n },\n };\n};\n\nconst streamResponse = (\n attachment: SseAttachment,\n lease: string | null,\n): Response => {\n attachment.activateBackpressure();\n return new Response(attachment.body, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n ...(lease !== null && { [LEASE_HEADER]: lease }),\n },\n });\n};\n\nconst admitAttachFrame = (\n h: SocketHostState,\n registration: Registration,\n frame: ParsedFrame,\n) => {\n if (frame.ctx.length === 0 && frame.cmd.length === 0) return;\n const admission = admitFrame(\n h,\n registration.rec,\n frame,\n registration.conn.auth,\n registration.conn.selection,\n );\n if (admission.type === \"refused\") {\n sendTo(h, registration.conn, JSON.stringify(admission.syn));\n }\n};\n\nconst getStream = async (\n h: SocketHostState,\n request: Request,\n): Promise<Response> => {\n const authorized = await authorize(h, headersOf(request));\n if (\"refused\" in authorized) return authorized.refused;\n const client = clientIdResponse(request);\n if (\"response\" in client) return client.response;\n const mismatch = principalMismatchResponse(\n h,\n client.clientId,\n authorized.auth,\n );\n if (mismatch !== null) return mismatch;\n if (atSubscriberLimit(h)) return subscriberLimitResponse();\n const selection = negotiateProtocols(request.headers, h.wireVersion, [\n h.protocol,\n ]);\n if (\"fin\" in selection)\n return Response.json(selection, { status: selection.fin.status });\n const attachment = attachSse(h, client.clientId, authorized.auth, selection);\n const lease = attachment.registration === null ? null : mintLease();\n if (attachment.registration !== null)\n attachment.registration.conn.lease = lease;\n return streamResponse(attachment, lease);\n};\n\nconst postStream = async (\n h: SocketHostState,\n request: Request,\n): Promise<Response> => {\n const client = clientIdResponse(request);\n if (\"response\" in client) return client.response;\n const raw = await readFrameBody(request);\n if (raw === null) {\n return Response.json({ detail: \"frame body too large\" }, { status: 413 });\n }\n let body: unknown;\n try {\n body = raw.trim() ? JSON.parse(raw) : null;\n } catch {\n return Response.json({ detail: \"body must be JSON\" }, { status: 400 });\n }\n let frame: ParsedFrame;\n try {\n frame =\n body === null && !raw.trim()\n ? { ctx: [], cmd: [] }\n : parseFrameValue(body);\n } catch (error) {\n if (!(error instanceof Error) || error.name !== \"StatewireViolation\") {\n throw error;\n }\n return Response.json({ detail: error.message }, { status: 400 });\n }\n const authorized = await authorize(h, headersOf(request));\n if (\"refused\" in authorized) return authorized.refused;\n const mismatch = principalMismatchResponse(\n h,\n client.clientId,\n authorized.auth,\n );\n if (mismatch !== null) return mismatch;\n if (atSubscriberLimit(h)) return subscriberLimitResponse();\n const selection = negotiateProtocols(request.headers, h.wireVersion, [\n h.protocol,\n ]);\n if (\"fin\" in selection)\n return Response.json(selection, { status: selection.fin.status });\n const attachment = attachSse(h, client.clientId, authorized.auth, selection);\n if (attachment.registration === null) return streamResponse(attachment, null);\n const lease = mintLease();\n attachment.registration.conn.lease = lease;\n try {\n admitAttachFrame(h, attachment.registration, frame);\n } catch (error) {\n closeConn(h, attachment.registration.conn, 1008, \"invalid-context\");\n if (!(error instanceof Error) || error.name !== \"StatewireViolation\")\n throw error;\n return Response.json(\n { fin: { reason: \"protocol-error\", message: error.message } },\n { status: 400 },\n );\n }\n return streamResponse(attachment, lease);\n};\n\nexport const stream = async (\n h: SocketHostState,\n request: Request,\n): Promise<Response> => {\n if (request.method === \"GET\") return getStream(h, request);\n if (request.method === \"POST\") return postStream(h, request);\n return new Response(null, {\n status: 405,\n headers: { Allow: \"GET, POST\" },\n });\n};\n\nconst finClient = (\n h: SocketHostState,\n clientId: string,\n fin: StatewireHost.Fin,\n) => {\n flush(h);\n for (const conn of [...h.conns]) {\n if (conn.clientId !== clientId) continue;\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n};\n\nconst violationResponse = (\n h: SocketHostState,\n clientId: string,\n reason: string,\n) => {\n finClient(h, clientId, {\n reason: \"protocol-error\",\n message: reason,\n });\n return Response.json({ error: reason }, { status: 400 });\n};\n\nexport const frames = async (\n h: SocketHostState,\n request: Request,\n): Promise<Response> => {\n const lease = request.headers.get(LEASE_HEADER);\n // A lease lives and dies with its attach: any live attach of the id accepts.\n const leased =\n lease === null\n ? undefined\n : [...h.conns].find((conn) => conn.open && conn.lease === lease);\n if (h.disposed || h.finished !== null || leased === undefined) {\n return Response.json({ error: \"stale-lease\" }, { status: 423 });\n }\n const clientId = leased.clientId;\n const rec = h.clients.get(clientId)!;\n const raw = await readFrameBody(request);\n if (raw === null) {\n return Response.json({ error: \"frame body too large\" }, { status: 413 });\n }\n let frame: ParsedFrame;\n try {\n frame = parseFrame(raw);\n } catch (error) {\n if (!(error instanceof Error) || error.name !== \"StatewireViolation\") {\n throw error;\n }\n return violationResponse(h, clientId, error.message);\n }\n if (!leased.open || h.disposed || h.finished !== null) {\n return Response.json({ error: \"stale-lease\" }, { status: 423 });\n }\n let admission: ReturnType<typeof admitFrame>;\n try {\n admission = admitFrame(h, rec, frame, leased.auth, leased.selection);\n } catch (error) {\n if (!(error instanceof Error) || error.name !== \"StatewireViolation\")\n throw error;\n return violationResponse(h, clientId, error.message);\n }\n if (admission.type === \"refused\") {\n const retry = admission.syn.syn.retry;\n return Response.json(admission.syn, {\n status: retry === undefined ? 409 : 429,\n ...(retry !== undefined && {\n headers: { \"Retry-After\": String(Math.ceil(retry / 1000)) },\n }),\n });\n }\n return Response.json({});\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http.js","names":["StatewireHost","CLIENT_ID_RE","PRINCIPAL_MISMATCH_MESSAGE","SUBSCRIBER_LIMIT_MESSAGE","admitFrame","atSubscriberLimit","authEquals","closeConn","flush","parseFrame","parseFrameValue","register","sendTo","ParsedFrame","Registration","SocketHostState","MAX_FRAME_BODY_BYTES","negotiateProtocols","StatewireProtocol","CLIENT_ID_HEADER","LEASE_HEADER","encoder","TextEncoder","laggardFin","encode","readFrameBody","request","Request","Promise","declared","headers","get","Number","body","cancel","catch","reader","getReader","chunks","Uint8Array","size","done","value","read","length","push","offset","chunk","set","TextDecoder","decode","invalidClientIdReason","clientId","test","clientIdResponse","response","Response","json","detail","status","reason","headersOf","Record","Object","fromEntries","authorize","h","auth","refused","error","subscriberLimitResponse","principalMismatchResponse","rec","clients","undefined","principal","mintLease","bytes","crypto","getRandomValues","btoa","String","fromCharCode","replaceAll","replace","SseAttachment","ReadableStream","registration","activateBackpressure","attachSse","selection","Selection","controller","ReadableStreamDefaultController","connection","open","backpressureActive","start","next","close","highWaterMark","streamQueueSize","socket","send","data","desiredSize","enqueue","frame","streamResponse","attachment","lease","admitAttachFrame","ctx","cmd","admission","conn","type","JSON","stringify","syn","getStream","authorized","client","mismatch","wireVersion","protocol","fin","postStream","raw","trim","parse","Error","name","message","stream","method","Allow","finClient","Fin","conns","violationResponse","frames","leased","find","disposed","finished","ReturnType","retry","Math","ceil"],"sources":["../../src/host/http.ts"],"sourcesContent":["import type { StatewireHost } from \"../host\";\nimport {\n CLIENT_ID_RE,\n PRINCIPAL_MISMATCH_MESSAGE,\n SUBSCRIBER_LIMIT_MESSAGE,\n admitFrame,\n atSubscriberLimit,\n authEquals,\n closeConn,\n flush,\n parseFrame,\n parseFrameValue,\n register,\n sendTo,\n} from \"./socket\";\nimport type { ParsedFrame, Registration, SocketHostState } from \"./socket\";\nimport { MAX_FRAME_BODY_BYTES } from \"../wire/limits\";\nimport { negotiateProtocols } from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\n\nexport { MAX_FRAME_BODY_BYTES } from \"../wire/limits\";\n\nconst CLIENT_ID_HEADER = \"Statewire-Client-Id\";\nconst LEASE_HEADER = \"Statewire-Lease\";\nconst encoder = new TextEncoder();\nconst laggardFin = encoder.encode(\n 'data: {\"fin\":{\"reason\":\"reconnect\",\"code\":\"client-fell-behind\"}}\\n\\n',\n);\nconst readFrameBody = async (request: Request): Promise<string | null> => {\n const declared = request.headers.get(\"content-length\");\n if (declared !== null && Number(declared) > MAX_FRAME_BODY_BYTES) {\n await request.body?.cancel(\"frame body too large\").catch(() => {});\n return null;\n }\n if (request.body === null) return \"\";\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.length;\n if (size > MAX_FRAME_BODY_BYTES) {\n await reader.cancel(\"frame body too large\").catch(() => {});\n return null;\n }\n chunks.push(value);\n }\n const body = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.length;\n }\n return new TextDecoder().decode(body);\n};\n\nconst invalidClientIdReason = (clientId: string): string | null => {\n if (clientId === \"\") return \"id must be non-empty\";\n if (clientId.length > 256) return \"id must be at most 256 characters\";\n if (!CLIENT_ID_RE.test(clientId)) {\n return \"id must contain only [A-Za-z0-9._~-]\";\n }\n return null;\n};\n\nconst clientIdResponse = (\n request: Request,\n): { clientId: string } | { response: Response } => {\n const clientId = request.headers.get(CLIENT_ID_HEADER);\n if (clientId === null) {\n return {\n response: Response.json(\n { detail: `missing ${CLIENT_ID_HEADER} header` },\n { status: 400 },\n ),\n };\n }\n const reason = invalidClientIdReason(clientId);\n if (reason !== null) {\n return {\n response: Response.json(\n { detail: `invalid ${CLIENT_ID_HEADER}: ${reason}` },\n { status: 400 },\n ),\n };\n }\n return { clientId };\n};\n\nconst headersOf = (request: Request): Record<string, string> =>\n Object.fromEntries(request.headers);\n\nconst authorize = async (\n h: SocketHostState,\n headers: Record<string, string>,\n): Promise<{ auth: unknown } | { refused: Response }> => {\n try {\n return { auth: await h.authorize?.({ headers }) };\n } catch (error) {\n if (error instanceof Response) return { refused: error };\n throw error;\n }\n};\n\nconst subscriberLimitResponse = (): Response =>\n Response.json({ detail: SUBSCRIBER_LIMIT_MESSAGE }, { status: 503 });\n\n// No awaits between this check and register: the binding cannot race.\nconst principalMismatchResponse = (\n h: SocketHostState,\n clientId: string,\n auth: unknown,\n): Response | null => {\n const rec = h.clients.get(clientId);\n if (rec !== undefined && !authEquals(rec.principal, auth)) {\n return Response.json(\n { detail: PRINCIPAL_MISMATCH_MESSAGE },\n { status: 403 },\n );\n }\n return null;\n};\n\nconst mintLease = (): string => {\n const bytes = crypto.getRandomValues(new Uint8Array(16));\n return btoa(String.fromCharCode(...bytes))\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n};\n\ntype SseAttachment = {\n body: ReadableStream<Uint8Array>;\n registration: Registration | null;\n activateBackpressure: () => void;\n};\n\nconst attachSse = (\n h: SocketHostState,\n clientId: string,\n auth: unknown,\n selection: StatewireProtocol.Selection,\n): SseAttachment => {\n let controller: ReadableStreamDefaultController<Uint8Array>;\n let connection: Registration[\"connection\"] | null = null;\n let open = true;\n let backpressureActive = false;\n const body = new ReadableStream(\n {\n start: (next) => {\n controller = next;\n },\n cancel: () => {\n open = false;\n connection?.close();\n },\n },\n { highWaterMark: h.streamQueueSize },\n );\n const socket = {\n send: (data: string) => {\n if (!open) return;\n if (\n backpressureActive &&\n controller.desiredSize !== null &&\n controller.desiredSize <= 0\n ) {\n open = false;\n try {\n controller.enqueue(laggardFin);\n controller.close();\n } catch {\n /* stream already gone */\n }\n connection?.close();\n return;\n }\n const frame = data === \"{}\" ? \": ping\\n\\n\" : `data: ${data}\\n\\n`;\n try {\n controller.enqueue(encoder.encode(frame));\n } catch {\n open = false;\n connection?.close();\n }\n },\n close: () => {\n if (!open) return;\n open = false;\n try {\n controller.close();\n } catch {\n return;\n }\n },\n };\n const registration = register(h, clientId, socket, false, auth, selection);\n connection = registration?.connection ?? null;\n if (!open) connection?.close();\n return {\n body,\n registration,\n activateBackpressure: () => {\n backpressureActive = true;\n },\n };\n};\n\nconst streamResponse = (\n attachment: SseAttachment,\n lease: string | null,\n): Response => {\n attachment.activateBackpressure();\n return new Response(attachment.body, {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream\",\n ...(lease !== null && { [LEASE_HEADER]: lease }),\n },\n });\n};\n\nconst admitAttachFrame = (\n h: SocketHostState,\n registration: Registration,\n frame: ParsedFrame,\n) => {\n if (frame.ctx.length === 0 && frame.cmd.length === 0) return;\n const admission = admitFrame(h, registration.conn, frame);\n if (admission.type === \"refused\") {\n sendTo(h, registration.conn, JSON.stringify(admission.syn));\n }\n};\n\nconst getStream = async (\n h: SocketHostState,\n request: Request,\n): Promise<Response> => {\n const authorized = await authorize(h, headersOf(request));\n if (\"refused\" in authorized) return authorized.refused;\n const client = clientIdResponse(request);\n if (\"response\" in client) return client.response;\n const mismatch = principalMismatchResponse(\n h,\n client.clientId,\n authorized.auth,\n );\n if (mismatch !== null) return mismatch;\n if (atSubscriberLimit(h)) return subscriberLimitResponse();\n const selection = negotiateProtocols(request.headers, h.wireVersion, [\n h.protocol,\n ]);\n if (\"fin\" in selection)\n return Response.json(selection, { status: selection.fin.status });\n const attachment = attachSse(h, client.clientId, authorized.auth, selection);\n const lease = attachment.registration === null ? null : mintLease();\n if (attachment.registration !== null)\n attachment.registration.conn.lease = lease;\n return streamResponse(attachment, lease);\n};\n\nconst postStream = async (\n h: SocketHostState,\n request: Request,\n): Promise<Response> => {\n const client = clientIdResponse(request);\n if (\"response\" in client) return client.response;\n const raw = await readFrameBody(request);\n if (raw === null) {\n return Response.json({ detail: \"frame body too large\" }, { status: 413 });\n }\n let body: unknown;\n try {\n body = raw.trim() ? JSON.parse(raw) : null;\n } catch {\n return Response.json({ detail: \"body must be JSON\" }, { status: 400 });\n }\n let frame: ParsedFrame;\n try {\n frame =\n body === null && !raw.trim()\n ? { ctx: [], cmd: [] }\n : parseFrameValue(body);\n } catch (error) {\n if (!(error instanceof Error) || error.name !== \"StatewireViolation\") {\n throw error;\n }\n return Response.json({ detail: error.message }, { status: 400 });\n }\n const authorized = await authorize(h, headersOf(request));\n if (\"refused\" in authorized) return authorized.refused;\n const mismatch = principalMismatchResponse(\n h,\n client.clientId,\n authorized.auth,\n );\n if (mismatch !== null) return mismatch;\n if (atSubscriberLimit(h)) return subscriberLimitResponse();\n const selection = negotiateProtocols(request.headers, h.wireVersion, [\n h.protocol,\n ]);\n if (\"fin\" in selection)\n return Response.json(selection, { status: selection.fin.status });\n const attachment = attachSse(h, client.clientId, authorized.auth, selection);\n if (attachment.registration === null) return streamResponse(attachment, null);\n const lease = mintLease();\n attachment.registration.conn.lease = lease;\n try {\n admitAttachFrame(h, attachment.registration, frame);\n } catch (error) {\n closeConn(h, attachment.registration.conn, 1008, \"invalid-context\");\n if (!(error instanceof Error) || error.name !== \"StatewireViolation\")\n throw error;\n return Response.json(\n { fin: { reason: \"protocol-error\", message: error.message } },\n { status: 400 },\n );\n }\n return streamResponse(attachment, lease);\n};\n\nexport const stream = async (\n h: SocketHostState,\n request: Request,\n): Promise<Response> => {\n if (request.method === \"GET\") return getStream(h, request);\n if (request.method === \"POST\") return postStream(h, request);\n return new Response(null, {\n status: 405,\n headers: { Allow: \"GET, POST\" },\n });\n};\n\nconst finClient = (\n h: SocketHostState,\n clientId: string,\n fin: StatewireHost.Fin,\n) => {\n flush(h);\n for (const conn of [...h.conns]) {\n if (conn.clientId !== clientId) continue;\n sendTo(h, conn, JSON.stringify({ fin }));\n closeConn(h, conn);\n }\n};\n\nconst violationResponse = (\n h: SocketHostState,\n clientId: string,\n reason: string,\n) => {\n finClient(h, clientId, {\n reason: \"protocol-error\",\n message: reason,\n });\n return Response.json({ error: reason }, { status: 400 });\n};\n\nexport const frames = async (\n h: SocketHostState,\n request: Request,\n): Promise<Response> => {\n const lease = request.headers.get(LEASE_HEADER);\n // A lease lives and dies with its attach: any live attach of the id accepts.\n const leased =\n lease === null\n ? undefined\n : [...h.conns].find((conn) => conn.open && conn.lease === lease);\n if (h.disposed || h.finished !== null || leased === undefined) {\n return Response.json({ error: \"stale-lease\" }, { status: 423 });\n }\n const clientId = leased.clientId;\n const raw = await readFrameBody(request);\n if (raw === null) {\n return Response.json({ error: \"frame body too large\" }, { status: 413 });\n }\n let frame: ParsedFrame;\n try {\n frame = parseFrame(raw);\n } catch (error) {\n if (!(error instanceof Error) || error.name !== \"StatewireViolation\") {\n throw error;\n }\n return violationResponse(h, clientId, error.message);\n }\n if (!leased.open || h.disposed || h.finished !== null) {\n return Response.json({ error: \"stale-lease\" }, { status: 423 });\n }\n let admission: ReturnType<typeof admitFrame>;\n try {\n admission = admitFrame(h, leased, frame);\n } catch (error) {\n if (!(error instanceof Error) || error.name !== \"StatewireViolation\")\n throw error;\n return violationResponse(h, clientId, error.message);\n }\n if (admission.type === \"refused\") {\n const retry = admission.syn.syn.retry;\n return Response.json(admission.syn, {\n status: retry === undefined ? 409 : 429,\n ...(retry !== undefined && {\n headers: { \"Retry-After\": String(Math.ceil(retry / 1000)) },\n }),\n });\n }\n return Response.json({});\n};\n"],"mappings":"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"}
|