statewire 0.13.1 → 0.15.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 (95) hide show
  1. package/README.md +29 -78
  2. package/dist/client/connection.d.ts +20 -6
  3. package/dist/client/connection.d.ts.map +1 -1
  4. package/dist/client/connection.js +120 -52
  5. package/dist/client/connection.js.map +1 -1
  6. package/dist/client/core.d.ts +3 -2
  7. package/dist/client/core.d.ts.map +1 -1
  8. package/dist/client/core.js +10 -4
  9. package/dist/client/core.js.map +1 -1
  10. package/dist/client/session.d.ts +2 -0
  11. package/dist/client/session.d.ts.map +1 -1
  12. package/dist/client/session.js +97 -17
  13. package/dist/client/session.js.map +1 -1
  14. package/dist/host/adapter.d.ts +1 -1
  15. package/dist/host/adapter.d.ts.map +1 -1
  16. package/dist/host/adapter.js +7 -1
  17. package/dist/host/adapter.js.map +1 -1
  18. package/dist/host/host.d.ts +1 -0
  19. package/dist/host/host.d.ts.map +1 -1
  20. package/dist/host/host.js +45 -5
  21. package/dist/host/host.js.map +1 -1
  22. package/dist/host/http.d.ts +2 -1
  23. package/dist/host/http.d.ts.map +1 -1
  24. package/dist/host/http.js +108 -47
  25. package/dist/host/http.js.map +1 -1
  26. package/dist/host/socket.d.ts +33 -8
  27. package/dist/host/socket.d.ts.map +1 -1
  28. package/dist/host/socket.js +388 -58
  29. package/dist/host/socket.js.map +1 -1
  30. package/dist/host/work.d.ts +7 -0
  31. package/dist/host/work.d.ts.map +1 -0
  32. package/dist/host/work.js +53 -0
  33. package/dist/host/work.js.map +1 -0
  34. package/dist/host-internal.d.ts +42 -4
  35. package/dist/host-internal.d.ts.map +1 -1
  36. package/dist/host-internal.js +2 -1
  37. package/dist/host.d.ts +16 -3
  38. package/dist/host.d.ts.map +1 -1
  39. package/dist/host.js +2 -1
  40. package/dist/statewire.d.ts +21 -11
  41. package/dist/statewire.d.ts.map +1 -1
  42. package/dist/statewire.js +2 -2
  43. package/dist/statewire.js.map +1 -1
  44. package/dist/transports/sse.d.ts +1 -4
  45. package/dist/transports/sse.d.ts.map +1 -1
  46. package/dist/transports/sse.js +47 -56
  47. package/dist/transports/sse.js.map +1 -1
  48. package/dist/transports/testing.js +2 -2
  49. package/dist/transports/testing.js.map +1 -1
  50. package/dist/transports/ws.d.ts +1 -1
  51. package/dist/transports/ws.d.ts.map +1 -1
  52. package/dist/transports/ws.js +54 -41
  53. package/dist/transports/ws.js.map +1 -1
  54. package/dist/types.d.ts +3 -0
  55. package/dist/types.d.ts.map +1 -1
  56. package/dist/types.js.map +1 -1
  57. package/dist/wire/documents.d.ts +20 -0
  58. package/dist/wire/documents.d.ts.map +1 -0
  59. package/dist/wire/documents.js +74 -0
  60. package/dist/wire/documents.js.map +1 -0
  61. package/dist/wire/limits.d.ts +10 -0
  62. package/dist/wire/limits.d.ts.map +1 -0
  63. package/dist/wire/limits.js +11 -0
  64. package/dist/wire/limits.js.map +1 -0
  65. package/dist/wire/meta.d.ts.map +1 -1
  66. package/dist/wire/meta.js +1 -1
  67. package/dist/wire/meta.js.map +1 -1
  68. package/dist/wire/ops.d.ts.map +1 -1
  69. package/dist/wire/ops.js +1 -2
  70. package/dist/wire/ops.js.map +1 -1
  71. package/dist/wire/version.d.ts +7 -0
  72. package/dist/wire/version.d.ts.map +1 -0
  73. package/dist/wire/version.js +8 -0
  74. package/dist/wire/version.js.map +1 -0
  75. package/package.json +1 -1
  76. package/src/client/connection.ts +213 -67
  77. package/src/client/core.ts +10 -3
  78. package/src/client/session.ts +106 -30
  79. package/src/host/adapter.ts +10 -2
  80. package/src/host/host.ts +54 -4
  81. package/src/host/http.ts +168 -64
  82. package/src/host/socket.ts +603 -60
  83. package/src/host/work.ts +50 -0
  84. package/src/host-internal.ts +44 -3
  85. package/src/host.ts +18 -2
  86. package/src/statewire.ts +33 -10
  87. package/src/transports/sse.ts +60 -68
  88. package/src/transports/testing.ts +2 -2
  89. package/src/transports/ws.ts +29 -48
  90. package/src/types.ts +1 -0
  91. package/src/wire/documents.ts +109 -0
  92. package/src/wire/limits.ts +6 -0
  93. package/src/wire/meta.ts +6 -1
  94. package/src/wire/ops.ts +1 -2
  95. package/src/wire/version.ts +3 -0
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","names":["useEffect","useRef","useState","flushTapSync","reviveOps","reviveValue","backoff","timing","ConnectionState","StatewireRemoteProps","StatewireClient","StatewireHost","Episode","cause","message","TERMINAL","const","StatewireCmd","seq","type","code","payload","meta","dur","StatewireSyn","ctxSeq","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","connection","Connection","parked","hasSnapshot","lease","attempt","authDenials","liveAt","episode","awaitingHello","held","gate","abort","AbortController","lifetime","ctx","onChange","attemptOnce","notify","reconnect","setStatus","c","changed","status","protocolError","Error","isObject","value","Record","Array","isArray","isNonnegativeSafeInteger","Number","isSafeInteger","isPositiveSafeInteger","validateOptionalString","field","validateSynScalars","validateRefusalSyn","validateCmd","validateFin","validateEnvelope","entry","releaseHeld","length","onCmds","cmdsOf","env","snapshotOf","op","Object","hasOwn","helloSynOf","handleHello","onHello","onIdle","Date","now","warnedUnknownSynFact","warnUnknownSynFact","console","warn","deliverSyn","onRefusal","keys","deliverEnvelope","onOps","cmds","push","transientCauseOf","reason","settleFin","finish","rest","denial","terminal","onFinish","handleEnvelope","scheduleRetry","failure","immediate","backoffResetMs","delay","nextRetryAt","lastError","reconnectConn","run","alive","outcome","error","signal","aborted","onDetach","useStatewireConn","props","url","isNew","latest","current","setConnection","conn","classify","timeout","AbortSignal"],"sources":["../../src/client/connection.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { reviveOps, reviveValue } from \"../wire/meta\";\nimport { backoff, timing } from \"./timing\";\nimport type { ConnectionState, StatewireRemoteProps } from \"../transports/sse\";\nimport type { StatewireClient } from \"../statewire\";\nimport type { StatewireHost } from \"../host\";\n\nexport type Episode = {\n cause: \"dropped\" | \"evicted\" | \"error\" | \"unauthorized\";\n message?: 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 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 seq?: number;\n ctxSeq?: number;\n record?: \"ephemeral\";\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 connection: StatewireClient.Connection;\n parked: boolean;\n hasSnapshot: boolean;\n lease: string | null;\n attempt: number;\n authDenials: number;\n liveAt: number | null;\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 onChange: (connection: StatewireClient.Connection) => void;\n attemptOnce: (abort: AbortController) => Promise<AttemptOutcome>;\n notify: (connection: StatewireClient.Connection) => void;\n reconnect: () => void;\n};\n\nconst setStatus = (c: Conn, next: ConnectionState) => {\n const changed = next.status !== c.connection.status;\n c.connection = { ...next, reconnect: c.reconnect };\n c.notify(c.connection);\n if (changed) c.onChange(c.connection);\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 validateSynScalars = (syn: Record<string, unknown>) => {\n if (syn[\"seq\"] !== undefined && !isNonnegativeSafeInteger(syn[\"seq\"])) {\n protocolError(\"syn.seq must be a nonnegative safe integer\");\n }\n if (syn[\"ctxSeq\"] !== undefined && !isNonnegativeSafeInteger(syn[\"ctxSeq\"])) {\n protocolError(\"syn.ctxSeq must be a nonnegative safe integer\");\n }\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 validateOptionalString(syn[\"record\"], \"syn.record\");\n};\n\nexport const validateRefusalSyn = (value: unknown): StatewireSyn => {\n if (!isObject(value)) return protocolError(\"syn must be an object\");\n validateSynScalars(value);\n if (\n value[\"id\"] !== undefined ||\n value[\"idle\"] !== undefined ||\n value[\"record\"] !== undefined\n ) {\n protocolError(\"invalid refusal syn\");\n }\n if (\n value[\"seq\"] === undefined &&\n value[\"ctxSeq\"] === undefined &&\n value[\"retry\"] === undefined\n ) {\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 (!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 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 if (ops.length !== 1 || !isObject(ops[0])) {\n return protocolError(\"hello snapshot must be one root replace op\");\n }\n const op = ops[0];\n if (\n op[\"op\"] !== \"replace\" ||\n !Array.isArray(op[\"path\"]) ||\n op[\"path\"].length !== 0 ||\n !Object.hasOwn(op, \"value\")\n ) {\n return protocolError(\"hello snapshot must be one root replace op\");\n }\n return reviveOps(ops);\n};\n\nconst helloSynOf = (env: StatewireEnvelope): StatewireSyn => {\n if (!isObject(env.syn)) return protocolError(\"expected hello\");\n validateSynScalars(env.syn);\n if (env.syn[\"retry\"] !== undefined) {\n protocolError(\"hello syn cannot carry retry\");\n }\n return env.syn as StatewireSyn;\n};\n\nconst handleHello = (c: Conn, env: StatewireEnvelope) => {\n const syn = helloSynOf(env);\n const ops = snapshotOf(env);\n c.ctx.onHello({\n ops,\n syn,\n });\n c.ctx.onIdle(syn.idle ?? false);\n c.awaitingHello = false;\n c.hasSnapshot = true;\n c.liveAt = Date.now();\n c.authDenials = 0;\n c.episode = null;\n setStatus(c, { status: \"live\" });\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);\n if (value[\"record\"] !== undefined || value[\"idle\"] !== undefined) {\n protocolError(\"invalid mid-stream syn\");\n }\n if (\n value[\"seq\"] !== undefined ||\n value[\"ctxSeq\"] !== undefined ||\n value[\"retry\"] !== undefined\n ) {\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\nconst transientCauseOf = (\n reason: StatewireHost.Fin[\"reason\"],\n): Episode[\"cause\"] => {\n switch (reason) {\n case \"evicted\":\n return \"evicted\";\n case \"error\":\n return \"error\";\n case \"unauthorized\":\n return \"unauthorized\";\n default:\n return \"error\";\n }\n};\n\nconst settleFin = (c: Conn, fin: StatewireHost.Fin): AttemptOutcome => {\n let finish = fin;\n if (finish.meta !== undefined) {\n const { meta, ...rest } = finish;\n finish = { ...rest, payload: reviveValue(rest.payload, meta) };\n }\n releaseHeld(c);\n if (finish.reason === \"idle\") {\n c.ctx.onIdle(true);\n c.attempt = 0;\n c.episode = null;\n setStatus(c, { status: \"idle\" });\n return \"idle\";\n }\n // An auth denial gets one immediate redial; a consecutive repeat parks as gone.\n const denial = finish.reason === \"unauthorized\";\n const terminal = finish.reason === \"gone\" || (denial && c.authDenials > 0);\n if (denial) c.authDenials += 1;\n c.ctx.onFinish(terminal ? finish : { ...finish, reason: \"error\" });\n if (!terminal) {\n c.episode = {\n cause: transientCauseOf(finish.reason),\n ...(finish.message !== undefined && { message: finish.message }),\n };\n if (denial) openGate(c.gate);\n return \"reattach\";\n }\n setStatus(c, {\n status: \"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) {\n if (env.fin !== undefined) return settleFin(c, env.fin);\n handleHello(c, env);\n return null;\n }\n deliverEnvelope(c, env);\n if (env.fin !== undefined) return settleFin(c, env.fin);\n if (c.connection.status !== \"live\") {\n c.attempt = 0;\n c.episode = null;\n setStatus(c, { status: \"live\" });\n }\n return null;\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 = immediate ? 0 : backoff(c.attempt);\n setStatus(c, {\n status: \"reconnecting\",\n ...c.episode,\n attempt: c.attempt,\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 === \"gone\" || c.connection.status === \"idle\") {\n c.attempt = 0;\n c.authDenials = 0;\n c.episode = { cause: \"dropped\" };\n flushTapSync(() => {\n scheduleRetry(c, undefined, true);\n });\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 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 outcome = await c.attemptOnce(abort);\n } catch (error) {\n if (!abort.signal.aborted) {\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 (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 useStatewireConn = (props: {\n url: string;\n isNew?: boolean | undefined;\n onChange?: ((connection: StatewireClient.Connection) => void) | undefined;\n ctx: StatewireRemoteProps;\n attemptOnce: (c: Conn, abort: AbortController) => Promise<AttemptOutcome>;\n}): Conn => {\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 hasSnapshot: false,\n lease: null,\n attempt: 0,\n authDenials: 0,\n liveAt: null,\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 onChange: (connection) => latest.current.onChange?.(connection),\n attemptOnce: (abort) => latest.current.attemptOnce(conn, abort),\n notify: setConnection,\n reconnect: () => reconnectConn(conn),\n connection: { status: \"connecting\", reconnect: () => conn.reconnect() },\n };\n return conn;\n });\n\n useEffect(() => {\n c.hasSnapshot = false;\n c.lease = null;\n c.attempt = 0;\n c.authDenials = 0;\n c.liveAt = null;\n c.episode = null;\n if (c.connection.status !== \"connecting\") {\n setStatus(c, { status: \"connecting\" });\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]);\n\n return c;\n};\n\nexport const classify = (timeout: AbortSignal) =>\n new Error(timeout.aborted ? \"timeout\" : \"network\");\n"],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","names":["useEffect","useRef","useState","flushTapSync","reviveOps","reviveValue","backoff","timing","ConnectionState","RemoteLink","StatewireFrame","StatewireRemoteProps","StatewireSubmitResult","StatewireClient","StatewireHost","Episode","cause","message","code","TERMINAL","const","StatewireCmd","seq","type","payload","meta","dur","StatewireSyn","ctxSeq","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","connection","Connection","parked","lease","attempt","authDenials","authStale","liveAt","retryAt","error","ConnectionError","episode","awaitingHello","held","gate","abort","AbortController","lifetime","ctx","onError","onChange","attemptOnce","notify","reconnect","degradedOf","state","status","reason","sameState","a","b","nextRetryAt","lastError","setStatus","c","degraded","protocolError","Error","isObject","value","Record","Array","isArray","isNonnegativeSafeInteger","Number","isSafeInteger","isPositiveSafeInteger","validateOptionalString","field","validateSynScalars","validateRefusalSyn","validateCmd","validateFin","validateEnvelope","entry","releaseHeld","length","onCmds","cmdsOf","env","snapshotOf","helloSynOf","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","signal","aborted","SyntaxError","test","onDetach","includes","unsupportedVersion","version","resolveHeaders","headers","HeadersOption","staleAuth","Headers","attachFrame","resolved","lanes","takeAttachLanes","body","JSON","stringify","fromEntries","useLink","props","url","isNew","send","frame","latest","current","setConnection","conn","link","classify","timeout","AbortSignal"],"sources":["../../src/client/connection.ts"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { reviveOps, reviveValue } from \"../wire/meta\";\nimport { backoff, timing } from \"./timing\";\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 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 seq?: number;\n ctxSeq?: number;\n record?: \"ephemeral\";\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 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\nexport const degradedOf = (state: ConnectionState): boolean =>\n (state.status === \"connecting\" && state.attempt > 0) ||\n (state.status === \"disconnected\" &&\n state.reason !== \"idle\" &&\n state.reason !== \"deferred\");\n\nconst sameState = (a: ConnectionState, b: ConnectionState): boolean => {\n if (a.status !== b.status) return false;\n if (a.status === \"connecting\" && b.status === \"connecting\") {\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 );\n }\n if (a.status === \"disconnected\" && b.status === \"disconnected\") {\n return a.reason === b.reason;\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 degraded: degradedOf(next),\n };\n c.notify(c.connection);\n c.onChange(c.connection);\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 validateSynScalars = (syn: Record<string, unknown>) => {\n if (syn[\"seq\"] !== undefined && !isNonnegativeSafeInteger(syn[\"seq\"])) {\n protocolError(\"syn.seq must be a nonnegative safe integer\");\n }\n if (syn[\"ctxSeq\"] !== undefined && !isNonnegativeSafeInteger(syn[\"ctxSeq\"])) {\n protocolError(\"syn.ctxSeq must be a nonnegative safe integer\");\n }\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 validateOptionalString(syn[\"record\"], \"syn.record\");\n};\n\nexport const validateRefusalSyn = (value: unknown): StatewireSyn => {\n if (!isObject(value)) return protocolError(\"syn must be an object\");\n validateSynScalars(value);\n if (\n value[\"id\"] !== undefined ||\n value[\"idle\"] !== undefined ||\n value[\"record\"] !== undefined\n ) {\n protocolError(\"invalid refusal syn\");\n }\n if (\n value[\"seq\"] === undefined &&\n value[\"ctxSeq\"] === undefined &&\n value[\"retry\"] === undefined\n ) {\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 (!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 if (ops.length === 0) 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);\n if (env.syn[\"retry\"] !== undefined) {\n protocolError(\"hello syn cannot carry retry\");\n }\n return env.syn as StatewireSyn;\n};\n\nconst handleHello = (c: Conn, env: StatewireEnvelope) => {\n const syn = helloSynOf(env);\n const ops = snapshotOf(env);\n c.ctx.onHello({\n ops,\n syn,\n });\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\" });\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);\n if (value[\"record\"] !== undefined || value[\"idle\"] !== undefined) {\n protocolError(\"invalid mid-stream syn\");\n }\n if (\n value[\"seq\"] !== undefined ||\n value[\"ctxSeq\"] !== undefined ||\n value[\"retry\"] !== undefined\n ) {\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() + (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: \"disconnected\", reason: \"idle\" });\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: \"disconnected\",\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) {\n if (env.fin !== undefined) return settleFin(c, env.fin);\n handleHello(c, env);\n return null;\n }\n deliverEnvelope(c, env);\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\" });\n }\n return null;\n};\n\nconst dialing = (c: Conn) =>\n setStatus(c, { status: \"connecting\", attempt: c.attempt });\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 setStatus(c, {\n status: \"connecting\",\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 === \"disconnected\") {\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 outcome = await c.attemptOnce(abort);\n } catch (error) {\n if (!abort.signal.aborted) {\n 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 (\n c.connection.status === \"disconnected\" &&\n ![\"deferred\", \"idle\"].includes(c.connection.reason)\n )\n 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 resolved = await resolveHeaders(headers, c.authStale);\n c.authStale = false;\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 = (props: {\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}): 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) => latest.current.attemptOnce(conn, abort),\n notify: setConnection,\n reconnect: () => reconnectConn(conn),\n connection: {\n ...((props.isNew ?? false)\n ? { status: \"disconnected\", reason: \"deferred\" }\n : { status: \"connecting\", attempt: 0 }),\n degraded: false,\n reconnect: () => conn.reconnect(),\n },\n };\n return conn;\n });\n const [link] = useState(\n (): 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 }),\n );\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: \"disconnected\", reason: \"deferred\" }\n : { status: \"connecting\", attempt: 0 },\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]);\n\n return link;\n};\n\nexport const classify = (timeout: AbortSignal) =>\n new Error(timeout.aborted ? \"timeout\" : \"network\");\n"],"mappings":";;;;;;AAqBA,MAAamB,WAAW;CACtB;CACA;CACA;CACA;CACA;AAAS;AAkCX,MAAMwB,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;AA4BA,MAAayC,cAAcC,UACxBA,MAAMC,WAAW,gBAAgBD,MAAMrB,UAAU,KACjDqB,MAAMC,WAAW,kBAChBD,MAAME,WAAW,UACjBF,MAAME,WAAW;AAErB,MAAMC,aAAaC,GAAoBC,MAAgC;CACrE,IAAID,EAAEH,WAAWI,EAAEJ,QAAQ,OAAO;CAClC,IAAIG,EAAEH,WAAW,gBAAgBI,EAAEJ,WAAW,cAC5C,OACEG,EAAEzB,YAAY0B,EAAE1B,WAChByB,EAAEvE,UAAUwE,EAAExE,SACduE,EAAErE,SAASsE,EAAEtE,QACbqE,EAAEE,gBAAgBD,EAAEC,eACpBF,EAAEG,cAAcF,EAAEE;CAGtB,IAAIH,EAAEH,WAAW,kBAAkBI,EAAEJ,WAAW,gBAC9C,OAAOG,EAAEF,WAAWG,EAAEH;CAExB,OAAO;AACT;AAEA,MAAMM,aAAaC,GAASxD,SAA0B;CACpD,IAAIkD,UAAUlD,MAAMwD,EAAElC,UAAU,KAAKkC,EAAElC,WAAWS,UAAUyB,EAAEzB,OAAO;CACrEyB,EAAElC,aAAa;EACb,GAAGtB;EACH,GAAIwD,EAAEzB,UAAUvB,KAAAA,IAAY,CAAC,IAAI,EAAEuB,OAAOyB,EAAEzB,MAAM;EAClDc,WAAWW,EAAEX;EACbY,UAAUX,WAAW9C,IAAI;CAC3B;CACAwD,EAAEZ,OAAOY,EAAElC,UAAU;CACrBkC,EAAEd,SAASc,EAAElC,UAAU;AACzB;AAEA,MAAMoC,iBAAiB7E,YAA2B;CAChD,MAAM,IAAI8E,MAAM,8BAA8B9E,SAAS;AACzD;AAEA,MAAM+E,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,UAAUrD,KAAAA,KAAa,OAAOqD,UAAU,UAC1CH,cAAc,GAAGY,MAAK,kBAAmB;AAE7C;AAEA,MAAMC,sBAAsBtE,QAAiC;CAC3D,IAAIA,IAAI,WAAWO,KAAAA,KAAa,CAACyD,yBAAyBhE,IAAI,MAAM,GAClEyD,cAAc,4CAA4C;CAE5D,IAAIzD,IAAI,cAAcO,KAAAA,KAAa,CAACyD,yBAAyBhE,IAAI,SAAS,GACxEyD,cAAc,+CAA+C;CAE/D,IAAIzD,IAAI,aAAaO,KAAAA,KAAa,CAACyD,yBAAyBhE,IAAI,QAAQ,GACtEyD,cAAc,8CAA8C;CAE9DW,uBAAuBpE,IAAI,OAAO,QAAQ;CAC1C,IAAIA,IAAI,YAAYO,KAAAA,KAAa,OAAOP,IAAI,YAAY,WACtDyD,cAAc,4BAA4B;CAE5CW,uBAAuBpE,IAAI,WAAW,YAAY;AACpD;AAEA,MAAauE,sBAAsBX,UAAiC;CAClE,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOH,cAAc,uBAAuB;CAClEa,mBAAmBV,KAAK;CACxB,IACEA,MAAM,UAAUrD,KAAAA,KAChBqD,MAAM,YAAYrD,KAAAA,KAClBqD,MAAM,cAAcrD,KAAAA,GAEpBkD,cAAc,qBAAqB;CAErC,IACEG,MAAM,WAAWrD,KAAAA,KACjBqD,MAAM,cAAcrD,KAAAA,KACpBqD,MAAM,aAAarD,KAAAA,GAEnBkD,cAAc,wCAAwC;CAExD,OAAOG;AACT;AAEA,MAAMY,eAAeZ,UAA0C;CAC7D,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOH,cAAc,6BAA6B;CACxE,IAAI,CAACU,sBAAsBP,MAAM,MAAM,GACrCH,cAAc,yCAAyC;CAEzDW,uBAAuBR,MAAM,SAAS,UAAU;CAChDQ,uBAAuBR,MAAM,SAAS,UAAU;CAChDQ,uBAAuBR,MAAM,YAAY,aAAa;CACtD,IAAIA,MAAM,WAAWrD,KAAAA,KAAaqD,MAAM,WAAW,MACjDH,cAAc,sBAAsB;CAEtC,OAAO;AACT;AAEA,MAAMgB,eAAeb,UAA+C;CAClE,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOH,cAAc,uBAAuB;CAClE,IAAI,OAAOG,MAAM,cAAc,UAC7BH,cAAc,6BAA6B;CAE7CW,uBAAuBR,MAAM,YAAY,aAAa;CACtDQ,uBAAuBR,MAAM,SAAS,UAAU;CAChD,IACEA,MAAM,cAAcrD,KAAAA,KACpB,CAACyD,yBAAyBJ,MAAM,SAAS,GAEzCH,cAAc,+CAA+C;CAC/D,IAAIG,MAAM,aAAarD,KAAAA,KAAa,CAACyD,yBAAyBJ,MAAM,QAAQ,GAC1EH,cAAc,8CAA8C;CAC9D,OAAO;AACT;AAEA,MAAMiB,oBAAoBd,UAAsC;CAC9D,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOH,cAAc,0BAA0B;CACrE,IAAIG,MAAM,WAAWrD,KAAAA,KAAa,CAACuD,MAAMC,QAAQH,MAAM,MAAM,GAC3DH,cAAc,sBAAsB;CAEtC,IAAIG,MAAM,WAAWrD,KAAAA,GAAW;EAC9B,MAAMT,MAAM8D,MAAM;EAClB,IAAI,CAACE,MAAMC,QAAQjE,GAAG,GAAG,OAAO2D,cAAc,sBAAsB;EACpE,KAAK,MAAMkB,SAAS7E,KAAK0E,YAAYG,KAAK;CAC5C;CACA,IAAIf,MAAM,YAAYrD,KAAAA,KAAa,OAAOqD,MAAM,YAAY,WAC1DH,cAAc,wBAAwB;CAExC,IAAIG,MAAM,YAAYrD,KAAAA,GAAW;EAC/B,IAAIqD,MAAM,YAAY,MAAMH,cAAc,mBAAmB;EAC7D,IACEG,MAAM,WAAWrD,KAAAA,KACjBqD,MAAM,WAAWrD,KAAAA,KACjBqD,MAAM,WAAWrD,KAAAA,GAEjBkD,cAAc,kCAAkC;CAEpD;CACA,IAAIG,MAAM,WAAWrD,KAAAA,GAAWkE,YAAYb,MAAM,MAAM;CACxD,OAAOA;AACT;AAGA,MAAMgB,eAAerB,MAAY;CAC/B,IAAIA,EAAErB,KAAK2C,WAAW,GAAG;CACzB,MAAM3C,OAAOqB,EAAErB;CACfqB,EAAErB,OAAO,CAAA;CACTqB,EAAEhB,IAAIuC,OAAO5C,IAAI;AACnB;AAEA,MAAM6C,UAAUC,QAA2C;CACzD,IAAIA,IAAIlF,QAAQS,KAAAA,GAAW,OAAO,CAAA;CAClC,OAAOyE,IAAIlF;AACb;AAEA,MAAMmF,cAAcD,QAAsC;CACxD,MAAMnF,MAAMmF,IAAInF;CAChB,IAAIA,QAAQU,KAAAA,GAAW,OAAOkD,cAAc,wBAAwB;CACpE,IAAI5D,IAAIgF,WAAW,GAAG,OAAOpB,cAAc,wBAAwB;CACnE,OAAO1F,UAAU8B,GAAG;AACtB;AAEA,MAAMqF,cAAcF,QAAyC;CAC3D,IAAI,CAACrB,SAASqB,IAAIhF,GAAG,GAAG,OAAOyD,cAAc,gBAAgB;CAC7Da,mBAAmBU,IAAIhF,GAAG;CAC1B,IAAIgF,IAAIhF,IAAI,aAAaO,KAAAA,GACvBkD,cAAc,8BAA8B;CAE9C,OAAOuB,IAAIhF;AACb;AAEA,MAAMmF,eAAe5B,GAASyB,QAA2B;CACvD,MAAMhF,MAAMkF,WAAWF,GAAG;CAC1B,MAAMnF,MAAMoF,WAAWD,GAAG;CAC1BzB,EAAEhB,IAAI6C,QAAQ;EACZvF;EACAG;CACF,CAAC;CACDuD,EAAEhB,IAAI8C,OAAOrF,IAAIN,QAAQ,KAAK;CAC9B6D,EAAEtB,gBAAgB;CAClBsB,EAAEzB,QAAQvB,KAAAA;CACVgD,EAAE3B,SAAS0D,KAAKC,IAAI;CACpBhC,EAAE7B,cAAc;CAChB6B,EAAEvB,UAAU;CACZsB,UAAUC,GAAG,EAAER,QAAQ,YAAY,CAAC;AACtC;AAEA,IAAIyC,uBAAuB;AAE3B,MAAMC,2BAA2B;CAC/B,IAAID,sBAAsB;CAC1BA,uBAAuB;CACvBE,QAAQC,KAAK,sCAAsC;AACrD;AAEA,MAAMC,cAAcrC,GAASK,UAAmB;CAC9C,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOH,cAAc,uBAAuB;CAClEa,mBAAmBV,KAAK;CACxB,IAAIA,MAAM,cAAcrD,KAAAA,KAAaqD,MAAM,YAAYrD,KAAAA,GACrDkD,cAAc,wBAAwB;CAExC,IACEG,MAAM,WAAWrD,KAAAA,KACjBqD,MAAM,cAAcrD,KAAAA,KACpBqD,MAAM,aAAarD,KAAAA,GACnB;EACAgD,EAAEhB,IAAIsD,UAAUtB,mBAAmBX,KAAK,CAAC;EACzC;CACF;CACA,IAAIA,MAAM,UAAUrD,KAAAA,GAAW;CAC/B,IAAIuF,OAAOC,KAAKnC,KAAK,CAAC,CAACiB,WAAW,GAChCpB,cAAc,wBAAwB;CAExCgC,mBAAmB;AACrB;AAEA,MAAMO,mBAAmBzC,GAASyB,QAA2B;CAC3D,IAAIA,IAAIhF,QAAQO,KAAAA,GAAWqF,WAAWrC,GAAGyB,IAAIhF,GAAG;CAChD,IAAIgF,IAAInF,QAAQU,KAAAA,GAAW;EACzB,MAAM2B,OAAOqB,EAAErB;EACfqB,EAAErB,OAAO,CAAA;EACTqB,EAAEhB,IAAI0D,MAAM;GACVpG,KAAK9B,UAAUiH,IAAInF,GAAG;GACtBqG,MAAM,CAAC,GAAGhE,MAAM,GAAG6C,OAAOC,GAAG,CAAC;EAChC,CAAC;CACH,OAAO,IAAIA,IAAIlF,QAAQS,KAAAA,GAAW;EAChC,MAAM2F,OAAOnB,OAAOC,GAAG;EACvB,IAAIA,IAAIjF,SAAS,MAAMwD,EAAErB,KAAKiE,KAAK,GAAGD,IAAI;OACrC3C,EAAEhB,IAAIuC,OAAOoB,IAAI;CACxB;CACA,IAAI,OAAOlB,IAAItF,SAAS,WAAW6D,EAAEhB,IAAI8C,OAAOL,IAAItF,IAAI;AAC1D;AAEA,MAAa0G,aAAa7C,GAAStD,QAA2C;CAC5E,MAAMoG,SACJpG,IAAIb,SAASmB,KAAAA,IACTN,MACA;EAAE,GAAGA;EAAKd,SAASnB,YAAYiC,IAAId,SAASc,IAAIb,IAAI;CAAE;CAC5DwF,YAAYrB,CAAC;CACbA,EAAE1B,UAAUyD,KAAKC,IAAI,KAAKc,OAAO1G,SAAS;CAC1C,IAAI0G,OAAOrD,WAAW,QAAQ;EAC5BO,EAAEhB,IAAI8C,OAAO,IAAI;EACjB9B,EAAE9B,UAAU;EACZ8B,EAAEvB,UAAU;EACZuB,EAAEzB,QAAQvB,KAAAA;EACV+C,UAAUC,GAAG;GAAER,QAAQ;GAAgBC,QAAQ;EAAO,CAAC;EACvD,OAAO;CACT;CACA,MAAMsD,SAASD,OAAOrD,WAAW;CACjC,MAAMuD,WACJF,OAAOrD,WAAW,UAClBqD,OAAOrD,WAAW,eAClBqD,OAAOrD,WAAW,oBACjBsD,UAAU/C,EAAE7B,cAAc;CAC7B,IAAI4E,QAAQ;EACV/C,EAAE7B,eAAe;EACjB6B,EAAE5B,YAAY;CAChB;CAKA4B,EAAEzB,QAHAuE,OAAOrD,WAAW,eAClBqD,OAAOrD,WAAW,WACjB,CAACsD,UAAUC,YAEVT,OAAOW,OAAO,IAAI/C,MAAM2C,OAAOzH,WAAWyH,OAAOrD,MAAM,GAAG,EAAE/C,KAAKoG,OAAO,CAAC,IACzE9F,KAAAA;CACJ,IAAIgD,EAAEzB,OAAOyB,EAAEf,QAAQe,EAAEzB,KAAK;CAC9B,IAAI,CAACyE,UAAU;EACbhD,EAAEvB,UAAU;GACVrD,OACE0H,OAAOrD,WAAW,cACd,cACAsD,SACE,iBACA;GACR,GAAID,OAAOzH,YAAY2B,KAAAA,KAAa,EAAE3B,SAASyH,OAAOzH,QAAQ;GAC9D,GAAIyH,OAAOxH,SAAS0B,KAAAA,KAAa,EAAE1B,MAAMwH,OAAOxH,KAAK;EACvD;EACA,IAAIyH,QAAQpF,SAASqC,EAAEpB,IAAI;EAC3B,OAAO;CACT;CACAoB,EAAEhB,IAAImE,SAASL,MAAM;CACrB/C,UAAUC,GAAG;EACXR,QAAQ;EACRC,QAAQsD,SACJ,iBACAD,OAAOrD,WAAW,cAChB,cACAqD,OAAOrD,WAAW,mBAChB,mBACA;EACR,GAAIqD,OAAOzH,YAAY2B,KAAAA,KAAa,EAAE3B,SAASyH,OAAOzH,QAAQ;EAC9D,GAAIyH,OAAOlH,YAAYoB,KAAAA,KAAa,EAAEpB,SAASkH,OAAOlH,QAAQ;CAChE,CAAC;CACD,OAAO;AACT;AAEA,MAAawH,kBACXpD,GACAK,UAC0B;CAC1B,MAAMoB,MAAMN,iBAAiBd,KAAK;CAClC,IAAIL,EAAEtB,eAAe;EACnB,IAAI+C,IAAI/E,QAAQM,KAAAA,GAAW,OAAO6F,UAAU7C,GAAGyB,IAAI/E,GAAG;EACtDkF,YAAY5B,GAAGyB,GAAG;EAClB,OAAO;CACT;CACAgB,gBAAgBzC,GAAGyB,GAAG;CACtB,IAAIA,IAAI/E,QAAQM,KAAAA,GAAW,OAAO6F,UAAU7C,GAAGyB,IAAI/E,GAAG;CACtD,IAAIsD,EAAElC,WAAW0B,WAAW,aAAa;EACvCQ,EAAE9B,UAAU;EACZ8B,EAAEvB,UAAU;EACZsB,UAAUC,GAAG,EAAER,QAAQ,YAAY,CAAC;CACtC;CACA,OAAO;AACT;AAEA,MAAM6D,WAAWrD,MACfD,UAAUC,GAAG;CAAER,QAAQ;CAActB,SAAS8B,EAAE9B;AAAQ,CAAC;AAE3D,MAAMoF,iBACJtD,GACAuD,SACAC,cACG;CACH,IAAIxD,EAAE3B,WAAW,QAAQ0D,KAAKC,IAAI,IAAIhC,EAAE3B,UAAU1D,OAAO8I,gBACvDzD,EAAE9B,UAAU;CAEd8B,EAAE3B,SAAS;CACX2B,EAAE9B,WAAW;CACb8B,EAAEvB,YAAY,EAAErD,OAAO,UAAU;CACjC,MAAMsI,QAAQC,KAAKC,IACjBJ,YAAY,IAAI9I,QAAQsF,EAAE9B,OAAO,GACjC8B,EAAE1B,UAAUyD,KAAKC,IAAI,CACvB;CACAjC,UAAUC,GAAG;EACXR,QAAQ;EACRtB,SAAS8B,EAAE9B;EACX,GAAG8B,EAAEvB;EACLoB,aAAakC,KAAKC,IAAI,IAAI0B;EAC1B,GAAIH,YAAYvG,KAAAA,KAAa,EAAE8C,WAAWyD,QAAQ;CACpD,CAAC;CACD,OAAOG;AACT;AAEA,MAAMG,iBAAiB7D,MAAY;CACjC,IAAI,CAACA,EAAEjB,UAAU;CACjB,IAAIiB,EAAElC,WAAW0B,WAAW,gBAAgB;EAE1CQ,EAAE9B,UAAU;EACZ8B,EAAE7B,cAAc;EAChB6B,EAAEvB,UAAU;EACZlE,mBAAmB8I,QAAQrD,CAAC,CAAC;CAC/B;CACArC,SAASqC,EAAEpB,IAAI;CACfoB,EAAEnB,OAAOA,MAAM;AACjB;AAEA,MAAMiF,MAAM,OAAO9D,GAASjB,UAA2BH,SAAe;CACpE,MAAMmF,cAAc/D,EAAEjB,aAAaA;CACnC,IAAIiB,EAAEhC,QAAQ;EACZ,MAAMZ,SAASwB,IAAI;EACnB,IAAI,CAACmF,MAAM,GAAG;EACd/D,EAAEhC,SAAS;CACb;CACA,OAAO+F,MAAM,GAAG;EACd,IAAI/D,EAAE1B,UAAUyD,KAAKC,IAAI,GAAG;GAC1B,MAAM5E,SAASwB,MAAMoB,EAAE1B,UAAUyD,KAAKC,IAAI,CAAC;GAC3C;EACF;EAEAzH,mBAAmB8I,QAAQrD,CAAC,CAAC;EAC7B,MAAMnB,QAAQ,IAAIC,gBAAgB;EAClCkB,EAAEnB,QAAQA;EACVmB,EAAEtB,gBAAgB;EAClBsB,EAAErB,OAAO,CAAA;EACT,IAAIqF;EACJ,IAAIT;EACJ,IAAI;GACFS,UAAU,MAAMhE,EAAEb,YAAYN,KAAK;EACrC,SAASN,OAAO;GACd,IAAI,CAACM,MAAMoF,OAAOC,SAAS;IACzB,IACE3F,iBAAiB4F,eAChB5F,iBAAiB4B,SAChB,uDAAuDiE,KACrD7F,MAAMlD,OACR,GAEF2I,UAAUzJ,mBACRsI,UAAU7C,GAAG;KAAEP,QAAQ;KAAkBpE,SAASkD,MAAMlD;IAAQ,CAAC,CACnE;SACK,IAAI2E,EAAE5B,WACX4F,UAAUzJ,mBACRsI,UAAU7C,GAAG;KACXP,QAAQ;KACRpE,SACEkD,iBAAiB4B,QACb5B,MAAMlD,UACN;IACR,CAAC,CACH;IAEFkI,UACEhF,iBAAiB4B,SAAS5B,MAAMlD,UAAUkD,MAAMlD,UAAU;GAC9D;EACF;EACAwD,MAAMA,MAAM;EACZ,IAAI,CAACkF,MAAM,GAAG;EACdxJ,mBAAmB;GACjB8G,YAAYrB,CAAC;GACbA,EAAEhB,IAAIqF,SAAS;EACjB,CAAC;EACD,IAAI,CAACN,MAAM,GAAG;EACd,IACE/D,EAAElC,WAAW0B,WAAW,kBACxB,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC8E,SAAStE,EAAElC,WAAW2B,MAAM,GAElDuE,UAAU;EACZ,IAAIA,YAAY,UAAUA,YAAY,QAAQ;GAC5C,MAAM5G,SAASwB,IAAI;GACnB;EACF;EACA,MAAM4E,YAAYvG,SAAS2B,IAAI;EAC/B,MAAM8E,QAAQnJ,mBAAmB+I,cAActD,GAAGuD,SAASC,SAAS,CAAC;EACrE,IAAIE,UAAU,GAAG;EACjB,MAAMtG,SAASwB,MAAM8E,KAAK;CAC5B;AACF;AAEA,MAAaa,sBAAsBvE,GAASwE,YAC1CjK,mBACE6I,eAAepD,GAAG,EAChBtD,KAAK;CACH+C,QAAQ;CACRpE,SAAS,iCAAiCmJ,WAAW;AACvD,EACF,CAAC,CACH,KAAK;AAEP,MAAaC,iBAAiB,OAC5BC,SACAE,cAEA,IAAIC,QACF,OAAOH,YAAY,aAAa,MAAMA,QAAQ,EAAEE,UAAU,CAAC,IAAIF,OACjE;AAGF,MAAaI,cAAc,OACzB9E,GACA0E,YACG;CACH,MAAMK,WAAW,MAAMN,eAAeC,SAAS1E,EAAE5B,SAAS;CAC1D4B,EAAE5B,YAAY;CACd,MAAM4G,QAAQzK,mBAAmByF,EAAEhB,IAAIiG,gBAAgB,CAAC;CACxD,OAAO;EACLP,SAASK;EACTG,MAAMC,KAAKC,UAAU;GACnBV,SAASnC,OAAO8C,YAAYN,QAAQ;GACpC,GAAIC,SAAS,CAAC;EAChB,CAAC;CACH;AACF;AAEA,MAAaM,WAAWC,UAQN;CAChB,MAAMK,SAASvL,OAAOkL,KAAK;CAC3BK,OAAOC,UAAUN;CACjB,MAAM,GAAGO,iBAAiBxL,SAA4C,IAAI;CAC1E,MAAM,CAAC0F,KAAK1F,eAAqB;EAC/B,MAAMyL,OAAa;GACjB/H,QAAQuH,MAAME,SAAS;GACvBxH,OAAO;GACPC,SAAS;GACTC,aAAa;GACbC,WAAW;GACXC,QAAQ;GACRC,SAAS;GACTC,OAAOvB,KAAAA;GACPyB,SAAS;GACTC,eAAe;GACfC,MAAM,CAAA;GACNE,OAAO;GACPD,MAAM7B,QAAQ;GACdgC,UAAU;GACV,IAAIC,MAAM;IACR,OAAO4G,OAAOC,QAAQ7G;GACxB;GACAC,UAAUV,UAAUqH,OAAOC,QAAQ5G,UAAUV,KAAK;GAClDW,WAAWpB,eAAe8H,OAAOC,QAAQ3G,WAAWpB,UAAU;GAC9DqB,cAAcN,UAAU+G,OAAOC,QAAQ1G,YAAY4G,MAAMlH,KAAK;GAC9DO,QAAQ0G;GACRzG,iBAAiBwE,cAAckC,IAAI;GACnCjI,YAAY;IACV,GAAKyH,MAAME,SAAS,QAChB;KAAEjG,QAAQ;KAAgBC,QAAQ;IAAW,IAC7C;KAAED,QAAQ;KAActB,SAAS;IAAE;IACvC+B,UAAU;IACVZ,iBAAiB0G,KAAK1G,UAAU;GAClC;EACF;EACA,OAAO0G;CACT,CAAC;CACD,MAAM,CAACC,QAAQ1L,gBACM;EACjB,IAAIwD,aAAa;GACf,OAAOkC,EAAElC;EACX;EACA,IAAIE,SAAS;GACX,OAAOgC,EAAEhC;EACX;EACA0H,OAAOC,UAAUC,OAAOC,QAAQH,KAAK1F,GAAG2F,KAAK;CAC/C,EACF;CAEAvL,gBAAgB;EACd4F,EAAE/B,QAAQ;EACV+B,EAAE9B,UAAU;EACZ8B,EAAE7B,cAAc;EAChB6B,EAAE5B,YAAY;EACd4B,EAAE3B,SAAS;EACX2B,EAAE1B,UAAU;EACZ0B,EAAEvB,UAAU;EACZsB,UACEC,GACAA,EAAEhC,SACE;GAAEwB,QAAQ;GAAgBC,QAAQ;EAAW,IAC7C;GAAED,QAAQ;GAActB,SAAS;EAAE,CACzC;EACA,MAAMa,WAAW,IAAID,gBAAgB;EACrCkB,EAAEjB,WAAWA;EACbiB,EAAEpB,OAAO7B,QAAQ;EACjB,IAASiD,GAAGjB,UAAUiB,EAAEpB,IAAI;EAC5B,aAAa;GACXoB,EAAEnB,OAAOA,MAAM;GACfE,SAASF,MAAM;GACf,IAAImB,EAAEjB,aAAaA,UAAUiB,EAAEjB,WAAW;GAC1CpB,SAASqC,EAAEpB,IAAI;EACjB;CACF,GAAG,CAACoB,GAAGuF,MAAMC,GAAG,CAAC;CAEjB,OAAOQ;AACT;AAEA,MAAaC,YAAYC,4BACvB,IAAI/F,MAAM+F,QAAQhC,UAAU,YAAY,SAAS"}
@@ -3,7 +3,7 @@ import { StatewireClient } from "../statewire.js";
3
3
  import { Statewire } from "../types.js";
