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.
Files changed (82) hide show
  1. package/dist/cjs/createZeroClient.cjs +91 -12
  2. package/dist/cjs/createZeroClient.connection.test.cjs +163 -0
  3. package/dist/cjs/createZeroClient.connection.test.native.js +242 -0
  4. package/dist/cjs/createZeroClient.connection.test.native.js.map +1 -0
  5. package/dist/cjs/createZeroClient.native.js +99 -12
  6. package/dist/cjs/createZeroClient.native.js.map +1 -1
  7. package/dist/cjs/createZeroClient.recovery.test.cjs +52 -0
  8. package/dist/cjs/createZeroClient.recovery.test.native.js +52 -0
  9. package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
  10. package/dist/cjs/helpers/recoverZeroClient.cjs +197 -14
  11. package/dist/cjs/helpers/recoverZeroClient.native.js +220 -24
  12. package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
  13. package/dist/cjs/helpers/recoverZeroClient.test.cjs +241 -0
  14. package/dist/cjs/helpers/recoverZeroClient.test.native.js +269 -0
  15. package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
  16. package/dist/cjs/index.cjs +2 -0
  17. package/dist/cjs/index.native.js +2 -0
  18. package/dist/cjs/index.native.js.map +1 -1
  19. package/dist/cjs/multi.cjs +13 -0
  20. package/dist/cjs/multi.native.js +35 -0
  21. package/dist/cjs/multi.native.js.map +1 -1
  22. package/dist/cjs/multiPartition.test.cjs +42 -0
  23. package/dist/cjs/multiPartition.test.native.js +51 -0
  24. package/dist/cjs/multiPartition.test.native.js.map +1 -0
  25. package/dist/esm/createZeroClient.connection.test.mjs +164 -0
  26. package/dist/esm/createZeroClient.connection.test.mjs.map +1 -0
  27. package/dist/esm/createZeroClient.connection.test.native.js +240 -0
  28. package/dist/esm/createZeroClient.connection.test.native.js.map +1 -0
  29. package/dist/esm/createZeroClient.mjs +92 -13
  30. package/dist/esm/createZeroClient.mjs.map +1 -1
  31. package/dist/esm/createZeroClient.native.js +100 -13
  32. package/dist/esm/createZeroClient.native.js.map +1 -1
  33. package/dist/esm/createZeroClient.recovery.test.mjs +52 -0
  34. package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
  35. package/dist/esm/createZeroClient.recovery.test.native.js +52 -0
  36. package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
  37. package/dist/esm/helpers/recoverZeroClient.mjs +196 -15
  38. package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
  39. package/dist/esm/helpers/recoverZeroClient.native.js +219 -25
  40. package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
  41. package/dist/esm/helpers/recoverZeroClient.test.mjs +242 -1
  42. package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
  43. package/dist/esm/helpers/recoverZeroClient.test.native.js +270 -1
  44. package/dist/esm/helpers/recoverZeroClient.test.native.js.map +1 -1
  45. package/dist/esm/index.js +2 -2
  46. package/dist/esm/index.js.map +1 -1
  47. package/dist/esm/index.mjs +2 -2
  48. package/dist/esm/index.mjs.map +1 -1
  49. package/dist/esm/index.native.js +2 -2
  50. package/dist/esm/index.native.js.map +1 -1
  51. package/dist/esm/multi.mjs +13 -1
  52. package/dist/esm/multi.mjs.map +1 -1
  53. package/dist/esm/multi.native.js +35 -1
  54. package/dist/esm/multi.native.js.map +1 -1
  55. package/dist/esm/multiPartition.test.mjs +43 -0
  56. package/dist/esm/multiPartition.test.mjs.map +1 -0
  57. package/dist/esm/multiPartition.test.native.js +49 -0
  58. package/dist/esm/multiPartition.test.native.js.map +1 -0
  59. package/lint/ssr-guards.js +164 -0
  60. package/package.json +2 -2
  61. package/readme.md +126 -0
  62. package/src/createZeroClient.connection.test.tsx +162 -0
  63. package/src/createZeroClient.recovery.test.tsx +68 -0
  64. package/src/createZeroClient.tsx +159 -13
  65. package/src/helpers/recoverZeroClient.test.ts +270 -1
  66. package/src/helpers/recoverZeroClient.ts +347 -50
  67. package/src/index.ts +6 -0
  68. package/src/multi.ts +33 -0
  69. package/src/multiPartition.test.ts +38 -0
  70. package/types/createZeroClient.connection.test.d.ts +5 -0
  71. package/types/createZeroClient.connection.test.d.ts.map +1 -0
  72. package/types/createZeroClient.d.ts +17 -0
  73. package/types/createZeroClient.d.ts.map +1 -1
  74. package/types/createZeroServer.d.ts +4 -4
  75. package/types/helpers/recoverZeroClient.d.ts +23 -1
  76. package/types/helpers/recoverZeroClient.d.ts.map +1 -1
  77. package/types/index.d.ts +1 -1
  78. package/types/index.d.ts.map +1 -1
  79. package/types/multi.d.ts +1 -0
  80. package/types/multi.d.ts.map +1 -1
  81. package/types/multiPartition.test.d.ts +2 -0
  82. 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":"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","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
