on-zero 0.6.3 → 0.6.5
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 +111 -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 +145 -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 +140 -14
- package/dist/cjs/helpers/recoverZeroClient.native.js +155 -22
- package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.test.cjs +181 -0
- package/dist/cjs/helpers/recoverZeroClient.test.native.js +209 -0
- package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.native.js +1 -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/multiInstance.test.cjs +12 -0
- package/dist/cjs/multiInstance.test.native.js +21 -0
- package/dist/cjs/multiInstance.test.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 +112 -13
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +146 -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 +140 -15
- package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.native.js +155 -23
- package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.mjs +182 -1
- package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.native.js +210 -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/multiInstance.test.mjs +12 -0
- package/dist/esm/multiInstance.test.mjs.map +1 -1
- package/dist/esm/multiInstance.test.native.js +21 -0
- package/dist/esm/multiInstance.test.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 +188 -13
- package/src/helpers/recoverZeroClient.test.ts +204 -1
- package/src/helpers/recoverZeroClient.ts +263 -42
- package/src/index.ts +3 -0
- package/src/multi.ts +33 -0
- package/src/multiInstance.test.tsx +13 -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 +15 -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
|
@@ -94,4 +94,56 @@ test("zero.delete invalidates cached instance before a remount recovery", async
|
|
|
94
94
|
expect(fakeZero.instances).toHaveLength(2);
|
|
95
95
|
expect(fakeZero.instances[1]).not.toBe(first);
|
|
96
96
|
});
|
|
97
|
+
test("remint drops local state and reconstructs a fresh instance in place", async () => {
|
|
98
|
+
root = createRoot(container);
|
|
99
|
+
await act(async () => {
|
|
100
|
+
root?.render(/* @__PURE__ */jsx(client.ProvideZero, {
|
|
101
|
+
cacheURL: "http://127.0.0.1:7777/zero",
|
|
102
|
+
userID: "remint-test",
|
|
103
|
+
children: /* @__PURE__ */jsx("span", {
|
|
104
|
+
children: "ok"
|
|
105
|
+
})
|
|
106
|
+
}));
|
|
107
|
+
await Promise.resolve();
|
|
108
|
+
});
|
|
109
|
+
const first = fakeZero.instances.at(-1);
|
|
110
|
+
expect(first).toBeDefined();
|
|
111
|
+
const countBefore = fakeZero.instances.length;
|
|
112
|
+
let result;
|
|
113
|
+
await act(async () => {
|
|
114
|
+
result = await client.remint();
|
|
115
|
+
await Promise.resolve();
|
|
116
|
+
});
|
|
117
|
+
expect(result).toBe(true);
|
|
118
|
+
expect(first?.delete).toHaveBeenCalledTimes(1);
|
|
119
|
+
expect(fakeZero.instances.length).toBe(countBefore + 1);
|
|
120
|
+
expect(fakeZero.instances.at(-1)).not.toBe(first);
|
|
121
|
+
});
|
|
122
|
+
test("remint with no provider mounted returns false without burning the guard budget", async () => {
|
|
123
|
+
const isolated = createZeroClient({
|
|
124
|
+
schema,
|
|
125
|
+
models: {},
|
|
126
|
+
groupedQueries: {},
|
|
127
|
+
instanceName: "remint-unmounted-test"
|
|
128
|
+
});
|
|
129
|
+
expect(await isolated.remint()).toBe(false);
|
|
130
|
+
expect(await isolated.remint()).toBe(false);
|
|
131
|
+
root = createRoot(container);
|
|
132
|
+
await act(async () => {
|
|
133
|
+
root?.render(/* @__PURE__ */jsx(isolated.ProvideZero, {
|
|
134
|
+
cacheURL: "http://127.0.0.1:7777/zero",
|
|
135
|
+
userID: "remint-unmounted",
|
|
136
|
+
children: /* @__PURE__ */jsx("span", {
|
|
137
|
+
children: "ok"
|
|
138
|
+
})
|
|
139
|
+
}));
|
|
140
|
+
await Promise.resolve();
|
|
141
|
+
});
|
|
142
|
+
let result;
|
|
143
|
+
await act(async () => {
|
|
144
|
+
result = await isolated.remint();
|
|
145
|
+
await Promise.resolve();
|
|
146
|
+
});
|
|
147
|
+
expect(result).toBe(true);
|
|
148
|
+
});
|
|
97
149
|
//# sourceMappingURL=createZeroClient.recovery.test.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createSchema","string","table","act","createRoot","afterEach","beforeEach","expect","test","vi","createZeroClient","jsx","fakeZero","hoisted","FakeZero","context","connection","state","current","name","subscribe","connect","fn","delete","errors","close","run","preload","cleanup","complete","Promise","resolve","constructor","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","toHaveBeenCalledTimes","toHaveLength","not","toBe"],"sources":["../../src/createZeroClient.recovery.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["createSchema","string","table","act","createRoot","afterEach","beforeEach","expect","test","vi","createZeroClient","jsx","fakeZero","hoisted","FakeZero","context","connection","state","current","name","subscribe","connect","fn","delete","errors","close","run","preload","cleanup","complete","Promise","resolve","constructor","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","toHaveBeenCalledTimes","toHaveLength","not","toBe","at","countBefore","result","remint","isolated"],"sources":["../../src/createZeroClient.recovery.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -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":"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","ignoreList":[]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const RECOVER_GUARD_MS = 6e4;
|
|
2
|
+
const RELOAD_LATCH_TIMEOUT_MS = 15e3;
|
|
2
3
|
const LOCAL_STORE_LOST = "Expected IndexedDB not found";
|
|
3
4
|
const SQLITE_ERROR_NAME = "SqliteError";
|
|
4
5
|
const SQLITE_STATEMENT_FINALIZED = "This statement has been finalized";
|
|
@@ -6,26 +7,69 @@ const STORE_CLOSED = "Store is closed";
|
|
|
6
7
|
const STORE_CLOSED_REPEAT_MIN_MS = 2e3;
|
|
7
8
|
const STORE_CLOSED_REPEAT_MAX_MS = 6e4;
|
|
8
9
|
let reloadScheduled = false;
|
|
10
|
+
let reloadInProgress = false;
|
|
11
|
+
let reloadLatchTimer;
|
|
9
12
|
const pendingDeletes = [];
|
|
10
|
-
|
|
13
|
+
const inMemoryGuard = /* @__PURE__ */new Map();
|
|
14
|
+
function defaultGuardStorage() {
|
|
11
15
|
try {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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);
|
|
19
37
|
return true;
|
|
20
38
|
}
|
|
21
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
|
+
}
|
|
22
66
|
function recover(deps, reasonKey, message, dropLocalState) {
|
|
23
67
|
if (typeof window === "undefined") return;
|
|
24
68
|
if (dropLocalState) {
|
|
25
|
-
pendingDeletes.push(Promise.resolve().then(deps.deleteLocalState)
|
|
69
|
+
pendingDeletes.push(() => Promise.resolve().then(deps.deleteLocalState));
|
|
26
70
|
}
|
|
27
71
|
if (reloadScheduled) return;
|
|
28
|
-
if (!recoveryGuardOpen(reasonKey)) {
|
|
72
|
+
if (!recoveryGuardOpen(reasonKey, deps.guardStorage)) {
|
|
29
73
|
console.error(`[on-zero] ${message} \u2014 already recovered once, not reloading`);
|
|
30
74
|
deps.zeroEvents.emit({
|
|
31
75
|
type: "fatal",
|
|
@@ -34,13 +78,23 @@ function recover(deps, reasonKey, message, dropLocalState) {
|
|
|
34
78
|
return;
|
|
35
79
|
}
|
|
36
80
|
reloadScheduled = true;
|
|
81
|
+
armReloadLatchTimeout();
|
|
37
82
|
console.warn(`[on-zero] ${message} \u2014 recovering`);
|
|
38
83
|
deps.zeroEvents.emit({
|
|
39
84
|
type: "recovering",
|
|
40
85
|
reason: message
|
|
41
86
|
});
|
|
42
|
-
const
|
|
43
|
-
|
|
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
|
+
}
|
|
44
98
|
}
|
|
45
99
|
function makeZeroRecovery(deps) {
|
|
46
100
|
return {
|
|
@@ -73,6 +127,58 @@ function isBenignStoreClosedLog(text) {
|
|
|
73
127
|
if (/Mutator\s+".*"\s+app error on client/i.test(text)) return true;
|
|
74
128
|
return false;
|
|
75
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
|
+
}
|
|
76
182
|
function classifyZeroRecoveryLog(level, args, nowMs = Date.now()) {
|
|
77
183
|
if (level !== "error") return void 0;
|
|
78
184
|
const text = args.map(logArgText).join(" ");
|
|
@@ -92,6 +198,13 @@ function classifyZeroRecoveryLog(level, args, nowMs = Date.now()) {
|
|
|
92
198
|
dropLocalState: true
|
|
93
199
|
};
|
|
94
200
|
}
|
|
201
|
+
const desync = classifyMutationDesync(text);
|
|
202
|
+
if (desync) {
|
|
203
|
+
return {
|
|
204
|
+
...desync,
|
|
205
|
+
dropLocalState: true
|
|
206
|
+
};
|
|
207
|
+
}
|
|
95
208
|
if (text.includes(STORE_CLOSED) && !isBenignStoreClosedLog(text)) {
|
|
96
209
|
const prevMs = lastStoreClosedAtMs;
|
|
97
210
|
lastStoreClosedAtMs = nowMs;
|
|
@@ -112,19 +225,31 @@ function composeRecoveryLogSink(deps, consumerLogSink) {
|
|
|
112
225
|
log(level, context, ...args) {
|
|
113
226
|
if (consumerLogSink) consumerLogSink.log(level, context, ...args);else logToConsole(level, context, ...args);
|
|
114
227
|
const recovery = classifyZeroRecoveryLog(level, args);
|
|
115
|
-
if (recovery)
|
|
116
|
-
|
|
228
|
+
if (!recovery) return;
|
|
229
|
+
if (deps.benignLogFilter) {
|
|
230
|
+
const text = args.map(logArgText).join(" ");
|
|
231
|
+
if (deps.benignLogFilter(text)) return;
|
|
117
232
|
}
|
|
233
|
+
recover(deps, recovery.reasonKey, recovery.message, recovery.dropLocalState);
|
|
118
234
|
},
|
|
119
235
|
// call through the consumer sink so a class-based sink keeps its `this`,
|
|
120
236
|
// rather than handing Zero a detached method reference.
|
|
121
237
|
flush: consumerFlush ? () => consumerFlush.call(consumerLogSink) : void 0
|
|
122
238
|
};
|
|
123
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
|
+
}
|
|
124
243
|
function resetRecoveryStateForTests() {
|
|
125
244
|
reloadScheduled = false;
|
|
245
|
+
reloadInProgress = false;
|
|
246
|
+
if (reloadLatchTimer) {
|
|
247
|
+
clearTimeout(reloadLatchTimer);
|
|
248
|
+
reloadLatchTimer = void 0;
|
|
249
|
+
}
|
|
126
250
|
pendingDeletes.length = 0;
|
|
127
251
|
lastStoreClosedAtMs = 0;
|
|
252
|
+
inMemoryGuard.clear();
|
|
128
253
|
}
|
|
129
|
-
export { classifyZeroRecoveryLog, composeRecoveryLogSink, makeZeroRecovery, resetRecoveryStateForTests };
|
|
254
|
+
export { classifyZeroRecoveryLog, composeRecoveryLogSink, isRecoverableZeroStalePokeMessage, makeZeroRecovery, resetRecoveryStateForTests };
|
|
130
255
|
//# sourceMappingURL=recoverZeroClient.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["RECOVER_GUARD_MS","LOCAL_STORE_LOST","SQLITE_ERROR_NAME","SQLITE_STATEMENT_FINALIZED","STORE_CLOSED","STORE_CLOSED_REPEAT_MIN_MS","STORE_CLOSED_REPEAT_MAX_MS","reloadScheduled","
|
|
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":[]}
|