statewire 0.24.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/session.d.ts
CHANGED
|
@@ -130,6 +130,13 @@ type Session = {
|
|
|
130
130
|
lanesOnAttach: boolean;
|
|
131
131
|
attachEntries: ReadonlySet<Pending>;
|
|
132
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
|
+
};
|
|
133
140
|
pending: Pending[];
|
|
134
141
|
canonical: unknown;
|
|
135
142
|
documentListeners: Set<() => 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":"AAAA,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAShD,OAAO,KAAK,EAAE,iBAAiB,EAAE,4BAAyB;AAO1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,6BAA0B;AAG5D,OAAO,KAAK,EAAE,aAAa,EAAE,uBAAoB;AAMjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAqB;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAiB;AAC1C,OAAO,KAAK,EAAE,eAAe,EAAE,wBAAqB;AAUpD,OAAO,KAAK,EACV,UAAU,EAEV,oBAAoB,EACrB,6BAA0B;AAE3B,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,WAAW,CAAC,eAAe,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,CAAC,UAAU,CAAC,IAAI,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,CAAC,CAAC;CACjE,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,6EAA6E;IAC7E,IAAI,EAAE,OAAO,CAAC;IACd,2FAA2F;IAC3F,KAAK,EAAE,OAAO,CAAC;IACf,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,CAAC;AAcF,KAAK,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,OAAO,GAAG;IAChE,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,YAAY,CAAC,EAAE,eAAe,CAAC,cAAc,GAAG,SAAS,CAAC;IAC1D,aAAa,CAAC,EAAE,eAAe,CAAC,aAAa,GAAG,SAAS,CAAC;IAC1D,gBAAgB,CAAC,EAAE,eAAe,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAChE,SAAS,CAAC,EAAE,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,EAAE,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;IAC9C,WAAW,CAAC,EACR,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC,GACrD,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,eAAe,CAAC,cAAc,CAAA;KAAE,EAAE,CAAC;IACxE,2FAA2F;IAC3F,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,yDAAyD;IACzD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oDAAoD;IACpD,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;IACjC,iDAAiD;IACjD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;CAC7B,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,GAAG,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACtB,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CAClC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,OAAO,EAAE,uBAAuB,CAAC;IACjC,iBAAiB,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACtD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IACxD,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IAC9D,SAAS,EAAE,iBAAiB,CAAC,SAAS,GAAG,SAAS,CAAC;IACnD,MAAM,EAAE,eAAe,CAAC,aAAa,CAAC;IACtC,GAAG,EAAE,oBAAoB,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,eAAe,CAAC,aAAa,GAAG,IAAI,CAAC;IACtD,KAAK,EAAE,eAAe,CAAC,cAAc,CAAC;IACtC,aAAa,EAAE,kBAAkB,CAAC,OAAO,GAAG,SAAS,CAAC;IACtD,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,yEAAyE;IACzE,SAAS,EAAE,OAAO,CAAC;IACnB,6EAA6E;IAC7E,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,eAAe,CAAC,aAAa,GAAG,SAAS,CAAC;IACzD,gBAAgB,EAAE,eAAe,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAC/D,SAAS,EAAE,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,eAAe,CAAC,OAAO,GAAG,SAAS,CAAC;IAC7C,MAAM,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACjC,6CAA6C;IAC7C,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACpD,gEAAgE;IAChE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,SAAS,eAAe,CAAC,WAAW,EAAE,CAAC;IACnD,WAAW,EAAE,SAAS,OAAO,EAAE,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,mGAAmG;IACnG,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,SAAS,CAAC;IACnD,8FAA8F;IAC9F,QAAQ,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,OAAO,EAAE,OAAO,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACnC,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC;IAC9B,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IACxB,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CACtE,CAAC;AA2BF,KAAK,OAAO,GAAG,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAskBzC,eAAO,MAAM,SAAS,MAAM,CAAC;AAE7B,KAAK,OAAO,GACR;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,eAAe,CAAC,WAAW,CAAA;CAAE,CAAC;AAqFxD,KAAK,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAggCnD,QAAA,MAAM,YAAY,GAAI,GAAG,OAAO,EAAE,WAAW,UAAU,SAItD,CAAC;AAqVF,eAAO,MAAM,aAAa,GACxB,GAAG,OAAO,KACT,SAAS,eAAe,CAAC,WAAW,EAiCtC,CAAC;AAqGF,eAAO,MAAM,UAAU,GAAI,GAAG,OAAO,EAAE,IAAI,MAAM,SAC8B,CAAC;AAEhF,eAAO,MAAM,aAAa,GAAI,GAAG,OAAO,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,OAAO,CAYrE,CAAC;AAQF,eAAO,MAAM,YAAY,GAAI,GAAG,OAAO,EAAE,IAAI,MAAM,SACF,CAAC;AAElD,eAAO,MAAM,YAAY,GACvB,GAAG,OAAO,EACV,IAAI,MAAM,EACV,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,WAAW,KAAK,eAAe,CAAC,WAAW,SAItE,CAAC;AAyBJ,eAAO,MAAM,YAAY,GACvB,GAAG,OAAO,EACV,OAAO,eAAe,CAAC,YAAY,KAClC,MAoFF,CAAC;AAsKF,eAAO,MAAM,cAAc,GAAI,GAAG,OAAO,KAAG,kBAAkB,CAAC,MA6B7D,CAAC;AAEH,eAAO,MAAM,cAAc,GACzB,GAAG,OAAO,EACV,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,QAAQ,SAAS,OAAO,EAAE,EAC1B,UAAU,eAAe,CAAC,aAAa,qBACa,CAAC;AAkFvD,eAAO,MAAM,UAAU,GACrB,GAAG,OAAO,EACV,UAAU,MAAM,EAChB,OAAO,SAAS,CAAC,OAAO,KACvB,IAWF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,uBAAuB,KAC/B,OAwLF,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
package/dist/client/session.js
CHANGED
|
@@ -926,7 +926,7 @@ const sessionLostInner = (s, protocol, seqWm) => {
|
|
|
926
926
|
publish(s);
|
|
927
927
|
wake(s);
|
|
928
928
|
};
|
|
929
|
-
const demote = (s, protocol, watermark, demoted) => {
|
|
929
|
+
const demote = (s, protocol, watermark, demoted, waiting) => {
|
|
930
930
|
const lane = laneOf(s.record, protocol);
|
|
931
931
|
const local = laneEntries(s, protocol).filter((p) => p.seq > watermark);
|
|
932
932
|
const above = new Map(lane.commands.filter((c) => c.seq > watermark).map((c) => [c.id, c]));
|
|
@@ -937,6 +937,12 @@ const demote = (s, protocol, watermark, demoted) => {
|
|
|
937
937
|
sessionLostInner(s, protocol, watermark);
|
|
938
938
|
return;
|
|
939
939
|
}
|
|
940
|
+
const me = s.store.owner?.id;
|
|
941
|
+
const foreign = moved.find((c) => c.owner !== void 0 && c.owner !== me && !local.some((p) => p.id === c.id));
|
|
942
|
+
if (foreign !== void 0) {
|
|
943
|
+
for (const p of local) if (p.seq > foreign.seq) waiting.add(p);
|
|
944
|
+
return;
|
|
945
|
+
}
|
|
940
946
|
setRecord(s, withLane(s.record, protocol, {
|
|
941
947
|
...withOutbox(lane, [...moved.map(({ seq: _seq, owner: _owner, ...command }) => command), ...outboxOf(lane)]),
|
|
942
948
|
nextSeq: watermark + 1,
|
|
@@ -947,6 +953,19 @@ const demote = (s, protocol, watermark, demoted) => {
|
|
|
947
953
|
else unstamp(s, p);
|
|
948
954
|
sortPending(s);
|
|
949
955
|
};
|
|
956
|
+
const recheckLater = (s, watermarks) => {
|
|
957
|
+
if (s.rechecks.watermarks !== watermarks) s.rechecks = {
|
|
958
|
+
watermarks,
|
|
959
|
+
count: 0
|
|
960
|
+
};
|
|
961
|
+
s.rechecks.count += 1;
|
|
962
|
+
if (s.recheck !== void 0) return;
|
|
963
|
+
s.recheck = setTimeout(() => {
|
|
964
|
+
s.recheck = void 0;
|
|
965
|
+
if (s.running && s.attach === "attached") s.transport?.connection.reconnect();
|
|
966
|
+
}, backoff(s.rechecks.count + 1));
|
|
967
|
+
};
|
|
968
|
+
const gapFill = (s) => s.selection !== void 0 && s.selection.version >= "2026-11-01";
|
|
950
969
|
const selectionOf = (syn) => {
|
|
951
970
|
if (syn.version === void 0 || syn.protocols === void 0) return void 0;
|
|
952
971
|
return {
|
|
@@ -986,18 +1005,24 @@ const handleHello = (s, { ops, syn }) => {
|
|
|
986
1005
|
s.attachEntries = /* @__PURE__ */ new Set();
|
|
987
1006
|
const reconcile = () => {
|
|
988
1007
|
const demoted = /* @__PURE__ */ new Set();
|
|
1008
|
+
const waiting = /* @__PURE__ */ new Set();
|
|
989
1009
|
for (const lane of lanes) {
|
|
990
1010
|
if (lane.record === "ephemeral") {
|
|
991
1011
|
s.ephemeralSeqs[lane.name] = Math.max(Object.hasOwn(s.ephemeralSeqs, lane.name) ? s.ephemeralSeqs[lane.name] : 0, ...laneEntries(s, lane.name).map((p) => p.seq));
|
|
992
1012
|
continue;
|
|
993
1013
|
}
|
|
994
|
-
demote(s, lane.name, lane.seq ?? 0, demoted);
|
|
1014
|
+
demote(s, lane.name, lane.seq ?? 0, demoted, waiting);
|
|
995
1015
|
s.durableSeq[lane.name] = lane.seq ?? 0;
|
|
996
1016
|
}
|
|
997
1017
|
for (const entry of s.pending) {
|
|
998
|
-
entry.posted = attached.has(entry) || isStamped(entry) && entry.seq <= durableSeqOf(s, entry.command.protocol) && !isEphemeral(s, entry.command.protocol);
|
|
1018
|
+
entry.posted = attached.has(entry) || waiting.has(entry) || isStamped(entry) && entry.seq <= durableSeqOf(s, entry.command.protocol) && !isEphemeral(s, entry.command.protocol);
|
|
999
1019
|
entry.stale = false;
|
|
1000
1020
|
}
|
|
1021
|
+
if (waiting.size > 0) recheckLater(s, JSON.stringify(lanes.map((lane) => [lane.name, lane.seq])));
|
|
1022
|
+
else s.rechecks = {
|
|
1023
|
+
watermarks: "",
|
|
1024
|
+
count: 0
|
|
1025
|
+
};
|
|
1001
1026
|
syncBacklogInner(s);
|
|
1002
1027
|
s.sessionKnown = true;
|
|
1003
1028
|
flushInner(s, demoted);
|
|
@@ -1157,12 +1182,13 @@ const pump = async (s) => {
|
|
|
1157
1182
|
if (!s.hydrated) await s.ready;
|
|
1158
1183
|
const transport = s.transport;
|
|
1159
1184
|
const flushable = flushCandidates(s).length > 0;
|
|
1160
|
-
const queued = s.pending.some((p) => isOutboxed(p) && !p.inv.held);
|
|
1185
|
+
const queued = s.pending.some((p) => isOutboxed(p) && !p.inv.held) || queuedInRecord(s);
|
|
1161
1186
|
if (buildLanes(s) === null && !flushable && (!queued || s.attach === "attached")) return;
|
|
1162
|
-
|
|
1187
|
+
const waiting = s.pending.length > 0 || queued;
|
|
1188
|
+
if (transport?.parked && !waiting) return;
|
|
1163
1189
|
if (s.attach !== "attached" || !transport) {
|
|
1164
|
-
if (
|
|
1165
|
-
if (transport?.connection.status === "standby" && transport.connection.reason === "idle" || transport?.parked
|
|
1190
|
+
if (!waiting) return;
|
|
1191
|
+
if (transport?.connection.status === "standby" && transport.connection.reason === "idle" || transport?.parked) transport.connection.reconnect();
|
|
1166
1192
|
await waitForWake(s);
|
|
1167
1193
|
continue;
|
|
1168
1194
|
}
|
|
@@ -1200,6 +1226,14 @@ const pump = async (s) => {
|
|
|
1200
1226
|
}) : send(lanes));
|
|
1201
1227
|
} catch {
|
|
1202
1228
|
if (!s.running || isFinished(s)) return;
|
|
1229
|
+
if (lanes !== null && lanes.entries.length > 0 && gapFill(s)) {
|
|
1230
|
+
if (epoch !== s.attachEpoch) continue;
|
|
1231
|
+
for (const entry of lanes.entries) if (s.pending.includes(entry)) entry.posted = true;
|
|
1232
|
+
s.frameFailures += 1;
|
|
1233
|
+
await sleepUntilWake(s, backoff(s.frameFailures));
|
|
1234
|
+
if (s.running && epoch === s.attachEpoch && s.attach === "attached") transport.connection.reconnect();
|
|
1235
|
+
continue;
|
|
1236
|
+
}
|
|
1203
1237
|
if (lanes?.frame.ctx?.length) {
|
|
1204
1238
|
s.lanesOnAttach = true;
|
|
1205
1239
|
transport.connection.reconnect();
|
|
@@ -1284,6 +1318,8 @@ const start = (s) => {
|
|
|
1284
1318
|
};
|
|
1285
1319
|
const stop = (s) => {
|
|
1286
1320
|
s.running = false;
|
|
1321
|
+
clearTimeout(s.recheck);
|
|
1322
|
+
s.recheck = void 0;
|
|
1287
1323
|
if (s.shared) {
|
|
1288
1324
|
s.shared.unsubscribe?.();
|
|
1289
1325
|
s.shared.unsubscribe = null;
|
|
@@ -1408,6 +1444,7 @@ const flushCandidates = (s) => flushLanes(s).flatMap((protocol) => {
|
|
|
1408
1444
|
stored
|
|
1409
1445
|
}));
|
|
1410
1446
|
});
|
|
1447
|
+
const queuedInRecord = (s) => Object.keys(s.record.lanes).some((protocol) => (s.selection ? negotiated(s, protocol) : offered(s, protocol)) && bubble(s, protocol, laneQueue(s, protocol)).free > 0);
|
|
1411
1448
|
const reasonOf = (s, stored, demoted) => stored.released ? "release" : demoted.has(stored.id) ? "reconnect" : s.mountIds.has(stored.id) ? "reload" : "enqueue";
|
|
1412
1449
|
const NO_IDS = /* @__PURE__ */ new Set();
|
|
1413
1450
|
const patched = (stored, patch) => {
|
|
@@ -1991,6 +2028,11 @@ const useStatewireSession = (options) => {
|
|
|
1991
2028
|
lanesOnAttach: false,
|
|
1992
2029
|
attachEntries: /* @__PURE__ */ new Set(),
|
|
1993
2030
|
frameFailures: 0,
|
|
2031
|
+
recheck: void 0,
|
|
2032
|
+
rechecks: {
|
|
2033
|
+
watermarks: "",
|
|
2034
|
+
count: 0
|
|
2035
|
+
},
|
|
1994
2036
|
pending: [],
|
|
1995
2037
|
canonical: void 0,
|
|
1996
2038
|
documentListeners: /* @__PURE__ */ new Set(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":["encodeContext","wrapStorageError","DEFAULT_PROTOCOL","WIRE_VERSION","protocolOffers","inRange","StatewireProtocol","applyDocumentOps","mainDocument","findDocument","resolveDocumentKey","StatewireDocuments","useContext","useEffect","useState","StatewirePath","MAX_COMMANDS_PER_FRAME","TERMINAL","StatewireCmd","StatewireSyn","encodeParams","reviveResponse","reviveValue","bindCommandsHost","CommandsInvocation","CommandsListener","Statewire","StatewireClient","DocumentStorageContext","SessionStorageContext","createMemorySessionStore","backoff","retryHint","createMethodProxy","randomId","newClientId","StatewireSendError","RemoteLink","StatewireFrame","StatewireRemoteProps","WireCommand","protocol","produced","NonNullable","SessionCommand","method","params","meta","Invocation","K","Pending","id","seq","command","inv","adopted","by","away","stale","attempted","posted","applied","resolve","payload","reject","error","protocolError","message","Error","rejectedSend","failure","SendFailure","Promise","result","catch","AttachState","StatewireSessionOptions","Options","context","Readonly","Record","Context","sessionStore","SessionStorage","onSessionLost","OnSessionLost","onDeprecatedPath","OnDeprecatedPath","onSettled","OnSettled","onFlush","OnFlush","canOvertake","CanOvertake","onDone","Shared","txq","syncQueued","parked","verdict","SessionVerdict","settled","Set","notices","Notice","inTx","unsubscribe","watched","abort","AbortController","Patch","held","localMeta","value","Flushing","ids","ReadonlySet","patches","Map","removed","Waiter","Session","options","configuredContext","contexts","ReturnType","dirtyContexts","attachContexts","selection","Selection","record","SessionRecord","ctx","recordPersisted","hydrated","ready","storageError","persistedRecord","store","documentStore","Storage","shared","ephemeral","deactivated","sessionKnown","durableSeq","ephemeralSeqs","resumeAt","idle","releases","delivering","skipped","views","WeakMap","OutboxEntry","mountIds","flushing","outboxList","outboxParts","lanesOnAttach","attachEntries","frameFailures","pending","canonical","documentListeners","documents","State","lastPublished","changed","source","StateSource","attach","attachEpoch","running","pumping","transport","waiters","lifecycle","notify","commands","EMPTY_LANE","SessionLane","nextSeq","laneOf","Object","hasOwn","lanes","withLane","lane","isEphemeral","s","protocols","some","p","name","durableSeqOf","Stamped","isStamped","undefined","isOutboxed","laneEntries","filter","sortPending","sort","a","b","Infinity","RemovalMark","marks","added","c","owner","map","next","length","withOutbox","outbox","OutboxCommand","_outbox","rest","outboxOf","onChange","stamp","unstamp","follow","stored","dirty","paramsOf","structuredClone","dropPending","q","onCovered","publish","wake","waiter","waitForWake","r","push","sleepUntilWake","delayMs","clearTimeout","timer","setTimeout","w","storageFailed","cause","entry","setRecord","save","isQuota","toOutbox","_protocol","ts","const","toStored","backlog","mergeBacklog","own","foreign","durableLanes","keys","MAX_PARKED_VERDICTS","syncBacklogInner","noticeInner","splice","clear","parkedHere","v","flatMap","find","has","parkedSeqs","kept","verdicts","slice","unchanged","every","i","syncBacklog","transact","fn","run","then","lock","readStored","refresh","watchOwners","persistence","flush","read","load","clientId","adoptReset","boundInbox","reconcileLocal","followReleases","me","queued","stamped","mark","m","settleEntry","ok","fate","_removed","left","locate","entries","settleReleases","outcome","get","delete","values","notice","inbox","n","signal","offered","add","whenGone","transactBackground","adoptOwner","pump","gone","orphans","_owner","mine","adoptedPending","connection","reconnect","onStart","done","setIdle","level","cover","onApplied","MAX_INBOX","Outcome","updateOf","StoredSettled","CommandUpdate","status","dropped","sorted","x","y","cut","onEvict","reason","toNotice","Omit","lostNotice","LOST","withNotices","known","deliver","SettleMode","mode","durable","onSettle","type","settleAll","detach","batch","detachFailure","predecessorLost","settleLost","settleRemoved","requeue","survivors","old","enqueueInner","hold","rebaseRecord","adopt","includes","previous","current","resetRecord","ephemeralDetach","detachEphemeralLanes","rejectedFailure","cmd","code","outcomeOf","String","settleVerdict","TERMINAL_CMD_TYPES","parkVerdict","handleCmd","dur","watermark","Math","max","consumeVerdicts","consumed","forwarded","_id","size","handleCmds","cmds","ingestOps","ops","applicationProtocols","fromEntries","d","key","JSON","stringify","changedPaths","cacheDocuments","document","keyPrefixes","version","namespace","publishIngested","listener","sessionLostInner","seqWm","kind","count","console","warn","stamps","demote","demoted","local","above","set","moved","_seq","selectionOf","syn","handleHello","attached","reconcile","flushInner","handleOps","handleRefusal","retry","Date","now","gaps","first","handleDetach","handleFinish","isFinished","Lanes","frame","buildLanes","cmdGate","last","stopped","gated","_produced","resultsCursor","cursors","min","takeAttachLanes","wanted","res","persistBeforeSend","flushable","flushCandidates","resumeDelay","epoch","send","built","onPosted","start","subscribe","stop","setTransport","EnqueueOptions","QUOTA","reorder","negotiated","Candidate","viewOf","state","cached","view","laneQueue","bubble","queue","order","free","may","blocked","at","findIndex","o","flushLanes","reasonOf","FlushReason","released","NO_IDS","patched","patch","_held","_released","_meta","_old","plain","candidates","groups","stampedIds","outboxEntries","parts","same","part","OutboxOp","entryOf","applyOutboxOp","op","toPatch","OutboxPatch","k","Array","isArray","outboxOp","background","promise","holdOutbox","releaseOutbox","settleWaiters","removeOutbox","updateOutbox","producedOf","wire","wireVersion","placed","after","before","anchor","index","insertOutbox","OutboxInsert","from","base","l","withoutNotice","nextNotice","found","_inbox","ack","handler","locked","notifyLock","enqueue","offers","offer","sendCommand","InvokeOptions","encoded","documentSource","Source","prefix","mounted","absolute","list","invokeProtocol","storedCommandCompatible","validateLanes","loadSessionRecord","compatible","migrate","storedIds","setContext","useStatewireSession","defaultStore","session","beforeAttach","onHello","args","onOps","onCmds","onRefusal","onIdle","onDetach","onFinish","snapshot","takeChanged","setOnChange","setListener","reviveValue","newClientId"],"sources":["../../src/client/session.ts"],"sourcesContent":["import { encodeContext } from \"../wire/context\";\nimport { wrapStorageError } from \"./storageError\";\nimport {\n DEFAULT_PROTOCOL,\n WIRE_VERSION,\n protocolOffers,\n inRange,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport {\n applyDocumentOps,\n mainDocument,\n findDocument,\n resolveDocumentKey,\n} from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useContext, useEffect, useState } from \"react\";\n\nimport type { StatewirePath } from \"../wire/ops\";\nimport { MAX_COMMANDS_PER_FRAME } from \"../wire/limits\";\nimport { TERMINAL } from \"./connection\";\nimport type { StatewireCmd, StatewireSyn } from \"./connection\";\nimport { encodeParams, reviveResponse, reviveValue } from \"../wire/meta\";\nimport { bindCommandsHost } from \"../host/host\";\nimport type { CommandsInvocation, CommandsListener } from \"../host/host\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport {\n DocumentStorageContext,\n SessionStorageContext,\n createMemorySessionStore,\n} from \"./sessionStore\";\nimport { backoff, retryHint } from \"./timing\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport { randomId as newClientId } from \"../util/randomId\";\nimport { StatewireSendError } from \"../types\";\nimport type {\n RemoteLink,\n StatewireFrame,\n StatewireRemoteProps,\n} from \"../transports/sse\";\n\ntype WireCommand = {\n protocol: string;\n produced?: NonNullable<StatewireClient.SessionCommand[\"produced\"]>;\n method: string;\n params: unknown[];\n meta?: unknown;\n};\n\ntype Invocation = {\n -readonly [K in keyof CommandsInvocation]: CommandsInvocation[K];\n};\n\ntype Pending = {\n readonly id: string;\n /** Unset while in the outbox, or while another sharer owns its stamp. */\n seq: number | undefined;\n command: WireCommand;\n readonly inv: Invocation;\n /** Enqueued by another sharer: this client holds no promise for it. */\n readonly adopted: boolean;\n /** The enqueuing sharer's owner id (shared storage only). */\n readonly by: string | undefined;\n /** Stamped by another sharer; settles from a verdict parked under its id. */\n away: boolean;\n /** Stamped against a watermark this attach has not confirmed: waits for the next hello. */\n stale: boolean;\n /** A send carrying this statement may have reached the server. */\n attempted: boolean;\n /** In the resend queue when false. */\n posted: boolean;\n /** The server acknowledged admission; the terminal verdict is still due. */\n applied: boolean;\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\nconst protocolError = (message: string): never => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nconst rejectedSend = (\n failure: StatewireClient.SendFailure,\n): Promise<unknown> => {\n const result = Promise.reject<unknown>(new StatewireSendError(failure));\n result.catch(() => {});\n return result;\n};\n\ntype AttachState = \"detached\" | \"attached\" | \"finished\";\n\nexport type StatewireSessionOptions = StatewireProtocol.Options & {\n context?: Readonly<Record<string, Statewire.Context>>;\n sessionStore?: StatewireClient.SessionStorage | undefined;\n onSessionLost?: StatewireClient.OnSessionLost | undefined;\n onDeprecatedPath?: StatewireClient.OnDeprecatedPath | undefined;\n onSettled?: StatewireClient.OnSettled | undefined;\n onFlush?: StatewireClient.OnFlush | undefined;\n canOvertake?:\n | Readonly<Record<string, StatewireClient.CanOvertake>>\n | undefined;\n onDone?: (() => void) | undefined;\n};\n\ntype Shared = {\n txq: Promise<void>;\n syncQueued: boolean;\n parked: { protocol: string; verdict: StatewireClient.SessionVerdict }[];\n /** Own commands settled since the last backlog sync: verdicts parked for them are moot. */\n settled: Set<string>;\n /** Settled updates waiting for the next backlog sync. */\n notices: Notice[];\n /** A locked transaction is running its mutation. */\n inTx: boolean;\n unsubscribe: (() => void) | null;\n /** Owners whose departure this sharer awaits. */\n watched: Set<string>;\n abort: AbortController | null;\n};\n\ntype Patch = {\n held?: boolean;\n localMeta?: { value: unknown };\n params?: readonly unknown[];\n};\n\ntype Flushing = {\n ids: ReadonlySet<string>;\n patches: Map<string, Patch>;\n removed: Set<string>;\n};\n\ntype Waiter = {\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\ntype Session = {\n options: StatewireSessionOptions;\n configuredContext: StatewireSessionOptions[\"context\"];\n contexts: Map<string, ReturnType<typeof encodeContext>>;\n dirtyContexts: Set<string>;\n attachContexts: Map<string, ReturnType<typeof encodeContext>>;\n selection: StatewireProtocol.Selection | undefined;\n record: StatewireClient.SessionRecord;\n ctx: StatewireRemoteProps;\n recordPersisted: boolean;\n hydrated: boolean;\n ready: Promise<void> | undefined;\n storageError: unknown;\n persistedRecord: StatewireClient.SessionRecord | null;\n store: StatewireClient.SessionStorage;\n documentStore: StatewireDocuments.Storage | undefined;\n shared: Shared | false;\n /** Every selected lane is ephemeral: the record dies with the attach. */\n ephemeral: boolean;\n /** An ephemeral record died with its attach: the storage is off for good. */\n deactivated: boolean;\n sessionKnown: boolean;\n durableSeq: Record<string, number>;\n /** Ephemeral lane clocks: restart at 1 on every attach. */\n ephemeralSeqs: Record<string, number>;\n resumeAt: number;\n idle: boolean;\n onSessionLost: StatewireClient.OnSessionLost | undefined;\n onDeprecatedPath: StatewireClient.OnDeprecatedPath | undefined;\n onSettled: StatewireClient.OnSettled | undefined;\n onFlush: StatewireClient.OnFlush | undefined;\n onDone: (() => void) | undefined;\n /** `outbox.release` promises by entry id. */\n releases: Map<string, Waiter[]>;\n delivering: boolean;\n /** Notices whose handler threw on this mount. */\n skipped: Set<string>;\n views: WeakMap<object, StatewireClient.OutboxEntry>;\n /** Outbox and stamped ids stored before this client mounted. */\n mountIds: Set<string>;\n flushing: Flushing | null;\n outboxList: readonly StatewireClient.OutboxEntry[];\n outboxParts: readonly unknown[];\n lanesOnAttach: boolean;\n attachEntries: ReadonlySet<Pending>;\n frameFailures: number;\n pending: Pending[];\n canonical: unknown;\n documentListeners: Set<() => void>;\n documents: StatewireDocuments.State;\n lastPublished: unknown;\n changed: StatewirePath[];\n source: Statewire.StateSource;\n attach: AttachState;\n attachEpoch: number;\n running: boolean;\n pumping: boolean;\n transport: RemoteLink | null;\n waiters: (() => void)[];\n lifecycle: CommandsListener | null;\n notify: () => void;\n commands: Record<string, (...params: unknown[]) => Promise<unknown>>;\n};\n\nconst EMPTY_LANE: StatewireClient.SessionLane = { nextSeq: 1, commands: [] };\n\nconst laneOf = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n): StatewireClient.SessionLane =>\n Object.hasOwn(record.lanes, protocol) ? record.lanes[protocol]! : EMPTY_LANE;\n\nconst withLane = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n lane: StatewireClient.SessionLane,\n): StatewireClient.SessionRecord => ({\n ...record,\n lanes: { ...record.lanes, [protocol]: lane },\n});\n\nconst isEphemeral = (s: Session, protocol: string) =>\n s.selection?.protocols.some(\n (p) => p.name === protocol && p.record === \"ephemeral\",\n ) ?? false;\n\nconst durableSeqOf = (s: Session, protocol: string) =>\n Object.hasOwn(s.durableSeq, protocol) ? s.durableSeq[protocol]! : 0;\n\ntype Stamped = Pending & { seq: number };\n\nconst isStamped = (p: Pending): p is Stamped => p.seq !== undefined;\n\nconst isOutboxed = (p: Pending) => p.seq === undefined && !p.away;\n\n/** This client's stamped entries on the lane. */\nconst laneEntries = (s: Session, protocol: string): Stamped[] =>\n s.pending.filter(\n (p): p is Stamped => isStamped(p) && p.command.protocol === protocol,\n );\n\nconst sortPending = (s: Session) => {\n s.pending.sort((a, b) => (a.seq ?? Infinity) - (b.seq ?? Infinity) || 0);\n};\n\ntype RemovalMark = NonNullable<StatewireClient.SessionLane[\"removed\"]>[number];\n\n// A removal another sharer must hear about: the marker lives until its\n// enqueuer consumes it or is gone.\nconst marks = (\n s: Session,\n lane: StatewireClient.SessionLane,\n removed: readonly { id: string; by?: string | undefined }[],\n failure?: StatewireClient.SendFailure,\n): { removed?: readonly RemovalMark[] } => {\n const added = removed\n .filter((c) => c.by !== undefined && c.by !== s.store.owner?.id)\n .map((c) => ({ id: c.id, by: c.by!, ...(failure && { failure }) }));\n const next = [...(lane.removed ?? []), ...added];\n return next.length > 0 ? { removed: next } : {};\n};\n\nconst withOutbox = (\n lane: StatewireClient.SessionLane,\n outbox: readonly StatewireClient.OutboxCommand[],\n): StatewireClient.SessionLane => {\n const { outbox: _outbox, ...rest } = lane;\n return outbox.length > 0 ? { ...rest, outbox } : rest;\n};\n\nconst outboxOf = (lane: StatewireClient.SessionLane) => lane.outbox ?? [];\n\nconst changed = (s: Session, p: Pending) => s.lifecycle?.onChange?.(p.inv);\n\nconst stamp = (s: Session, p: Pending, seq: number) => {\n p.seq = seq;\n p.inv.seq = seq;\n delete p.inv.held;\n p.away = false;\n p.attempted = false;\n p.posted = false;\n changed(s, p);\n};\n\nconst unstamp = (s: Session, p: Pending) => {\n p.seq = undefined;\n delete p.inv.seq;\n p.away = false;\n p.attempted = false;\n p.posted = false;\n changed(s, p);\n};\n\n// The pending invocation follows its stored entry: hold, local meta, params.\nconst follow = (\n s: Session,\n p: Pending,\n stored: StatewireClient.OutboxCommand,\n) => {\n let dirty = false;\n if ((p.inv.held === true) !== (stored.held === true)) {\n if (stored.held) p.inv.held = true;\n else delete p.inv.held;\n dirty = true;\n }\n if (p.inv.localMeta !== stored.localMeta) {\n if (stored.localMeta === undefined) delete p.inv.localMeta;\n else p.inv.localMeta = stored.localMeta;\n dirty = true;\n }\n if (p.command.params !== stored.params) {\n p.command = {\n ...p.command,\n params: stored.params,\n ...(stored.meta === undefined ? {} : { meta: stored.meta }),\n };\n if (stored.meta === undefined) delete p.command.meta;\n p.inv.params = paramsOf(stored);\n dirty = true;\n }\n if (dirty) changed(s, p);\n};\n\nconst paramsOf = (stored: { params: unknown[]; meta?: unknown }) =>\n stored.meta === undefined\n ? stored.params\n : (reviveValue(structuredClone(stored.params), stored.meta) as unknown[]);\n\nconst dropPending = (s: Session, p: Pending) => {\n s.pending = s.pending.filter((q) => q !== p);\n s.lifecycle?.onCovered?.(p.inv);\n};\n\nconst publish = (s: Session) => {\n if (s.canonical === s.lastPublished) return;\n s.lastPublished = s.canonical;\n s.notify();\n};\n\nconst wake = (s: Session) => {\n const waiters = s.waiters;\n s.waiters = [];\n for (const waiter of waiters) waiter();\n};\n\nconst waitForWake = (s: Session) => new Promise<void>((r) => s.waiters.push(r));\n\nconst sleepUntilWake = (s: Session, delayMs: number) =>\n new Promise<void>((resolve) => {\n const waiter = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n s.waiters = s.waiters.filter((w) => w !== waiter);\n resolve();\n }, delayMs);\n s.waiters.push(waiter);\n });\n\nconst storageFailed = (s: Session, cause: unknown) => {\n const error = wrapStorageError(cause);\n s.storageError = error;\n for (const entry of s.pending) entry.reject(error);\n s.transport?.storageFailed(error);\n};\n\nconst setRecord = (s: Session, record: StatewireClient.SessionRecord) => {\n if (!s.deactivated) {\n try {\n s.store.save(record);\n } catch (cause) {\n if (isQuota(cause)) throw cause;\n storageFailed(s, cause);\n throw s.storageError;\n }\n }\n s.record = record;\n s.notify();\n};\n\nconst toOutbox = (p: Pending): StatewireClient.OutboxCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return {\n id: p.id,\n ...command,\n ts: p.inv.ts,\n ...(p.by !== undefined && { by: p.by }),\n ...(p.inv.held && { held: true as const }),\n ...(p.inv.localMeta !== undefined && { localMeta: p.inv.localMeta }),\n };\n};\n\nconst toStored = (s: Session, p: Stamped): StatewireClient.SessionCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return {\n id: p.id,\n seq: p.seq,\n ...(s.store.owner !== undefined && { owner: s.store.owner.id }),\n ...(p.by !== undefined && { by: p.by }),\n ...command,\n ts: p.inv.ts,\n ...(p.inv.localMeta !== undefined && { localMeta: p.inv.localMeta }),\n };\n};\n\nconst backlog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] =>\n laneEntries(s, protocol).map((p) => toStored(s, p));\n\nconst mergeBacklog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] => {\n const own = backlog(s, protocol);\n if (!s.shared) return own;\n // Another sharer's stamp stays until its owner settles it: the record is\n // where an enqueuer maps the seq back to its command.\n const foreign = laneOf(s.record, protocol).commands.filter(\n (c) => c.owner !== s.store.owner?.id,\n );\n return [...foreign, ...own].sort((a, b) => a.seq - b.seq);\n};\n\nconst durableLanes = (s: Session): string[] => [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending\n .map((p) => p.command.protocol)\n .filter((protocol) => !isEphemeral(s, protocol)),\n ]),\n];\n\nconst MAX_PARKED_VERDICTS = 64;\n\n// Storage holds what a reload must resend: a command leaves at its dur, at a\n// server verdict, or at a record reset — never at a local channel death.\nconst syncBacklogInner = (s: Session) => {\n if (s.shared && s.shared.notices.length > 0)\n noticeInner(s, s.shared.notices.splice(0));\n const parked = s.shared ? s.shared.parked.splice(0) : [];\n const settled = s.shared ? new Set(s.shared.settled) : new Set<string>();\n if (s.shared) s.shared.settled.clear();\n let lanes = s.record.lanes;\n for (const protocol of durableLanes(s)) {\n const lane = laneOf(s.record, protocol);\n // The record maps a parked seq to its command while it still holds the\n // stamp; the enqueuer finds the verdict by that id.\n const parkedHere = parked\n .filter((v) => v.protocol === protocol)\n .flatMap(({ verdict }) => {\n const id =\n verdict.id ?? lane.commands.find((c) => c.seq === verdict.seq)?.id;\n // No stamp left to map it: its owner already settled the command.\n if (id === undefined || settled.has(id)) return [];\n return [{ ...verdict, id }];\n });\n const parkedSeqs = new Set(parkedHere.map((v) => v.seq));\n const commands = mergeBacklog(s, protocol).filter(\n (c) => !parkedSeqs.has(c.seq),\n );\n const kept = (lane.verdicts ?? []).filter(\n (v) => v.id === undefined || !settled.has(v.id),\n );\n const verdicts =\n parkedHere.length > 0 || kept.length !== (lane.verdicts ?? []).length\n ? [...kept, ...parkedHere].slice(-MAX_PARKED_VERDICTS)\n : lane.verdicts;\n const unchanged =\n verdicts === lane.verdicts &&\n commands.length === lane.commands.length &&\n commands.every((c, i) => c.seq === lane.commands[i]!.seq);\n if (unchanged) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands,\n ...(verdicts !== undefined && { verdicts }),\n },\n };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n};\n\nconst syncBacklog = (s: Session) => {\n const shared = s.shared;\n if (!shared) return syncBacklogInner(s);\n if (shared.syncQueued) return;\n shared.syncQueued = true;\n void transact(s, () => {\n shared.syncQueued = false;\n syncBacklogInner(s);\n }).catch(() => {\n shared.syncQueued = false;\n });\n};\n\n// Every record mutation over shared storage is a locked read-modify-write.\nconst transact = (s: Session, fn: () => void): Promise<void> => {\n if (!s.shared || s.deactivated) {\n fn();\n return Promise.resolve();\n }\n const shared = s.shared;\n const run = shared.txq.then(() =>\n s.store.lock!(async () => {\n const stored = await readStored(s);\n shared.inTx = true;\n try {\n refresh(s, stored);\n fn();\n } finally {\n shared.inTx = false;\n }\n watchOwners(s);\n s.notify();\n const persistence = s.store.flush?.();\n if (persistence) await persistence;\n }),\n );\n const result = run.catch((cause: unknown) => {\n storageFailed(s, cause);\n throw s.storageError;\n });\n shared.txq = result.then(\n () => {},\n () => {},\n );\n return result;\n};\n\nconst readStored = async (s: Session) =>\n s.store.read ? await s.store.read() : s.store.load();\n\n// Under the lock: the stored record is the truth about which sharer stamped\n// what; this client's entries follow it by id.\nconst refresh = (s: Session, stored: StatewireClient.SessionRecord | null) => {\n if (stored !== null && stored.clientId !== s.record.clientId) {\n adoptReset(s, stored);\n return;\n }\n if (stored !== null) s.record = boundInbox(s.store, stored);\n reconcileLocal(s);\n followReleases(s);\n};\n\nconst reconcileLocal = (s: Session) => {\n const me = s.store.owner?.id;\n for (const p of [...s.pending]) {\n const protocol = p.command.protocol;\n if (isEphemeral(s, protocol)) continue;\n const lane = laneOf(s.record, protocol);\n const queued = outboxOf(lane).find((c) => c.id === p.id);\n const stamped = lane.commands.find((c) => c.id === p.id);\n if (queued) {\n if (p.seq !== undefined || p.away) {\n if (p.adopted) {\n dropPending(s, p);\n continue;\n }\n unstamp(s, p);\n }\n follow(s, p, queued);\n } else if (stamped && stamped.owner !== me) {\n if (p.adopted) dropPending(s, p);\n else if (!p.away) {\n unstamp(s, p);\n p.away = true;\n }\n } else if (stamped) {\n if (p.seq !== stamped.seq) stamp(s, p, stamped.seq);\n } else if (!p.adopted && (isOutboxed(p) || p.away)) {\n const mark = lane.removed?.find((m) => m.id === p.id);\n if (mark === undefined) {\n p.away = true;\n continue;\n }\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(\n s,\n p,\n {\n ok: false,\n failure: mark.failure ?? { fate: \"aborted\", cause: \"removed\" },\n },\n mark.failure ? \"noticed\" : \"memory\",\n );\n const { removed: _removed, ...rest } = lane;\n const left = lane.removed!.filter((m) => m.id !== p.id);\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...rest,\n ...(left.length > 0 && { removed: left }),\n }),\n );\n }\n }\n};\n\nconst locate = (\n s: Session,\n id: string,\n):\n | { protocol: string; stored: StatewireClient.OutboxCommand }\n | { protocol: string; stored?: undefined }\n | undefined => {\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const stored = outboxOf(lane).find((c) => c.id === id);\n if (stored) return { protocol, stored };\n if (lane.commands.some((c) => c.id === id)) return { protocol };\n }\n const p = s.pending.find((q) => q.id === id);\n if (p === undefined) return undefined;\n return isOutboxed(p) && isEphemeral(s, p.command.protocol)\n ? { protocol: p.command.protocol, stored: toOutbox(p) }\n : { protocol: p.command.protocol };\n};\n\nconst settleReleases = (\n s: Session,\n id: string,\n outcome:\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure },\n) => {\n const waiters = s.releases.get(id);\n if (waiters === undefined) return;\n s.releases.delete(id);\n for (const waiter of waiters) {\n if (outcome.ok) waiter.resolve(outcome.payload);\n else waiter.reject(new StatewireSendError(outcome.failure));\n }\n};\n\n// A release whose command another sharer settled: the record shows only that\n// it left, failed (a notice) or was taken unsent (a mark).\nconst followReleases = (s: Session) => {\n for (const id of [...s.releases.keys()]) {\n if (locate(s, id) !== undefined) continue;\n const lanes = Object.values(s.record.lanes);\n const notice = lanes\n .flatMap((lane) => lane.inbox ?? [])\n .find((n) => n.id === id);\n const mark = lanes\n .flatMap((lane) => lane.removed ?? [])\n .find((m) => m.id === id);\n const failure = notice?.failure ?? mark?.failure;\n settleReleases(\n s,\n id,\n failure\n ? { ok: false, failure }\n : {\n ok: true,\n payload:\n notice?.result === undefined\n ? undefined\n : paramsOf({\n params: notice.result.value,\n meta: notice.result.meta,\n })[0],\n },\n );\n }\n};\n\n// A sharer that stamped commands and left: once its owner lock frees,\n// another sharer takes its stamps over and reattaches, so the hello's\n// watermark settles them.\nconst watchOwners = (s: Session) => {\n const owner = s.store.owner;\n const shared = s.shared;\n if (!owner || !shared || !shared.abort || s.deactivated) return;\n const signal = shared.abort.signal;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (!offered(s, protocol)) continue;\n for (const { owner: id } of lane.commands) {\n if (id === undefined || id === owner.id || shared.watched.has(id))\n continue;\n shared.watched.add(id);\n owner.whenGone(id, signal).then(\n () => {\n if (!s.running) return;\n transactBackground(\n s,\n () => adoptOwner(s, id),\n () => {\n wake(s);\n void pump(s);\n },\n );\n },\n () => {},\n );\n }\n }\n};\n\nconst adoptOwner = (s: Session, gone: string | undefined) => {\n const me = s.store.owner?.id;\n let lanes = s.record.lanes;\n let adopted = false;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (gone !== undefined && lane.removed?.some((m) => m.by === gone)) {\n const { removed: _removed, ...rest } = laneOf(\n { ...s.record, lanes },\n protocol,\n );\n const left = lane.removed.filter((m) => m.by !== gone);\n lanes = {\n ...lanes,\n [protocol]: { ...rest, ...(left.length > 0 && { removed: left }) },\n };\n }\n if (!offered(s, protocol)) continue;\n const orphans = lane.commands.filter(\n (c) =>\n c.owner === gone &&\n (me === undefined || c.owner !== me) &&\n !s.pending.some((p) => p.id === c.id && p.seq === c.seq),\n );\n if (orphans.length === 0) continue;\n adopted = true;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.map((c) => {\n if (c.owner !== gone) return c;\n const { owner: _owner, ...rest } = c;\n return me === undefined ? rest : { ...rest, owner: me };\n }),\n },\n };\n for (const command of orphans) {\n const mine = s.pending.find((p) => p.id === command.id);\n if (mine) {\n stamp(s, mine, command.seq);\n mine.attempted = true;\n mine.stale = true;\n } else s.pending.push(adoptedPending(s, protocol, command));\n }\n }\n if (!adopted) return;\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n sortPending(s);\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\n};\n\nconst adoptedPending = (\n s: Session,\n protocol: string,\n stored: StatewireClient.SessionCommand,\n): Pending => {\n const { seq, id, ts, owner: _owner, by, ...command } = stored;\n const params =\n command.meta === undefined\n ? command.params\n : (reviveValue(\n structuredClone(command.params),\n command.meta,\n ) as unknown[]);\n const entry: Pending = {\n id,\n seq,\n command: { protocol, ...command },\n inv: {\n protocol,\n method: command.method,\n params,\n ts,\n seq,\n id,\n clientId: s.record.clientId,\n },\n adopted: true,\n by,\n away: false,\n stale: true,\n attempted: true,\n posted: false,\n applied: false,\n resolve: () => {},\n reject: () => {},\n };\n s.lifecycle?.onStart(entry.inv);\n return entry;\n};\n\nconst transactBackground = (s: Session, fn: () => void, done?: () => void) => {\n void transact(s, fn).then(done, () => {});\n};\n\nconst setIdle = (s: Session, level: boolean) => {\n if (level === s.idle) return;\n s.idle = level;\n s.notify();\n if (level) s.onDone?.();\n};\n\nconst cover = (s: Session, entry: Pending) => {\n if (entry.applied) return;\n entry.applied = true;\n s.lifecycle?.onApplied(entry.inv);\n s.lifecycle?.onCovered?.(entry.inv);\n};\n\nexport const MAX_INBOX = 256;\n\ntype Outcome =\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure };\n\nconst updateOf = (\n protocol: string,\n stored: StatewireClient.StoredSettled,\n): Statewire.CommandUpdate => ({\n protocol,\n id: stored.id,\n method: stored.method,\n params: paramsOf(stored) as never[],\n ...(stored.seq !== undefined && { seq: stored.seq }),\n status: \"settled\",\n ...(stored.result !== undefined && {\n result: paramsOf({\n params: stored.result.value,\n meta: stored.result.meta,\n })[0],\n }),\n ...(stored.failure !== undefined && { failure: stored.failure }),\n ...(stored.localMeta !== undefined && { localMeta: stored.localMeta }),\n});\n\n// The inbox keeps the newest notices; the rest are reported as evicted.\nconst boundInbox = (\n store: StatewireClient.SessionStorage,\n record: StatewireClient.SessionRecord,\n): StatewireClient.SessionRecord => {\n let lanes = record.lanes;\n const dropped: Statewire.CommandUpdate[] = [];\n for (const [protocol, lane] of Object.entries(lanes)) {\n const inbox = lane.inbox;\n if (inbox === undefined || inbox.length <= MAX_INBOX) continue;\n const sorted = [...inbox].sort((x, y) => x.ts - y.ts);\n const cut = sorted.length - MAX_INBOX;\n dropped.push(...sorted.slice(0, cut).map((n) => updateOf(protocol, n)));\n lanes = { ...lanes, [protocol]: { ...lane, inbox: sorted.slice(cut) } };\n }\n if (dropped.length > 0) store.onEvict?.({ reason: \"inbox\", dropped });\n return lanes === record.lanes ? record : { ...record, lanes };\n};\n\nconst toNotice = (\n stored: Omit<StatewireClient.SessionCommand, \"seq\"> & { seq?: number },\n outcome: Outcome,\n): StatewireClient.StoredSettled => {\n const result = outcome.ok\n ? encodeParams(outcome.payload === undefined ? [] : [outcome.payload])\n : undefined;\n return {\n id: stored.id,\n method: stored.method,\n params: stored.params,\n ...(stored.meta !== undefined && { meta: stored.meta }),\n ts: stored.ts,\n ...(stored.seq !== undefined && { seq: stored.seq }),\n ...(stored.localMeta !== undefined && { localMeta: stored.localMeta }),\n ...(result !== undefined && {\n result: {\n value: result.params,\n ...(result.meta !== undefined && { meta: result.meta }),\n },\n }),\n ...(!outcome.ok && { failure: outcome.failure }),\n };\n};\n\nconst lostNotice = (\n stored: Omit<StatewireClient.SessionCommand, \"seq\"> & { seq?: number },\n) => toNotice(stored, { ok: false, failure: LOST });\n\nconst LOST = { fate: \"lost\", cause: \"session-lost\" } as const;\n\nconst withNotices = (\n lane: StatewireClient.SessionLane,\n notices: readonly StatewireClient.StoredSettled[],\n): StatewireClient.SessionLane => {\n const known = new Set((lane.inbox ?? []).map((n) => n.id));\n const added = notices.filter((n) => !known.has(n.id));\n return added.length === 0\n ? lane\n : { ...lane, inbox: [...(lane.inbox ?? []), ...added] };\n};\n\n// The settled update lands in the same write that drops the stamp: a reload\n// either resends the command or delivers the update.\ntype Notice = { entry: Stamped; outcome: Outcome };\n\nconst noticeInner = (s: Session, notices: readonly Notice[]) => {\n let record = s.record;\n for (const { entry, outcome } of notices) {\n const protocol = entry.command.protocol;\n const lane = laneOf(record, protocol);\n record = withLane(record, protocol, {\n ...withNotices(lane, [toNotice(toStored(s, entry), outcome)]),\n commands: lane.commands.filter((c) => c.id !== entry.id),\n });\n }\n setRecord(s, boundInbox(s.store, record));\n deliver(s);\n};\n\n// Shared storage: the update rides the next backlog sync's locked write.\nconst notice = (s: Session, entry: Stamped, outcome: Outcome) => {\n if (!s.shared || s.shared.inTx) {\n noticeInner(s, [{ entry, outcome }]);\n return;\n }\n s.shared.notices.push({ entry, outcome });\n syncBacklog(s);\n};\n\n/**\n * \"notice\": a stamped durable command persists its settled update; \"noticed\":\n * the caller already did; \"memory\": the update is best-effort only.\n */\ntype SettleMode = \"notice\" | \"noticed\" | \"memory\";\n\nconst settleEntry = (\n s: Session,\n entry: Pending,\n outcome: Outcome,\n mode: SettleMode = \"notice\",\n) => {\n s.pending = s.pending.filter((p) => p !== entry);\n if (s.shared && !entry.adopted) s.shared.settled.add(entry.id);\n settleReleases(s, entry.id, outcome);\n // The record keeps every unsettled command for the next attach; only a\n // command it no longer owns becomes a durable settled update.\n const durable =\n mode === \"noticed\" ||\n (mode === \"notice\" &&\n (outcome.ok || outcome.failure.cause !== \"unmount\") &&\n isStamped(entry) &&\n !isEphemeral(s, entry.command.protocol));\n if (durable && mode === \"notice\") notice(s, entry as Stamped, outcome);\n if (outcome.ok) {\n entry.resolve(outcome.payload);\n s.lifecycle?.onSettle(\n entry.inv,\n { type: \"accepted\", payload: outcome.payload },\n durable,\n );\n } else {\n entry.reject(new StatewireSendError(outcome.failure));\n s.lifecycle?.onSettle(\n entry.inv,\n { type: \"rejected\", error: new StatewireSendError(outcome.failure) },\n durable,\n );\n }\n};\n\nconst settleAll = (s: Session, detach: \"unmount\" | \"gone\") => {\n const cause =\n detach === \"unmount\" ? (\"unmount\" as const) : (\"stream-gone\" as const);\n const batch = s.pending;\n const detachFailure = (entry: Pending): StatewireClient.SendFailure => {\n if (entry.seq === undefined) return { fate: \"aborted\", cause };\n if (!entry.attempted) {\n const seq = entry.seq;\n const predecessorLost = batch.some(\n (p) =>\n p.command.protocol === entry.command.protocol &&\n p.seq !== undefined &&\n p.seq < seq &&\n p.attempted,\n );\n return predecessorLost\n ? { fate: \"aborted\", cause, predecessorLost }\n : { fate: \"aborted\", cause };\n }\n return { fate: \"lost\", cause };\n };\n for (const entry of [...batch]) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, { ok: false, failure: detachFailure(entry) });\n }\n};\n\nconst settleLost = (s: Session, entries: Pending[]) => {\n for (const entry of entries) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"lost\", cause: \"session-lost\" },\n });\n }\n};\n\nconst settleRemoved = (s: Session, entry: Pending) => {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"aborted\", cause: \"removed\" },\n });\n};\n\nconst requeue = (s: Session, survivors: Pending[]) => {\n for (const old of survivors) {\n s.lifecycle?.onCovered?.(old.inv);\n enqueueInner(s, old.command, old.inv.params, old.resolve, old.reject, {\n ...(old.inv.held && { hold: true }),\n ...(old.inv.localMeta !== undefined && { localMeta: old.inv.localMeta }),\n });\n }\n};\n\n// The server-side record's dedup memory is gone: history that may have\n// reached a server settles lost — the new hello's snapshot is the only\n// truth about what survived — and never-attempted statements re-stamp\n// on the adopted lane clocks.\nconst rebaseRecord = (s: Session, adopt: () => void) => {\n const held = s.pending.filter((p) => !p.adopted);\n const survivors = held.filter((p) => !p.attempted && !p.applied && !p.away);\n settleLost(\n s,\n held.filter((p) => !survivors.includes(p)),\n );\n for (const p of s.pending) if (p.adopted) s.lifecycle?.onCovered?.(p.inv);\n s.pending = [];\n s.durableSeq = {};\n // Failure notices ride through every record replacement.\n const previous = s.record.lanes;\n adopt();\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(previous)) {\n const current = laneOf({ ...s.record, lanes }, protocol);\n if (!lane.inbox?.length || current.inbox === lane.inbox) continue;\n lanes = { ...lanes, [protocol]: withNotices(current, lane.inbox) };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n requeue(s, survivors);\n publish(s);\n wake(s);\n void pump(s);\n};\n\nconst resetRecord = (s: Session, clientId: string) =>\n rebaseRecord(s, () => setRecord(s, { clientId, lanes: {} }));\n\n// Another sharer replaced the record's identity: their reset settles our\n// attempted history and our survivors re-stamp on the stored clocks.\nconst adoptReset = (s: Session, stored: StatewireClient.SessionRecord) => {\n rebaseRecord(s, () => {\n s.record = boundInbox(s.store, stored);\n });\n // The host attributes frames by lease, and the lease is bound to the id\n // this attach was opened with.\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\n};\n\n// The record died with the attach: mint a fresh id for the next one.\nconst ephemeralDetach = (s: Session) => {\n s.ephemeral = false;\n s.sessionKnown = false;\n resetRecord(s, newClientId());\n};\n\n// An ephemeral lane dies with its attach: attempted statements can never be\n// answered, the rest re-stamp from 1 for the next attach.\nconst detachEphemeralLanes = (s: Session) => {\n const held = s.pending.filter(\n (p) => isStamped(p) && isEphemeral(s, p.command.protocol),\n );\n if (held.length === 0) return;\n settleLost(\n s,\n held.filter((p) => p.attempted),\n );\n for (const p of held) if (!p.attempted) unstamp(s, p);\n sortPending(s);\n publish(s);\n};\n\nconst rejectedFailure = (cmd: StatewireCmd): StatewireClient.SendFailure => {\n return {\n fate: \"rejected\",\n cause: \"server\",\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n };\n};\n\nconst outcomeOf = (\n cmd: StatewireCmd,\n):\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure } => {\n switch (cmd.type) {\n case \"result\":\n return { ok: true, payload: reviveResponse(cmd).payload };\n case \"rejected\":\n return { ok: false, failure: rejectedFailure(reviveResponse(cmd)) };\n case \"failed\":\n return {\n ok: false,\n failure: {\n fate: \"failed\",\n cause: \"server\",\n ...(cmd.message !== undefined && { message: cmd.message }),\n },\n };\n case \"crashed\":\n return { ok: false, failure: { fate: \"crashed\", cause: \"server\" } };\n case \"expired\":\n return { ok: false, failure: { fate: \"expired\", cause: \"server\" } };\n default:\n return protocolError(`unknown cmd type: ${String(cmd.type)}`);\n }\n};\n\n// Only a result verdict carries applied effects; the rest drop the overlay unapplied.\nconst settleVerdict = (s: Session, entry: Pending, cmd: StatewireCmd) => {\n const outcome = outcomeOf(cmd);\n if (outcome.ok) cover(s, entry);\n else s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, outcome);\n};\n\nconst TERMINAL_CMD_TYPES: ReadonlySet<string> = new Set(TERMINAL);\n\n// A verdict for a seq another sharer stamped parks under the seq for that\n// owner; an adopted command's verdict parks under its id for the enqueuer.\nconst parkVerdict = (s: Session, cmd: StatewireCmd, id?: string) => {\n if (!s.shared || !TERMINAL_CMD_TYPES.has(cmd.type!)) return;\n if (isEphemeral(s, cmd.protocol)) return;\n s.shared.parked.push({\n protocol: cmd.protocol,\n verdict: {\n seq: cmd.seq,\n ...(id !== undefined && { id }),\n type: cmd.type as StatewireClient.SessionVerdict[\"type\"],\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n ...(cmd.meta !== undefined && { meta: cmd.meta }),\n },\n });\n};\n\nconst handleCmd = (s: Session, cmd: StatewireCmd) => {\n if (cmd.dur === true && !isEphemeral(s, cmd.protocol)) {\n const watermark = Math.max(durableSeqOf(s, cmd.protocol), cmd.seq);\n s.durableSeq[cmd.protocol] = watermark;\n for (const entry of laneEntries(s, cmd.protocol)) {\n if (entry.seq <= watermark) entry.posted = true;\n }\n }\n if (cmd.type === undefined) return;\n const entry = laneEntries(s, cmd.protocol).find((p) => p.seq === cmd.seq);\n if (cmd.type === \"applied\") {\n if (entry) cover(s, entry);\n return;\n }\n if (!entry) {\n parkVerdict(s, cmd);\n return;\n }\n if (entry.adopted) parkVerdict(s, cmd, entry.id);\n settleVerdict(s, entry, cmd);\n};\n\nconst consumeVerdicts = (s: Session) => {\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const verdicts = lane.verdicts ?? [];\n const consumed = new Set<number>();\n const forwarded: StatewireClient.SessionVerdict[] = [];\n let next = verdicts;\n for (const verdict of verdicts) {\n // By id: the stamp's owner settles it and forwards it to the enqueuer.\n const entry = s.pending.find(\n (p) =>\n p.command.protocol === protocol &&\n (verdict.id === undefined\n ? isStamped(p) && p.seq === verdict.seq\n : p.id === verdict.id),\n );\n if (!entry) continue;\n next = next.filter((v) => v !== verdict);\n consumed.add(verdict.seq);\n if (entry.adopted) forwarded.push({ ...verdict, id: entry.id });\n const { id: _id, ...cmd } = verdict;\n settleVerdict(s, entry, { ...cmd, protocol });\n }\n if (consumed.size === 0) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.filter((c) => !consumed.has(c.seq)),\n verdicts: [...next, ...forwarded].slice(-MAX_PARKED_VERDICTS),\n },\n };\n }\n if (lanes === s.record.lanes) return;\n setRecord(s, { ...s.record, lanes });\n publish(s);\n wake(s);\n};\n\nconst handleCmds = (s: Session, cmds: StatewireCmd[]) => {\n for (const cmd of cmds) handleCmd(s, cmd);\n syncBacklog(s);\n wake(s);\n};\n\nconst ingestOps = (s: Session, ops: unknown[]) => {\n const applied = applyDocumentOps(s.documents, ops, s.selection?.protocols);\n s.documents = applied;\n const next =\n s.selection === undefined\n ? applied.documents.get(0)?.value\n : s.options.applicationProtocols === \"*\"\n ? Object.fromEntries(\n [...applied.documents].map(([id, d]) => [\n `${d.protocol}:${d.key === null ? id : JSON.stringify(d.key)}`,\n d.value,\n ]),\n )\n : mainDocument(applied, s.options.protocol ?? DEFAULT_PROTOCOL)?.value;\n if (next !== s.canonical)\n s.changed.push(\n ...(applied.changedPaths.length ? applied.changedPaths : [[]]),\n );\n s.canonical = next;\n};\n\nconst cacheDocuments = (s: Session) => {\n if (s.documentStore && s.selection) {\n for (const document of s.documents.documents.values()) {\n if (!document.protocol || !document.key) continue;\n const key = resolveDocumentKey(\n document.key,\n s.options.keyPrefixes?.[document.protocol],\n );\n const version = s.selection.protocols.find(\n (p) => p.name === document.protocol,\n )?.version;\n if (key !== undefined && version !== undefined)\n s.documentStore.save(\n [s.documentStore.namespace ?? \"\", document.protocol, ...key],\n { version, value: document.value },\n );\n }\n }\n};\n\nconst publishIngested = (s: Session) => {\n publish(s);\n cacheDocuments(s);\n for (const listener of s.documentListeners) listener();\n wake(s);\n};\n\n// The refusal's watermark is exact: every held statement above it was never\n// admitted by the live record, and the first unposted seq being beyond\n// watermark+1 proves the record that admitted the missing prefix is gone —\n// its history settles lost and the lane clock restarts at the watermark.\nconst sessionLostInner = (s: Session, protocol: string, seqWm: number) => {\n const lane = laneOf(s.record, protocol);\n const failure = { fate: \"lost\", cause: \"session-lost\" } as const;\n const held = laneEntries(s, protocol);\n s.durableSeq[protocol] = seqWm;\n const requeue =\n held.length > 0 &&\n s.onSessionLost?.(\n held.map((p) => ({\n id: p.id,\n method: p.inv.method,\n params: p.inv.params,\n ts: p.inv.ts,\n seq: p.seq,\n ...(p.inv.clientId !== undefined && { clientId: p.inv.clientId }),\n })),\n ) === \"requeue\";\n if (requeue) {\n if (s.onDeprecatedPath)\n s.onDeprecatedPath({ kind: \"session-lost-requeue\", count: held.length });\n else\n console.warn(\n `statewire: onSessionLost \"requeue\" re-enqueued ${held.length} commands; it is deprecated and will be removed`,\n );\n for (const p of held) {\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(s, p, { ok: false, failure }, \"memory\");\n }\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...lane,\n nextSeq: seqWm + 1,\n commands: [],\n }),\n );\n for (const old of held)\n enqueueInner(\n s,\n old.command,\n old.inv.params,\n () => {},\n () => {},\n {\n ...(old.inv.localMeta !== undefined && {\n localMeta: old.inv.localMeta,\n }),\n },\n );\n } else {\n // Default: the whole queue goes, each command a failure notice.\n const stamps = mergeBacklog(s, protocol);\n const queued = outboxOf(lane);\n const { outbox: _outbox, ...rest } = lane;\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withNotices(rest, [\n ...stamps.map((c) => lostNotice(c)),\n ...queued.map((c) => lostNotice(c)),\n ]),\n nextSeq: seqWm + 1,\n commands: [],\n ...marks(\n s,\n lane,\n [\n ...stamps.map((c) => ({ id: c.id, by: c.by ?? c.owner })),\n ...queued,\n ],\n failure,\n ),\n }),\n );\n for (const p of s.pending.filter((q) => q.command.protocol === protocol)) {\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(s, p, { ok: false, failure }, \"noticed\");\n }\n deliver(s);\n }\n publish(s);\n wake(s);\n};\n\n// Every stamp above the watermark, whichever sharer made it, returns to the\n// front of the outbox. A stamp past watermark+1, or one this client saw\n// admitted, proves the server record that admitted it is gone.\nconst demote = (\n s: Session,\n protocol: string,\n watermark: number,\n demoted: Set<string>,\n) => {\n const lane = laneOf(s.record, protocol);\n const local = laneEntries(s, protocol).filter((p) => p.seq > watermark);\n const above = new Map(\n lane.commands.filter((c) => c.seq > watermark).map((c) => [c.id, c]),\n );\n for (const p of local) if (!above.has(p.id)) above.set(p.id, toStored(s, p));\n if (above.size === 0) return;\n const moved = [...above.values()].sort((a, b) => a.seq - b.seq);\n if (\n moved[0]!.seq > watermark + 1 ||\n moved[0]!.seq <= durableSeqOf(s, protocol) ||\n local.some((p) => p.applied)\n ) {\n sessionLostInner(s, protocol, watermark);\n return;\n }\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withOutbox(lane, [\n ...moved.map(({ seq: _seq, owner: _owner, ...command }) => command),\n ...outboxOf(lane),\n ]),\n nextSeq: watermark + 1,\n commands: lane.commands.filter((c) => c.seq <= watermark),\n }),\n );\n for (const command of moved) demoted.add(command.id);\n for (const p of local) {\n if (p.adopted) dropPending(s, p);\n else unstamp(s, p);\n }\n sortPending(s);\n};\n\nconst selectionOf = (\n syn: StatewireSyn,\n): StatewireProtocol.Selection | undefined => {\n if (syn.version === undefined || syn.protocols === undefined)\n return undefined;\n return {\n version: syn.version,\n protocols: syn.protocols.map(({ name, version, record }) => {\n if (version === undefined)\n return protocolError(`hello lane ${name} has no version`);\n return { name, version, ...(record !== undefined && { record }) };\n }),\n };\n};\n\nconst handleHello = (\n s: Session,\n { ops, syn }: { ops: unknown[]; syn: StatewireSyn },\n) => {\n if (s.attach === \"attached\") {\n s.ephemeralSeqs = {};\n detachEphemeralLanes(s);\n }\n for (const [protocol, value] of s.contexts) {\n if (s.attachContexts.get(protocol) === value)\n s.dirtyContexts.delete(protocol);\n else s.dirtyContexts.add(protocol);\n }\n s.attachContexts.clear();\n s.selection = selectionOf(syn);\n s.documents = { mode: null, documents: new Map() };\n ingestOps(s, ops);\n s.attach = \"attached\";\n s.attachEpoch += 1;\n s.frameFailures = 0;\n s.resumeAt = 0;\n const lanes = syn.protocols ?? [];\n s.ephemeral =\n lanes.length > 0 && lanes.every((lane) => lane.record === \"ephemeral\");\n if (s.ephemeral) s.deactivated = true;\n const attached = s.attachEntries;\n s.attachEntries = new Set();\n const reconcile = () => {\n // Statements at or below the watermark resend only to fetch their\n // verdicts (the server never re-runs them); seqs above it never arrived\n // and go back to the outbox for fresh ones.\n const demoted = new Set<string>();\n for (const lane of lanes) {\n if (lane.record === \"ephemeral\") {\n s.ephemeralSeqs[lane.name] = Math.max(\n Object.hasOwn(s.ephemeralSeqs, lane.name)\n ? s.ephemeralSeqs[lane.name]!\n : 0,\n ...laneEntries(s, lane.name).map((p) => p.seq),\n );\n continue;\n }\n demote(s, lane.name, lane.seq ?? 0, demoted);\n s.durableSeq[lane.name] = lane.seq ?? 0;\n }\n for (const entry of s.pending) {\n entry.posted =\n attached.has(entry) ||\n (isStamped(entry) &&\n entry.seq <= durableSeqOf(s, entry.command.protocol) &&\n !isEphemeral(s, entry.command.protocol));\n entry.stale = false;\n }\n syncBacklogInner(s);\n s.sessionKnown = true;\n flushInner(s, demoted);\n };\n if (!s.shared || s.deactivated) {\n reconcile();\n publishIngested(s);\n void pump(s);\n deliver(s);\n return;\n }\n transactBackground(s, reconcile, () => {\n publishIngested(s);\n void pump(s);\n deliver(s);\n });\n};\n\nconst handleOps = (\n s: Session,\n { ops, cmds }: { ops: unknown[]; cmds: StatewireCmd[] },\n) => {\n ingestOps(s, ops);\n for (const cmd of cmds) handleCmd(s, cmd);\n if (cmds.length > 0) syncBacklog(s);\n publishIngested(s);\n};\n\n// A retry-less {syn} refusal is the one session-loss verdict: a gap against\n// a durable lane's exact watermark settles that lane's history lost; a\n// pushback (retry present) or a gapless refusal only reconciles the resend queues.\nconst handleRefusal = (s: Session, syn: StatewireSyn) => {\n const lanes = (syn.protocols ?? []).filter(\n (lane): lane is { name: string; seq: number } => lane.seq !== undefined,\n );\n for (const { name, seq } of lanes) {\n const watermark = isEphemeral(s, name)\n ? seq\n : Math.max(seq, durableSeqOf(s, name));\n for (const entry of laneEntries(s, name))\n entry.posted = entry.seq <= watermark;\n }\n if (typeof syn.retry === \"number\") {\n s.resumeAt = Date.now() + retryHint(syn.retry);\n wake(s);\n void pump(s);\n return;\n }\n const gaps = lanes.filter(({ name, seq }) => {\n const first = laneEntries(s, name).find((p) => !p.posted);\n return (\n first !== undefined &&\n first.seq > Math.max(seq, durableSeqOf(s, name)) + 1\n );\n });\n for (const { name, seq } of gaps) {\n if (isEphemeral(s, name))\n protocolError(`gap on ephemeral lane ${name} after watermark ${seq}`);\n }\n // Another sharer holds the missing stamp: reattach, and the hello frees it.\n if (\n gaps.some(({ name, seq }) =>\n laneOf(s.record, name).commands.some(\n (c) => c.seq === seq + 1 && c.owner !== s.store.owner?.id,\n ),\n )\n ) {\n s.transport?.connection.reconnect();\n return;\n }\n if (gaps.length > 0) {\n transactBackground(\n s,\n () => {\n for (const { name, seq } of gaps) sessionLostInner(s, name, seq);\n },\n () => {\n wake(s);\n void pump(s);\n },\n );\n return;\n }\n wake(s);\n void pump(s);\n};\n\nconst handleDetach = (s: Session) => {\n if (s.attach === \"attached\") s.attach = \"detached\";\n s.ephemeralSeqs = {};\n if (s.ephemeral) ephemeralDetach(s);\n else detachEphemeralLanes(s);\n wake(s);\n};\n\nconst handleFinish = (s: Session, { reason }: { reason: string }) => {\n if (reason === \"reconnect\" || reason === \"error\") return;\n s.attach = \"finished\";\n settleAll(s, \"gone\");\n publish(s);\n wake(s);\n};\n\nconst isFinished = (s: Session) => s.attach === \"finished\";\n\ntype Lanes = {\n frame: StatewireFrame;\n entries: Stamped[];\n};\n\n// A lane must be strictly consecutive within a frame: the first unposted run\n// per lane rides now, later runs ride follow-up frames. Ephemeral lanes ignore\n// the gate: they live on the attach and never wait for persistence.\nconst buildLanes = (\n s: Session,\n cmdGate: \"persisted\" | \"all\" | \"none\" = \"all\",\n): Lanes | null => {\n const entries: Stamped[] = [];\n const last: Record<string, number> = {};\n const stopped = new Set<string>();\n for (const entry of s.pending) {\n if (entries.length >= MAX_COMMANDS_PER_FRAME) break;\n if (!isStamped(entry)) continue;\n const protocol = entry.command.protocol;\n if (entry.posted || stopped.has(protocol)) continue;\n if (entry.stale) {\n stopped.add(protocol);\n continue;\n }\n const gated =\n !isEphemeral(s, protocol) &&\n (cmdGate === \"none\" ||\n (cmdGate === \"persisted\" &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= laneOf(s.persistedRecord, protocol).nextSeq)));\n if (\n gated ||\n (Object.hasOwn(last, protocol) && entry.seq !== last[protocol]! + 1)\n ) {\n stopped.add(protocol);\n continue;\n }\n last[protocol] = entry.seq;\n entries.push(entry);\n }\n const ctx = [...s.dirtyContexts].map((protocol) => s.contexts.get(protocol)!);\n if (entries.length === 0 && ctx.length === 0) return null;\n return {\n frame: {\n ...(ctx.length > 0 && { ctx }),\n ...(entries.length > 0 && {\n cmd: entries.map((p) => {\n const { produced: _produced, ...command } = p.command;\n return { ...command, seq: p.seq };\n }),\n }),\n },\n entries,\n };\n};\n\n// Per durable lane with stamps awaiting a verdict: the seq below the oldest.\n// The hello answers everything above it, so nothing at or below the\n// watermark is ever re-sent.\nconst resultsCursor = (s: Session) => {\n const cursors = new Map<string, number>();\n for (const p of s.pending) {\n if (!isStamped(p) || isEphemeral(s, p.command.protocol)) continue;\n const protocol = p.command.protocol;\n cursors.set(protocol, Math.min(cursors.get(protocol) ?? p.seq, p.seq));\n }\n return [...cursors].map(([protocol, seq]) => ({ protocol, seq: seq - 1 }));\n};\n\nconst takeAttachLanes = (s: Session): StatewireFrame | null => {\n s.attachEntries = new Set();\n const wanted = s.lanesOnAttach;\n s.lanesOnAttach = false;\n for (const protocol of s.contexts.keys()) s.dirtyContexts.add(protocol);\n s.attachContexts = new Map(s.contexts);\n const lanes = buildLanes(s, wanted && s.sessionKnown ? \"persisted\" : \"none\");\n const res = resultsCursor(s);\n if (!lanes && res.length === 0) return null;\n s.attachEntries = new Set(lanes?.entries ?? []);\n for (const entry of lanes?.entries ?? []) entry.attempted = true;\n return { ...lanes?.frame, ...(res.length > 0 && { res }) };\n};\n\nconst persistBeforeSend = (s: Session): void | Promise<void> => {\n if (s.storageError !== undefined) throw s.storageError;\n if (!s.hydrated) return s.ready!.then(() => persistBeforeSend(s));\n const record = s.record;\n try {\n const pending = s.store.flush?.();\n if (pending)\n return pending.then(\n () => {\n s.persistedRecord = record;\n },\n (cause: unknown) => {\n throw wrapStorageError(cause);\n },\n );\n s.persistedRecord = record;\n } catch (cause) {\n throw wrapStorageError(cause);\n }\n};\n\nconst pump = async (s: Session) => {\n if (s.pumping) return;\n s.pumping = true;\n try {\n while (s.running && !isFinished(s)) {\n if (!s.hydrated) await s.ready;\n const transport = s.transport;\n const flushable = flushCandidates(s).length > 0;\n const queued = s.pending.some((p) => isOutboxed(p) && !p.inv.held);\n if (\n buildLanes(s) === null &&\n !flushable &&\n (!queued || s.attach === \"attached\")\n )\n return;\n if (transport?.parked && s.pending.length === 0) return;\n if (s.attach !== \"attached\" || !transport) {\n if (s.pending.length === 0) return;\n if (\n (transport?.connection.status === \"standby\" &&\n transport.connection.reason === \"idle\") ||\n (transport?.parked && s.pending.length > 0)\n ) {\n transport.connection.reconnect();\n }\n await waitForWake(s);\n continue;\n }\n const resumeDelay = s.resumeAt - Date.now();\n if (resumeDelay > 0) {\n await sleepUntilWake(s, resumeDelay);\n continue;\n }\n if (flushable) {\n if (!s.sessionKnown) {\n await waitForWake(s);\n continue;\n }\n await flush(s);\n continue;\n }\n let lanes = buildLanes(s);\n if (!lanes) continue;\n const epoch = s.attachEpoch;\n const persistence = persistBeforeSend(s);\n if (persistence) await persistence;\n if (!s.running || isFinished(s)) return;\n if (epoch !== s.attachEpoch || s.attach !== \"attached\") continue;\n let result;\n try {\n // Shared storage: the lock across the send keeps per-lane arrival\n // ordered across sharers, and the frame is rebuilt from the record\n // as it stands, so a stamp another sharer freed never goes out.\n const send = (built: Lanes) => {\n for (const entry of built.entries) entry.attempted = true;\n return transport.send(built.frame);\n };\n result = await (s.shared && !s.deactivated && lanes.entries.length > 0\n ? s.store.lock!(async () => {\n refresh(s, await readStored(s));\n lanes = buildLanes(s);\n if (!lanes || epoch !== s.attachEpoch) return null;\n return send(lanes);\n })\n : send(lanes));\n } catch {\n if (!s.running || isFinished(s)) return;\n if (lanes?.frame.ctx?.length) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n await waitForWake(s);\n continue;\n }\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n continue;\n }\n if (!s.running) return;\n if (result === null || lanes === null) continue;\n s.frameFailures = 0;\n if (\n epoch === s.attachEpoch &&\n (result.type === \"ok\" || result.type === \"refusal\")\n ) {\n for (const entry of lanes.frame.ctx ?? []) {\n if (s.contexts.get(entry.protocol) === entry)\n s.dirtyContexts.delete(entry.protocol);\n }\n }\n if (result.type === \"ok\") {\n if (epoch === s.attachEpoch) {\n for (const entry of lanes.entries) {\n if (s.pending.includes(entry)) {\n entry.posted = true;\n s.lifecycle?.onPosted?.(entry.inv);\n }\n }\n }\n } else if (result.type === \"refusal\") {\n if (epoch === s.attachEpoch) handleRefusal(s, result.syn);\n } else if (result.type === \"stale-lease\") {\n // A POST outlived its attach: reattach first, the hello arbitrates.\n if (epoch === s.attachEpoch) {\n transport.connection.reconnect();\n await waitForWake(s);\n }\n } else if (result.type === \"no-lease\") {\n // No out-of-band write channel: the frame rides a fresh attach.\n if (epoch === s.attachEpoch) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n while (s.running && !isFinished(s) && epoch === s.attachEpoch) {\n await waitForWake(s);\n }\n }\n }\n }\n } catch (error) {\n storageFailed(s, error);\n } finally {\n s.pumping = false;\n }\n};\n\nconst start = (s: Session) => {\n s.running = true;\n if (!s.hydrated) {\n void s.ready!.then(\n () => {\n if (s.running) start(s);\n },\n () => {},\n );\n return;\n }\n if (s.shared) {\n s.shared.abort = new AbortController();\n s.shared.unsubscribe = s.store.subscribe!(() => {\n transactBackground(\n s,\n () => consumeVerdicts(s),\n () => {\n wake(s);\n void pump(s);\n deliver(s);\n },\n );\n });\n s.running = true;\n transactBackground(\n s,\n () => {\n if (s.store.load() === null) s.store.save(s.record);\n s.recordPersisted = true;\n adoptOwner(s, undefined);\n consumeVerdicts(s);\n },\n () => {\n void pump(s);\n deliver(s);\n },\n );\n return;\n }\n if (!s.recordPersisted) {\n s.recordPersisted = true;\n s.store.save(s.record);\n }\n adoptOwner(s, undefined);\n s.running = true;\n void pump(s);\n deliver(s);\n};\n\nconst stop = (s: Session) => {\n s.running = false;\n if (s.shared) {\n s.shared.unsubscribe?.();\n s.shared.unsubscribe = null;\n s.shared.abort?.abort();\n s.shared.abort = null;\n s.shared.watched.clear();\n }\n wake(s);\n settleAll(s, \"unmount\");\n};\n\nconst setTransport = (s: Session, transport: RemoteLink) => {\n if (s.transport === transport) return;\n s.transport = transport;\n wake(s);\n};\n\ntype EnqueueOptions = {\n hold?: boolean;\n localMeta?: unknown;\n};\n\nconst QUOTA: StatewireClient.SendFailure = { fate: \"aborted\", cause: \"quota\" };\n\nconst isQuota = (error: unknown) =>\n error instanceof Error && error.name === \"StatewireQuotaError\";\n\nconst enqueueInner = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n options: EnqueueOptions = {},\n) => {\n const protocol = command.protocol;\n const id = newClientId();\n const entry: Pending = {\n id,\n seq: undefined,\n command,\n inv: {\n protocol,\n method: command.method,\n params,\n ts: Date.now(),\n id,\n clientId: s.record.clientId,\n ...(options.hold && { held: true as const }),\n ...(options.localMeta !== undefined && { localMeta: options.localMeta }),\n },\n adopted: false,\n by: s.store.owner?.id,\n away: false,\n stale: false,\n attempted: false,\n posted: false,\n applied: false,\n resolve,\n reject,\n };\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n try {\n setRecord(\n s,\n withLane(\n s.record,\n protocol,\n withOutbox(lane, [...outboxOf(lane), toOutbox(entry)]),\n ),\n );\n } catch (error) {\n if (!isQuota(error)) throw error;\n reject(new StatewireSendError(QUOTA));\n return;\n }\n s.pending.push(entry);\n reorder(s, protocol);\n } else s.pending.push(entry);\n s.lifecycle?.onStart(entry.inv);\n s.notify();\n};\n\nconst negotiated = (s: Session, protocol: string) =>\n s.selection?.protocols.some((p) => p.name === protocol) ?? false;\n\ntype Candidate = {\n protocol: string;\n stored: StatewireClient.OutboxCommand;\n};\n\nconst viewOf = (\n s: Session,\n protocol: string,\n stored: StatewireClient.OutboxCommand | StatewireClient.SessionCommand,\n state?: \"sending\",\n): StatewireClient.OutboxEntry => {\n const cached = s.views.get(stored);\n if (cached?.protocol === protocol) return cached;\n const view: StatewireClient.OutboxEntry = {\n id: stored.id,\n protocol,\n command: { method: stored.method, params: paramsOf(stored) },\n ts: stored.ts,\n state:\n state ??\n ((stored as StatewireClient.OutboxCommand).held ? \"held\" : \"queued\"),\n localMeta: stored.localMeta,\n durable: s.store.durable !== false && !isEphemeral(s, protocol),\n };\n s.views.set(stored, view);\n return view;\n};\n\n/** The lane's outbox as this client may flush it: the record's on a durable lane, its own on an ephemeral one. */\nconst laneQueue = (\n s: Session,\n protocol: string,\n): StatewireClient.OutboxCommand[] =>\n isEphemeral(s, protocol)\n ? s.pending\n .filter((p) => isOutboxed(p) && p.command.protocol === protocol)\n .map((p) => toOutbox(p))\n : [...outboxOf(laneOf(s.record, protocol))];\n\n// Bubble forward: each entry moves toward the front past held or waiting\n// entries it may overtake and stops behind the first it can't; the entries\n// with nothing held or waiting ahead are the ones a flush stamps.\nconst bubble = (\n s: Session,\n protocol: string,\n queue: readonly StatewireClient.OutboxCommand[],\n): { order: StatewireClient.OutboxCommand[]; free: number } => {\n const may = s.options.canOvertake?.[protocol];\n const order: { stored: StatewireClient.OutboxCommand; blocked: boolean }[] =\n [];\n for (const stored of queue) {\n if (stored.held) {\n order.push({ stored, blocked: true });\n continue;\n }\n let at = order.length;\n while (\n at > 0 &&\n order[at - 1]!.blocked &&\n may !== undefined &&\n may(\n viewOf(s, protocol, stored),\n viewOf(s, protocol, order[at - 1]!.stored),\n )\n )\n at--;\n order.splice(at, 0, { stored, blocked: at > 0 && order[at - 1]!.blocked });\n }\n const free = order.findIndex((o) => o.blocked);\n return {\n order: order.map((o) => o.stored),\n free: free === -1 ? order.length : free,\n };\n};\n\n/** Persists the lane's bubbled order. */\nconst reorder = (s: Session, protocol: string) => {\n if (isEphemeral(s, protocol)) return;\n const lane = laneOf(s.record, protocol);\n const { order } = bubble(s, protocol, outboxOf(lane));\n if (order.every((c, i) => c === outboxOf(lane)[i])) return;\n setRecord(s, withLane(s.record, protocol, withOutbox(lane, order)));\n};\n\nconst flushLanes = (s: Session) =>\n [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending.map((p) => p.command.protocol),\n ]),\n ].filter((protocol) => negotiated(s, protocol));\n\n/** Entries the next flush would stamp. */\nconst flushCandidates = (s: Session): Candidate[] =>\n flushLanes(s).flatMap((protocol) => {\n const { order, free } = bubble(s, protocol, laneQueue(s, protocol));\n return order.slice(0, free).map((stored) => ({ protocol, stored }));\n });\n\nconst reasonOf = (\n s: Session,\n stored: StatewireClient.OutboxCommand,\n demoted: ReadonlySet<string>,\n): StatewireClient.FlushReason =>\n stored.released\n ? \"release\"\n : demoted.has(stored.id)\n ? \"reconnect\"\n : s.mountIds.has(stored.id)\n ? \"reload\"\n : \"enqueue\";\n\nconst NO_IDS: ReadonlySet<string> = new Set();\n\nconst patched = (\n stored: StatewireClient.OutboxCommand,\n patch: Patch,\n): StatewireClient.OutboxCommand => {\n const {\n held: _held,\n released: _released,\n localMeta: _meta,\n ...rest\n } = stored;\n const held = patch.held ?? stored.held === true;\n const localMeta =\n patch.localMeta === undefined ? stored.localMeta : patch.localMeta.value;\n let next: StatewireClient.OutboxCommand = {\n ...rest,\n ...(held && { held: true as const }),\n ...(!held &&\n (stored.held || stored.released) && { released: true as const }),\n ...(localMeta !== undefined && { localMeta }),\n };\n if (patch.params !== undefined) {\n const { params, meta } = encodeParams(patch.params);\n const { meta: _old, ...plain } = next;\n next = { ...plain, params, ...(meta !== undefined && { meta }) };\n }\n return next;\n};\n\n// Seqs are allocated here, under the lock, against the attach's watermark:\n// each outbox entry is stamped by exactly one sharer, in the bubbled order.\nconst flushInner = (s: Session, demoted: ReadonlySet<string> = NO_IDS) => {\n if (s.attach !== \"attached\" || !s.sessionKnown || !s.running || isFinished(s))\n return;\n const candidates = flushCandidates(s);\n if (candidates.length === 0) return;\n const groups = new Map<\n StatewireClient.FlushReason,\n StatewireClient.OutboxEntry[]\n >();\n for (const { protocol, stored } of candidates) {\n const reason = reasonOf(s, stored, demoted);\n groups.set(reason, [\n ...(groups.get(reason) ?? []),\n viewOf(s, protocol, stored),\n ]);\n }\n const flushing: Flushing = {\n ids: new Set(candidates.map((c) => c.stored.id)),\n patches: new Map(),\n removed: new Set(),\n };\n s.flushing = flushing;\n try {\n for (const [reason, commands] of groups) {\n try {\n s.onFlush?.({ commands, reason });\n } catch (error) {\n console.error(\"statewire: onFlush threw; stamping anyway\", error);\n }\n }\n } finally {\n s.flushing = null;\n }\n let record = s.record;\n for (const protocol of new Set(candidates.map((c) => c.protocol))) {\n const ephemeral = isEphemeral(s, protocol);\n const lane = laneOf(record, protocol);\n const removed: StatewireClient.OutboxCommand[] = [];\n const queue: StatewireClient.OutboxCommand[] = [];\n for (const stored of laneQueue(s, protocol)) {\n const own = s.pending.find((p) => p.id === stored.id && isOutboxed(p));\n if (flushing.removed.has(stored.id)) {\n removed.push(stored);\n if (own) settleRemoved(s, own);\n continue;\n }\n const patch = flushing.patches.get(stored.id);\n if (patch === undefined) {\n queue.push(stored);\n continue;\n }\n const next = patched(stored, patch);\n queue.push(next);\n if (own) follow(s, own, next);\n }\n const { order, free } = bubble(s, protocol, queue);\n let nextSeq = lane.nextSeq;\n const commands = [...lane.commands];\n for (const stored of order.slice(0, free)) {\n s.mountIds.delete(stored.id);\n const own = s.pending.find((p) => p.id === stored.id && isOutboxed(p));\n if (ephemeral) {\n const seq =\n (Object.hasOwn(s.ephemeralSeqs, protocol)\n ? s.ephemeralSeqs[protocol]!\n : 0) + 1;\n s.ephemeralSeqs[protocol] = seq;\n stamp(s, own!, seq);\n continue;\n }\n const seq = Math.max(nextSeq, durableSeqOf(s, protocol) + 1);\n nextSeq = seq + 1;\n const { held: _held, released: _released, ...command } = stored;\n const stamped: StatewireClient.SessionCommand = {\n ...command,\n seq,\n ...(s.store.owner !== undefined && { owner: s.store.owner.id }),\n };\n commands.push(stamped);\n if (own) stamp(s, own, seq);\n else {\n const adopted = adoptedPending(s, protocol, stamped);\n adopted.stale = false;\n adopted.attempted = false;\n s.pending.push(adopted);\n }\n }\n if (ephemeral && removed.length === 0 && outboxOf(lane).length === 0)\n continue;\n const stampedIds = new Set(order.slice(0, free).map((c) => c.id));\n const rest = ephemeral\n ? outboxOf(lane).filter(\n (c) => !removed.some((r) => r.id === c.id) && !stampedIds.has(c.id),\n )\n : order.slice(free);\n record = withLane(record, protocol, {\n ...withOutbox(lane, rest),\n nextSeq,\n commands,\n ...marks(s, lane, removed),\n });\n }\n if (record !== s.record) setRecord(s, record);\n sortPending(s);\n s.notify();\n};\n\nconst flush = (s: Session): Promise<void> => {\n if (!s.shared) {\n flushInner(s);\n return Promise.resolve();\n }\n return transact(s, () => flushInner(s));\n};\n\nexport const outboxEntries = (\n s: Session,\n): readonly StatewireClient.OutboxEntry[] => {\n const local = s.pending.filter(\n (p) => isEphemeral(s, p.command.protocol) && !p.away,\n );\n const parts: unknown[] = [\n ...Object.values(s.record.lanes).flatMap((lane) => [\n lane.commands,\n lane.outbox,\n ]),\n ...local.flatMap((p) => [p, p.seq, p.inv.held, p.inv.localMeta]),\n ];\n const same =\n parts.length === s.outboxParts.length &&\n parts.every((part, i) => part === s.outboxParts[i]);\n if (!same) {\n s.outboxParts = parts;\n s.outboxList = [\n ...Object.entries(s.record.lanes).flatMap(([protocol, lane]) => [\n ...[...lane.commands]\n .sort((a, b) => a.seq - b.seq)\n .map((c) => viewOf(s, protocol, c, \"sending\")),\n ...outboxOf(lane).map((c) => viewOf(s, protocol, c)),\n ]),\n ...[...local]\n .sort((a, b) => (a.seq ?? Infinity) - (b.seq ?? Infinity))\n .map((p) =>\n isStamped(p)\n ? viewOf(s, p.command.protocol, toStored(s, p), \"sending\")\n : viewOf(s, p.command.protocol, toOutbox(p)),\n ),\n ];\n }\n return s.outboxList;\n};\n\ntype OutboxOp =\n | { type: \"patch\"; patch: (entry: StatewireClient.OutboxEntry) => Patch }\n | { type: \"remove\" };\n\nconst entryOf = (s: Session, id: string) => {\n const at = locate(s, id);\n if (at === undefined) throw new Error(`outbox: no entry ${id}`);\n if (at.stored === undefined) throw new Error(`outbox: ${id} is in flight`);\n return { protocol: at.protocol, stored: at.stored };\n};\n\nconst applyOutboxOp = (s: Session, id: string, op: OutboxOp) => {\n const at = locate(s, id);\n if (at?.stored === undefined) return;\n const { protocol, stored } = at;\n const own = s.pending.find((p) => p.id === id && isOutboxed(p));\n if (op.type === \"remove\") {\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withOutbox(\n lane,\n outboxOf(lane).filter((c) => c.id !== id),\n ),\n ...marks(s, lane, [stored]),\n }),\n );\n }\n if (own) settleRemoved(s, own);\n } else {\n const next = patched(stored, op.patch(viewOf(s, protocol, stored)));\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n setRecord(\n s,\n withLane(\n s.record,\n protocol,\n withOutbox(\n lane,\n outboxOf(lane).map((c) => (c.id === id ? next : c)),\n ),\n ),\n );\n }\n if (own) follow(s, own, next);\n }\n reorder(s, protocol);\n s.notify();\n};\n\nconst toPatch = (patch: StatewireClient.OutboxPatch): Patch => {\n if (typeof patch !== \"object\" || patch === null)\n throw new Error(\"outbox: update must return a patch object\");\n if (patch.held !== undefined && typeof patch.held !== \"boolean\")\n throw new Error(\"outbox: held must be a boolean\");\n if (\n patch.command !== undefined &&\n (Object.keys(patch.command).some((k) => k !== \"params\") ||\n !Array.isArray(patch.command.params))\n )\n throw new Error(\"outbox: a patch may only replace command.params\");\n return {\n ...(patch.held !== undefined && { held: patch.held }),\n ...(\"localMeta\" in patch && { localMeta: { value: patch.localMeta } }),\n ...(patch.command !== undefined && { params: patch.command.params }),\n };\n};\n\nconst outboxOp = (s: Session, id: string, op: OutboxOp): Promise<void> => {\n entryOf(s, id);\n const flushing = s.flushing;\n if (flushing?.ids.has(id)) {\n if (op.type === \"remove\") flushing.removed.add(id);\n else {\n const at = entryOf(s, id);\n const patch = op.patch(viewOf(s, at.protocol, at.stored));\n flushing.patches.set(id, { ...flushing.patches.get(id), ...patch });\n }\n return Promise.resolve();\n }\n const done = () => {\n wake(s);\n void pump(s);\n };\n if (!s.shared) {\n applyOutboxOp(s, id, op);\n done();\n return Promise.resolve();\n }\n return transact(s, () => applyOutboxOp(s, id, op)).then(done);\n};\n\nconst background = (promise: Promise<void>) => {\n promise.catch(() => {});\n};\n\nexport const holdOutbox = (s: Session, id: string) =>\n background(outboxOp(s, id, { type: \"patch\", patch: () => ({ held: true }) }));\n\nexport const releaseOutbox = (s: Session, id: string): Promise<unknown> => {\n entryOf(s, id);\n const result = new Promise<unknown>((resolve, reject) => {\n const waiters = s.releases.get(id) ?? [];\n waiters.push({ resolve, reject });\n s.releases.set(id, waiters);\n });\n result.catch(() => {});\n outboxOp(s, id, { type: \"patch\", patch: () => ({ held: false }) }).catch(\n (error: unknown) => settleWaiters(s, id, error),\n );\n return result;\n};\n\nconst settleWaiters = (s: Session, id: string, error: unknown) => {\n const waiters = s.releases.get(id) ?? [];\n s.releases.delete(id);\n for (const waiter of waiters) waiter.reject(error);\n};\n\nexport const removeOutbox = (s: Session, id: string) =>\n background(outboxOp(s, id, { type: \"remove\" }));\n\nexport const updateOutbox = (\n s: Session,\n id: string,\n fn: (entry: StatewireClient.OutboxEntry) => StatewireClient.OutboxPatch,\n) =>\n background(\n outboxOp(s, id, { type: \"patch\", patch: (entry) => toPatch(fn(entry)) }),\n );\n\nconst producedOf = (\n s: Session,\n): NonNullable<StatewireClient.SessionCommand[\"produced\"]> => ({\n wire: s.options.wireVersion ?? { version: WIRE_VERSION },\n protocols:\n protocolOffers(s.options) === \"*\" && s.selection\n ? s.selection.protocols\n : protocolOffers(s.options),\n});\n\nconst placed = (\n queue: readonly StatewireClient.OutboxCommand[],\n entry: StatewireClient.OutboxCommand,\n { after, before }: { after?: string; before?: string },\n) => {\n const anchor = after ?? before;\n if (anchor === undefined) return [...queue, entry];\n const index = queue.findIndex((c) => c.id === anchor);\n if (index === -1) return [...queue, entry];\n const at = after !== undefined ? index + 1 : index;\n return [...queue.slice(0, at), entry, ...queue.slice(at)];\n};\n\nexport const insertOutbox = (\n s: Session,\n entry: StatewireClient.OutboxInsert,\n): string => {\n if (!s.hydrated) throw new Error(\"outbox: storage is not hydrated yet\");\n if (s.storageError !== undefined) throw s.storageError;\n if (entry.after !== undefined && entry.before !== undefined)\n throw new Error(\"outbox: after and before are exclusive\");\n for (const anchor of [entry.after, entry.before])\n if (anchor !== undefined) entryOf(s, anchor);\n const { protocol } = entry;\n if (!(s.selection ? negotiated(s, protocol) : offered(s, protocol)))\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n const { params, meta } = encodeParams(entry.command.params);\n const id = entry.from === undefined ? newClientId() : `${entry.from}~`;\n const stored: StatewireClient.OutboxCommand = {\n id,\n produced: producedOf(s),\n method: entry.command.method,\n params,\n ...(meta !== undefined && { meta }),\n ts: Date.now(),\n ...(entry.held && { held: true as const }),\n ...(entry.localMeta !== undefined && { localMeta: entry.localMeta }),\n ...(s.store.owner !== undefined && { by: s.store.owner.id }),\n };\n const run = () => {\n if (isEphemeral(s, protocol)) {\n enqueueInner(\n s,\n {\n protocol,\n produced: stored.produced!,\n method: stored.method,\n params,\n ...(meta !== undefined && { meta }),\n },\n entry.command.params,\n () => {},\n () => {},\n {\n ...(entry.held && { hold: true }),\n ...(entry.localMeta !== undefined && { localMeta: entry.localMeta }),\n },\n );\n return;\n }\n let base = s.record;\n if (entry.from !== undefined) {\n // Re-inserting a settled update consumes it in the same write: a\n // redelivery finds it gone.\n const source = Object.entries(base.lanes).find(([, l]) =>\n l.inbox?.some((n) => n.id === entry.from),\n );\n if (source === undefined || locate(s, id) !== undefined) return;\n base = withLane(base, source[0], withoutNotice(source[1], entry.from));\n }\n const lane = laneOf(base, protocol);\n try {\n setRecord(\n s,\n withLane(\n base,\n protocol,\n withOutbox(lane, placed(outboxOf(lane), stored, entry)),\n ),\n );\n } catch (error) {\n if (!isQuota(error)) throw error;\n // The update stays unacked for the next mount.\n if (entry.from !== undefined) s.skipped.add(entry.from);\n settleReleases(s, id, { ok: false, failure: QUOTA });\n return;\n }\n s.mountIds.delete(id);\n reorder(s, protocol);\n s.notify();\n };\n const done = () => {\n wake(s);\n void pump(s);\n };\n if (!s.shared) {\n run();\n done();\n } else background(transact(s, run).then(done));\n return id;\n};\n\n// One sharer at a time runs the handler; the update leaves the record only\n// once it resolved, so a crash mid-handler redelivers it.\nconst nextNotice = (s: Session) => {\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const found = (lane.inbox ?? []).find((n) => !s.skipped.has(n.id));\n if (found) return { protocol, found };\n }\n return undefined;\n};\n\nconst withoutNotice = (\n lane: StatewireClient.SessionLane,\n id: string,\n): StatewireClient.SessionLane => {\n const inbox = (lane.inbox ?? []).filter((n) => n.id !== id);\n const { inbox: _inbox, ...rest } = lane;\n return inbox.length > 0 ? { ...rest, inbox } : rest;\n};\n\nconst ack = (s: Session, protocol: string, id: string) => {\n const lane = laneOf(s.record, protocol);\n if (s.skipped.has(id) || !lane.inbox?.some((n) => n.id === id)) return;\n setRecord(s, withLane(s.record, protocol, withoutNotice(lane, id)));\n};\n\nconst deliver = (s: Session) => {\n const handler = s.onSettled;\n // Handlers get ctx.state: delivery waits for the first hello.\n if (\n handler === undefined ||\n s.delivering ||\n !s.running ||\n !s.hydrated ||\n !s.sessionKnown\n )\n return;\n if (nextNotice(s) === undefined) return;\n s.delivering = true;\n const run = async () => {\n for (;;) {\n if (s.shared) await transact(s, () => {});\n else await null;\n const next = nextNotice(s);\n if (next === undefined || !s.running) return;\n const { protocol, found } = next;\n try {\n await handler(updateOf(protocol, found));\n } catch (error) {\n console.error(\n \"statewire: onCommandChange threw on a settled update; it stays for the next mount\",\n error,\n );\n s.skipped.add(found.id);\n continue;\n }\n if (s.shared) await transact(s, () => ack(s, protocol, found.id));\n else ack(s, protocol, found.id);\n s.notify();\n }\n };\n const locked = s.store.notifyLock ? s.store.notifyLock(run) : run();\n locked.then(\n () => {\n s.delivering = false;\n deliver(s);\n },\n (error: unknown) => {\n s.delivering = false;\n console.error(\"statewire: settled update delivery stopped\", error);\n },\n );\n};\n\nconst enqueue = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n options?: EnqueueOptions,\n) => {\n if (!s.shared) {\n enqueueInner(s, command, params, resolve, reject, options);\n wake(s);\n void pump(s);\n return;\n }\n void transact(s, () => {\n // A send queued behind the lock before this tab unmounted still lands in\n // the shared journal: another sharer adopts and replays it.\n if (isFinished(s)) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"stream-gone\" }));\n return;\n }\n enqueueInner(s, command, params, resolve, reject, options);\n }).then(() => {\n wake(s);\n void pump(s);\n }, reject);\n};\n\nconst offered = (s: Session, protocol: string) => {\n const offers = protocolOffers(s.options);\n return offers === \"*\" || offers.some((offer) => offer.name === protocol);\n};\n\nconst sendCommand = (\n s: Session,\n method: string,\n params: readonly unknown[],\n protocol = s.options.protocol ?? DEFAULT_PROTOCOL,\n options?: StatewireClient.InvokeOptions,\n): Promise<unknown> => {\n const negotiated = s.selection\n ? s.selection.protocols.some((p) => p.name === protocol)\n : offered(s, protocol);\n if (!negotiated)\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n if (options?.hold !== undefined && typeof options.hold !== \"boolean\")\n throw new Error(\"statewire: invoke hold must be a boolean\");\n if (!s.hydrated) {\n const result = s.ready!.then(() =>\n sendCommand(s, method, params, protocol, options),\n );\n result.catch(() => {});\n return result;\n }\n if (s.storageError !== undefined) {\n const result = Promise.reject(s.storageError);\n result.catch(() => {});\n return result;\n }\n if (!s.running) {\n return rejectedSend({ fate: \"aborted\", cause: \"unmount\" });\n }\n if (isFinished(s)) {\n return rejectedSend({ fate: \"aborted\", cause: \"stream-gone\" });\n }\n const result = new Promise<unknown>((resolve, reject) => {\n const { params: encoded, meta } = encodeParams(params);\n enqueue(\n s,\n {\n protocol,\n produced: producedOf(s),\n method,\n params: encoded,\n ...(meta !== undefined && { meta }),\n },\n params,\n resolve,\n reject,\n {\n ...(options?.hold && { hold: true }),\n ...(options?.localMeta !== undefined && {\n localMeta: options.localMeta,\n }),\n },\n );\n });\n result.catch(() => {});\n return result;\n};\n\nexport const documentSource = (s: Session): StatewireDocuments.Source => ({\n get: (protocol, key, prefix = s.options.keyPrefixes?.[protocol]) => {\n const mounted = findDocument(s.documents, protocol, key, prefix);\n if (mounted !== undefined) return mounted.value;\n if (!s.documentStore || key === undefined) return undefined;\n const absolute = resolveDocumentKey(key, prefix);\n if (absolute === undefined) return undefined;\n const cached = s.documentStore.load([\n s.documentStore.namespace ?? \"\",\n protocol,\n ...absolute,\n ]);\n if (cached === undefined) return undefined;\n const offers = protocolOffers(s.options);\n const offer =\n offers === \"*\"\n ? s.selection?.protocols.find((p) => p.name === protocol)\n : offers.find((p) => p.name === protocol);\n return offer !== undefined && inRange(cached.version, offer)\n ? cached.value\n : undefined;\n },\n list: () => s.documents.documents,\n subscribe: (listener) => {\n s.documentListeners.add(listener);\n return () => {\n s.documentListeners.delete(listener);\n };\n },\n});\n\nexport const invokeProtocol = (\n s: Session,\n protocol: string,\n method: string,\n params: readonly unknown[],\n options?: StatewireClient.InvokeOptions,\n) => sendCommand(s, method, params, protocol, options);\n\nconst storedCommandCompatible = (\n protocol: string,\n command: StatewireClient.OutboxCommand,\n current: NonNullable<StatewireClient.SessionCommand[\"produced\"]>,\n) => {\n if (\n !command.produced ||\n !inRange(command.produced.wire.version, current.wire)\n )\n return false;\n const previous = command.produced.protocols;\n if (current.protocols === \"*\") return true;\n if (previous === \"*\") return false;\n const produced = previous.find((p) => p.name === protocol);\n const offer = current.protocols.find((p) => p.name === protocol);\n return (\n produced !== undefined &&\n offer !== undefined &&\n inRange(produced.version, offer)\n );\n};\n\nconst validateLanes = (record: StatewireClient.SessionRecord) => {\n if (\n typeof record.lanes !== \"object\" ||\n record.lanes === null ||\n Object.values(record.lanes).some(\n (lane) =>\n !Array.isArray(lane.commands) ||\n (lane.outbox !== undefined && !Array.isArray(lane.outbox)),\n )\n )\n throw new Error(\n \"statewire: session storage loaded a record without command lanes\",\n );\n};\n\nconst loadSessionRecord = (\n store: StatewireClient.SessionStorage,\n options: StatewireSessionOptions,\n) => {\n let stored = store.load();\n if (stored !== null) validateLanes(stored);\n const current = {\n wire: options.wireVersion ?? { version: WIRE_VERSION },\n protocols: protocolOffers(options),\n };\n const compatible = (record: StatewireClient.SessionRecord) =>\n Object.entries(record.lanes).every(([protocol, lane]) =>\n [...lane.commands, ...outboxOf(lane)].every((command) =>\n storedCommandCompatible(protocol, command, current),\n ),\n );\n if (stored !== null && !compatible(stored)) {\n if (!store.migrate)\n throw new Error(\"statewire: stored commands require a storage migration\");\n stored = store.migrate(stored, current);\n if (stored !== null) {\n validateLanes(stored);\n if (!compatible(stored))\n throw new Error(\"statewire: migrated commands are incompatible\");\n store.save(stored);\n }\n }\n const record =\n stored === null\n ? { clientId: newClientId(), lanes: {} }\n : boundInbox(store, stored);\n if (record !== stored) store.save(record);\n return record;\n};\n\nconst storedIds = (record: StatewireClient.SessionRecord) =>\n new Set(\n Object.values(record.lanes).flatMap((lane) => [\n ...lane.commands.map((c) => c.id),\n ...outboxOf(lane).map((c) => c.id),\n ]),\n );\n\nexport const setContext = (\n s: Session,\n protocol: string,\n value: Statewire.Context,\n): void => {\n if (\n s.selection\n ? !s.selection.protocols.some((p) => p.name === protocol)\n : !offered(s, protocol)\n )\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n s.contexts.set(protocol, encodeContext(protocol, value));\n s.dirtyContexts.add(protocol);\n wake(s);\n void pump(s);\n};\n\nexport const useStatewireSession = (\n options: StatewireSessionOptions,\n): Session => {\n const [defaultStore] = useState(createMemorySessionStore);\n const mounted = useContext(SessionStorageContext);\n const documentStore = useContext(DocumentStorageContext);\n if (options.sessionStore !== undefined && mounted !== undefined) {\n throw new Error(\n \"statewire: session storage is set twice — drop the transport's sessionStore or the client's storage.session\",\n );\n }\n const store = options.sessionStore ?? mounted ?? defaultStore;\n if (\n (store.lock === undefined) !== (store.subscribe === undefined) ||\n (store.lock === undefined) !== (store.owner === undefined) ||\n (store.lock === undefined) !== (store.notifyLock === undefined)\n ) {\n throw new Error(\n \"statewire: session storage must provide lock, subscribe, owner and notifyLock together\",\n );\n }\n const [s] = useState((): Session => {\n const record =\n store.ready === undefined\n ? loadSessionRecord(store, options)\n : { clientId: newClientId(), lanes: {} };\n const session: Session = {\n options,\n configuredContext: options.context,\n contexts: new Map(\n Object.entries(options.context ?? {}).map(([protocol, value]) => [\n protocol,\n encodeContext(protocol, value),\n ]),\n ),\n dirtyContexts: new Set(Object.keys(options.context ?? {})),\n attachContexts: new Map(),\n selection: undefined,\n record,\n ctx: {\n beforeAttach: () => persistBeforeSend(session),\n get clientId() {\n return session.record.clientId;\n },\n takeAttachLanes: () => takeAttachLanes(session),\n onHello: (args) => handleHello(session, args),\n onOps: (args) => handleOps(session, args),\n onCmds: (cmds) => handleCmds(session, cmds),\n onRefusal: (syn) => handleRefusal(session, syn),\n onIdle: (level) => setIdle(session, level),\n onDetach: () => handleDetach(session),\n onFinish: (args) => handleFinish(session, args),\n },\n recordPersisted: store.ready === undefined,\n hydrated: store.ready === undefined,\n ready: undefined,\n storageError: undefined,\n persistedRecord: store.ready === undefined ? record : null,\n store,\n documentStore,\n shared:\n store.lock !== undefined\n ? {\n txq: Promise.resolve(),\n syncQueued: false,\n parked: [],\n settled: new Set(),\n notices: [],\n inTx: false,\n unsubscribe: null,\n watched: new Set(),\n abort: null,\n }\n : false,\n ephemeral: false,\n deactivated: false,\n sessionKnown: false,\n durableSeq: {},\n ephemeralSeqs: {},\n resumeAt: 0,\n idle: false,\n onSessionLost: undefined,\n onDeprecatedPath: undefined,\n onSettled: undefined,\n releases: new Map(),\n delivering: false,\n skipped: new Set(),\n views: new WeakMap(),\n onFlush: undefined,\n onDone: undefined,\n mountIds: storedIds(record),\n flushing: null,\n outboxList: [],\n outboxParts: [],\n lanesOnAttach: false,\n attachEntries: new Set(),\n frameFailures: 0,\n pending: [],\n canonical: undefined,\n documentListeners: new Set(),\n documents: { mode: null, documents: new Map() },\n lastPublished: undefined,\n changed: [],\n source: {\n snapshot: () => session.canonical,\n takeChanged: () => {\n const changed = session.changed;\n session.changed = [];\n return changed;\n },\n setOnChange: (listener) => {\n session.notify = listener ?? (() => {});\n },\n },\n attach: \"detached\",\n attachEpoch: 0,\n running: false,\n pumping: false,\n transport: null,\n waiters: [],\n lifecycle: null,\n notify: () => {},\n commands: createMethodProxy((method, params) =>\n sendCommand(session, method, params),\n ),\n };\n if (store.ready !== undefined) {\n session.ready = store.ready.then(() => {\n session.record = loadSessionRecord(store, session.options);\n session.mountIds = storedIds(session.record);\n session.recordPersisted = true;\n session.hydrated = true;\n if (session.running) session.notify();\n });\n session.ready = session.ready.catch((cause: unknown) => {\n const error = wrapStorageError(cause);\n session.storageError = error;\n session.transport?.storageFailed(error);\n throw error;\n });\n session.ready.catch(() => {});\n }\n bindCommandsHost(session.commands, {\n setListener: (listener) => {\n session.lifecycle = listener;\n },\n });\n return session;\n });\n if ((store.lock !== undefined) !== (s.shared !== false)) {\n throw new Error(\n \"statewire: session storage changed sharedness across renders — lock/subscribe must be present from the first render or never\",\n );\n }\n useEffect(() => {\n if (s.configuredContext === options.context) return;\n s.configuredContext = options.context;\n for (const [protocol, value] of Object.entries(options.context ?? {}))\n setContext(s, protocol, value);\n }, [s, options.context]);\n s.options = options;\n s.store = store;\n s.documentStore = documentStore;\n s.onSessionLost = options.onSessionLost;\n s.onDeprecatedPath = options.onDeprecatedPath;\n s.onSettled = options.onSettled;\n s.onFlush = options.onFlush;\n s.onDone = options.onDone;\n const keyPrefixes = JSON.stringify(options.keyPrefixes);\n useEffect(() => {\n cacheDocuments(s);\n }, [s, documentStore, keyPrefixes]);\n useEffect(\n () =>\n documentStore?.subscribe?.(() => {\n for (const listener of s.documentListeners) listener();\n }),\n [s, documentStore],\n );\n useEffect(() => {\n start(s);\n return () => stop(s);\n }, [s]);\n return s;\n};\n\nexport { setTransport };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","names":["encodeContext","wrapStorageError","DEFAULT_PROTOCOL","GAP_FILL_VERSION","WIRE_VERSION","protocolOffers","inRange","StatewireProtocol","applyDocumentOps","mainDocument","findDocument","resolveDocumentKey","StatewireDocuments","useContext","useEffect","useState","StatewirePath","MAX_COMMANDS_PER_FRAME","TERMINAL","StatewireCmd","StatewireSyn","encodeParams","reviveResponse","reviveValue","bindCommandsHost","CommandsInvocation","CommandsListener","Statewire","StatewireClient","DocumentStorageContext","SessionStorageContext","createMemorySessionStore","backoff","retryHint","createMethodProxy","randomId","newClientId","StatewireSendError","RemoteLink","StatewireFrame","StatewireRemoteProps","WireCommand","protocol","produced","NonNullable","SessionCommand","method","params","meta","Invocation","K","Pending","id","seq","command","inv","adopted","by","away","stale","attempted","posted","applied","resolve","payload","reject","error","protocolError","message","Error","rejectedSend","failure","SendFailure","Promise","result","catch","AttachState","StatewireSessionOptions","Options","context","Readonly","Record","Context","sessionStore","SessionStorage","onSessionLost","OnSessionLost","onDeprecatedPath","OnDeprecatedPath","onSettled","OnSettled","onFlush","OnFlush","canOvertake","CanOvertake","onDone","Shared","txq","syncQueued","parked","verdict","SessionVerdict","settled","Set","notices","Notice","inTx","unsubscribe","watched","abort","AbortController","Patch","held","localMeta","value","Flushing","ids","ReadonlySet","patches","Map","removed","Waiter","Session","options","configuredContext","contexts","ReturnType","dirtyContexts","attachContexts","selection","Selection","record","SessionRecord","ctx","recordPersisted","hydrated","ready","storageError","persistedRecord","store","documentStore","Storage","shared","ephemeral","deactivated","sessionKnown","durableSeq","ephemeralSeqs","resumeAt","idle","releases","delivering","skipped","views","WeakMap","OutboxEntry","mountIds","flushing","outboxList","outboxParts","lanesOnAttach","attachEntries","frameFailures","recheck","setTimeout","rechecks","watermarks","count","pending","canonical","documentListeners","documents","State","lastPublished","changed","source","StateSource","attach","attachEpoch","running","pumping","transport","waiters","lifecycle","notify","commands","EMPTY_LANE","SessionLane","nextSeq","laneOf","Object","hasOwn","lanes","withLane","lane","isEphemeral","s","protocols","some","p","name","durableSeqOf","Stamped","isStamped","undefined","isOutboxed","laneEntries","filter","sortPending","sort","a","b","Infinity","RemovalMark","marks","added","c","owner","map","next","length","withOutbox","outbox","OutboxCommand","_outbox","rest","outboxOf","onChange","stamp","unstamp","follow","stored","dirty","paramsOf","structuredClone","dropPending","q","onCovered","publish","wake","waiter","waitForWake","r","push","sleepUntilWake","delayMs","clearTimeout","timer","w","storageFailed","cause","entry","setRecord","save","isQuota","toOutbox","_protocol","ts","const","toStored","backlog","mergeBacklog","own","foreign","durableLanes","keys","MAX_PARKED_VERDICTS","syncBacklogInner","noticeInner","splice","clear","parkedHere","v","flatMap","find","has","parkedSeqs","kept","verdicts","slice","unchanged","every","i","syncBacklog","transact","fn","run","then","lock","readStored","refresh","watchOwners","persistence","flush","read","load","clientId","adoptReset","boundInbox","reconcileLocal","followReleases","me","queued","stamped","mark","m","settleEntry","ok","fate","_removed","left","locate","entries","settleReleases","outcome","get","delete","values","notice","inbox","n","signal","offered","add","whenGone","transactBackground","adoptOwner","pump","gone","orphans","_owner","mine","adoptedPending","connection","reconnect","onStart","done","setIdle","level","cover","onApplied","MAX_INBOX","Outcome","updateOf","StoredSettled","CommandUpdate","status","dropped","sorted","x","y","cut","onEvict","reason","toNotice","Omit","lostNotice","LOST","withNotices","known","deliver","SettleMode","mode","durable","onSettle","type","settleAll","detach","batch","detachFailure","predecessorLost","settleLost","settleRemoved","requeue","survivors","old","enqueueInner","hold","rebaseRecord","adopt","includes","previous","current","resetRecord","ephemeralDetach","detachEphemeralLanes","rejectedFailure","cmd","code","outcomeOf","String","settleVerdict","TERMINAL_CMD_TYPES","parkVerdict","handleCmd","dur","watermark","Math","max","consumeVerdicts","consumed","forwarded","_id","size","handleCmds","cmds","ingestOps","ops","applicationProtocols","fromEntries","d","key","JSON","stringify","changedPaths","cacheDocuments","document","keyPrefixes","version","namespace","publishIngested","listener","sessionLostInner","seqWm","kind","console","warn","stamps","demote","demoted","waiting","local","above","set","moved","_seq","recheckLater","gapFill","selectionOf","syn","handleHello","attached","reconcile","flushInner","handleOps","handleRefusal","retry","Date","now","gaps","first","handleDetach","handleFinish","isFinished","Lanes","frame","buildLanes","cmdGate","last","stopped","gated","_produced","resultsCursor","cursors","min","takeAttachLanes","wanted","res","persistBeforeSend","flushable","flushCandidates","queuedInRecord","resumeDelay","epoch","send","built","onPosted","start","subscribe","stop","setTransport","EnqueueOptions","QUOTA","reorder","negotiated","Candidate","viewOf","state","cached","view","laneQueue","bubble","queue","order","free","may","blocked","at","findIndex","o","flushLanes","reasonOf","FlushReason","released","NO_IDS","patched","patch","_held","_released","_meta","_old","plain","candidates","groups","stampedIds","outboxEntries","parts","same","part","OutboxOp","entryOf","applyOutboxOp","op","toPatch","OutboxPatch","k","Array","isArray","outboxOp","background","promise","holdOutbox","releaseOutbox","settleWaiters","removeOutbox","updateOutbox","producedOf","wire","wireVersion","placed","after","before","anchor","index","insertOutbox","OutboxInsert","from","base","l","withoutNotice","nextNotice","found","_inbox","ack","handler","locked","notifyLock","enqueue","offers","offer","sendCommand","InvokeOptions","encoded","documentSource","Source","prefix","mounted","absolute","list","invokeProtocol","storedCommandCompatible","validateLanes","loadSessionRecord","compatible","migrate","storedIds","setContext","useStatewireSession","defaultStore","session","beforeAttach","onHello","args","onOps","onCmds","onRefusal","onIdle","onDetach","onFinish","snapshot","takeChanged","setOnChange","setListener","reviveValue","newClientId"],"sources":["../../src/client/session.ts"],"sourcesContent":["import { encodeContext } from \"../wire/context\";\nimport { wrapStorageError } from \"./storageError\";\nimport {\n DEFAULT_PROTOCOL,\n GAP_FILL_VERSION,\n WIRE_VERSION,\n protocolOffers,\n inRange,\n} from \"../wire/protocol\";\nimport type { StatewireProtocol } from \"../wire/protocol\";\nimport {\n applyDocumentOps,\n mainDocument,\n findDocument,\n resolveDocumentKey,\n} from \"../wire/documents\";\nimport type { StatewireDocuments } from \"../wire/documents\";\nimport { useContext, useEffect, useState } from \"react\";\n\nimport type { StatewirePath } from \"../wire/ops\";\nimport { MAX_COMMANDS_PER_FRAME } from \"../wire/limits\";\nimport { TERMINAL } from \"./connection\";\nimport type { StatewireCmd, StatewireSyn } from \"./connection\";\nimport { encodeParams, reviveResponse, reviveValue } from \"../wire/meta\";\nimport { bindCommandsHost } from \"../host/host\";\nimport type { CommandsInvocation, CommandsListener } from \"../host/host\";\nimport type { Statewire } from \"../types\";\nimport type { StatewireClient } from \"../statewire\";\nimport {\n DocumentStorageContext,\n SessionStorageContext,\n createMemorySessionStore,\n} from \"./sessionStore\";\nimport { backoff, retryHint } from \"./timing\";\nimport { createMethodProxy } from \"../util/methodProxy\";\nimport { randomId as newClientId } from \"../util/randomId\";\nimport { StatewireSendError } from \"../types\";\nimport type {\n RemoteLink,\n StatewireFrame,\n StatewireRemoteProps,\n} from \"../transports/sse\";\n\ntype WireCommand = {\n protocol: string;\n produced?: NonNullable<StatewireClient.SessionCommand[\"produced\"]>;\n method: string;\n params: unknown[];\n meta?: unknown;\n};\n\ntype Invocation = {\n -readonly [K in keyof CommandsInvocation]: CommandsInvocation[K];\n};\n\ntype Pending = {\n readonly id: string;\n /** Unset while in the outbox, or while another sharer owns its stamp. */\n seq: number | undefined;\n command: WireCommand;\n readonly inv: Invocation;\n /** Enqueued by another sharer: this client holds no promise for it. */\n readonly adopted: boolean;\n /** The enqueuing sharer's owner id (shared storage only). */\n readonly by: string | undefined;\n /** Stamped by another sharer; settles from a verdict parked under its id. */\n away: boolean;\n /** Stamped against a watermark this attach has not confirmed: waits for the next hello. */\n stale: boolean;\n /** A send carrying this statement may have reached the server. */\n attempted: boolean;\n /** In the resend queue when false. */\n posted: boolean;\n /** The server acknowledged admission; the terminal verdict is still due. */\n applied: boolean;\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\nconst protocolError = (message: string): never => {\n throw new Error(`statewire: protocol error: ${message}`);\n};\n\nconst rejectedSend = (\n failure: StatewireClient.SendFailure,\n): Promise<unknown> => {\n const result = Promise.reject<unknown>(new StatewireSendError(failure));\n result.catch(() => {});\n return result;\n};\n\ntype AttachState = \"detached\" | \"attached\" | \"finished\";\n\nexport type StatewireSessionOptions = StatewireProtocol.Options & {\n context?: Readonly<Record<string, Statewire.Context>>;\n sessionStore?: StatewireClient.SessionStorage | undefined;\n onSessionLost?: StatewireClient.OnSessionLost | undefined;\n onDeprecatedPath?: StatewireClient.OnDeprecatedPath | undefined;\n onSettled?: StatewireClient.OnSettled | undefined;\n onFlush?: StatewireClient.OnFlush | undefined;\n canOvertake?:\n | Readonly<Record<string, StatewireClient.CanOvertake>>\n | undefined;\n onDone?: (() => void) | undefined;\n};\n\ntype Shared = {\n txq: Promise<void>;\n syncQueued: boolean;\n parked: { protocol: string; verdict: StatewireClient.SessionVerdict }[];\n /** Own commands settled since the last backlog sync: verdicts parked for them are moot. */\n settled: Set<string>;\n /** Settled updates waiting for the next backlog sync. */\n notices: Notice[];\n /** A locked transaction is running its mutation. */\n inTx: boolean;\n unsubscribe: (() => void) | null;\n /** Owners whose departure this sharer awaits. */\n watched: Set<string>;\n abort: AbortController | null;\n};\n\ntype Patch = {\n held?: boolean;\n localMeta?: { value: unknown };\n params?: readonly unknown[];\n};\n\ntype Flushing = {\n ids: ReadonlySet<string>;\n patches: Map<string, Patch>;\n removed: Set<string>;\n};\n\ntype Waiter = {\n resolve: (payload: unknown) => void;\n reject: (error: unknown) => void;\n};\n\ntype Session = {\n options: StatewireSessionOptions;\n configuredContext: StatewireSessionOptions[\"context\"];\n contexts: Map<string, ReturnType<typeof encodeContext>>;\n dirtyContexts: Set<string>;\n attachContexts: Map<string, ReturnType<typeof encodeContext>>;\n selection: StatewireProtocol.Selection | undefined;\n record: StatewireClient.SessionRecord;\n ctx: StatewireRemoteProps;\n recordPersisted: boolean;\n hydrated: boolean;\n ready: Promise<void> | undefined;\n storageError: unknown;\n persistedRecord: StatewireClient.SessionRecord | null;\n store: StatewireClient.SessionStorage;\n documentStore: StatewireDocuments.Storage | undefined;\n shared: Shared | false;\n /** Every selected lane is ephemeral: the record dies with the attach. */\n ephemeral: boolean;\n /** An ephemeral record died with its attach: the storage is off for good. */\n deactivated: boolean;\n sessionKnown: boolean;\n durableSeq: Record<string, number>;\n /** Ephemeral lane clocks: restart at 1 on every attach. */\n ephemeralSeqs: Record<string, number>;\n resumeAt: number;\n idle: boolean;\n onSessionLost: StatewireClient.OnSessionLost | undefined;\n onDeprecatedPath: StatewireClient.OnDeprecatedPath | undefined;\n onSettled: StatewireClient.OnSettled | undefined;\n onFlush: StatewireClient.OnFlush | undefined;\n onDone: (() => void) | undefined;\n /** `outbox.release` promises by entry id. */\n releases: Map<string, Waiter[]>;\n delivering: boolean;\n /** Notices whose handler threw on this mount. */\n skipped: Set<string>;\n views: WeakMap<object, StatewireClient.OutboxEntry>;\n /** Outbox and stamped ids stored before this client mounted. */\n mountIds: Set<string>;\n flushing: Flushing | null;\n outboxList: readonly StatewireClient.OutboxEntry[];\n outboxParts: readonly unknown[];\n lanesOnAttach: boolean;\n attachEntries: ReadonlySet<Pending>;\n frameFailures: number;\n /** A later hello decides stamps this one could not: another live sharer's stamp sat below them. */\n recheck: ReturnType<typeof setTimeout> | undefined;\n /** Hellos in a row that left stamps waiting at the same watermarks: the recheck backs off. */\n rechecks: { watermarks: string; count: number };\n pending: Pending[];\n canonical: unknown;\n documentListeners: Set<() => void>;\n documents: StatewireDocuments.State;\n lastPublished: unknown;\n changed: StatewirePath[];\n source: Statewire.StateSource;\n attach: AttachState;\n attachEpoch: number;\n running: boolean;\n pumping: boolean;\n transport: RemoteLink | null;\n waiters: (() => void)[];\n lifecycle: CommandsListener | null;\n notify: () => void;\n commands: Record<string, (...params: unknown[]) => Promise<unknown>>;\n};\n\nconst EMPTY_LANE: StatewireClient.SessionLane = { nextSeq: 1, commands: [] };\n\nconst laneOf = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n): StatewireClient.SessionLane =>\n Object.hasOwn(record.lanes, protocol) ? record.lanes[protocol]! : EMPTY_LANE;\n\nconst withLane = (\n record: StatewireClient.SessionRecord,\n protocol: string,\n lane: StatewireClient.SessionLane,\n): StatewireClient.SessionRecord => ({\n ...record,\n lanes: { ...record.lanes, [protocol]: lane },\n});\n\nconst isEphemeral = (s: Session, protocol: string) =>\n s.selection?.protocols.some(\n (p) => p.name === protocol && p.record === \"ephemeral\",\n ) ?? false;\n\nconst durableSeqOf = (s: Session, protocol: string) =>\n Object.hasOwn(s.durableSeq, protocol) ? s.durableSeq[protocol]! : 0;\n\ntype Stamped = Pending & { seq: number };\n\nconst isStamped = (p: Pending): p is Stamped => p.seq !== undefined;\n\nconst isOutboxed = (p: Pending) => p.seq === undefined && !p.away;\n\n/** This client's stamped entries on the lane. */\nconst laneEntries = (s: Session, protocol: string): Stamped[] =>\n s.pending.filter(\n (p): p is Stamped => isStamped(p) && p.command.protocol === protocol,\n );\n\nconst sortPending = (s: Session) => {\n s.pending.sort((a, b) => (a.seq ?? Infinity) - (b.seq ?? Infinity) || 0);\n};\n\ntype RemovalMark = NonNullable<StatewireClient.SessionLane[\"removed\"]>[number];\n\n// A removal another sharer must hear about: the marker lives until its\n// enqueuer consumes it or is gone.\nconst marks = (\n s: Session,\n lane: StatewireClient.SessionLane,\n removed: readonly { id: string; by?: string | undefined }[],\n failure?: StatewireClient.SendFailure,\n): { removed?: readonly RemovalMark[] } => {\n const added = removed\n .filter((c) => c.by !== undefined && c.by !== s.store.owner?.id)\n .map((c) => ({ id: c.id, by: c.by!, ...(failure && { failure }) }));\n const next = [...(lane.removed ?? []), ...added];\n return next.length > 0 ? { removed: next } : {};\n};\n\nconst withOutbox = (\n lane: StatewireClient.SessionLane,\n outbox: readonly StatewireClient.OutboxCommand[],\n): StatewireClient.SessionLane => {\n const { outbox: _outbox, ...rest } = lane;\n return outbox.length > 0 ? { ...rest, outbox } : rest;\n};\n\nconst outboxOf = (lane: StatewireClient.SessionLane) => lane.outbox ?? [];\n\nconst changed = (s: Session, p: Pending) => s.lifecycle?.onChange?.(p.inv);\n\nconst stamp = (s: Session, p: Pending, seq: number) => {\n p.seq = seq;\n p.inv.seq = seq;\n delete p.inv.held;\n p.away = false;\n p.attempted = false;\n p.posted = false;\n changed(s, p);\n};\n\nconst unstamp = (s: Session, p: Pending) => {\n p.seq = undefined;\n delete p.inv.seq;\n p.away = false;\n p.attempted = false;\n p.posted = false;\n changed(s, p);\n};\n\n// The pending invocation follows its stored entry: hold, local meta, params.\nconst follow = (\n s: Session,\n p: Pending,\n stored: StatewireClient.OutboxCommand,\n) => {\n let dirty = false;\n if ((p.inv.held === true) !== (stored.held === true)) {\n if (stored.held) p.inv.held = true;\n else delete p.inv.held;\n dirty = true;\n }\n if (p.inv.localMeta !== stored.localMeta) {\n if (stored.localMeta === undefined) delete p.inv.localMeta;\n else p.inv.localMeta = stored.localMeta;\n dirty = true;\n }\n if (p.command.params !== stored.params) {\n p.command = {\n ...p.command,\n params: stored.params,\n ...(stored.meta === undefined ? {} : { meta: stored.meta }),\n };\n if (stored.meta === undefined) delete p.command.meta;\n p.inv.params = paramsOf(stored);\n dirty = true;\n }\n if (dirty) changed(s, p);\n};\n\nconst paramsOf = (stored: { params: unknown[]; meta?: unknown }) =>\n stored.meta === undefined\n ? stored.params\n : (reviveValue(structuredClone(stored.params), stored.meta) as unknown[]);\n\nconst dropPending = (s: Session, p: Pending) => {\n s.pending = s.pending.filter((q) => q !== p);\n s.lifecycle?.onCovered?.(p.inv);\n};\n\nconst publish = (s: Session) => {\n if (s.canonical === s.lastPublished) return;\n s.lastPublished = s.canonical;\n s.notify();\n};\n\nconst wake = (s: Session) => {\n const waiters = s.waiters;\n s.waiters = [];\n for (const waiter of waiters) waiter();\n};\n\nconst waitForWake = (s: Session) => new Promise<void>((r) => s.waiters.push(r));\n\nconst sleepUntilWake = (s: Session, delayMs: number) =>\n new Promise<void>((resolve) => {\n const waiter = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n s.waiters = s.waiters.filter((w) => w !== waiter);\n resolve();\n }, delayMs);\n s.waiters.push(waiter);\n });\n\nconst storageFailed = (s: Session, cause: unknown) => {\n const error = wrapStorageError(cause);\n s.storageError = error;\n for (const entry of s.pending) entry.reject(error);\n s.transport?.storageFailed(error);\n};\n\nconst setRecord = (s: Session, record: StatewireClient.SessionRecord) => {\n if (!s.deactivated) {\n try {\n s.store.save(record);\n } catch (cause) {\n if (isQuota(cause)) throw cause;\n storageFailed(s, cause);\n throw s.storageError;\n }\n }\n s.record = record;\n s.notify();\n};\n\nconst toOutbox = (p: Pending): StatewireClient.OutboxCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return {\n id: p.id,\n ...command,\n ts: p.inv.ts,\n ...(p.by !== undefined && { by: p.by }),\n ...(p.inv.held && { held: true as const }),\n ...(p.inv.localMeta !== undefined && { localMeta: p.inv.localMeta }),\n };\n};\n\nconst toStored = (s: Session, p: Stamped): StatewireClient.SessionCommand => {\n const { protocol: _protocol, ...command } = p.command;\n return {\n id: p.id,\n seq: p.seq,\n ...(s.store.owner !== undefined && { owner: s.store.owner.id }),\n ...(p.by !== undefined && { by: p.by }),\n ...command,\n ts: p.inv.ts,\n ...(p.inv.localMeta !== undefined && { localMeta: p.inv.localMeta }),\n };\n};\n\nconst backlog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] =>\n laneEntries(s, protocol).map((p) => toStored(s, p));\n\nconst mergeBacklog = (\n s: Session,\n protocol: string,\n): StatewireClient.SessionCommand[] => {\n const own = backlog(s, protocol);\n if (!s.shared) return own;\n // Another sharer's stamp stays until its owner settles it: the record is\n // where an enqueuer maps the seq back to its command.\n const foreign = laneOf(s.record, protocol).commands.filter(\n (c) => c.owner !== s.store.owner?.id,\n );\n return [...foreign, ...own].sort((a, b) => a.seq - b.seq);\n};\n\nconst durableLanes = (s: Session): string[] => [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending\n .map((p) => p.command.protocol)\n .filter((protocol) => !isEphemeral(s, protocol)),\n ]),\n];\n\nconst MAX_PARKED_VERDICTS = 64;\n\n// Storage holds what a reload must resend: a command leaves at its dur, at a\n// server verdict, or at a record reset — never at a local channel death.\nconst syncBacklogInner = (s: Session) => {\n if (s.shared && s.shared.notices.length > 0)\n noticeInner(s, s.shared.notices.splice(0));\n const parked = s.shared ? s.shared.parked.splice(0) : [];\n const settled = s.shared ? new Set(s.shared.settled) : new Set<string>();\n if (s.shared) s.shared.settled.clear();\n let lanes = s.record.lanes;\n for (const protocol of durableLanes(s)) {\n const lane = laneOf(s.record, protocol);\n // The record maps a parked seq to its command while it still holds the\n // stamp; the enqueuer finds the verdict by that id.\n const parkedHere = parked\n .filter((v) => v.protocol === protocol)\n .flatMap(({ verdict }) => {\n const id =\n verdict.id ?? lane.commands.find((c) => c.seq === verdict.seq)?.id;\n // No stamp left to map it: its owner already settled the command.\n if (id === undefined || settled.has(id)) return [];\n return [{ ...verdict, id }];\n });\n const parkedSeqs = new Set(parkedHere.map((v) => v.seq));\n const commands = mergeBacklog(s, protocol).filter(\n (c) => !parkedSeqs.has(c.seq),\n );\n const kept = (lane.verdicts ?? []).filter(\n (v) => v.id === undefined || !settled.has(v.id),\n );\n const verdicts =\n parkedHere.length > 0 || kept.length !== (lane.verdicts ?? []).length\n ? [...kept, ...parkedHere].slice(-MAX_PARKED_VERDICTS)\n : lane.verdicts;\n const unchanged =\n verdicts === lane.verdicts &&\n commands.length === lane.commands.length &&\n commands.every((c, i) => c.seq === lane.commands[i]!.seq);\n if (unchanged) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands,\n ...(verdicts !== undefined && { verdicts }),\n },\n };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n};\n\nconst syncBacklog = (s: Session) => {\n const shared = s.shared;\n if (!shared) return syncBacklogInner(s);\n if (shared.syncQueued) return;\n shared.syncQueued = true;\n void transact(s, () => {\n shared.syncQueued = false;\n syncBacklogInner(s);\n }).catch(() => {\n shared.syncQueued = false;\n });\n};\n\n// Every record mutation over shared storage is a locked read-modify-write.\nconst transact = (s: Session, fn: () => void): Promise<void> => {\n if (!s.shared || s.deactivated) {\n fn();\n return Promise.resolve();\n }\n const shared = s.shared;\n const run = shared.txq.then(() =>\n s.store.lock!(async () => {\n const stored = await readStored(s);\n shared.inTx = true;\n try {\n refresh(s, stored);\n fn();\n } finally {\n shared.inTx = false;\n }\n watchOwners(s);\n s.notify();\n const persistence = s.store.flush?.();\n if (persistence) await persistence;\n }),\n );\n const result = run.catch((cause: unknown) => {\n storageFailed(s, cause);\n throw s.storageError;\n });\n shared.txq = result.then(\n () => {},\n () => {},\n );\n return result;\n};\n\nconst readStored = async (s: Session) =>\n s.store.read ? await s.store.read() : s.store.load();\n\n// Under the lock: the stored record is the truth about which sharer stamped\n// what; this client's entries follow it by id.\nconst refresh = (s: Session, stored: StatewireClient.SessionRecord | null) => {\n if (stored !== null && stored.clientId !== s.record.clientId) {\n adoptReset(s, stored);\n return;\n }\n if (stored !== null) s.record = boundInbox(s.store, stored);\n reconcileLocal(s);\n followReleases(s);\n};\n\nconst reconcileLocal = (s: Session) => {\n const me = s.store.owner?.id;\n for (const p of [...s.pending]) {\n const protocol = p.command.protocol;\n if (isEphemeral(s, protocol)) continue;\n const lane = laneOf(s.record, protocol);\n const queued = outboxOf(lane).find((c) => c.id === p.id);\n const stamped = lane.commands.find((c) => c.id === p.id);\n if (queued) {\n if (p.seq !== undefined || p.away) {\n if (p.adopted) {\n dropPending(s, p);\n continue;\n }\n unstamp(s, p);\n }\n follow(s, p, queued);\n } else if (stamped && stamped.owner !== me) {\n if (p.adopted) dropPending(s, p);\n else if (!p.away) {\n unstamp(s, p);\n p.away = true;\n }\n } else if (stamped) {\n if (p.seq !== stamped.seq) stamp(s, p, stamped.seq);\n } else if (!p.adopted && (isOutboxed(p) || p.away)) {\n const mark = lane.removed?.find((m) => m.id === p.id);\n if (mark === undefined) {\n p.away = true;\n continue;\n }\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(\n s,\n p,\n {\n ok: false,\n failure: mark.failure ?? { fate: \"aborted\", cause: \"removed\" },\n },\n mark.failure ? \"noticed\" : \"memory\",\n );\n const { removed: _removed, ...rest } = lane;\n const left = lane.removed!.filter((m) => m.id !== p.id);\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...rest,\n ...(left.length > 0 && { removed: left }),\n }),\n );\n }\n }\n};\n\nconst locate = (\n s: Session,\n id: string,\n):\n | { protocol: string; stored: StatewireClient.OutboxCommand }\n | { protocol: string; stored?: undefined }\n | undefined => {\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const stored = outboxOf(lane).find((c) => c.id === id);\n if (stored) return { protocol, stored };\n if (lane.commands.some((c) => c.id === id)) return { protocol };\n }\n const p = s.pending.find((q) => q.id === id);\n if (p === undefined) return undefined;\n return isOutboxed(p) && isEphemeral(s, p.command.protocol)\n ? { protocol: p.command.protocol, stored: toOutbox(p) }\n : { protocol: p.command.protocol };\n};\n\nconst settleReleases = (\n s: Session,\n id: string,\n outcome:\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure },\n) => {\n const waiters = s.releases.get(id);\n if (waiters === undefined) return;\n s.releases.delete(id);\n for (const waiter of waiters) {\n if (outcome.ok) waiter.resolve(outcome.payload);\n else waiter.reject(new StatewireSendError(outcome.failure));\n }\n};\n\n// A release whose command another sharer settled: the record shows only that\n// it left, failed (a notice) or was taken unsent (a mark).\nconst followReleases = (s: Session) => {\n for (const id of [...s.releases.keys()]) {\n if (locate(s, id) !== undefined) continue;\n const lanes = Object.values(s.record.lanes);\n const notice = lanes\n .flatMap((lane) => lane.inbox ?? [])\n .find((n) => n.id === id);\n const mark = lanes\n .flatMap((lane) => lane.removed ?? [])\n .find((m) => m.id === id);\n const failure = notice?.failure ?? mark?.failure;\n settleReleases(\n s,\n id,\n failure\n ? { ok: false, failure }\n : {\n ok: true,\n payload:\n notice?.result === undefined\n ? undefined\n : paramsOf({\n params: notice.result.value,\n meta: notice.result.meta,\n })[0],\n },\n );\n }\n};\n\n// A sharer that stamped commands and left: once its owner lock frees,\n// another sharer takes its stamps over and reattaches, so the hello's\n// watermark settles them.\nconst watchOwners = (s: Session) => {\n const owner = s.store.owner;\n const shared = s.shared;\n if (!owner || !shared || !shared.abort || s.deactivated) return;\n const signal = shared.abort.signal;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (!offered(s, protocol)) continue;\n for (const { owner: id } of lane.commands) {\n if (id === undefined || id === owner.id || shared.watched.has(id))\n continue;\n shared.watched.add(id);\n owner.whenGone(id, signal).then(\n () => {\n if (!s.running) return;\n transactBackground(\n s,\n () => adoptOwner(s, id),\n () => {\n wake(s);\n void pump(s);\n },\n );\n },\n () => {},\n );\n }\n }\n};\n\nconst adoptOwner = (s: Session, gone: string | undefined) => {\n const me = s.store.owner?.id;\n let lanes = s.record.lanes;\n let adopted = false;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n if (gone !== undefined && lane.removed?.some((m) => m.by === gone)) {\n const { removed: _removed, ...rest } = laneOf(\n { ...s.record, lanes },\n protocol,\n );\n const left = lane.removed.filter((m) => m.by !== gone);\n lanes = {\n ...lanes,\n [protocol]: { ...rest, ...(left.length > 0 && { removed: left }) },\n };\n }\n if (!offered(s, protocol)) continue;\n const orphans = lane.commands.filter(\n (c) =>\n c.owner === gone &&\n (me === undefined || c.owner !== me) &&\n !s.pending.some((p) => p.id === c.id && p.seq === c.seq),\n );\n if (orphans.length === 0) continue;\n adopted = true;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.map((c) => {\n if (c.owner !== gone) return c;\n const { owner: _owner, ...rest } = c;\n return me === undefined ? rest : { ...rest, owner: me };\n }),\n },\n };\n for (const command of orphans) {\n const mine = s.pending.find((p) => p.id === command.id);\n if (mine) {\n stamp(s, mine, command.seq);\n mine.attempted = true;\n mine.stale = true;\n } else s.pending.push(adoptedPending(s, protocol, command));\n }\n }\n if (!adopted) return;\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n sortPending(s);\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\n};\n\nconst adoptedPending = (\n s: Session,\n protocol: string,\n stored: StatewireClient.SessionCommand,\n): Pending => {\n const { seq, id, ts, owner: _owner, by, ...command } = stored;\n const params =\n command.meta === undefined\n ? command.params\n : (reviveValue(\n structuredClone(command.params),\n command.meta,\n ) as unknown[]);\n const entry: Pending = {\n id,\n seq,\n command: { protocol, ...command },\n inv: {\n protocol,\n method: command.method,\n params,\n ts,\n seq,\n id,\n clientId: s.record.clientId,\n },\n adopted: true,\n by,\n away: false,\n stale: true,\n attempted: true,\n posted: false,\n applied: false,\n resolve: () => {},\n reject: () => {},\n };\n s.lifecycle?.onStart(entry.inv);\n return entry;\n};\n\nconst transactBackground = (s: Session, fn: () => void, done?: () => void) => {\n void transact(s, fn).then(done, () => {});\n};\n\nconst setIdle = (s: Session, level: boolean) => {\n if (level === s.idle) return;\n s.idle = level;\n s.notify();\n if (level) s.onDone?.();\n};\n\nconst cover = (s: Session, entry: Pending) => {\n if (entry.applied) return;\n entry.applied = true;\n s.lifecycle?.onApplied(entry.inv);\n s.lifecycle?.onCovered?.(entry.inv);\n};\n\nexport const MAX_INBOX = 256;\n\ntype Outcome =\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure };\n\nconst updateOf = (\n protocol: string,\n stored: StatewireClient.StoredSettled,\n): Statewire.CommandUpdate => ({\n protocol,\n id: stored.id,\n method: stored.method,\n params: paramsOf(stored) as never[],\n ...(stored.seq !== undefined && { seq: stored.seq }),\n status: \"settled\",\n ...(stored.result !== undefined && {\n result: paramsOf({\n params: stored.result.value,\n meta: stored.result.meta,\n })[0],\n }),\n ...(stored.failure !== undefined && { failure: stored.failure }),\n ...(stored.localMeta !== undefined && { localMeta: stored.localMeta }),\n});\n\n// The inbox keeps the newest notices; the rest are reported as evicted.\nconst boundInbox = (\n store: StatewireClient.SessionStorage,\n record: StatewireClient.SessionRecord,\n): StatewireClient.SessionRecord => {\n let lanes = record.lanes;\n const dropped: Statewire.CommandUpdate[] = [];\n for (const [protocol, lane] of Object.entries(lanes)) {\n const inbox = lane.inbox;\n if (inbox === undefined || inbox.length <= MAX_INBOX) continue;\n const sorted = [...inbox].sort((x, y) => x.ts - y.ts);\n const cut = sorted.length - MAX_INBOX;\n dropped.push(...sorted.slice(0, cut).map((n) => updateOf(protocol, n)));\n lanes = { ...lanes, [protocol]: { ...lane, inbox: sorted.slice(cut) } };\n }\n if (dropped.length > 0) store.onEvict?.({ reason: \"inbox\", dropped });\n return lanes === record.lanes ? record : { ...record, lanes };\n};\n\nconst toNotice = (\n stored: Omit<StatewireClient.SessionCommand, \"seq\"> & { seq?: number },\n outcome: Outcome,\n): StatewireClient.StoredSettled => {\n const result = outcome.ok\n ? encodeParams(outcome.payload === undefined ? [] : [outcome.payload])\n : undefined;\n return {\n id: stored.id,\n method: stored.method,\n params: stored.params,\n ...(stored.meta !== undefined && { meta: stored.meta }),\n ts: stored.ts,\n ...(stored.seq !== undefined && { seq: stored.seq }),\n ...(stored.localMeta !== undefined && { localMeta: stored.localMeta }),\n ...(result !== undefined && {\n result: {\n value: result.params,\n ...(result.meta !== undefined && { meta: result.meta }),\n },\n }),\n ...(!outcome.ok && { failure: outcome.failure }),\n };\n};\n\nconst lostNotice = (\n stored: Omit<StatewireClient.SessionCommand, \"seq\"> & { seq?: number },\n) => toNotice(stored, { ok: false, failure: LOST });\n\nconst LOST = { fate: \"lost\", cause: \"session-lost\" } as const;\n\nconst withNotices = (\n lane: StatewireClient.SessionLane,\n notices: readonly StatewireClient.StoredSettled[],\n): StatewireClient.SessionLane => {\n const known = new Set((lane.inbox ?? []).map((n) => n.id));\n const added = notices.filter((n) => !known.has(n.id));\n return added.length === 0\n ? lane\n : { ...lane, inbox: [...(lane.inbox ?? []), ...added] };\n};\n\n// The settled update lands in the same write that drops the stamp: a reload\n// either resends the command or delivers the update.\ntype Notice = { entry: Stamped; outcome: Outcome };\n\nconst noticeInner = (s: Session, notices: readonly Notice[]) => {\n let record = s.record;\n for (const { entry, outcome } of notices) {\n const protocol = entry.command.protocol;\n const lane = laneOf(record, protocol);\n record = withLane(record, protocol, {\n ...withNotices(lane, [toNotice(toStored(s, entry), outcome)]),\n commands: lane.commands.filter((c) => c.id !== entry.id),\n });\n }\n setRecord(s, boundInbox(s.store, record));\n deliver(s);\n};\n\n// Shared storage: the update rides the next backlog sync's locked write.\nconst notice = (s: Session, entry: Stamped, outcome: Outcome) => {\n if (!s.shared || s.shared.inTx) {\n noticeInner(s, [{ entry, outcome }]);\n return;\n }\n s.shared.notices.push({ entry, outcome });\n syncBacklog(s);\n};\n\n/**\n * \"notice\": a stamped durable command persists its settled update; \"noticed\":\n * the caller already did; \"memory\": the update is best-effort only.\n */\ntype SettleMode = \"notice\" | \"noticed\" | \"memory\";\n\nconst settleEntry = (\n s: Session,\n entry: Pending,\n outcome: Outcome,\n mode: SettleMode = \"notice\",\n) => {\n s.pending = s.pending.filter((p) => p !== entry);\n if (s.shared && !entry.adopted) s.shared.settled.add(entry.id);\n settleReleases(s, entry.id, outcome);\n // The record keeps every unsettled command for the next attach; only a\n // command it no longer owns becomes a durable settled update.\n const durable =\n mode === \"noticed\" ||\n (mode === \"notice\" &&\n (outcome.ok || outcome.failure.cause !== \"unmount\") &&\n isStamped(entry) &&\n !isEphemeral(s, entry.command.protocol));\n if (durable && mode === \"notice\") notice(s, entry as Stamped, outcome);\n if (outcome.ok) {\n entry.resolve(outcome.payload);\n s.lifecycle?.onSettle(\n entry.inv,\n { type: \"accepted\", payload: outcome.payload },\n durable,\n );\n } else {\n entry.reject(new StatewireSendError(outcome.failure));\n s.lifecycle?.onSettle(\n entry.inv,\n { type: \"rejected\", error: new StatewireSendError(outcome.failure) },\n durable,\n );\n }\n};\n\nconst settleAll = (s: Session, detach: \"unmount\" | \"gone\") => {\n const cause =\n detach === \"unmount\" ? (\"unmount\" as const) : (\"stream-gone\" as const);\n const batch = s.pending;\n const detachFailure = (entry: Pending): StatewireClient.SendFailure => {\n if (entry.seq === undefined) return { fate: \"aborted\", cause };\n if (!entry.attempted) {\n const seq = entry.seq;\n const predecessorLost = batch.some(\n (p) =>\n p.command.protocol === entry.command.protocol &&\n p.seq !== undefined &&\n p.seq < seq &&\n p.attempted,\n );\n return predecessorLost\n ? { fate: \"aborted\", cause, predecessorLost }\n : { fate: \"aborted\", cause };\n }\n return { fate: \"lost\", cause };\n };\n for (const entry of [...batch]) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, { ok: false, failure: detachFailure(entry) });\n }\n};\n\nconst settleLost = (s: Session, entries: Pending[]) => {\n for (const entry of entries) {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"lost\", cause: \"session-lost\" },\n });\n }\n};\n\nconst settleRemoved = (s: Session, entry: Pending) => {\n s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, {\n ok: false,\n failure: { fate: \"aborted\", cause: \"removed\" },\n });\n};\n\nconst requeue = (s: Session, survivors: Pending[]) => {\n for (const old of survivors) {\n s.lifecycle?.onCovered?.(old.inv);\n enqueueInner(s, old.command, old.inv.params, old.resolve, old.reject, {\n ...(old.inv.held && { hold: true }),\n ...(old.inv.localMeta !== undefined && { localMeta: old.inv.localMeta }),\n });\n }\n};\n\n// The server-side record's dedup memory is gone: history that may have\n// reached a server settles lost — the new hello's snapshot is the only\n// truth about what survived — and never-attempted statements re-stamp\n// on the adopted lane clocks.\nconst rebaseRecord = (s: Session, adopt: () => void) => {\n const held = s.pending.filter((p) => !p.adopted);\n const survivors = held.filter((p) => !p.attempted && !p.applied && !p.away);\n settleLost(\n s,\n held.filter((p) => !survivors.includes(p)),\n );\n for (const p of s.pending) if (p.adopted) s.lifecycle?.onCovered?.(p.inv);\n s.pending = [];\n s.durableSeq = {};\n // Failure notices ride through every record replacement.\n const previous = s.record.lanes;\n adopt();\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(previous)) {\n const current = laneOf({ ...s.record, lanes }, protocol);\n if (!lane.inbox?.length || current.inbox === lane.inbox) continue;\n lanes = { ...lanes, [protocol]: withNotices(current, lane.inbox) };\n }\n if (lanes !== s.record.lanes) setRecord(s, { ...s.record, lanes });\n requeue(s, survivors);\n publish(s);\n wake(s);\n void pump(s);\n};\n\nconst resetRecord = (s: Session, clientId: string) =>\n rebaseRecord(s, () => setRecord(s, { clientId, lanes: {} }));\n\n// Another sharer replaced the record's identity: their reset settles our\n// attempted history and our survivors re-stamp on the stored clocks.\nconst adoptReset = (s: Session, stored: StatewireClient.SessionRecord) => {\n rebaseRecord(s, () => {\n s.record = boundInbox(s.store, stored);\n });\n // The host attributes frames by lease, and the lease is bound to the id\n // this attach was opened with.\n if (s.attach === \"attached\") s.transport?.connection.reconnect();\n};\n\n// The record died with the attach: mint a fresh id for the next one.\nconst ephemeralDetach = (s: Session) => {\n s.ephemeral = false;\n s.sessionKnown = false;\n resetRecord(s, newClientId());\n};\n\n// An ephemeral lane dies with its attach: attempted statements can never be\n// answered, the rest re-stamp from 1 for the next attach.\nconst detachEphemeralLanes = (s: Session) => {\n const held = s.pending.filter(\n (p) => isStamped(p) && isEphemeral(s, p.command.protocol),\n );\n if (held.length === 0) return;\n settleLost(\n s,\n held.filter((p) => p.attempted),\n );\n for (const p of held) if (!p.attempted) unstamp(s, p);\n sortPending(s);\n publish(s);\n};\n\nconst rejectedFailure = (cmd: StatewireCmd): StatewireClient.SendFailure => {\n return {\n fate: \"rejected\",\n cause: \"server\",\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n };\n};\n\nconst outcomeOf = (\n cmd: StatewireCmd,\n):\n | { ok: true; payload: unknown }\n | { ok: false; failure: StatewireClient.SendFailure } => {\n switch (cmd.type) {\n case \"result\":\n return { ok: true, payload: reviveResponse(cmd).payload };\n case \"rejected\":\n return { ok: false, failure: rejectedFailure(reviveResponse(cmd)) };\n case \"failed\":\n return {\n ok: false,\n failure: {\n fate: \"failed\",\n cause: \"server\",\n ...(cmd.message !== undefined && { message: cmd.message }),\n },\n };\n case \"crashed\":\n return { ok: false, failure: { fate: \"crashed\", cause: \"server\" } };\n case \"expired\":\n return { ok: false, failure: { fate: \"expired\", cause: \"server\" } };\n default:\n return protocolError(`unknown cmd type: ${String(cmd.type)}`);\n }\n};\n\n// Only a result verdict carries applied effects; the rest drop the overlay unapplied.\nconst settleVerdict = (s: Session, entry: Pending, cmd: StatewireCmd) => {\n const outcome = outcomeOf(cmd);\n if (outcome.ok) cover(s, entry);\n else s.lifecycle?.onCovered?.(entry.inv);\n settleEntry(s, entry, outcome);\n};\n\nconst TERMINAL_CMD_TYPES: ReadonlySet<string> = new Set(TERMINAL);\n\n// A verdict for a seq another sharer stamped parks under the seq for that\n// owner; an adopted command's verdict parks under its id for the enqueuer.\nconst parkVerdict = (s: Session, cmd: StatewireCmd, id?: string) => {\n if (!s.shared || !TERMINAL_CMD_TYPES.has(cmd.type!)) return;\n if (isEphemeral(s, cmd.protocol)) return;\n s.shared.parked.push({\n protocol: cmd.protocol,\n verdict: {\n seq: cmd.seq,\n ...(id !== undefined && { id }),\n type: cmd.type as StatewireClient.SessionVerdict[\"type\"],\n ...(cmd.code !== undefined && { code: cmd.code }),\n ...(cmd.message !== undefined && { message: cmd.message }),\n ...(cmd.payload !== undefined && { payload: cmd.payload }),\n ...(cmd.meta !== undefined && { meta: cmd.meta }),\n },\n });\n};\n\nconst handleCmd = (s: Session, cmd: StatewireCmd) => {\n if (cmd.dur === true && !isEphemeral(s, cmd.protocol)) {\n const watermark = Math.max(durableSeqOf(s, cmd.protocol), cmd.seq);\n s.durableSeq[cmd.protocol] = watermark;\n for (const entry of laneEntries(s, cmd.protocol)) {\n if (entry.seq <= watermark) entry.posted = true;\n }\n }\n if (cmd.type === undefined) return;\n const entry = laneEntries(s, cmd.protocol).find((p) => p.seq === cmd.seq);\n if (cmd.type === \"applied\") {\n if (entry) cover(s, entry);\n return;\n }\n if (!entry) {\n parkVerdict(s, cmd);\n return;\n }\n if (entry.adopted) parkVerdict(s, cmd, entry.id);\n settleVerdict(s, entry, cmd);\n};\n\nconst consumeVerdicts = (s: Session) => {\n let lanes = s.record.lanes;\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const verdicts = lane.verdicts ?? [];\n const consumed = new Set<number>();\n const forwarded: StatewireClient.SessionVerdict[] = [];\n let next = verdicts;\n for (const verdict of verdicts) {\n // By id: the stamp's owner settles it and forwards it to the enqueuer.\n const entry = s.pending.find(\n (p) =>\n p.command.protocol === protocol &&\n (verdict.id === undefined\n ? isStamped(p) && p.seq === verdict.seq\n : p.id === verdict.id),\n );\n if (!entry) continue;\n next = next.filter((v) => v !== verdict);\n consumed.add(verdict.seq);\n if (entry.adopted) forwarded.push({ ...verdict, id: entry.id });\n const { id: _id, ...cmd } = verdict;\n settleVerdict(s, entry, { ...cmd, protocol });\n }\n if (consumed.size === 0) continue;\n lanes = {\n ...lanes,\n [protocol]: {\n ...lane,\n commands: lane.commands.filter((c) => !consumed.has(c.seq)),\n verdicts: [...next, ...forwarded].slice(-MAX_PARKED_VERDICTS),\n },\n };\n }\n if (lanes === s.record.lanes) return;\n setRecord(s, { ...s.record, lanes });\n publish(s);\n wake(s);\n};\n\nconst handleCmds = (s: Session, cmds: StatewireCmd[]) => {\n for (const cmd of cmds) handleCmd(s, cmd);\n syncBacklog(s);\n wake(s);\n};\n\nconst ingestOps = (s: Session, ops: unknown[]) => {\n const applied = applyDocumentOps(s.documents, ops, s.selection?.protocols);\n s.documents = applied;\n const next =\n s.selection === undefined\n ? applied.documents.get(0)?.value\n : s.options.applicationProtocols === \"*\"\n ? Object.fromEntries(\n [...applied.documents].map(([id, d]) => [\n `${d.protocol}:${d.key === null ? id : JSON.stringify(d.key)}`,\n d.value,\n ]),\n )\n : mainDocument(applied, s.options.protocol ?? DEFAULT_PROTOCOL)?.value;\n if (next !== s.canonical)\n s.changed.push(\n ...(applied.changedPaths.length ? applied.changedPaths : [[]]),\n );\n s.canonical = next;\n};\n\nconst cacheDocuments = (s: Session) => {\n if (s.documentStore && s.selection) {\n for (const document of s.documents.documents.values()) {\n if (!document.protocol || !document.key) continue;\n const key = resolveDocumentKey(\n document.key,\n s.options.keyPrefixes?.[document.protocol],\n );\n const version = s.selection.protocols.find(\n (p) => p.name === document.protocol,\n )?.version;\n if (key !== undefined && version !== undefined)\n s.documentStore.save(\n [s.documentStore.namespace ?? \"\", document.protocol, ...key],\n { version, value: document.value },\n );\n }\n }\n};\n\nconst publishIngested = (s: Session) => {\n publish(s);\n cacheDocuments(s);\n for (const listener of s.documentListeners) listener();\n wake(s);\n};\n\n// The refusal's watermark is exact: every held statement above it was never\n// admitted by the live record, and the first unposted seq being beyond\n// watermark+1 proves the record that admitted the missing prefix is gone —\n// its history settles lost and the lane clock restarts at the watermark.\nconst sessionLostInner = (s: Session, protocol: string, seqWm: number) => {\n const lane = laneOf(s.record, protocol);\n const failure = { fate: \"lost\", cause: \"session-lost\" } as const;\n const held = laneEntries(s, protocol);\n s.durableSeq[protocol] = seqWm;\n const requeue =\n held.length > 0 &&\n s.onSessionLost?.(\n held.map((p) => ({\n id: p.id,\n method: p.inv.method,\n params: p.inv.params,\n ts: p.inv.ts,\n seq: p.seq,\n ...(p.inv.clientId !== undefined && { clientId: p.inv.clientId }),\n })),\n ) === \"requeue\";\n if (requeue) {\n if (s.onDeprecatedPath)\n s.onDeprecatedPath({ kind: \"session-lost-requeue\", count: held.length });\n else\n console.warn(\n `statewire: onSessionLost \"requeue\" re-enqueued ${held.length} commands; it is deprecated and will be removed`,\n );\n for (const p of held) {\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(s, p, { ok: false, failure }, \"memory\");\n }\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...lane,\n nextSeq: seqWm + 1,\n commands: [],\n }),\n );\n for (const old of held)\n enqueueInner(\n s,\n old.command,\n old.inv.params,\n () => {},\n () => {},\n {\n ...(old.inv.localMeta !== undefined && {\n localMeta: old.inv.localMeta,\n }),\n },\n );\n } else {\n // Default: the whole queue goes, each command a failure notice.\n const stamps = mergeBacklog(s, protocol);\n const queued = outboxOf(lane);\n const { outbox: _outbox, ...rest } = lane;\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withNotices(rest, [\n ...stamps.map((c) => lostNotice(c)),\n ...queued.map((c) => lostNotice(c)),\n ]),\n nextSeq: seqWm + 1,\n commands: [],\n ...marks(\n s,\n lane,\n [\n ...stamps.map((c) => ({ id: c.id, by: c.by ?? c.owner })),\n ...queued,\n ],\n failure,\n ),\n }),\n );\n for (const p of s.pending.filter((q) => q.command.protocol === protocol)) {\n s.lifecycle?.onCovered?.(p.inv);\n settleEntry(s, p, { ok: false, failure }, \"noticed\");\n }\n deliver(s);\n }\n publish(s);\n wake(s);\n};\n\n// Every stamp above the watermark returns to the front of the outbox. A stamp\n// past watermark+1, or one this client saw admitted, proves the server record\n// that admitted it is gone. Another live sharer's stamp may still be on its\n// way on that sharer's attach: it and every stamp after it wait for a later\n// hello; the stamps before it never arrived and resend under their seqs.\nconst demote = (\n s: Session,\n protocol: string,\n watermark: number,\n demoted: Set<string>,\n waiting: Set<Pending>,\n) => {\n const lane = laneOf(s.record, protocol);\n const local = laneEntries(s, protocol).filter((p) => p.seq > watermark);\n const above = new Map(\n lane.commands.filter((c) => c.seq > watermark).map((c) => [c.id, c]),\n );\n for (const p of local) if (!above.has(p.id)) above.set(p.id, toStored(s, p));\n if (above.size === 0) return;\n const moved = [...above.values()].sort((a, b) => a.seq - b.seq);\n if (\n moved[0]!.seq > watermark + 1 ||\n moved[0]!.seq <= durableSeqOf(s, protocol) ||\n local.some((p) => p.applied)\n ) {\n sessionLostInner(s, protocol, watermark);\n return;\n }\n const me = s.store.owner?.id;\n const foreign = moved.find(\n (c) =>\n c.owner !== undefined &&\n c.owner !== me &&\n !local.some((p) => p.id === c.id),\n );\n if (foreign !== undefined) {\n for (const p of local) if (p.seq > foreign.seq) waiting.add(p);\n return;\n }\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withOutbox(lane, [\n ...moved.map(({ seq: _seq, owner: _owner, ...command }) => command),\n ...outboxOf(lane),\n ]),\n nextSeq: watermark + 1,\n commands: lane.commands.filter((c) => c.seq <= watermark),\n }),\n );\n for (const command of moved) demoted.add(command.id);\n for (const p of local) {\n if (p.adopted) dropPending(s, p);\n else unstamp(s, p);\n }\n sortPending(s);\n};\n\nconst recheckLater = (s: Session, watermarks: string) => {\n if (s.rechecks.watermarks !== watermarks)\n s.rechecks = { watermarks, count: 0 };\n s.rechecks.count += 1;\n if (s.recheck !== undefined) return;\n s.recheck = setTimeout(\n () => {\n s.recheck = undefined;\n if (s.running && s.attach === \"attached\")\n s.transport?.connection.reconnect();\n },\n backoff(s.rechecks.count + 1),\n );\n};\n\nconst gapFill = (s: Session) =>\n s.selection !== undefined && s.selection.version >= GAP_FILL_VERSION;\n\nconst selectionOf = (\n syn: StatewireSyn,\n): StatewireProtocol.Selection | undefined => {\n if (syn.version === undefined || syn.protocols === undefined)\n return undefined;\n return {\n version: syn.version,\n protocols: syn.protocols.map(({ name, version, record }) => {\n if (version === undefined)\n return protocolError(`hello lane ${name} has no version`);\n return { name, version, ...(record !== undefined && { record }) };\n }),\n };\n};\n\nconst handleHello = (\n s: Session,\n { ops, syn }: { ops: unknown[]; syn: StatewireSyn },\n) => {\n if (s.attach === \"attached\") {\n s.ephemeralSeqs = {};\n detachEphemeralLanes(s);\n }\n for (const [protocol, value] of s.contexts) {\n if (s.attachContexts.get(protocol) === value)\n s.dirtyContexts.delete(protocol);\n else s.dirtyContexts.add(protocol);\n }\n s.attachContexts.clear();\n s.selection = selectionOf(syn);\n s.documents = { mode: null, documents: new Map() };\n ingestOps(s, ops);\n s.attach = \"attached\";\n s.attachEpoch += 1;\n s.frameFailures = 0;\n s.resumeAt = 0;\n const lanes = syn.protocols ?? [];\n s.ephemeral =\n lanes.length > 0 && lanes.every((lane) => lane.record === \"ephemeral\");\n if (s.ephemeral) s.deactivated = true;\n const attached = s.attachEntries;\n s.attachEntries = new Set();\n const reconcile = () => {\n // Statements at or below the watermark resend only to fetch their\n // verdicts (the server never re-runs them); seqs above it never arrived\n // and go back to the outbox for fresh ones.\n const demoted = new Set<string>();\n const waiting = new Set<Pending>();\n for (const lane of lanes) {\n if (lane.record === \"ephemeral\") {\n s.ephemeralSeqs[lane.name] = Math.max(\n Object.hasOwn(s.ephemeralSeqs, lane.name)\n ? s.ephemeralSeqs[lane.name]!\n : 0,\n ...laneEntries(s, lane.name).map((p) => p.seq),\n );\n continue;\n }\n demote(s, lane.name, lane.seq ?? 0, demoted, waiting);\n s.durableSeq[lane.name] = lane.seq ?? 0;\n }\n for (const entry of s.pending) {\n entry.posted =\n attached.has(entry) ||\n waiting.has(entry) ||\n (isStamped(entry) &&\n entry.seq <= durableSeqOf(s, entry.command.protocol) &&\n !isEphemeral(s, entry.command.protocol));\n entry.stale = false;\n }\n if (waiting.size > 0)\n recheckLater(\n s,\n JSON.stringify(lanes.map((lane) => [lane.name, lane.seq])),\n );\n else s.rechecks = { watermarks: \"\", count: 0 };\n syncBacklogInner(s);\n s.sessionKnown = true;\n flushInner(s, demoted);\n };\n if (!s.shared || s.deactivated) {\n reconcile();\n publishIngested(s);\n void pump(s);\n deliver(s);\n return;\n }\n transactBackground(s, reconcile, () => {\n publishIngested(s);\n void pump(s);\n deliver(s);\n });\n};\n\nconst handleOps = (\n s: Session,\n { ops, cmds }: { ops: unknown[]; cmds: StatewireCmd[] },\n) => {\n ingestOps(s, ops);\n for (const cmd of cmds) handleCmd(s, cmd);\n if (cmds.length > 0) syncBacklog(s);\n publishIngested(s);\n};\n\n// A retry-less {syn} refusal is the one session-loss verdict: a gap against\n// a durable lane's exact watermark settles that lane's history lost; a\n// pushback (retry present) or a gapless refusal only reconciles the resend queues.\nconst handleRefusal = (s: Session, syn: StatewireSyn) => {\n const lanes = (syn.protocols ?? []).filter(\n (lane): lane is { name: string; seq: number } => lane.seq !== undefined,\n );\n for (const { name, seq } of lanes) {\n const watermark = isEphemeral(s, name)\n ? seq\n : Math.max(seq, durableSeqOf(s, name));\n for (const entry of laneEntries(s, name))\n entry.posted = entry.seq <= watermark;\n }\n if (typeof syn.retry === \"number\") {\n s.resumeAt = Date.now() + retryHint(syn.retry);\n wake(s);\n void pump(s);\n return;\n }\n const gaps = lanes.filter(({ name, seq }) => {\n const first = laneEntries(s, name).find((p) => !p.posted);\n return (\n first !== undefined &&\n first.seq > Math.max(seq, durableSeqOf(s, name)) + 1\n );\n });\n for (const { name, seq } of gaps) {\n if (isEphemeral(s, name))\n protocolError(`gap on ephemeral lane ${name} after watermark ${seq}`);\n }\n // Another sharer holds the missing stamp: reattach, and the hello frees it.\n if (\n gaps.some(({ name, seq }) =>\n laneOf(s.record, name).commands.some(\n (c) => c.seq === seq + 1 && c.owner !== s.store.owner?.id,\n ),\n )\n ) {\n s.transport?.connection.reconnect();\n return;\n }\n if (gaps.length > 0) {\n transactBackground(\n s,\n () => {\n for (const { name, seq } of gaps) sessionLostInner(s, name, seq);\n },\n () => {\n wake(s);\n void pump(s);\n },\n );\n return;\n }\n wake(s);\n void pump(s);\n};\n\nconst handleDetach = (s: Session) => {\n if (s.attach === \"attached\") s.attach = \"detached\";\n s.ephemeralSeqs = {};\n if (s.ephemeral) ephemeralDetach(s);\n else detachEphemeralLanes(s);\n wake(s);\n};\n\nconst handleFinish = (s: Session, { reason }: { reason: string }) => {\n if (reason === \"reconnect\" || reason === \"error\") return;\n s.attach = \"finished\";\n settleAll(s, \"gone\");\n publish(s);\n wake(s);\n};\n\nconst isFinished = (s: Session) => s.attach === \"finished\";\n\ntype Lanes = {\n frame: StatewireFrame;\n entries: Stamped[];\n};\n\n// A lane must be strictly consecutive within a frame: the first unposted run\n// per lane rides now, later runs ride follow-up frames. Ephemeral lanes ignore\n// the gate: they live on the attach and never wait for persistence.\nconst buildLanes = (\n s: Session,\n cmdGate: \"persisted\" | \"all\" | \"none\" = \"all\",\n): Lanes | null => {\n const entries: Stamped[] = [];\n const last: Record<string, number> = {};\n const stopped = new Set<string>();\n for (const entry of s.pending) {\n if (entries.length >= MAX_COMMANDS_PER_FRAME) break;\n if (!isStamped(entry)) continue;\n const protocol = entry.command.protocol;\n if (entry.posted || stopped.has(protocol)) continue;\n if (entry.stale) {\n stopped.add(protocol);\n continue;\n }\n const gated =\n !isEphemeral(s, protocol) &&\n (cmdGate === \"none\" ||\n (cmdGate === \"persisted\" &&\n (s.persistedRecord?.clientId !== s.record.clientId ||\n entry.seq >= laneOf(s.persistedRecord, protocol).nextSeq)));\n if (\n gated ||\n (Object.hasOwn(last, protocol) && entry.seq !== last[protocol]! + 1)\n ) {\n stopped.add(protocol);\n continue;\n }\n last[protocol] = entry.seq;\n entries.push(entry);\n }\n const ctx = [...s.dirtyContexts].map((protocol) => s.contexts.get(protocol)!);\n if (entries.length === 0 && ctx.length === 0) return null;\n return {\n frame: {\n ...(ctx.length > 0 && { ctx }),\n ...(entries.length > 0 && {\n cmd: entries.map((p) => {\n const { produced: _produced, ...command } = p.command;\n return { ...command, seq: p.seq };\n }),\n }),\n },\n entries,\n };\n};\n\n// Per durable lane with stamps awaiting a verdict: the seq below the oldest.\n// The hello answers everything above it, so nothing at or below the\n// watermark is ever re-sent.\nconst resultsCursor = (s: Session) => {\n const cursors = new Map<string, number>();\n for (const p of s.pending) {\n if (!isStamped(p) || isEphemeral(s, p.command.protocol)) continue;\n const protocol = p.command.protocol;\n cursors.set(protocol, Math.min(cursors.get(protocol) ?? p.seq, p.seq));\n }\n return [...cursors].map(([protocol, seq]) => ({ protocol, seq: seq - 1 }));\n};\n\nconst takeAttachLanes = (s: Session): StatewireFrame | null => {\n s.attachEntries = new Set();\n const wanted = s.lanesOnAttach;\n s.lanesOnAttach = false;\n for (const protocol of s.contexts.keys()) s.dirtyContexts.add(protocol);\n s.attachContexts = new Map(s.contexts);\n const lanes = buildLanes(s, wanted && s.sessionKnown ? \"persisted\" : \"none\");\n const res = resultsCursor(s);\n if (!lanes && res.length === 0) return null;\n s.attachEntries = new Set(lanes?.entries ?? []);\n for (const entry of lanes?.entries ?? []) entry.attempted = true;\n return { ...lanes?.frame, ...(res.length > 0 && { res }) };\n};\n\nconst persistBeforeSend = (s: Session): void | Promise<void> => {\n if (s.storageError !== undefined) throw s.storageError;\n if (!s.hydrated) return s.ready!.then(() => persistBeforeSend(s));\n const record = s.record;\n try {\n const pending = s.store.flush?.();\n if (pending)\n return pending.then(\n () => {\n s.persistedRecord = record;\n },\n (cause: unknown) => {\n throw wrapStorageError(cause);\n },\n );\n s.persistedRecord = record;\n } catch (cause) {\n throw wrapStorageError(cause);\n }\n};\n\nconst pump = async (s: Session) => {\n if (s.pumping) return;\n s.pumping = true;\n try {\n while (s.running && !isFinished(s)) {\n if (!s.hydrated) await s.ready;\n const transport = s.transport;\n const flushable = flushCandidates(s).length > 0;\n const queued =\n s.pending.some((p) => isOutboxed(p) && !p.inv.held) ||\n queuedInRecord(s);\n if (\n buildLanes(s) === null &&\n !flushable &&\n (!queued || s.attach === \"attached\")\n )\n return;\n const waiting = s.pending.length > 0 || queued;\n if (transport?.parked && !waiting) return;\n if (s.attach !== \"attached\" || !transport) {\n if (!waiting) return;\n if (\n (transport?.connection.status === \"standby\" &&\n transport.connection.reason === \"idle\") ||\n transport?.parked\n ) {\n transport.connection.reconnect();\n }\n await waitForWake(s);\n continue;\n }\n const resumeDelay = s.resumeAt - Date.now();\n if (resumeDelay > 0) {\n await sleepUntilWake(s, resumeDelay);\n continue;\n }\n if (flushable) {\n if (!s.sessionKnown) {\n await waitForWake(s);\n continue;\n }\n await flush(s);\n continue;\n }\n let lanes = buildLanes(s);\n if (!lanes) continue;\n const epoch = s.attachEpoch;\n const persistence = persistBeforeSend(s);\n if (persistence) await persistence;\n if (!s.running || isFinished(s)) return;\n if (epoch !== s.attachEpoch || s.attach !== \"attached\") continue;\n let result;\n try {\n // Shared storage: the lock across the send keeps per-lane arrival\n // ordered across sharers, and the frame is rebuilt from the record\n // as it stands, so a stamp another sharer freed never goes out.\n const send = (built: Lanes) => {\n for (const entry of built.entries) entry.attempted = true;\n return transport.send(built.frame);\n };\n result = await (s.shared && !s.deactivated && lanes.entries.length > 0\n ? s.store.lock!(async () => {\n refresh(s, await readStored(s));\n lanes = buildLanes(s);\n if (!lanes || epoch !== s.attachEpoch) return null;\n return send(lanes);\n })\n : send(lanes));\n } catch {\n if (!s.running || isFinished(s)) return;\n // The frame may have arrived. Under the gap-fill wire its seqs never\n // go out again: the next hello answers what arrived and frees the rest.\n if (lanes !== null && lanes.entries.length > 0 && gapFill(s)) {\n if (epoch !== s.attachEpoch) continue;\n for (const entry of lanes.entries)\n if (s.pending.includes(entry)) entry.posted = true;\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n if (s.running && epoch === s.attachEpoch && s.attach === \"attached\")\n transport.connection.reconnect();\n continue;\n }\n if (lanes?.frame.ctx?.length) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n await waitForWake(s);\n continue;\n }\n s.frameFailures += 1;\n await sleepUntilWake(s, backoff(s.frameFailures));\n continue;\n }\n if (!s.running) return;\n if (result === null || lanes === null) continue;\n s.frameFailures = 0;\n if (\n epoch === s.attachEpoch &&\n (result.type === \"ok\" || result.type === \"refusal\")\n ) {\n for (const entry of lanes.frame.ctx ?? []) {\n if (s.contexts.get(entry.protocol) === entry)\n s.dirtyContexts.delete(entry.protocol);\n }\n }\n if (result.type === \"ok\") {\n if (epoch === s.attachEpoch) {\n for (const entry of lanes.entries) {\n if (s.pending.includes(entry)) {\n entry.posted = true;\n s.lifecycle?.onPosted?.(entry.inv);\n }\n }\n }\n } else if (result.type === \"refusal\") {\n if (epoch === s.attachEpoch) handleRefusal(s, result.syn);\n } else if (result.type === \"stale-lease\") {\n // A POST outlived its attach: reattach first, the hello arbitrates.\n if (epoch === s.attachEpoch) {\n transport.connection.reconnect();\n await waitForWake(s);\n }\n } else if (result.type === \"no-lease\") {\n // No out-of-band write channel: the frame rides a fresh attach.\n if (epoch === s.attachEpoch) {\n s.lanesOnAttach = true;\n transport.connection.reconnect();\n while (s.running && !isFinished(s) && epoch === s.attachEpoch) {\n await waitForWake(s);\n }\n }\n }\n }\n } catch (error) {\n storageFailed(s, error);\n } finally {\n s.pumping = false;\n }\n};\n\nconst start = (s: Session) => {\n s.running = true;\n if (!s.hydrated) {\n void s.ready!.then(\n () => {\n if (s.running) start(s);\n },\n () => {},\n );\n return;\n }\n if (s.shared) {\n s.shared.abort = new AbortController();\n s.shared.unsubscribe = s.store.subscribe!(() => {\n transactBackground(\n s,\n () => consumeVerdicts(s),\n () => {\n wake(s);\n void pump(s);\n deliver(s);\n },\n );\n });\n s.running = true;\n transactBackground(\n s,\n () => {\n if (s.store.load() === null) s.store.save(s.record);\n s.recordPersisted = true;\n adoptOwner(s, undefined);\n consumeVerdicts(s);\n },\n () => {\n void pump(s);\n deliver(s);\n },\n );\n return;\n }\n if (!s.recordPersisted) {\n s.recordPersisted = true;\n s.store.save(s.record);\n }\n adoptOwner(s, undefined);\n s.running = true;\n void pump(s);\n deliver(s);\n};\n\nconst stop = (s: Session) => {\n s.running = false;\n clearTimeout(s.recheck);\n s.recheck = undefined;\n if (s.shared) {\n s.shared.unsubscribe?.();\n s.shared.unsubscribe = null;\n s.shared.abort?.abort();\n s.shared.abort = null;\n s.shared.watched.clear();\n }\n wake(s);\n settleAll(s, \"unmount\");\n};\n\nconst setTransport = (s: Session, transport: RemoteLink) => {\n if (s.transport === transport) return;\n s.transport = transport;\n wake(s);\n};\n\ntype EnqueueOptions = {\n hold?: boolean;\n localMeta?: unknown;\n};\n\nconst QUOTA: StatewireClient.SendFailure = { fate: \"aborted\", cause: \"quota\" };\n\nconst isQuota = (error: unknown) =>\n error instanceof Error && error.name === \"StatewireQuotaError\";\n\nconst enqueueInner = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n options: EnqueueOptions = {},\n) => {\n const protocol = command.protocol;\n const id = newClientId();\n const entry: Pending = {\n id,\n seq: undefined,\n command,\n inv: {\n protocol,\n method: command.method,\n params,\n ts: Date.now(),\n id,\n clientId: s.record.clientId,\n ...(options.hold && { held: true as const }),\n ...(options.localMeta !== undefined && { localMeta: options.localMeta }),\n },\n adopted: false,\n by: s.store.owner?.id,\n away: false,\n stale: false,\n attempted: false,\n posted: false,\n applied: false,\n resolve,\n reject,\n };\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n try {\n setRecord(\n s,\n withLane(\n s.record,\n protocol,\n withOutbox(lane, [...outboxOf(lane), toOutbox(entry)]),\n ),\n );\n } catch (error) {\n if (!isQuota(error)) throw error;\n reject(new StatewireSendError(QUOTA));\n return;\n }\n s.pending.push(entry);\n reorder(s, protocol);\n } else s.pending.push(entry);\n s.lifecycle?.onStart(entry.inv);\n s.notify();\n};\n\nconst negotiated = (s: Session, protocol: string) =>\n s.selection?.protocols.some((p) => p.name === protocol) ?? false;\n\ntype Candidate = {\n protocol: string;\n stored: StatewireClient.OutboxCommand;\n};\n\nconst viewOf = (\n s: Session,\n protocol: string,\n stored: StatewireClient.OutboxCommand | StatewireClient.SessionCommand,\n state?: \"sending\",\n): StatewireClient.OutboxEntry => {\n const cached = s.views.get(stored);\n if (cached?.protocol === protocol) return cached;\n const view: StatewireClient.OutboxEntry = {\n id: stored.id,\n protocol,\n command: { method: stored.method, params: paramsOf(stored) },\n ts: stored.ts,\n state:\n state ??\n ((stored as StatewireClient.OutboxCommand).held ? \"held\" : \"queued\"),\n localMeta: stored.localMeta,\n durable: s.store.durable !== false && !isEphemeral(s, protocol),\n };\n s.views.set(stored, view);\n return view;\n};\n\n/** The lane's outbox as this client may flush it: the record's on a durable lane, its own on an ephemeral one. */\nconst laneQueue = (\n s: Session,\n protocol: string,\n): StatewireClient.OutboxCommand[] =>\n isEphemeral(s, protocol)\n ? s.pending\n .filter((p) => isOutboxed(p) && p.command.protocol === protocol)\n .map((p) => toOutbox(p))\n : [...outboxOf(laneOf(s.record, protocol))];\n\n// Bubble forward: each entry moves toward the front past held or waiting\n// entries it may overtake and stops behind the first it can't; the entries\n// with nothing held or waiting ahead are the ones a flush stamps.\nconst bubble = (\n s: Session,\n protocol: string,\n queue: readonly StatewireClient.OutboxCommand[],\n): { order: StatewireClient.OutboxCommand[]; free: number } => {\n const may = s.options.canOvertake?.[protocol];\n const order: { stored: StatewireClient.OutboxCommand; blocked: boolean }[] =\n [];\n for (const stored of queue) {\n if (stored.held) {\n order.push({ stored, blocked: true });\n continue;\n }\n let at = order.length;\n while (\n at > 0 &&\n order[at - 1]!.blocked &&\n may !== undefined &&\n may(\n viewOf(s, protocol, stored),\n viewOf(s, protocol, order[at - 1]!.stored),\n )\n )\n at--;\n order.splice(at, 0, { stored, blocked: at > 0 && order[at - 1]!.blocked });\n }\n const free = order.findIndex((o) => o.blocked);\n return {\n order: order.map((o) => o.stored),\n free: free === -1 ? order.length : free,\n };\n};\n\n/** Persists the lane's bubbled order. */\nconst reorder = (s: Session, protocol: string) => {\n if (isEphemeral(s, protocol)) return;\n const lane = laneOf(s.record, protocol);\n const { order } = bubble(s, protocol, outboxOf(lane));\n if (order.every((c, i) => c === outboxOf(lane)[i])) return;\n setRecord(s, withLane(s.record, protocol, withOutbox(lane, order)));\n};\n\nconst flushLanes = (s: Session) =>\n [\n ...new Set([\n ...Object.keys(s.record.lanes),\n ...s.pending.map((p) => p.command.protocol),\n ]),\n ].filter((protocol) => negotiated(s, protocol));\n\n/** Entries the next flush would stamp. */\nconst flushCandidates = (s: Session): Candidate[] =>\n flushLanes(s).flatMap((protocol) => {\n const { order, free } = bubble(s, protocol, laneQueue(s, protocol));\n return order.slice(0, free).map((stored) => ({ protocol, stored }));\n });\n\n// An entry the record holds that a flush would stamp once attached, whether\n// or not this page made the send: inserted, or kept from an earlier mount or\n// another sharer. It dials a parked or idle transport as a send does.\nconst queuedInRecord = (s: Session) =>\n Object.keys(s.record.lanes).some(\n (protocol) =>\n (s.selection ? negotiated(s, protocol) : offered(s, protocol)) &&\n bubble(s, protocol, laneQueue(s, protocol)).free > 0,\n );\n\nconst reasonOf = (\n s: Session,\n stored: StatewireClient.OutboxCommand,\n demoted: ReadonlySet<string>,\n): StatewireClient.FlushReason =>\n stored.released\n ? \"release\"\n : demoted.has(stored.id)\n ? \"reconnect\"\n : s.mountIds.has(stored.id)\n ? \"reload\"\n : \"enqueue\";\n\nconst NO_IDS: ReadonlySet<string> = new Set();\n\nconst patched = (\n stored: StatewireClient.OutboxCommand,\n patch: Patch,\n): StatewireClient.OutboxCommand => {\n const {\n held: _held,\n released: _released,\n localMeta: _meta,\n ...rest\n } = stored;\n const held = patch.held ?? stored.held === true;\n const localMeta =\n patch.localMeta === undefined ? stored.localMeta : patch.localMeta.value;\n let next: StatewireClient.OutboxCommand = {\n ...rest,\n ...(held && { held: true as const }),\n ...(!held &&\n (stored.held || stored.released) && { released: true as const }),\n ...(localMeta !== undefined && { localMeta }),\n };\n if (patch.params !== undefined) {\n const { params, meta } = encodeParams(patch.params);\n const { meta: _old, ...plain } = next;\n next = { ...plain, params, ...(meta !== undefined && { meta }) };\n }\n return next;\n};\n\n// Seqs are allocated here, under the lock, against the attach's watermark:\n// each outbox entry is stamped by exactly one sharer, in the bubbled order.\nconst flushInner = (s: Session, demoted: ReadonlySet<string> = NO_IDS) => {\n if (s.attach !== \"attached\" || !s.sessionKnown || !s.running || isFinished(s))\n return;\n const candidates = flushCandidates(s);\n if (candidates.length === 0) return;\n const groups = new Map<\n StatewireClient.FlushReason,\n StatewireClient.OutboxEntry[]\n >();\n for (const { protocol, stored } of candidates) {\n const reason = reasonOf(s, stored, demoted);\n groups.set(reason, [\n ...(groups.get(reason) ?? []),\n viewOf(s, protocol, stored),\n ]);\n }\n const flushing: Flushing = {\n ids: new Set(candidates.map((c) => c.stored.id)),\n patches: new Map(),\n removed: new Set(),\n };\n s.flushing = flushing;\n try {\n for (const [reason, commands] of groups) {\n try {\n s.onFlush?.({ commands, reason });\n } catch (error) {\n console.error(\"statewire: onFlush threw; stamping anyway\", error);\n }\n }\n } finally {\n s.flushing = null;\n }\n let record = s.record;\n for (const protocol of new Set(candidates.map((c) => c.protocol))) {\n const ephemeral = isEphemeral(s, protocol);\n const lane = laneOf(record, protocol);\n const removed: StatewireClient.OutboxCommand[] = [];\n const queue: StatewireClient.OutboxCommand[] = [];\n for (const stored of laneQueue(s, protocol)) {\n const own = s.pending.find((p) => p.id === stored.id && isOutboxed(p));\n if (flushing.removed.has(stored.id)) {\n removed.push(stored);\n if (own) settleRemoved(s, own);\n continue;\n }\n const patch = flushing.patches.get(stored.id);\n if (patch === undefined) {\n queue.push(stored);\n continue;\n }\n const next = patched(stored, patch);\n queue.push(next);\n if (own) follow(s, own, next);\n }\n const { order, free } = bubble(s, protocol, queue);\n let nextSeq = lane.nextSeq;\n const commands = [...lane.commands];\n for (const stored of order.slice(0, free)) {\n s.mountIds.delete(stored.id);\n const own = s.pending.find((p) => p.id === stored.id && isOutboxed(p));\n if (ephemeral) {\n const seq =\n (Object.hasOwn(s.ephemeralSeqs, protocol)\n ? s.ephemeralSeqs[protocol]!\n : 0) + 1;\n s.ephemeralSeqs[protocol] = seq;\n stamp(s, own!, seq);\n continue;\n }\n const seq = Math.max(nextSeq, durableSeqOf(s, protocol) + 1);\n nextSeq = seq + 1;\n const { held: _held, released: _released, ...command } = stored;\n const stamped: StatewireClient.SessionCommand = {\n ...command,\n seq,\n ...(s.store.owner !== undefined && { owner: s.store.owner.id }),\n };\n commands.push(stamped);\n if (own) stamp(s, own, seq);\n else {\n const adopted = adoptedPending(s, protocol, stamped);\n adopted.stale = false;\n adopted.attempted = false;\n s.pending.push(adopted);\n }\n }\n if (ephemeral && removed.length === 0 && outboxOf(lane).length === 0)\n continue;\n const stampedIds = new Set(order.slice(0, free).map((c) => c.id));\n const rest = ephemeral\n ? outboxOf(lane).filter(\n (c) => !removed.some((r) => r.id === c.id) && !stampedIds.has(c.id),\n )\n : order.slice(free);\n record = withLane(record, protocol, {\n ...withOutbox(lane, rest),\n nextSeq,\n commands,\n ...marks(s, lane, removed),\n });\n }\n if (record !== s.record) setRecord(s, record);\n sortPending(s);\n s.notify();\n};\n\nconst flush = (s: Session): Promise<void> => {\n if (!s.shared) {\n flushInner(s);\n return Promise.resolve();\n }\n return transact(s, () => flushInner(s));\n};\n\nexport const outboxEntries = (\n s: Session,\n): readonly StatewireClient.OutboxEntry[] => {\n const local = s.pending.filter(\n (p) => isEphemeral(s, p.command.protocol) && !p.away,\n );\n const parts: unknown[] = [\n ...Object.values(s.record.lanes).flatMap((lane) => [\n lane.commands,\n lane.outbox,\n ]),\n ...local.flatMap((p) => [p, p.seq, p.inv.held, p.inv.localMeta]),\n ];\n const same =\n parts.length === s.outboxParts.length &&\n parts.every((part, i) => part === s.outboxParts[i]);\n if (!same) {\n s.outboxParts = parts;\n s.outboxList = [\n ...Object.entries(s.record.lanes).flatMap(([protocol, lane]) => [\n ...[...lane.commands]\n .sort((a, b) => a.seq - b.seq)\n .map((c) => viewOf(s, protocol, c, \"sending\")),\n ...outboxOf(lane).map((c) => viewOf(s, protocol, c)),\n ]),\n ...[...local]\n .sort((a, b) => (a.seq ?? Infinity) - (b.seq ?? Infinity))\n .map((p) =>\n isStamped(p)\n ? viewOf(s, p.command.protocol, toStored(s, p), \"sending\")\n : viewOf(s, p.command.protocol, toOutbox(p)),\n ),\n ];\n }\n return s.outboxList;\n};\n\ntype OutboxOp =\n | { type: \"patch\"; patch: (entry: StatewireClient.OutboxEntry) => Patch }\n | { type: \"remove\" };\n\nconst entryOf = (s: Session, id: string) => {\n const at = locate(s, id);\n if (at === undefined) throw new Error(`outbox: no entry ${id}`);\n if (at.stored === undefined) throw new Error(`outbox: ${id} is in flight`);\n return { protocol: at.protocol, stored: at.stored };\n};\n\nconst applyOutboxOp = (s: Session, id: string, op: OutboxOp) => {\n const at = locate(s, id);\n if (at?.stored === undefined) return;\n const { protocol, stored } = at;\n const own = s.pending.find((p) => p.id === id && isOutboxed(p));\n if (op.type === \"remove\") {\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n setRecord(\n s,\n withLane(s.record, protocol, {\n ...withOutbox(\n lane,\n outboxOf(lane).filter((c) => c.id !== id),\n ),\n ...marks(s, lane, [stored]),\n }),\n );\n }\n if (own) settleRemoved(s, own);\n } else {\n const next = patched(stored, op.patch(viewOf(s, protocol, stored)));\n if (!isEphemeral(s, protocol)) {\n const lane = laneOf(s.record, protocol);\n setRecord(\n s,\n withLane(\n s.record,\n protocol,\n withOutbox(\n lane,\n outboxOf(lane).map((c) => (c.id === id ? next : c)),\n ),\n ),\n );\n }\n if (own) follow(s, own, next);\n }\n reorder(s, protocol);\n s.notify();\n};\n\nconst toPatch = (patch: StatewireClient.OutboxPatch): Patch => {\n if (typeof patch !== \"object\" || patch === null)\n throw new Error(\"outbox: update must return a patch object\");\n if (patch.held !== undefined && typeof patch.held !== \"boolean\")\n throw new Error(\"outbox: held must be a boolean\");\n if (\n patch.command !== undefined &&\n (Object.keys(patch.command).some((k) => k !== \"params\") ||\n !Array.isArray(patch.command.params))\n )\n throw new Error(\"outbox: a patch may only replace command.params\");\n return {\n ...(patch.held !== undefined && { held: patch.held }),\n ...(\"localMeta\" in patch && { localMeta: { value: patch.localMeta } }),\n ...(patch.command !== undefined && { params: patch.command.params }),\n };\n};\n\nconst outboxOp = (s: Session, id: string, op: OutboxOp): Promise<void> => {\n entryOf(s, id);\n const flushing = s.flushing;\n if (flushing?.ids.has(id)) {\n if (op.type === \"remove\") flushing.removed.add(id);\n else {\n const at = entryOf(s, id);\n const patch = op.patch(viewOf(s, at.protocol, at.stored));\n flushing.patches.set(id, { ...flushing.patches.get(id), ...patch });\n }\n return Promise.resolve();\n }\n const done = () => {\n wake(s);\n void pump(s);\n };\n if (!s.shared) {\n applyOutboxOp(s, id, op);\n done();\n return Promise.resolve();\n }\n return transact(s, () => applyOutboxOp(s, id, op)).then(done);\n};\n\nconst background = (promise: Promise<void>) => {\n promise.catch(() => {});\n};\n\nexport const holdOutbox = (s: Session, id: string) =>\n background(outboxOp(s, id, { type: \"patch\", patch: () => ({ held: true }) }));\n\nexport const releaseOutbox = (s: Session, id: string): Promise<unknown> => {\n entryOf(s, id);\n const result = new Promise<unknown>((resolve, reject) => {\n const waiters = s.releases.get(id) ?? [];\n waiters.push({ resolve, reject });\n s.releases.set(id, waiters);\n });\n result.catch(() => {});\n outboxOp(s, id, { type: \"patch\", patch: () => ({ held: false }) }).catch(\n (error: unknown) => settleWaiters(s, id, error),\n );\n return result;\n};\n\nconst settleWaiters = (s: Session, id: string, error: unknown) => {\n const waiters = s.releases.get(id) ?? [];\n s.releases.delete(id);\n for (const waiter of waiters) waiter.reject(error);\n};\n\nexport const removeOutbox = (s: Session, id: string) =>\n background(outboxOp(s, id, { type: \"remove\" }));\n\nexport const updateOutbox = (\n s: Session,\n id: string,\n fn: (entry: StatewireClient.OutboxEntry) => StatewireClient.OutboxPatch,\n) =>\n background(\n outboxOp(s, id, { type: \"patch\", patch: (entry) => toPatch(fn(entry)) }),\n );\n\nconst producedOf = (\n s: Session,\n): NonNullable<StatewireClient.SessionCommand[\"produced\"]> => ({\n wire: s.options.wireVersion ?? { version: WIRE_VERSION },\n protocols:\n protocolOffers(s.options) === \"*\" && s.selection\n ? s.selection.protocols\n : protocolOffers(s.options),\n});\n\nconst placed = (\n queue: readonly StatewireClient.OutboxCommand[],\n entry: StatewireClient.OutboxCommand,\n { after, before }: { after?: string; before?: string },\n) => {\n const anchor = after ?? before;\n if (anchor === undefined) return [...queue, entry];\n const index = queue.findIndex((c) => c.id === anchor);\n if (index === -1) return [...queue, entry];\n const at = after !== undefined ? index + 1 : index;\n return [...queue.slice(0, at), entry, ...queue.slice(at)];\n};\n\nexport const insertOutbox = (\n s: Session,\n entry: StatewireClient.OutboxInsert,\n): string => {\n if (!s.hydrated) throw new Error(\"outbox: storage is not hydrated yet\");\n if (s.storageError !== undefined) throw s.storageError;\n if (entry.after !== undefined && entry.before !== undefined)\n throw new Error(\"outbox: after and before are exclusive\");\n for (const anchor of [entry.after, entry.before])\n if (anchor !== undefined) entryOf(s, anchor);\n const { protocol } = entry;\n if (!(s.selection ? negotiated(s, protocol) : offered(s, protocol)))\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n const { params, meta } = encodeParams(entry.command.params);\n const id = entry.from === undefined ? newClientId() : `${entry.from}~`;\n const stored: StatewireClient.OutboxCommand = {\n id,\n produced: producedOf(s),\n method: entry.command.method,\n params,\n ...(meta !== undefined && { meta }),\n ts: Date.now(),\n ...(entry.held && { held: true as const }),\n ...(entry.localMeta !== undefined && { localMeta: entry.localMeta }),\n ...(s.store.owner !== undefined && { by: s.store.owner.id }),\n };\n const run = () => {\n if (isEphemeral(s, protocol)) {\n enqueueInner(\n s,\n {\n protocol,\n produced: stored.produced!,\n method: stored.method,\n params,\n ...(meta !== undefined && { meta }),\n },\n entry.command.params,\n () => {},\n () => {},\n {\n ...(entry.held && { hold: true }),\n ...(entry.localMeta !== undefined && { localMeta: entry.localMeta }),\n },\n );\n return;\n }\n let base = s.record;\n if (entry.from !== undefined) {\n // Re-inserting a settled update consumes it in the same write: a\n // redelivery finds it gone.\n const source = Object.entries(base.lanes).find(([, l]) =>\n l.inbox?.some((n) => n.id === entry.from),\n );\n if (source === undefined || locate(s, id) !== undefined) return;\n base = withLane(base, source[0], withoutNotice(source[1], entry.from));\n }\n const lane = laneOf(base, protocol);\n try {\n setRecord(\n s,\n withLane(\n base,\n protocol,\n withOutbox(lane, placed(outboxOf(lane), stored, entry)),\n ),\n );\n } catch (error) {\n if (!isQuota(error)) throw error;\n // The update stays unacked for the next mount.\n if (entry.from !== undefined) s.skipped.add(entry.from);\n settleReleases(s, id, { ok: false, failure: QUOTA });\n return;\n }\n s.mountIds.delete(id);\n reorder(s, protocol);\n s.notify();\n };\n const done = () => {\n wake(s);\n void pump(s);\n };\n if (!s.shared) {\n run();\n done();\n } else background(transact(s, run).then(done));\n return id;\n};\n\n// One sharer at a time runs the handler; the update leaves the record only\n// once it resolved, so a crash mid-handler redelivers it.\nconst nextNotice = (s: Session) => {\n for (const [protocol, lane] of Object.entries(s.record.lanes)) {\n const found = (lane.inbox ?? []).find((n) => !s.skipped.has(n.id));\n if (found) return { protocol, found };\n }\n return undefined;\n};\n\nconst withoutNotice = (\n lane: StatewireClient.SessionLane,\n id: string,\n): StatewireClient.SessionLane => {\n const inbox = (lane.inbox ?? []).filter((n) => n.id !== id);\n const { inbox: _inbox, ...rest } = lane;\n return inbox.length > 0 ? { ...rest, inbox } : rest;\n};\n\nconst ack = (s: Session, protocol: string, id: string) => {\n const lane = laneOf(s.record, protocol);\n if (s.skipped.has(id) || !lane.inbox?.some((n) => n.id === id)) return;\n setRecord(s, withLane(s.record, protocol, withoutNotice(lane, id)));\n};\n\nconst deliver = (s: Session) => {\n const handler = s.onSettled;\n // Handlers get ctx.state: delivery waits for the first hello.\n if (\n handler === undefined ||\n s.delivering ||\n !s.running ||\n !s.hydrated ||\n !s.sessionKnown\n )\n return;\n if (nextNotice(s) === undefined) return;\n s.delivering = true;\n const run = async () => {\n for (;;) {\n if (s.shared) await transact(s, () => {});\n else await null;\n const next = nextNotice(s);\n if (next === undefined || !s.running) return;\n const { protocol, found } = next;\n try {\n await handler(updateOf(protocol, found));\n } catch (error) {\n console.error(\n \"statewire: onCommandChange threw on a settled update; it stays for the next mount\",\n error,\n );\n s.skipped.add(found.id);\n continue;\n }\n if (s.shared) await transact(s, () => ack(s, protocol, found.id));\n else ack(s, protocol, found.id);\n s.notify();\n }\n };\n const locked = s.store.notifyLock ? s.store.notifyLock(run) : run();\n locked.then(\n () => {\n s.delivering = false;\n deliver(s);\n },\n (error: unknown) => {\n s.delivering = false;\n console.error(\"statewire: settled update delivery stopped\", error);\n },\n );\n};\n\nconst enqueue = (\n s: Session,\n command: WireCommand,\n params: readonly unknown[],\n resolve: (payload: unknown) => void,\n reject: (error: unknown) => void,\n options?: EnqueueOptions,\n) => {\n if (!s.shared) {\n enqueueInner(s, command, params, resolve, reject, options);\n wake(s);\n void pump(s);\n return;\n }\n void transact(s, () => {\n // A send queued behind the lock before this tab unmounted still lands in\n // the shared journal: another sharer adopts and replays it.\n if (isFinished(s)) {\n reject(new StatewireSendError({ fate: \"aborted\", cause: \"stream-gone\" }));\n return;\n }\n enqueueInner(s, command, params, resolve, reject, options);\n }).then(() => {\n wake(s);\n void pump(s);\n }, reject);\n};\n\nconst offered = (s: Session, protocol: string) => {\n const offers = protocolOffers(s.options);\n return offers === \"*\" || offers.some((offer) => offer.name === protocol);\n};\n\nconst sendCommand = (\n s: Session,\n method: string,\n params: readonly unknown[],\n protocol = s.options.protocol ?? DEFAULT_PROTOCOL,\n options?: StatewireClient.InvokeOptions,\n): Promise<unknown> => {\n const negotiated = s.selection\n ? s.selection.protocols.some((p) => p.name === protocol)\n : offered(s, protocol);\n if (!negotiated)\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n if (options?.hold !== undefined && typeof options.hold !== \"boolean\")\n throw new Error(\"statewire: invoke hold must be a boolean\");\n if (!s.hydrated) {\n const result = s.ready!.then(() =>\n sendCommand(s, method, params, protocol, options),\n );\n result.catch(() => {});\n return result;\n }\n if (s.storageError !== undefined) {\n const result = Promise.reject(s.storageError);\n result.catch(() => {});\n return result;\n }\n if (!s.running) {\n return rejectedSend({ fate: \"aborted\", cause: \"unmount\" });\n }\n if (isFinished(s)) {\n return rejectedSend({ fate: \"aborted\", cause: \"stream-gone\" });\n }\n const result = new Promise<unknown>((resolve, reject) => {\n const { params: encoded, meta } = encodeParams(params);\n enqueue(\n s,\n {\n protocol,\n produced: producedOf(s),\n method,\n params: encoded,\n ...(meta !== undefined && { meta }),\n },\n params,\n resolve,\n reject,\n {\n ...(options?.hold && { hold: true }),\n ...(options?.localMeta !== undefined && {\n localMeta: options.localMeta,\n }),\n },\n );\n });\n result.catch(() => {});\n return result;\n};\n\nexport const documentSource = (s: Session): StatewireDocuments.Source => ({\n get: (protocol, key, prefix = s.options.keyPrefixes?.[protocol]) => {\n const mounted = findDocument(s.documents, protocol, key, prefix);\n if (mounted !== undefined) return mounted.value;\n if (!s.documentStore || key === undefined) return undefined;\n const absolute = resolveDocumentKey(key, prefix);\n if (absolute === undefined) return undefined;\n const cached = s.documentStore.load([\n s.documentStore.namespace ?? \"\",\n protocol,\n ...absolute,\n ]);\n if (cached === undefined) return undefined;\n const offers = protocolOffers(s.options);\n const offer =\n offers === \"*\"\n ? s.selection?.protocols.find((p) => p.name === protocol)\n : offers.find((p) => p.name === protocol);\n return offer !== undefined && inRange(cached.version, offer)\n ? cached.value\n : undefined;\n },\n list: () => s.documents.documents,\n subscribe: (listener) => {\n s.documentListeners.add(listener);\n return () => {\n s.documentListeners.delete(listener);\n };\n },\n});\n\nexport const invokeProtocol = (\n s: Session,\n protocol: string,\n method: string,\n params: readonly unknown[],\n options?: StatewireClient.InvokeOptions,\n) => sendCommand(s, method, params, protocol, options);\n\nconst storedCommandCompatible = (\n protocol: string,\n command: StatewireClient.OutboxCommand,\n current: NonNullable<StatewireClient.SessionCommand[\"produced\"]>,\n) => {\n if (\n !command.produced ||\n !inRange(command.produced.wire.version, current.wire)\n )\n return false;\n const previous = command.produced.protocols;\n if (current.protocols === \"*\") return true;\n if (previous === \"*\") return false;\n const produced = previous.find((p) => p.name === protocol);\n const offer = current.protocols.find((p) => p.name === protocol);\n return (\n produced !== undefined &&\n offer !== undefined &&\n inRange(produced.version, offer)\n );\n};\n\nconst validateLanes = (record: StatewireClient.SessionRecord) => {\n if (\n typeof record.lanes !== \"object\" ||\n record.lanes === null ||\n Object.values(record.lanes).some(\n (lane) =>\n !Array.isArray(lane.commands) ||\n (lane.outbox !== undefined && !Array.isArray(lane.outbox)),\n )\n )\n throw new Error(\n \"statewire: session storage loaded a record without command lanes\",\n );\n};\n\nconst loadSessionRecord = (\n store: StatewireClient.SessionStorage,\n options: StatewireSessionOptions,\n) => {\n let stored = store.load();\n if (stored !== null) validateLanes(stored);\n const current = {\n wire: options.wireVersion ?? { version: WIRE_VERSION },\n protocols: protocolOffers(options),\n };\n const compatible = (record: StatewireClient.SessionRecord) =>\n Object.entries(record.lanes).every(([protocol, lane]) =>\n [...lane.commands, ...outboxOf(lane)].every((command) =>\n storedCommandCompatible(protocol, command, current),\n ),\n );\n if (stored !== null && !compatible(stored)) {\n if (!store.migrate)\n throw new Error(\"statewire: stored commands require a storage migration\");\n stored = store.migrate(stored, current);\n if (stored !== null) {\n validateLanes(stored);\n if (!compatible(stored))\n throw new Error(\"statewire: migrated commands are incompatible\");\n store.save(stored);\n }\n }\n const record =\n stored === null\n ? { clientId: newClientId(), lanes: {} }\n : boundInbox(store, stored);\n if (record !== stored) store.save(record);\n return record;\n};\n\nconst storedIds = (record: StatewireClient.SessionRecord) =>\n new Set(\n Object.values(record.lanes).flatMap((lane) => [\n ...lane.commands.map((c) => c.id),\n ...outboxOf(lane).map((c) => c.id),\n ]),\n );\n\nexport const setContext = (\n s: Session,\n protocol: string,\n value: Statewire.Context,\n): void => {\n if (\n s.selection\n ? !s.selection.protocols.some((p) => p.name === protocol)\n : !offered(s, protocol)\n )\n throw new Error(`statewire: protocol \"${protocol}\" is not negotiated`);\n s.contexts.set(protocol, encodeContext(protocol, value));\n s.dirtyContexts.add(protocol);\n wake(s);\n void pump(s);\n};\n\nexport const useStatewireSession = (\n options: StatewireSessionOptions,\n): Session => {\n const [defaultStore] = useState(createMemorySessionStore);\n const mounted = useContext(SessionStorageContext);\n const documentStore = useContext(DocumentStorageContext);\n if (options.sessionStore !== undefined && mounted !== undefined) {\n throw new Error(\n \"statewire: session storage is set twice — drop the transport's sessionStore or the client's storage.session\",\n );\n }\n const store = options.sessionStore ?? mounted ?? defaultStore;\n if (\n (store.lock === undefined) !== (store.subscribe === undefined) ||\n (store.lock === undefined) !== (store.owner === undefined) ||\n (store.lock === undefined) !== (store.notifyLock === undefined)\n ) {\n throw new Error(\n \"statewire: session storage must provide lock, subscribe, owner and notifyLock together\",\n );\n }\n const [s] = useState((): Session => {\n const record =\n store.ready === undefined\n ? loadSessionRecord(store, options)\n : { clientId: newClientId(), lanes: {} };\n const session: Session = {\n options,\n configuredContext: options.context,\n contexts: new Map(\n Object.entries(options.context ?? {}).map(([protocol, value]) => [\n protocol,\n encodeContext(protocol, value),\n ]),\n ),\n dirtyContexts: new Set(Object.keys(options.context ?? {})),\n attachContexts: new Map(),\n selection: undefined,\n record,\n ctx: {\n beforeAttach: () => persistBeforeSend(session),\n get clientId() {\n return session.record.clientId;\n },\n takeAttachLanes: () => takeAttachLanes(session),\n onHello: (args) => handleHello(session, args),\n onOps: (args) => handleOps(session, args),\n onCmds: (cmds) => handleCmds(session, cmds),\n onRefusal: (syn) => handleRefusal(session, syn),\n onIdle: (level) => setIdle(session, level),\n onDetach: () => handleDetach(session),\n onFinish: (args) => handleFinish(session, args),\n },\n recordPersisted: store.ready === undefined,\n hydrated: store.ready === undefined,\n ready: undefined,\n storageError: undefined,\n persistedRecord: store.ready === undefined ? record : null,\n store,\n documentStore,\n shared:\n store.lock !== undefined\n ? {\n txq: Promise.resolve(),\n syncQueued: false,\n parked: [],\n settled: new Set(),\n notices: [],\n inTx: false,\n unsubscribe: null,\n watched: new Set(),\n abort: null,\n }\n : false,\n ephemeral: false,\n deactivated: false,\n sessionKnown: false,\n durableSeq: {},\n ephemeralSeqs: {},\n resumeAt: 0,\n idle: false,\n onSessionLost: undefined,\n onDeprecatedPath: undefined,\n onSettled: undefined,\n releases: new Map(),\n delivering: false,\n skipped: new Set(),\n views: new WeakMap(),\n onFlush: undefined,\n onDone: undefined,\n mountIds: storedIds(record),\n flushing: null,\n outboxList: [],\n outboxParts: [],\n lanesOnAttach: false,\n attachEntries: new Set(),\n frameFailures: 0,\n recheck: undefined,\n rechecks: { watermarks: \"\", count: 0 },\n pending: [],\n canonical: undefined,\n documentListeners: new Set(),\n documents: { mode: null, documents: new Map() },\n lastPublished: undefined,\n changed: [],\n source: {\n snapshot: () => session.canonical,\n takeChanged: () => {\n const changed = session.changed;\n session.changed = [];\n return changed;\n },\n setOnChange: (listener) => {\n session.notify = listener ?? (() => {});\n },\n },\n attach: \"detached\",\n attachEpoch: 0,\n running: false,\n pumping: false,\n transport: null,\n waiters: [],\n lifecycle: null,\n notify: () => {},\n commands: createMethodProxy((method, params) =>\n sendCommand(session, method, params),\n ),\n };\n if (store.ready !== undefined) {\n session.ready = store.ready.then(() => {\n session.record = loadSessionRecord(store, session.options);\n session.mountIds = storedIds(session.record);\n session.recordPersisted = true;\n session.hydrated = true;\n if (session.running) session.notify();\n });\n session.ready = session.ready.catch((cause: unknown) => {\n const error = wrapStorageError(cause);\n session.storageError = error;\n session.transport?.storageFailed(error);\n throw error;\n });\n session.ready.catch(() => {});\n }\n bindCommandsHost(session.commands, {\n setListener: (listener) => {\n session.lifecycle = listener;\n },\n });\n return session;\n });\n if ((store.lock !== undefined) !== (s.shared !== false)) {\n throw new Error(\n \"statewire: session storage changed sharedness across renders — lock/subscribe must be present from the first render or never\",\n );\n }\n useEffect(() => {\n if (s.configuredContext === options.context) return;\n s.configuredContext = options.context;\n for (const [protocol, value] of Object.entries(options.context ?? {}))\n setContext(s, protocol, value);\n }, [s, options.context]);\n s.options = options;\n s.store = store;\n s.documentStore = documentStore;\n s.onSessionLost = options.onSessionLost;\n s.onDeprecatedPath = options.onDeprecatedPath;\n s.onSettled = options.onSettled;\n s.onFlush = options.onFlush;\n s.onDone = options.onDone;\n const keyPrefixes = JSON.stringify(options.keyPrefixes);\n useEffect(() => {\n cacheDocuments(s);\n }, [s, documentStore, keyPrefixes]);\n useEffect(\n () =>\n documentStore?.subscribe?.(() => {\n for (const listener of s.documentListeners) listener();\n }),\n [s, documentStore],\n );\n useEffect(() => {\n start(s);\n return () => stop(s);\n }, [s]);\n return s;\n};\n\nexport { setTransport };\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/client/session.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { encodeContext } from "../wire/context";
|
|
|
2
2
|
import { wrapStorageError } from "./storageError";
|
|
3
3
|
import {
|
|
4
4
|
DEFAULT_PROTOCOL,
|
|
5
|
+
GAP_FILL_VERSION,
|
|
5
6
|
WIRE_VERSION,
|
|
6
7
|
protocolOffers,
|
|
7
8
|
inRange,
|
|
@@ -182,6 +183,10 @@ type Session = {
|
|
|
182
183
|
lanesOnAttach: boolean;
|
|
183
184
|
attachEntries: ReadonlySet<Pending>;
|
|
184
185
|
frameFailures: number;
|
|
186
|
+
/** A later hello decides stamps this one could not: another live sharer's stamp sat below them. */
|
|
187
|
+
recheck: ReturnType<typeof setTimeout> | undefined;
|
|
188
|
+
/** Hellos in a row that left stamps waiting at the same watermarks: the recheck backs off. */
|
|
189
|
+
rechecks: { watermarks: string; count: number };
|
|
185
190
|
pending: Pending[];
|
|
186
191
|
canonical: unknown;
|
|
187
192
|
documentListeners: Set<() => void>;
|
|
@@ -1355,14 +1360,17 @@ const sessionLostInner = (s: Session, protocol: string, seqWm: number) => {
|
|
|
1355
1360
|
wake(s);
|
|
1356
1361
|
};
|
|
1357
1362
|
|
|
1358
|
-
// Every stamp above the watermark
|
|
1359
|
-
//
|
|
1360
|
-
// admitted
|
|
1363
|
+
// Every stamp above the watermark returns to the front of the outbox. A stamp
|
|
1364
|
+
// past watermark+1, or one this client saw admitted, proves the server record
|
|
1365
|
+
// that admitted it is gone. Another live sharer's stamp may still be on its
|
|
1366
|
+
// way on that sharer's attach: it and every stamp after it wait for a later
|
|
1367
|
+
// hello; the stamps before it never arrived and resend under their seqs.
|
|
1361
1368
|
const demote = (
|
|
1362
1369
|
s: Session,
|
|
1363
1370
|
protocol: string,
|
|
1364
1371
|
watermark: number,
|
|
1365
1372
|
demoted: Set<string>,
|
|
1373
|
+
waiting: Set<Pending>,
|
|
1366
1374
|
) => {
|
|
1367
1375
|
const lane = laneOf(s.record, protocol);
|
|
1368
1376
|
const local = laneEntries(s, protocol).filter((p) => p.seq > watermark);
|
|
@@ -1380,6 +1388,17 @@ const demote = (
|
|
|
1380
1388
|
sessionLostInner(s, protocol, watermark);
|
|
1381
1389
|
return;
|
|
1382
1390
|
}
|
|
1391
|
+
const me = s.store.owner?.id;
|
|
1392
|
+
const foreign = moved.find(
|
|
1393
|
+
(c) =>
|
|
1394
|
+
c.owner !== undefined &&
|
|
1395
|
+
c.owner !== me &&
|
|
1396
|
+
!local.some((p) => p.id === c.id),
|
|
1397
|
+
);
|
|
1398
|
+
if (foreign !== undefined) {
|
|
1399
|
+
for (const p of local) if (p.seq > foreign.seq) waiting.add(p);
|
|
1400
|
+
return;
|
|
1401
|
+
}
|
|
1383
1402
|
setRecord(
|
|
1384
1403
|
s,
|
|
1385
1404
|
withLane(s.record, protocol, {
|
|
@@ -1399,6 +1418,24 @@ const demote = (
|
|
|
1399
1418
|
sortPending(s);
|
|
1400
1419
|
};
|
|
1401
1420
|
|
|
1421
|
+
const recheckLater = (s: Session, watermarks: string) => {
|
|
1422
|
+
if (s.rechecks.watermarks !== watermarks)
|
|
1423
|
+
s.rechecks = { watermarks, count: 0 };
|
|
1424
|
+
s.rechecks.count += 1;
|
|
1425
|
+
if (s.recheck !== undefined) return;
|
|
1426
|
+
s.recheck = setTimeout(
|
|
1427
|
+
() => {
|
|
1428
|
+
s.recheck = undefined;
|
|
1429
|
+
if (s.running && s.attach === "attached")
|
|
1430
|
+
s.transport?.connection.reconnect();
|
|
1431
|
+
},
|
|
1432
|
+
backoff(s.rechecks.count + 1),
|
|
1433
|
+
);
|
|
1434
|
+
};
|
|
1435
|
+
|
|
1436
|
+
const gapFill = (s: Session) =>
|
|
1437
|
+
s.selection !== undefined && s.selection.version >= GAP_FILL_VERSION;
|
|
1438
|
+
|
|
1402
1439
|
const selectionOf = (
|
|
1403
1440
|
syn: StatewireSyn,
|
|
1404
1441
|
): StatewireProtocol.Selection | undefined => {
|
|
@@ -1446,6 +1483,7 @@ const handleHello = (
|
|
|
1446
1483
|
// verdicts (the server never re-runs them); seqs above it never arrived
|
|
1447
1484
|
// and go back to the outbox for fresh ones.
|
|
1448
1485
|
const demoted = new Set<string>();
|
|
1486
|
+
const waiting = new Set<Pending>();
|
|
1449
1487
|
for (const lane of lanes) {
|
|
1450
1488
|
if (lane.record === "ephemeral") {
|
|
1451
1489
|
s.ephemeralSeqs[lane.name] = Math.max(
|
|
@@ -1456,17 +1494,24 @@ const handleHello = (
|
|
|
1456
1494
|
);
|
|
1457
1495
|
continue;
|
|
1458
1496
|
}
|
|
1459
|
-
demote(s, lane.name, lane.seq ?? 0, demoted);
|
|
1497
|
+
demote(s, lane.name, lane.seq ?? 0, demoted, waiting);
|
|
1460
1498
|
s.durableSeq[lane.name] = lane.seq ?? 0;
|
|
1461
1499
|
}
|
|
1462
1500
|
for (const entry of s.pending) {
|
|
1463
1501
|
entry.posted =
|
|
1464
1502
|
attached.has(entry) ||
|
|
1503
|
+
waiting.has(entry) ||
|
|
1465
1504
|
(isStamped(entry) &&
|
|
1466
1505
|
entry.seq <= durableSeqOf(s, entry.command.protocol) &&
|
|
1467
1506
|
!isEphemeral(s, entry.command.protocol));
|
|
1468
1507
|
entry.stale = false;
|
|
1469
1508
|
}
|
|
1509
|
+
if (waiting.size > 0)
|
|
1510
|
+
recheckLater(
|
|
1511
|
+
s,
|
|
1512
|
+
JSON.stringify(lanes.map((lane) => [lane.name, lane.seq])),
|
|
1513
|
+
);
|
|
1514
|
+
else s.rechecks = { watermarks: "", count: 0 };
|
|
1470
1515
|
syncBacklogInner(s);
|
|
1471
1516
|
s.sessionKnown = true;
|
|
1472
1517
|
flushInner(s, demoted);
|
|
@@ -1684,20 +1729,23 @@ const pump = async (s: Session) => {
|
|
|
1684
1729
|
if (!s.hydrated) await s.ready;
|
|
1685
1730
|
const transport = s.transport;
|
|
1686
1731
|
const flushable = flushCandidates(s).length > 0;
|
|
1687
|
-
const queued =
|
|
1732
|
+
const queued =
|
|
1733
|
+
s.pending.some((p) => isOutboxed(p) && !p.inv.held) ||
|
|
1734
|
+
queuedInRecord(s);
|
|
1688
1735
|
if (
|
|
1689
1736
|
buildLanes(s) === null &&
|
|
1690
1737
|
!flushable &&
|
|
1691
1738
|
(!queued || s.attach === "attached")
|
|
1692
1739
|
)
|
|
1693
1740
|
return;
|
|
1694
|
-
|
|
1741
|
+
const waiting = s.pending.length > 0 || queued;
|
|
1742
|
+
if (transport?.parked && !waiting) return;
|
|
1695
1743
|
if (s.attach !== "attached" || !transport) {
|
|
1696
|
-
if (
|
|
1744
|
+
if (!waiting) return;
|
|
1697
1745
|
if (
|
|
1698
1746
|
(transport?.connection.status === "standby" &&
|
|
1699
1747
|
transport.connection.reason === "idle") ||
|
|
1700
|
-
|
|
1748
|
+
transport?.parked
|
|
1701
1749
|
) {
|
|
1702
1750
|
transport.connection.reconnect();
|
|
1703
1751
|
}
|
|
@@ -1743,6 +1791,18 @@ const pump = async (s: Session) => {
|
|
|
1743
1791
|
: send(lanes));
|
|
1744
1792
|
} catch {
|
|
1745
1793
|
if (!s.running || isFinished(s)) return;
|
|
1794
|
+
// The frame may have arrived. Under the gap-fill wire its seqs never
|
|
1795
|
+
// go out again: the next hello answers what arrived and frees the rest.
|
|
1796
|
+
if (lanes !== null && lanes.entries.length > 0 && gapFill(s)) {
|
|
1797
|
+
if (epoch !== s.attachEpoch) continue;
|
|
1798
|
+
for (const entry of lanes.entries)
|
|
1799
|
+
if (s.pending.includes(entry)) entry.posted = true;
|
|
1800
|
+
s.frameFailures += 1;
|
|
1801
|
+
await sleepUntilWake(s, backoff(s.frameFailures));
|
|
1802
|
+
if (s.running && epoch === s.attachEpoch && s.attach === "attached")
|
|
1803
|
+
transport.connection.reconnect();
|
|
1804
|
+
continue;
|
|
1805
|
+
}
|
|
1746
1806
|
if (lanes?.frame.ctx?.length) {
|
|
1747
1807
|
s.lanesOnAttach = true;
|
|
1748
1808
|
transport.connection.reconnect();
|
|
@@ -1852,6 +1912,8 @@ const start = (s: Session) => {
|
|
|
1852
1912
|
|
|
1853
1913
|
const stop = (s: Session) => {
|
|
1854
1914
|
s.running = false;
|
|
1915
|
+
clearTimeout(s.recheck);
|
|
1916
|
+
s.recheck = undefined;
|
|
1855
1917
|
if (s.shared) {
|
|
1856
1918
|
s.shared.unsubscribe?.();
|
|
1857
1919
|
s.shared.unsubscribe = null;
|
|
@@ -2038,6 +2100,16 @@ const flushCandidates = (s: Session): Candidate[] =>
|
|
|
2038
2100
|
return order.slice(0, free).map((stored) => ({ protocol, stored }));
|
|
2039
2101
|
});
|
|
2040
2102
|
|
|
2103
|
+
// An entry the record holds that a flush would stamp once attached, whether
|
|
2104
|
+
// or not this page made the send: inserted, or kept from an earlier mount or
|
|
2105
|
+
// another sharer. It dials a parked or idle transport as a send does.
|
|
2106
|
+
const queuedInRecord = (s: Session) =>
|
|
2107
|
+
Object.keys(s.record.lanes).some(
|
|
2108
|
+
(protocol) =>
|
|
2109
|
+
(s.selection ? negotiated(s, protocol) : offered(s, protocol)) &&
|
|
2110
|
+
bubble(s, protocol, laneQueue(s, protocol)).free > 0,
|
|
2111
|
+
);
|
|
2112
|
+
|
|
2041
2113
|
const reasonOf = (
|
|
2042
2114
|
s: Session,
|
|
2043
2115
|
stored: StatewireClient.OutboxCommand,
|
|
@@ -2878,6 +2950,8 @@ export const useStatewireSession = (
|
|
|
2878
2950
|
lanesOnAttach: false,
|
|
2879
2951
|
attachEntries: new Set(),
|
|
2880
2952
|
frameFailures: 0,
|
|
2953
|
+
recheck: undefined,
|
|
2954
|
+
rechecks: { watermarks: "", count: 0 },
|
|
2881
2955
|
pending: [],
|
|
2882
2956
|
canonical: undefined,
|
|
2883
2957
|
documentListeners: new Set(),
|