statewire 0.19.4 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +15 -1
  2. package/dist/client/connection.d.ts.map +1 -1
  3. package/dist/client/connection.js +18 -4
  4. package/dist/client/connection.js.map +1 -1
  5. package/dist/client/session.d.ts +10 -1
  6. package/dist/client/session.d.ts.map +1 -1
  7. package/dist/client/session.js +92 -27
  8. package/dist/client/session.js.map +1 -1
  9. package/dist/client/sessionStore.d.ts +2 -0
  10. package/dist/client/sessionStore.d.ts.map +1 -1
  11. package/dist/client/sessionStore.js.map +1 -1
  12. package/dist/host/host.d.ts +2 -1
  13. package/dist/host/host.d.ts.map +1 -1
  14. package/dist/host/host.js +20 -12
  15. package/dist/host/host.js.map +1 -1
  16. package/dist/host/http.d.ts.map +1 -1
  17. package/dist/host/http.js +14 -9
  18. package/dist/host/http.js.map +1 -1
  19. package/dist/host/socket.d.ts +14 -3
  20. package/dist/host/socket.d.ts.map +1 -1
  21. package/dist/host/socket.js +162 -20
  22. package/dist/host/socket.js.map +1 -1
  23. package/dist/host-internal.d.ts +5 -2
  24. package/dist/host-internal.d.ts.map +1 -1
  25. package/dist/host.d.ts +6 -0
  26. package/dist/host.d.ts.map +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/statewire.d.ts +3 -0
  29. package/dist/statewire.d.ts.map +1 -1
  30. package/dist/statewire.js +23 -5
  31. package/dist/statewire.js.map +1 -1
  32. package/dist/transports/remote.d.ts.map +1 -1
  33. package/dist/transports/remote.js +3 -2
  34. package/dist/transports/remote.js.map +1 -1
  35. package/dist/transports/sse.d.ts +5 -0
  36. package/dist/transports/sse.d.ts.map +1 -1
  37. package/dist/transports/sse.js +12 -0
  38. package/dist/transports/sse.js.map +1 -1
  39. package/dist/transports/testing.d.ts +2 -0
  40. package/dist/transports/testing.d.ts.map +1 -1
  41. package/dist/transports/testing.js +11 -4
  42. package/dist/transports/testing.js.map +1 -1
  43. package/dist/types.d.ts +4 -0
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/types.js.map +1 -1
  46. package/dist/wire/context.d.ts +14 -0
  47. package/dist/wire/context.d.ts.map +1 -0
  48. package/dist/wire/context.js +31 -0
  49. package/dist/wire/context.js.map +1 -0
  50. package/dist/wire/limits.d.ts +2 -1
  51. package/dist/wire/limits.d.ts.map +1 -1
  52. package/dist/wire/limits.js +2 -1
  53. package/dist/wire/limits.js.map +1 -1
  54. package/dist/wire/protocol.d.ts +1 -1
  55. package/dist/wire/protocol.js +4 -4
  56. package/dist/wire/protocol.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/client/connection.ts +16 -4
  59. package/src/client/session.ts +128 -19
  60. package/src/client/sessionStore.ts +5 -1
  61. package/src/host/host.ts +18 -3
  62. package/src/host/http.ts +37 -5
  63. package/src/host/socket.ts +232 -13
  64. package/src/host-internal.ts +4 -0
  65. package/src/host.ts +5 -0
  66. package/src/statewire.ts +34 -3
  67. package/src/transports/remote.ts +3 -0
  68. package/src/transports/sse.ts +19 -0
  69. package/src/transports/testing.ts +14 -3
  70. package/src/types.ts +12 -0
  71. package/src/wire/context.ts +40 -0
  72. package/src/wire/limits.ts +2 -0
  73. package/src/wire/protocol.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","names":["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","retryHint","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","protocolError","message","Error","rejectedSend","failure","SendFailure","Promise","result","catch","AttachState","StatewireSessionOptions","Options","sessionStore","SessionStorage","onSessionLost","OnSessionLost","onDone","Shared","txq","parked","verdict","SessionVerdict","unsubscribe","Session","options","selection","Selection","record","SessionRecord","ctx","recordPersisted","hydrated","ready","storageError","persistedRecord","store","documentStore","Storage","shared","ephemeral","deactivated","sessionKnown","durableSeq","Record","ephemeralSeqs","resumeAt","idle","lanesOnAttach","attachEntries","ReadonlySet","frameFailures","pending","failedList","FailedCommand","failedParts","canonical","documentListeners","Set","documents","State","lastPublished","changed","source","StateSource","attach","attachEpoch","running","pumping","transport","waiters","lifecycle","notify","commands","EMPTY_LANE","SessionLane","nextSeq","laneOf","Object","hasOwn","lanes","withLane","lane","isEphemeral","s","protocols","some","p","name","durableSeqOf","laneEntries","filter","publish","wake","waiter","waitForWake","r","push","sleepUntilWake","delayMs","clearTimeout","timer","setTimeout","w","storageFailed","cause","entry","setRecord","save","toStored","_protocol","backlog","map","mergeBacklog","own","known","foreign","c","has","sort","a","b","durableLanes","keys","MAX_PARKED_VERDICTS","syncBacklogInner","splice","parkedHere","v","parkedSeqs","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","failedCommands","parts","values","flatMap","failed","same","part","flat","retainFailedInner","ts","retainFailed","settleEntry","outcome","ok","onSettle","type","rides","settleAll","detach","const","batch","detachFailure","predecessorLost","fate","settleLost","entries","requeue","survivors","old","enqueueInner","rebaseRecord","adopt","held","previous","current","pump","resetRecord","connection","reconnect","ephemeralDetach","detachEphemeralLanes","includes","rejectedFailure","cmd","code","outcomeOf","String","settleVerdict","TERMINAL_CMD_TYPES","parkVerdict","handleCmd","dur","watermark","Math","max","find","consumeVerdicts","consumed","add","size","handleCmds","cmds","ingestOps","ops","next","get","value","applicationProtocols","fromEntries","id","d","key","JSON","stringify","changedPaths","cacheDocuments","document","keyPrefixes","version","namespace","publishIngested","listener","sessionLostInner","seqWm","selectionOf","syn","handleHello","mode","Map","attached","reconcile","adoptStored","handleOps","handleRefusal","retry","Date","now","gaps","first","handleDetach","handleFinish","reason","isFinished","Lanes","frame","buildLanes","cmdGate","last","stopped","gated","_produced","takeAttachLanes","wanted","persistBeforeSend","status","resumeDelay","epoch","send","onPosted","start","subscribe","stop","setTransport","onStart","enqueue","offered","offers","offer","adopted","sendCommand","negotiated","encoded","wire","wireVersion","findFailed","f","unknownFailed","takeFailed","found","discardFailed","retryFailed","documentSource","Source","prefix","mounted","absolute","cached","list","delete","invokeProtocol","storedCommandCompatible","validateLanes","Array","isArray","loadSessionRecord","compatible","migrate","useStatewireSession","defaultStore","session","beforeAttach","onHello","args","onOps","onCmds","onRefusal","onIdle","onDetach","onFinish","snapshot","takeChanged","setOnChange","setListener"],"sources":["../../src/client/session.ts"],"sourcesContent":["import { 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, retryHint } 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\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: { protocol: string; verdict: StatewireClient.SessionVerdict }[];\n unsubscribe: (() => void) | null;\n};\n\ntype Session = {\n options: StatewireSessionOptions;\n selection: StatewireProtocol.Selection | undefined;\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 /** Every selected lane is ephemeral: the record dies with the attach. */\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: Record<string, number>;\n /** Ephemeral lane clocks: restart at 1 on every attach. */\n ephemeralSeqs: Record<string, number>;\n resumeAt: number;\n idle: boolean;\n onSessionLost: StatewireClient.OnSessionLost | undefined;\n onDone: (() => void) | undefined;\n lanesOnAttach: boolean;\n attachEntries: ReadonlySet<Pending>;\n frameFailures: number;\n pending: Pending[];\n failedList: readonly StatewireClient.FailedCommand[];\n failedParts: readonly (readonly StatewireClient.FailedCommand[])[];\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 EMPTY_LANE: StatewireClient.SessionLane = { nextSeq: 1, commands: [] };\n\nconst laneOf = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n): StatewireClient.SessionLane =>\n Object.hasOwn(record.lanes, protocol) ? record.lanes[protocol]! : EMPTY_LANE;\n\nconst withLane = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n lane: StatewireClient.SessionLane,\n): StatewireClient.SessionRecord => ({\n ...record,\n lanes: { ...record.lanes, [protocol]: lane },\n});\n\nconst isEphemeral = (s: Session, protocol: string) =>\n s.selection?.protocols.some(\n (p) => p.name === protocol && p.record === \"ephemeral\",\n ) ?? false;\n\nconst durableSeqOf = (s: Session, protocol: string) =>\n Object.hasOwn(s.durableSeq, protocol) ? s.durableSeq[protocol]! : 0;\n\nconst laneEntries = (s: Session, protocol: string) =>\n s.pending.filter((p) => p.command.protocol === protocol);\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 toStored = (p: Pending): StatewireClient.SessionCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return { seq: p.seq, ...command };\n};\n\nconst backlog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] =>\n laneEntries(s, protocol)\n .filter((p) => p.seq > durableSeqOf(s, protocol))\n .map(toStored);\n\nconst mergeBacklog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] => {\n const own = backlog(s, protocol);\n if (!s.shared) return own;\n const known = new Set(laneEntries(s, protocol).map((p) => p.seq));\n const foreign = laneOf(s.record, protocol).commands.filter(\n (c) => !known.has(c.seq) && c.seq > durableSeqOf(s, protocol),\n );\n return [...foreign, ...own].sort((a, b) => a.seq - b.seq);\n};\n\nconst durableLanes = (s: Session): string[] => [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending\n .map((p) => p.command.protocol)\n .filter((protocol) => !isEphemeral(s, protocol)),\n ]),\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 let lanes = s.record.lanes;\n for (const protocol of durableLanes(s)) {\n const lane = laneOf(s.record, protocol);\n const parkedHere = parked\n .filter((v) => v.protocol === protocol)\n .map((v) => v.verdict);\n const parkedSeqs = new Set(parkedHere.map((v) => v.seq));\n const commands = mergeBacklog(s, protocol).filter(\n (c) => !parkedSeqs.has(c.seq),\n );\n const verdicts =\n parkedHere.length > 0\n ? [...(lane.verdicts ?? []), ...parkedHere].slice(-MAX_PARKED_VERDICTS)\n : lane.verdicts;\n const unchanged =\n verdicts === lane.verdicts &&\n commands.length === lane.commands.length &&\n commands.every((c, i) => c.seq === lane.commands[i]!.seq);\n if (unchanged) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands,\n ...(verdicts !== undefined && { verdicts }),\n },\n };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\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\nexport const failedCommands = (\n s: Session,\n): readonly StatewireClient.FailedCommand[] => {\n const parts = Object.values(s.record.lanes).flatMap((lane) =>\n lane.failed === undefined ? [] : [lane.failed],\n );\n const same =\n parts.length === s.failedParts.length &&\n parts.every((part, i) => part === s.failedParts[i]);\n if (!same) {\n s.failedParts = parts;\n s.failedList = parts.flat();\n }\n return s.failedList;\n};\n\nconst retainFailedInner = (\n s: Session,\n entry: Pending,\n failure: StatewireClient.SendFailure,\n) => {\n const lane = laneOf(s.record, entry.command.protocol);\n setRecord(\n s,\n withLane(s.record, entry.command.protocol, {\n ...lane,\n failed: [\n ...(lane.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 );\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 > durableSeqOf(s, entry.command.protocol);\n if (!rides && !isEphemeral(s, entry.command.protocol))\n 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) =>\n p.command.protocol === entry.command.protocol &&\n p.seq < entry.seq &&\n 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\nconst requeue = (s: Session, survivors: Pending[]) => {\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};\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 = {};\n // Failed entries are user-owned history: they ride through every record replacement.\n const previous = s.record.lanes;\n adopt();\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(previous)) {\n const failed = lane.failed;\n if (failed === undefined || laneOf(s.record, protocol).failed === failed)\n continue;\n const current = laneOf(s.record, protocol);\n lanes = {\n ...lanes,\n [protocol]: {\n ...current,\n failed: [...(current.failed ?? []), ...failed],\n },\n };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n requeue(s, survivors);\n publish(s);\n wake(s);\n void pump(s);\n};\n\nconst resetRecord = (s: Session, clientId: string) =>\n rebaseRecord(s, () => setRecord(s, { clientId, lanes: {} }));\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 // The host attributes frames by lease, and the lease is bound to the id\n // this attach was opened with.\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\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\n// An ephemeral lane dies with its attach: attempted statements can never be\n// answered, the rest re-stamp from 1 for the next attach.\nconst detachEphemeralLanes = (s: Session) => {\n const held = s.pending.filter((p) => isEphemeral(s, p.command.protocol));\n if (held.length === 0) return;\n s.pending = s.pending.filter((p) => !held.includes(p));\n settleLost(\n s,\n held.filter((p) => p.attempted),\n );\n requeue(\n s,\n held.filter((p) => !p.attempted),\n );\n publish(s);\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\n// Only a result verdict carries applied effects; the rest drop the overlay unapplied.\nconst settleVerdict = (s: Session, entry: Pending, cmd: StatewireCmd) => {\n const outcome = outcomeOf(cmd);\n if (outcome.ok) cover(s, entry);\n else s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, outcome);\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 if (isEphemeral(s, cmd.protocol)) return;\n s.shared.parked.push({\n protocol: cmd.protocol,\n verdict: {\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};\n\nconst handleCmd = (s: Session, cmd: StatewireCmd) => {\n if (cmd.dur === true && !isEphemeral(s, cmd.protocol)) {\n const watermark = Math.max(durableSeqOf(s, cmd.protocol), cmd.seq);\n s.durableSeq[cmd.protocol] = watermark;\n for (const entry of laneEntries(s, cmd.protocol)) {\n if (entry.seq <= watermark) entry.posted = true;\n }\n }\n if (cmd.type === undefined) return;\n const entry = s.pending.find(\n (p) => p.command.protocol === cmd.protocol && p.seq === cmd.seq,\n );\n if (cmd.type === \"applied\") {\n if (entry) cover(s, entry);\n return;\n }\n if (!entry) return;\n parkVerdict(s, cmd);\n settleVerdict(s, entry, cmd);\n};\n\nconst consumeVerdicts = (s: Session) => {\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const verdicts = lane.verdicts ?? [];\n const consumed = new Set<number>();\n for (const verdict of verdicts) {\n const entry = laneEntries(s, protocol).find((p) => p.seq === verdict.seq);\n if (!entry) continue;\n consumed.add(verdict.seq);\n settleVerdict(s, entry, { ...verdict, protocol });\n }\n if (consumed.size === 0) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.filter((c) => !consumed.has(c.seq)),\n verdicts: verdicts.filter((v) => !consumed.has(v.seq)),\n },\n };\n }\n if (lanes === s.record.lanes) return;\n setRecord(s, { ...s.record, lanes });\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 lane clock restarts at the watermark.\nconst sessionLostInner = (s: Session, protocol: string, seqWm: number) => {\n const held = laneEntries(s, protocol);\n settleLost(s, held);\n s.durableSeq[protocol] = seqWm;\n const failed = laneOf(s.record, protocol).failed;\n setRecord(\n s,\n withLane(s.record, protocol, {\n nextSeq: seqWm + 1,\n commands: [],\n ...(failed !== undefined && { failed }),\n }),\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 selectionOf = (\n syn: StatewireSyn,\n): StatewireProtocol.Selection | undefined => {\n if (syn.version === undefined || syn.protocols === undefined)\n return undefined;\n return {\n version: syn.version,\n protocols: syn.protocols.map(({ name, version, record }) => {\n if (version === undefined)\n return protocolError(`hello lane ${name} has no version`);\n return { name, version, ...(record !== undefined && { record }) };\n }),\n };\n};\n\nconst handleHello = (\n s: Session,\n { ops, syn }: { ops: unknown[]; syn: StatewireSyn },\n) => {\n s.selection = selectionOf(syn);\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 const lanes = syn.protocols ?? [];\n s.ephemeral =\n lanes.length > 0 && lanes.every((lane) => lane.record === \"ephemeral\");\n if (s.ephemeral) s.deactivated = true;\n const attached = s.attachEntries;\n s.attachEntries = 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 for (const lane of lanes) {\n if (lane.record === \"ephemeral\") {\n s.ephemeralSeqs[lane.name] = Math.max(\n Object.hasOwn(s.ephemeralSeqs, lane.name)\n ? s.ephemeralSeqs[lane.name]!\n : 0,\n ...laneEntries(s, lane.name).map((p) => p.seq),\n );\n } else s.durableSeq[lane.name] = lane.seq ?? 0;\n }\n for (const entry of s.pending) entry.posted = attached.has(entry);\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 gap against\n// a durable lane's exact watermark settles that lane's history lost; a\n// pushback (retry present) or a gapless refusal only reconciles the resend queues.\nconst handleRefusal = (s: Session, syn: StatewireSyn) => {\n const lanes = (syn.protocols ?? []).filter(\n (lane): lane is { name: string; seq: number } => lane.seq !== undefined,\n );\n for (const { name, seq } of lanes) {\n const watermark = isEphemeral(s, name)\n ? seq\n : Math.max(seq, durableSeqOf(s, name));\n for (const entry of laneEntries(s, name))\n entry.posted = entry.seq <= watermark;\n }\n if (typeof syn.retry === \"number\") {\n s.resumeAt = Date.now() + retryHint(syn.retry);\n wake(s);\n void pump(s);\n return;\n }\n const gaps = lanes.filter(({ name, seq }) => {\n const first = laneEntries(s, name).find((p) => !p.posted);\n return (\n first !== undefined &&\n first.seq > Math.max(seq, durableSeqOf(s, name)) + 1\n );\n });\n for (const { name, seq } of gaps) {\n if (isEphemeral(s, name))\n protocolError(`gap on ephemeral lane ${name} after watermark ${seq}`);\n }\n if (gaps.length > 0) {\n transactBackground(\n s,\n () => {\n for (const { name, seq } of gaps) sessionLostInner(s, name, seq);\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 s.ephemeralSeqs = {};\n if (s.ephemeral) ephemeralDetach(s);\n else detachEphemeralLanes(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 entries: Pending[];\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. Ephemeral lanes ignore\n// the gate: they live on the attach and never wait for persistence.\nconst buildLanes = (\n s: Session,\n cmdGate: \"persisted\" | \"all\" | \"none\" = \"all\",\n): Lanes | null => {\n const entries: Pending[] = [];\n const last: Record<string, number> = {};\n const stopped = new Set<string>();\n for (const entry of s.pending) {\n if (entries.length >= MAX_COMMANDS_PER_FRAME) break;\n const protocol = entry.command.protocol;\n if (entry.posted || stopped.has(protocol)) continue;\n const gated =\n !isEphemeral(s, protocol) &&\n (cmdGate === \"none\" ||\n (cmdGate === \"persisted\" &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= laneOf(s.persistedRecord, protocol).nextSeq)));\n if (\n gated ||\n (Object.hasOwn(last, protocol) && entry.seq !== last[protocol]! + 1)\n ) {\n stopped.add(protocol);\n continue;\n }\n last[protocol] = entry.seq;\n entries.push(entry);\n }\n if (entries.length === 0) return null;\n return {\n frame: {\n cmd: entries.map((p) => {\n const { produced: _produced, ...command } = p.command;\n return { ...command, seq: p.seq };\n }),\n },\n entries,\n };\n};\n\nconst takeAttachLanes = (s: Session): StatewireFrame | null => {\n s.attachEntries = new Set();\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.attachEntries = new Set(lanes.entries);\n for (const entry of lanes.entries) 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.entries) 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.entries) {\n if (s.pending.includes(entry)) {\n entry.posted = true;\n s.lifecycle?.onPosted?.(entry.inv);\n }\n }\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 protocol = command.protocol;\n const ephemeral = isEphemeral(s, protocol);\n const seq = ephemeral\n ? (Object.hasOwn(s.ephemeralSeqs, protocol)\n ? s.ephemeralSeqs[protocol]!\n : 0) + 1\n : Math.max(\n laneOf(s.record, protocol).nextSeq,\n durableSeqOf(s, protocol) + 1,\n );\n const entry: Pending = {\n seq,\n command,\n inv: {\n 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 if (ephemeral) s.ephemeralSeqs[protocol] = seq;\n else\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...laneOf(s.record, protocol),\n nextSeq: seq + 1,\n commands: mergeBacklog(s, protocol),\n }),\n );\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 // A send queued behind the lock before this tab unmounted still lands in\n // the shared journal: another sharer adopts and replays it.\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\nconst offered = (s: Session, protocol: string) => {\n const offers = protocolOffers(s.options);\n return offers === \"*\" || offers.some((offer) => offer.name === protocol);\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 let adopted = false;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (!offered(s, protocol)) continue;\n const known = new Set(laneEntries(s, protocol).map((p) => p.seq));\n for (const { seq, ...command } of lane.commands) {\n if (known.has(seq)) 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: { protocol, ...command },\n inv: {\n 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 adopted = true;\n }\n }\n if (adopted) 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 const negotiated = s.selection\n ? s.selection.protocols.some((p) => p.name === protocol)\n : offered(s, protocol);\n if (!negotiated)\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\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 (laneOf(s.record, entry.protocol).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 lane = laneOf(s.record, entry.protocol);\n const found = findFailed(s, entry);\n if (found === undefined) throw unknownFailed(entry);\n setRecord(\n s,\n withLane(s.record, entry.protocol, {\n ...lane,\n failed: (lane.failed ?? []).filter((f) => f !== found),\n }),\n );\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\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 protocol: string,\n command: StatewireClient.SessionCommand,\n current: NonNullable<StatewireClient.SessionCommand[\"produced\"]>,\n) => {\n if (\n !command.produced ||\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 === protocol);\n const offer = current.protocols.find((p) => p.name === protocol);\n return (\n produced !== undefined &&\n offer !== undefined &&\n inRange(produced.version, offer)\n );\n};\n\nconst validateLanes = (record: StatewireClient.SessionRecord) => {\n if (\n typeof record.lanes !== \"object\" ||\n record.lanes === null ||\n Object.values(record.lanes).some((lane) => !Array.isArray(lane.commands))\n )\n throw new Error(\n \"statewire: session storage loaded a record without command lanes\",\n );\n};\n\nconst loadSessionRecord = (\n store: StatewireClient.SessionStorage,\n options: StatewireSessionOptions,\n) => {\n let stored = store.load();\n if (stored !== null) validateLanes(stored);\n const current = {\n wire: options.wireVersion ?? { version: WIRE_VERSION },\n protocols: protocolOffers(options),\n };\n const compatible = (record: StatewireClient.SessionRecord) =>\n Object.entries(record.lanes).every(([protocol, lane]) =>\n lane.commands.every((command) =>\n storedCommandCompatible(protocol, command, current),\n ),\n );\n if (stored !== null && !compatible(stored)) {\n if (!store.migrate)\n throw new Error(\"statewire: stored commands require a storage migration\");\n stored = store.migrate(stored, current);\n if (stored !== null) {\n validateLanes(stored);\n if (!compatible(stored))\n throw new Error(\"statewire: migrated commands are incompatible\");\n store.save(stored);\n }\n }\n const record = stored ?? { clientId: newClientId(), lanes: {} };\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(), lanes: {} };\n const session: Session = {\n options,\n selection: undefined,\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: {},\n ephemeralSeqs: {},\n resumeAt: 0,\n idle: false,\n onSessionLost: undefined,\n onDone: undefined,\n lanesOnAttach: false,\n attachEntries: new Set(),\n frameFailures: 0,\n pending: [],\n failedList: [],\n failedParts: [],\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 { setTransport };\n"],"mappings":"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"}
