statewire 0.23.0 → 0.24.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/dist/client/core.d.ts +4 -3
- package/dist/client/core.d.ts.map +1 -1
- package/dist/client/core.js +56 -45
- package/dist/client/core.js.map +1 -1
- package/dist/client/session.d.ts +56 -12
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js +632 -260
- package/dist/client/session.js.map +1 -1
- package/dist/client/sessionStore.d.ts +1 -0
- package/dist/client/sessionStore.d.ts.map +1 -1
- package/dist/client/sessionStore.js +1 -0
- package/dist/client/sessionStore.js.map +1 -1
- package/dist/host/host.d.ts +6 -5
- package/dist/host/host.d.ts.map +1 -1
- package/dist/host/host.js.map +1 -1
- package/dist/indexedDb.d.ts +15 -0
- package/dist/indexedDb.d.ts.map +1 -0
- package/dist/indexedDb.js +171 -0
- package/dist/indexedDb.js.map +1 -0
- package/dist/statewire.d.ts +117 -59
- package/dist/statewire.d.ts.map +1 -1
- package/dist/statewire.js +13 -25
- package/dist/statewire.js.map +1 -1
- package/dist/storage.d.ts +42 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +387 -125
- package/dist/storage.js.map +1 -1
- package/dist/transports/remote.d.ts.map +1 -1
- package/dist/transports/remote.js +7 -9
- package/dist/transports/remote.js.map +1 -1
- package/dist/types.d.ts +6 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -1
- package/src/client/core.ts +81 -64
- package/src/client/session.ts +886 -424
- package/src/client/sessionStore.ts +2 -0
- package/src/host/host.ts +10 -3
- package/src/indexedDb.ts +167 -0
- package/src/statewire.ts +133 -86
- package/src/storage.ts +548 -112
- package/src/transports/remote.ts +13 -14
- package/src/types.ts +6 -7
package/dist/client/core.d.ts
CHANGED
|
@@ -5,13 +5,16 @@ import type { StatewireClient } from "../statewire.js";
|
|
|
5
5
|
export declare const CONNECTED_CONNECTION: StatewireClient.Connection;
|
|
6
6
|
type Overlay = {
|
|
7
7
|
inv: CommandsInvocation;
|
|
8
|
-
dropped: boolean;
|
|
9
8
|
};
|
|
10
9
|
type Core = {
|
|
11
10
|
getOptions: () => StatewireClient.Options<any, any>;
|
|
12
11
|
value: Statewire<unknown> | null;
|
|
13
12
|
source: Statewire.StateSource | null;
|
|
14
13
|
overlays: Overlay[];
|
|
14
|
+
overlayOutbox: readonly StatewireClient.OutboxEntry[];
|
|
15
|
+
/** Folds whose reducer threw. */
|
|
16
|
+
dropped: WeakSet<object>;
|
|
17
|
+
droppedIds: Set<string>;
|
|
15
18
|
updates: Statewire.CommandUpdate[];
|
|
16
19
|
pendingChanged: StatewirePath[];
|
|
17
20
|
canonical: unknown;
|
|
@@ -22,7 +25,6 @@ type Core = {
|
|
|
22
25
|
notifiedConnection: StatewireClient.Connection | null;
|
|
23
26
|
notifiedError: StatewireClient.ConnectionError | undefined;
|
|
24
27
|
notifiedBusy: boolean;
|
|
25
|
-
notifiedFailed: readonly StatewireClient.FailedCommand[];
|
|
26
28
|
notifiedOutbox: readonly StatewireClient.OutboxEntry[];
|
|
27
29
|
stale: boolean;
|
|
28
30
|
everAttached: boolean;
|
|
@@ -35,7 +37,6 @@ type Core = {
|
|
|
35
37
|
commandsListener: CommandsListener;
|
|
36
38
|
getState: () => unknown;
|
|
37
39
|
getBusy: () => boolean;
|
|
38
|
-
getFailed: () => readonly StatewireClient.FailedCommand[];
|
|
39
40
|
getOutbox: () => readonly StatewireClient.OutboxEntry[];
|
|
40
41
|
rematerialize: () => void;
|
|
41
42
|
commands: Statewire.CommandsProxy<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/client/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAqB;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAoB;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAqB;AAEpD,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAAC,UAIlD,CAAC;
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/client/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAqB;AAIzE,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAoB;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAqB;AAEpD,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAAC,UAIlD,CAAC;AAaF,KAAK,OAAO,GAAG;IAAE,GAAG,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE3C,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpD,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IACjC,MAAM,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,aAAa,EAAE,SAAS,eAAe,CAAC,WAAW,EAAE,CAAC;IACtD,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC;IACnC,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,SAAS,aAAa,EAAE,CAAC;IACvC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,kBAAkB,EAAE,eAAe,CAAC,UAAU,GAAG,IAAI,CAAC;IACtD,aAAa,EAAE,eAAe,CAAC,eAAe,GAAG,SAAS,CAAC;IAC3D,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,SAAS,eAAe,CAAC,WAAW,EAAE,CAAC;IACvD,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,SAAS,eAAe,CAAC,WAAW,EAAE,CAAC;IACxD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CACjD,CAAC;AA8QF,eAAO,MAAM,gBAAgB,GAC3B,YAAY,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EACnD,OAAO,SAAS,CAAC,OAAO,CAAC,SA+G1B,CAAC"}
|
package/dist/client/core.js
CHANGED
|
@@ -11,7 +11,6 @@ const CONNECTED_CONNECTION = {
|
|
|
11
11
|
degraded: false,
|
|
12
12
|
reconnect: () => {}
|
|
13
13
|
};
|
|
14
|
-
const NO_FAILED = [];
|
|
15
14
|
const NO_OUTBOX = [];
|
|
16
15
|
const failureOf = (error) => error instanceof StatewireSendError ? error.failure : {
|
|
17
16
|
fate: "rejected",
|
|
@@ -48,12 +47,6 @@ const drainCanonical = (c) => {
|
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
};
|
|
51
|
-
const dropCovered = (c) => {
|
|
52
|
-
const { failureCovered } = c.getOptions();
|
|
53
|
-
const failures = c.value?.failures;
|
|
54
|
-
if (!failureCovered || !failures || c.canonical === void 0) return;
|
|
55
|
-
for (const entry of failures.list()) if (failureCovered(c.canonical, entry)) failures.discard(entry);
|
|
56
|
-
};
|
|
57
50
|
const recompute = (c) => {
|
|
58
51
|
if (!c.value) return;
|
|
59
52
|
const { optimistic, materialize, materializeKey } = c.getOptions();
|
|
@@ -62,32 +55,59 @@ const recompute = (c) => {
|
|
|
62
55
|
c.stale = false;
|
|
63
56
|
const prevCanonical = c.canonical;
|
|
64
57
|
drainCanonical(c);
|
|
65
|
-
|
|
58
|
+
const outbox = c.value.outbox?.list() ?? NO_OUTBOX;
|
|
59
|
+
if (outbox !== c.overlayOutbox) {
|
|
60
|
+
c.overlayOutbox = outbox;
|
|
61
|
+
c.overlaysDirty = true;
|
|
62
|
+
}
|
|
66
63
|
if (c.canonical === prevCanonical && !c.overlaysDirty && !rekeyed) return;
|
|
67
64
|
c.overlaysDirty = false;
|
|
68
65
|
c.materializeKey = materializeKey;
|
|
69
66
|
let next = c.canonical;
|
|
70
67
|
let paths = [];
|
|
71
|
-
if (optimistic && c.canonical !== void 0)
|
|
72
|
-
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
68
|
+
if (optimistic && c.canonical !== void 0) {
|
|
69
|
+
const protocol = c.getOptions().protocol ?? "default";
|
|
70
|
+
const unsent = outbox.filter((e) => e.state !== "sending");
|
|
71
|
+
const unsentIds = new Set(unsent.map((e) => e.id));
|
|
72
|
+
const clientId = c.value.outbox?.clientId();
|
|
73
|
+
const folds = [...c.overlays.filter(({ inv }) => inv.protocol === void 0 || inv.protocol === protocol).filter(({ inv }) => inv.id === void 0 || !unsentIds.has(inv.id)).map(({ inv }) => ({
|
|
74
|
+
key: inv,
|
|
75
|
+
id: inv.id,
|
|
76
|
+
method: inv.method,
|
|
77
|
+
params: inv.params,
|
|
78
|
+
ctx: {
|
|
79
|
+
ts: inv.ts,
|
|
80
|
+
...inv.seq !== void 0 && { seq: inv.seq },
|
|
81
|
+
...inv.clientId !== void 0 && { clientId: inv.clientId },
|
|
82
|
+
state: inv.seq !== void 0 ? "sending" : inv.held ? "held" : "queued",
|
|
83
|
+
localMeta: inv.localMeta
|
|
84
|
+
}
|
|
85
|
+
})), ...unsent.filter((e) => e.protocol === protocol).map((e) => ({
|
|
86
|
+
key: e,
|
|
87
|
+
id: e.id,
|
|
88
|
+
method: e.command.method,
|
|
89
|
+
params: e.command.params,
|
|
90
|
+
ctx: {
|
|
91
|
+
ts: e.ts,
|
|
92
|
+
...clientId !== void 0 && { clientId },
|
|
93
|
+
state: e.state,
|
|
94
|
+
localMeta: e.localMeta
|
|
95
|
+
}
|
|
96
|
+
}))];
|
|
97
|
+
for (const fold of folds) {
|
|
98
|
+
if (c.dropped.has(fold.key) || fold.id && c.droppedIds.has(fold.id)) continue;
|
|
99
|
+
try {
|
|
100
|
+
const recorded = recordMutations(next, (draft) => optimistic(draft, {
|
|
101
|
+
method: fold.method,
|
|
102
|
+
params: fold.params
|
|
103
|
+
}, fold.ctx));
|
|
104
|
+
next = recorded.state;
|
|
105
|
+
paths = [...paths, ...recorded.changedPaths];
|
|
106
|
+
} catch (error) {
|
|
107
|
+
c.dropped.add(fold.key);
|
|
108
|
+
if (fold.id) c.droppedIds.add(fold.id);
|
|
109
|
+
console.error(`statewire: optimistic reducer threw for "${fold.method}"; dropping its optimistic update`, error);
|
|
110
|
+
}
|
|
91
111
|
}
|
|
92
112
|
}
|
|
93
113
|
if (materialize && next !== void 0) try {
|
|
@@ -140,14 +160,6 @@ const flush = (c, scheduled = false) => {
|
|
|
140
160
|
const busy = c.getBusy();
|
|
141
161
|
const busyChanged = busy !== c.notifiedBusy;
|
|
142
162
|
c.notifiedBusy = busy;
|
|
143
|
-
const failed = c.value?.failures?.list() ?? NO_FAILED;
|
|
144
|
-
let failedChanged = false;
|
|
145
|
-
if (failed !== c.notifiedFailed) {
|
|
146
|
-
if (scheduled) {
|
|
147
|
-
c.notifiedFailed = failed;
|
|
148
|
-
failedChanged = true;
|
|
149
|
-
} else schedule(c);
|
|
150
|
-
}
|
|
151
163
|
const outbox = c.value?.outbox?.list() ?? NO_OUTBOX;
|
|
152
164
|
let outboxChanged = false;
|
|
153
165
|
if (outbox !== c.notifiedOutbox) {
|
|
@@ -156,7 +168,7 @@ const flush = (c, scheduled = false) => {
|
|
|
156
168
|
outboxChanged = true;
|
|
157
169
|
} else schedule(c);
|
|
158
170
|
}
|
|
159
|
-
if (stateChanged || connectionChanged || busyChanged ||
|
|
171
|
+
if (stateChanged || connectionChanged || busyChanged || outboxChanged) for (const listener of [...c.listeners]) listener();
|
|
160
172
|
} finally {
|
|
161
173
|
c.flushing = false;
|
|
162
174
|
}
|
|
@@ -170,6 +182,7 @@ const note = (c, inv, status, extra) => {
|
|
|
170
182
|
params: inv.params,
|
|
171
183
|
...inv.seq !== void 0 && { seq: inv.seq },
|
|
172
184
|
status,
|
|
185
|
+
...inv.localMeta !== void 0 && { localMeta: inv.localMeta },
|
|
173
186
|
...extra
|
|
174
187
|
});
|
|
175
188
|
schedule(c);
|
|
@@ -213,6 +226,9 @@ const useStatewireCore = (getOptions, value) => {
|
|
|
213
226
|
value: null,
|
|
214
227
|
source: null,
|
|
215
228
|
overlays: [],
|
|
229
|
+
overlayOutbox: NO_OUTBOX,
|
|
230
|
+
dropped: /* @__PURE__ */ new WeakSet(),
|
|
231
|
+
droppedIds: /* @__PURE__ */ new Set(),
|
|
216
232
|
updates: [],
|
|
217
233
|
pendingChanged: [],
|
|
218
234
|
canonical: void 0,
|
|
@@ -223,7 +239,6 @@ const useStatewireCore = (getOptions, value) => {
|
|
|
223
239
|
notifiedConnection: null,
|
|
224
240
|
notifiedError: void 0,
|
|
225
241
|
notifiedBusy: true,
|
|
226
|
-
notifiedFailed: NO_FAILED,
|
|
227
242
|
notifiedOutbox: NO_OUTBOX,
|
|
228
243
|
stale: false,
|
|
229
244
|
everAttached: false,
|
|
@@ -238,10 +253,7 @@ const useStatewireCore = (getOptions, value) => {
|
|
|
238
253
|
}),
|
|
239
254
|
commandsListener: {
|
|
240
255
|
onStart: (inv) => {
|
|
241
|
-
c.overlays.push({
|
|
242
|
-
inv,
|
|
243
|
-
dropped: false
|
|
244
|
-
});
|
|
256
|
+
c.overlays.push({ inv });
|
|
245
257
|
c.overlaysDirty = true;
|
|
246
258
|
markStale(c);
|
|
247
259
|
note(c, inv, "queued");
|
|
@@ -259,8 +271,8 @@ const useStatewireCore = (getOptions, value) => {
|
|
|
259
271
|
c.overlaysDirty = true;
|
|
260
272
|
markStale(c);
|
|
261
273
|
},
|
|
262
|
-
onSettle: (inv_4, outcome) => {
|
|
263
|
-
note(c, inv_4, "settled", outcome.type === "accepted" ? { result: outcome.payload } : { failure: failureOf(outcome.error) });
|
|
274
|
+
onSettle: (inv_4, outcome, durable) => {
|
|
275
|
+
if (!durable) note(c, inv_4, "settled", outcome.type === "accepted" ? { result: outcome.payload } : { failure: failureOf(outcome.error) });
|
|
264
276
|
flush(c);
|
|
265
277
|
}
|
|
266
278
|
},
|
|
@@ -269,7 +281,6 @@ const useStatewireCore = (getOptions, value) => {
|
|
|
269
281
|
return c.published;
|
|
270
282
|
},
|
|
271
283
|
getBusy: () => c.value?.isBusy ?? true,
|
|
272
|
-
getFailed: () => c.notifiedFailed,
|
|
273
284
|
getOutbox: () => c.notifiedOutbox,
|
|
274
285
|
rematerialize: () => flush(c),
|
|
275
286
|
commands: createMethodProxy((method, params) => {
|
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","NO_OUTBOX","OutboxEntry","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","notifiedOutbox","stale","everAttached","overlaysDirty","materializeKey","flushing","scheduled","listeners","Set","post","commandsListener","getState","getBusy","getFailed","getOutbox","rematerialize","commands","CommandsProxy","subscribe","listener","schedule","c","markStale","drainCanonical","push","takeChanged","snapshot","undefined","next","initialState","state","dropCovered","failureCovered","failures","entry","list","discard","recompute","optimistic","materialize","rekeyed","Object","is","prevCanonical","paths","overlay","protocol","ctx","OptimisticContext","ts","seq","clientId","held","hold","meta","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","outbox","outboxChanged","note","extra","result","id","attach","nextSource","setOnChange","setListener","detach","useStatewireCore","core","onStart","onPosted","onChange","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[] = [];\nconst NO_OUTBOX: readonly StatewireClient.OutboxEntry[] = [];\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 notifiedOutbox: readonly StatewireClient.OutboxEntry[];\n stale: boolean;\n everAttached: boolean;\n overlaysDirty: boolean;\n materializeKey: unknown;\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 getOutbox: () => readonly StatewireClient.OutboxEntry[];\n rematerialize: () => void;\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.value) return;\n const { optimistic, materialize, materializeKey } = c.getOptions();\n const rekeyed = !Object.is(materializeKey, c.materializeKey);\n if (!c.stale && !rekeyed) 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 && !rekeyed) return;\n c.overlaysDirty = false;\n c.materializeKey = materializeKey;\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 ...(inv.seq !== undefined && { seq: inv.seq }),\n ...(inv.clientId !== undefined && { clientId: inv.clientId }),\n held:\n inv.seq === undefined && inv.hold !== undefined\n ? { meta: inv.hold.meta }\n : null,\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 const outbox = c.value?.outbox?.list() ?? NO_OUTBOX;\n let outboxChanged = false;\n if (outbox !== c.notifiedOutbox) {\n if (scheduled) {\n c.notifiedOutbox = outbox;\n outboxChanged = true;\n } else {\n schedule(c);\n }\n }\n if (\n stateChanged ||\n connectionChanged ||\n busyChanged ||\n failedChanged ||\n outboxChanged\n ) {\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 ...(inv.id !== undefined && { id: inv.id }),\n method: inv.method,\n params: inv.params as never[],\n ...(inv.seq !== undefined && { 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 notifiedOutbox: NO_OUTBOX,\n stale: false,\n everAttached: false,\n overlaysDirty: false,\n materializeKey: undefined,\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 onChange: (inv) => {\n c.overlaysDirty = true;\n markStale(c);\n // Back in the outbox (unstamped or its hold changed).\n if (inv.seq === undefined) note(c, inv, \"queued\");\n },\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 getOutbox: () => c.notifiedOutbox,\n rematerialize: () => flush(c),\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":";;;;;;;;AAYA,MAAac,uBAAmD;CAC9DE,QAAQ;CACRC,UAAU;CACVC,iBAAiB,CAAC;AACpB;AAEA,MAAMC,YAAsD,CAAA;AAC5D,MAAME,YAAoD,CAAA;AAE1D,MAAME,aAAaC,UACjBA,iBAAiBb,qBACba,MAAME,UACN;CACEC,MAAM;CACNC,OAAO;CACPC,SAASL,iBAAiBM,QAAQN,MAAMK,UAAUE,OAAOP,KAAK;AAChE;AAuCN,MAAMmD,YAAYC,MAAY;CAC5B,IAAIA,EAAEf,WAAW;CACjBe,EAAEf,YAAY;CACde,EAAEZ,KAAK;AACT;AAEA,MAAMa,aAAaD,MAAY;CAC7BA,EAAEpB,QAAQ;CACVmB,SAASC,CAAC;AACZ;AAIA,MAAME,kBAAkBF,MAAY;CAClC,IAAIA,EAAErC,QAAQ;EACZqC,EAAEhC,eAAemC,KAAK,GAAGH,EAAErC,OAAOyC,YAAY,CAAC;EAC/C,MAAMC,WAAWL,EAAErC,OAAO0C,SAAS;EACnC,IAAIA,aAAaC,KAAAA,GAAW;GAC1BN,EAAEnB,eAAe;GACjBmB,EAAE/B,YAAYoC;GACd;EACF;EACA,MAAME,OAAOP,EAAEnB,eAAeyB,KAAAA,IAAYN,EAAExC,WAAW,CAAC,CAACgD;EACzD,IAAID,SAASP,EAAE/B,WAAW+B,EAAEhC,eAAemC,KAAK,CAAA,CAAE;EAClDH,EAAE/B,YAAYsC;CAChB,OAAO,IAAIP,EAAEtC,OAAO;EAClB,IAAIsC,EAAEtC,MAAM+C,UAAUH,KAAAA,GAAWN,EAAEnB,eAAe;EAClD,MAAM0B,OAAOP,EAAEnB,eAAemB,EAAEtC,MAAM+C,QAAQT,EAAExC,WAAW,CAAC,CAACgD;EAC7D,IAAID,SAASP,EAAE/B,WAAW;GACxB+B,EAAEhC,eAAemC,KAAK,CAAA,CAAE;GACxBH,EAAE/B,YAAYsC;EAChB;CACF;AACF;AAEA,MAAMG,eAAeV,MAAY;CAC/B,MAAM,EAAEW,mBAAmBX,EAAExC,WAAW;CACxC,MAAMoD,WAAWZ,EAAEtC,OAAOkD;CAC1B,IAAI,CAACD,kBAAkB,CAACC,YAAYZ,EAAE/B,cAAcqC,KAAAA,GAAW;CAC/D,KAAK,MAAMO,SAASD,SAASE,KAAK,GAChC,IAAIH,eAAeX,EAAE/B,WAAoB4C,KAAK,GAAGD,SAASG,QAAQF,KAAK;AAE3E;AAEA,MAAMG,aAAahB,MAAY;CAC7B,IAAI,CAACA,EAAEtC,OAAO;CACd,MAAM,EAAEuD,YAAYC,aAAanC,mBAAmBiB,EAAExC,WAAW;CACjE,MAAM2D,UAAU,CAACC,OAAOC,GAAGtC,gBAAgBiB,EAAEjB,cAAc;CAC3D,IAAI,CAACiB,EAAEpB,SAAS,CAACuC,SAAS;CAC1BnB,EAAEpB,QAAQ;CACV,MAAM0C,gBAAgBtB,EAAE/B;CACxBiC,eAAeF,CAAC;CAChB,IAAIA,EAAE/B,cAAcqD,eAAeZ,YAAYV,CAAC;CAChD,IAAIA,EAAE/B,cAAcqD,iBAAiB,CAACtB,EAAElB,iBAAiB,CAACqC,SAAS;CACnEnB,EAAElB,gBAAgB;CAClBkB,EAAEjB,iBAAiBA;CACnB,IAAIwB,OAAOP,EAAE/B;CACb,IAAIsD,QAAkC,CAAA;CACtC,IAAIN,cAAcjB,EAAE/B,cAAcqC,KAAAA,GAChC,KAAK,MAAMkB,WAAWxB,EAAEnC,UAAU;EAChC,IAAI2D,QAAQlE,SAAS;EACrB,MAAM,EAAED,QAAQmE;EAChB,IACEnE,IAAIoE,aAAanB,KAAAA,KACjBjD,IAAIoE,cAAczB,EAAExC,WAAW,CAAC,CAACiE,YAAY,YAE7C;EACF,MAAMC,MAAyC;GAC7CE,IAAIvE,IAAIuE;GACR,GAAIvE,IAAIwE,QAAQvB,KAAAA,KAAa,EAAEuB,KAAKxE,IAAIwE,IAAI;GAC5C,GAAIxE,IAAIyE,aAAaxB,KAAAA,KAAa,EAAEwB,UAAUzE,IAAIyE,SAAS;GAC3DC,MACE1E,IAAIwE,QAAQvB,KAAAA,KAAajD,IAAI2E,SAAS1B,KAAAA,IAClC,EAAE2B,MAAM5E,IAAI2E,KAAKC,KAAK,IACtB;EACR;EACA,IAAI;GACF,MAAMC,WAAWvG,gBAAgB4E,OAAO4B,UACtClB,WACEkB,OACA;IAAEC,QAAQ/E,IAAI+E;IAAQC,QAAQhF,IAAIgF;GAAO,GACzCX,GACF,CACF;GACAnB,OAAO2B,SAASzB;GAChBc,QAAQ,CAAC,GAAGA,OAAO,GAAGW,SAASK,YAAY;EAC7C,SAAS3F,OAAO;GACd4E,QAAQlE,UAAU;GAClBkF,QAAQ5F,MACN,4CAA4CS,IAAI+E,OAAM,oCACtDxF,KACF;EACF;CACF;CAEF,IAAIsE,eAAeX,SAASD,KAAAA,GAC1B,IAAI;EACF,MAAM4B,WAAWvG,gBAAgB4E,OAAO4B,UACtCjB,YAAYiB,KAAc,CAC5B;EACA5B,OAAO2B,SAASzB;EAChBc,QAAQ,CAAC,GAAGA,OAAO,GAAGW,SAASK,YAAY;CAC7C,SAAS3F,OAAO;EACd4F,QAAQ5F,MACN,+DACAA,KACF;CACF;CAEFoD,EAAE9B,YAAYqC;CACdP,EAAE7B,eAAeoD;AACnB;AAEA,MAAMkB,iBAAiBzC,MACrBA,EAAEtC,OAAOgF,cAAcxG;AAEzB,MAAMyG,SAAS3C,GAASf,YAAY,UAAU;CAC5C,IAAI,CAACe,EAAEtC,OAAO;CACd,IAAIsC,EAAEhB,UAAU;EACde,SAASC,CAAC;EACV;CACF;CACAA,EAAEhB,WAAW;CACb,IAAI;EACFgC,UAAUhB,CAAC;EACX,MAAM4C,UAAU5C,EAAExC,WAAW;EAC7B,MAAMqF,eAAe7C,EAAE9B,cAAc8B,EAAE5B;EACvC,IAAIyE,cAAc;GAChB,MAAMC,OAAO9C,EAAE5B;GACf,MAAM2E,UAAU;IACd,GAAG/C,EAAEhC;IACL,GAAGgC,EAAE3B;IACL,GAAG2B,EAAE7B;GAAY;GAEnB6B,EAAEhC,iBAAiB,CAAA;GACnBgC,EAAE5B,oBAAoB4B,EAAE9B;GACxB8B,EAAE3B,uBAAuB2B,EAAE7B;GAC3ByE,QAAQI,gBAAgBhD,EAAE9B,WAAoB,EAC5C+E,SAAS3H,cAAcwH,MAAM9C,EAAE9B,WAAW6E,OAAO,EACnD,CAAC;EACH;EACA,IAAI/C,EAAElC,QAAQoF,SAAS,KAAKlD,EAAE9B,cAAcoC,KAAAA,GAAW;GACrD,MAAM6C,QAAQnD,EAAElC;GAChBkC,EAAElC,UAAU,CAAA;GACZ,KAAK,MAAMsF,UAAUD,OACnBP,QAAQS,kBAAkBD,QAAQ,EAAE3C,OAAOT,EAAE9B,UAAmB,CAAC;EAErE;EACA,MAAMwE,aAAaD,cAAczC,CAAC;EAClC,MAAMsD,oBAAoBZ,eAAe1C,EAAE1B;EAC3C0B,EAAE1B,qBAAqBoE;EACvB,IAAIY,mBAAmBV,QAAQW,qBAAqBb,UAAU;EAC9D,IAAIA,WAAW9F,UAAUoD,EAAEzB,eAAe;GACxCyB,EAAEzB,gBAAgBmE,WAAW9F;GAC7B,IAAI8F,WAAW9F,OAAOgG,QAAQY,UAAUd,WAAW9F,KAAK;EAC1D;EACA,MAAM6G,OAAOzD,EAAET,QAAQ;EACvB,MAAMmE,cAAcD,SAASzD,EAAEvB;EAC/BuB,EAAEvB,eAAegF;EAGjB,MAAME,SAAS3D,EAAEtC,OAAOkD,UAAUE,KAAK,KAAKvE;EAC5C,IAAIqH,gBAAgB;EACpB,IAAID,WAAW3D,EAAEtB,gBAAgB;GAC/B,IAAIO,WAAW;IACbe,EAAEtB,iBAAiBiF;IACnBC,gBAAgB;GAClB,OACE7D,SAASC,CAAC;EAEd;EACA,MAAM6D,SAAS7D,EAAEtC,OAAOmG,QAAQ/C,KAAK,KAAKrE;EAC1C,IAAIqH,gBAAgB;EACpB,IAAID,WAAW7D,EAAErB,gBAAgB;GAC/B,IAAIM,WAAW;IACbe,EAAErB,iBAAiBkF;IACnBC,gBAAgB;GAClB,OACE/D,SAASC,CAAC;EAEd;EACA,IACE6C,gBACAS,qBACAI,eACAE,iBACAE,eAEA,KAAK,MAAMhE,YAAY,CAAC,GAAGE,EAAEd,SAAS,GAAGY,SAAS;CAEtD,UAAU;EACRE,EAAEhB,WAAW;CACf;AACF;AAEA,MAAM+E,QACJ/D,GACA3C,KACAjB,QACA4H,UACG;CACH,IAAI,CAAChE,EAAExC,WAAW,CAAC,CAAC6F,iBAAiB;CACrCrD,EAAElC,QAAQqC,KAAK;EACb,GAAI9C,IAAIoE,aAAanB,KAAAA,KAAa,EAAEmB,UAAUpE,IAAIoE,SAAS;EAC3D,GAAIpE,IAAI6G,OAAO5D,KAAAA,KAAa,EAAE4D,IAAI7G,IAAI6G,GAAG;EACzC9B,QAAQ/E,IAAI+E;EACZC,QAAQhF,IAAIgF;EACZ,GAAIhF,IAAIwE,QAAQvB,KAAAA,KAAa,EAAEuB,KAAKxE,IAAIwE,IAAI;EAC5CzF;EACA,GAAG4H;CACL,CAAC;CACDjE,SAASC,CAAC;AACZ;AAEA,MAAMmE,UAAUnE,GAASO,SAA6B;CACpD,IAAIA,SAASP,EAAEtC,OAAO;CACtB,MAAMoF,OAAO9C,EAAEtC;CACfsC,EAAEtC,QAAQ6C;CACV,MAAM6D,aACJ7D,KAAK5C,WACJ,OAAO4C,KAAKE,UAAU,YAAYF,KAAKE,UAAU,OAC9CjF,aAAa+E,KAAKE,KAAK,IACvBH,KAAAA,MACJ;CACF,IAAI8D,eAAepE,EAAErC,QAAQ;EAC3BqC,EAAErC,QAAQ0G,YAAY,IAAI;EAC1BrE,EAAErC,SAASyG;EACXpE,EAAErC,QAAQ0G,kBAAkBpE,UAAUD,CAAC,CAAC;EAExCA,EAAEnB,eAAe;EACjBoB,UAAUD,CAAC;CACb;CACA,IAAIO,KAAKZ,aAAamD,MAAMnD,UAAU;EACpC,IAAImD,MAAMvH,gBAAgBuH,KAAKnD,QAAQ,CAAC,EAAE2E,YAAY,IAAI;EAC1D/I,gBAAgBgF,KAAKZ,QAAQ,CAAC,EAAE2E,YAAYtE,EAAEX,gBAAgB;EAC9D,IAAIW,EAAEnC,SAASqF,SAAS,GAAG;GACzBlD,EAAEnC,WAAW,CAAA;GACbmC,EAAElB,gBAAgB;EACpB;EACAmB,UAAUD,CAAC;CACb;CACA,IAAI,CAACA,EAAErC,QAAQsC,UAAUD,CAAC;CAC1BD,SAASC,CAAC;AACZ;AAEA,MAAMuE,UAAUvE,MAAY;CAC1BA,EAAErC,QAAQ0G,YAAY,IAAI;CAC1BrE,EAAErC,SAAS;CACX,IAAIqC,EAAEtC,OAAO;EACXnC,gBAAgByE,EAAEtC,MAAMiC,QAAQ,CAAC,EAAE2E,YAAY,IAAI;EACnDtE,EAAEtC,QAAQ;CACZ;AACF;AAEA,MAAa8G,oBACXhH,YACAE,UACG;CACH,MAAM,CAAC+G,QAAQpJ,eAAqB;EAClC,MAAM2E,IAAU;GACdxC;GACAE,OAAO;GACPC,QAAQ;GACRE,UAAU,CAAA;GACVC,SAAS,CAAA;GACTE,gBAAgB,CAAA;GAChBC,WAAWqC,KAAAA;GACXpC,WAAWoC,KAAAA;GACXnC,cAAc,CAAA;GACdC,mBAAmBkC,KAAAA;GACnBjC,sBAAsB,CAAA;GACtBC,oBAAoB;GACpBC,eAAe+B,KAAAA;GACf7B,cAAc;GACdC,gBAAgBnC;GAChBoC,gBAAgBlC;GAChBmC,OAAO;GACPC,cAAc;GACdC,eAAe;GACfC,gBAAgBuB,KAAAA;GAChBtB,UAAU;GACVC,WAAW;GACXC,2BAAW,IAAIC,IAAI;GACnBC,MAAMxD,4BAA4B;IAChCoE,EAAEf,YAAY;IACd0D,MAAM3C,GAAG,IAAI;GACf,CAAC;GACDX,kBAAkB;IAChBqF,UAAUrH,QAAQ;KAChB2C,EAAEnC,SAASsC,KAAK;MAAE9C;MAAKC,SAAS;KAAM,CAAC;KACvC0C,EAAElB,gBAAgB;KAClBmB,UAAUD,CAAC;KACX+D,KAAK/D,GAAG3C,KAAK,QAAQ;IACvB;IACAsH,WAAWtH,UAAQ0G,KAAK/D,GAAG3C,OAAK,QAAQ;IACxCuH,WAAWvH,UAAQ;KACjB2C,EAAElB,gBAAgB;KAClBmB,UAAUD,CAAC;KAEX,IAAI3C,MAAIwE,QAAQvB,KAAAA,GAAWyD,KAAK/D,GAAG3C,OAAK,QAAQ;IAClD;IACAwH,YAAYxH,UAAQ0G,KAAK/D,GAAG3C,OAAK,SAAS;IAC1CyH,YAAYzH,UAAQ;KAClB,IAAI,CAAC2C,EAAEnC,SAASkH,MAAMC,MAAMA,EAAE3H,QAAQA,KAAG,GAAG;KAC5C2C,EAAEnC,WAAWmC,EAAEnC,SAASoH,QAAQD,QAAMA,IAAE3H,QAAQA,KAAG;KACnD2C,EAAElB,gBAAgB;KAClBmB,UAAUD,CAAC;IACb;IACAkF,WAAW7H,OAAK8H,YAAY;KAC1BpB,KACE/D,GACA3C,OACA,WACA8H,QAAQC,SAAS,aACb,EAAEnB,QAAQkB,QAAQE,QAAQ,IAC1B,EAAEvI,SAASH,UAAUwI,QAAQvI,KAAK,EAAE,CAC1C;KACA+F,MAAM3C,CAAC;IACT;GACF;GACAV,gBAAgB;IACd0B,UAAUhB,CAAC;IACX,OAAOA,EAAE9B;GACX;GACAqB,eAAeS,EAAEtC,OAAO4H,UAAU;GAClC9F,iBAAiBQ,EAAEtB;GACnBe,iBAAiBO,EAAErB;GACnBe,qBAAqBiD,MAAM3C,CAAC;GAC5BL,UAAU9D,mBACPuG,QAAQC,WAAW;IAClB,IAAI,CAACrC,EAAEtC,OACL,OAAO6H,QAAQC,OACb,IAAIzJ,mBAAmB;KAAEgB,MAAM;KAAWC,OAAO;IAAU,CAAC,CAC9D;IAEF,MAAMyI,OACJzF,EAAEtC,MAAMiC,SAIRyC;IACF,MAAMwD,UAAUH,KAAK,GAAGpD,MAAM;IAC9BM,MAAM3C,CAAC;IACP,OAAO4F;GACT,CACF;GACA/F,YAAYC,aAAa;IACvBE,EAAEd,UAAU2G,IAAI/F,QAAQ;IACxB,aAAa;KACXE,EAAEd,UAAU4G,OAAOhG,QAAQ;IAC7B;GACF;EACF;EACA,OAAOE;CACT,CAAC;CACDyE,KAAKjH,aAAaA;CAIlB2G,OAAOM,MAAM/G,KAAK;CAClBtC,gBAAgB;EACd+I,OAAOM,MAAM/G,KAAK;CACpB,CAAC;CACDtC,sBAAsBmJ,OAAOE,IAAI,GAAG,CAACA,IAAI,CAAC;CAC1C,OAAOA;AACT"}
|
|
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_OUTBOX","OutboxEntry","failureOf","error","SendFailure","failure","fate","cause","message","Error","String","Overlay","inv","Core","getOptions","Options","value","source","StateSource","overlays","overlayOutbox","dropped","WeakSet","droppedIds","Set","updates","CommandUpdate","pendingChanged","canonical","published","overlayPaths","notifiedPublished","notifiedOverlayPaths","notifiedConnection","notifiedError","ConnectionError","notifiedBusy","notifiedOutbox","stale","everAttached","overlaysDirty","materializeKey","flushing","scheduled","listeners","post","commandsListener","getState","getBusy","getOutbox","rematerialize","commands","CommandsProxy","subscribe","listener","schedule","c","markStale","drainCanonical","push","takeChanged","snapshot","undefined","next","initialState","state","recompute","optimistic","materialize","rekeyed","Object","is","prevCanonical","outbox","list","paths","protocol","unsent","filter","e","unsentIds","map","id","clientId","folds","key","method","params","ctx","OptimisticContext","has","ts","seq","held","localMeta","command","fold","recorded","draft","Command","changedPaths","add","console","getConnection","connection","flush","options","stateChanged","prev","changed","onStateChange","changes","length","batch","update","onCommandChange","connectionChanged","onConnectionChange","onError","busy","busyChanged","outboxChanged","note","extra","result","attach","nextSource","setOnChange","setListener","detach","useStatewireCore","core","onStart","onPosted","onChange","onApplied","onCovered","some","o","onSettle","outcome","durable","type","payload","isBusy","Promise","reject","send","Record","args","promise","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_OUTBOX: readonly StatewireClient.OutboxEntry[] = [];\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 };\n\ntype Core = {\n getOptions: () => StatewireClient.Options<any, any>;\n value: Statewire<unknown> | null;\n source: Statewire.StateSource | null;\n overlays: Overlay[];\n overlayOutbox: readonly StatewireClient.OutboxEntry[];\n /** Folds whose reducer threw. */\n dropped: WeakSet<object>;\n droppedIds: Set<string>;\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 notifiedOutbox: readonly StatewireClient.OutboxEntry[];\n stale: boolean;\n everAttached: boolean;\n overlaysDirty: boolean;\n materializeKey: unknown;\n flushing: boolean;\n scheduled: boolean;\n listeners: Set<() => void>;\n post: () => void;\n commandsListener: CommandsListener;\n getState: () => unknown;\n getBusy: () => boolean;\n getOutbox: () => readonly StatewireClient.OutboxEntry[];\n rematerialize: () => void;\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 recompute = (c: Core) => {\n if (!c.value) return;\n const { optimistic, materialize, materializeKey } = c.getOptions();\n const rekeyed = !Object.is(materializeKey, c.materializeKey);\n if (!c.stale && !rekeyed) return;\n c.stale = false;\n const prevCanonical = c.canonical;\n drainCanonical(c);\n const outbox = c.value.outbox?.list() ?? NO_OUTBOX;\n if (outbox !== c.overlayOutbox) {\n c.overlayOutbox = outbox;\n c.overlaysDirty = true;\n }\n if (c.canonical === prevCanonical && !c.overlaysDirty && !rekeyed) return;\n c.overlaysDirty = false;\n c.materializeKey = materializeKey;\n let next = c.canonical;\n let paths: readonly StatewirePath[] = [];\n if (optimistic && c.canonical !== undefined) {\n const protocol = c.getOptions().protocol ?? \"default\";\n const unsent = outbox.filter((e) => e.state !== \"sending\");\n const unsentIds = new Set(unsent.map((e) => e.id));\n const clientId = c.value.outbox?.clientId();\n // In queue order: the commands on their way, then the outbox's queued\n // and held entries across sharers.\n const folds: {\n key: object;\n id: string | undefined;\n method: string;\n params: readonly unknown[];\n ctx: StatewireClient.OptimisticContext;\n }[] = [\n ...c.overlays\n .filter(\n ({ inv }) => inv.protocol === undefined || inv.protocol === protocol,\n )\n .filter(({ inv }) => inv.id === undefined || !unsentIds.has(inv.id))\n .map(({ inv }) => ({\n key: inv,\n id: inv.id,\n method: inv.method,\n params: inv.params,\n ctx: {\n ts: inv.ts,\n ...(inv.seq !== undefined && { seq: inv.seq }),\n ...(inv.clientId !== undefined && { clientId: inv.clientId }),\n state:\n inv.seq !== undefined ? \"sending\" : inv.held ? \"held\" : \"queued\",\n localMeta: inv.localMeta,\n } satisfies StatewireClient.OptimisticContext,\n })),\n ...unsent\n .filter((e) => e.protocol === protocol)\n .map((e) => ({\n key: e,\n id: e.id,\n method: e.command.method,\n params: e.command.params,\n ctx: {\n ts: e.ts,\n ...(clientId !== undefined && { clientId }),\n state: e.state,\n localMeta: e.localMeta,\n } satisfies StatewireClient.OptimisticContext,\n })),\n ];\n for (const fold of folds) {\n if (c.dropped.has(fold.key) || (fold.id && c.droppedIds.has(fold.id)))\n continue;\n try {\n const recorded = recordMutations(next, (draft) =>\n optimistic(\n draft as never,\n { method: fold.method, params: fold.params } as Statewire.Command,\n fold.ctx,\n ),\n );\n next = recorded.state;\n paths = [...paths, ...recorded.changedPaths];\n } catch (error) {\n c.dropped.add(fold.key);\n if (fold.id) c.droppedIds.add(fold.id);\n console.error(\n `statewire: optimistic reducer threw for \"${fold.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 outbox snapshot advances only on the scheduled pass: settles land\n // mid-unmount, where a changed snapshot re-renders the unmounting tree.\n const outbox = c.value?.outbox?.list() ?? NO_OUTBOX;\n let outboxChanged = false;\n if (outbox !== c.notifiedOutbox) {\n if (scheduled) {\n c.notifiedOutbox = outbox;\n outboxChanged = true;\n } else {\n schedule(c);\n }\n }\n if (stateChanged || connectionChanged || busyChanged || outboxChanged) {\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 ...(inv.id !== undefined && { id: inv.id }),\n method: inv.method,\n params: inv.params as never[],\n ...(inv.seq !== undefined && { seq: inv.seq }),\n status,\n ...(inv.localMeta !== undefined && { localMeta: inv.localMeta }),\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 overlayOutbox: NO_OUTBOX,\n dropped: new WeakSet(),\n droppedIds: new Set(),\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 notifiedOutbox: NO_OUTBOX,\n stale: false,\n everAttached: false,\n overlaysDirty: false,\n materializeKey: undefined,\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 });\n c.overlaysDirty = true;\n markStale(c);\n note(c, inv, \"queued\");\n },\n onPosted: (inv) => note(c, inv, \"posted\"),\n onChange: (inv) => {\n c.overlaysDirty = true;\n markStale(c);\n // Back in the outbox (unstamped or its hold changed).\n if (inv.seq === undefined) note(c, inv, \"queued\");\n },\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, durable) => {\n if (!durable)\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 getOutbox: () => c.notifiedOutbox,\n rematerialize: () => flush(c),\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
|
@@ -16,12 +16,11 @@ type WireCommand = {
|
|
|
16
16
|
type Invocation = {
|
|
17
17
|
-readonly [K in keyof CommandsInvocation]: CommandsInvocation[K];
|
|
18
18
|
};
|
|
19
|
-
type Hold = StatewireClient.OutboxCommand["hold"];
|
|
20
19
|
type Pending = {
|
|
21
20
|
readonly id: string;
|
|
22
21
|
/** Unset while in the outbox, or while another sharer owns its stamp. */
|
|
23
22
|
seq: number | undefined;
|
|
24
|
-
|
|
23
|
+
command: WireCommand;
|
|
25
24
|
readonly inv: Invocation;
|
|
26
25
|
/** Enqueued by another sharer: this client holds no promise for it. */
|
|
27
26
|
readonly adopted: boolean;
|
|
@@ -45,6 +44,8 @@ export type StatewireSessionOptions = StatewireProtocol.Options & {
|
|
|
45
44
|
context?: Readonly<Record<string, Statewire.Context>>;
|
|
46
45
|
sessionStore?: StatewireClient.SessionStorage | undefined;
|
|
47
46
|
onSessionLost?: StatewireClient.OnSessionLost | undefined;
|
|
47
|
+
onDeprecatedPath?: StatewireClient.OnDeprecatedPath | undefined;
|
|
48
|
+
onSettled?: StatewireClient.OnSettled | undefined;
|
|
48
49
|
onFlush?: StatewireClient.OnFlush | undefined;
|
|
49
50
|
canOvertake?: Readonly<Record<string, StatewireClient.CanOvertake>> | undefined;
|
|
50
51
|
onDone?: (() => void) | undefined;
|
|
@@ -56,16 +57,33 @@ type Shared = {
|
|
|
56
57
|
protocol: string;
|
|
57
58
|
verdict: StatewireClient.SessionVerdict;
|
|
58
59
|
}[];
|
|
60
|
+
/** Own commands settled since the last backlog sync: verdicts parked for them are moot. */
|
|
61
|
+
settled: Set<string>;
|
|
62
|
+
/** Settled updates waiting for the next backlog sync. */
|
|
63
|
+
notices: Notice[];
|
|
64
|
+
/** A locked transaction is running its mutation. */
|
|
65
|
+
inTx: boolean;
|
|
59
66
|
unsubscribe: (() => void) | null;
|
|
60
67
|
/** Owners whose departure this sharer awaits. */
|
|
61
68
|
watched: Set<string>;
|
|
62
69
|
abort: AbortController | null;
|
|
63
70
|
};
|
|
71
|
+
type Patch = {
|
|
72
|
+
held?: boolean;
|
|
73
|
+
localMeta?: {
|
|
74
|
+
value: unknown;
|
|
75
|
+
};
|
|
76
|
+
params?: readonly unknown[];
|
|
77
|
+
};
|
|
64
78
|
type Flushing = {
|
|
65
79
|
ids: ReadonlySet<string>;
|
|
66
|
-
|
|
80
|
+
patches: Map<string, Patch>;
|
|
67
81
|
removed: Set<string>;
|
|
68
82
|
};
|
|
83
|
+
type Waiter = {
|
|
84
|
+
resolve: (payload: unknown) => void;
|
|
85
|
+
reject: (error: unknown) => void;
|
|
86
|
+
};
|
|
69
87
|
type Session = {
|
|
70
88
|
options: StatewireSessionOptions;
|
|
71
89
|
configuredContext: StatewireSessionOptions["context"];
|
|
@@ -94,8 +112,16 @@ type Session = {
|
|
|
94
112
|
resumeAt: number;
|
|
95
113
|
idle: boolean;
|
|
96
114
|
onSessionLost: StatewireClient.OnSessionLost | undefined;
|
|
115
|
+
onDeprecatedPath: StatewireClient.OnDeprecatedPath | undefined;
|
|
116
|
+
onSettled: StatewireClient.OnSettled | undefined;
|
|
97
117
|
onFlush: StatewireClient.OnFlush | undefined;
|
|
98
118
|
onDone: (() => void) | undefined;
|
|
119
|
+
/** `outbox.release` promises by entry id. */
|
|
120
|
+
releases: Map<string, Waiter[]>;
|
|
121
|
+
delivering: boolean;
|
|
122
|
+
/** Notices whose handler threw on this mount. */
|
|
123
|
+
skipped: Set<string>;
|
|
124
|
+
views: WeakMap<object, StatewireClient.OutboxEntry>;
|
|
99
125
|
/** Outbox and stamped ids stored before this client mounted. */
|
|
100
126
|
mountIds: Set<string>;
|
|
101
127
|
flushing: Flushing | null;
|
|
@@ -104,9 +130,14 @@ type Session = {
|
|
|
104
130
|
lanesOnAttach: boolean;
|
|
105
131
|
attachEntries: ReadonlySet<Pending>;
|
|
106
132
|
frameFailures: number;
|
|
133
|
+
/** A later hello decides stamps this one could not: another live sharer's stamp sat below them. */
|
|
134
|
+
recheck: ReturnType<typeof setTimeout> | undefined;
|
|
135
|
+
/** Hellos in a row that left stamps waiting at the same watermarks: the recheck backs off. */
|
|
136
|
+
rechecks: {
|
|
137
|
+
watermarks: string;
|
|
138
|
+
count: number;
|
|
139
|
+
};
|
|
107
140
|
pending: Pending[];
|
|
108
|
-
failedList: readonly StatewireClient.FailedCommand[];
|
|
109
|
-
failedParts: readonly (readonly StatewireClient.FailedCommand[])[];
|
|
110
141
|
canonical: unknown;
|
|
111
142
|
documentListeners: Set<() => void>;
|
|
112
143
|
documents: StatewireDocuments.State;
|
|
@@ -123,15 +154,28 @@ type Session = {
|
|
|
123
154
|
notify: () => void;
|
|
124
155
|
commands: Record<string, (...params: unknown[]) => Promise<unknown>>;
|
|
125
156
|
};
|
|
126
|
-
|
|
127
|
-
|
|
157
|
+
type Stamped = Pending & {
|
|
158
|
+
seq: number;
|
|
159
|
+
};
|
|
160
|
+
export declare const MAX_INBOX = 256;
|
|
161
|
+
type Outcome = {
|
|
162
|
+
ok: true;
|
|
163
|
+
payload: unknown;
|
|
164
|
+
} | {
|
|
165
|
+
ok: false;
|
|
166
|
+
failure: StatewireClient.SendFailure;
|
|
167
|
+
};
|
|
168
|
+
type Notice = {
|
|
169
|
+
entry: Stamped;
|
|
170
|
+
outcome: Outcome;
|
|
171
|
+
};
|
|
128
172
|
declare const setTransport: (s: Session, transport: RemoteLink) => void;
|
|
129
173
|
export declare const outboxEntries: (s: Session) => readonly StatewireClient.OutboxEntry[];
|
|
130
|
-
export declare const holdOutbox: (s: Session,
|
|
131
|
-
export declare const releaseOutbox: (s: Session,
|
|
132
|
-
export declare const removeOutbox: (s: Session,
|
|
133
|
-
export declare const
|
|
134
|
-
export declare const
|
|
174
|
+
export declare const holdOutbox: (s: Session, id: string) => void;
|
|
175
|
+
export declare const releaseOutbox: (s: Session, id: string) => Promise<unknown>;
|
|
176
|
+
export declare const removeOutbox: (s: Session, id: string) => void;
|
|
177
|
+
export declare const updateOutbox: (s: Session, id: string, fn: (entry: StatewireClient.OutboxEntry) => StatewireClient.OutboxPatch) => void;
|
|
178
|
+
export declare const insertOutbox: (s: Session, entry: StatewireClient.OutboxInsert) => string;
|
|
135
179
|
export declare const documentSource: (s: Session) => StatewireDocuments.Source;
|
|
136
180
|
export declare const invokeProtocol: (s: Session, protocol: string, method: string, params: readonly unknown[], options?: StatewireClient.InvokeOptions) => Promise<unknown>;
|
|
137
181
|
export declare const setContext: (s: Session, protocol: string, value: Statewire.Context) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,2BAAwB;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/client/session.ts"],"names":[],"mappings":"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"}
|