- function recoveryGuardOpen(reasonKey) {
13
+ const inMemoryGuard = /* @__PURE__ */new Map();
14
+ function defaultGuardStorage() {
6
15
  try {
7
- const key = `on-zero-recover-${reasonKey}`;
8
- const last = Number(window.sessionStorage.getItem(key) || 0);
9
- if (Date.now() - last < RECOVER_GUARD_MS) return false;
10
- window.sessionStorage.setItem(key, String(Date.now()));
11
- } catch {}
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).catch(() => {}));
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 doReload = deps.reload ?? (() => globalThis.location?.reload?.());
35
- Promise.resolve().then(() => Promise.allSettled(pendingDeletes)).then(() => deps.beforeReload?.()).catch(() => {}).finally(doReload);
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
- if (level !== "error") return;
59
- const text = args.map(arg => typeof arg === "string" ? arg : arg && typeof arg === "object" && "message" in arg ? String(arg.message) : "").join(" ");
60
- if (text.includes(LOCAL_STORE_LOST)) {
61
- recover(deps, "local-store", "local store lost", true);
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","last","Number","window","sessionStorage","getItem","Date","now","setItem","String","recover","deps","message","dropLocalState","push","Promise","resolve","then","deleteLocalState","catch","console","error","zeroEvents","emit","type","reason","warn","doReload","reload","globalThis","location","allSettled","beforeReload","finally","makeZeroRecovery","onUpdateNeeded","onClientStateNotFound","logToConsole","level","context","args","prefix","Object","entries","map","value","join","method","composeRecoveryLogSink","consumerLogSink","consumerFlush","flush","log","text","arg","includes","call","resetRecoveryStateForTests","length"],"sources":["../../../src/helpers/recoverZeroClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
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":"AAOA,MAAMA,gBAAA,GAAmB;AAQzB,MAAMC,uBAAA,GAA0B;AAIhC,MAAMC,gBAAA,GAAmB;AACzB,MAAMC,iBAAA,GAAoB;AAC1B,MAAMC,0BAAA,GAA6B;AACnC,MAAMC,YAAA,GAAe;AACrB,MAAMC,0BAAA,GAA6B;AACnC,MAAMC,0BAAA,GAA6B;AAqEnC,IAAIC,eAAA,GAAkB;AACtB,IAAIC,gBAAA,GAAmB;AACvB,IAAIC,gBAAA;AACJ,MAAMC,cAAA,GAAgD,EAAC;AAKvD,MAAMC,aAAA,GAAgB,mBAAIC,GAAA,CAAoB;AAE9C,SAASC,oBAAA,EAAwD;EAC/D,IAAI;IACF,IAAI,OAAOC,MAAA,KAAW,eAAe,CAACA,MAAA,CAAOC,cAAA,EAAgB,OAAO;IACpE,OAAOD,MAAA,CAAOC,cAAA;EAChB,QAAQ;IAEN,OAAO;EACT;AACF;AAOA,SAASC,kBACPC,SAAA,EACAC,YAAA,EACS;EACT,MAAMC,GAAA,GAAM,mBAAmBF,SAAS;EACxC,MAAMG,GAAA,GAAMC,IAAA,CAAKD,GAAA,CAAI;EAErB,MAAME,OAAA,GAAUX,aAAA,CAAcY,GAAA,CAAIJ,GAAG,KAAK;EAC1C,IAAIG,OAAA,GAAU,KAAKF,GAAA,GAAME,OAAA,GAAUvB,gBAAA,EAAkB,OAAO;EAE5D,MAAMyB,OAAA,GAAUN,YAAA,IAAgBL,mBAAA,CAAoB;EACpD,IAAIW,OAAA,EAAS;IACX,IAAI;MACF,MAAMC,OAAA,GAAUD,OAAA,CAAQE,OAAA,CAAQP,GAAG;MACnC,MAAMQ,IAAA,GAAOF,OAAA,GAAUG,MAAA,CAAOH,OAAO,IAAI;MACzC,IAAIE,IAAA,GAAO,KAAKP,GAAA,GAAMO,IAAA,GAAO5B,gBAAA,EAAkB,OAAO;MACtDyB,OAAA,CAAQK,OAAA,CAAQV,GAAA,EAAKW,MAAA,CAAOV,GAAG,CAAC;IAClC,QAAQ,CAER;EACF;EAEAT,aAAA,CAAcoB,GAAA,CAAIZ,GAAA,EAAKC,GAAG;EAC1B,OAAO;AACT;AAKA,IAAIY,mBAAA,GAAsB;AAE1B,SAASC,sBAAA,EAAwB;EAC/B,IAAI,OAAOC,UAAA,KAAe,YAAY;EACtC,IAAIzB,gBAAA,EAAkB0B,YAAA,CAAa1B,gBAAgB;EACnDA,gBAAA,GAAmByB,UAAA,CAAW,MAAM;IAClCzB,gBAAA,GAAmB;IAQnBF,eAAA,GAAkB;EACpB,GAAGP,uBAAuB;EAE1B,IACES,gBAAA,IACA,OAAOA,gBAAA,KAAqB,YAC5B,WAAWA,gBAAA,EACX;IACAA,gBAAA,CAAiB2B,KAAA,CAAM;EACzB;AACF;AAEA,SAASC,yBAAA,EAA2B;EAClC,IAAI5B,gBAAA,EAAkB;IACpB0B,YAAA,CAAa1B,gBAAgB;IAC7BA,gBAAA,GAAmB;EACrB;AACF;AAMA,SAAS6B,cAAcC,IAAA,EAAuC;EAC5D,IAAI/B,gBAAA,EAAkB,OAAOgC,OAAA,CAAQC,OAAA,CAAQ;EAC7CjC,gBAAA,GAAmB;EAInB6B,wBAAA,CAAyB;EAOzB,MAAMK,QAAA,GAAWH,IAAA,CAAKI,MAAA,KAAW,MAAMC,UAAA,CAAWC,QAAA,EAAUF,MAAA,GAAS;EACrE,OAAOH,OAAA,CAAQC,OAAA,CAAQ,EACpBK,IAAA,CAAK,MAAMN,OAAA,CAAQO,UAAA,CAAWrC,cAAA,CAAesC,MAAA,CAAO,CAAC,EAAEC,GAAA,CAAKC,GAAA,IAAQA,GAAA,CAAI,CAAC,CAAC,CAAC,EAC3EJ,IAAA,CAAK,MAAMP,IAAA,CAAKY,YAAA,GAAe,CAAC,EAChCC,KAAA,CAAM,MAAM,CAAC,CAAC,EACdN,IAAA,CAAK,MAAM;IACVJ,QAAA,CAAS;EACX,CAAC;AACL;AAEA,SAASW,QACPd,IAAA,EACAtB,SAAA,EACAqC,OAAA,EACAC,cAAA,EACM;EACN,IAAI,OAAOzC,MAAA,KAAW,aAAa;EAInC,IAAIyC,cAAA,EAAgB;IAClB7C,cAAA,CAAe8C,IAAA,CAAK,MAAMhB,OAAA,CAAQC,OAAA,CAAQ,EAAEK,IAAA,CAAKP,IAAA,CAAKkB,gBAAgB,CAAC;EACzE;EAEA,IAAIlD,eAAA,EAAiB;EACrB,IAAI,CAACS,iBAAA,CAAkBC,SAAA,EAAWsB,IAAA,CAAKrB,YAAY,GAAG;IACpDwC,OAAA,CAAQC,KAAA,CAAM,aAAaL,OAAO,+CAA0C;IAC5Ef,IAAA,CAAKqB,UAAA,CAAWC,IAAA,CAAK;MAAEC,IAAA,EAAM;MAASC,MAAA,EAAQT;IAAQ,CAAC;IACvD;EACF;EACA/C,eAAA,GAAkB;EAClB0B,qBAAA,CAAsB;EACtByB,OAAA,CAAQM,IAAA,CAAK,aAAaV,OAAO,oBAAe;EAChDf,IAAA,CAAKqB,UAAA,CAAWC,IAAA,CAAK;IAAEC,IAAA,EAAM;IAAcC,MAAA,EAAQT;EAAQ,CAAC;EAE5D,MAAMW,SAAA,GAAYA,CAAA,KAAM3B,aAAA,CAAcC,IAAI;EAC1C,IAAIA,IAAA,CAAK2B,cAAA,EAAgB;IACvB3B,IAAA,CAAK2B,cAAA,CAAe;MAClBH,MAAA,EAAQT,OAAA;MACRrC,SAAA;MACAsC,cAAA;MACAjB,aAAA,EAAe2B;IACjB,CAAC;EACH,OAAO;IACL,KAAKA,SAAA,CAAU;EACjB;AACF;AAKO,SAASE,iBAAiB5B,IAAA,EAAwB;EACvD,OAAO;IACL6B,eAAeL,MAAA,EAA4B;MAQzC,MAAMR,cAAA,GAAiBQ,MAAA,CAAOD,IAAA,KAAS;MACvCT,OAAA,CACEd,IAAA,EACAwB,MAAA,CAAOD,IAAA,EACP,kBAAkBC,MAAA,CAAOT,OAAA,IAAWS,MAAA,CAAOD,IAAI,KAC/CP,cACF;IACF;IACAc,sBAAA,EAAwB;MAGtBhB,OAAA,CAAQd,IAAA,EAAM,0BAA0B,0BAA0B,IAAI;IACxE;EACF;AACF;AAMA,SAAS+B,aACPC,KAAA,EACAC,OAAA,KACGC,IAAA,EACG;EACN,MAAMC,MAAA,GAASF,OAAA,GACXG,MAAA,CAAOC,OAAA,CAAQJ,OAAO,EACnBvB,GAAA,CAAI,CAAC,CAAC9B,GAAA,EAAK0D,KAAK,MAAOA,KAAA,KAAU,SAAY1D,GAAA,GAAM,GAAGA,GAAG,IAAI0D,KAAK,EAAG,EACrEC,IAAA,CAAK,GAAG,IACX;EACJ,MAAMC,MAAA,GAASR,KAAA,KAAU,UAAU,UAAUA,KAAA;EAC7Cb,OAAA,CAAQqB,MAAM,EAAE,IAAIL,MAAA,GAAS,CAACA,MAAM,IAAI,EAAC,GAAI,GAAGD,IAAI;AACtD;AAEA,SAASO,WAAWC,GAAA,EAAsB;EACxC,IAAI,OAAOA,GAAA,KAAQ,UAAU,OAAOA,GAAA;EACpC,IAAIA,GAAA,YAAeC,KAAA,EAAO,OAAO,GAAGD,GAAA,CAAIE,IAAI,IAAIF,GAAA,CAAI3B,OAAO,IAAI2B,GAAA,CAAIG,KAAA,IAAS,EAAE;EAC9E,IAAIH,GAAA,IAAO,OAAOA,GAAA,KAAQ,UAAU;IAClC,MAAM3B,OAAA,GAAU,aAAa2B,GAAA,GAAOA,GAAA,CAA8B3B,OAAA,GAAU;IAC5E,MAAM6B,IAAA,GAAO,UAAUF,GAAA,GAAOA,GAAA,CAA2BE,IAAA,GAAO;IAChE,IAAI,OAAO7B,OAAA,KAAY,UACrB,OAAO,GAAG,OAAO6B,IAAA,KAAS,WAAWA,IAAA,GAAO,EAAE,IAAI7B,OAAO;EAC7D;EACA,OAAO;AACT;AAEA,SAAS+B,uBAAuBC,IAAA,EAAuB;EACrD,IAAI,oCAAoCC,IAAA,CAAKD,IAAI,GAAG,OAAO;EAC3D,IAAI,wCAAwCC,IAAA,CAAKD,IAAI,GAAG,OAAO;EAC/D,OAAO;AACT;AASA,SAASE,uBACPF,IAAA,EACmF;EACnF,IAAIA,IAAA,CAAKG,QAAA,CAAS,kBAAkB,KAAKH,IAAA,CAAKG,QAAA,CAAS,cAAc,GAAG;IACtE,OAAO;MACL1B,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IACEgC,IAAA,CAAKG,QAAA,CAAS,aAAa,KAC3BH,IAAA,CAAKG,QAAA,CAAS,0CAA0C,GACxD;IACA,OAAO;MACL1B,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIgC,IAAA,CAAKG,QAAA,CAAS,mBAAmB,GAAG;IACtC,OAAO;MACL1B,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIgC,IAAA,CAAKG,QAAA,CAAS,wCAAwC,GAAG;IAC3D,OAAO;MACL1B,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIgC,IAAA,CAAKG,QAAA,CAAS,oCAAoC,GAAG;IACvD,OAAO;MACL1B,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIgC,IAAA,CAAKG,QAAA,CAAS,gBAAgB,KAAKH,IAAA,CAAKG,QAAA,CAAS,kBAAkB,GAAG;IACxE,OAAO;MACL1B,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,IAAIgC,IAAA,CAAKG,QAAA,CAAS,4BAA4B,GAAG;IAC/C,OAAO;MACL1B,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;IACX;EACF;EACA,OAAO;AACT;AAEO,SAASoC,wBACdnB,KAAA,EACAE,IAAA,EACAkB,KAAA,GAAQtE,IAAA,CAAKD,GAAA,CAAI,GAC0B;EAC3C,IAAImD,KAAA,KAAU,SAAS,OAAO;EAC9B,MAAMe,IAAA,GAAOb,IAAA,CAAKxB,GAAA,CAAI+B,UAAU,EAAEF,IAAA,CAAK,GAAG;EAC1C,IAAIQ,IAAA,CAAKG,QAAA,CAASxF,gBAAgB,GAAG;IACnC,OAAO;MACL8D,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;MACTC,cAAA,EAAgB;IAClB;EACF;EACA,IAAI+B,IAAA,CAAKG,QAAA,CAASvF,iBAAiB,KAAKoF,IAAA,CAAKG,QAAA,CAAStF,0BAA0B,GAAG;IACjF,OAAO;MACL4D,MAAA,EAAQ;MACR9C,SAAA,EAAW;MACXqC,OAAA,EAAS;MACTC,cAAA,EAAgB;IAClB;EACF;EACA,MAAMqC,MAAA,GAASJ,sBAAA,CAAuBF,IAAI;EAC1C,IAAIM,MAAA,EAAQ;IACV,OAAO;MAAE,GAAGA,MAAA;MAAQrC,cAAA,EAAgB;IAAK;EAC3C;EACA,IAAI+B,IAAA,CAAKG,QAAA,CAASrF,YAAY,KAAK,CAACiF,sBAAA,CAAuBC,IAAI,GAAG;IAChE,MAAMO,MAAA,GAAS7D,mBAAA;IACfA,mBAAA,GAAsB2D,KAAA;IACtB,IACEE,MAAA,GAAS,KACTF,KAAA,GAAQE,MAAA,IAAUxF,0BAAA,IAClBsF,KAAA,GAAQE,MAAA,IAAUvF,0BAAA,EAClB;MACA,OAAO;QACLyD,MAAA,EAAQ;QACR9C,SAAA,EAAW;QACXqC,OAAA,EAAS;QACTC,cAAA,EAAgB;MAClB;IACF;EACF;EACA,OAAO;AACT;AAOO,SAASuC,uBACdvD,IAAA,EACAwD,eAAA,EACS;EACT,MAAMC,aAAA,GAAgBD,eAAA,EAAiBE,KAAA;EACvC,OAAO;IACLC,IAAI3B,KAAA,EAAiBC,OAAA,KAAiCC,IAAA,EAAuB;MAC3E,IAAIsB,eAAA,EAAiBA,eAAA,CAAgBG,GAAA,CAAI3B,KAAA,EAAOC,OAAA,EAAS,GAAGC,IAAI,OAC3DH,YAAA,CAAaC,KAAA,EAAOC,OAAA,EAAS,GAAGC,IAAI;MACzC,MAAM0B,QAAA,GAAWT,uBAAA,CAAwBnB,KAAA,EAAOE,IAAI;MACpD,IAAI,CAAC0B,QAAA,EAAU;MACf,IAAI5D,IAAA,CAAK6D,eAAA,EAAiB;QACxB,MAAMd,IAAA,GAAOb,IAAA,CAAKxB,GAAA,CAAI+B,UAAU,EAAEF,IAAA,CAAK,GAAG;QAC1C,IAAIvC,IAAA,CAAK6D,eAAA,CAAgBd,IAAI,GAAG;MAClC;MACAjC,OAAA,CAAQd,IAAA,EAAM4D,QAAA,CAASlF,SAAA,EAAWkF,QAAA,CAAS7C,OAAA,EAAS6C,QAAA,CAAS5C,cAAc;IAC7E;IAAA;IAAA;IAGA0C,KAAA,EAAOD,aAAA,GAAgB,MAAMA,aAAA,CAAcK,IAAA,CAAKN,eAAe,IAAI;EACrE;AACF;AAKO,SAASO,kCAAkChD,OAAA,EAA0B;EAC1E,OACEA,OAAA,CAAQmC,QAAA,CAAS,oDAAoD,KACpEnC,OAAA,CAAQmC,QAAA,CAAS,iBAAiB,KACjCnC,OAAA,CAAQmC,QAAA,CAAS,gCAAgC,KACjDnC,OAAA,CAAQmC,QAAA,CAAS,sBAAsB;AAE7C;AAMO,SAASc,2BAAA,EAA6B;EAC3ChG,eAAA,GAAkB;EAClBC,gBAAA,GAAmB;EACnB,IAAIC,gBAAA,EAAkB;IACpB0B,YAAA,CAAa1B,gBAAgB;IAC7BA,gBAAA,GAAmB;EACrB;EACAC,cAAA,CAAe8F,MAAA,GAAS;EACxBxE,mBAAA,GAAsB;EACtBrB,aAAA,CAAc8F,KAAA,CAAM;AACtB","ignoreList":[]}