statewire 0.16.0 → 0.17.1
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 +12 -4
- package/dist/client/connection.d.ts +5 -1
- package/dist/client/connection.d.ts.map +1 -1
- package/dist/client/connection.js +22 -6
- package/dist/client/connection.js.map +1 -1
- package/dist/client/core.d.ts.map +1 -1
- package/dist/client/core.js +2 -0
- package/dist/client/core.js.map +1 -1
- package/dist/client/session.d.ts +15 -4
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +235 -52
- package/dist/client/session.js.map +1 -1
- package/dist/client/sessionStore.d.ts +5 -1
- package/dist/client/sessionStore.d.ts.map +1 -1
- package/dist/client/sessionStore.js +3 -1
- package/dist/client/sessionStore.js.map +1 -1
- package/dist/document.d.ts +25 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +88 -0
- package/dist/document.js.map +1 -0
- package/dist/host/draft.js +1 -1
- package/dist/host/host.d.ts +1 -0
- package/dist/host/host.d.ts.map +1 -1
- package/dist/host/host.js.map +1 -1
- package/dist/host/http.d.ts.map +1 -1
- package/dist/host/http.js +27 -9
- package/dist/host/http.js.map +1 -1
- package/dist/host/socket.d.ts +12 -5
- package/dist/host/socket.d.ts.map +1 -1
- package/dist/host/socket.js +107 -43
- package/dist/host/socket.js.map +1 -1
- package/dist/host-internal.d.ts +9 -1
- package/dist/host-internal.d.ts.map +1 -1
- package/dist/host-internal.js +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +2 -1
- package/dist/statewire.d.ts +33 -2
- package/dist/statewire.d.ts.map +1 -1
- package/dist/statewire.js +34 -3
- package/dist/statewire.js.map +1 -1
- package/dist/transports/fixtures.js +1 -0
- package/dist/transports/fixtures.js.map +1 -1
- package/dist/transports/remote.d.ts.map +1 -1
- package/dist/transports/remote.js +15 -8
- package/dist/transports/remote.js.map +1 -1
- package/dist/transports/sse.d.ts.map +1 -1
- package/dist/transports/sse.js +8 -8
- package/dist/transports/sse.js.map +1 -1
- package/dist/transports/testing.d.ts +1 -1
- package/dist/transports/testing.d.ts.map +1 -1
- package/dist/transports/testing.js +12 -4
- package/dist/transports/testing.js.map +1 -1
- package/dist/transports/ws.js +2 -2
- package/dist/transports/ws.js.map +1 -1
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/wire/documents.d.ts +25 -2
- package/dist/wire/documents.d.ts.map +1 -1
- package/dist/wire/documents.js +28 -8
- package/dist/wire/documents.js.map +1 -1
- package/dist/wire/meta.d.ts +3 -18
- package/dist/wire/meta.d.ts.map +1 -1
- package/dist/wire/meta.js +8 -57
- package/dist/wire/meta.js.map +1 -1
- package/dist/wire/ops.js +1 -1
- package/dist/wire/protocol.d.ts +55 -0
- package/dist/wire/protocol.d.ts.map +1 -0
- package/dist/wire/protocol.js +221 -0
- package/dist/wire/protocol.js.map +1 -0
- package/dist/wire/version.d.ts +1 -3
- package/dist/wire/version.d.ts.map +1 -1
- package/dist/wire/version.js +1 -3
- package/dist/wire/version.js.map +1 -1
- package/package.json +1 -1
- package/src/client/connection.ts +43 -13
- package/src/client/core.ts +6 -0
- package/src/client/session.ts +340 -45
- package/src/client/sessionStore.ts +8 -0
- package/src/document.ts +185 -0
- package/src/host/host.ts +1 -0
- package/src/host/http.ts +36 -7
- package/src/host/socket.ts +149 -57
- package/src/host-internal.ts +12 -1
- package/src/index.ts +5 -0
- package/src/statewire.ts +109 -6
- package/src/transports/fixtures.ts +1 -1
- package/src/transports/remote.ts +16 -7
- package/src/transports/sse.ts +18 -8
- package/src/transports/testing.ts +10 -2
- package/src/transports/ws.ts +1 -1
- package/src/types.ts +11 -0
- package/src/wire/documents.ts +126 -8
- package/src/wire/meta.ts +11 -94
- package/src/wire/protocol.ts +327 -0
- package/src/wire/version.ts +0 -2
package/README.md
CHANGED
|
@@ -31,9 +31,17 @@ export const App = () => {
|
|
|
31
31
|
};
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
+
## Protocols and documents
|
|
35
|
+
|
|
36
|
+
Connections negotiate date ranges through `Statewire-Version` and `Statewire-Protocol`. Protocols are additive and required by default. The server selects versions in `syn`; WebSockets use `statewire.v1`.
|
|
37
|
+
|
|
38
|
+
Each protocol owns its commands, context documents, and state documents. The main document is independent of its optional read key. Command sequences and replay remain shared across protocols. Python hosts support lazy, chained compatibility adapters.
|
|
39
|
+
|
|
40
|
+
See the [protocol registration and migration guide](https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/statewire/docs/spec/statewire-protocol/protocols/page.mdx).
|
|
41
|
+
|
|
34
42
|
## Docs
|
|
35
43
|
|
|
36
|
-
- Get started: https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/docs/get-started/statewire/page.mdx
|
|
37
|
-
- Guide: https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/docs/guides/statewire/consume/page.mdx
|
|
38
|
-
- Reference: https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/docs/reference/statewire/page.mdx
|
|
39
|
-
- Spec: https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/docs/spec/statewire-protocol/page.mdx
|
|
44
|
+
- Get started: https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/statewire/docs/get-started/statewire/page.mdx
|
|
45
|
+
- Guide: https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/statewire/docs/guides/statewire/consume/page.mdx
|
|
46
|
+
- Reference: https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/statewire/docs/reference/statewire/page.mdx
|
|
47
|
+
- Spec: https://github.com/assistant-ui/harness-sdk/blob/main/apps/docs/app/statewire/docs/spec/statewire-protocol/page.mdx
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { StatewireProtocol } from "../wire/protocol.js";
|
|
1
2
|
import { StatewireHost } from "../host.js";
|
|
2
3
|
import { ConnectionState, RemoteLink, StatewireFrame, StatewireRemoteProps, StatewireSubmitResult } from "../transports/sse.js";
|
|
3
4
|
import { StatewireClient } from "../statewire.js";
|
|
@@ -20,6 +21,8 @@ type StatewireCmd = {
|
|
|
20
21
|
dur?: boolean;
|
|
21
22
|
};
|
|
22
23
|
type StatewireSyn = {
|
|
24
|
+
version?: string;
|
|
25
|
+
protocols?: StatewireProtocol.Selection["protocols"];
|
|
23
26
|
seq?: number;
|
|
24
27
|
ctxSeq?: number;
|
|
25
28
|
record?: "ephemeral";
|
|
@@ -41,6 +44,7 @@ type Gate = {
|
|
|
41
44
|
};
|
|
42
45
|
type AttemptOutcome = "stop" | "reattach" | "ended" | "idle";
|
|
43
46
|
type Conn = {
|
|
47
|
+
negotiation?: StatewireProtocol.Options;
|
|
44
48
|
connection: StatewireClient.Connection;
|
|
45
49
|
parked: boolean;
|
|
46
50
|
lease: string | null;
|
|
@@ -73,7 +77,7 @@ declare const attachFrame: (c: Conn, headers: StatewireClient.HeadersOption | un
|
|
|
73
77
|
headers: Headers;
|
|
74
78
|
body: string;
|
|
75
79
|
}>;
|
|
76
|
-
declare const useLink: (props: {
|
|
80
|
+
declare const useLink: (props: StatewireProtocol.Options & {
|
|
77
81
|
url: string;
|
|
78
82
|
isNew?: boolean | undefined;
|
|
79
83
|
onChange?: ((connection: StatewireClient.Connection) => void) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","names":[],"sources":["../../src/client/connection.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection.d.ts","names":[],"sources":["../../src/client/connection.ts"],"mappings":";;;;;KAoBY;EACV;EACA;EACA;;;cAIW;KAQD;EACV;EACA,2BAA2B;EAC3B;EACA;EACA;EACA;;EAEA;;KAGU;EACV;EACA,YAAY,kBAAkB;EAC9B;EACA;EACA;EACA;EACA;EACA;;KAGU;EACV;EACA,MAAM;EACN;EACA;EACA,MAAM;EACN,MAAM,cAAc;;KAGV;EAAS;EAAkB;;KAoC3B;KAEA;EACV,cAAc,kBAAkB;EAChC,YAAY,gBAAgB;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OAAO,gBAAgB;EACvB,SAAS;EACT;EACA,MAAM;EACN,MAAM;EACN,OAAO;EACP,UAAU;EACV,KAAK;EACL,UAAU,OAAO,gBAAgB;EACjC,WAAW,YAAY,gBAAgB;EACvC,cAAc,OAAO,oBAAoB,QAAQ;EACjD,SAAS,YAAY,gBAAgB;EACrC;;cAGW,aAAc,OAAO;cAuErB,qBAAsB,mBAAiB;cA8KvC,YAAa,GAAG,MAAM,KAAK,cAAc,QAAM;cA+D/C,iBACX,GAAG,MACH,mBACC;cAkIU,qBAAsB,GAAG,MAAM,oBAAkB;cAUjD,iBACX,SAAS,gBAAgB,2BACzB,uBACC,QAAQ;cAME,cACX,GAAG,MACH,SAAS,gBAAgB,8BAAyB;;;;cAoBvC,UACX,OAAO,kBAAkB;EACvB;EACA;EACA,aAAa,YAAY,gBAAgB;EACzC,YAAY,OAAO,gBAAgB;EACnC,KAAK;EACL,cAAc,GAAG,MAAM,OAAO,oBAAoB,QAAQ;EAC1D,OAAO,GAAG,MAAM,OAAO,mBAAmB,QAAQ;MAEnD;cAuFU,WAAY,SAAS,gBAAW"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { reviveDocumentValue } from "../document.js";
|
|
2
|
+
import { negotiationHeaders, parseNegotiation, validateSelection } from "../wire/protocol.js";
|
|
3
|
+
import { reviveOps } from "../wire/meta.js";
|
|
2
4
|
import { backoff, timing } from "./timing.js";
|
|
3
5
|
import { useEffect, useRef, useState } from "@assistant-ui/tap/react-shim";
|
|
4
6
|
import { flushTapSync } from "@assistant-ui/tap";
|
|
@@ -130,7 +132,6 @@ const cmdsOf = (env) => {
|
|
|
130
132
|
const snapshotOf = (env) => {
|
|
131
133
|
const ops = env.ops;
|
|
132
134
|
if (ops === void 0) return protocolError("hello missing snapshot");
|
|
133
|
-
if (ops.length === 0) return protocolError("hello missing snapshot");
|
|
134
135
|
return reviveOps(ops);
|
|
135
136
|
};
|
|
136
137
|
const helloSynOf = (env) => {
|
|
@@ -141,6 +142,7 @@ const helloSynOf = (env) => {
|
|
|
141
142
|
};
|
|
142
143
|
const handleHello = (c, env) => {
|
|
143
144
|
const syn = helloSynOf(env);
|
|
145
|
+
if (c.negotiation !== void 0) validateSelection(syn, c.negotiation);
|
|
144
146
|
const ops = snapshotOf(env);
|
|
145
147
|
c.ctx.onHello({
|
|
146
148
|
ops,
|
|
@@ -163,7 +165,7 @@ const warnUnknownSynFact = () => {
|
|
|
163
165
|
const deliverSyn = (c, value) => {
|
|
164
166
|
if (!isObject(value)) return protocolError("syn must be an object");
|
|
165
167
|
validateSynScalars(value);
|
|
166
|
-
if (value["record"] !== void 0 || value["idle"] !== void 0) protocolError("invalid mid-stream syn");
|
|
168
|
+
if (value["version"] !== void 0 || value["protocols"] !== void 0 || value["record"] !== void 0 || value["idle"] !== void 0) protocolError("invalid mid-stream syn");
|
|
167
169
|
if (value["seq"] !== void 0 || value["ctxSeq"] !== void 0 || value["retry"] !== void 0) {
|
|
168
170
|
c.ctx.onRefusal(validateRefusalSyn(value));
|
|
169
171
|
return;
|
|
@@ -191,7 +193,7 @@ const deliverEnvelope = (c, env) => {
|
|
|
191
193
|
const settleFin = (c, fin) => {
|
|
192
194
|
const finish = fin.meta === void 0 ? fin : {
|
|
193
195
|
...fin,
|
|
194
|
-
payload:
|
|
196
|
+
payload: reviveDocumentValue(fin.payload, fin.meta)
|
|
195
197
|
};
|
|
196
198
|
releaseHeld(c);
|
|
197
199
|
c.retryAt = Date.now() + (finish.retry ?? 0);
|
|
@@ -337,6 +339,8 @@ const unsupportedVersion = (c, version) => flushTapSync(() => handleEnvelope(c,
|
|
|
337
339
|
const resolveHeaders = async (headers, staleAuth) => new Headers(typeof headers === "function" ? await headers({ staleAuth }) : headers);
|
|
338
340
|
const attachFrame = async (c, headers) => {
|
|
339
341
|
const resolved = await resolveHeaders(headers, c.authStale);
|
|
342
|
+
for (const [name, value] of Object.entries(negotiationHeaders(c.negotiation ?? {}))) if (!resolved.has(name)) resolved.set(name, value);
|
|
343
|
+
c.negotiation = parseNegotiation(resolved);
|
|
340
344
|
c.authStale = false;
|
|
341
345
|
const lanes = flushTapSync(() => c.ctx.takeAttachLanes());
|
|
342
346
|
return {
|
|
@@ -372,7 +376,10 @@ const useLink = (props) => {
|
|
|
372
376
|
},
|
|
373
377
|
onError: (error) => latest.current.onError?.(error),
|
|
374
378
|
onChange: (connection) => latest.current.onChange?.(connection),
|
|
375
|
-
attemptOnce: (abort) =>
|
|
379
|
+
attemptOnce: (abort) => {
|
|
380
|
+
conn.negotiation = latest.current;
|
|
381
|
+
return latest.current.attemptOnce(conn, abort);
|
|
382
|
+
},
|
|
376
383
|
notify: setConnection,
|
|
377
384
|
reconnect: () => reconnectConn(conn),
|
|
378
385
|
connection: {
|
|
@@ -398,6 +405,11 @@ const useLink = (props) => {
|
|
|
398
405
|
},
|
|
399
406
|
send: (frame) => latest.current.send(c, frame)
|
|
400
407
|
}));
|
|
408
|
+
const negotiation = JSON.stringify([
|
|
409
|
+
props.protocol,
|
|
410
|
+
props.wireVersion,
|
|
411
|
+
props.applicationProtocols
|
|
412
|
+
]);
|
|
401
413
|
useEffect(() => {
|
|
402
414
|
c.lease = null;
|
|
403
415
|
c.attempt = 0;
|
|
@@ -423,7 +435,11 @@ const useLink = (props) => {
|
|
|
423
435
|
if (c.lifetime === lifetime) c.lifetime = null;
|
|
424
436
|
openGate(c.gate);
|
|
425
437
|
};
|
|
426
|
-
}, [
|
|
438
|
+
}, [
|
|
439
|
+
c,
|
|
440
|
+
props.url,
|
|
441
|
+
negotiation
|
|
442
|
+
]);
|
|
427
443
|
return link;
|
|
428
444
|
};
|
|
429
445
|
const classify = (timeout) => /* @__PURE__ */ new Error(timeout.aborted ? "timeout" : "network");
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
1
|
+
{"version":3,"file":"connection.js","names":["negotiationHeaders","validateSelection","parseNegotiation","StatewireProtocol","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","version","protocols","Selection","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","negotiation","Options","connection","Connection","parked","lease","attempt","authDenials","authStale","liveAt","retryAt","error","ConnectionError","episode","awaitingHello","held","gate","abort","AbortController","lifetime","ctx","onError","onChange","attemptOnce","notify","reconnect","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","resolveHeaders","headers","HeadersOption","staleAuth","Headers","attachFrame","resolved","name","entries","has","set","lanes","takeAttachLanes","body","JSON","stringify","fromEntries","useLink","props","url","isNew","send","frame","latest","current","setConnection","conn","link","protocol","wireVersion","applicationProtocols","classify","timeout","AbortSignal"],"sources":["../../src/client/connection.ts"],"sourcesContent":["import {\n negotiationHeaders,\n validateSelection,\n parseNegotiation,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { flushTapSync } from \"@assistant-ui/tap\";\nimport { reviveOps, reviveValue } from \"../wire/meta\";\nimport { backoff, 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 version?: string;\n protocols?: StatewireProtocol.Selection[\"protocols\"];\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 negotiation?: StatewireProtocol.Options;\n connection: StatewireClient.Connection;\n parked: boolean;\n lease: string | null;\n attempt: number;\n authDenials: number;\n authStale: boolean;\n liveAt: number | null;\n retryAt: number;\n error: StatewireClient.ConnectionError | undefined;\n episode: Episode | null;\n awaitingHello: boolean;\n held: StatewireCmd[];\n gate: Gate;\n abort: AbortController | null;\n lifetime: AbortController | null;\n ctx: StatewireRemoteProps;\n onError: (error: StatewireClient.ConnectionError) => void;\n onChange: (connection: StatewireClient.Connection) => void;\n attemptOnce: (abort: AbortController) => Promise<AttemptOutcome>;\n notify: (connection: StatewireClient.Connection) => void;\n reconnect: () => void;\n};\n\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 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 if (c.negotiation !== undefined) validateSelection(syn, c.negotiation);\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 (\n value[\"version\"] !== undefined ||\n value[\"protocols\"] !== undefined ||\n value[\"record\"] !== undefined ||\n value[\"idle\"] !== undefined\n ) {\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 for (const [name, value] of Object.entries(\n negotiationHeaders(c.negotiation ?? {}),\n )) {\n if (!resolved.has(name)) resolved.set(name, value);\n }\n c.negotiation = parseNegotiation(resolved);\n c.authStale = false;\n const lanes = flushTapSync(() => c.ctx.takeAttachLanes());\n return {\n headers: resolved,\n body: JSON.stringify({\n headers: Object.fromEntries(resolved),\n ...(lanes ?? {}),\n }),\n };\n};\n\nexport const useLink = (\n props: StatewireProtocol.Options & {\n url: string;\n isNew?: boolean | undefined;\n onChange?: ((connection: StatewireClient.Connection) => void) | undefined;\n onError?: ((error: StatewireClient.ConnectionError) => void) | undefined;\n ctx: StatewireRemoteProps;\n attemptOnce: (c: Conn, abort: AbortController) => Promise<AttemptOutcome>;\n send: (c: Conn, frame: StatewireFrame) => Promise<StatewireSubmitResult>;\n },\n): RemoteLink => {\n const latest = useRef(props);\n latest.current = props;\n const [, setConnection] = useState<StatewireClient.Connection | null>(null);\n const [c] = useState((): Conn => {\n const conn: Conn = {\n parked: props.isNew ?? false,\n lease: null,\n attempt: 0,\n authDenials: 0,\n authStale: false,\n liveAt: null,\n retryAt: 0,\n error: undefined,\n episode: null,\n awaitingHello: true,\n held: [],\n abort: null,\n gate: newGate(),\n lifetime: null,\n get ctx() {\n return latest.current.ctx;\n },\n onError: (error) => latest.current.onError?.(error),\n onChange: (connection) => latest.current.onChange?.(connection),\n attemptOnce: (abort) => {\n conn.negotiation = latest.current;\n return latest.current.attemptOnce(conn, abort);\n },\n notify: setConnection,\n reconnect: () => reconnectConn(conn),\n connection: {\n ...((props.isNew ?? false)\n ? { status: \"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 const negotiation = JSON.stringify([\n props.protocol,\n props.wireVersion,\n props.applicationProtocols,\n ]);\n useEffect(() => {\n c.lease = null;\n c.attempt = 0;\n c.authDenials = 0;\n c.authStale = false;\n c.liveAt = null;\n c.retryAt = 0;\n c.episode = null;\n setStatus(\n c,\n c.parked\n ? { status: \"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, negotiation]);\n\n return link;\n};\n\nexport const classify = (timeout: AbortSignal) =>\n new Error(timeout.aborted ? \"timeout\" : \"network\");\n"],"mappings":";;;;;;;;AA2BA,MAAauB,WAAW;CACtB;CACA;CACA;CACA;CACA;AAAS;AAoCX,MAAM2B,iBAAuB;CAAEF,SAAS;CAAOC,MAAME,KAAAA;AAAU;AAE/D,MAAMC,YAAYC,MAAY;CAC5B,MAAMC,MAAMD,EAAEL;CACdK,EAAEL,UAAU;CACZ,OAAOM;AACT;AAEA,MAAMC,YAAYF,GAASG,cAAuB;CAChD,IAAIH,EAAEL,SAAS;EACbK,EAAEL,UAAU;EACZ,OAAOS,QAAQC,QAAQ;CACzB;CACA,OAAO,IAAID,SAAeC,YAAY;EACpC,MAAMC,QACJH,cAAcL,KAAAA,IACVA,KAAAA,IACAS,iBAAiB;GACfP,EAAEJ,OAAOE,KAAAA;GACTO,QAAQ;EACV,GAAGF,SAAS;EAClBH,EAAEJ,aAAa;GACbY,aAAaF,KAAK;GAClBN,EAAEJ,OAAOE,KAAAA;GACTO,QAAQ;EACV;CACF,CAAC;AACH;AAEA,MAAMI,YAAYT,MAAY;CAC5B,IAAIA,EAAEJ,MAAMI,EAAEJ,KAAK;MACdI,EAAEL,UAAU;AACnB;AA6BA,MAAa2C,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,EAAE5E,UAAU6E,EAAE7E,SACd4E,EAAE1E,SAAS2E,EAAE3E,QACb0E,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,GAAS1D,SAA0B;CACpD,IAAIoD,UAAUpD,MAAM0D,EAAElC,UAAU,KAAKkC,EAAElC,WAAWS,UAAUyB,EAAEzB,OAAO;CACrEyB,EAAElC,aAAa;EACb,GAAGxB;EACH,GAAI0D,EAAEzB,UAAUzB,KAAAA,IAAY,CAAC,IAAI,EAAEyB,OAAOyB,EAAEzB,MAAM;EAClDc,WAAWW,EAAEX;EACbY,UAAUX,WAAWhD,IAAI;CAC3B;CACA0D,EAAEZ,OAAOY,EAAElC,UAAU;CACrBkC,EAAEd,SAASc,EAAElC,UAAU;AACzB;AAEA,MAAMoC,iBAAiBlF,YAA2B;CAChD,MAAM,IAAImF,MAAM,8BAA8BnF,SAAS;AACzD;AAEA,MAAMoF,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,UAAUvD,KAAAA,KAAa,OAAOuD,UAAU,UAC1CH,cAAc,GAAGY,MAAK,kBAAmB;AAE7C;AAEA,MAAMC,sBAAsBxE,QAAiC;CAC3D,IAAIA,IAAI,WAAWO,KAAAA,KAAa,CAAC2D,yBAAyBlE,IAAI,MAAM,GAClE2D,cAAc,4CAA4C;CAE5D,IAAI3D,IAAI,cAAcO,KAAAA,KAAa,CAAC2D,yBAAyBlE,IAAI,SAAS,GACxE2D,cAAc,+CAA+C;CAE/D,IAAI3D,IAAI,aAAaO,KAAAA,KAAa,CAAC2D,yBAAyBlE,IAAI,QAAQ,GACtE2D,cAAc,8CAA8C;CAE9DW,uBAAuBtE,IAAI,OAAO,QAAQ;CAC1C,IAAIA,IAAI,YAAYO,KAAAA,KAAa,OAAOP,IAAI,YAAY,WACtD2D,cAAc,4BAA4B;CAE5CW,uBAAuBtE,IAAI,WAAW,YAAY;AACpD;AAEA,MAAayE,sBAAsBX,UAAiC;CAClE,IAAI,CAACD,SAASC,KAAK,GAAG,OAAOH,cAAc,uBAAuB;CAClEa,mBAAmBV,KAAK;CACxB,IACEA,MAAM,UAAUvD,KAAAA,KAChBuD,MAAM,YAAYvD,KAAAA,KAClBuD,MAAM,cAAcvD,KAAAA,GAEpBoD,cAAc,qBAAqB;CAErC,IACEG,MAAM,WAAWvD,KAAAA,KACjBuD,MAAM,cAAcvD,KAAAA,KACpBuD,MAAM,aAAavD,KAAAA,GAEnBoD,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,WAAWvD,KAAAA,KAAauD,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,cAAcvD,KAAAA,KACpB,CAAC2D,yBAAyBJ,MAAM,SAAS,GAEzCH,cAAc,+CAA+C;CAC/D,IAAIG,MAAM,aAAavD,KAAAA,KAAa,CAAC2D,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,WAAWvD,KAAAA,KAAa,CAACyD,MAAMC,QAAQH,MAAM,MAAM,GAC3DH,cAAc,sBAAsB;CAEtC,IAAIG,MAAM,WAAWvD,KAAAA,GAAW;EAC9B,MAAMT,MAAMgE,MAAM;EAClB,IAAI,CAACE,MAAMC,QAAQnE,GAAG,GAAG,OAAO6D,cAAc,sBAAsB;EACpE,KAAK,MAAMkB,SAAS/E,KAAK4E,YAAYG,KAAK;CAC5C;CACA,IAAIf,MAAM,YAAYvD,KAAAA,KAAa,OAAOuD,MAAM,YAAY,WAC1DH,cAAc,wBAAwB;CAExC,IAAIG,MAAM,YAAYvD,KAAAA,GAAW;EAC/B,IAAIuD,MAAM,YAAY,MAAMH,cAAc,mBAAmB;EAC7D,IACEG,MAAM,WAAWvD,KAAAA,KACjBuD,MAAM,WAAWvD,KAAAA,KACjBuD,MAAM,WAAWvD,KAAAA,GAEjBoD,cAAc,kCAAkC;CAEpD;CACA,IAAIG,MAAM,WAAWvD,KAAAA,GAAWoE,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,IAAIpF,QAAQS,KAAAA,GAAW,OAAO,CAAA;CAClC,OAAO2E,IAAIpF;AACb;AAEA,MAAMqF,cAAcD,QAAsC;CACxD,MAAMrF,MAAMqF,IAAIrF;CAChB,IAAIA,QAAQU,KAAAA,GAAW,OAAOoD,cAAc,wBAAwB;CACpE,OAAO/F,UAAUiC,GAAG;AACtB;AAEA,MAAMuF,cAAcF,QAAyC;CAC3D,IAAI,CAACrB,SAASqB,IAAIlF,GAAG,GAAG,OAAO2D,cAAc,gBAAgB;CAC7Da,mBAAmBU,IAAIlF,GAAG;CAC1B,IAAIkF,IAAIlF,IAAI,aAAaO,KAAAA,GACvBoD,cAAc,8BAA8B;CAE9C,OAAOuB,IAAIlF;AACb;AAEA,MAAMqF,eAAe5B,GAASyB,QAA2B;CACvD,MAAMlF,MAAMoF,WAAWF,GAAG;CAC1B,IAAIzB,EAAEpC,gBAAgBd,KAAAA,GAAWlD,kBAAkB2C,KAAKyD,EAAEpC,WAAW;CACrE,MAAMxB,MAAMsF,WAAWD,GAAG;CAC1BzB,EAAEhB,IAAI6C,QAAQ;EACZzF;EACAG;CACF,CAAC;CACDyD,EAAEhB,IAAI8C,OAAOvF,IAAIN,QAAQ,KAAK;CAC9B+D,EAAEtB,gBAAgB;CAClBsB,EAAEzB,QAAQzB,KAAAA;CACVkD,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,IACEA,MAAM,eAAevD,KAAAA,KACrBuD,MAAM,iBAAiBvD,KAAAA,KACvBuD,MAAM,cAAcvD,KAAAA,KACpBuD,MAAM,YAAYvD,KAAAA,GAElBoD,cAAc,wBAAwB;CAExC,IACEG,MAAM,WAAWvD,KAAAA,KACjBuD,MAAM,cAAcvD,KAAAA,KACpBuD,MAAM,aAAavD,KAAAA,GACnB;EACAkD,EAAEhB,IAAIsD,UAAUtB,mBAAmBX,KAAK,CAAC;EACzC;CACF;CACA,IAAIA,MAAM,UAAUvD,KAAAA,GAAW;CAC/B,IAAIyF,OAAOC,KAAKnC,KAAK,CAAC,CAACiB,WAAW,GAChCpB,cAAc,wBAAwB;CAExCgC,mBAAmB;AACrB;AAEA,MAAMO,mBAAmBzC,GAASyB,QAA2B;CAC3D,IAAIA,IAAIlF,QAAQO,KAAAA,GAAWuF,WAAWrC,GAAGyB,IAAIlF,GAAG;CAChD,IAAIkF,IAAIrF,QAAQU,KAAAA,GAAW;EACzB,MAAM6B,OAAOqB,EAAErB;EACfqB,EAAErB,OAAO,CAAA;EACTqB,EAAEhB,IAAI0D,MAAM;GACVtG,KAAKjC,UAAUsH,IAAIrF,GAAG;GACtBuG,MAAM,CAAC,GAAGhE,MAAM,GAAG6C,OAAOC,GAAG,CAAC;EAChC,CAAC;CACH,OAAO,IAAIA,IAAIpF,QAAQS,KAAAA,GAAW;EAChC,MAAM6F,OAAOnB,OAAOC,GAAG;EACvB,IAAIA,IAAInF,SAAS,MAAM0D,EAAErB,KAAKiE,KAAK,GAAGD,IAAI;OACrC3C,EAAEhB,IAAIuC,OAAOoB,IAAI;CACxB;CACA,IAAI,OAAOlB,IAAIxF,SAAS,WAAW+D,EAAEhB,IAAI8C,OAAOL,IAAIxF,IAAI;AAC1D;AAEA,MAAa4G,aAAa7C,GAASxD,QAA2C;CAC5E,MAAMsG,SACJtG,IAAIhB,SAASsB,KAAAA,IACTN,MACA;EAAE,GAAGA;EAAKjB,SAASnB,oBAAYoC,IAAIjB,SAASiB,IAAIhB,IAAI;CAAE;CAC5D6F,YAAYrB,CAAC;CACbA,EAAE1B,UAAUyD,KAAKC,IAAI,KAAKc,OAAO5G,SAAS;CAC1C,IAAI4G,OAAOrD,WAAW,QAAQ;EAC5BO,EAAEhB,IAAI8C,OAAO,IAAI;EACjB9B,EAAE9B,UAAU;EACZ8B,EAAEvB,UAAU;EACZuB,EAAEzB,QAAQzB,KAAAA;EACViD,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,OAAO9H,WAAW8H,OAAOrD,MAAM,GAAG,EAAEjD,KAAKsG,OAAO,CAAC,IACzEhG,KAAAA;CACJ,IAAIkD,EAAEzB,OAAOyB,EAAEf,QAAQe,EAAEzB,KAAK;CAC9B,IAAI,CAACyE,UAAU;EACbhD,EAAEvB,UAAU;GACV1D,OACE+H,OAAOrD,WAAW,cACd,cACAsD,SACE,iBACA;GACR,GAAID,OAAO9H,YAAY8B,KAAAA,KAAa,EAAE9B,SAAS8H,OAAO9H,QAAQ;GAC9D,GAAI8H,OAAO7H,SAAS6B,KAAAA,KAAa,EAAE7B,MAAM6H,OAAO7H,KAAK;EACvD;EACA,IAAI8H,QAAQtF,SAASuC,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,OAAO9H,YAAY8B,KAAAA,KAAa,EAAE9B,SAAS8H,OAAO9H,QAAQ;EAC9D,GAAI8H,OAAOvH,YAAYuB,KAAAA,KAAa,EAAEvB,SAASuH,OAAOvH,QAAQ;CAChE,CAAC;CACD,OAAO;AACT;AAEA,MAAa6H,kBACXpD,GACAK,UAC0B;CAC1B,MAAMoB,MAAMN,iBAAiBd,KAAK;CAClC,IAAIL,EAAEtB,eAAe;EACnB,IAAI+C,IAAIjF,QAAQM,KAAAA,GAAW,OAAO+F,UAAU7C,GAAGyB,IAAIjF,GAAG;EACtDoF,YAAY5B,GAAGyB,GAAG;EAClB,OAAO;CACT;CACAgB,gBAAgBzC,GAAGyB,GAAG;CACtB,IAAIA,IAAIjF,QAAQM,KAAAA,GAAW,OAAO+F,UAAU7C,GAAGyB,IAAIjF,GAAG;CACtD,IAAIwD,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,UAAU/D,OAAOmJ,gBACvDzD,EAAE9B,UAAU;CAEd8B,EAAE3B,SAAS;CACX2B,EAAE9B,WAAW;CACb8B,EAAEvB,YAAY,EAAE1D,OAAO,UAAU;CACjC,MAAM2I,QAAQC,KAAKC,IACjBJ,YAAY,IAAInJ,QAAQ2F,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,YAAYzG,KAAAA,KAAa,EAAEgD,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;EACZvE,mBAAmBmJ,QAAQrD,CAAC,CAAC;CAC/B;CACAvC,SAASuC,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,MAAMd,SAAS0B,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,MAAM9E,SAAS0B,MAAMoB,EAAE1B,UAAUyD,KAAKC,IAAI,CAAC;GAC3C;EACF;EAEA9H,mBAAmBmJ,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,MAAMvD,OACR,GAEFgJ,UAAU9J,mBACR2I,UAAU7C,GAAG;KAAEP,QAAQ;KAAkBzE,SAASuD,MAAMvD;IAAQ,CAAC,CACnE;SACK,IAAIgF,EAAE5B,WACX4F,UAAU9J,mBACR2I,UAAU7C,GAAG;KACXP,QAAQ;KACRzE,SACEuD,iBAAiB4B,QACb5B,MAAMvD,UACN;IACR,CAAC,CACH;IAEFuI,UACEhF,iBAAiB4B,SAAS5B,MAAMvD,UAAUuD,MAAMvD,UAAU;GAC9D;EACF;EACA6D,MAAMA,MAAM;EACZ,IAAI,CAACkF,MAAM,GAAG;EACd7J,mBAAmB;GACjBmH,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,MAAM9G,SAAS0B,IAAI;GACnB;EACF;EACA,MAAM4E,YAAYzG,SAAS6B,IAAI;EAC/B,MAAM8E,QAAQxJ,mBAAmBoJ,cAActD,GAAGuD,SAASC,SAAS,CAAC;EACrE,IAAIE,UAAU,GAAG;EACjB,MAAMxG,SAAS0B,MAAM8E,KAAK;CAC5B;AACF;AAEA,MAAaa,sBAAsBvE,GAASrE,YAC1CzB,mBACEkJ,eAAepD,GAAG,EAChBxD,KAAK;CACHiD,QAAQ;CACRzE,SAAS,iCAAiCW,WAAW;AACvD,EACF,CAAC,CACH,KAAK;AAEP,MAAa6I,iBAAiB,OAC5BC,SACAE,cAEA,IAAIC,QACF,OAAOH,YAAY,aAAa,MAAMA,QAAQ,EAAEE,UAAU,CAAC,IAAIF,OACjE;AAGF,MAAaI,cAAc,OACzB7E,GACAyE,YACG;CACH,MAAMK,WAAW,MAAMN,eAAeC,SAASzE,EAAE5B,SAAS;CAC1D,KAAK,MAAM,CAAC2G,MAAM1E,UAAUkC,OAAOyC,QACjCrL,mBAAmBqG,EAAEpC,eAAe,CAAC,CAAC,CACxC,GACE,IAAI,CAACkH,SAASG,IAAIF,IAAI,GAAGD,SAASI,IAAIH,MAAM1E,KAAK;CAEnDL,EAAEpC,cAAc/D,iBAAiBiL,QAAQ;CACzC9E,EAAE5B,YAAY;CACd,MAAM+G,QAAQjL,mBAAmB8F,EAAEhB,IAAIoG,gBAAgB,CAAC;CACxD,OAAO;EACLX,SAASK;EACTO,MAAMC,KAAKC,UAAU;GACnBd,SAASlC,OAAOiD,YAAYV,QAAQ;GACpC,GAAIK,SAAS,CAAC;EAChB,CAAC;CACH;AACF;AAEA,MAAaM,WACXC,UASe;CACf,MAAMK,SAAS/L,OAAO0L,KAAK;CAC3BK,OAAOC,UAAUN;CACjB,MAAM,GAAGO,iBAAiBhM,SAA4C,IAAI;CAC1E,MAAM,CAAC+F,KAAK/F,eAAqB;EAC/B,MAAMiM,OAAa;GACjBlI,QAAQ0H,MAAME,SAAS;GACvB3H,OAAO;GACPC,SAAS;GACTC,aAAa;GACbC,WAAW;GACXC,QAAQ;GACRC,SAAS;GACTC,OAAOzB,KAAAA;GACP2B,SAAS;GACTC,eAAe;GACfC,MAAM,CAAA;GACNE,OAAO;GACPD,MAAM/B,QAAQ;GACdkC,UAAU;GACV,IAAIC,MAAM;IACR,OAAO+G,OAAOC,QAAQhH;GACxB;GACAC,UAAUV,UAAUwH,OAAOC,QAAQ/G,UAAUV,KAAK;GAClDW,WAAWpB,eAAeiI,OAAOC,QAAQ9G,WAAWpB,UAAU;GAC9DqB,cAAcN,UAAU;IACtBqH,KAAKtI,cAAcmI,OAAOC;IAC1B,OAAOD,OAAOC,QAAQ7G,YAAY+G,MAAMrH,KAAK;GAC/C;GACAO,QAAQ6G;GACR5G,iBAAiBwE,cAAcqC,IAAI;GACnCpI,YAAY;IACV,GAAK4H,MAAME,SAAS,QAChB;KAAEpG,QAAQ;KAAgBC,QAAQ;IAAW,IAC7C;KAAED,QAAQ;KAActB,SAAS;IAAE;IACvC+B,UAAU;IACVZ,iBAAiB6G,KAAK7G,UAAU;GAClC;EACF;EACA,OAAO6G;CACT,CAAC;CACD,MAAM,CAACC,QAAQlM,gBACM;EACjB,IAAI6D,aAAa;GACf,OAAOkC,EAAElC;EACX;EACA,IAAIE,SAAS;GACX,OAAOgC,EAAEhC;EACX;EACA6H,OAAOC,UAAUC,OAAOC,QAAQH,KAAK7F,GAAG8F,KAAK;CAC/C,EACF;CAEA,MAAMlI,cAAc0H,KAAKC,UAAU;EACjCG,MAAMU;EACNV,MAAMW;EACNX,MAAMY;CAAoB,CAC3B;CACDvM,gBAAgB;EACdiG,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,OAAO/B,QAAQ;EACjB,IAASmD,GAAGjB,UAAUiB,EAAEpB,IAAI;EAC5B,aAAa;GACXoB,EAAEnB,OAAOA,MAAM;GACfE,SAASF,MAAM;GACf,IAAImB,EAAEjB,aAAaA,UAAUiB,EAAEjB,WAAW;GAC1CtB,SAASuC,EAAEpB,IAAI;EACjB;CACF,GAAG;EAACoB;EAAG0F,MAAMC;EAAK/H;CAAW,CAAC;CAE9B,OAAOuI;AACT;AAEA,MAAaI,YAAYC,4BACvB,IAAIrG,MAAMqG,QAAQtC,UAAU,YAAY,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
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;;
|
|
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;;cAyOD,mBACX,kBAAkB,gBAAgB,mBAClC,OAAO,uBAAkB"}
|
package/dist/client/core.js
CHANGED
|
@@ -67,6 +67,7 @@ const recompute = (c) => {
|
|
|
67
67
|
if (optimistic && c.canonical !== void 0) for (const overlay of c.overlays) {
|
|
68
68
|
if (overlay.dropped) continue;
|
|
69
69
|
const { inv } = overlay;
|
|
70
|
+
if (inv.protocol !== void 0 && inv.protocol !== (c.getOptions().protocol ?? "default")) continue;
|
|
70
71
|
const ctx = {
|
|
71
72
|
ts: inv.ts,
|
|
72
73
|
seq: inv.seq,
|
|
@@ -150,6 +151,7 @@ const flush = (c, scheduled = false) => {
|
|
|
150
151
|
const note = (c, inv, status, extra) => {
|
|
151
152
|
if (!c.getOptions().onCommandChange) return;
|
|
152
153
|
c.updates.push({
|
|
154
|
+
...inv.protocol !== void 0 && { protocol: inv.protocol },
|
|
153
155
|
method: inv.method,
|
|
154
156
|
params: inv.params,
|
|
155
157
|
seq: inv.seq,
|
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","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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"}
|
|
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","protocol","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 if (\n inv.protocol !== undefined &&\n inv.protocol !== (c.getOptions().protocol ?? \"default\")\n )\n continue;\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 ...(inv.protocol !== undefined && { protocol: inv.protocol }),\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
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { StatewireDocuments } from "../wire/documents.js";
|
|
2
|
+
import { StatewireProtocol } from "../wire/protocol.js";
|
|
1
3
|
import { CommandsInvocation, CommandsListener } from "../host/host.js";
|
|
2
4
|
import { RemoteLink, StatewireRemoteProps } from "../transports/sse.js";
|
|
3
5
|
import { StatewireClient } from "../statewire.js";
|
|
4
6
|
import { Statewire, StatewireSendError } from "../types.js";
|
|
5
7
|
import { StatewirePath } from "../wire/ops.js";
|
|
6
|
-
import { StatewireDocuments } from "../wire/documents.js";
|
|
7
8
|
//#region src/client/session.d.ts
|
|
8
9
|
type WireCommand = {
|
|
10
|
+
protocol: string;
|
|
11
|
+
produced?: NonNullable<StatewireClient.SessionCommand["produced"]>;
|
|
9
12
|
method: string;
|
|
10
13
|
params: unknown[];
|
|
11
14
|
meta?: unknown;
|
|
@@ -29,7 +32,7 @@ type CtxPending = {
|
|
|
29
32
|
posted: boolean;
|
|
30
33
|
};
|
|
31
34
|
type AttachState = "detached" | "attached" | "finished";
|
|
32
|
-
type StatewireSessionOptions = {
|
|
35
|
+
type StatewireSessionOptions = StatewireProtocol.Options & {
|
|
33
36
|
sessionStore?: StatewireClient.SessionStorage | undefined;
|
|
34
37
|
onSessionLost?: StatewireClient.OnSessionLost | undefined;
|
|
35
38
|
onDone?: (() => void) | undefined;
|
|
@@ -40,10 +43,14 @@ type Shared = {
|
|
|
40
43
|
unsubscribe: (() => void) | null;
|
|
41
44
|
};
|
|
42
45
|
type Session = {
|
|
46
|
+
options: StatewireSessionOptions;
|
|
47
|
+
selection: StatewireProtocol.Selection | undefined;
|
|
48
|
+
contextDocuments: StatewireDocuments.State;
|
|
43
49
|
record: StatewireClient.SessionRecord;
|
|
44
50
|
ctx: StatewireRemoteProps;
|
|
45
51
|
recordPersisted: boolean;
|
|
46
52
|
store: StatewireClient.SessionStorage;
|
|
53
|
+
documentStore: StatewireDocuments.Storage | undefined;
|
|
47
54
|
shared: Shared | false;
|
|
48
55
|
ephemeral: boolean;
|
|
49
56
|
/** An ephemeral record died with its attach: the storage is off for good. */
|
|
@@ -61,6 +68,7 @@ type Session = {
|
|
|
61
68
|
frameFailures: number;
|
|
62
69
|
pending: Pending[];
|
|
63
70
|
canonical: unknown;
|
|
71
|
+
documentListeners: Set<() => void>;
|
|
64
72
|
documents: StatewireDocuments.State;
|
|
65
73
|
lastPublished: unknown;
|
|
66
74
|
changed: StatewirePath[];
|
|
@@ -79,8 +87,11 @@ declare const failedCommands: (s: Session) => readonly StatewireClient.FailedCom
|
|
|
79
87
|
declare const setTransport: (s: Session, transport: RemoteLink) => void;
|
|
80
88
|
declare const discardFailed: (s: Session, entry: StatewireClient.FailedCommand) => void;
|
|
81
89
|
declare const retryFailed: (s: Session, entry: StatewireClient.FailedCommand) => Promise<unknown>;
|
|
82
|
-
declare const
|
|
90
|
+
declare const updateContext: (s: Session, operations: readonly unknown[]) => void;
|
|
91
|
+
declare const setContext: (s: Session, value: Record<string, unknown>, protocol?: string) => void;
|
|
92
|
+
declare const documentSource: (s: Session) => StatewireDocuments.Source;
|
|
93
|
+
declare const invokeProtocol: (s: Session, protocol: string, method: string, params: readonly unknown[]) => Promise<unknown>;
|
|
83
94
|
declare const useStatewireSession: (options: StatewireSessionOptions) => Session;
|
|
84
95
|
//#endregion
|
|
85
|
-
export { StatewireSessionOptions, discardFailed, failedCommands, retryFailed, setContext, setTransport, useStatewireSession };
|
|
96
|
+
export { StatewireSessionOptions, discardFailed, documentSource, failedCommands, invokeProtocol, retryFailed, setContext, setTransport, updateContext, useStatewireSession };
|
|
86
97
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -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":";;;;;;;;KAyCK;EACH;EACA,WAAW,YAAY,gBAAgB;EACvC;EACA;EACA;;KAGG;WACM;WACA,SAAS;WACT,KAAK;;EAEd;;EAEA;;EAEA;EACA,UAAU;EACV,SAAS,OAAO;;KAGb;WACM;WACA;EACT;;KAeG;KAEO,0BAA0B,kBAAkB;EACtD,eAAe,gBAAgB;EAC/B,gBAAgB,gBAAgB;EAChC;;KAGG;EACH,KAAK;EACL,QAAQ,gBAAgB;EACxB;;KAGG;EACH,SAAS;EACT,WAAW,kBAAkB;EAC7B,kBAAkB,mBAAmB;EACrC,QAAQ,gBAAgB;EACxB,KAAK;EACL;EACA,OAAO,gBAAgB;EACvB,eAAe,mBAAmB;EAClC,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,mBAAmB;EACnB,WAAW,mBAAmB;EAC9B;EACA,SAAS;EACT,QAAQ,UAAU;EAClB,QAAQ;EACR;EACA;EACA;EACA,WAAW;EACX;EACA,WAAW;EACX;EACA,UAAU,mBAAmB,sBAAsB;;cAsIxC,iBACX,GAAG,qBACO,gBAAgB;cAuoBtB,eAAgB,GAAG,SAAS,WAAW;cAuKhC,gBACX,GAAG,SACH,OAAO,gBAAgB;cAYZ,cACX,GAAG,SACH,OAAO,gBAAgB,kBACtB;cA4IU,gBAAiB,GAAG,SAAS;cAGpC,aACJ,GAAG,SACH,OAAO,yBACP;cAuBW,iBAAkB,GAAG,YAAU,mBAAmB;cA+BlD,iBACX,GAAG,SACH,kBACA,gBACA,+BAA0B;cAyBf,sBACX,SAAS,4BACR"}
|