statewire 0.24.1 → 0.24.3

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.
@@ -50,6 +50,8 @@ export type Conn = {
50
50
  connection: StatewireClient.Connection;
51
51
  parked: boolean;
52
52
  lease: string | null;
53
+ /** Names every attach of this connection, so a host retires the earlier ones (2026-11-02). */
54
+ attacher: string;
53
55
  attempt: number;
54
56
  authDenials: number;
55
57
  authStale: boolean;
@@ -74,6 +76,8 @@ export declare const settleFin: (c: Conn, fin: StatewireHost.Fin) => AttemptOutc
74
76
  export declare const handleEnvelope: (c: Conn, value: unknown) => AttemptOutcome | null;
75
77
  export declare const unsupportedVersion: (c: Conn, version: string) => AttemptOutcome;
76
78
  export declare const resolveHeaders: (headers: StatewireClient.HeadersOption | undefined, staleAuth: boolean) => Promise<Headers>;
79
+ /** Names this connection, so a host retires its earlier attaches before the hello. */
80
+ export declare const replacing: (c: Conn, headers: Headers) => void;
77
81
  export declare const attachFrame: (c: Conn, headers: StatewireClient.HeadersOption | undefined) => Promise<{
78
82
  headers: Headers;
79
83
  body: string;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/client/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/client/connection.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import { negotiationHeaders, parseNegotiation, validateSelection } from "../wire/protocol.js";
1
+ import { ATTACHER_HEADER, negotiationHeaders, parseNegotiation, validateSelection } from "../wire/protocol.js";
2
2
  import { reviveDocumentValue } from "../document.js";
3
3
  import { reviveOps } from "../wire/meta.js";
4
4
  import { backoff, retryHint, timing } from "./timing.js";
5
5
  import { isStorageError } from "./storageError.js";
6
+ import { randomId } from "../util/randomId.js";
6
7
  import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
7
8
  import { flushTapSync } from "@assistant-ui/tap";
8
9
  // src/client/connection.ts
@@ -385,11 +386,16 @@ const unsupportedVersion = (c, version) => flushTapSync(() => handleEnvelope(c,
385
386
  message: `unsupported protocol version: ${version || "\"\""}`
386
387
  } })) ?? "stop";
387
388
  const resolveHeaders = async (headers, staleAuth) => new Headers(typeof headers === "function" ? await headers({ staleAuth }) : headers);