4
4
  import { StatewirePath } from "../wire/ops.js";
5
5
  //#region src/client/core.d.ts
6
- declare const LIVE_CONNECTION: StatewireClient.Connection;
6
+ declare const CONNECTED_CONNECTION: StatewireClient.Connection;
7
7
  type Overlay = {
8
8
  inv: CommandsInvocation;
9
9
  dropped: boolean;
@@ -21,6 +21,7 @@ type Core = {
21
21
  notifiedPublished: unknown;
22
22
  notifiedOverlayPaths: readonly StatewirePath[];
23
23
  notifiedConnection: StatewireClient.Connection | null;
24
+ notifiedError: StatewireClient.ConnectionError | undefined;
24
25
  notifiedBusy: boolean;
25
26
  notifiedFailed: readonly StatewireClient.FailedCommand[];
26
27
  stale: boolean;
@@ -39,5 +40,5 @@ type Core = {
39
40
  };
40
41
  declare const useStatewireCore: (getOptions: () => StatewireClient.Options<any, any>, value: Statewire<unknown>) => Core;
41
42
  //#endregion
42
- export { LIVE_CONNECTION, useStatewireCore };
43
+ export { CONNECTED_CONNECTION, useStatewireCore };
43
44
  //# sourceMappingURL=core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","names":[],"sources":["../../src/client/core.ts"],"mappings":";;;;;cAYa,iBAAiB,gBAAgB;KAgBzC;EAAY,KAAK;EAAoB;;KAErC;EACH,kBAAkB,gBAAgB;EAClC,OAAO;EACP,QAAQ,UAAU;EAClB,UAAU;EACV,SAAS,UAAU;EACnB,gBAAgB;EAChB;EACA;EACA,uBAAuB;EACvB;EACA,+BAA+B;EAC/B,oBAAoB,gBAAgB;EACpC;EACA,yBAAyB,gBAAgB;EACzC;EACA;EACA;EACA;EACA;EACA,WAAW;EACX;EACA,kBAAkB;EAClB;EACA;EACA,0BAA0B,gBAAgB;EAC1C,UAAU,UAAU;EACpB,YAAY;;cA+ND,mBACX,kBAAkB,gBAAgB,mBAClC,OAAO,uBAAkB"}
1
+ {"version":3,"file":"core.d.ts","names":[],"sources":["../../src/client/core.ts"],"mappings":";;;;;cAYa,sBAAsB,gBAAgB;KAiB9C;EAAY,KAAK;EAAoB;;KAErC;EACH,kBAAkB,gBAAgB;EAClC,OAAO;EACP,QAAQ,UAAU;EAClB,UAAU;EACV,SAAS,UAAU;EACnB,gBAAgB;EAChB;EACA;EACA,uBAAuB;EACvB;EACA,+BAA+B;EAC/B,oBAAoB,gBAAgB;EACpC,eAAe,gBAAgB;EAC/B;EACA,yBAAyB,gBAAgB;EACzC;EACA;EACA;EACA;EACA;EACA,WAAW;EACX;EACA,kBAAkB;EAClB;EACA;EACA,0BAA0B,gBAAgB;EAC1C,UAAU,UAAU;EACpB,YAAY;;cAmOD,mBACX,kBAAkB,gBAAgB,mBAClC,OAAO,uBAAkB"}
@@ -6,8 +6,9 @@ import { createMacrotaskPoster } from "../util/macrotask.js";
6
6
  import { createChanges } from "./changes.js";
7
7
  import { useEffect, useState } from "@assistant-ui/tap/react-shim";
8
8
  //#region src/client/core.ts
9
- const LIVE_CONNECTION = {
10
- status: "live",
9
+ const CONNECTED_CONNECTION = {
10
+ status: "connected",
11
+ degraded: false,
11
12
  reconnect: () => {}
12
13
  };
13
14
  const NO_FAILED = [];
@@ -93,7 +94,7 @@ const recompute = (c) => {
93
94
  c.published = next;
94
95
  c.overlayPaths = paths;
95
96
  };
96
- const getConnection = (c) => c.value?.connection ?? LIVE_CONNECTION;
97
+ const getConnection = (c) => c.value?.connection ?? CONNECTED_CONNECTION;
97
98
  const flush = (c, scheduled = false) => {
98
99
  if (!c.value) return;
99
100
  if (c.flushing) {
@@ -126,6 +127,10 @@ const flush = (c, scheduled = false) => {
126
127
  const connectionChanged = connection !== c.notifiedConnection;
127
128
  c.notifiedConnection = connection;
128
129
  if (connectionChanged) options.onConnectionChange?.(connection);
130
+ if (connection.error !== c.notifiedError) {
131
+ c.notifiedError = connection.error;
132
+ if (connection.error) options.onError?.(connection.error);
133
+ }
129
134
  const busy = c.getBusy();
130
135
  const busyChanged = busy !== c.notifiedBusy;
131
136
  c.notifiedBusy = busy;
@@ -200,6 +205,7 @@ const useStatewireCore = (getOptions, value) => {
200
205
  notifiedPublished: void 0,
201
206
  notifiedOverlayPaths: [],
202
207
  notifiedConnection: null,
208
+ notifiedError: void 0,
203
209
  notifiedBusy: true,
204
210
  notifiedFailed: NO_FAILED,
205
211
  stale: false,
@@ -269,6 +275,6 @@ const useStatewireCore = (getOptions, value) => {
269
275
  return core;
270
276
  };
271
277
  //#endregion
272
- export { LIVE_CONNECTION, useStatewireCore };
278
+ export { CONNECTED_CONNECTION, useStatewireCore };
273
279
 
274
280
  //# sourceMappingURL=core.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","names":["useEffect","useState","createChanges","getCommandsHost","getStateHost","CommandsInvocation","CommandsListener","recordMutations","createMacrotaskPoster","createMethodProxy","StatewirePath","StatewireSendError","Statewire","StatewireClient","LIVE_CONNECTION","Connection","status","reconnect","NO_FAILED","FailedCommand","failureOf","error","SendFailure","failure","fate","cause","message","Error","String","Overlay","inv","dropped","Core","getOptions","Options","value","source","StateSource","overlays","updates","CommandUpdate","pendingChanged","canonical","published","overlayPaths","notifiedPublished","notifiedOverlayPaths","notifiedConnection","notifiedBusy","notifiedFailed","stale","everAttached","overlaysDirty","flushing","scheduled","listeners","Set","post","commandsListener","getState","getBusy","getFailed","commands","CommandsProxy","subscribe","listener","schedule","c","markStale","drainCanonical","push","takeChanged","snapshot","undefined","next","initialState","state","dropCovered","failureCovered","failures","entry","list","discard","recompute","prevCanonical","optimistic","materialize","paths","overlay","ctx","OptimisticContext","ts","seq","clientId","recorded","draft","method","params","Command","changedPaths","console","getConnection","connection","flush","options","stateChanged","prev","changed","onStateChange","changes","length","batch","update","onCommandChange","connectionChanged","onConnectionChange","busy","busyChanged","failed","failedChanged","note","extra","result","attach","nextSource","setOnChange","setListener","detach","useStatewireCore","core","onStart","onPosted","onApplied","onCovered","some","o","filter","onSettle","outcome","type","payload","isBusy","Promise","reject","send","Record","args","promise","add","delete"],"sources":["../../src/client/core.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { createChanges } from \"./changes\";\nimport { getCommandsHost, getStateHost } from \"../host/host\";\nimport type { CommandsInvocation, CommandsListener } from \"../host/host\";\nimport { recordMutations } from \"../util/recordMutations\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\n\nexport const LIVE_CONNECTION: StatewireClient.Connection = {\n status: \"live\",\n reconnect: () => {},\n};\n\nconst NO_FAILED: readonly StatewireClient.FailedCommand[] = [];\n\nconst failureOf = (error: unknown): StatewireClient.SendFailure =>\n error instanceof StatewireSendError\n ? error.failure\n : {\n fate: \"rejected\",\n cause: \"server\",\n message: error instanceof Error ? error.message : String(error),\n };\n\ntype Overlay = { inv: CommandsInvocation; dropped: boolean };\n\ntype Core = {\n getOptions: () => StatewireClient.Options<any, any>;\n value: Statewire<unknown> | null;\n source: Statewire.StateSource | null;\n overlays: Overlay[];\n updates: Statewire.CommandUpdate[];\n pendingChanged: StatewirePath[];\n canonical: unknown;\n published: unknown;\n overlayPaths: readonly StatewirePath[];\n notifiedPublished: unknown;\n notifiedOverlayPaths: readonly StatewirePath[];\n notifiedConnection: StatewireClient.Connection | null;\n notifiedBusy: boolean;\n notifiedFailed: readonly StatewireClient.FailedCommand[];\n stale: boolean;\n everAttached: boolean;\n overlaysDirty: boolean;\n flushing: boolean;\n scheduled: boolean;\n listeners: Set<() => void>;\n post: () => void;\n commandsListener: CommandsListener;\n getState: () => unknown;\n getBusy: () => boolean;\n getFailed: () => readonly StatewireClient.FailedCommand[];\n commands: Statewire.CommandsProxy<any>;\n subscribe: (listener: () => void) => () => void;\n};\n\nconst schedule = (c: Core) => {\n if (c.scheduled) return;\n c.scheduled = true;\n c.post();\n};\n\nconst markStale = (c: Core) => {\n c.stale = true;\n schedule(c);\n};\n\n// initialState stands in for the canonical state only before the first\n// attach snapshot; replay boundaries after that read as loading, not preload.\nconst drainCanonical = (c: Core) => {\n if (c.source) {\n c.pendingChanged.push(...c.source.takeChanged());\n const snapshot = c.source.snapshot();\n if (snapshot !== undefined) {\n c.everAttached = true;\n c.canonical = snapshot;\n return;\n }\n const next = c.everAttached ? undefined : c.getOptions().initialState;\n if (next !== c.canonical) c.pendingChanged.push([]);\n c.canonical = next;\n } else if (c.value) {\n if (c.value.state !== undefined) c.everAttached = true;\n const next = c.everAttached ? c.value.state : c.getOptions().initialState;\n if (next !== c.canonical) {\n c.pendingChanged.push([]);\n c.canonical = next;\n }\n }\n};\n\nconst dropCovered = (c: Core) => {\n const { failureCovered } = c.getOptions();\n const failures = c.value?.failures;\n if (!failureCovered || !failures || c.canonical === undefined) return;\n for (const entry of failures.list()) {\n if (failureCovered(c.canonical as never, entry)) failures.discard(entry);\n }\n};\n\nconst recompute = (c: Core) => {\n if (!c.stale || !c.value) return;\n c.stale = false;\n const prevCanonical = c.canonical;\n drainCanonical(c);\n if (c.canonical !== prevCanonical) dropCovered(c);\n if (c.canonical === prevCanonical && !c.overlaysDirty) return;\n c.overlaysDirty = false;\n const { optimistic, materialize } = c.getOptions();\n let next = c.canonical;\n let paths: readonly StatewirePath[] = [];\n if (optimistic && c.canonical !== undefined) {\n for (const overlay of c.overlays) {\n if (overlay.dropped) continue;\n const { inv } = overlay;\n const ctx: StatewireClient.OptimisticContext = {\n ts: inv.ts,\n seq: inv.seq,\n ...(inv.clientId !== undefined && { clientId: inv.clientId }),\n };\n try {\n const recorded = recordMutations(next, (draft) =>\n optimistic(\n draft as never,\n { method: inv.method, params: inv.params } as Statewire.Command,\n ctx,\n ),\n );\n next = recorded.state;\n paths = [...paths, ...recorded.changedPaths];\n } catch (error) {\n overlay.dropped = true;\n console.error(\n `statewire: optimistic reducer threw for \"${inv.method}\"; dropping its optimistic update`,\n error,\n );\n }\n }\n }\n if (materialize && next !== undefined) {\n try {\n const recorded = recordMutations(next, (draft) =>\n materialize(draft as never),\n );\n next = recorded.state;\n paths = [...paths, ...recorded.changedPaths];\n } catch (error) {\n console.error(\n \"statewire: materialize threw; publishing without its update\",\n error,\n );\n }\n }\n c.published = next;\n c.overlayPaths = paths;\n};\n\nconst getConnection = (c: Core): StatewireClient.Connection =>\n c.value?.connection ?? LIVE_CONNECTION;\n\nconst flush = (c: Core, scheduled = false) => {\n if (!c.value) return;\n if (c.flushing) {\n schedule(c);\n return;\n }\n c.flushing = true;\n try {\n recompute(c);\n const options = c.getOptions();\n const stateChanged = c.published !== c.notifiedPublished;\n if (stateChanged) {\n const prev = c.notifiedPublished;\n const changed = [\n ...c.pendingChanged,\n ...c.notifiedOverlayPaths,\n ...c.overlayPaths,\n ];\n c.pendingChanged = [];\n c.notifiedPublished = c.published;\n c.notifiedOverlayPaths = c.overlayPaths;\n options.onStateChange?.(c.published as never, {\n changes: createChanges(prev, c.published, changed),\n });\n }\n if (c.updates.length > 0 && c.published !== undefined) {\n const batch = c.updates;\n c.updates = [];\n for (const update of batch) {\n options.onCommandChange?.(update, { state: c.published as never });\n }\n }\n const connection = getConnection(c);\n const connectionChanged = connection !== c.notifiedConnection;\n c.notifiedConnection = connection;\n if (connectionChanged) options.onConnectionChange?.(connection);\n const busy = c.getBusy();\n const busyChanged = busy !== c.notifiedBusy;\n c.notifiedBusy = busy;\n // The failed snapshot advances only on the scheduled pass: settles land\n // mid-unmount, where a changed snapshot re-renders the unmounting tree.\n const failed = c.value.failures?.list() ?? NO_FAILED;\n let failedChanged = false;\n if (failed !== c.notifiedFailed) {\n if (scheduled) {\n c.notifiedFailed = failed;\n failedChanged = true;\n } else {\n schedule(c);\n }\n }\n if (stateChanged || connectionChanged || busyChanged || failedChanged) {\n for (const listener of [...c.listeners]) listener();\n }\n } finally {\n c.flushing = false;\n }\n};\n\nconst note = (\n c: Core,\n inv: CommandsInvocation,\n status: Statewire.CommandUpdate[\"status\"],\n extra?: { result?: unknown; failure?: StatewireClient.SendFailure },\n) => {\n if (!c.getOptions().onCommandChange) return;\n c.updates.push({\n method: inv.method,\n params: inv.params as never[],\n seq: inv.seq,\n status,\n ...extra,\n });\n schedule(c);\n};\n\nconst attach = (c: Core, next: Statewire<unknown>) => {\n if (next === c.value) return;\n const prev = c.value;\n c.value = next;\n const nextSource =\n next.source ??\n (typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined) ??\n null;\n if (nextSource !== c.source) {\n c.source?.setOnChange(null);\n c.source = nextSource;\n c.source?.setOnChange(() => markStale(c));\n // A new source is a new attach lifecycle: initialState preloads again.\n c.everAttached = false;\n markStale(c);\n }\n if (next.commands !== prev?.commands) {\n if (prev) getCommandsHost(prev.commands)?.setListener(null);\n getCommandsHost(next.commands)?.setListener(c.commandsListener);\n if (c.overlays.length > 0) {\n c.overlays = [];\n c.overlaysDirty = true;\n }\n markStale(c);\n }\n if (!c.source) markStale(c);\n schedule(c);\n};\n\nconst detach = (c: Core) => {\n c.source?.setOnChange(null);\n c.source = null;\n if (c.value) {\n getCommandsHost(c.value.commands)?.setListener(null);\n c.value = null;\n }\n};\n\nexport const useStatewireCore = (\n getOptions: () => StatewireClient.Options<any, any>,\n value: Statewire<unknown>,\n) => {\n const [core] = useState((): Core => {\n const c: Core = {\n getOptions,\n value: null,\n source: null,\n overlays: [],\n updates: [],\n pendingChanged: [],\n canonical: undefined,\n published: undefined,\n overlayPaths: [],\n notifiedPublished: undefined,\n notifiedOverlayPaths: [],\n notifiedConnection: null,\n notifiedBusy: true,\n notifiedFailed: NO_FAILED,\n stale: false,\n everAttached: false,\n overlaysDirty: false,\n flushing: false,\n scheduled: false,\n listeners: new Set(),\n post: createMacrotaskPoster(() => {\n c.scheduled = false;\n flush(c, true);\n }),\n commandsListener: {\n onStart: (inv) => {\n c.overlays.push({ inv, dropped: false });\n c.overlaysDirty = true;\n markStale(c);\n note(c, inv, \"queued\");\n },\n onPosted: (inv) => note(c, inv, \"posted\"),\n onApplied: (inv) => note(c, inv, \"applied\"),\n onCovered: (inv) => {\n if (!c.overlays.some((o) => o.inv === inv)) return;\n c.overlays = c.overlays.filter((o) => o.inv !== inv);\n c.overlaysDirty = true;\n markStale(c);\n },\n onSettle: (inv, outcome) => {\n note(\n c,\n inv,\n \"settled\",\n outcome.type === \"accepted\"\n ? { result: outcome.payload }\n : { failure: failureOf(outcome.error) },\n );\n flush(c);\n },\n },\n getState: () => {\n recompute(c);\n return c.published;\n },\n getBusy: () => c.value?.isBusy ?? true,\n getFailed: () => c.notifiedFailed,\n commands: createMethodProxy<Statewire.CommandsProxy<any>>(\n (method, params) => {\n if (!c.value) {\n return Promise.reject(\n new StatewireSendError({ fate: \"aborted\", cause: \"unmount\" }),\n );\n }\n const send = (\n c.value.commands as Record<\n string,\n (...args: unknown[]) => Promise<unknown>\n >\n )[method]!;\n const promise = send(...params);\n flush(c);\n return promise;\n },\n ),\n subscribe: (listener) => {\n c.listeners.add(listener);\n return () => {\n c.listeners.delete(listener);\n };\n },\n };\n return c;\n });\n core.getOptions = getOptions;\n // Attach during render so the first snapshot reads the transport's state;\n // re-attaching the same transport is a no-op and the single-slot host\n // listeners make a swap land on the last writer.\n attach(core, value);\n useEffect(() => {\n attach(core, value);\n });\n useEffect(() => () => detach(core), [core]);\n return core;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"core.js","names":["useEffect","useState","createChanges","getCommandsHost","getStateHost","CommandsInvocation","CommandsListener","recordMutations","createMacrotaskPoster","createMethodProxy","StatewirePath","StatewireSendError","Statewire","StatewireClient","CONNECTED_CONNECTION","Connection","status","degraded","reconnect","NO_FAILED","FailedCommand","failureOf","error","SendFailure","failure","fate","cause","message","Error","String","Overlay","inv","dropped","Core","getOptions","Options","value","source","StateSource","overlays","updates","CommandUpdate","pendingChanged","canonical","published","overlayPaths","notifiedPublished","notifiedOverlayPaths","notifiedConnection","notifiedError","ConnectionError","notifiedBusy","notifiedFailed","stale","everAttached","overlaysDirty","flushing","scheduled","listeners","Set","post","commandsListener","getState","getBusy","getFailed","commands","CommandsProxy","subscribe","listener","schedule","c","markStale","drainCanonical","push","takeChanged","snapshot","undefined","next","initialState","state","dropCovered","failureCovered","failures","entry","list","discard","recompute","prevCanonical","optimistic","materialize","paths","overlay","ctx","OptimisticContext","ts","seq","clientId","recorded","draft","method","params","Command","changedPaths","console","getConnection","connection","flush","options","stateChanged","prev","changed","onStateChange","changes","length","batch","update","onCommandChange","connectionChanged","onConnectionChange","onError","busy","busyChanged","failed","failedChanged","note","extra","result","attach","nextSource","setOnChange","setListener","detach","useStatewireCore","core","onStart","onPosted","onApplied","onCovered","some","o","filter","onSettle","outcome","type","payload","isBusy","Promise","reject","send","Record","args","promise","add","delete"],"sources":["../../src/client/core.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { createChanges } from \"./changes\";\nimport { getCommandsHost, getStateHost } from \"../host/host\";\nimport type { CommandsInvocation, CommandsListener } from \"../host/host\";\nimport { recordMutations } from \"../util/recordMutations\";\nimport { createMacrotaskPoster } from \"../util/macrotask\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport type { StatewirePath } from \"../wire/ops\";\nimport { StatewireSendError } from \"../types\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\n\nexport const CONNECTED_CONNECTION: StatewireClient.Connection = {\n status: \"connected\",\n degraded: false,\n reconnect: () => {},\n};\n\nconst NO_FAILED: readonly StatewireClient.FailedCommand[] = [];\n\nconst failureOf = (error: unknown): StatewireClient.SendFailure =>\n error instanceof StatewireSendError\n ? error.failure\n : {\n fate: \"rejected\",\n cause: \"server\",\n message: error instanceof Error ? error.message : String(error),\n };\n\ntype Overlay = { inv: CommandsInvocation; dropped: boolean };\n\ntype Core = {\n getOptions: () => StatewireClient.Options<any, any>;\n value: Statewire<unknown> | null;\n source: Statewire.StateSource | null;\n overlays: Overlay[];\n updates: Statewire.CommandUpdate[];\n pendingChanged: StatewirePath[];\n canonical: unknown;\n published: unknown;\n overlayPaths: readonly StatewirePath[];\n notifiedPublished: unknown;\n notifiedOverlayPaths: readonly StatewirePath[];\n notifiedConnection: StatewireClient.Connection | null;\n notifiedError: StatewireClient.ConnectionError | undefined;\n notifiedBusy: boolean;\n notifiedFailed: readonly StatewireClient.FailedCommand[];\n stale: boolean;\n everAttached: boolean;\n overlaysDirty: boolean;\n flushing: boolean;\n scheduled: boolean;\n listeners: Set<() => void>;\n post: () => void;\n commandsListener: CommandsListener;\n getState: () => unknown;\n getBusy: () => boolean;\n getFailed: () => readonly StatewireClient.FailedCommand[];\n commands: Statewire.CommandsProxy<any>;\n subscribe: (listener: () => void) => () => void;\n};\n\nconst schedule = (c: Core) => {\n if (c.scheduled) return;\n c.scheduled = true;\n c.post();\n};\n\nconst markStale = (c: Core) => {\n c.stale = true;\n schedule(c);\n};\n\n// initialState stands in for the canonical state only before the first\n// attach snapshot; replay boundaries after that read as loading, not preload.\nconst drainCanonical = (c: Core) => {\n if (c.source) {\n c.pendingChanged.push(...c.source.takeChanged());\n const snapshot = c.source.snapshot();\n if (snapshot !== undefined) {\n c.everAttached = true;\n c.canonical = snapshot;\n return;\n }\n const next = c.everAttached ? undefined : c.getOptions().initialState;\n if (next !== c.canonical) c.pendingChanged.push([]);\n c.canonical = next;\n } else if (c.value) {\n if (c.value.state !== undefined) c.everAttached = true;\n const next = c.everAttached ? c.value.state : c.getOptions().initialState;\n if (next !== c.canonical) {\n c.pendingChanged.push([]);\n c.canonical = next;\n }\n }\n};\n\nconst dropCovered = (c: Core) => {\n const { failureCovered } = c.getOptions();\n const failures = c.value?.failures;\n if (!failureCovered || !failures || c.canonical === undefined) return;\n for (const entry of failures.list()) {\n if (failureCovered(c.canonical as never, entry)) failures.discard(entry);\n }\n};\n\nconst recompute = (c: Core) => {\n if (!c.stale || !c.value) return;\n c.stale = false;\n const prevCanonical = c.canonical;\n drainCanonical(c);\n if (c.canonical !== prevCanonical) dropCovered(c);\n if (c.canonical === prevCanonical && !c.overlaysDirty) return;\n c.overlaysDirty = false;\n const { optimistic, materialize } = c.getOptions();\n let next = c.canonical;\n let paths: readonly StatewirePath[] = [];\n if (optimistic && c.canonical !== undefined) {\n for (const overlay of c.overlays) {\n if (overlay.dropped) continue;\n const { inv } = overlay;\n const ctx: StatewireClient.OptimisticContext = {\n ts: inv.ts,\n seq: inv.seq,\n ...(inv.clientId !== undefined && { clientId: inv.clientId }),\n };\n try {\n const recorded = recordMutations(next, (draft) =>\n optimistic(\n draft as never,\n { method: inv.method, params: inv.params } as Statewire.Command,\n ctx,\n ),\n );\n next = recorded.state;\n paths = [...paths, ...recorded.changedPaths];\n } catch (error) {\n overlay.dropped = true;\n console.error(\n `statewire: optimistic reducer threw for \"${inv.method}\"; dropping its optimistic update`,\n error,\n );\n }\n }\n }\n if (materialize && next !== undefined) {\n try {\n const recorded = recordMutations(next, (draft) =>\n materialize(draft as never),\n );\n next = recorded.state;\n paths = [...paths, ...recorded.changedPaths];\n } catch (error) {\n console.error(\n \"statewire: materialize threw; publishing without its update\",\n error,\n );\n }\n }\n c.published = next;\n c.overlayPaths = paths;\n};\n\nconst getConnection = (c: Core): StatewireClient.Connection =>\n c.value?.connection ?? CONNECTED_CONNECTION;\n\nconst flush = (c: Core, scheduled = false) => {\n if (!c.value) return;\n if (c.flushing) {\n schedule(c);\n return;\n }\n c.flushing = true;\n try {\n recompute(c);\n const options = c.getOptions();\n const stateChanged = c.published !== c.notifiedPublished;\n if (stateChanged) {\n const prev = c.notifiedPublished;\n const changed = [\n ...c.pendingChanged,\n ...c.notifiedOverlayPaths,\n ...c.overlayPaths,\n ];\n c.pendingChanged = [];\n c.notifiedPublished = c.published;\n c.notifiedOverlayPaths = c.overlayPaths;\n options.onStateChange?.(c.published as never, {\n changes: createChanges(prev, c.published, changed),\n });\n }\n if (c.updates.length > 0 && c.published !== undefined) {\n const batch = c.updates;\n c.updates = [];\n for (const update of batch) {\n options.onCommandChange?.(update, { state: c.published as never });\n }\n }\n const connection = getConnection(c);\n const connectionChanged = connection !== c.notifiedConnection;\n c.notifiedConnection = connection;\n if (connectionChanged) options.onConnectionChange?.(connection);\n if (connection.error !== c.notifiedError) {\n c.notifiedError = connection.error;\n if (connection.error) options.onError?.(connection.error);\n }\n const busy = c.getBusy();\n const busyChanged = busy !== c.notifiedBusy;\n c.notifiedBusy = busy;\n // The failed snapshot advances only on the scheduled pass: settles land\n // mid-unmount, where a changed snapshot re-renders the unmounting tree.\n const failed = c.value.failures?.list() ?? NO_FAILED;\n let failedChanged = false;\n if (failed !== c.notifiedFailed) {\n if (scheduled) {\n c.notifiedFailed = failed;\n failedChanged = true;\n } else {\n schedule(c);\n }\n }\n if (stateChanged || connectionChanged || busyChanged || failedChanged) {\n for (const listener of [...c.listeners]) listener();\n }\n } finally {\n c.flushing = false;\n }\n};\n\nconst note = (\n c: Core,\n inv: CommandsInvocation,\n status: Statewire.CommandUpdate[\"status\"],\n extra?: { result?: unknown; failure?: StatewireClient.SendFailure },\n) => {\n if (!c.getOptions().onCommandChange) return;\n c.updates.push({\n method: inv.method,\n params: inv.params as never[],\n seq: inv.seq,\n status,\n ...extra,\n });\n schedule(c);\n};\n\nconst attach = (c: Core, next: Statewire<unknown>) => {\n if (next === c.value) return;\n const prev = c.value;\n c.value = next;\n const nextSource =\n next.source ??\n (typeof next.state === \"object\" && next.state !== null\n ? getStateHost(next.state)\n : undefined) ??\n null;\n if (nextSource !== c.source) {\n c.source?.setOnChange(null);\n c.source = nextSource;\n c.source?.setOnChange(() => markStale(c));\n // A new source is a new attach lifecycle: initialState preloads again.\n c.everAttached = false;\n markStale(c);\n }\n if (next.commands !== prev?.commands) {\n if (prev) getCommandsHost(prev.commands)?.setListener(null);\n getCommandsHost(next.commands)?.setListener(c.commandsListener);\n if (c.overlays.length > 0) {\n c.overlays = [];\n c.overlaysDirty = true;\n }\n markStale(c);\n }\n if (!c.source) markStale(c);\n schedule(c);\n};\n\nconst detach = (c: Core) => {\n c.source?.setOnChange(null);\n c.source = null;\n if (c.value) {\n getCommandsHost(c.value.commands)?.setListener(null);\n c.value = null;\n }\n};\n\nexport const useStatewireCore = (\n getOptions: () => StatewireClient.Options<any, any>,\n value: Statewire<unknown>,\n) => {\n const [core] = useState((): Core => {\n const c: Core = {\n getOptions,\n value: null,\n source: null,\n overlays: [],\n updates: [],\n pendingChanged: [],\n canonical: undefined,\n published: undefined,\n overlayPaths: [],\n notifiedPublished: undefined,\n notifiedOverlayPaths: [],\n notifiedConnection: null,\n notifiedError: undefined,\n notifiedBusy: true,\n notifiedFailed: NO_FAILED,\n stale: false,\n everAttached: false,\n overlaysDirty: false,\n flushing: false,\n scheduled: false,\n listeners: new Set(),\n post: createMacrotaskPoster(() => {\n c.scheduled = false;\n flush(c, true);\n }),\n commandsListener: {\n onStart: (inv) => {\n c.overlays.push({ inv, dropped: false });\n c.overlaysDirty = true;\n markStale(c);\n note(c, inv, \"queued\");\n },\n onPosted: (inv) => note(c, inv, \"posted\"),\n onApplied: (inv) => note(c, inv, \"applied\"),\n onCovered: (inv) => {\n if (!c.overlays.some((o) => o.inv === inv)) return;\n c.overlays = c.overlays.filter((o) => o.inv !== inv);\n c.overlaysDirty = true;\n markStale(c);\n },\n onSettle: (inv, outcome) => {\n note(\n c,\n inv,\n \"settled\",\n outcome.type === \"accepted\"\n ? { result: outcome.payload }\n : { failure: failureOf(outcome.error) },\n );\n flush(c);\n },\n },\n getState: () => {\n recompute(c);\n return c.published;\n },\n getBusy: () => c.value?.isBusy ?? true,\n getFailed: () => c.notifiedFailed,\n commands: createMethodProxy<Statewire.CommandsProxy<any>>(\n (method, params) => {\n if (!c.value) {\n return Promise.reject(\n new StatewireSendError({ fate: \"aborted\", cause: \"unmount\" }),\n );\n }\n const send = (\n c.value.commands as Record<\n string,\n (...args: unknown[]) => Promise<unknown>\n >\n )[method]!;\n const promise = send(...params);\n flush(c);\n return promise;\n },\n ),\n subscribe: (listener) => {\n c.listeners.add(listener);\n return () => {\n c.listeners.delete(listener);\n };\n },\n };\n return c;\n });\n core.getOptions = getOptions;\n // Attach during render so the first snapshot reads the transport's state;\n // re-attaching the same transport is a no-op and the single-slot host\n // listeners make a swap land on the last writer.\n attach(core, value);\n useEffect(() => {\n attach(core, value);\n });\n useEffect(() => () => detach(core), [core]);\n return core;\n};\n"],"mappings":"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"}
@@ -3,6 +3,7 @@ import { RemoteLink, StatewireRemoteProps } from "../transports/sse.js";
3
3
  import { StatewireClient } from "../statewire.js";
4
4
  import { Statewire, StatewireSendError } from "../types.js";
5
5
  import { StatewirePath } from "../wire/ops.js";
6
+ import { StatewireDocuments } from "../wire/documents.js";
6
7
  //#region src/client/session.d.ts
7
8
  type WireCommand = {
8
9
  method: string;
@@ -60,6 +61,7 @@ type Session = {
60
61
  frameFailures: number;
61
62
  pending: Pending[];
62
63
  canonical: unknown;
64
+ documents: StatewireDocuments.State;
63
65
  lastPublished: unknown;
64
66
  changed: StatewirePath[];
65
67
  source: Statewire.StateSource;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","names":[],"sources":["../../src/client/session.ts"],"mappings":";;;;;;KA6BK;EACH;EACA;EACA;;KAGG;WACM;WACA,SAAS;WACT,KAAK;;EAEd;;EAEA;;EAEA;EACA,UAAU;EACV,SAAS,OAAO;;KAGb;WACM;WACA;EACT;;KAiBG;KAEO;EACV,eAAe,gBAAgB;EAC/B,gBAAgB,gBAAgB;EAChC;;KAGG;EACH,KAAK;EACL,QAAQ,gBAAgB;EACxB;;KAGG;EACH,QAAQ,gBAAgB;EACxB,KAAK;EACL;EACA,OAAO,gBAAgB;EACvB,QAAQ;EACR;;EAEA;EACA;EACA;EACA;EACA;EACA,eAAe,gBAAgB;EAC/B;EACA;EACA,YAAY;EACZ;EACA,0BAA0B,qBAAqB;EAC/C;EACA,SAAS;EACT;EACA;EACA,SAAS;EACT,QAAQ,UAAU;EAClB,QAAQ;EACR;EACA;EACA;EACA,WAAW;EACX;EACA,WAAW;EACX;EACA,UAAU,mBAAmB,sBAAsB;;cAwHxC,iBACX,GAAG,qBACO,gBAAgB;cAikBtB,eAAgB,GAAG,SAAS,WAAW;cAmIhC,gBACX,GAAG,SACH,OAAO,gBAAgB;cAKZ,cACX,GAAG,SACH,OAAO,gBAAgB,kBACtB;cA6BG,aAAc,GAAG,SAAS,OAAO;cAgC1B,sBACX,SAAS,4BACR"}
1
+ {"version":3,"file":"session.d.ts","names":[],"sources":["../../src/client/session.ts"],"mappings":";;;;;;;KAgCK;EACH;EACA;EACA;;KAGG;WACM;WACA,SAAS;WACT,KAAK;;EAEd;;EAEA;;EAEA;EACA,UAAU;EACV,SAAS,OAAO;;KAGb;WACM;WACA;EACT;;KAiBG;KAEO;EACV,eAAe,gBAAgB;EAC/B,gBAAgB,gBAAgB;EAChC;;KAGG;EACH,KAAK;EACL,QAAQ,gBAAgB;EACxB;;KAGG;EACH,QAAQ,gBAAgB;EACxB,KAAK;EACL;EACA,OAAO,gBAAgB;EACvB,QAAQ;EACR;;EAEA;EACA;EACA;EACA;EACA;EACA,eAAe,gBAAgB;EAC/B;EACA;EACA,YAAY;EACZ;EACA,0BAA0B,qBAAqB;EAC/C;EACA,SAAS;EACT;EACA,WAAW,mBAAmB;EAC9B;EACA,SAAS;EACT,QAAQ,UAAU;EAClB,QAAQ;EACR;EACA;EACA;EACA,WAAW;EACX;EACA,WAAW;EACX;EACA,UAAU,mBAAmB,sBAAsB;;cAwHxC,iBACX,GAAG,qBACO,gBAAgB;cAklBtB,eAAgB,GAAG,SAAS,WAAW;cAkJhC,gBACX,GAAG,SACH,OAAO,gBAAgB;cAYZ,cACX,GAAG,SACH,OAAO,gBAAgB,kBACtB;cA0DG,aAAc,GAAG,SAAS,OAAO;cAmC1B,sBACX,SAAS,4BACR"}
@@ -1,11 +1,12 @@
1
- import { applyOps } from "../wire/ops.js";
2
1
  import { createMethodProxy } from "../util/methodProxy.js";
3
2
  import { StatewireSendError } from "../types.js";
4
3
  import { bindCommandsHost } from "../host/host.js";
5
4
  import { encodeParams, encodeValue, reviveResponse, reviveValue } from "../wire/meta.js";
5
+ import "../wire/limits.js";
6
6
  import { SessionStorageContext, createMemorySessionStore } from "./sessionStore.js";
7
7
  import { backoff } from "./timing.js";
8
8
  import { TERMINAL } from "./connection.js";
9
+ import { applyDocumentOps } from "../wire/documents.js";
9
10
  import { randomId } from "../util/randomId.js";
10
11
  import { useContext, useEffect, useState } from "@assistant-ui/tap/react-shim";
11
12
  //#region src/client/session.ts
@@ -99,7 +100,7 @@ const cover = (s, entry) => {
99
100
  };
100
101
  const NO_FAILED = [];
101
102
  const failedCommands = (s) => s.record.failed ?? NO_FAILED;
102
- const retainFailed = (s, entry, failure) => {
103
+ const retainFailedInner = (s, entry, failure) => {
103
104
  setRecord(s, {
104
105
  ...s.record,
105
106
  failed: [...s.record.failed ?? [], {
@@ -113,6 +114,13 @@ const retainFailed = (s, entry, failure) => {
113
114
  });
114
115
  s.notify();
115
116
  };
117
+ const retainFailed = (s, entry, failure) => {
118
+ if (!s.shared) {
119
+ retainFailedInner(s, entry, failure);
120
+ return;
121
+ }
122
+ transact(s, () => retainFailedInner(s, entry, failure));
123
+ };
116
124
  const settleEntry = (s, entry, outcome) => {
117
125
  s.pending = s.pending.filter((p) => p !== entry);
118
126
  if (outcome.ok) {
@@ -317,8 +325,9 @@ const handleCmds = (s, cmds) => {
317
325
  wake(s);
318
326
  };
319
327
  const ingestOps = (s, ops) => {
320
- const applied = applyOps(s.canonical, ops);
321
- s.canonical = applied.state;
328
+ const applied = applyDocumentOps(s.documents, ops);
329
+ s.documents = applied;
330
+ s.canonical = applied.documents.get(0)?.value;
322
331
  s.changed.push(...applied.changedPaths);
323
332
  };
324
333
  const publishIngested = (s) => {
@@ -353,6 +362,10 @@ const sessionLostInner = (s, seqWm, ctxWm) => {
353
362
  };
354
363
  const handleHello = (s, { ops, syn }) => {
355
364
  if (syn.record !== void 0 && syn.record !== "ephemeral") protocolError(`unknown record: ${String(syn.record)}`);
365
+ s.documents = {
366
+ mode: null,
367
+ documents: /* @__PURE__ */ new Map()
368
+ };
356
369
  ingestOps(s, ops);
357
370
  s.attach = "attached";
358
371
  s.attachEpoch += 1;
@@ -429,7 +442,7 @@ const handleDetach = (s) => {
429
442
  wake(s);
430
443
  };
431
444
  const handleFinish = (s, { reason }) => {
432
- if (reason === "evicted" || reason === "error") return;
445
+ if (reason === "reconnect" || reason === "error") return;
433
446
  s.attach = "finished";
434
447
  settleAll(s, "gone");
435
448
  publish(s);
@@ -440,12 +453,14 @@ const buildLanes = (s) => {
440
453
  const ctxEntries = [];
441
454
  for (const entry of s.ctxPending) {
442
455
  if (entry.posted) continue;
456
+ if (ctxEntries.length >= 256) break;
443
457
  if (ctxEntries.length > 0 && entry.seq !== ctxEntries.at(-1).seq + 1) break;
444
458
  ctxEntries.push(entry);
445
459
  }
446
460
  const cmdEntries = [];
447
461
  for (const entry of s.pending) {
448
462
  if (entry.posted) continue;
463
+ if (cmdEntries.length >= 256) break;
449
464
  if (cmdEntries.length > 0 && entry.seq !== cmdEntries.at(-1).seq + 1) break;
450
465
  cmdEntries.push(entry);
451
466
  }
@@ -484,7 +499,7 @@ const pump = async (s) => {
484
499
  const transport = s.transport;
485
500
  if (buildLanes(s) === null) return;
486
501
  if (s.attach !== "attached" || !transport) {
487
- if (transport?.connection.status === "idle" || transport?.parked && s.pending.length > 0) transport.connection.reconnect();
502
+ if (transport?.connection.status === "disconnected" && transport.connection.reason === "idle" || transport?.parked && s.pending.length > 0) transport.connection.reconnect();
488
503
  await waitForWake(s);
489
504
  continue;
490
505
  }
@@ -605,7 +620,23 @@ const enqueue = (s, command, params, resolve, reject) => {
605
620
  pump(s);
606
621
  return;
607
622
  }
608
- transact(s, () => enqueueInner(s, command, params, resolve, reject)).then(() => {
623
+ transact(s, () => {
624
+ if (!s.running) {
625
+ reject(new StatewireSendError({
626
+ fate: "aborted",
627
+ cause: "unmount"
628
+ }));
629
+ return;
630
+ }
631
+ if (isFinished(s)) {
632
+ reject(new StatewireSendError({
633
+ fate: "aborted",
634
+ cause: "stream-gone"
635
+ }));
636
+ return;
637
+ }
638
+ enqueueInner(s, command, params, resolve, reject);
639
+ }).then(() => {
609
640
  wake(s);
610
641
  pump(s);
611
642
  });
@@ -657,10 +688,12 @@ const sendCommand = (s, method, params) => {
657
688
  result.catch(() => {});
658
689
  return result;
659
690
  };
691
+ const findFailed = (s, entry) => (s.record.failed ?? []).find((f) => f.seq === entry.seq && f.ts === entry.ts && f.command === entry.command);
692
+ const unknownFailed = (entry) => /* @__PURE__ */ new Error(`statewire: unknown failed command "${entry.command}"`);
660
693
  const takeFailed = (s, entry) => {
661
694
  const failed = s.record.failed ?? [];
662
- const found = failed.find((f) => f.seq === entry.seq && f.ts === entry.ts && f.command === entry.command);
663
- if (found === void 0) throw new Error(`statewire: unknown failed command "${entry.command}"`);
695
+ const found = findFailed(s, entry);
696
+ if (found === void 0) throw unknownFailed(entry);
664
697
  setRecord(s, {
665
698
  ...s.record,
666
699
  failed: failed.filter((f) => f !== found)
@@ -669,7 +702,14 @@ const takeFailed = (s, entry) => {
669
702
  return found;
670
703
  };
671
704
  const discardFailed = (s, entry) => {
672
- takeFailed(s, entry);
705
+ if (!s.shared) {
706
+ takeFailed(s, entry);
707
+ return;
708
+ }
709
+ if (findFailed(s, entry) === void 0) throw unknownFailed(entry);
710
+ transact(s, () => {
711
+ if (findFailed(s, entry) !== void 0) takeFailed(s, entry);
712
+ });
673
713
  };
674
714
  const retryFailed = (s, entry) => {
675
715
  if (!s.running) return rejectedSend({
@@ -680,14 +720,47 @@ const retryFailed = (s, entry) => {
680
720
  fate: "aborted",
681
721
  cause: "stream-gone"
682
722
  });
683
- const found = takeFailed(s, entry);
723
+ const found = findFailed(s, entry);
724
+ if (found === void 0) throw unknownFailed(entry);
684
725
  const params = found.meta === void 0 ? found.params : reviveValue([...found.params], found.meta);
685
726
  const result = new Promise((resolve, reject) => {
686
- enqueue(s, {
687
- method: found.command,
688
- params: [...found.params],
689
- ...found.meta !== void 0 && { meta: found.meta }
690
- }, params, resolve, reject);
727
+ const retry = () => {
728
+ if (!s.running) {
729
+ reject(new StatewireSendError({
730
+ fate: "aborted",
731
+ cause: "unmount"
732
+ }));
733
+ return;
734
+ }
735
+ if (isFinished(s)) {
736
+ reject(new StatewireSendError({
737
+ fate: "aborted",
738
+ cause: "stream-gone"
739
+ }));
740
+ return;
741
+ }
742
+ const current = findFailed(s, entry);
743
+ if (current === void 0) {
744
+ reject(unknownFailed(entry));
745
+ return;
746
+ }
747
+ takeFailed(s, current);
748
+ enqueueInner(s, {
749
+ method: current.command,
750
+ params: [...current.params],
751
+ ...current.meta !== void 0 && { meta: current.meta }
752
+ }, params, resolve, reject);
753
+ };
754
+ if (!s.shared) {
755
+ retry();
756
+ wake(s);
757
+ pump(s);
758
+ return;
759
+ }
760
+ transact(s, retry).then(() => {
761
+ wake(s);
762
+ pump(s);
763
+ }, reject);
691
764
  });
692
765
  result.catch(() => {});
693
766
  return result;
@@ -721,7 +794,10 @@ const setContext = (s, value) => {
721
794
  pump(s);
722
795
  return;
723
796
  }
724
- transact(s, mint).then(() => {
797
+ transact(s, () => {
798
+ if (!s.running || isFinished(s)) return;
799
+ mint();
800
+ }).then(() => {
725
801
  wake(s);
726
802
  pump(s);
727
803
  });
@@ -777,6 +853,10 @@ const useStatewireSession = (options) => {
777
853
  frameFailures: 0,
778
854
  pending: [],
779
855
  canonical: void 0,
856
+ documents: {
857
+ mode: null,
858
+ documents: /* @__PURE__ */ new Map()
859
+ },
780
860
  lastPublished: void 0,
781
861
  changed: [],
782
862
  source: {