1
+ {"version":3,"file":"session.js","names":["encodeContext","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","retryHint","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","protocolError","message","Error","rejectedSend","failure","SendFailure","Promise","result","catch","AttachState","StatewireSessionOptions","Options","context","Readonly","Record","Context","sessionStore","SessionStorage","onSessionLost","OnSessionLost","onDone","Shared","txq","syncQueued","parked","verdict","SessionVerdict","unsubscribe","Session","options","configuredContext","contexts","Map","ReturnType","dirtyContexts","Set","attachContexts","selection","Selection","record","SessionRecord","ctx","recordPersisted","hydrated","ready","storageError","persistedRecord","store","documentStore","Storage","shared","ephemeral","deactivated","sessionKnown","durableSeq","ephemeralSeqs","resumeAt","idle","lanesOnAttach","attachEntries","ReadonlySet","frameFailures","pending","failedList","FailedCommand","failedParts","canonical","documentListeners","documents","State","lastPublished","changed","source","StateSource","attach","attachEpoch","running","pumping","transport","waiters","lifecycle","notify","commands","EMPTY_LANE","SessionLane","nextSeq","laneOf","Object","hasOwn","lanes","withLane","lane","isEphemeral","s","protocols","some","p","name","durableSeqOf","laneEntries","filter","publish","wake","waiter","waitForWake","r","push","sleepUntilWake","delayMs","clearTimeout","timer","setTimeout","w","storageFailed","cause","entry","setRecord","save","toStored","_protocol","backlog","map","mergeBacklog","own","known","foreign","c","has","sort","a","b","durableLanes","keys","MAX_PARKED_VERDICTS","syncBacklogInner","splice","parkedHere","v","parkedSeqs","verdicts","length","slice","unchanged","every","i","undefined","syncBacklog","transact","fn","run","then","lock","stored","load","clientId","adoptReset","boundRecord","persistence","flush","transactBackground","done","setIdle","level","cover","onApplied","onCovered","failedCommands","parts","values","flatMap","failed","same","part","flat","MAX_FAILED_RETAINED","boundFailed","ts","entries","retainFailedInner","retainFailed","settleEntry","outcome","ok","onSettle","type","rides","settleAll","detach","const","batch","detachFailure","predecessorLost","fate","settleLost","requeue","survivors","old","enqueueInner","rebaseRecord","adopt","held","previous","current","pump","resetRecord","connection","reconnect","ephemeralDetach","detachEphemeralLanes","includes","rejectedFailure","cmd","code","outcomeOf","String","settleVerdict","TERMINAL_CMD_TYPES","parkVerdict","handleCmd","dur","watermark","Math","max","find","consumeVerdicts","consumed","add","size","handleCmds","cmds","ingestOps","ops","next","get","value","applicationProtocols","fromEntries","id","d","key","JSON","stringify","changedPaths","cacheDocuments","document","keyPrefixes","version","namespace","publishIngested","listener","sessionLostInner","seqWm","selectionOf","syn","handleHello","delete","clear","mode","attached","reconcile","adoptStored","handleOps","handleRefusal","retry","Date","now","gaps","first","handleDetach","handleFinish","reason","isFinished","Lanes","frame","buildLanes","cmdGate","last","stopped","gated","_produced","takeAttachLanes","wanted","persistBeforeSend","status","resumeDelay","epoch","send","onPosted","start","subscribe","stop","setTransport","onStart","enqueue","offered","offers","offer","adopted","structuredClone","sendCommand","negotiated","encoded","wire","wireVersion","findFailed","f","unknownFailed","takeFailed","found","discardFailed","retryFailed","documentSource","Source","prefix","mounted","absolute","cached","list","invokeProtocol","storedCommandCompatible","validateLanes","Array","isArray","loadSessionRecord","compatible","migrate","setContext","set","useStatewireSession","defaultStore","session","beforeAttach","onHello","args","onOps","onCmds","onRefusal","onIdle","onDetach","onFinish","snapshot","takeChanged","setOnChange","setListener"],"sources":["../../src/client/session.ts"],"sourcesContent":["import { encodeContext } from \"../wire/context\";\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, retryHint } 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\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 context?: Readonly<Record<string, Statewire.Context>>;\n sessionStore?: StatewireClient.SessionStorage | undefined;\n onSessionLost?: StatewireClient.OnSessionLost | undefined;\n onDone?: (() => void) | undefined;\n};\n\ntype Shared = {\n txq: Promise<void>;\n syncQueued: boolean;\n parked: { protocol: string; verdict: StatewireClient.SessionVerdict }[];\n unsubscribe: (() => void) | null;\n};\n\ntype Session = {\n options: StatewireSessionOptions;\n configuredContext: StatewireSessionOptions[\"context\"];\n contexts: Map<string, ReturnType<typeof encodeContext>>;\n dirtyContexts: Set<string>;\n attachContexts: Map<string, ReturnType<typeof encodeContext>>;\n selection: StatewireProtocol.Selection | undefined;\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 /** Every selected lane is ephemeral: the record dies with the attach. */\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: Record<string, number>;\n /** Ephemeral lane clocks: restart at 1 on every attach. */\n ephemeralSeqs: Record<string, number>;\n resumeAt: number;\n idle: boolean;\n onSessionLost: StatewireClient.OnSessionLost | undefined;\n onDone: (() => void) | undefined;\n lanesOnAttach: boolean;\n attachEntries: ReadonlySet<Pending>;\n frameFailures: number;\n pending: Pending[];\n failedList: readonly StatewireClient.FailedCommand[];\n failedParts: readonly (readonly StatewireClient.FailedCommand[])[];\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 EMPTY_LANE: StatewireClient.SessionLane = { nextSeq: 1, commands: [] };\n\nconst laneOf = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n): StatewireClient.SessionLane =>\n Object.hasOwn(record.lanes, protocol) ? record.lanes[protocol]! : EMPTY_LANE;\n\nconst withLane = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n lane: StatewireClient.SessionLane,\n): StatewireClient.SessionRecord => ({\n ...record,\n lanes: { ...record.lanes, [protocol]: lane },\n});\n\nconst isEphemeral = (s: Session, protocol: string) =>\n s.selection?.protocols.some(\n (p) => p.name === protocol && p.record === \"ephemeral\",\n ) ?? false;\n\nconst durableSeqOf = (s: Session, protocol: string) =>\n Object.hasOwn(s.durableSeq, protocol) ? s.durableSeq[protocol]! : 0;\n\nconst laneEntries = (s: Session, protocol: string) =>\n s.pending.filter((p) => p.command.protocol === protocol);\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 if (!s.deactivated) {\n try {\n s.store.save(record);\n } catch (cause) {\n storageFailed(s, cause);\n throw s.storageError;\n }\n }\n s.record = record;\n};\n\nconst toStored = (p: Pending): StatewireClient.SessionCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return { seq: p.seq, ...command };\n};\n\nconst backlog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] =>\n laneEntries(s, protocol)\n .filter((p) => p.seq > durableSeqOf(s, protocol))\n .map(toStored);\n\nconst mergeBacklog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] => {\n const own = backlog(s, protocol);\n if (!s.shared) return own;\n const known = new Set(laneEntries(s, protocol).map((p) => p.seq));\n const foreign = laneOf(s.record, protocol).commands.filter(\n (c) => !known.has(c.seq) && c.seq > durableSeqOf(s, protocol),\n );\n return [...foreign, ...own].sort((a, b) => a.seq - b.seq);\n};\n\nconst durableLanes = (s: Session): string[] => [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending\n .map((p) => p.command.protocol)\n .filter((protocol) => !isEphemeral(s, protocol)),\n ]),\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 let lanes = s.record.lanes;\n for (const protocol of durableLanes(s)) {\n const lane = laneOf(s.record, protocol);\n const parkedHere = parked\n .filter((v) => v.protocol === protocol)\n .map((v) => v.verdict);\n const parkedSeqs = new Set(parkedHere.map((v) => v.seq));\n const commands = mergeBacklog(s, protocol).filter(\n (c) => !parkedSeqs.has(c.seq),\n );\n const verdicts =\n parkedHere.length > 0\n ? [...(lane.verdicts ?? []), ...parkedHere].slice(-MAX_PARKED_VERDICTS)\n : lane.verdicts;\n const unchanged =\n verdicts === lane.verdicts &&\n commands.length === lane.commands.length &&\n commands.every((c, i) => c.seq === lane.commands[i]!.seq);\n if (unchanged) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands,\n ...(verdicts !== undefined && { verdicts }),\n },\n };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n};\n\nconst syncBacklog = (s: Session) => {\n const shared = s.shared;\n if (!shared) return syncBacklogInner(s);\n if (shared.syncQueued) return;\n shared.syncQueued = true;\n void transact(s, () => {\n shared.syncQueued = false;\n syncBacklogInner(s);\n }).catch(() => {\n shared.syncQueued = false;\n });\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 = boundRecord(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\nexport const failedCommands = (\n s: Session,\n): readonly StatewireClient.FailedCommand[] => {\n const parts = Object.values(s.record.lanes).flatMap((lane) =>\n lane.failed === undefined ? [] : [lane.failed],\n );\n const same =\n parts.length === s.failedParts.length &&\n parts.every((part, i) => part === s.failedParts[i]);\n if (!same) {\n s.failedParts = parts;\n s.failedList = parts.flat();\n }\n return s.failedList;\n};\n\nexport const MAX_FAILED_RETAINED = 256;\n\nconst boundFailed = (failed: readonly StatewireClient.FailedCommand[]) =>\n failed.length > MAX_FAILED_RETAINED\n ? [...failed].sort((a, b) => a.ts - b.ts).slice(-MAX_FAILED_RETAINED)\n : failed;\n\nconst boundRecord = (record: StatewireClient.SessionRecord) => {\n let lanes = record.lanes;\n for (const [protocol, lane] of Object.entries(lanes)) {\n if (lane.failed !== undefined && lane.failed.length > MAX_FAILED_RETAINED)\n lanes = {\n ...lanes,\n [protocol]: { ...lane, failed: boundFailed(lane.failed) },\n };\n }\n return lanes === record.lanes ? record : { ...record, lanes };\n};\n\nconst retainFailedInner = (\n s: Session,\n entry: Pending,\n failure: StatewireClient.SendFailure,\n) => {\n const lane = laneOf(s.record, entry.command.protocol);\n setRecord(\n s,\n withLane(s.record, entry.command.protocol, {\n ...lane,\n failed: boundFailed([\n ...(lane.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 );\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 > durableSeqOf(s, entry.command.protocol);\n if (!rides && !isEphemeral(s, entry.command.protocol))\n 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) =>\n p.command.protocol === entry.command.protocol &&\n p.seq < entry.seq &&\n 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\nconst requeue = (s: Session, survivors: Pending[]) => {\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};\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 = {};\n // Failed entries are user-owned history: they ride through every record replacement.\n const previous = s.record.lanes;\n adopt();\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(previous)) {\n const failed = lane.failed;\n if (failed === undefined || laneOf(s.record, protocol).failed === failed)\n continue;\n const current = laneOf(s.record, protocol);\n lanes = {\n ...lanes,\n [protocol]: {\n ...current,\n failed: boundFailed([...(current.failed ?? []), ...failed]),\n },\n };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n requeue(s, survivors);\n publish(s);\n wake(s);\n void pump(s);\n};\n\nconst resetRecord = (s: Session, clientId: string) =>\n rebaseRecord(s, () => setRecord(s, { clientId, lanes: {} }));\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 = boundRecord(stored);\n });\n // The host attributes frames by lease, and the lease is bound to the id\n // this attach was opened with.\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\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\n// An ephemeral lane dies with its attach: attempted statements can never be\n// answered, the rest re-stamp from 1 for the next attach.\nconst detachEphemeralLanes = (s: Session) => {\n const held = s.pending.filter((p) => isEphemeral(s, p.command.protocol));\n if (held.length === 0) return;\n s.pending = s.pending.filter((p) => !held.includes(p));\n settleLost(\n s,\n held.filter((p) => p.attempted),\n );\n requeue(\n s,\n held.filter((p) => !p.attempted),\n );\n publish(s);\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\n// Only a result verdict carries applied effects; the rest drop the overlay unapplied.\nconst settleVerdict = (s: Session, entry: Pending, cmd: StatewireCmd) => {\n const outcome = outcomeOf(cmd);\n if (outcome.ok) cover(s, entry);\n else s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, outcome);\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 if (isEphemeral(s, cmd.protocol)) return;\n s.shared.parked.push({\n protocol: cmd.protocol,\n verdict: {\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};\n\nconst handleCmd = (s: Session, cmd: StatewireCmd) => {\n if (cmd.dur === true && !isEphemeral(s, cmd.protocol)) {\n const watermark = Math.max(durableSeqOf(s, cmd.protocol), cmd.seq);\n s.durableSeq[cmd.protocol] = watermark;\n for (const entry of laneEntries(s, cmd.protocol)) {\n if (entry.seq <= watermark) entry.posted = true;\n }\n }\n if (cmd.type === undefined) return;\n const entry = s.pending.find(\n (p) => p.command.protocol === cmd.protocol && p.seq === cmd.seq,\n );\n if (cmd.type === \"applied\") {\n if (entry) cover(s, entry);\n return;\n }\n if (!entry) return;\n parkVerdict(s, cmd);\n settleVerdict(s, entry, cmd);\n};\n\nconst consumeVerdicts = (s: Session) => {\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const verdicts = lane.verdicts ?? [];\n const consumed = new Set<number>();\n for (const verdict of verdicts) {\n const entry = laneEntries(s, protocol).find((p) => p.seq === verdict.seq);\n if (!entry) continue;\n consumed.add(verdict.seq);\n settleVerdict(s, entry, { ...verdict, protocol });\n }\n if (consumed.size === 0) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.filter((c) => !consumed.has(c.seq)),\n verdicts: verdicts.filter((v) => !consumed.has(v.seq)),\n },\n };\n }\n if (lanes === s.record.lanes) return;\n setRecord(s, { ...s.record, lanes });\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 lane clock restarts at the watermark.\nconst sessionLostInner = (s: Session, protocol: string, seqWm: number) => {\n const held = laneEntries(s, protocol);\n settleLost(s, held);\n s.durableSeq[protocol] = seqWm;\n const failed = laneOf(s.record, protocol).failed;\n setRecord(\n s,\n withLane(s.record, protocol, {\n nextSeq: seqWm + 1,\n commands: [],\n ...(failed !== undefined && { failed }),\n }),\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 selectionOf = (\n syn: StatewireSyn,\n): StatewireProtocol.Selection | undefined => {\n if (syn.version === undefined || syn.protocols === undefined)\n return undefined;\n return {\n version: syn.version,\n protocols: syn.protocols.map(({ name, version, record }) => {\n if (version === undefined)\n return protocolError(`hello lane ${name} has no version`);\n return { name, version, ...(record !== undefined && { record }) };\n }),\n };\n};\n\nconst handleHello = (\n s: Session,\n { ops, syn }: { ops: unknown[]; syn: StatewireSyn },\n) => {\n if (s.attach === \"attached\") {\n s.ephemeralSeqs = {};\n detachEphemeralLanes(s);\n }\n for (const [protocol, value] of s.contexts) {\n if (s.attachContexts.get(protocol) === value)\n s.dirtyContexts.delete(protocol);\n else s.dirtyContexts.add(protocol);\n }\n s.attachContexts.clear();\n s.selection = selectionOf(syn);\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 const lanes = syn.protocols ?? [];\n s.ephemeral =\n lanes.length > 0 && lanes.every((lane) => lane.record === \"ephemeral\");\n if (s.ephemeral) s.deactivated = true;\n const attached = s.attachEntries;\n s.attachEntries = 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 for (const lane of lanes) {\n if (lane.record === \"ephemeral\") {\n s.ephemeralSeqs[lane.name] = Math.max(\n Object.hasOwn(s.ephemeralSeqs, lane.name)\n ? s.ephemeralSeqs[lane.name]!\n : 0,\n ...laneEntries(s, lane.name).map((p) => p.seq),\n );\n } else s.durableSeq[lane.name] = lane.seq ?? 0;\n }\n for (const entry of s.pending) entry.posted = attached.has(entry);\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 if (cmds.length > 0) syncBacklog(s);\n publishIngested(s);\n};\n\n// A retry-less {syn} refusal is the one session-loss verdict: a gap against\n// a durable lane's exact watermark settles that lane's history lost; a\n// pushback (retry present) or a gapless refusal only reconciles the resend queues.\nconst handleRefusal = (s: Session, syn: StatewireSyn) => {\n const lanes = (syn.protocols ?? []).filter(\n (lane): lane is { name: string; seq: number } => lane.seq !== undefined,\n );\n for (const { name, seq } of lanes) {\n const watermark = isEphemeral(s, name)\n ? seq\n : Math.max(seq, durableSeqOf(s, name));\n for (const entry of laneEntries(s, name))\n entry.posted = entry.seq <= watermark;\n }\n if (typeof syn.retry === \"number\") {\n s.resumeAt = Date.now() + retryHint(syn.retry);\n wake(s);\n void pump(s);\n return;\n }\n const gaps = lanes.filter(({ name, seq }) => {\n const first = laneEntries(s, name).find((p) => !p.posted);\n return (\n first !== undefined &&\n first.seq > Math.max(seq, durableSeqOf(s, name)) + 1\n );\n });\n for (const { name, seq } of gaps) {\n if (isEphemeral(s, name))\n protocolError(`gap on ephemeral lane ${name} after watermark ${seq}`);\n }\n if (gaps.length > 0) {\n transactBackground(\n s,\n () => {\n for (const { name, seq } of gaps) sessionLostInner(s, name, seq);\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 s.ephemeralSeqs = {};\n if (s.ephemeral) ephemeralDetach(s);\n else detachEphemeralLanes(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 entries: Pending[];\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. Ephemeral lanes ignore\n// the gate: they live on the attach and never wait for persistence.\nconst buildLanes = (\n s: Session,\n cmdGate: \"persisted\" | \"all\" | \"none\" = \"all\",\n): Lanes | null => {\n const entries: Pending[] = [];\n const last: Record<string, number> = {};\n const stopped = new Set<string>();\n for (const entry of s.pending) {\n if (entries.length >= MAX_COMMANDS_PER_FRAME) break;\n const protocol = entry.command.protocol;\n if (entry.posted || stopped.has(protocol)) continue;\n const gated =\n !isEphemeral(s, protocol) &&\n (cmdGate === \"none\" ||\n (cmdGate === \"persisted\" &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= laneOf(s.persistedRecord, protocol).nextSeq)));\n if (\n gated ||\n (Object.hasOwn(last, protocol) && entry.seq !== last[protocol]! + 1)\n ) {\n stopped.add(protocol);\n continue;\n }\n last[protocol] = entry.seq;\n entries.push(entry);\n }\n const ctx = [...s.dirtyContexts].map((protocol) => s.contexts.get(protocol)!);\n if (entries.length === 0 && ctx.length === 0) return null;\n return {\n frame: {\n ...(ctx.length > 0 && { ctx }),\n ...(entries.length > 0 && {\n cmd: entries.map((p) => {\n const { produced: _produced, ...command } = p.command;\n return { ...command, seq: p.seq };\n }),\n }),\n },\n entries,\n };\n};\n\nconst takeAttachLanes = (s: Session): StatewireFrame | null => {\n s.attachEntries = new Set();\n const wanted = s.lanesOnAttach;\n s.lanesOnAttach = false;\n for (const protocol of s.contexts.keys()) s.dirtyContexts.add(protocol);\n s.attachContexts = new Map(s.contexts);\n const lanes = buildLanes(s, wanted && s.sessionKnown ? \"persisted\" : \"none\");\n if (!lanes) return null;\n s.attachEntries = new Set(lanes.entries);\n for (const entry of lanes.entries) 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 (transport?.parked && s.pending.length === 0) 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.entries) 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 && lanes.entries.length > 0\n ? s.store.lock!(send)\n : send());\n } catch {\n if (!s.running || isFinished(s)) return;\n if (lanes.frame.ctx?.length) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n await waitForWake(s);\n continue;\n }\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 (\n epoch === s.attachEpoch &&\n (result.type === \"ok\" || result.type === \"refusal\")\n ) {\n for (const entry of lanes.frame.ctx ?? []) {\n if (s.contexts.get(entry.protocol) === entry)\n s.dirtyContexts.delete(entry.protocol);\n }\n }\n if (result.type === \"ok\") {\n if (epoch === s.attachEpoch) {\n for (const entry of lanes.entries) {\n if (s.pending.includes(entry)) {\n entry.posted = true;\n s.lifecycle?.onPosted?.(entry.inv);\n }\n }\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 protocol = command.protocol;\n const ephemeral = isEphemeral(s, protocol);\n const seq = ephemeral\n ? (Object.hasOwn(s.ephemeralSeqs, protocol)\n ? s.ephemeralSeqs[protocol]!\n : 0) + 1\n : Math.max(\n laneOf(s.record, protocol).nextSeq,\n durableSeqOf(s, protocol) + 1,\n );\n const entry: Pending = {\n seq,\n command,\n inv: {\n 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 if (ephemeral) s.ephemeralSeqs[protocol] = seq;\n else\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...laneOf(s.record, protocol),\n nextSeq: seq + 1,\n commands: mergeBacklog(s, protocol),\n }),\n );\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 // A send queued behind the lock before this tab unmounted still lands in\n // the shared journal: another sharer adopts and replays it.\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\nconst offered = (s: Session, protocol: string) => {\n const offers = protocolOffers(s.options);\n return offers === \"*\" || offers.some((offer) => offer.name === protocol);\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 let adopted = false;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (!offered(s, protocol)) continue;\n const known = new Set(laneEntries(s, protocol).map((p) => p.seq));\n for (const { seq, ...command } of lane.commands) {\n if (known.has(seq)) continue;\n const params =\n command.meta === undefined\n ? command.params\n : (reviveValue(\n structuredClone(command.params),\n command.meta,\n ) as unknown[]);\n const entry: Pending = {\n seq,\n command: { protocol, ...command },\n inv: {\n 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 adopted = true;\n }\n }\n if (adopted) 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 const negotiated = s.selection\n ? s.selection.protocols.some((p) => p.name === protocol)\n : offered(s, protocol);\n if (!negotiated)\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\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 (laneOf(s.record, entry.protocol).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 lane = laneOf(s.record, entry.protocol);\n const found = findFailed(s, entry);\n if (found === undefined) throw unknownFailed(entry);\n setRecord(\n s,\n withLane(s.record, entry.protocol, {\n ...lane,\n failed: (lane.failed ?? []).filter((f) => f !== found),\n }),\n );\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(structuredClone(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\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 protocol: string,\n command: StatewireClient.SessionCommand,\n current: NonNullable<StatewireClient.SessionCommand[\"produced\"]>,\n) => {\n if (\n !command.produced ||\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 === protocol);\n const offer = current.protocols.find((p) => p.name === protocol);\n return (\n produced !== undefined &&\n offer !== undefined &&\n inRange(produced.version, offer)\n );\n};\n\nconst validateLanes = (record: StatewireClient.SessionRecord) => {\n if (\n typeof record.lanes !== \"object\" ||\n record.lanes === null ||\n Object.values(record.lanes).some((lane) => !Array.isArray(lane.commands))\n )\n throw new Error(\n \"statewire: session storage loaded a record without command lanes\",\n );\n};\n\nconst loadSessionRecord = (\n store: StatewireClient.SessionStorage,\n options: StatewireSessionOptions,\n) => {\n let stored = store.load();\n if (stored !== null) validateLanes(stored);\n const current = {\n wire: options.wireVersion ?? { version: WIRE_VERSION },\n protocols: protocolOffers(options),\n };\n const compatible = (record: StatewireClient.SessionRecord) =>\n Object.entries(record.lanes).every(([protocol, lane]) =>\n lane.commands.every((command) =>\n storedCommandCompatible(protocol, command, current),\n ),\n );\n if (stored !== null && !compatible(stored)) {\n if (!store.migrate)\n throw new Error(\"statewire: stored commands require a storage migration\");\n stored = store.migrate(stored, current);\n if (stored !== null) {\n validateLanes(stored);\n if (!compatible(stored))\n throw new Error(\"statewire: migrated commands are incompatible\");\n store.save(stored);\n }\n }\n const record =\n stored === null\n ? { clientId: newClientId(), lanes: {} }\n : boundRecord(stored);\n if (record !== stored) store.save(record);\n return record;\n};\n\nexport const setContext = (\n s: Session,\n protocol: string,\n value: Statewire.Context,\n): void => {\n if (\n s.selection\n ? !s.selection.protocols.some((p) => p.name === protocol)\n : !offered(s, protocol)\n )\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n s.contexts.set(protocol, encodeContext(protocol, value));\n s.dirtyContexts.add(protocol);\n wake(s);\n void pump(s);\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(), lanes: {} };\n const session: Session = {\n options,\n configuredContext: options.context,\n contexts: new Map(\n Object.entries(options.context ?? {}).map(([protocol, value]) => [\n protocol,\n encodeContext(protocol, value),\n ]),\n ),\n dirtyContexts: new Set(Object.keys(options.context ?? {})),\n attachContexts: new Map(),\n selection: undefined,\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 ? {\n txq: Promise.resolve(),\n syncQueued: false,\n parked: [],\n unsubscribe: null,\n }\n : false,\n ephemeral: false,\n deactivated: false,\n sessionKnown: false,\n durableSeq: {},\n ephemeralSeqs: {},\n resumeAt: 0,\n idle: false,\n onSessionLost: undefined,\n onDone: undefined,\n lanesOnAttach: false,\n attachEntries: new Set(),\n frameFailures: 0,\n pending: [],\n failedList: [],\n failedParts: [],\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 useEffect(() => {\n if (s.configuredContext === options.context) return;\n s.configuredContext = options.context;\n for (const [protocol, value] of Object.entries(options.context ?? {}))\n setContext(s, protocol, value);\n }, [s, options.context]);\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 { setTransport };\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { StatewireDocuments } from "../wire/documents.js";
2
2
  import { StatewireProtocol } from "../wire/protocol.js";
3
3
  import { StatewireClient } from "../statewire.js";
4
+ import { Statewire } from "../types.js";
4
5
  //#region src/client/sessionStore.d.ts
5
6
  /** The session storage `useStatewire` mounts, read by the transport's session. */
6
7
  declare const SessionStorageContext: import("react").Context<StatewireClient.SessionStorage | undefined>;
@@ -9,6 +10,7 @@ declare const ProtocolContext: import("react").Context<StatewireProtocol.Options
9
10
  /** Link options `useStatewire` hands down to whichever transport it mounts. */
10
11
  declare const LinkContext: import("react").Context<{
11
12
  isNew?: boolean | undefined;
13
+ context?: Readonly<Record<string, Statewire.Context>> | undefined;
12
14
  }>;
13
15
  declare const DocumentStorageContext: import("react").Context<StatewireDocuments.Storage | undefined>;
14
16
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"sessionStore.d.ts","names":[],"sources":["../../src/client/sessionStore.ts"],"mappings":";;;;;cAMa,uCAAqB,QAAA,gBAAA;cAIrB,gCAA+B,gBAAgB;cAU/C,iCAAe,QAAA,kBAAA;;cAGf,6BAAW;EAA2B;;cAEtC,wCAAsB,QAAA,mBAAA"}
1
+ {"version":3,"file":"sessionStore.d.ts","names":[],"sources":["../../src/client/sessionStore.ts"],"mappings":";;;;;;cAOa,uCAAqB,QAAA,gBAAA;cAIrB,gCAA+B,gBAAgB;cAU/C,iCAAe,QAAA,kBAAA;;cAGf,6BAAW;EACd;EACE,UAAA,SAAS,eAAe,UAAU;;cAGjC,wCAAsB,QAAA,mBAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"sessionStore.js","names":["StatewireDocuments","createContext","StatewireProtocol","StatewireClient","SessionStorageContext","SessionStorage","undefined","createMemorySessionStore","record","SessionRecord","load","save","next","ProtocolContext","Options","LinkContext","isNew","DocumentStorageContext","Storage"],"sources":["../../src/client/sessionStore.ts"],"sourcesContent":["import type { StatewireDocuments } from \"../wire/documents\";\nimport { createContext } from \"react\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport type { StatewireClient } from \"../statewire\";\n\n/** The session storage `useStatewire` mounts, read by the transport's session. */\nexport const SessionStorageContext = createContext<\n StatewireClient.SessionStorage | undefined\n>(undefined);\n\nexport const createMemorySessionStore = (): StatewireClient.SessionStorage => {\n let record: StatewireClient.SessionRecord | null = null;\n return {\n load: () => record,\n save: (next) => {\n record = next;\n },\n };\n};\n\nexport const ProtocolContext = createContext<StatewireProtocol.Options>({});\n\n/** Link options `useStatewire` hands down to whichever transport it mounts. */\nexport const LinkContext = createContext<{ isNew?: boolean | undefined }>({});\n\nexport const DocumentStorageContext = createContext<\n StatewireDocuments.Storage | undefined\n>(undefined);\n"],"mappings":";;;AAMA,MAAaI,wBAAwBH,cAEnCK,KAAAA,CAAS;AAEX,MAAaC,iCAAiE;CAC5E,IAAIC,SAA+C;CACnD,OAAO;EACLE,YAAYF;EACZG,OAAOC,SAAS;GACdJ,SAASI;EACX;CACF;AACF;AAEA,MAAaC,kBAAkBZ,cAAyC,CAAC,CAAC;;AAG1E,MAAac,cAAcd,cAA+C,CAAC,CAAC;AAE5E,MAAagB,yBAAyBhB,cAEpCK,KAAAA,CAAS"}
1
+ {"version":3,"file":"sessionStore.js","names":["StatewireDocuments","createContext","StatewireProtocol","Statewire","StatewireClient","SessionStorageContext","SessionStorage","undefined","createMemorySessionStore","record","SessionRecord","load","save","next","ProtocolContext","Options","LinkContext","isNew","context","Readonly","Record","Context","DocumentStorageContext","Storage"],"sources":["../../src/client/sessionStore.ts"],"sourcesContent":["import type { StatewireDocuments } from \"../wire/documents\";\nimport { createContext } from \"react\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\n\n/** The session storage `useStatewire` mounts, read by the transport's session. */\nexport const SessionStorageContext = createContext<\n StatewireClient.SessionStorage | undefined\n>(undefined);\n\nexport const createMemorySessionStore = (): StatewireClient.SessionStorage => {\n let record: StatewireClient.SessionRecord | null = null;\n return {\n load: () => record,\n save: (next) => {\n record = next;\n },\n };\n};\n\nexport const ProtocolContext = createContext<StatewireProtocol.Options>({});\n\n/** Link options `useStatewire` hands down to whichever transport it mounts. */\nexport const LinkContext = createContext<{\n isNew?: boolean | undefined;\n context?: Readonly<Record<string, Statewire.Context>> | undefined;\n}>({});\n\nexport const DocumentStorageContext = createContext<\n StatewireDocuments.Storage | undefined\n>(undefined);\n"],"mappings":";;;AAOA,MAAaK,wBAAwBJ,cAEnCM,KAAAA,CAAS;AAEX,MAAaC,iCAAiE;CAC5E,IAAIC,SAA+C;CACnD,OAAO;EACLE,YAAYF;EACZG,OAAOC,SAAS;GACdJ,SAASI;EACX;CACF;AACF;AAEA,MAAaC,kBAAkBb,cAAyC,CAAC,CAAC;;AAG1E,MAAae,cAAcf,cAGxB,CAAC,CAAC;AAEL,MAAaqB,yBAAyBrB,cAEpCM,KAAAA,CAAS"}
@@ -33,6 +33,7 @@ type CommandsSubmission = {
33
33
  params: readonly unknown[];
34
34
  clientId?: string;
35
35
  caller?: StatewireHost.Caller;
36
+ context?: Statewire.Context;
36
37
  attach?: StatewireHost.Attach;
37
38
  onApplied?: () => void;
38
39
  onSettle?: (outcome: CommandsOutcome) => void;
@@ -46,7 +47,7 @@ type CommandsHost = {
46
47
  };
47
48
  declare const getCommandsHost: (commands: object) => CommandsHost | undefined;
48
49
  declare const bindCommandsHost: (commands: object, host: CommandsHost) => void;
49
- declare const useStatewireCommands: <THandlers extends Statewire.Commands>(commands: (THandlers & ThisType<StatewireHost.Ctx>) | undefined | null | false) => Statewire.CommandsProxy<StatewireHost.HandledCommands<THandlers>>;
50
+ declare const useStatewireCommands: <THandlers extends Statewire.Commands>(commands: (THandlers & ThisType<StatewireHost.Ctx>) | undefined | null | false, options?: StatewireHost.CommandsOptions) => Statewire.CommandsProxy<StatewireHost.HandledCommands<THandlers>>;
50
51
  //#endregion
51
52
  export { CommandsHost, CommandsInvocation, CommandsListener, CommandsOutcome, CommandsSubmission, bindCommandsHost, documentIdentity, getCommandsHost, getStateHost, useStatewireCommands, useStatewireState };
52
53
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","names":[],"sources":["../../src/host/host.ts"],"mappings":";;;cAkBa,mBAAoB,kBAAkB;;cAItC,eACX,kBACC,cAAc;cAeJ,oBAAqB,QAChC,YAAY,qBACD,QAAQ,cAAc,SAAS;KAqGhC;WACD;WACA;WACA;WACA;WACA;WACA;;KAGC;EACN;EAAkB;;EAClB;EAAkB;;KAEZ;EACV,UAAU,KAAK;EACf,YAAY,KAAK;EACjB,YAAY,KAAK;;EAEjB,aAAa,KAAK;EAClB,WAAW,KAAK,oBAAoB,SAAS;;KAGnC;EACV;EACA;EACA;EACA,SAAS,cAAc;EACvB,SAAS,cAAc;EACvB;EACA,YAAY,SAAS;;KAGX;EACV,cAAc,UAAU;EACxB,UAAU,MAAM,uBAAuB;;EAEvC;EACA;;cAKW,kBAAmB,qBAAmB;cAGtC,mBAAoB,kBAAkB,MAAM;cAiO5C,uBAAwB,kBAAkB,UAAU,UAC/D,WACK,YAAY,SAAS,cAAc,qCAIvC,UAAU,cAAc,cAAc,gBAAgB"}
1
+ {"version":3,"file":"host.d.ts","names":[],"sources":["../../src/host/host.ts"],"mappings":";;;cAmBa,mBAAoB,kBAAkB;;cAItC,eACX,kBACC,cAAc;cAeJ,oBAAqB,QAChC,YAAY,qBACD,QAAQ,cAAc,SAAS;KAqGhC;WACD;WACA;WACA;WACA;WACA;WACA;;KAGC;EACN;EAAkB;;EAClB;EAAkB;;KAEZ;EACV,UAAU,KAAK;EACf,YAAY,KAAK;EACjB,YAAY,KAAK;;EAEjB,aAAa,KAAK;EAClB,WAAW,KAAK,oBAAoB,SAAS;;KAGnC;EACV;EACA;EACA;EACA,SAAS,cAAc;EACvB,UAAU,UAAU;EACpB,SAAS,cAAc;EACvB;EACA,YAAY,SAAS;;KAGX;EACV,cAAc,UAAU;EACxB,UAAU,MAAM,uBAAuB;;EAEvC;EACA;;cAKW,kBAAmB,qBAAmB;cAGtC,mBAAoB,kBAAkB,MAAM;cA0O5C,uBAAwB,kBAAkB,UAAU,UAC/D,WACK,YAAY,SAAS,cAAc,kCAIxC,UAAU,cAAc,oBACvB,UAAU,cAAc,cAAc,gBAAgB"}
package/dist/host/host.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { captureContext } from "../wire/context.js";
1
2
  import { applyOps, sanitizeValue } from "../wire/ops.js";
2
3
  import { StatewireReject } from "./engine.js";
3
4
  import { createStateDraft } from "./draft.js";
@@ -106,17 +107,20 @@ const LOCAL_CALLER = Object.freeze({
106
107
  auth: void 0,
107
108
  isConnected: true
108
109
  });
109
- const toSendError = (error) => error instanceof StatewireSendError ? error : error instanceof StatewireReject ? new StatewireSendError({
110
- fate: "rejected",
111
- cause: "server",
112
- message: error.message,
113
- ...error.code !== void 0 && { code: error.code },
114
- ...error.payload !== void 0 && { payload: error.payload }
115
- }) : new StatewireSendError({
116
- fate: "failed",
117
- cause: "server",
118
- message: error instanceof Error ? error.message : String(error)
119
- });
110
+ const toSendError = (error) => {
111
+ if (!(error instanceof StatewireSendError) && !(error instanceof StatewireReject)) console.error("statewire command failed", error);
112
+ return error instanceof StatewireSendError ? error : error instanceof StatewireReject ? new StatewireSendError({
113
+ fate: "rejected",
114
+ cause: "server",
115
+ message: error.message,
116
+ ...error.code !== void 0 && { code: error.code },
117
+ ...error.payload !== void 0 && { payload: error.payload }
118
+ }) : new StatewireSendError({
119
+ fate: "failed",
120
+ cause: "server",
121
+ message: "the command failed"
122
+ });
123
+ };
120
124
  const applyInvocation = (cell, inv) => {
121
125
  if (inv.applied) return;
122
126
  inv.applied = true;
@@ -205,6 +209,7 @@ const dispatch = (cell, call) => {
205
209
  const attach = call.origin?.attach;
206
210
  const ctx = {
207
211
  caller: call.origin?.caller ?? LOCAL_CALLER,
212
+ context: call.context ?? call.origin?.context ?? Object.freeze({}),
208
213
  get attach() {
209
214
  if (attach === void 0) throw new Error("statewire: in-process dispatch has no attach");
210
215
  return attach;
@@ -258,9 +263,10 @@ const watchStall = (cell) => {
258
263
  if (cell.handlers === null && cell.queue.length > 0 && !cell.unmounted) console.warn(`statewire: ${cell.queue.length} buffered command(s) waiting over ${STALL_WARN_MS}ms — did the host forget to arm useStatewireCommands?`);
259
264
  }, STALL_WARN_MS);
260
265
  };
261
- const useStatewireCommands = (commands) => {
266
+ const useStatewireCommands = (commands, options) => {
262
267
  const [built] = useState(() => {
263
268
  const cell = {
269
+ context: void 0,
264
270
  handlers: null,
265
271
  queue: [],
266
272
  active: /* @__PURE__ */ new Map(),
@@ -276,6 +282,7 @@ const useStatewireCommands = (commands) => {
276
282
  return;
277
283
  }
278
284
  cell.queue.push({
285
+ context: captureContext(cell.context?.() ?? {}),
279
286
  method,
280
287
  params,
281
288
  ts: Date.now(),
@@ -315,6 +322,7 @@ const useStatewireCommands = (commands) => {
315
322
  proxy
316
323
  };
317
324
  });
325
+ built.cell.context = options?.context;
318
326
  useEffect(() => {
319
327
  const { cell: cell_0 } = built;
320
328
  cell_0.unmounted = false;