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.
- package/README.md +29 -78
- package/dist/client/connection.d.ts +20 -6
- package/dist/client/connection.d.ts.map +1 -1
- package/dist/client/connection.js +120 -52
- package/dist/client/connection.js.map +1 -1
- package/dist/client/core.d.ts +3 -2
- package/dist/client/core.d.ts.map +1 -1
- package/dist/client/core.js +10 -4
- package/dist/client/core.js.map +1 -1
- package/dist/client/session.d.ts +2 -0
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +97 -17
- package/dist/client/session.js.map +1 -1
- package/dist/host/adapter.d.ts +1 -1
- package/dist/host/adapter.d.ts.map +1 -1
- package/dist/host/adapter.js +7 -1
- package/dist/host/adapter.js.map +1 -1
- package/dist/host/host.d.ts +1 -0
- package/dist/host/host.d.ts.map +1 -1
- package/dist/host/host.js +45 -5
- package/dist/host/host.js.map +1 -1
- package/dist/host/http.d.ts +2 -1
- package/dist/host/http.d.ts.map +1 -1
- package/dist/host/http.js +108 -47
- package/dist/host/http.js.map +1 -1
- package/dist/host/socket.d.ts +33 -8
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +388 -58
- package/dist/host/socket.js.map +1 -1
- package/dist/host/work.d.ts +7 -0
- package/dist/host/work.d.ts.map +1 -0
- package/dist/host/work.js +53 -0
- package/dist/host/work.js.map +1 -0
- package/dist/host-internal.d.ts +42 -4
- package/dist/host-internal.d.ts.map +1 -1
- package/dist/host-internal.js +2 -1
- package/dist/host.d.ts +16 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +2 -1
- package/dist/statewire.d.ts +21 -11
- package/dist/statewire.d.ts.map +1 -1
- package/dist/statewire.js +2 -2
- package/dist/statewire.js.map +1 -1
- package/dist/transports/sse.d.ts +1 -4
- package/dist/transports/sse.d.ts.map +1 -1
- package/dist/transports/sse.js +47 -56
- package/dist/transports/sse.js.map +1 -1
- package/dist/transports/testing.js +2 -2
- package/dist/transports/testing.js.map +1 -1
- package/dist/transports/ws.d.ts +1 -1
- package/dist/transports/ws.d.ts.map +1 -1
- package/dist/transports/ws.js +54 -41
- package/dist/transports/ws.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/wire/documents.d.ts +20 -0
- package/dist/wire/documents.d.ts.map +1 -0
- package/dist/wire/documents.js +74 -0
- package/dist/wire/documents.js.map +1 -0
- package/dist/wire/limits.d.ts +10 -0
- package/dist/wire/limits.d.ts.map +1 -0
- package/dist/wire/limits.js +11 -0
- package/dist/wire/limits.js.map +1 -0
- package/dist/wire/meta.d.ts.map +1 -1
- package/dist/wire/meta.js +1 -1
- package/dist/wire/meta.js.map +1 -1
- package/dist/wire/ops.d.ts.map +1 -1
- package/dist/wire/ops.js +1 -2
- package/dist/wire/ops.js.map +1 -1
- package/dist/wire/version.d.ts +7 -0
- package/dist/wire/version.d.ts.map +1 -0
- package/dist/wire/version.js +8 -0
- package/dist/wire/version.js.map +1 -0
- package/package.json +1 -1
- package/src/client/connection.ts +213 -67
- package/src/client/core.ts +10 -3
- package/src/client/session.ts +106 -30
- package/src/host/adapter.ts +10 -2
- package/src/host/host.ts +54 -4
- package/src/host/http.ts +168 -64
- package/src/host/socket.ts +603 -60
- package/src/host/work.ts +50 -0
- package/src/host-internal.ts +44 -3
- package/src/host.ts +18 -2
- package/src/statewire.ts +33 -10
- package/src/transports/sse.ts +60 -68
- package/src/transports/testing.ts +2 -2
- package/src/transports/ws.ts +29 -48
- package/src/types.ts +1 -0
- package/src/wire/documents.ts +109 -0
- package/src/wire/limits.ts +6 -0
- package/src/wire/meta.ts +6 -1
- package/src/wire/ops.ts +1 -2
- 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":"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"}
|
package/dist/client/core.d.ts
CHANGED
|
@@ -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
|
|
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 {
|
|
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,
|
|
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"}
|
package/dist/client/core.js
CHANGED
|
@@ -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
|
|
10
|
-
status: "
|
|
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 ??
|
|
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 {
|
|
278
|
+
export { CONNECTED_CONNECTION, useStatewireCore };
|
|
273
279
|
|
|
274
280
|
//# sourceMappingURL=core.js.map
|
package/dist/client/core.js.map
CHANGED
|
@@ -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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"}
|
package/dist/client/session.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/dist/client/session.js
CHANGED
|
@@ -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
|
|
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 =
|
|
321
|
-
s.
|
|
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 === "
|
|
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, () =>
|
|
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 =
|
|
663
|
-
if (found === void 0) throw
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
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,
|
|
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: {
|