389
+ /** Names this connection, so a host retires its earlier attaches before the hello. */
390
+ const replacing = (c, headers) => {
391
+ headers.set(ATTACHER_HEADER, c.attacher);
392
+ };
388
393
  const attachFrame = async (c, headers) => {
389
394
  const pending = c.ctx.beforeAttach?.();
390
395
  if (pending) await pending;
391
396
  const resolved = await resolveHeaders(headers, c.authStale);
392
397
  for (const [name, value] of Object.entries(negotiationHeaders(c.negotiation ?? {}))) if (!resolved.has(name)) resolved.set(name, value);
398
+ replacing(c, resolved);
393
399
  c.negotiation = parseNegotiation(resolved);
394
400
  c.authStale = false;
395
401
  const persistence = c.ctx.beforeAttach?.();
@@ -411,6 +417,7 @@ const useLink = (props) => {
411
417
  const conn = {
412
418
  parked: props.isNew ?? false,
413
419
  lease: null,
420
+ attacher: randomId(),
414
421
  attempt: 0,
415
422
  authDenials: 0,
416
423
  authStale: false,
@@ -506,6 +513,6 @@ const useLink = (props) => {
506
513
  return link;
507
514
  };
508
515
  const classify = (timeout) => /* @__PURE__ */ new Error(timeout.aborted ? "timeout" : "network");
509
- export { TERMINAL, attachFrame, classify, handleEnvelope, resolveHeaders, settleFin, unsupportedVersion, useLink, validateRefusalSyn };
516
+ export { TERMINAL, attachFrame, classify, handleEnvelope, replacing, resolveHeaders, settleFin, unsupportedVersion, useLink, validateRefusalSyn };
510
517
 
511
518
  //# sourceMappingURL=connection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","names":["negotiationHeaders","validateSelection","parseNegotiation","StatewireProtocol","useEffect","useRef","useState","flushTapSync","reviveOps","reviveValue","backoff","retryHint","timing","isStorageError","ConnectionState","RemoteLink","StatewireFrame","StatewireRemoteProps","StatewireSubmitResult","StatewireClient","StatewireHost","Episode","cause","message","code","TERMINAL","const","StatewireCmd","protocol","seq","type","payload","meta","dur","StatewireSyn","version","protocols","name","record","id","idle","retry","StatewireEnvelope","ops","cmd","next","syn","fin","Fin","Gate","latched","wake","newGate","undefined","takeGate","g","was","waitGate","timeoutMs","Promise","resolve","timer","setTimeout","clearTimeout","openGate","AttemptOutcome","Conn","negotiation","Options","connection","Connection","parked","lease","attempt","authDenials","authStale","liveAt","retryAt","error","ConnectionError","episode","awaitingHello","held","gate","abort","AbortController","lifetime","ctx","onError","onChange","attemptOnce","notify","reconnect","sameState","a","b","status","nextRetryAt","lastError","reason","setStatus","c","stopForError","Error","degraded","protocolError","isObject","value","Record","Array","isArray","isNonnegativeSafeInteger","Number","isSafeInteger","isPositiveSafeInteger","validateOptionalString","field","validateSynProtocols","hello","entry","validateSynScalars","validateRefusalSyn","validateCmd","validateFin","validateEnvelope","releaseHeld","length","onCmds","cmdsOf","env","snapshotOf","helloSynOf","isWakeHello","handleHello","onHello","onIdle","Date","now","warnedUnknownSynFact","warnUnknownSynFact","console","warn","deliverSyn","onRefusal","Object","keys","deliverEnvelope","onOps","cmds","push","settleFin","finish","denial","terminal","report","assign","onFinish","handleEnvelope","dialing","scheduleRetry","failure","immediate","backoffResetMs","delay","Math","max","reconnectConn","run","alive","outcome","pending","beforeAttach","signal","aborted","SyntaxError","test","onDetach","unsupportedVersion","resolveHeaders","headers","HeadersOption","staleAuth","Headers","attachFrame","resolved","entries","has","set","persistence","lanes","takeAttachLanes","body","JSON","stringify","fromEntries","useLink","props","url","isNew","send","frame","latest","current","setConnection","conn","link","storageFailed","protocolFailed","wireVersion","applicationProtocols","classify","timeout","AbortSignal","reviveValue"],"sources":["../../src/client/connection.ts"],"sourcesContent":["import {\n negotiationHeaders,\n validateSelection,\n parseNegotiation,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { reviveOps, reviveValue } from \"../wire/meta\";\nimport { backoff, retryHint, timing } from \"./timing\";\nimport { isStorageError } from \"./storageError\";\nimport type {\n ConnectionState,\n RemoteLink,\n StatewireFrame,\n StatewireRemoteProps,\n StatewireSubmitResult,\n} from \"../transports/sse\";\nimport type { StatewireClient } from \"../statewire\";\nimport type { StatewireHost } from \"../host\";\n\nexport type Episode = {\n cause: \"dropped\" | \"reconnect\" | \"error\" | \"unauthorized\";\n message?: string;\n code?: string;\n};\n\n/** The terminal cmd verdict types; \"applied\" is the sole non-terminal type. */\nexport const TERMINAL = [\n \"result\",\n \"rejected\",\n \"failed\",\n \"crashed\",\n \"expired\",\n] as const;\n\nexport type StatewireCmd = {\n protocol: string;\n seq: number;\n type?: \"applied\" | (typeof TERMINAL)[number];\n code?: string;\n message?: string;\n payload?: unknown;\n meta?: unknown;\n /** Cumulative: resending through this seq will never be needed. */\n dur?: boolean;\n};\n\nexport type StatewireSyn = {\n version?: string;\n protocols?: {\n name: string;\n version?: string;\n record?: \"ephemeral\";\n seq?: number;\n }[];\n id?: string;\n idle?: boolean;\n retry?: number;\n};\n\nexport type StatewireEnvelope = {\n ops?: unknown[];\n cmd?: StatewireCmd[];\n next?: true;\n idle?: boolean;\n syn?: StatewireSyn;\n fin?: StatewireHost.Fin;\n};\n\nexport type Gate = { latched: boolean; wake: (() => void) | undefined };\n\nconst newGate = (): Gate => ({ latched: false, wake: undefined });\n\nconst takeGate = (g: Gate) => {\n const was = g.latched;\n g.latched = false;\n return was;\n};\n\nconst waitGate = (g: Gate, timeoutMs?: number) => {\n if (g.latched) {\n g.latched = false;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n const timer =\n timeoutMs === undefined\n ? undefined\n : setTimeout(() => {\n g.wake = undefined;\n resolve();\n }, timeoutMs);\n g.wake = () => {\n clearTimeout(timer);\n g.wake = undefined;\n resolve();\n };\n });\n};\n\nconst openGate = (g: Gate) => {\n if (g.wake) g.wake();\n else g.latched = true;\n};\n\nexport type AttemptOutcome = \"stop\" | \"reattach\" | \"ended\" | \"idle\";\n\nexport type Conn = {\n negotiation?: StatewireProtocol.Options;\n connection: StatewireClient.Connection;\n parked: boolean;\n lease: string | null;\n attempt: number;\n authDenials: number;\n authStale: boolean;\n liveAt: number | null;\n retryAt: number;\n error: StatewireClient.ConnectionError | undefined;\n episode: Episode | null;\n awaitingHello: boolean;\n held: StatewireCmd[];\n gate: Gate;\n abort: AbortController | null;\n lifetime: AbortController | null;\n ctx: StatewireRemoteProps;\n onError: (error: StatewireClient.ConnectionError) => void;\n onChange: (connection: StatewireClient.Connection) => void;\n attemptOnce: (abort: AbortController) => Promise<AttemptOutcome>;\n notify: (connection: StatewireClient.Connection) => void;\n reconnect: () => void;\n};\n\nconst sameState = (a: ConnectionState, b: ConnectionState): boolean => {\n if (a.status !== b.status) return false;\n if (a.status === \"retrying\" && b.status === \"retrying\") {\n return (\n a.attempt === b.attempt &&\n a.cause === b.cause &&\n a.code === b.code &&\n a.nextRetryAt === b.nextRetryAt &&\n a.lastError === b.lastError &&\n a.message === b.message\n );\n }\n if (a.status === \"standby\" && b.status === \"standby\") {\n return a.reason === b.reason;\n }\n if (a.status === \"stopped\" && b.status === \"stopped\") {\n return (\n a.reason === b.reason &&\n a.message === b.message &&\n a.payload === b.payload\n );\n }\n return true;\n};\n\nconst setStatus = (c: Conn, next: ConnectionState) => {\n if (sameState(next, c.connection) && c.connection.error === c.error) return;\n c.connection = {\n ...next,\n ...(c.error === undefined ? {} : { error: c.error }),\n reconnect: c.reconnect,\n };\n c.notify(c.connection);\n c.onChange(c.connection);\n};\n\nconst stopForError = ({\n connection: c,\n error,\n reason,\n}: {\n connection: Conn;\n error: Error;\n reason: \"storage-error\" | \"protocol-error\";\n}) => {\n c.error = error;\n c.onError(error);\n flushTapSync(() =>\n setStatus(c, {\n status: \"stopped\",\n reason,\n degraded: true,\n message: error.message,\n }),\n );\n c.abort?.abort();\n};\n\nconst protocolError = (message: string): never => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isNonnegativeSafeInteger = (value: unknown): value is number =>\n Number.isSafeInteger(value) && (value as number) >= 0;\n\nconst isPositiveSafeInteger = (value: unknown): value is number =>\n Number.isSafeInteger(value) && (value as number) > 0;\n\nconst validateOptionalString = (value: unknown, field: string): void => {\n if (value !== undefined && typeof value !== \"string\") {\n protocolError(`${field} must be a string`);\n }\n};\n\nconst validateSynProtocols = (value: unknown, hello: boolean): void => {\n if (value === undefined) return;\n if (!Array.isArray(value))\n return protocolError(\"syn.protocols must be an array\");\n for (const entry of value) {\n if (!isObject(entry))\n return protocolError(\"syn.protocols entry must be an object\");\n if (typeof entry[\"name\"] !== \"string\")\n protocolError(\"syn.protocols[].name must be a string\");\n if (\n !hello &&\n (entry[\"version\"] !== undefined || entry[\"record\"] !== undefined)\n )\n protocolError(\"invalid mid-stream syn\");\n if (\n hello\n ? !isNonnegativeSafeInteger(entry[\"seq\"])\n : entry[\"seq\"] !== undefined && !isNonnegativeSafeInteger(entry[\"seq\"])\n )\n protocolError(\"syn.protocols[].seq must be a nonnegative safe integer\");\n if (hello && entry[\"record\"] === \"ephemeral\" && entry[\"seq\"] !== 0)\n protocolError(\"ephemeral lane hello seq must be 0\");\n }\n};\n\nconst validateSynScalars = (syn: Record<string, unknown>, hello: boolean) => {\n validateSynProtocols(syn[\"protocols\"], hello);\n if (syn[\"retry\"] !== undefined && !isNonnegativeSafeInteger(syn[\"retry\"])) {\n protocolError(\"syn.retry must be a nonnegative safe integer\");\n }\n validateOptionalString(syn[\"id\"], \"syn.id\");\n if (syn[\"idle\"] !== undefined && typeof syn[\"idle\"] !== \"boolean\") {\n protocolError(\"syn.idle must be a boolean\");\n }\n};\n\nexport const validateRefusalSyn = (value: unknown): StatewireSyn => {\n if (!isObject(value)) return protocolError(\"syn must be an object\");\n validateSynScalars(value, false);\n if (\n value[\"id\"] !== undefined ||\n value[\"idle\"] !== undefined ||\n value[\"version\"] !== undefined\n ) {\n protocolError(\"invalid refusal syn\");\n }\n if (value[\"protocols\"] === undefined && value[\"retry\"] === undefined) {\n protocolError(\"refusal syn has no watermarks or retry\");\n }\n return value as StatewireSyn;\n};\n\nconst validateCmd = (value: unknown): value is StatewireCmd => {\n if (!isObject(value)) return protocolError(\"cmd entry must be an object\");\n if (typeof value[\"protocol\"] !== \"string\") {\n protocolError(\"cmd.protocol must be a string\");\n }\n if (!isPositiveSafeInteger(value[\"seq\"])) {\n protocolError(\"cmd.seq must be a positive safe integer\");\n }\n validateOptionalString(value[\"type\"], \"cmd.type\");\n validateOptionalString(value[\"code\"], \"cmd.code\");\n validateOptionalString(value[\"message\"], \"cmd.message\");\n if (value[\"dur\"] !== undefined && value[\"dur\"] !== true) {\n protocolError(\"cmd.dur must be true\");\n }\n return true;\n};\n\nconst validateFin = (value: unknown): value is StatewireHost.Fin => {\n if (!isObject(value)) return protocolError(\"fin must be an object\");\n if (typeof value[\"reason\"] !== \"string\") {\n protocolError(\"fin.reason must be a string\");\n }\n validateOptionalString(value[\"message\"], \"fin.message\");\n validateOptionalString(value[\"code\"], \"fin.code\");\n if (\n value[\"status\"] !== undefined &&\n !isNonnegativeSafeInteger(value[\"status\"])\n )\n protocolError(\"fin.status must be a nonnegative safe integer\");\n if (value[\"retry\"] !== undefined && !isNonnegativeSafeInteger(value[\"retry\"]))\n protocolError(\"fin.retry must be a nonnegative safe integer\");\n return true;\n};\n\nconst validateEnvelope = (value: unknown): StatewireEnvelope => {\n if (!isObject(value)) return protocolError(\"packet must be an object\");\n if (value[\"ops\"] !== undefined && !Array.isArray(value[\"ops\"])) {\n protocolError(\"ops must be an array\");\n }\n if (value[\"cmd\"] !== undefined) {\n const cmd = value[\"cmd\"];\n if (!Array.isArray(cmd)) return protocolError(\"cmd must be an array\");\n for (const entry of cmd) validateCmd(entry);\n }\n if (value[\"idle\"] !== undefined && typeof value[\"idle\"] !== \"boolean\") {\n protocolError(\"idle must be a boolean\");\n }\n if (value[\"next\"] !== undefined) {\n if (value[\"next\"] !== true) protocolError(\"next must be true\");\n if (\n value[\"cmd\"] === undefined ||\n value[\"ops\"] !== undefined ||\n value[\"fin\"] !== undefined\n ) {\n protocolError(\"next must ride a cmd-only packet\");\n }\n }\n if (value[\"fin\"] !== undefined) validateFin(value[\"fin\"]);\n return value as StatewireEnvelope;\n};\n\n// A hold's release delivers, never settles: fin and bare close both drain it.\nconst releaseHeld = (c: Conn) => {\n if (c.held.length === 0) return;\n const held = c.held;\n c.held = [];\n c.ctx.onCmds(held);\n};\n\nconst cmdsOf = (env: StatewireEnvelope): StatewireCmd[] => {\n if (env.cmd === undefined) return [];\n return env.cmd;\n};\n\nconst snapshotOf = (env: StatewireEnvelope): unknown[] => {\n const ops = env.ops;\n if (ops === undefined) return protocolError(\"hello missing snapshot\");\n return reviveOps(ops);\n};\n\nconst helloSynOf = (env: StatewireEnvelope): StatewireSyn => {\n if (!isObject(env.syn)) return protocolError(\"expected hello\");\n validateSynScalars(env.syn, true);\n if (env.syn[\"retry\"] !== undefined) {\n protocolError(\"hello syn cannot carry retry\");\n }\n return env.syn as StatewireSyn;\n};\n\n// A host that woke on a retained socket re-sends its hello; the snapshot\n// replaces the session the way a fresh attach would.\nconst isWakeHello = (env: StatewireEnvelope) =>\n isObject(env.syn) && env.syn[\"version\"] !== undefined;\n\nconst handleHello = (c: Conn, env: StatewireEnvelope) => {\n const syn = helloSynOf(env);\n if (c.negotiation !== undefined) validateSelection(syn, c.negotiation);\n const ops = snapshotOf(env);\n c.ctx.onHello({\n ops,\n syn,\n });\n if (env.cmd !== undefined) c.ctx.onCmds(env.cmd);\n c.ctx.onIdle(syn.idle ?? false);\n c.awaitingHello = false;\n c.error = undefined;\n c.liveAt = Date.now();\n c.authDenials = 0;\n c.episode = null;\n setStatus(c, { status: \"connected\", degraded: false });\n};\n\nlet warnedUnknownSynFact = false;\n\nconst warnUnknownSynFact = () => {\n if (warnedUnknownSynFact) return;\n warnedUnknownSynFact = true;\n console.warn(\"statewire: ignoring unknown syn fact\");\n};\n\nconst deliverSyn = (c: Conn, value: unknown) => {\n if (!isObject(value)) return protocolError(\"syn must be an object\");\n validateSynScalars(value, false);\n if (value[\"version\"] !== undefined || value[\"idle\"] !== undefined) {\n protocolError(\"invalid mid-stream syn\");\n }\n if (value[\"protocols\"] !== undefined || value[\"retry\"] !== undefined) {\n c.ctx.onRefusal(validateRefusalSyn(value));\n return;\n }\n if (value[\"id\"] !== undefined) return;\n if (Object.keys(value).length === 0) {\n protocolError(\"invalid mid-stream syn\");\n }\n warnUnknownSynFact();\n};\n\nconst deliverEnvelope = (c: Conn, env: StatewireEnvelope) => {\n if (env.syn !== undefined) deliverSyn(c, env.syn);\n if (env.ops !== undefined) {\n const held = c.held;\n c.held = [];\n c.ctx.onOps({\n ops: reviveOps(env.ops),\n cmds: [...held, ...cmdsOf(env)],\n });\n } else if (env.cmd !== undefined) {\n const cmds = cmdsOf(env);\n if (env.next === true) c.held.push(...cmds);\n else c.ctx.onCmds(cmds);\n }\n if (typeof env.idle === \"boolean\") c.ctx.onIdle(env.idle);\n};\n\nexport const settleFin = (c: Conn, fin: StatewireHost.Fin): AttemptOutcome => {\n const finish =\n fin.meta === undefined\n ? fin\n : { ...fin, payload: reviveValue(fin.payload, fin.meta) };\n releaseHeld(c);\n c.retryAt = Date.now() + retryHint(finish.retry ?? 0);\n if (finish.reason === \"idle\") {\n c.ctx.onIdle(true);\n c.attempt = 0;\n c.episode = null;\n c.error = undefined;\n setStatus(c, { status: \"standby\", reason: \"idle\", degraded: false });\n return \"idle\";\n }\n const denial = finish.reason === \"unauthorized\";\n const terminal =\n finish.reason === \"gone\" ||\n finish.reason === \"forbidden\" ||\n finish.reason === \"protocol-error\" ||\n (denial && c.authDenials > 0);\n if (denial) {\n c.authDenials += 1;\n c.authStale = true;\n }\n const report =\n finish.reason !== \"reconnect\" &&\n finish.reason !== \"gone\" &&\n (!denial || terminal);\n c.error = report\n ? Object.assign(new Error(finish.message ?? finish.reason), { fin: finish })\n : undefined;\n if (c.error) c.onError(c.error);\n if (!terminal) {\n c.episode = {\n cause:\n finish.reason === \"reconnect\"\n ? \"reconnect\"\n : denial\n ? \"unauthorized\"\n : \"error\",\n ...(finish.message !== undefined && { message: finish.message }),\n ...(finish.code !== undefined && { code: finish.code }),\n };\n if (denial) openGate(c.gate);\n return \"reattach\";\n }\n c.ctx.onFinish(finish);\n setStatus(c, {\n status: \"stopped\",\n degraded: true,\n reason: denial\n ? \"unauthorized\"\n : finish.reason === \"forbidden\"\n ? \"forbidden\"\n : finish.reason === \"protocol-error\"\n ? \"protocol-error\"\n : \"gone\",\n ...(finish.message !== undefined && { message: finish.message }),\n ...(finish.payload !== undefined && { payload: finish.payload }),\n });\n return \"stop\";\n};\n\nexport const handleEnvelope = (\n c: Conn,\n value: unknown,\n): AttemptOutcome | null => {\n const env = validateEnvelope(value);\n if (c.awaitingHello || isWakeHello(env)) {\n if (env.fin !== undefined) return settleFin(c, env.fin);\n handleHello(c, env);\n return null;\n }\n deliverEnvelope(c, env);\n if (c.connection.status === \"stopped\") return \"stop\";\n if (env.fin !== undefined) return settleFin(c, env.fin);\n if (c.connection.status !== \"connected\") {\n c.attempt = 0;\n c.episode = null;\n setStatus(c, { status: \"connected\", degraded: false });\n }\n return null;\n};\n\n// A dial that no wait preceded is part of the current connect: only a\n// scheduled delay surfaces `retrying`, and the dial after it keeps that status.\nconst dialing = (c: Conn) =>\n setStatus(\n c,\n c.connection.status === \"retrying\"\n ? { status: \"retrying\", attempt: c.attempt, degraded: true }\n : { status: \"connecting\", degraded: false },\n );\n\nconst scheduleRetry = (\n c: Conn,\n failure: string | undefined,\n immediate: boolean,\n) => {\n if (c.liveAt !== null && Date.now() - c.liveAt >= timing.backoffResetMs) {\n c.attempt = 0;\n }\n c.liveAt = null;\n c.attempt += 1;\n c.episode ??= { cause: \"dropped\" };\n const delay = Math.max(\n immediate ? 0 : backoff(c.attempt),\n c.retryAt - Date.now(),\n );\n if (delay === 0) return delay;\n setStatus(c, {\n status: \"retrying\",\n degraded: true,\n attempt: c.attempt,\n ...c.episode,\n nextRetryAt: Date.now() + delay,\n ...(failure !== undefined && { lastError: failure }),\n });\n return delay;\n};\n\nconst reconnectConn = (c: Conn) => {\n if (!c.lifetime) return;\n if (c.connection.status === \"standby\" || c.connection.status === \"stopped\") {\n // A reconnect out of a park starts a fresh episode: first dial, attempt 0.\n c.attempt = 0;\n c.authDenials = 0;\n c.episode = null;\n flushTapSync(() => dialing(c));\n }\n openGate(c.gate);\n c.abort?.abort();\n};\n\nconst run = async (c: Conn, lifetime: AbortController, gate: Gate) => {\n const alive = () => c.lifetime === lifetime;\n if (c.parked) {\n await waitGate(gate);\n if (!alive()) return;\n c.parked = false;\n }\n while (alive()) {\n if (c.retryAt > Date.now()) {\n await waitGate(gate, c.retryAt - Date.now());\n continue;\n }\n // The dial is in flight: attempt alone, no backoff fields.\n flushTapSync(() => dialing(c));\n const abort = new AbortController();\n c.abort = abort;\n c.awaitingHello = true;\n c.held = [];\n let outcome: AttemptOutcome | undefined;\n let failure: string | undefined;\n try {\n const pending = c.ctx.beforeAttach?.();\n if (pending) await pending;\n if (!alive()) return;\n outcome = await c.attemptOnce(abort);\n } catch (error) {\n if (!abort.signal.aborted) {\n if (isStorageError(error)) {\n stopForError({ connection: c, error, reason: \"storage-error\" });\n outcome = \"stop\";\n } else if (\n error instanceof SyntaxError ||\n (error instanceof Error &&\n /^(statewire: protocol error:|Statewire cannot apply)/.test(\n error.message,\n ))\n ) {\n outcome = flushTapSync(() =>\n settleFin(c, { reason: \"protocol-error\", message: error.message }),\n );\n } else if (c.authStale) {\n outcome = flushTapSync(() =>\n settleFin(c, {\n reason: \"unauthorized\",\n message:\n error instanceof Error\n ? error.message\n : \"credential refresh failed\",\n }),\n );\n }\n failure =\n error instanceof Error && error.message ? error.message : \"network\";\n }\n }\n abort.abort();\n if (!alive()) return;\n flushTapSync(() => {\n releaseHeld(c);\n c.ctx.onDetach();\n });\n if (!alive()) return;\n if (c.connection.status === \"stopped\") outcome = \"stop\";\n if (outcome === \"stop\" || outcome === \"idle\") {\n await waitGate(gate);\n continue;\n }\n const immediate = takeGate(gate);\n const delay = flushTapSync(() => scheduleRetry(c, failure, immediate));\n if (delay === 0) continue;\n await waitGate(gate, delay);\n }\n};\n\nexport const unsupportedVersion = (c: Conn, version: string): AttemptOutcome =>\n flushTapSync(() =>\n handleEnvelope(c, {\n fin: {\n reason: \"protocol-error\",\n message: `unsupported protocol version: ${version || '\"\"'}`,\n },\n }),\n ) ?? \"stop\";\n\nexport const resolveHeaders = async (\n headers: StatewireClient.HeadersOption | undefined,\n staleAuth: boolean,\n): Promise<Headers> =>\n new Headers(\n typeof headers === \"function\" ? await headers({ staleAuth }) : headers,\n );\n\n// The stale flag clears only once the resolver returns: a throwing refresh keeps it for the next attempt.\nexport const attachFrame = async (\n c: Conn,\n headers: StatewireClient.HeadersOption | undefined,\n) => {\n const pending = c.ctx.beforeAttach?.();\n if (pending) await pending;\n const resolved = await resolveHeaders(headers, c.authStale);\n for (const [name, value] of Object.entries(\n negotiationHeaders(c.negotiation ?? {}),\n )) {\n if (!resolved.has(name)) resolved.set(name, value);\n }\n c.negotiation = parseNegotiation(resolved);\n c.authStale = false;\n const persistence = c.ctx.beforeAttach?.();\n if (persistence) await persistence;\n const lanes = flushTapSync(() => c.ctx.takeAttachLanes());\n return {\n headers: resolved,\n body: JSON.stringify({\n headers: Object.fromEntries(resolved),\n ...(lanes ?? {}),\n }),\n };\n};\n\nexport const useLink = (\n props: StatewireProtocol.Options & {\n url: string;\n isNew?: boolean | undefined;\n onChange?: ((connection: StatewireClient.Connection) => void) | undefined;\n onError?: ((error: StatewireClient.ConnectionError) => void) | undefined;\n ctx: StatewireRemoteProps;\n attemptOnce: (c: Conn, abort: AbortController) => Promise<AttemptOutcome>;\n send: (c: Conn, frame: StatewireFrame) => Promise<StatewireSubmitResult>;\n },\n): RemoteLink => {\n const latest = useRef(props);\n latest.current = props;\n const [, setConnection] = useState<StatewireClient.Connection | null>(null);\n const [c] = useState((): Conn => {\n const conn: Conn = {\n parked: props.isNew ?? false,\n lease: null,\n attempt: 0,\n authDenials: 0,\n authStale: false,\n liveAt: null,\n retryAt: 0,\n error: undefined,\n episode: null,\n awaitingHello: true,\n held: [],\n abort: null,\n gate: newGate(),\n lifetime: null,\n get ctx() {\n return latest.current.ctx;\n },\n onError: (error) => latest.current.onError?.(error),\n onChange: (connection) => latest.current.onChange?.(connection),\n attemptOnce: (abort) => {\n conn.negotiation = latest.current;\n return latest.current.attemptOnce(conn, abort);\n },\n notify: setConnection,\n reconnect: () => reconnectConn(conn),\n connection: {\n ...((props.isNew ?? false)\n ? { status: \"standby\", reason: \"deferred\", degraded: false }\n : { status: \"connecting\", degraded: false }),\n reconnect: () => conn.reconnect(),\n },\n };\n return conn;\n });\n const [link] = useState((): RemoteLink => ({\n get connection() {\n return c.connection;\n },\n get parked() {\n return c.parked;\n },\n send: (frame) => latest.current.send(c, frame),\n storageFailed: (error) =>\n stopForError({ connection: c, error, reason: \"storage-error\" }),\n protocolFailed: (error) =>\n stopForError({ connection: c, error, reason: \"protocol-error\" }),\n }));\n\n const negotiation = JSON.stringify([\n props.protocol,\n props.wireVersion,\n props.applicationProtocols,\n ]);\n useEffect(() => {\n c.lease = null;\n c.attempt = 0;\n c.authDenials = 0;\n c.authStale = false;\n c.liveAt = null;\n c.retryAt = 0;\n c.episode = null;\n setStatus(\n c,\n c.parked\n ? { status: \"standby\", reason: \"deferred\", degraded: false }\n : { status: \"connecting\", degraded: false },\n );\n const lifetime = new AbortController();\n c.lifetime = lifetime;\n c.gate = newGate();\n void run(c, lifetime, c.gate);\n return () => {\n c.abort?.abort();\n lifetime.abort();\n if (c.lifetime === lifetime) c.lifetime = null;\n openGate(c.gate);\n };\n }, [c, props.url, negotiation]);\n\n return link;\n};\n\nexport const classify = (timeout: AbortSignal) =>\n new Error(timeout.aborted ? \"timeout\" : \"network\");\n"],"mappings":";;;;;;;;;AA4BA,MAAayB,WAAW;CACtB;CACA;CACA;CACA;CACA;AAAS;AAuCX,MAAM2B,iBAAuB;CAAEF,SAAS;CAAOC,MAAME,KAAAA;AAAU;AAE/D,MAAMC,YAAYC,MAAY;CAC5B,MAAMC,MAAMD,EAAEL;CACdK,EAAEL,UAAU;CACZ,OAAOM;AACT;AAEA,MAAMC,YAAYF,GAASG,cAAuB;CAChD,IAAIH,EAAEL,SAAS;EACbK,EAAEL,UAAU;EACZ,OAAOS,QAAQC,QAAQ;CACzB;CACA,OAAO,IAAID,SAAeC,YAAY;EACpC,MAAMC,QACJH,cAAcL,KAAAA,IACVA,KAAAA,IACAS,iBAAiB;GACfP,EAAEJ,OAAOE,KAAAA;GACTO,QAAQ;EACV,GAAGF,SAAS;EAClBH,EAAEJ,aAAa;GACbY,aAAaF,KAAK;GAClBN,EAAEJ,OAAOE,KAAAA;GACTO,QAAQ;EACV;CACF,CAAC;AACH;AAEA,MAAMI,YAAYT,MAAY;CAC5B,IAAIA,EAAEJ,MAAMI,EAAEJ,KAAK;MACdI,EAAEL,UAAU;AACnB;AA6BA,MAAM2C,aAAaC,GAAoBC,MAAgC;CACrE,IAAID,EAAEE,WAAWD,EAAEC,QAAQ,OAAO;CAClC,IAAIF,EAAEE,WAAW,cAAcD,EAAEC,WAAW,YAC1C,OACEF,EAAErB,YAAYsB,EAAEtB,WAChBqB,EAAExE,UAAUyE,EAAEzE,SACdwE,EAAEtE,SAASuE,EAAEvE,QACbsE,EAAEG,gBAAgBF,EAAEE,eACpBH,EAAEI,cAAcH,EAAEG,aAClBJ,EAAEvE,YAAYwE,EAAExE;CAGpB,IAAIuE,EAAEE,WAAW,aAAaD,EAAEC,WAAW,WACzC,OAAOF,EAAEK,WAAWJ,EAAEI;CAExB,IAAIL,EAAEE,WAAW,aAAaD,EAAEC,WAAW,WACzC,OACEF,EAAEK,WAAWJ,EAAEI,UACfL,EAAEvE,YAAYwE,EAAExE,WAChBuE,EAAE/D,YAAYgE,EAAEhE;CAGpB,OAAO;AACT;AAEA,MAAMqE,aAAaC,GAASxD,SAA0B;CACpD,IAAIgD,UAAUhD,MAAMwD,EAAEhC,UAAU,KAAKgC,EAAEhC,WAAWS,UAAUuB,EAAEvB,OAAO;CACrEuB,EAAEhC,aAAa;EACb,GAAGxB;EACH,GAAIwD,EAAEvB,UAAUzB,KAAAA,IAAY,CAAC,IAAI,EAAEyB,OAAOuB,EAAEvB,MAAM;EAClDc,WAAWS,EAAET;CACf;CACAS,EAAEV,OAAOU,EAAEhC,UAAU;CACrBgC,EAAEZ,SAASY,EAAEhC,UAAU;AACzB;AAEA,MAAMiC,gBAAgB,EACpBjC,YAAYgC,GACZvB,OACAqB,aAKI;CACJE,EAAEvB,QAAQA;CACVuB,EAAEb,QAAQV,KAAK;CACfvE,mBACE6F,UAAUC,GAAG;EACXL,QAAQ;EACRG;EACAK,UAAU;EACVjF,SAASuD,MAAMvD;CACjB,CAAC,CACH;CACA8E,EAAEjB,OAAOA,MAAM;AACjB;AAEA,MAAMqB,iBAAiBlF,YAA2B;CAChD,MAAM,IAAIgF,MAAM,8BAA8BhF,SAAS;AACzD;AAEA,MAAMmF,YAAYC,UAChB,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACE,MAAMC,QAAQH,KAAK;AAErE,MAAMI,4BAA4BJ,UAChCK,OAAOC,cAAcN,KAAK,KAAMA,SAAoB;AAEtD,MAAMO,yBAAyBP,UAC7BK,OAAOC,cAAcN,KAAK,KAAMA,QAAmB;AAErD,MAAMQ,0BAA0BR,OAAgBS,UAAwB;CACtE,IAAIT,UAAUtD,KAAAA,KAAa,OAAOsD,UAAU,UAC1CF,cAAc,GAAGW,MAAK,kBAAmB;AAE7C;AAEA,MAAMC,wBAAwBV,OAAgBW,UAAyB;CACrE,IAAIX,UAAUtD,KAAAA,GAAW;CACzB,IAAI,CAACwD,MAAMC,QAAQH,KAAK,GACtB,OAAOF,cAAc,gCAAgC;CACvD,KAAK,MAAMc,SAASZ,OAAO;EACzB,IAAI,CAACD,SAASa,KAAK,GACjB,OAAOd,cAAc,uCAAuC;EAC9D,IAAI,OAAOc,MAAM,YAAY,UAC3Bd,cAAc,uCAAuC;EACvD,IACE,CAACa,UACAC,MAAM,eAAelE,KAAAA,KAAakE,MAAM,cAAclE,KAAAA,IAEvDoD,cAAc,wBAAwB;EACxC,IACEa,QACI,CAACP,yBAAyBQ,MAAM,MAAM,IACtCA,MAAM,WAAWlE,KAAAA,KAAa,CAAC0D,yBAAyBQ,MAAM,MAAM,GAExEd,cAAc,wDAAwD;EACxE,IAAIa,SAASC,MAAM,cAAc,eAAeA,MAAM,WAAW,GAC/Dd,cAAc,oCAAoC;CACtD;AACF;AAEA,MAAMe,sBAAsB1E,KAA8BwE,UAAmB;CAC3ED,qBAAqBvE,IAAI,cAAcwE,KAAK;CAC5C,IAAIxE,IAAI,aAAaO,KAAAA,KAAa,CAAC0D,yBAAyBjE,IAAI,QAAQ,GACtE2D,cAAc,8CAA8C;CAE9DU,uBAAuBrE,IAAI,OAAO,QAAQ;CAC1C,IAAIA,IAAI,YAAYO,KAAAA,KAAa,OAAOP,IAAI,YAAY,WACtD2D,cAAc,4BAA4B;AAE9C;AAEA,MAAagB,sBAAsBd,UAAiC;CAClE,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOF,cAAc,uBAAuB;CAClEe,mBAAmBb,OAAO,KAAK;CAC/B,IACEA,MAAM,UAAUtD,KAAAA,KAChBsD,MAAM,YAAYtD,KAAAA,KAClBsD,MAAM,eAAetD,KAAAA,GAErBoD,cAAc,qBAAqB;CAErC,IAAIE,MAAM,iBAAiBtD,KAAAA,KAAasD,MAAM,aAAatD,KAAAA,GACzDoD,cAAc,wCAAwC;CAExD,OAAOE;AACT;AAEA,MAAMe,eAAef,UAA0C;CAC7D,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOF,cAAc,6BAA6B;CACxE,IAAI,OAAOE,MAAM,gBAAgB,UAC/BF,cAAc,+BAA+B;CAE/C,IAAI,CAACS,sBAAsBP,MAAM,MAAM,GACrCF,cAAc,yCAAyC;CAEzDU,uBAAuBR,MAAM,SAAS,UAAU;CAChDQ,uBAAuBR,MAAM,SAAS,UAAU;CAChDQ,uBAAuBR,MAAM,YAAY,aAAa;CACtD,IAAIA,MAAM,WAAWtD,KAAAA,KAAasD,MAAM,WAAW,MACjDF,cAAc,sBAAsB;CAEtC,OAAO;AACT;AAEA,MAAMkB,eAAehB,UAA+C;CAClE,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOF,cAAc,uBAAuB;CAClE,IAAI,OAAOE,MAAM,cAAc,UAC7BF,cAAc,6BAA6B;CAE7CU,uBAAuBR,MAAM,YAAY,aAAa;CACtDQ,uBAAuBR,MAAM,SAAS,UAAU;CAChD,IACEA,MAAM,cAActD,KAAAA,KACpB,CAAC0D,yBAAyBJ,MAAM,SAAS,GAEzCF,cAAc,+CAA+C;CAC/D,IAAIE,MAAM,aAAatD,KAAAA,KAAa,CAAC0D,yBAAyBJ,MAAM,QAAQ,GAC1EF,cAAc,8CAA8C;CAC9D,OAAO;AACT;AAEA,MAAMmB,oBAAoBjB,UAAsC;CAC9D,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOF,cAAc,0BAA0B;CACrE,IAAIE,MAAM,WAAWtD,KAAAA,KAAa,CAACwD,MAAMC,QAAQH,MAAM,MAAM,GAC3DF,cAAc,sBAAsB;CAEtC,IAAIE,MAAM,WAAWtD,KAAAA,GAAW;EAC9B,MAAMT,MAAM+D,MAAM;EAClB,IAAI,CAACE,MAAMC,QAAQlE,GAAG,GAAG,OAAO6D,cAAc,sBAAsB;EACpE,KAAK,MAAMc,SAAS3E,KAAK8E,YAAYH,KAAK;CAC5C;CACA,IAAIZ,MAAM,YAAYtD,KAAAA,KAAa,OAAOsD,MAAM,YAAY,WAC1DF,cAAc,wBAAwB;CAExC,IAAIE,MAAM,YAAYtD,KAAAA,GAAW;EAC/B,IAAIsD,MAAM,YAAY,MAAMF,cAAc,mBAAmB;EAC7D,IACEE,MAAM,WAAWtD,KAAAA,KACjBsD,MAAM,WAAWtD,KAAAA,KACjBsD,MAAM,WAAWtD,KAAAA,GAEjBoD,cAAc,kCAAkC;CAEpD;CACA,IAAIE,MAAM,WAAWtD,KAAAA,GAAWsE,YAAYhB,MAAM,MAAM;CACxD,OAAOA;AACT;AAGA,MAAMkB,eAAexB,MAAY;CAC/B,IAAIA,EAAEnB,KAAK4C,WAAW,GAAG;CACzB,MAAM5C,OAAOmB,EAAEnB;CACfmB,EAAEnB,OAAO,CAAA;CACTmB,EAAEd,IAAIwC,OAAO7C,IAAI;AACnB;AAEA,MAAM8C,UAAUC,QAA2C;CACzD,IAAIA,IAAIrF,QAAQS,KAAAA,GAAW,OAAO,CAAA;CAClC,OAAO4E,IAAIrF;AACb;AAEA,MAAMsF,cAAcD,QAAsC;CACxD,MAAMtF,MAAMsF,IAAItF;CAChB,IAAIA,QAAQU,KAAAA,GAAW,OAAOoD,cAAc,wBAAwB;CACpE,OAAOjG,UAAUmC,GAAG;AACtB;AAEA,MAAMwF,cAAcF,QAAyC;CAC3D,IAAI,CAACvB,SAASuB,IAAInF,GAAG,GAAG,OAAO2D,cAAc,gBAAgB;CAC7De,mBAAmBS,IAAInF,KAAK,IAAI;CAChC,IAAImF,IAAInF,IAAI,aAAaO,KAAAA,GACvBoD,cAAc,8BAA8B;CAE9C,OAAOwB,IAAInF;AACb;AAIA,MAAMsF,eAAeH,QACnBvB,SAASuB,IAAInF,GAAG,KAAKmF,IAAInF,IAAI,eAAeO,KAAAA;AAE9C,MAAMgF,eAAehC,GAAS4B,QAA2B;CACvD,MAAMnF,MAAMqF,WAAWF,GAAG;CAC1B,IAAI5B,EAAElC,gBAAgBd,KAAAA,GAAWpD,kBAAkB6C,KAAKuD,EAAElC,WAAW;CACrE,MAAMxB,MAAMuF,WAAWD,GAAG;CAC1B5B,EAAEd,IAAI+C,QAAQ;EACZ3F;EACAG;CACF,CAAC;CACD,IAAImF,IAAIrF,QAAQS,KAAAA,GAAWgD,EAAEd,IAAIwC,OAAOE,IAAIrF,GAAG;CAC/CyD,EAAEd,IAAIgD,OAAOzF,IAAIN,QAAQ,KAAK;CAC9B6D,EAAEpB,gBAAgB;CAClBoB,EAAEvB,QAAQzB,KAAAA;CACVgD,EAAEzB,SAAS4D,KAAKC,IAAI;CACpBpC,EAAE3B,cAAc;CAChB2B,EAAErB,UAAU;CACZoB,UAAUC,GAAG;EAAEL,QAAQ;EAAaQ,UAAU;CAAM,CAAC;AACvD;AAEA,IAAIkC,uBAAuB;AAE3B,MAAMC,2BAA2B;CAC/B,IAAID,sBAAsB;CAC1BA,uBAAuB;CACvBE,QAAQC,KAAK,sCAAsC;AACrD;AAEA,MAAMC,cAAczC,GAASM,UAAmB;CAC9C,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOF,cAAc,uBAAuB;CAClEe,mBAAmBb,OAAO,KAAK;CAC/B,IAAIA,MAAM,eAAetD,KAAAA,KAAasD,MAAM,YAAYtD,KAAAA,GACtDoD,cAAc,wBAAwB;CAExC,IAAIE,MAAM,iBAAiBtD,KAAAA,KAAasD,MAAM,aAAatD,KAAAA,GAAW;EACpEgD,EAAEd,IAAIwD,UAAUtB,mBAAmBd,KAAK,CAAC;EACzC;CACF;CACA,IAAIA,MAAM,UAAUtD,KAAAA,GAAW;CAC/B,IAAI2F,OAAOC,KAAKtC,KAAK,CAAC,CAACmB,WAAW,GAChCrB,cAAc,wBAAwB;CAExCkC,mBAAmB;AACrB;AAEA,MAAMO,mBAAmB7C,GAAS4B,QAA2B;CAC3D,IAAIA,IAAInF,QAAQO,KAAAA,GAAWyF,WAAWzC,GAAG4B,IAAInF,GAAG;CAChD,IAAImF,IAAItF,QAAQU,KAAAA,GAAW;EACzB,MAAM6B,OAAOmB,EAAEnB;EACfmB,EAAEnB,OAAO,CAAA;EACTmB,EAAEd,IAAI4D,MAAM;GACVxG,KAAKnC,UAAUyH,IAAItF,GAAG;GACtByG,MAAM,CAAC,GAAGlE,MAAM,GAAG8C,OAAOC,GAAG,CAAC;EAChC,CAAC;CACH,OAAO,IAAIA,IAAIrF,QAAQS,KAAAA,GAAW;EAChC,MAAM+F,OAAOpB,OAAOC,GAAG;EACvB,IAAIA,IAAIpF,SAAS,MAAMwD,EAAEnB,KAAKmE,KAAK,GAAGD,IAAI;OACrC/C,EAAEd,IAAIwC,OAAOqB,IAAI;CACxB;CACA,IAAI,OAAOnB,IAAIzF,SAAS,WAAW6D,EAAEd,IAAIgD,OAAON,IAAIzF,IAAI;AAC1D;AAEA,MAAa8G,aAAajD,GAAStD,QAA2C;CAC5E,MAAMwG,SACJxG,IAAIf,SAASqB,KAAAA,IACTN,MACA;EAAE,GAAGA;EAAKhB,SAAStB,oBAAYsC,IAAIhB,SAASgB,IAAIf,IAAI;CAAE;CAC5D6F,YAAYxB,CAAC;CACbA,EAAExB,UAAU2D,KAAKC,IAAI,IAAI9H,UAAU4I,OAAO9G,SAAS,CAAC;CACpD,IAAI8G,OAAOpD,WAAW,QAAQ;EAC5BE,EAAEd,IAAIgD,OAAO,IAAI;EACjBlC,EAAE5B,UAAU;EACZ4B,EAAErB,UAAU;EACZqB,EAAEvB,QAAQzB,KAAAA;EACV+C,UAAUC,GAAG;GAAEL,QAAQ;GAAWG,QAAQ;GAAQK,UAAU;EAAM,CAAC;EACnE,OAAO;CACT;CACA,MAAMgD,SAASD,OAAOpD,WAAW;CACjC,MAAMsD,WACJF,OAAOpD,WAAW,UAClBoD,OAAOpD,WAAW,eAClBoD,OAAOpD,WAAW,oBACjBqD,UAAUnD,EAAE3B,cAAc;CAC7B,IAAI8E,QAAQ;EACVnD,EAAE3B,eAAe;EACjB2B,EAAE1B,YAAY;CAChB;CAKA0B,EAAEvB,QAHAyE,OAAOpD,WAAW,eAClBoD,OAAOpD,WAAW,WACjB,CAACqD,UAAUC,YAEVT,OAAOW,OAAO,IAAIpD,MAAMgD,OAAOhI,WAAWgI,OAAOpD,MAAM,GAAG,EAAEpD,KAAKwG,OAAO,CAAC,IACzElG,KAAAA;CACJ,IAAIgD,EAAEvB,OAAOuB,EAAEb,QAAQa,EAAEvB,KAAK;CAC9B,IAAI,CAAC2E,UAAU;EACbpD,EAAErB,UAAU;GACV1D,OACEiI,OAAOpD,WAAW,cACd,cACAqD,SACE,iBACA;GACR,GAAID,OAAOhI,YAAY8B,KAAAA,KAAa,EAAE9B,SAASgI,OAAOhI,QAAQ;GAC9D,GAAIgI,OAAO/H,SAAS6B,KAAAA,KAAa,EAAE7B,MAAM+H,OAAO/H,KAAK;EACvD;EACA,IAAIgI,QAAQxF,SAASqC,EAAElB,IAAI;EAC3B,OAAO;CACT;CACAkB,EAAEd,IAAIqE,SAASL,MAAM;CACrBnD,UAAUC,GAAG;EACXL,QAAQ;EACRQ,UAAU;EACVL,QAAQqD,SACJ,iBACAD,OAAOpD,WAAW,cAChB,cACAoD,OAAOpD,WAAW,mBAChB,mBACA;EACR,GAAIoD,OAAOhI,YAAY8B,KAAAA,KAAa,EAAE9B,SAASgI,OAAOhI,QAAQ;EAC9D,GAAIgI,OAAOxH,YAAYsB,KAAAA,KAAa,EAAEtB,SAASwH,OAAOxH,QAAQ;CAChE,CAAC;CACD,OAAO;AACT;AAEA,MAAa8H,kBACXxD,GACAM,UAC0B;CAC1B,MAAMsB,MAAML,iBAAiBjB,KAAK;CAClC,IAAIN,EAAEpB,iBAAiBmD,YAAYH,GAAG,GAAG;EACvC,IAAIA,IAAIlF,QAAQM,KAAAA,GAAW,OAAOiG,UAAUjD,GAAG4B,IAAIlF,GAAG;EACtDsF,YAAYhC,GAAG4B,GAAG;EAClB,OAAO;CACT;CACAiB,gBAAgB7C,GAAG4B,GAAG;CACtB,IAAI5B,EAAEhC,WAAW2B,WAAW,WAAW,OAAO;CAC9C,IAAIiC,IAAIlF,QAAQM,KAAAA,GAAW,OAAOiG,UAAUjD,GAAG4B,IAAIlF,GAAG;CACtD,IAAIsD,EAAEhC,WAAW2B,WAAW,aAAa;EACvCK,EAAE5B,UAAU;EACZ4B,EAAErB,UAAU;EACZoB,UAAUC,GAAG;GAAEL,QAAQ;GAAaQ,UAAU;EAAM,CAAC;CACvD;CACA,OAAO;AACT;AAIA,MAAMsD,WAAWzD,MACfD,UACEC,GACAA,EAAEhC,WAAW2B,WAAW,aACpB;CAAEA,QAAQ;CAAYvB,SAAS4B,EAAE5B;CAAS+B,UAAU;AAAK,IACzD;CAAER,QAAQ;CAAcQ,UAAU;AAAM,CAC9C;AAEF,MAAMuD,iBACJ1D,GACA2D,SACAC,cACG;CACH,IAAI5D,EAAEzB,WAAW,QAAQ4D,KAAKC,IAAI,IAAIpC,EAAEzB,UAAUhE,OAAOsJ,gBACvD7D,EAAE5B,UAAU;CAEd4B,EAAEzB,SAAS;CACXyB,EAAE5B,WAAW;CACb4B,EAAErB,YAAY,EAAE1D,OAAO,UAAU;CACjC,MAAM6I,QAAQC,KAAKC,IACjBJ,YAAY,IAAIvJ,QAAQ2F,EAAE5B,OAAO,GACjC4B,EAAExB,UAAU2D,KAAKC,IAAI,CACvB;CACA,IAAI0B,UAAU,GAAG,OAAOA;CACxB/D,UAAUC,GAAG;EACXL,QAAQ;EACRQ,UAAU;EACV/B,SAAS4B,EAAE5B;EACX,GAAG4B,EAAErB;EACLiB,aAAauC,KAAKC,IAAI,IAAI0B;EAC1B,GAAIH,YAAY3G,KAAAA,KAAa,EAAE6C,WAAW8D,QAAQ;CACpD,CAAC;CACD,OAAOG;AACT;AAEA,MAAMG,iBAAiBjE,MAAY;CACjC,IAAI,CAACA,EAAEf,UAAU;CACjB,IAAIe,EAAEhC,WAAW2B,WAAW,aAAaK,EAAEhC,WAAW2B,WAAW,WAAW;EAE1EK,EAAE5B,UAAU;EACZ4B,EAAE3B,cAAc;EAChB2B,EAAErB,UAAU;EACZzE,mBAAmBuJ,QAAQzD,CAAC,CAAC;CAC/B;CACArC,SAASqC,EAAElB,IAAI;CACfkB,EAAEjB,OAAOA,MAAM;AACjB;AAEA,MAAMmF,MAAM,OAAOlE,GAASf,UAA2BH,SAAe;CACpE,MAAMqF,cAAcnE,EAAEf,aAAaA;CACnC,IAAIe,EAAE9B,QAAQ;EACZ,MAAMd,SAAS0B,IAAI;EACnB,IAAI,CAACqF,MAAM,GAAG;EACdnE,EAAE9B,SAAS;CACb;CACA,OAAOiG,MAAM,GAAG;EACd,IAAInE,EAAExB,UAAU2D,KAAKC,IAAI,GAAG;GAC1B,MAAMhF,SAAS0B,MAAMkB,EAAExB,UAAU2D,KAAKC,IAAI,CAAC;GAC3C;EACF;EAEAlI,mBAAmBuJ,QAAQzD,CAAC,CAAC;EAC7B,MAAMjB,QAAQ,IAAIC,gBAAgB;EAClCgB,EAAEjB,QAAQA;EACViB,EAAEpB,gBAAgB;EAClBoB,EAAEnB,OAAO,CAAA;EACT,IAAIuF;EACJ,IAAIT;EACJ,IAAI;GACF,MAAMU,UAAUrE,EAAEd,IAAIoF,eAAe;GACrC,IAAID,SAAS,MAAMA;GACnB,IAAI,CAACF,MAAM,GAAG;GACdC,UAAU,MAAMpE,EAAEX,YAAYN,KAAK;EACrC,SAASN,OAAO;GACd,IAAI,CAACM,MAAMwF,OAAOC,SAAS;IACzB,IAAIhK,eAAeiE,KAAK,GAAG;KACzBwB,aAAa;MAAEjC,YAAYgC;MAAGvB;MAAOqB,QAAQ;KAAgB,CAAC;KAC9DsE,UAAU;IACZ,OAAO,IACL3F,iBAAiBgG,eAChBhG,iBAAiByB,SAChB,uDAAuDwE,KACrDjG,MAAMvD,OACR,GAEFkJ,UAAUlK,mBACR+I,UAAUjD,GAAG;KAAEF,QAAQ;KAAkB5E,SAASuD,MAAMvD;IAAQ,CAAC,CACnE;SACK,IAAI8E,EAAE1B,WACX8F,UAAUlK,mBACR+I,UAAUjD,GAAG;KACXF,QAAQ;KACR5E,SACEuD,iBAAiByB,QACbzB,MAAMvD,UACN;IACR,CAAC,CACH;IAEFyI,UACElF,iBAAiByB,SAASzB,MAAMvD,UAAUuD,MAAMvD,UAAU;GAC9D;EACF;EACA6D,MAAMA,MAAM;EACZ,IAAI,CAACoF,MAAM,GAAG;EACdjK,mBAAmB;GACjBsH,YAAYxB,CAAC;GACbA,EAAEd,IAAIyF,SAAS;EACjB,CAAC;EACD,IAAI,CAACR,MAAM,GAAG;EACd,IAAInE,EAAEhC,WAAW2B,WAAW,WAAWyE,UAAU;EACjD,IAAIA,YAAY,UAAUA,YAAY,QAAQ;GAC5C,MAAMhH,SAAS0B,IAAI;GACnB;EACF;EACA,MAAM8E,YAAY3G,SAAS6B,IAAI;EAC/B,MAAMgF,QAAQ5J,mBAAmBwJ,cAAc1D,GAAG2D,SAASC,SAAS,CAAC;EACrE,IAAIE,UAAU,GAAG;EACjB,MAAM1G,SAAS0B,MAAMgF,KAAK;CAC5B;AACF;AAEA,MAAac,sBAAsB5E,GAASlE,YAC1C5B,mBACEsJ,eAAexD,GAAG,EAChBtD,KAAK;CACHoD,QAAQ;CACR5E,SAAS,iCAAiCY,WAAW;AACvD,EACF,CAAC,CACH,KAAK;AAEP,MAAa+I,iBAAiB,OAC5BC,SACAE,cAEA,IAAIC,QACF,OAAOH,YAAY,aAAa,MAAMA,QAAQ,EAAEE,UAAU,CAAC,IAAIF,OACjE;AAGF,MAAaI,cAAc,OACzBlF,GACA8E,YACG;CACH,MAAMT,UAAUrE,EAAEd,IAAIoF,eAAe;CACrC,IAAID,SAAS,MAAMA;CACnB,MAAMc,WAAW,MAAMN,eAAeC,SAAS9E,EAAE1B,SAAS;CAC1D,KAAK,MAAM,CAACtC,MAAMsE,UAAUqC,OAAOyC,QACjCzL,mBAAmBqG,EAAElC,eAAe,CAAC,CAAC,CACxC,GACE,IAAI,CAACqH,SAASE,IAAIrJ,IAAI,GAAGmJ,SAASG,IAAItJ,MAAMsE,KAAK;CAEnDN,EAAElC,cAAcjE,iBAAiBsL,QAAQ;CACzCnF,EAAE1B,YAAY;CACd,MAAMiH,cAAcvF,EAAEd,IAAIoF,eAAe;CACzC,IAAIiB,aAAa,MAAMA;CACvB,MAAMC,QAAQtL,mBAAmB8F,EAAEd,IAAIuG,gBAAgB,CAAC;CACxD,OAAO;EACLX,SAASK;EACTO,MAAMC,KAAKC,UAAU;GACnBd,SAASnC,OAAOkD,YAAYV,QAAQ;GACpC,GAAIK,SAAS,CAAC;EAChB,CAAC;CACH;AACF;AAEA,MAAaM,WACXC,UASe;CACf,MAAMK,SAASpM,OAAO+L,KAAK;CAC3BK,OAAOC,UAAUN;CACjB,MAAM,GAAGO,iBAAiBrM,SAA4C,IAAI;CAC1E,MAAM,CAAC+F,KAAK/F,eAAqB;EAC/B,MAAMsM,OAAa;GACjBrI,QAAQ6H,MAAME,SAAS;GACvB9H,OAAO;GACPC,SAAS;GACTC,aAAa;GACbC,WAAW;GACXC,QAAQ;GACRC,SAAS;GACTC,OAAOzB,KAAAA;GACP2B,SAAS;GACTC,eAAe;GACfC,MAAM,CAAA;GACNE,OAAO;GACPD,MAAM/B,QAAQ;GACdkC,UAAU;GACV,IAAIC,MAAM;IACR,OAAOkH,OAAOC,QAAQnH;GACxB;GACAC,UAAUV,UAAU2H,OAAOC,QAAQlH,UAAUV,KAAK;GAClDW,WAAWpB,eAAeoI,OAAOC,QAAQjH,WAAWpB,UAAU;GAC9DqB,cAAcN,UAAU;IACtBwH,KAAKzI,cAAcsI,OAAOC;IAC1B,OAAOD,OAAOC,QAAQhH,YAAYkH,MAAMxH,KAAK;GAC/C;GACAO,QAAQgH;GACR/G,iBAAiB0E,cAAcsC,IAAI;GACnCvI,YAAY;IACV,GAAK+H,MAAME,SAAS,QAChB;KAAEtG,QAAQ;KAAWG,QAAQ;KAAYK,UAAU;IAAM,IACzD;KAAER,QAAQ;KAAcQ,UAAU;IAAM;IAC5CZ,iBAAiBgH,KAAKhH,UAAU;GAClC;EACF;EACA,OAAOgH;CACT,CAAC;CACD,MAAM,CAACC,QAAQvM,gBAA4B;EACzC,IAAI+D,aAAa;GACf,OAAOgC,EAAEhC;EACX;EACA,IAAIE,SAAS;GACX,OAAO8B,EAAE9B;EACX;EACAgI,OAAOC,UAAUC,OAAOC,QAAQH,KAAKlG,GAAGmG,KAAK;EAC7CM,gBAAgBhI,YACdwB,aAAa;GAAEjC,YAAYgC;GAAGvB,OAAAA;GAAOqB,QAAQ;EAAgB,CAAC;EAChE4G,iBAAiBjI,YACfwB,aAAa;GAAEjC,YAAYgC;GAAGvB,OAAAA;GAAOqB,QAAQ;EAAiB,CAAC;CACnE,EAAE;CAEF,MAAMhC,cAAc6H,KAAKC,UAAU;EACjCG,MAAMxK;EACNwK,MAAMY;EACNZ,MAAMa;CAAoB,CAC3B;CACD7M,gBAAgB;EACdiG,EAAE7B,QAAQ;EACV6B,EAAE5B,UAAU;EACZ4B,EAAE3B,cAAc;EAChB2B,EAAE1B,YAAY;EACd0B,EAAEzB,SAAS;EACXyB,EAAExB,UAAU;EACZwB,EAAErB,UAAU;EACZoB,UACEC,GACAA,EAAE9B,SACE;GAAEyB,QAAQ;GAAWG,QAAQ;GAAYK,UAAU;EAAM,IACzD;GAAER,QAAQ;GAAcQ,UAAU;EAAM,CAC9C;EACA,MAAMlB,WAAW,IAAID,gBAAgB;EACrCgB,EAAEf,WAAWA;EACbe,EAAElB,OAAO/B,QAAQ;EACjB,IAASiD,GAAGf,UAAUe,EAAElB,IAAI;EAC5B,aAAa;GACXkB,EAAEjB,OAAOA,MAAM;GACfE,SAASF,MAAM;GACf,IAAIiB,EAAEf,aAAaA,UAAUe,EAAEf,WAAW;GAC1CtB,SAASqC,EAAElB,IAAI;EACjB;CACF,GAAG;EAACkB;EAAG+F,MAAMC;EAAKlI;CAAW,CAAC;CAE9B,OAAO0I;AACT;AAEA,MAAaK,YAAYC,4BACvB,IAAI5G,MAAM4G,QAAQtC,UAAU,YAAY,SAAS"}
1
+ {"version":3,"file":"connection.js","names":["ATTACHER_HEADER","negotiationHeaders","validateSelection","parseNegotiation","StatewireProtocol","useEffect","useRef","useState","flushTapSync","reviveOps","reviveValue","backoff","retryHint","timing","isStorageError","randomId","ConnectionState","RemoteLink","StatewireFrame","StatewireRemoteProps","StatewireSubmitResult","StatewireClient","StatewireHost","Episode","cause","message","code","TERMINAL","const","StatewireCmd","protocol","seq","type","payload","meta","dur","StatewireSyn","version","protocols","name","record","id","idle","retry","StatewireEnvelope","ops","cmd","next","syn","fin","Fin","Gate","latched","wake","newGate","undefined","takeGate","g","was","waitGate","timeoutMs","Promise","resolve","timer","setTimeout","clearTimeout","openGate","AttemptOutcome","Conn","negotiation","Options","connection","Connection","parked","lease","attacher","attempt","authDenials","authStale","liveAt","retryAt","error","ConnectionError","episode","awaitingHello","held","gate","abort","AbortController","lifetime","ctx","onError","onChange","attemptOnce","notify","reconnect","sameState","a","b","status","nextRetryAt","lastError","reason","setStatus","c","stopForError","Error","degraded","protocolError","isObject","value","Record","Array","isArray","isNonnegativeSafeInteger","Number","isSafeInteger","isPositiveSafeInteger","validateOptionalString","field","validateSynProtocols","hello","entry","validateSynScalars","validateRefusalSyn","validateCmd","validateFin","validateEnvelope","releaseHeld","length","onCmds","cmdsOf","env","snapshotOf","helloSynOf","isWakeHello","handleHello","onHello","onIdle","Date","now","warnedUnknownSynFact","warnUnknownSynFact","console","warn","deliverSyn","onRefusal","Object","keys","deliverEnvelope","onOps","cmds","push","settleFin","finish","denial","terminal","report","assign","onFinish","handleEnvelope","dialing","scheduleRetry","failure","immediate","backoffResetMs","delay","Math","max","reconnectConn","run","alive","outcome","pending","beforeAttach","signal","aborted","SyntaxError","test","onDetach","unsupportedVersion","resolveHeaders","headers","HeadersOption","staleAuth","Headers","replacing","set","attachFrame","resolved","entries","has","persistence","lanes","takeAttachLanes","body","JSON","stringify","fromEntries","useLink","props","url","isNew","send","frame","latest","current","setConnection","conn","link","storageFailed","protocolFailed","wireVersion","applicationProtocols","classify","timeout","AbortSignal","reviveValue"],"sources":["../../src/client/connection.ts"],"sourcesContent":["import {\n ATTACHER_HEADER,\n negotiationHeaders,\n validateSelection,\n parseNegotiation,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { reviveOps, reviveValue } from \"../wire/meta\";\nimport { backoff, retryHint, timing } from \"./timing\";\nimport { isStorageError } from \"./storageError\";\nimport { randomId } from \"../util/randomId\";\nimport type {\n ConnectionState,\n RemoteLink,\n StatewireFrame,\n StatewireRemoteProps,\n StatewireSubmitResult,\n} from \"../transports/sse\";\nimport type { StatewireClient } from \"../statewire\";\nimport type { StatewireHost } from \"../host\";\n\nexport type Episode = {\n cause: \"dropped\" | \"reconnect\" | \"error\" | \"unauthorized\";\n message?: string;\n code?: string;\n};\n\n/** The terminal cmd verdict types; \"applied\" is the sole non-terminal type. */\nexport const TERMINAL = [\n \"result\",\n \"rejected\",\n \"failed\",\n \"crashed\",\n \"expired\",\n] as const;\n\nexport type StatewireCmd = {\n protocol: string;\n seq: number;\n type?: \"applied\" | (typeof TERMINAL)[number];\n code?: string;\n message?: string;\n payload?: unknown;\n meta?: unknown;\n /** Cumulative: resending through this seq will never be needed. */\n dur?: boolean;\n};\n\nexport type StatewireSyn = {\n version?: string;\n protocols?: {\n name: string;\n version?: string;\n record?: \"ephemeral\";\n seq?: number;\n }[];\n id?: string;\n idle?: boolean;\n retry?: number;\n};\n\nexport type StatewireEnvelope = {\n ops?: unknown[];\n cmd?: StatewireCmd[];\n next?: true;\n idle?: boolean;\n syn?: StatewireSyn;\n fin?: StatewireHost.Fin;\n};\n\nexport type Gate = { latched: boolean; wake: (() => void) | undefined };\n\nconst newGate = (): Gate => ({ latched: false, wake: undefined });\n\nconst takeGate = (g: Gate) => {\n const was = g.latched;\n g.latched = false;\n return was;\n};\n\nconst waitGate = (g: Gate, timeoutMs?: number) => {\n if (g.latched) {\n g.latched = false;\n return Promise.resolve();\n }\n return new Promise<void>((resolve) => {\n const timer =\n timeoutMs === undefined\n ? undefined\n : setTimeout(() => {\n g.wake = undefined;\n resolve();\n }, timeoutMs);\n g.wake = () => {\n clearTimeout(timer);\n g.wake = undefined;\n resolve();\n };\n });\n};\n\nconst openGate = (g: Gate) => {\n if (g.wake) g.wake();\n else g.latched = true;\n};\n\nexport type AttemptOutcome = \"stop\" | \"reattach\" | \"ended\" | \"idle\";\n\nexport type Conn = {\n negotiation?: StatewireProtocol.Options;\n connection: StatewireClient.Connection;\n parked: boolean;\n lease: string | null;\n /** Names every attach of this connection, so a host retires the earlier ones (2026-11-02). */\n attacher: string;\n attempt: number;\n authDenials: number;\n authStale: boolean;\n liveAt: number | null;\n retryAt: number;\n error: StatewireClient.ConnectionError | undefined;\n episode: Episode | null;\n awaitingHello: boolean;\n held: StatewireCmd[];\n gate: Gate;\n abort: AbortController | null;\n lifetime: AbortController | null;\n ctx: StatewireRemoteProps;\n onError: (error: StatewireClient.ConnectionError) => void;\n onChange: (connection: StatewireClient.Connection) => void;\n attemptOnce: (abort: AbortController) => Promise<AttemptOutcome>;\n notify: (connection: StatewireClient.Connection) => void;\n reconnect: () => void;\n};\n\nconst sameState = (a: ConnectionState, b: ConnectionState): boolean => {\n if (a.status !== b.status) return false;\n if (a.status === \"retrying\" && b.status === \"retrying\") {\n return (\n a.attempt === b.attempt &&\n a.cause === b.cause &&\n a.code === b.code &&\n a.nextRetryAt === b.nextRetryAt &&\n a.lastError === b.lastError &&\n a.message === b.message\n );\n }\n if (a.status === \"standby\" && b.status === \"standby\") {\n return a.reason === b.reason;\n }\n if (a.status === \"stopped\" && b.status === \"stopped\") {\n return (\n a.reason === b.reason &&\n a.message === b.message &&\n a.payload === b.payload\n );\n }\n return true;\n};\n\nconst setStatus = (c: Conn, next: ConnectionState) => {\n if (sameState(next, c.connection) && c.connection.error === c.error) return;\n c.connection = {\n ...next,\n ...(c.error === undefined ? {} : { error: c.error }),\n reconnect: c.reconnect,\n };\n c.notify(c.connection);\n c.onChange(c.connection);\n};\n\nconst stopForError = ({\n connection: c,\n error,\n reason,\n}: {\n connection: Conn;\n error: Error;\n reason: \"storage-error\" | \"protocol-error\";\n}) => {\n c.error = error;\n c.onError(error);\n flushTapSync(() =>\n setStatus(c, {\n status: \"stopped\",\n reason,\n degraded: true,\n message: error.message,\n }),\n );\n c.abort?.abort();\n};\n\nconst protocolError = (message: string): never => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isNonnegativeSafeInteger = (value: unknown): value is number =>\n Number.isSafeInteger(value) && (value as number) >= 0;\n\nconst isPositiveSafeInteger = (value: unknown): value is number =>\n Number.isSafeInteger(value) && (value as number) > 0;\n\nconst validateOptionalString = (value: unknown, field: string): void => {\n if (value !== undefined && typeof value !== \"string\") {\n protocolError(`${field} must be a string`);\n }\n};\n\nconst validateSynProtocols = (value: unknown, hello: boolean): void => {\n if (value === undefined) return;\n if (!Array.isArray(value))\n return protocolError(\"syn.protocols must be an array\");\n for (const entry of value) {\n if (!isObject(entry))\n return protocolError(\"syn.protocols entry must be an object\");\n if (typeof entry[\"name\"] !== \"string\")\n protocolError(\"syn.protocols[].name must be a string\");\n if (\n !hello &&\n (entry[\"version\"] !== undefined || entry[\"record\"] !== undefined)\n )\n protocolError(\"invalid mid-stream syn\");\n if (\n hello\n ? !isNonnegativeSafeInteger(entry[\"seq\"])\n : entry[\"seq\"] !== undefined && !isNonnegativeSafeInteger(entry[\"seq\"])\n )\n protocolError(\"syn.protocols[].seq must be a nonnegative safe integer\");\n if (hello && entry[\"record\"] === \"ephemeral\" && entry[\"seq\"] !== 0)\n protocolError(\"ephemeral lane hello seq must be 0\");\n }\n};\n\nconst validateSynScalars = (syn: Record<string, unknown>, hello: boolean) => {\n validateSynProtocols(syn[\"protocols\"], hello);\n if (syn[\"retry\"] !== undefined && !isNonnegativeSafeInteger(syn[\"retry\"])) {\n protocolError(\"syn.retry must be a nonnegative safe integer\");\n }\n validateOptionalString(syn[\"id\"], \"syn.id\");\n if (syn[\"idle\"] !== undefined && typeof syn[\"idle\"] !== \"boolean\") {\n protocolError(\"syn.idle must be a boolean\");\n }\n};\n\nexport const validateRefusalSyn = (value: unknown): StatewireSyn => {\n if (!isObject(value)) return protocolError(\"syn must be an object\");\n validateSynScalars(value, false);\n if (\n value[\"id\"] !== undefined ||\n value[\"idle\"] !== undefined ||\n value[\"version\"] !== undefined\n ) {\n protocolError(\"invalid refusal syn\");\n }\n if (value[\"protocols\"] === undefined && value[\"retry\"] === undefined) {\n protocolError(\"refusal syn has no watermarks or retry\");\n }\n return value as StatewireSyn;\n};\n\nconst validateCmd = (value: unknown): value is StatewireCmd => {\n if (!isObject(value)) return protocolError(\"cmd entry must be an object\");\n if (typeof value[\"protocol\"] !== \"string\") {\n protocolError(\"cmd.protocol must be a string\");\n }\n if (!isPositiveSafeInteger(value[\"seq\"])) {\n protocolError(\"cmd.seq must be a positive safe integer\");\n }\n validateOptionalString(value[\"type\"], \"cmd.type\");\n validateOptionalString(value[\"code\"], \"cmd.code\");\n validateOptionalString(value[\"message\"], \"cmd.message\");\n if (value[\"dur\"] !== undefined && value[\"dur\"] !== true) {\n protocolError(\"cmd.dur must be true\");\n }\n return true;\n};\n\nconst validateFin = (value: unknown): value is StatewireHost.Fin => {\n if (!isObject(value)) return protocolError(\"fin must be an object\");\n if (typeof value[\"reason\"] !== \"string\") {\n protocolError(\"fin.reason must be a string\");\n }\n validateOptionalString(value[\"message\"], \"fin.message\");\n validateOptionalString(value[\"code\"], \"fin.code\");\n if (\n value[\"status\"] !== undefined &&\n !isNonnegativeSafeInteger(value[\"status\"])\n )\n protocolError(\"fin.status must be a nonnegative safe integer\");\n if (value[\"retry\"] !== undefined && !isNonnegativeSafeInteger(value[\"retry\"]))\n protocolError(\"fin.retry must be a nonnegative safe integer\");\n return true;\n};\n\nconst validateEnvelope = (value: unknown): StatewireEnvelope => {\n if (!isObject(value)) return protocolError(\"packet must be an object\");\n if (value[\"ops\"] !== undefined && !Array.isArray(value[\"ops\"])) {\n protocolError(\"ops must be an array\");\n }\n if (value[\"cmd\"] !== undefined) {\n const cmd = value[\"cmd\"];\n if (!Array.isArray(cmd)) return protocolError(\"cmd must be an array\");\n for (const entry of cmd) validateCmd(entry);\n }\n if (value[\"idle\"] !== undefined && typeof value[\"idle\"] !== \"boolean\") {\n protocolError(\"idle must be a boolean\");\n }\n if (value[\"next\"] !== undefined) {\n if (value[\"next\"] !== true) protocolError(\"next must be true\");\n if (\n value[\"cmd\"] === undefined ||\n value[\"ops\"] !== undefined ||\n value[\"fin\"] !== undefined\n ) {\n protocolError(\"next must ride a cmd-only packet\");\n }\n }\n if (value[\"fin\"] !== undefined) validateFin(value[\"fin\"]);\n return value as StatewireEnvelope;\n};\n\n// A hold's release delivers, never settles: fin and bare close both drain it.\nconst releaseHeld = (c: Conn) => {\n if (c.held.length === 0) return;\n const held = c.held;\n c.held = [];\n c.ctx.onCmds(held);\n};\n\nconst cmdsOf = (env: StatewireEnvelope): StatewireCmd[] => {\n if (env.cmd === undefined) return [];\n return env.cmd;\n};\n\nconst snapshotOf = (env: StatewireEnvelope): unknown[] => {\n const ops = env.ops;\n if (ops === undefined) return protocolError(\"hello missing snapshot\");\n return reviveOps(ops);\n};\n\nconst helloSynOf = (env: StatewireEnvelope): StatewireSyn => {\n if (!isObject(env.syn)) return protocolError(\"expected hello\");\n validateSynScalars(env.syn, true);\n if (env.syn[\"retry\"] !== undefined) {\n protocolError(\"hello syn cannot carry retry\");\n }\n return env.syn as StatewireSyn;\n};\n\n// A host that woke on a retained socket re-sends its hello; the snapshot\n// replaces the session the way a fresh attach would.\nconst isWakeHello = (env: StatewireEnvelope) =>\n isObject(env.syn) && env.syn[\"version\"] !== undefined;\n\nconst handleHello = (c: Conn, env: StatewireEnvelope) => {\n const syn = helloSynOf(env);\n if (c.negotiation !== undefined) validateSelection(syn, c.negotiation);\n const ops = snapshotOf(env);\n c.ctx.onHello({\n ops,\n syn,\n });\n if (env.cmd !== undefined) c.ctx.onCmds(env.cmd);\n c.ctx.onIdle(syn.idle ?? false);\n c.awaitingHello = false;\n c.error = undefined;\n c.liveAt = Date.now();\n c.authDenials = 0;\n c.episode = null;\n setStatus(c, { status: \"connected\", degraded: false });\n};\n\nlet warnedUnknownSynFact = false;\n\nconst warnUnknownSynFact = () => {\n if (warnedUnknownSynFact) return;\n warnedUnknownSynFact = true;\n console.warn(\"statewire: ignoring unknown syn fact\");\n};\n\nconst deliverSyn = (c: Conn, value: unknown) => {\n if (!isObject(value)) return protocolError(\"syn must be an object\");\n validateSynScalars(value, false);\n if (value[\"version\"] !== undefined || value[\"idle\"] !== undefined) {\n protocolError(\"invalid mid-stream syn\");\n }\n if (value[\"protocols\"] !== undefined || value[\"retry\"] !== undefined) {\n c.ctx.onRefusal(validateRefusalSyn(value));\n return;\n }\n if (value[\"id\"] !== undefined) return;\n if (Object.keys(value).length === 0) {\n protocolError(\"invalid mid-stream syn\");\n }\n warnUnknownSynFact();\n};\n\nconst deliverEnvelope = (c: Conn, env: StatewireEnvelope) => {\n if (env.syn !== undefined) deliverSyn(c, env.syn);\n if (env.ops !== undefined) {\n const held = c.held;\n c.held = [];\n c.ctx.onOps({\n ops: reviveOps(env.ops),\n cmds: [...held, ...cmdsOf(env)],\n });\n } else if (env.cmd !== undefined) {\n const cmds = cmdsOf(env);\n if (env.next === true) c.held.push(...cmds);\n else c.ctx.onCmds(cmds);\n }\n if (typeof env.idle === \"boolean\") c.ctx.onIdle(env.idle);\n};\n\nexport const settleFin = (c: Conn, fin: StatewireHost.Fin): AttemptOutcome => {\n const finish =\n fin.meta === undefined\n ? fin\n : { ...fin, payload: reviveValue(fin.payload, fin.meta) };\n releaseHeld(c);\n c.retryAt = Date.now() + retryHint(finish.retry ?? 0);\n if (finish.reason === \"idle\") {\n c.ctx.onIdle(true);\n c.attempt = 0;\n c.episode = null;\n c.error = undefined;\n setStatus(c, { status: \"standby\", reason: \"idle\", degraded: false });\n return \"idle\";\n }\n const denial = finish.reason === \"unauthorized\";\n const terminal =\n finish.reason === \"gone\" ||\n finish.reason === \"forbidden\" ||\n finish.reason === \"protocol-error\" ||\n (denial && c.authDenials > 0);\n if (denial) {\n c.authDenials += 1;\n c.authStale = true;\n }\n const report =\n finish.reason !== \"reconnect\" &&\n finish.reason !== \"gone\" &&\n (!denial || terminal);\n c.error = report\n ? Object.assign(new Error(finish.message ?? finish.reason), { fin: finish })\n : undefined;\n if (c.error) c.onError(c.error);\n if (!terminal) {\n c.episode = {\n cause:\n finish.reason === \"reconnect\"\n ? \"reconnect\"\n : denial\n ? \"unauthorized\"\n : \"error\",\n ...(finish.message !== undefined && { message: finish.message }),\n ...(finish.code !== undefined && { code: finish.code }),\n };\n if (denial) openGate(c.gate);\n return \"reattach\";\n }\n c.ctx.onFinish(finish);\n setStatus(c, {\n status: \"stopped\",\n degraded: true,\n reason: denial\n ? \"unauthorized\"\n : finish.reason === \"forbidden\"\n ? \"forbidden\"\n : finish.reason === \"protocol-error\"\n ? \"protocol-error\"\n : \"gone\",\n ...(finish.message !== undefined && { message: finish.message }),\n ...(finish.payload !== undefined && { payload: finish.payload }),\n });\n return \"stop\";\n};\n\nexport const handleEnvelope = (\n c: Conn,\n value: unknown,\n): AttemptOutcome | null => {\n const env = validateEnvelope(value);\n if (c.awaitingHello || isWakeHello(env)) {\n if (env.fin !== undefined) return settleFin(c, env.fin);\n handleHello(c, env);\n return null;\n }\n deliverEnvelope(c, env);\n if (c.connection.status === \"stopped\") return \"stop\";\n if (env.fin !== undefined) return settleFin(c, env.fin);\n if (c.connection.status !== \"connected\") {\n c.attempt = 0;\n c.episode = null;\n setStatus(c, { status: \"connected\", degraded: false });\n }\n return null;\n};\n\n// A dial that no wait preceded is part of the current connect: only a\n// scheduled delay surfaces `retrying`, and the dial after it keeps that status.\nconst dialing = (c: Conn) =>\n setStatus(\n c,\n c.connection.status === \"retrying\"\n ? { status: \"retrying\", attempt: c.attempt, degraded: true }\n : { status: \"connecting\", degraded: false },\n );\n\nconst scheduleRetry = (\n c: Conn,\n failure: string | undefined,\n immediate: boolean,\n) => {\n if (c.liveAt !== null && Date.now() - c.liveAt >= timing.backoffResetMs) {\n c.attempt = 0;\n }\n c.liveAt = null;\n c.attempt += 1;\n c.episode ??= { cause: \"dropped\" };\n const delay = Math.max(\n immediate ? 0 : backoff(c.attempt),\n c.retryAt - Date.now(),\n );\n if (delay === 0) return delay;\n setStatus(c, {\n status: \"retrying\",\n degraded: true,\n attempt: c.attempt,\n ...c.episode,\n nextRetryAt: Date.now() + delay,\n ...(failure !== undefined && { lastError: failure }),\n });\n return delay;\n};\n\nconst reconnectConn = (c: Conn) => {\n if (!c.lifetime) return;\n if (c.connection.status === \"standby\" || c.connection.status === \"stopped\") {\n // A reconnect out of a park starts a fresh episode: first dial, attempt 0.\n c.attempt = 0;\n c.authDenials = 0;\n c.episode = null;\n flushTapSync(() => dialing(c));\n }\n openGate(c.gate);\n c.abort?.abort();\n};\n\nconst run = async (c: Conn, lifetime: AbortController, gate: Gate) => {\n const alive = () => c.lifetime === lifetime;\n if (c.parked) {\n await waitGate(gate);\n if (!alive()) return;\n c.parked = false;\n }\n while (alive()) {\n if (c.retryAt > Date.now()) {\n await waitGate(gate, c.retryAt - Date.now());\n continue;\n }\n // The dial is in flight: attempt alone, no backoff fields.\n flushTapSync(() => dialing(c));\n const abort = new AbortController();\n c.abort = abort;\n c.awaitingHello = true;\n c.held = [];\n let outcome: AttemptOutcome | undefined;\n let failure: string | undefined;\n try {\n const pending = c.ctx.beforeAttach?.();\n if (pending) await pending;\n if (!alive()) return;\n outcome = await c.attemptOnce(abort);\n } catch (error) {\n if (!abort.signal.aborted) {\n if (isStorageError(error)) {\n stopForError({ connection: c, error, reason: \"storage-error\" });\n outcome = \"stop\";\n } else if (\n error instanceof SyntaxError ||\n (error instanceof Error &&\n /^(statewire: protocol error:|Statewire cannot apply)/.test(\n error.message,\n ))\n ) {\n outcome = flushTapSync(() =>\n settleFin(c, { reason: \"protocol-error\", message: error.message }),\n );\n } else if (c.authStale) {\n outcome = flushTapSync(() =>\n settleFin(c, {\n reason: \"unauthorized\",\n message:\n error instanceof Error\n ? error.message\n : \"credential refresh failed\",\n }),\n );\n }\n failure =\n error instanceof Error && error.message ? error.message : \"network\";\n }\n }\n abort.abort();\n if (!alive()) return;\n flushTapSync(() => {\n releaseHeld(c);\n c.ctx.onDetach();\n });\n if (!alive()) return;\n if (c.connection.status === \"stopped\") outcome = \"stop\";\n if (outcome === \"stop\" || outcome === \"idle\") {\n await waitGate(gate);\n continue;\n }\n const immediate = takeGate(gate);\n const delay = flushTapSync(() => scheduleRetry(c, failure, immediate));\n if (delay === 0) continue;\n await waitGate(gate, delay);\n }\n};\n\nexport const unsupportedVersion = (c: Conn, version: string): AttemptOutcome =>\n flushTapSync(() =>\n handleEnvelope(c, {\n fin: {\n reason: \"protocol-error\",\n message: `unsupported protocol version: ${version || '\"\"'}`,\n },\n }),\n ) ?? \"stop\";\n\nexport const resolveHeaders = async (\n headers: StatewireClient.HeadersOption | undefined,\n staleAuth: boolean,\n): Promise<Headers> =>\n new Headers(\n typeof headers === \"function\" ? await headers({ staleAuth }) : headers,\n );\n\n// The stale flag clears only once the resolver returns: a throwing refresh keeps it for the next attempt.\n/** Names this connection, so a host retires its earlier attaches before the hello. */\nexport const replacing = (c: Conn, headers: Headers) => {\n headers.set(ATTACHER_HEADER, c.attacher);\n};\n\nexport const attachFrame = async (\n c: Conn,\n headers: StatewireClient.HeadersOption | undefined,\n) => {\n const pending = c.ctx.beforeAttach?.();\n if (pending) await pending;\n const resolved = await resolveHeaders(headers, c.authStale);\n for (const [name, value] of Object.entries(\n negotiationHeaders(c.negotiation ?? {}),\n )) {\n if (!resolved.has(name)) resolved.set(name, value);\n }\n replacing(c, resolved);\n c.negotiation = parseNegotiation(resolved);\n c.authStale = false;\n const persistence = c.ctx.beforeAttach?.();\n if (persistence) await persistence;\n const lanes = flushTapSync(() => c.ctx.takeAttachLanes());\n return {\n headers: resolved,\n body: JSON.stringify({\n headers: Object.fromEntries(resolved),\n ...(lanes ?? {}),\n }),\n };\n};\n\nexport const useLink = (\n props: StatewireProtocol.Options & {\n url: string;\n isNew?: boolean | undefined;\n onChange?: ((connection: StatewireClient.Connection) => void) | undefined;\n onError?: ((error: StatewireClient.ConnectionError) => void) | undefined;\n ctx: StatewireRemoteProps;\n attemptOnce: (c: Conn, abort: AbortController) => Promise<AttemptOutcome>;\n send: (c: Conn, frame: StatewireFrame) => Promise<StatewireSubmitResult>;\n },\n): RemoteLink => {\n const latest = useRef(props);\n latest.current = props;\n const [, setConnection] = useState<StatewireClient.Connection | null>(null);\n const [c] = useState((): Conn => {\n const conn: Conn = {\n parked: props.isNew ?? false,\n lease: null,\n attacher: randomId(),\n attempt: 0,\n authDenials: 0,\n authStale: false,\n liveAt: null,\n retryAt: 0,\n error: undefined,\n episode: null,\n awaitingHello: true,\n held: [],\n abort: null,\n gate: newGate(),\n lifetime: null,\n get ctx() {\n return latest.current.ctx;\n },\n onError: (error) => latest.current.onError?.(error),\n onChange: (connection) => latest.current.onChange?.(connection),\n attemptOnce: (abort) => {\n conn.negotiation = latest.current;\n return latest.current.attemptOnce(conn, abort);\n },\n notify: setConnection,\n reconnect: () => reconnectConn(conn),\n connection: {\n ...((props.isNew ?? false)\n ? { status: \"standby\", reason: \"deferred\", degraded: false }\n : { status: \"connecting\", degraded: false }),\n reconnect: () => conn.reconnect(),\n },\n };\n return conn;\n });\n const [link] = useState((): RemoteLink => ({\n get connection() {\n return c.connection;\n },\n get parked() {\n return c.parked;\n },\n send: (frame) => latest.current.send(c, frame),\n storageFailed: (error) =>\n stopForError({ connection: c, error, reason: \"storage-error\" }),\n protocolFailed: (error) =>\n stopForError({ connection: c, error, reason: \"protocol-error\" }),\n }));\n\n const negotiation = JSON.stringify([\n props.protocol,\n props.wireVersion,\n props.applicationProtocols,\n ]);\n useEffect(() => {\n c.lease = null;\n c.attempt = 0;\n c.authDenials = 0;\n c.authStale = false;\n c.liveAt = null;\n c.retryAt = 0;\n c.episode = null;\n setStatus(\n c,\n c.parked\n ? { status: \"standby\", reason: \"deferred\", degraded: false }\n : { status: \"connecting\", degraded: false },\n );\n const lifetime = new AbortController();\n c.lifetime = lifetime;\n c.gate = newGate();\n void run(c, lifetime, c.gate);\n return () => {\n c.abort?.abort();\n lifetime.abort();\n if (c.lifetime === lifetime) c.lifetime = null;\n openGate(c.gate);\n };\n }, [c, props.url, negotiation]);\n\n return link;\n};\n\nexport const classify = (timeout: AbortSignal) =>\n new Error(timeout.aborted ? \"timeout\" : \"network\");\n"],"mappings":"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"}
@@ -110,6 +110,8 @@ type Session = {
110
110
  /** Ephemeral lane clocks: restart at 1 on every attach. */
111
111
  ephemeralSeqs: Record<string, number>;
112
112
  resumeAt: number;
113
+ /** A refusal named sent durable stamps: a reattach's hello decides them, after `resumeAt`. */
114
+ reattach: boolean;
113
115
  idle: boolean;
114
116
  onSessionLost: StatewireClient.OnSessionLost | undefined;
115
117
  onDeprecatedPath: StatewireClient.OnDeprecatedPath | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAShD,OAAO,KAAK,EAAE,iBAAiB,EAAE,4BAAyB;AAO1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,6BAA0B;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAoB;AAMjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAqB;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAqB;AAUpD,OAAO,KAAK,EACV,UAAU,EAEV,oBAAoB,EACrB,6BAA0B;AAE3B,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,WAAW,CAAC,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,CAAC,UAAU,CAAC,IAAI,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,CAAC,CAAC;CACjE,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,6EAA6E;IAC7E,IAAI,EAAE,OAAO,CAAC;IACd,2FAA2F;IAC3F,KAAK,EAAE,OAAO,CAAC;IACf,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,CAAC;AAcF,KAAK,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,OAAO,GAAG;IAChE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,YAAY,CAAC,EAAE,eAAe,CAAC,cAAc,GAAG,SAAS,CAAC;IAC1D,aAAa,CAAC,EAAE,eAAe,CAAC,aAAa,GAAG,SAAS,CAAC;IAC1D,gBAAgB,CAAC,EAAE,eAAe,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAChE,SAAS,CAAC,EAAE,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;IAC9C,WAAW,CAAC,EACR,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC,GACrD,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAC,cAAc,CAAA;KAAE,EAAE,CAAC;IACxE,2FAA2F;IAC3F,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,yDAAyD;IACzD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oDAAoD;IACpD,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;IACjC,iDAAiD;IACjD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CAC7B,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACtB,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,OAAO,EAAE,uBAAuB,CAAC;IACjC,iBAAiB,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACtD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IACxD,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IAC9D,SAAS,EAAE,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;IACnD,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC;IACtC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC,aAAa,GAAG,IAAI,CAAC;IACtD,KAAK,EAAE,eAAe,CAAC,cAAc,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC,OAAO,GAAG,SAAS,CAAC;IACtD,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,eAAe,CAAC,aAAa,GAAG,SAAS,CAAC;IACzD,gBAAgB,EAAE,eAAe,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAC/D,SAAS,EAAE,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;IAC7C,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACjC,6CAA6C;IAC7C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACpD,gEAAgE;IAChE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,SAAS,eAAe,CAAC,WAAW,EAAE,CAAC;IACnD,WAAW,EAAE,SAAS,OAAO,EAAE,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CAAC;IACnD,8FAA8F;IAC9F,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACnC,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IACxB,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CACtE,CAAC;AA2BF,KAAK,OAAO,GAAG,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAskBzC,eAAO,MAAM,SAAS,MAAM,CAAC;AAE7B,KAAK,OAAO,GACR;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC,WAAW,CAAA;CAAE,CAAC;AAqFxD,KAAK,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAggCnD,QAAA,MAAM,YAAY,GAAI,GAAG,OAAO,EAAE,WAAW,UAAU,SAItD,CAAC;AAqVF,eAAO,MAAM,aAAa,GACxB,GAAG,OAAO,KACT,SAAS,eAAe,CAAC,WAAW,EAiCtC,CAAC;AAqGF,eAAO,MAAM,UAAU,GAAI,GAAG,OAAO,EAAE,IAAI,MAAM,SAC8B,CAAC;AAEhF,eAAO,MAAM,aAAa,GAAI,GAAG,OAAO,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,OAAO,CAYrE,CAAC;AAQF,eAAO,MAAM,YAAY,GAAI,GAAG,OAAO,EAAE,IAAI,MAAM,SACF,CAAC;AAElD,eAAO,MAAM,YAAY,GACvB,GAAG,OAAO,EACV,IAAI,MAAM,EACV,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,WAAW,KAAK,eAAe,CAAC,WAAW,SAItE,CAAC;AAyBJ,eAAO,MAAM,YAAY,GACvB,GAAG,OAAO,EACV,OAAO,eAAe,CAAC,YAAY,KAClC,MAoFF,CAAC;AAsKF,eAAO,MAAM,cAAc,GAAI,GAAG,OAAO,KAAG,kBAAkB,CAAC,MA6B7D,CAAC;AAEH,eAAO,MAAM,cAAc,GACzB,GAAG,OAAO,EACV,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,QAAQ,SAAS,OAAO,EAAE,EAC1B,UAAU,eAAe,CAAC,aAAa,qBACa,CAAC;AAkFvD,eAAO,MAAM,UAAU,GACrB,GAAG,OAAO,EACV,UAAU,MAAM,EAChB,OAAO,SAAS,CAAC,OAAO,KACvB,IAWF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,uBAAuB,KAC/B,OAwLF,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import { inRange, protocolOffers } from "../wire/protocol.js";
1
+ import { CLIENT_WIRE, inRange, protocolOffers } from "../wire/protocol.js";
2
2
  import { reviveDocumentValue } from "../document.js";
3
3
  import { encodeParams, reviveResponse } from "../wire/meta.js";
4
4
  import { backoff, retryHint } from "./timing.js";
5
5
  import { wrapStorageError } from "./storageError.js";
6
+ import { randomId } from "../util/randomId.js";
6
7
  import { TERMINAL } from "./connection.js";
7
8
  import "../wire/limits.js";
8
9
  import { encodeContext } from "../wire/context.js";
@@ -11,7 +12,6 @@ import { StatewireSendError } from "../types.js";
11
12
  import { bindCommandsHost } from "../host/host.js";
12
13
  import { applyDocumentOps, findDocument, mainDocument, resolveDocumentKey } from "../wire/documents.js";
13
14
  import { DocumentStorageContext, SessionStorageContext, createMemorySessionStore } from "./sessionStore.js";
14
- import { randomId } from "../util/randomId.js";
15
15
  import { useContext, useEffect, useState } from "@assistant-ui/tap/react-shim";
16
16
  // src/client/session.ts
17
17
  const protocolError = (message) => {
@@ -903,10 +903,11 @@ const sessionLostInner = (s, protocol, seqWm) => {
903
903
  for (const old of held) enqueueInner(s, old.command, old.inv.params, () => {}, () => {}, { ...old.inv.localMeta !== void 0 && { localMeta: old.inv.localMeta } });
904
904
  } else {
905
905
  const stamps = mergeBacklog(s, protocol);
906
- const queued = outboxOf(lane);
907
- const { outbox: _outbox, ...rest } = lane;
906
+ const held = outboxOf(lane).filter((c) => c.held);
907
+ const queued = outboxOf(lane).filter((c) => !c.held);
908
+ const keep = new Set(held.map((c) => c.id));
908
909
  setRecord(s, withLane(s.record, protocol, {
909
- ...withNotices(rest, [...stamps.map((c) => lostNotice(c)), ...queued.map((c) => lostNotice(c))]),
910
+ ...withNotices(withOutbox(lane, held), [...stamps.map((c) => lostNotice(c)), ...queued.map((c) => lostNotice(c))]),
910
911
  nextSeq: seqWm + 1,
911
912
  commands: [],
912
913
  ...marks(s, lane, [...stamps.map((c) => ({
@@ -914,7 +915,7 @@ const sessionLostInner = (s, protocol, seqWm) => {
914
915
  by: c.by ?? c.owner
915
916
  })), ...queued], failure)
916
917
  }));
917
- for (const p of s.pending.filter((q) => q.command.protocol === protocol)) {
918
+ for (const p of s.pending.filter((q) => q.command.protocol === protocol && !keep.has(q.id))) {
918
919
  s.lifecycle?.onCovered?.(p.inv);
919
920
  settleEntry(s, p, {
920
921
  ok: false,
@@ -980,6 +981,12 @@ const selectionOf = (syn) => {
980
981
  })
981
982
  };
982
983
  };
984
+ const carriedThrough = (lane, attached) => {
985
+ const carried = new Set([...attached].filter((p) => p.command.protocol === lane.name).map((p) => p.seq));
986
+ let seq = lane.seq ?? 0;
987
+ while (carried.has(seq + 1)) seq += 1;
988
+ return seq;
989
+ };
983
990
  const handleHello = (s, { ops, syn }) => {
984
991
  if (s.attach === "attached") {
985
992
  s.ephemeralSeqs = {};
@@ -998,6 +1005,7 @@ const handleHello = (s, { ops, syn }) => {
998
1005
  s.attachEpoch += 1;
999
1006
  s.frameFailures = 0;
1000
1007
  s.resumeAt = 0;
1008
+ s.reattach = false;
1001
1009
  const lanes = syn.protocols ?? [];
1002
1010
  s.ephemeral = lanes.length > 0 && lanes.every((lane) => lane.record === "ephemeral");
1003
1011
  if (s.ephemeral) s.deactivated = true;
@@ -1011,7 +1019,7 @@ const handleHello = (s, { ops, syn }) => {
1011
1019
  s.ephemeralSeqs[lane.name] = Math.max(Object.hasOwn(s.ephemeralSeqs, lane.name) ? s.ephemeralSeqs[lane.name] : 0, ...laneEntries(s, lane.name).map((p) => p.seq));
1012
1020
  continue;
1013
1021
  }
1014
- demote(s, lane.name, lane.seq ?? 0, demoted, waiting);
1022
+ demote(s, lane.name, carriedThrough(lane, attached), demoted, waiting);
1015
1023
  s.durableSeq[lane.name] = lane.seq ?? 0;
1016
1024
  }
1017
1025
  for (const entry of s.pending) {
@@ -1047,7 +1055,15 @@ const handleOps = (s, { ops, cmds }) => {
1047
1055
  publishIngested(s);
1048
1056
  };
1049
1057
  const handleRefusal = (s, syn) => {
1050
- const lanes = (syn.protocols ?? []).filter((lane) => lane.seq !== void 0);
1058
+ const stated = (syn.protocols ?? []).filter((lane) => lane.seq !== void 0);
1059
+ const lanes = gapFill(s) ? stated.filter(({ name }) => isEphemeral(s, name)) : stated;
1060
+ if (gapFill(s) && s.pending.some((p) => {
1061
+ if (!isStamped(p) || !p.attempted) return false;
1062
+ const protocol = p.command.protocol;
1063
+ if (isEphemeral(s, protocol)) return false;
1064
+ const seq = stated.find((lane) => lane.name === protocol)?.seq ?? 0;
1065
+ return p.seq > Math.max(seq, durableSeqOf(s, protocol));
1066
+ })) s.reattach = true;
1051
1067
  for (const { name, seq } of lanes) {
1052
1068
  const watermark = isEphemeral(s, name) ? seq : Math.max(seq, durableSeqOf(s, name));
1053
1069
  for (const entry of laneEntries(s, name)) entry.posted = entry.seq <= watermark;
@@ -1181,6 +1197,22 @@ const pump = async (s) => {
1181
1197
  while (s.running && !isFinished(s)) {
1182
1198
  if (!s.hydrated) await s.ready;
1183
1199
  const transport = s.transport;
1200
+ if (s.reattach && s.attach === "attached" && transport) {
1201
+ const delay = s.resumeAt - Date.now();
1202
+ if (delay > 0) {
1203
+ await sleepUntilWake(s, delay);
1204
+ continue;
1205
+ }
1206
+ if (s.pending.some((p) => isStamped(p) && p.attempted && isEphemeral(s, p.command.protocol))) {
1207
+ await waitForWake(s);
1208
+ continue;
1209
+ }
1210
+ s.reattach = false;
1211
+ const epoch = s.attachEpoch;
1212
+ transport.connection.reconnect();
1213
+ while (s.running && !isFinished(s) && epoch === s.attachEpoch) await waitForWake(s);
1214
+ continue;
1215
+ }
1184
1216
  const flushable = flushCandidates(s).length > 0;
1185
1217
  const queued = s.pending.some((p) => isOutboxed(p) && !p.inv.held) || queuedInRecord(s);
1186
1218
  if (buildLanes(s) === null && !flushable && (!queued || s.attach === "attached")) return;
@@ -1686,7 +1718,7 @@ const updateOutbox = (s, id, fn) => background(outboxOp(s, id, {
1686
1718
  patch: (entry) => toPatch(fn(entry))
1687
1719
  }));
1688
1720
  const producedOf = (s) => ({
1689
- wire: s.options.wireVersion ?? { version: "2026-11-01" },
1721
+ wire: s.options.wireVersion ?? CLIENT_WIRE,
1690
1722
  protocols: protocolOffers(s.options) === "*" && s.selection ? s.selection.protocols : protocolOffers(s.options)
1691
1723
  });
1692
1724
  const placed = (queue, entry, { after, before }) => {
@@ -1736,14 +1768,22 @@ const insertOutbox = (s, entry) => {
1736
1768
  return;
1737
1769
  }
1738
1770
  let base = s.record;
1771
+ let entered = stored;
1739
1772
  if (entry.from !== void 0) {
1740
1773
  const source = Object.entries(base.lanes).find(([, l]) => l.inbox?.some((n) => n.id === entry.from));
1741
1774
  if (source === void 0 || locate(s, id) !== void 0) return;
1775
+ const notice = source[1].inbox.find((n) => n.id === entry.from);
1776
+ entered = {
1777
+ ...stored,
1778
+ ts: notice.ts
1779
+ };
1742
1780
  base = withLane(base, source[0], withoutNotice(source[1], entry.from));
1743
1781
  }
1744
1782
  const lane = laneOf(base, protocol);
1783
+ const later = outboxOf(lane).find((c) => c.ts >= entered.ts);
1784
+ const position = entry.from !== void 0 && entry.after === void 0 && entry.before === void 0 && later !== void 0 ? { before: later.id } : entry;
1745
1785
  try {
1746
- setRecord(s, withLane(base, protocol, withOutbox(lane, placed(outboxOf(lane), stored, entry))));
1786
+ setRecord(s, withLane(base, protocol, withOutbox(lane, placed(outboxOf(lane), entered, position))));
1747
1787
  } catch (error) {
1748
1788
  if (!isQuota(error)) throw error;
1749
1789
  if (entry.from !== void 0) s.skipped.add(entry.from);
@@ -1925,7 +1965,7 @@ const loadSessionRecord = (store, options) => {
1925
1965
  let stored = store.load();
1926
1966
  if (stored !== null) validateLanes(stored);
1927
1967
  const current = {
1928
- wire: options.wireVersion ?? { version: "2026-11-01" },
1968
+ wire: options.wireVersion ?? CLIENT_WIRE,
1929
1969
  protocols: protocolOffers(options)
1930
1970
  };
1931
1971
  const compatible = (record) => Object.entries(record.lanes).every(([protocol, lane]) => [...lane.commands, ...outboxOf(lane)].every((command) => storedCommandCompatible(protocol, command, current)));
@@ -2011,6 +2051,7 @@ const useStatewireSession = (options) => {
2011
2051
  durableSeq: {},
2012
2052
  ephemeralSeqs: {},
2013
2053
  resumeAt: 0,
2054
+ reattach: false,
2014
2055
  idle: false,
2015
2056
  onSessionLost: void 0,
2016
2057
  onDeprecatedPath: void 0,