on-zero 0.6.2 → 0.6.4
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/cjs/createZeroClient.cjs +91 -12
- package/dist/cjs/createZeroClient.connection.test.cjs +163 -0
- package/dist/cjs/createZeroClient.connection.test.native.js +242 -0
- package/dist/cjs/createZeroClient.connection.test.native.js.map +1 -0
- package/dist/cjs/createZeroClient.native.js +99 -12
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroClient.recovery.test.cjs +52 -0
- package/dist/cjs/createZeroClient.recovery.test.native.js +52 -0
- package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.cjs +197 -14
- package/dist/cjs/helpers/recoverZeroClient.native.js +220 -24
- package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.test.cjs +241 -0
- package/dist/cjs/helpers/recoverZeroClient.test.native.js +269 -0
- package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.native.js +2 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/multi.cjs +13 -0
- package/dist/cjs/multi.native.js +35 -0
- package/dist/cjs/multi.native.js.map +1 -1
- package/dist/cjs/multiPartition.test.cjs +42 -0
- package/dist/cjs/multiPartition.test.native.js +51 -0
- package/dist/cjs/multiPartition.test.native.js.map +1 -0
- package/dist/esm/createZeroClient.connection.test.mjs +164 -0
- package/dist/esm/createZeroClient.connection.test.mjs.map +1 -0
- package/dist/esm/createZeroClient.connection.test.native.js +240 -0
- package/dist/esm/createZeroClient.connection.test.native.js.map +1 -0
- package/dist/esm/createZeroClient.mjs +92 -13
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +100 -13
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.mjs +52 -0
- package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.native.js +52 -0
- package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.mjs +196 -15
- package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.native.js +219 -25
- package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.mjs +242 -1
- package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.native.js +270 -1
- package/dist/esm/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -2
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/multi.mjs +13 -1
- package/dist/esm/multi.mjs.map +1 -1
- package/dist/esm/multi.native.js +35 -1
- package/dist/esm/multi.native.js.map +1 -1
- package/dist/esm/multiPartition.test.mjs +43 -0
- package/dist/esm/multiPartition.test.mjs.map +1 -0
- package/dist/esm/multiPartition.test.native.js +49 -0
- package/dist/esm/multiPartition.test.native.js.map +1 -0
- package/lint/ssr-guards.js +164 -0
- package/package.json +2 -2
- package/readme.md +126 -0
- package/src/createZeroClient.connection.test.tsx +162 -0
- package/src/createZeroClient.recovery.test.tsx +68 -0
- package/src/createZeroClient.tsx +159 -13
- package/src/helpers/recoverZeroClient.test.ts +270 -1
- package/src/helpers/recoverZeroClient.ts +347 -50
- package/src/index.ts +6 -0
- package/src/multi.ts +33 -0
- package/src/multiPartition.test.ts +38 -0
- package/types/createZeroClient.connection.test.d.ts +5 -0
- package/types/createZeroClient.connection.test.d.ts.map +1 -0
- package/types/createZeroClient.d.ts +17 -0
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/createZeroServer.d.ts +4 -4
- package/types/helpers/recoverZeroClient.d.ts +23 -1
- package/types/helpers/recoverZeroClient.d.ts.map +1 -1
- package/types/index.d.ts +1 -1
- package/types/index.d.ts.map +1 -1
- package/types/multi.d.ts +1 -0
- package/types/multi.d.ts.map +1 -1
- package/types/multiPartition.test.d.ts +2 -0
- package/types/multiPartition.test.d.ts.map +1 -0
|
@@ -125,4 +125,56 @@ test("zero.delete invalidates cached instance before a remount recovery", async
|
|
|
125
125
|
expect(fakeZero.instances).toHaveLength(2);
|
|
126
126
|
expect(fakeZero.instances[1]).not.toBe(first);
|
|
127
127
|
});
|
|
128
|
+
test("remint drops local state and reconstructs a fresh instance in place", async function () {
|
|
129
|
+
root = createRoot(container);
|
|
130
|
+
await act(async function () {
|
|
131
|
+
root === null || root === void 0 ? void 0 : root.render(/* @__PURE__ */_jsx(client.ProvideZero, {
|
|
132
|
+
cacheURL: "http://127.0.0.1:7777/zero",
|
|
133
|
+
userID: "remint-test",
|
|
134
|
+
children: /* @__PURE__ */_jsx("span", {
|
|
135
|
+
children: "ok"
|
|
136
|
+
})
|
|
137
|
+
}));
|
|
138
|
+
await Promise.resolve();
|
|
139
|
+
});
|
|
140
|
+
var first = fakeZero.instances.at(-1);
|
|
141
|
+
expect(first).toBeDefined();
|
|
142
|
+
var countBefore = fakeZero.instances.length;
|
|
143
|
+
var result;
|
|
144
|
+
await act(async function () {
|
|
145
|
+
result = await client.remint();
|
|
146
|
+
await Promise.resolve();
|
|
147
|
+
});
|
|
148
|
+
expect(result).toBe(true);
|
|
149
|
+
expect(first === null || first === void 0 ? void 0 : first.delete).toHaveBeenCalledTimes(1);
|
|
150
|
+
expect(fakeZero.instances.length).toBe(countBefore + 1);
|
|
151
|
+
expect(fakeZero.instances.at(-1)).not.toBe(first);
|
|
152
|
+
});
|
|
153
|
+
test("remint with no provider mounted returns false without burning the guard budget", async function () {
|
|
154
|
+
var isolated = createZeroClient({
|
|
155
|
+
schema,
|
|
156
|
+
models: {},
|
|
157
|
+
groupedQueries: {},
|
|
158
|
+
instanceName: "remint-unmounted-test"
|
|
159
|
+
});
|
|
160
|
+
expect(await isolated.remint()).toBe(false);
|
|
161
|
+
expect(await isolated.remint()).toBe(false);
|
|
162
|
+
root = createRoot(container);
|
|
163
|
+
await act(async function () {
|
|
164
|
+
root === null || root === void 0 ? void 0 : root.render(/* @__PURE__ */_jsx(isolated.ProvideZero, {
|
|
165
|
+
cacheURL: "http://127.0.0.1:7777/zero",
|
|
166
|
+
userID: "remint-unmounted",
|
|
167
|
+
children: /* @__PURE__ */_jsx("span", {
|
|
168
|
+
children: "ok"
|
|
169
|
+
})
|
|
170
|
+
}));
|
|
171
|
+
await Promise.resolve();
|
|
172
|
+
});
|
|
173
|
+
var result;
|
|
174
|
+
await act(async function () {
|
|
175
|
+
result = await isolated.remint();
|
|
176
|
+
await Promise.resolve();
|
|
177
|
+
});
|
|
178
|
+
expect(result).toBe(true);
|
|
179
|
+
});
|
|
128
180
|
//# sourceMappingURL=createZeroClient.recovery.test.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["jsx","_jsx","createSchema","string","table","act","createRoot","afterEach","beforeEach","expect","test","vi","createZeroClient","_class_call_check","instance","Constructor","TypeError","_define_property","obj","key","value","Object","defineProperty","enumerable","configurable","writable","fakeZero","hoisted","FakeZero","FakeZero2","state","current","name","subscribe","connect","fn","errors","cleanup","complete","Promise","resolve","instances","push","mock","importOriginal","actual","Zero","globalThis","IS_REACT_ACT_ENVIRONMENT","noteTable","columns","id","body","primaryKey","schema","tables"],"sources":["../../src/createZeroClient.recovery.test.tsx"],"sourcesContent":[null],"mappings":"AAEA,SAASA,GAAA,IAAAC,IAAA,QAAc,mBAAqB;AAC5C,SAASC,YAAW,EAAAC,MAAA,EAAAC,KAAA;AACpB,SAASC,GAAA,eAA6B;AACtC,SAASC,UAAA,QAAW,kBAAoB;AAqCxC,SAASC,SAAA,EAAAC,UAAA,EAAAC,MAAwB,EAAAC,IAAA,EAAAC,EAAA;AAoCzB,SAAAC,gBAAA;AAvER,SAAMC,iBAAcA,CAAAC,QAAc,EAAAC,WAAA;EAChC,MAAMD,QAAA,YAASC,WAAA;IACJ,UAAUC,SAAC;EAAA;AACE;AACb,SACLC,gBAAiBA,CAAAC,GAAA,EAAAC,GAAS,EAAAC,KAAA;EAAA,IAAAD,GAC1B,IAAAD,GAAA;IAAuBG,MAAC,CAAAC,cAAA,CAAAJ,GAAA,EAAAC,GAAA;MAC1BC,KAAA;MACAG,UAAS,EAAG,IAAG;MACjBC,YAAA;MACSC,QAAS,EAAG;IACZ;EAAc,OACd;IACAP,GAAA,CAAAC,GAAA,IAAUC,KAAM;EAAO;EACf,OAACF,GAAA;AAAA;AACU,IAC5BQ,QAAE,GAAAf,EAAA,CAAAgB,OAAA;EAAA,IAEFC,QAAA,YAAcC,UAAA;IACZ,YAAU;;IACZhB,iBAAA,OAAAgB,SAAA;IACFZ,gBAAA;IAEAA,gBAA8B,CAAC;MAC/Ba,KAAS;QACVC,OAAA;UAEOC,IAAA;QACA;QACNC,SAAO,WAAAA,CAAA;UACF,oBACG;QACR;MACD;MAQDC,OAAW,EAAAvB,EAAA,CAAAwB,EAAA;IAEX,EAAM;IACNlB,gBAAe,eAAe,EAAAN,EAAS,CAAAwB,EAAA,mBAAY;MAE7C;QACJC,MAAA;MACA;IACA;IACAnB,gBAAc,gBAAAN,EAAA,CAAAwB,EAAA;IACflB,gBAAA,cAAAN,EAAA,CAAAwB,EAAA;MAEG;IACA;IAEJlB,gBAAiB,kBAAAN,EAAA,CAAAwB,EAAA;MACf,OAAS;QACTE,OAAY,WAAAA,CAAA,EAAS,CACrB,CAAO;QACRC,QAAA,EAAAC,OAAA,CAAAC,OAAA;MAED;IACE,EAAI;IACLC,SAAA,CAAAC,IAAA;EAED;EACE,IAAAD,SAAO,KAAW;EAClB,OAAM;IACJb,QAAM;IAAAa;EAGJ;AAEF;AAAsB9B,EACxB,CAACgC,IAAA,mCAAAC,cAAA;EACH,IAAAC,MAAA,SAAAD,cAAA;EAEA,OAAK;IACH,GAAAC,MAAM;IACNC,IAAM,EAAApB,QAAQ,CAAAE;EACd;AAEA;AACAmB,UAAM,CAAAC,wBAAgB;AACpB,IAAAC,SAAM,GAAA7C,KAAW,SAAA8C,OAAA;EACnBC,EAAC,EAAAhD,MAAA;EAEDiD,IAAA,EAAAjD,MAAO;AACP,GAAAkD,UAAO,KAAO;AAEd,IAAAC,MAAI,GAAMpD,YAAM,CAAQ;EACxBqD,MAAM,GAENN,SAAO;AAET,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","createSchema","string","table","act","createRoot","afterEach","beforeEach","expect","test","vi","createZeroClient","_class_call_check","instance","Constructor","TypeError","_define_property","obj","key","value","Object","defineProperty","enumerable","configurable","writable","fakeZero","hoisted","FakeZero","FakeZero2","state","current","name","subscribe","connect","fn","errors","cleanup","complete","Promise","resolve","instances","push","mock","importOriginal","actual","Zero","globalThis","IS_REACT_ACT_ENVIRONMENT","noteTable","columns","id","body","primaryKey","schema","tables","client","models","groupedQueries","instanceName","container","root","length","document","createElement","unmount","mount","render","ProvideZero","cacheURL","userID","children","first","toBeDefined","deleteZero","zero","delete","toHaveBeenCalledTimes","close","toHaveLength","not","toBe"],"sources":["../../src/createZeroClient.recovery.test.tsx"],"sourcesContent":[null],"mappings":"AAEA,SAASA,GAAA,IAAAC,IAAA,QAAc,mBAAqB;AAC5C,SAASC,YAAW,EAAAC,MAAA,EAAAC,KAAA;AACpB,SAASC,GAAA,eAA6B;AACtC,SAASC,UAAA,QAAW,kBAAoB;AAqCxC,SAASC,SAAA,EAAAC,UAAA,EAAAC,MAAwB,EAAAC,IAAA,EAAAC,EAAA;AAoCzB,SAAAC,gBAAA;AAvER,SAAMC,iBAAcA,CAAAC,QAAc,EAAAC,WAAA;EAChC,MAAMD,QAAA,YAASC,WAAA;IACJ,UAAUC,SAAC;EAAA;AACE;AACb,SACLC,gBAAiBA,CAAAC,GAAA,EAAAC,GAAS,EAAAC,KAAA;EAAA,IAAAD,GAC1B,IAAAD,GAAA;IAAuBG,MAAC,CAAAC,cAAA,CAAAJ,GAAA,EAAAC,GAAA;MAC1BC,KAAA;MACAG,UAAS,EAAG,IAAG;MACjBC,YAAA;MACSC,QAAS,EAAG;IACZ;EAAc,OACd;IACAP,GAAA,CAAAC,GAAA,IAAUC,KAAM;EAAO;EACf,OAACF,GAAA;AAAA;AACU,IAC5BQ,QAAE,GAAAf,EAAA,CAAAgB,OAAA;EAAA,IAEFC,QAAA,YAAcC,UAAA;IACZ,YAAU;;IACZhB,iBAAA,OAAAgB,SAAA;IACFZ,gBAAA;IAEAA,gBAA8B,CAAC;MAC/Ba,KAAS;QACVC,OAAA;UAEOC,IAAA;QACA;QACNC,SAAO,WAAAA,CAAA;UACF,oBACG;QACR;MACD;MAQDC,OAAW,EAAAvB,EAAA,CAAAwB,EAAA;IAEX,EAAM;IACNlB,gBAAe,eAAe,EAAAN,EAAS,CAAAwB,EAAA,mBAAY;MAE7C;QACJC,MAAA;MACA;IACA;IACAnB,gBAAc,gBAAAN,EAAA,CAAAwB,EAAA;IACflB,gBAAA,cAAAN,EAAA,CAAAwB,EAAA;MAEG;IACA;IAEJlB,gBAAiB,kBAAAN,EAAA,CAAAwB,EAAA;MACf,OAAS;QACTE,OAAY,WAAAA,CAAA,EAAS,CACrB,CAAO;QACRC,QAAA,EAAAC,OAAA,CAAAC,OAAA;MAED;IACE,EAAI;IACLC,SAAA,CAAAC,IAAA;EAED;EACE,IAAAD,SAAO,KAAW;EAClB,OAAM;IACJb,QAAM;IAAAa;EAGJ;AAEF;AAAsB9B,EACxB,CAACgC,IAAA,mCAAAC,cAAA;EACH,IAAAC,MAAA,SAAAD,cAAA;EAEA,OAAK;IACH,GAAAC,MAAM;IACNC,IAAM,EAAApB,QAAQ,CAAAE;EACd;AAEA;AACAmB,UAAM,CAAAC,wBAAgB;AACpB,IAAAC,SAAM,GAAA7C,KAAW,SAAA8C,OAAA;EACnBC,EAAC,EAAAhD,MAAA;EAEDiD,IAAA,EAAAjD,MAAO;AACP,GAAAkD,UAAO,KAAO;AAEd,IAAAC,MAAI,GAAMpD,YAAM,CAAQ;EACxBqD,MAAM,GAENN,SAAO;AAET,CAAC;AAED,IAAAO,MAAK,GAAA5C,gBAAA;EAGH0C,MAAA;EACAG,MAAM,IAAI;EACRC,cAAM;EAAAC,YACJ;AAEA;AAEF,IAAAC,SAAM;AAAgB,IACvBC,IAAA;AACDrD,UAAM,aAAQ;EACdkB,QAAO,CAAAe,SAAO,CAAAqB,MAAA,GAAY;EAC1BF,SAAM,GAAAG,QAAc,CAAAC,aAAS,MAAU;EAEvCH,IAAI;AACJ;AACEtD,SAAA,aAAe;EAEf,IAAAsD,IAAM,EAAAxD,GAAA,aAAgB;IACvB,OAAAwD,IAAA,aAAAA,IAAA,uBAAAA,IAAA,CAAAI,OAAA;EAED;AAGA;AACA,eAAOC,KAASA,CAAA;EAChBL,IAAA,GAAOvD,UAAS,CAAAsD,SAAU;EAC3B,MAAAvD,GAAA;IAEDwD,IAAK,aAAAA,IAAA,uBAAAA,IAAA,CAAAM,MAAA,gBAAAlE,IAAA,CAAAuD,MAAkF,CAAAY,WAAY;MAEjGC,QAAM,8BAA4B;MAChCC,MAAA;MACAC,QAAS,iBAAAtE,IAAA;QACTsE,QAAA;MACA;IACD;IAID,MAAOhC,OAAM,CAAAC,OAAS;EACtB;AAEA;AACA9B,IAAA,oEAAsB;EACpB,MAAAwD,KAAM;EAAA,IACJM,KAAA,GAAA9C,QAAA,CAAAe,SAAA;EAAAhC,MAAC,CAAA+D,KAAA,EAAAC,WAAS;EAAA,IAAAC,UAAT,GAAAlB,MAAA,CAAAmB,IAAA,CAAAC,MAAA;EAAA,MAAAvE,GACC,mBAAS;IAAA,MACTqE,UAAO;EAAA;EAECjE,MAAA,CAAA+D,KAAA,aAAAA,KAAA,uBAAAA,KAAA,CAAAI,MAAA,EAAAC,qBAAA;EAAApE,MACV,CAAA+D,KAAA,aAAAA,KAAA,uBAAAA,KAAA,CAAAM,KAAA,EAAAD,qBAAA;EAAAxE,GACF;IACA,OAAMwD,IAAA,KAAQ,QAAQA,IAAA,uBAAAA,IAAA,CAAAI,OAAA;EACxB,CAAC;EAID,MAAIC,KAAA;EACJzD,MAAM,CAAAiB,QAAI,CAAAe,SAAY,EAAAsC,YAAA;EACpBtE,MAAA,CAAAiB,QAAS,CAAAe,SAAM,CAAS,IAAAuC,GAAO,CAAAC,IAAA,CAAAT,KAAA;AAC/B;AAAsB9D,IACvB;EACDmD,IAAA,GAAOvD,UAAQ,CAAAsD,SAAS;EACzB,MAAAvD,GAAA","ignoreList":[]}
|
|
@@ -1,23 +1,75 @@
|
|
|
1
1
|
const RECOVER_GUARD_MS = 6e4;
|
|
2
|
+
const RELOAD_LATCH_TIMEOUT_MS = 15e3;
|
|
2
3
|
const LOCAL_STORE_LOST = "Expected IndexedDB not found";
|
|
4
|
+
const SQLITE_ERROR_NAME = "SqliteError";
|
|
5
|
+
const SQLITE_STATEMENT_FINALIZED = "This statement has been finalized";
|
|
6
|
+
const STORE_CLOSED = "Store is closed";
|
|
7
|
+
const STORE_CLOSED_REPEAT_MIN_MS = 2e3;
|
|
8
|
+
const STORE_CLOSED_REPEAT_MAX_MS = 6e4;
|
|
3
9
|
let reloadScheduled = false;
|
|
10
|
+
let reloadInProgress = false;
|
|
11
|
+
let reloadLatchTimer;
|
|
4
12
|
const pendingDeletes = [];
|
|
5
|
-
|
|
13
|
+
const inMemoryGuard = /* @__PURE__ */new Map();
|
|
14
|
+
function defaultGuardStorage() {
|
|
6
15
|
try {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
16
|
+
if (typeof window === "undefined" || !window.sessionStorage) return void 0;
|
|
17
|
+
return window.sessionStorage;
|
|
18
|
+
} catch {
|
|
19
|
+
return void 0;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function recoveryGuardOpen(reasonKey, guardStorage) {
|
|
23
|
+
const key = `on-zero-recover-${reasonKey}`;
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
const memLast = inMemoryGuard.get(key) ?? 0;
|
|
26
|
+
if (memLast > 0 && now - memLast < RECOVER_GUARD_MS) return false;
|
|
27
|
+
const storage = guardStorage ?? defaultGuardStorage();
|
|
28
|
+
if (storage) {
|
|
29
|
+
try {
|
|
30
|
+
const rawLast = storage.getItem(key);
|
|
31
|
+
const last = rawLast ? Number(rawLast) : 0;
|
|
32
|
+
if (last > 0 && now - last < RECOVER_GUARD_MS) return false;
|
|
33
|
+
storage.setItem(key, String(now));
|
|
34
|
+
} catch {}
|
|
35
|
+
}
|
|
36
|
+
inMemoryGuard.set(key, now);
|
|
12
37
|
return true;
|
|
13
38
|
}
|
|
39
|
+
let lastStoreClosedAtMs = 0;
|
|
40
|
+
function armReloadLatchTimeout() {
|
|
41
|
+
if (typeof setTimeout !== "function") return;
|
|
42
|
+
if (reloadLatchTimer) clearTimeout(reloadLatchTimer);
|
|
43
|
+
reloadLatchTimer = setTimeout(() => {
|
|
44
|
+
reloadLatchTimer = void 0;
|
|
45
|
+
reloadScheduled = false;
|
|
46
|
+
}, RELOAD_LATCH_TIMEOUT_MS);
|
|
47
|
+
if (reloadLatchTimer && typeof reloadLatchTimer === "object" && "unref" in reloadLatchTimer) {
|
|
48
|
+
reloadLatchTimer.unref();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function disarmReloadLatchTimeout() {
|
|
52
|
+
if (reloadLatchTimer) {
|
|
53
|
+
clearTimeout(reloadLatchTimer);
|
|
54
|
+
reloadLatchTimer = void 0;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function performReload(deps) {
|
|
58
|
+
if (reloadInProgress) return Promise.resolve();
|
|
59
|
+
reloadInProgress = true;
|
|
60
|
+
disarmReloadLatchTimeout();
|
|
61
|
+
const doReload = deps.reload ?? (() => globalThis.location?.reload?.());
|
|
62
|
+
return Promise.resolve().then(() => Promise.allSettled(pendingDeletes.splice(0).map(run => run()))).then(() => deps.beforeReload?.()).catch(() => {}).then(() => {
|
|
63
|
+
doReload();
|
|
64
|
+
});
|
|
65
|
+
}
|
|
14
66
|
function recover(deps, reasonKey, message, dropLocalState) {
|
|
15
67
|
if (typeof window === "undefined") return;
|
|
16
68
|
if (dropLocalState) {
|
|
17
|
-
pendingDeletes.push(Promise.resolve().then(deps.deleteLocalState)
|
|
69
|
+
pendingDeletes.push(() => Promise.resolve().then(deps.deleteLocalState));
|
|
18
70
|
}
|
|
19
71
|
if (reloadScheduled) return;
|
|
20
|
-
if (!recoveryGuardOpen(reasonKey)) {
|
|
72
|
+
if (!recoveryGuardOpen(reasonKey, deps.guardStorage)) {
|
|
21
73
|
console.error(`[on-zero] ${message} \u2014 already recovered once, not reloading`);
|
|
22
74
|
deps.zeroEvents.emit({
|
|
23
75
|
type: "fatal",
|
|
@@ -26,13 +78,23 @@ function recover(deps, reasonKey, message, dropLocalState) {
|
|
|
26
78
|
return;
|
|
27
79
|
}
|
|
28
80
|
reloadScheduled = true;
|
|
81
|
+
armReloadLatchTimeout();
|
|
29
82
|
console.warn(`[on-zero] ${message} \u2014 recovering`);
|
|
30
83
|
deps.zeroEvents.emit({
|
|
31
84
|
type: "recovering",
|
|
32
85
|
reason: message
|
|
33
86
|
});
|
|
34
|
-
const
|
|
35
|
-
|
|
87
|
+
const runReload = () => performReload(deps);
|
|
88
|
+
if (deps.scheduleReload) {
|
|
89
|
+
deps.scheduleReload({
|
|
90
|
+
reason: message,
|
|
91
|
+
reasonKey,
|
|
92
|
+
dropLocalState,
|
|
93
|
+
performReload: runReload
|
|
94
|
+
});
|
|
95
|
+
} else {
|
|
96
|
+
void runReload();
|
|
97
|
+
}
|
|
36
98
|
}
|
|
37
99
|
function makeZeroRecovery(deps) {
|
|
38
100
|
return {
|
|
@@ -50,25 +112,144 @@ function logToConsole(level, context, ...args) {
|
|
|
50
112
|
const method = level === "debug" ? "debug" : level;
|
|
51
113
|
console[method](...(prefix ? [prefix] : []), ...args);
|
|
52
114
|
}
|
|
115
|
+
function logArgText(arg) {
|
|
116
|
+
if (typeof arg === "string") return arg;
|
|
117
|
+
if (arg instanceof Error) return `${arg.name} ${arg.message} ${arg.stack || ""}`;
|
|
118
|
+
if (arg && typeof arg === "object") {
|
|
119
|
+
const message = "message" in arg ? arg.message : void 0;
|
|
120
|
+
const name = "name" in arg ? arg.name : void 0;
|
|
121
|
+
if (typeof message === "string") return `${typeof name === "string" ? name : ""} ${message}`;
|
|
122
|
+
}
|
|
123
|
+
return "";
|
|
124
|
+
}
|
|
125
|
+
function isBenignStoreClosedLog(text) {
|
|
126
|
+
if (/Mutator\s+".*"\s+error on server/i.test(text)) return true;
|
|
127
|
+
if (/Mutator\s+".*"\s+app error on client/i.test(text)) return true;
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
function classifyMutationDesync(text) {
|
|
131
|
+
if (text.includes("sent mutation ID") && text.includes("but expected")) {
|
|
132
|
+
return {
|
|
133
|
+
reason: "mutation-desync",
|
|
134
|
+
reasonKey: "mutation-desync",
|
|
135
|
+
message: "mutation id desync"
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
if (text.includes("oooMutation") || text.includes("Server reported an out-of-order mutation")) {
|
|
139
|
+
return {
|
|
140
|
+
reason: "mutation-desync",
|
|
141
|
+
reasonKey: "mutation-desync",
|
|
142
|
+
message: "out-of-order mutation"
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
if (text.includes("already processed")) {
|
|
146
|
+
return {
|
|
147
|
+
reason: "mutation-desync",
|
|
148
|
+
reasonKey: "mutation-desync",
|
|
149
|
+
message: "mutation already processed"
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (text.includes("InvalidConnectionRequestLastMutationID")) {
|
|
153
|
+
return {
|
|
154
|
+
reason: "mutation-desync",
|
|
155
|
+
reasonKey: "mutation-desync",
|
|
156
|
+
message: "invalid connection last mutation id"
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (text.includes("InvalidConnectionRequestBaseCookie")) {
|
|
160
|
+
return {
|
|
161
|
+
reason: "connection-cookie-invalid",
|
|
162
|
+
reasonKey: "connection-cookie-invalid",
|
|
163
|
+
message: "invalid connection base cookie"
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (text.includes("ClientNotFound") || text.includes("Client not found")) {
|
|
167
|
+
return {
|
|
168
|
+
reason: "client-not-found",
|
|
169
|
+
reasonKey: "client-not-found",
|
|
170
|
+
message: "client not found"
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (text.includes("connection userID mismatch")) {
|
|
174
|
+
return {
|
|
175
|
+
reason: "connection-userid-mismatch",
|
|
176
|
+
reasonKey: "connection-userid-mismatch",
|
|
177
|
+
message: "connection user id mismatch"
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return void 0;
|
|
181
|
+
}
|
|
182
|
+
function classifyZeroRecoveryLog(level, args, nowMs = Date.now()) {
|
|
183
|
+
if (level !== "error") return void 0;
|
|
184
|
+
const text = args.map(logArgText).join(" ");
|
|
185
|
+
if (text.includes(LOCAL_STORE_LOST)) {
|
|
186
|
+
return {
|
|
187
|
+
reason: "indexeddb-not-found",
|
|
188
|
+
reasonKey: "local-store",
|
|
189
|
+
message: "local store lost",
|
|
190
|
+
dropLocalState: true
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (text.includes(SQLITE_ERROR_NAME) && text.includes(SQLITE_STATEMENT_FINALIZED)) {
|
|
194
|
+
return {
|
|
195
|
+
reason: "sqlite-statement-finalized",
|
|
196
|
+
reasonKey: "sqlite-statement-finalized",
|
|
197
|
+
message: "sqlite statement finalized",
|
|
198
|
+
dropLocalState: true
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const desync = classifyMutationDesync(text);
|
|
202
|
+
if (desync) {
|
|
203
|
+
return {
|
|
204
|
+
...desync,
|
|
205
|
+
dropLocalState: true
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
if (text.includes(STORE_CLOSED) && !isBenignStoreClosedLog(text)) {
|
|
209
|
+
const prevMs = lastStoreClosedAtMs;
|
|
210
|
+
lastStoreClosedAtMs = nowMs;
|
|
211
|
+
if (prevMs > 0 && nowMs - prevMs >= STORE_CLOSED_REPEAT_MIN_MS && nowMs - prevMs <= STORE_CLOSED_REPEAT_MAX_MS) {
|
|
212
|
+
return {
|
|
213
|
+
reason: "store-closed-repeat",
|
|
214
|
+
reasonKey: "store-closed-repeat",
|
|
215
|
+
message: "local store closed repeatedly",
|
|
216
|
+
dropLocalState: true
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return void 0;
|
|
221
|
+
}
|
|
53
222
|
function composeRecoveryLogSink(deps, consumerLogSink) {
|
|
54
223
|
const consumerFlush = consumerLogSink?.flush;
|
|
55
224
|
return {
|
|
56
225
|
log(level, context, ...args) {
|
|
57
226
|
if (consumerLogSink) consumerLogSink.log(level, context, ...args);else logToConsole(level, context, ...args);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (
|
|
61
|
-
|
|
227
|
+
const recovery = classifyZeroRecoveryLog(level, args);
|
|
228
|
+
if (!recovery) return;
|
|
229
|
+
if (deps.benignLogFilter) {
|
|
230
|
+
const text = args.map(logArgText).join(" ");
|
|
231
|
+
if (deps.benignLogFilter(text)) return;
|
|
62
232
|
}
|
|
233
|
+
recover(deps, recovery.reasonKey, recovery.message, recovery.dropLocalState);
|
|
63
234
|
},
|
|
64
235
|
// call through the consumer sink so a class-based sink keeps its `this`,
|
|
65
236
|
// rather than handing Zero a detached method reference.
|
|
66
237
|
flush: consumerFlush ? () => consumerFlush.call(consumerLogSink) : void 0
|
|
67
238
|
};
|
|
68
239
|
}
|
|
240
|
+
function isRecoverableZeroStalePokeMessage(message) {
|
|
241
|
+
return message.includes("Server returned unexpected base cookie during sync") || message.includes("Received cookie") && message.includes("is < than last snapshot cookie") && message.includes("ignoring client view");
|
|
242
|
+
}
|
|
69
243
|
function resetRecoveryStateForTests() {
|
|
70
244
|
reloadScheduled = false;
|
|
245
|
+
reloadInProgress = false;
|
|
246
|
+
if (reloadLatchTimer) {
|
|
247
|
+
clearTimeout(reloadLatchTimer);
|
|
248
|
+
reloadLatchTimer = void 0;
|
|
249
|
+
}
|
|
71
250
|
pendingDeletes.length = 0;
|
|
251
|
+
lastStoreClosedAtMs = 0;
|
|
252
|
+
inMemoryGuard.clear();
|
|
72
253
|
}
|
|
73
|
-
export { composeRecoveryLogSink, makeZeroRecovery, resetRecoveryStateForTests };
|
|
254
|
+
export { classifyZeroRecoveryLog, composeRecoveryLogSink, isRecoverableZeroStalePokeMessage, makeZeroRecovery, resetRecoveryStateForTests };
|
|
74
255
|
//# sourceMappingURL=recoverZeroClient.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RECOVER_GUARD_MS","LOCAL_STORE_LOST","reloadScheduled","pendingDeletes","recoveryGuardOpen","reasonKey","key","
|
|
1
|
+
{"version":3,"names":["RECOVER_GUARD_MS","RELOAD_LATCH_TIMEOUT_MS","LOCAL_STORE_LOST","SQLITE_ERROR_NAME","SQLITE_STATEMENT_FINALIZED","STORE_CLOSED","STORE_CLOSED_REPEAT_MIN_MS","STORE_CLOSED_REPEAT_MAX_MS","reloadScheduled","reloadInProgress","reloadLatchTimer","pendingDeletes","inMemoryGuard","Map","defaultGuardStorage","window","sessionStorage","recoveryGuardOpen","reasonKey","guardStorage","key","now","Date","memLast","get","storage","rawLast","getItem","last","Number","setItem","String","set","lastStoreClosedAtMs","armReloadLatchTimeout","setTimeout","clearTimeout","unref","disarmReloadLatchTimeout","performReload","deps","Promise","resolve","doReload","reload","globalThis","location","then","allSettled","splice","map","run","beforeReload","catch","recover","message","dropLocalState","push","deleteLocalState","console","error","zeroEvents","emit","type","reason","warn","runReload","scheduleReload","makeZeroRecovery","onUpdateNeeded","onClientStateNotFound","logToConsole","level","context","args","prefix","Object","entries","value","join","method","logArgText","arg","Error","name","stack","isBenignStoreClosedLog","text","test","classifyMutationDesync","includes","classifyZeroRecoveryLog","nowMs","desync","prevMs","composeRecoveryLogSink","consumerLogSink","consumerFlush","flush","log","recovery","benignLogFilter","call","isRecoverableZeroStalePokeMessage","resetRecoveryStateForTests","length","clear"],"sources":["../../../src/helpers/recoverZeroClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|