on-zero 0.8.3 → 0.8.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 (59) hide show
  1. package/README.md +15 -2
  2. package/dist/cjs/combineZeroClients.cjs +21 -1
  3. package/dist/cjs/combineZeroClients.native.js +34 -9
  4. package/dist/cjs/combineZeroClients.native.js.map +1 -1
  5. package/dist/cjs/createZeroClient.cjs +81 -8
  6. package/dist/cjs/createZeroClient.connection.test.cjs +67 -0
  7. package/dist/cjs/createZeroClient.connection.test.native.js +69 -0
  8. package/dist/cjs/createZeroClient.connection.test.native.js.map +1 -1
  9. package/dist/cjs/createZeroClient.native.js +85 -9
  10. package/dist/cjs/createZeroClient.native.js.map +1 -1
  11. package/dist/cjs/createZeroClient.recovery.test.cjs +19 -8
  12. package/dist/cjs/createZeroClient.recovery.test.native.js +20 -8
  13. package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
  14. package/dist/cjs/helpers/recoverZeroClient.cjs +0 -3
  15. package/dist/cjs/helpers/recoverZeroClient.native.js +0 -3
  16. package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
  17. package/dist/cjs/multiInstance.test.cjs +54 -0
  18. package/dist/cjs/multiInstance.test.native.js +58 -0
  19. package/dist/cjs/multiInstance.test.native.js.map +1 -1
  20. package/dist/esm/combineZeroClients.mjs +21 -1
  21. package/dist/esm/combineZeroClients.mjs.map +1 -1
  22. package/dist/esm/combineZeroClients.native.js +34 -9
  23. package/dist/esm/combineZeroClients.native.js.map +1 -1
  24. package/dist/esm/createZeroClient.connection.test.mjs +67 -0
  25. package/dist/esm/createZeroClient.connection.test.mjs.map +1 -1
  26. package/dist/esm/createZeroClient.connection.test.native.js +69 -0
  27. package/dist/esm/createZeroClient.connection.test.native.js.map +1 -1
  28. package/dist/esm/createZeroClient.mjs +81 -8
  29. package/dist/esm/createZeroClient.mjs.map +1 -1
  30. package/dist/esm/createZeroClient.native.js +85 -9
  31. package/dist/esm/createZeroClient.native.js.map +1 -1
  32. package/dist/esm/createZeroClient.recovery.test.mjs +19 -8
  33. package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
  34. package/dist/esm/createZeroClient.recovery.test.native.js +20 -8
  35. package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
  36. package/dist/esm/helpers/recoverZeroClient.mjs +0 -3
  37. package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
  38. package/dist/esm/helpers/recoverZeroClient.native.js +0 -3
  39. package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
  40. package/dist/esm/multiInstance.test.mjs +54 -0
  41. package/dist/esm/multiInstance.test.mjs.map +1 -1
  42. package/dist/esm/multiInstance.test.native.js +58 -0
  43. package/dist/esm/multiInstance.test.native.js.map +1 -1
  44. package/package.json +1 -1
  45. package/src/combineZeroClients.tsx +30 -1
  46. package/src/createZeroClient.connection.test.tsx +66 -0
  47. package/src/createZeroClient.recovery.test.tsx +21 -12
  48. package/src/createZeroClient.tsx +127 -18
  49. package/src/helpers/recoverZeroClient.ts +0 -13
  50. package/src/multiInstance.test.tsx +49 -0
  51. package/src/types.ts +13 -2
  52. package/types/combineZeroClients.d.ts +2 -0
  53. package/types/combineZeroClients.d.ts.map +1 -1
  54. package/types/createZeroClient.d.ts +2 -0
  55. package/types/createZeroClient.d.ts.map +1 -1
  56. package/types/helpers/recoverZeroClient.d.ts +1 -6
  57. package/types/helpers/recoverZeroClient.d.ts.map +1 -1
  58. package/types/types.d.ts +10 -1
  59. package/types/types.d.ts.map +1 -1
package/README.md CHANGED
@@ -846,8 +846,9 @@ drops the affected instance's local store and reloads the page ONCE. this covers
846
846
  `…LastMutationID`, `ClientNotFound`, `connection userID mismatch`. these
847
847
  surface only through the error log, so the log sink recovers on them too.
848
848
 
849
- two consecutive server acknowledgement timeouts also recover by default. one
850
- timeout remains a normal slow-server failure. configure the threshold with
849
+ two consecutive server acknowledgement timeouts reconstruct the client in place
850
+ without deleting local state or reloading the page. one timeout remains a normal
851
+ slow-server failure. configure the threshold with
851
852
  `serverAckTimeoutRecoveryThreshold` on `createZeroClient`.
852
853
 
853
854
  ### the hooks (all optional props on `ProvideZero`)
@@ -900,6 +901,18 @@ timeout remains a normal slow-server failure. configure the threshold with
900
901
  `connection-needs-auth`, so consumers can switch on stable keys instead of
901
902
  matching message strings.
902
903
 
904
+ recoverable connection interruptions emit `{ type: 'reconnect', status:
905
+ 'trying' | 'waiting', reasonKey, reason }`, followed by `{ type: 'reconnect',
906
+ status: 'connected' }` after sync reconnects. `ServerOverloaded` stays in
907
+ Zero's built-in retry/backoff loop, transport errors such as `Failed to fetch`
908
+ resume the paused connection, and acknowledgement timeouts reconstruct the
909
+ client with its existing local state. none of these paths delete local state or
910
+ reload the page.
911
+
912
+ `createZeroClient` and a combined client also expose `reloadPage()`. it performs
913
+ a plain page reload and returns `false` where no page location exists. this is
914
+ the opt-in action for a host's reconnect toast; it never clears local state.
915
+
903
916
  ### guard + latch semantics
904
917
 
905
918
  - a **per-reason guard** (60s window) means the SAME reason re-failing right
@@ -77,8 +77,27 @@ function combineZeroClients(...clientsAndOptions) {
77
77
  return ownerOfQueryFn(args[0]).getQuery(...args);
78
78
  }
79
79
  const zeroEvents = (0, import_emitter.createEmitter)(`zero:combined(${clients.map(client => client.instanceName).join("+")})`, null);
80
+ const reconnecting = /* @__PURE__ */new Map();
80
81
  for (const client of clients) {
81
- client.zeroEvents.listen(event => zeroEvents.emit(event));
82
+ client.zeroEvents.listen(event => {
83
+ if (event?.type !== "reconnect") {
84
+ zeroEvents.emit(event);
85
+ return;
86
+ }
87
+ if (event.status === "connected") {
88
+ reconnecting.delete(client.instanceName);
89
+ if (reconnecting.size === 0) {
90
+ zeroEvents.emit(event);
91
+ return;
92
+ }
93
+ const pending2 = [...reconnecting.values()];
94
+ zeroEvents.emit(pending2.find(candidate => candidate.status === "waiting") ?? pending2[0]);
95
+ return;
96
+ }
97
+ reconnecting.set(client.instanceName, event);
98
+ const pending = [...reconnecting.values()];
99
+ zeroEvents.emit(pending.find(candidate => candidate.status === "waiting") ?? event);
100
+ });
82
101
  }
83
102
  const ControlQueries = ({
84
103
  children,
@@ -95,6 +114,7 @@ function combineZeroClients(...clientsAndOptions) {
95
114
  getQuery,
96
115
  run: import_run.run,
97
116
  zeroEvents,
117
+ reloadPage: primary.reloadPage,
98
118
  ControlQueries
99
119
  };
100
120
  return combined;
@@ -42,8 +42,8 @@ function combineZeroClients() {
42
42
  var options = hasOptions ? last : {};
43
43
  var primary = clients[0];
44
44
  var innerName = (_options_inner = options.inner) !== null && _options_inner !== void 0 ? _options_inner : clients[clients.length - 1].instanceName;
45
- var clientsByName = new Map(clients.map(function (client2) {
46
- return [client2.instanceName, client2];
45
+ var clientsByName = new Map(clients.map(function (client) {
46
+ return [client.instanceName, client];
47
47
  }));
48
48
  if (!clientsByName.has(innerName)) {
49
49
  throw new Error(`[on-zero] combineZeroClients inner instance '${innerName}' is not one of the passed clients`);
@@ -96,19 +96,43 @@ function combineZeroClients() {
96
96
  }
97
97
  return ownerOfQueryFn(args[0]).getQuery(...args);
98
98
  }
99
- var zeroEvents = (0, import_emitter.createEmitter)(`zero:combined(${clients.map(function (client2) {
100
- return client2.instanceName;
99
+ var zeroEvents = (0, import_emitter.createEmitter)(`zero:combined(${clients.map(function (client) {
100
+ return client.instanceName;
101
101
  }).join("+")})`, null);
102
+ var reconnecting = /* @__PURE__ */new Map();
102
103
  var _iteratorNormalCompletion = true,
103
104
  _didIteratorError = false,
104
105
  _iteratorError = void 0;
105
106
  try {
106
- for (var _iterator = clients[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
107
+ var _loop = function () {
107
108
  var client = _step.value;
108
109
  client.zeroEvents.listen(function (event) {
109
- return zeroEvents.emit(event);
110
+ var _pending_find;
111
+ if ((event === null || event === void 0 ? void 0 : event.type) !== "reconnect") {
112
+ zeroEvents.emit(event);
113
+ return;
114
+ }
115
+ if (event.status === "connected") {
116
+ var _pending_find1;
117
+ reconnecting.delete(client.instanceName);
118
+ if (reconnecting.size === 0) {
119
+ zeroEvents.emit(event);
120
+ return;
121
+ }
122
+ var pending = [...reconnecting.values()];
123
+ zeroEvents.emit((_pending_find1 = pending.find(function (candidate) {
124
+ return candidate.status === "waiting";
125
+ })) !== null && _pending_find1 !== void 0 ? _pending_find1 : pending[0]);
126
+ return;
127
+ }
128
+ reconnecting.set(client.instanceName, event);
129
+ var pending1 = [...reconnecting.values()];
130
+ zeroEvents.emit((_pending_find = pending1.find(function (candidate) {
131
+ return candidate.status === "waiting";
132
+ })) !== null && _pending_find !== void 0 ? _pending_find : event);
110
133
  });
111
- }
134
+ };
135
+ for (var _iterator = clients[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) _loop();
112
136
  } catch (err) {
113
137
  _didIteratorError = true;
114
138
  _iteratorError = err;
@@ -128,8 +152,8 @@ function combineZeroClients() {
128
152
  children,
129
153
  ...props
130
154
  } = param;
131
- return clients.reduceRight(function (inner, client2) {
132
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)(client2.ControlQueries, {
155
+ return clients.reduceRight(function (inner, client) {
156
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(client.ControlQueries, {
133
157
  ...props,
134
158
  children: inner
135
159
  });
@@ -143,6 +167,7 @@ function combineZeroClients() {
143
167
  getQuery,
144
168
  run: import_run.run,
145
169
  zeroEvents,
170
+ reloadPage: primary.reloadPage,
146
171
  ControlQueries
147
172
  };
148
173
  return combined;
@@ -1 +1 @@
1
- {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","combineZeroClients_exports","__export","combineZeroClients","module","exports","import_jsx_runtime","require","import_emitter","import_instanceRegistry","import_run","_len","arguments","length","clientsAndOptions","Array","_key","_options_inner","last","hasOptions","instanceName","clients","slice","options","primary","innerName","inner","clientsByName","Map","map","client2","has","Error","ownerOfNamespace","ownerOfNamespace2","namespace","owner","getInstanceForNamespace","get","name","ownerOfQueryFn","ownerOfQueryFn2","fn","getInstanceForQueryFn","useQuery","_len2","args","_key2","useQueryDirect","usePermission","String","usePermissionDirect","mutate","Proxy","_","key","zero","preload","getQuery","zeroEvents","createEmitter","join"],"sources":["../../src/combineZeroClients.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","combineZeroClients_exports","__export","combineZeroClients","module","exports","import_jsx_runtime","require","import_emitter","import_instanceRegistry","import_run","_len","arguments","length","clientsAndOptions","Array","_key","_options_inner","last","hasOptions","instanceName","clients","slice","options","primary","innerName","inner","clientsByName","Map","map","client","has","Error","ownerOfNamespace","ownerOfNamespace2","namespace","owner","getInstanceForNamespace","get","name","ownerOfQueryFn","ownerOfQueryFn2","fn","getInstanceForQueryFn","useQuery","_len2","args","_key2","useQueryDirect","usePermission","String","usePermissionDirect","mutate","Proxy","_","key","zero","preload","getQuery","zeroEvents","createEmitter","join","reconnecting","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_loop","_step","listen","event","_pending_find","type","emit","status","_pending_find1","delete","size","pending","values","find","candidate"],"sources":["../../src/combineZeroClients.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -204,11 +204,12 @@ function createZeroClientInternal({
204
204
  });
205
205
  const emitterScope = instanceName === "default" ? "" : `:${instanceName}`;
206
206
  const zeroEvents = (0, import_emitter.createEmitter)(`zero${emitterScope}`, null);
207
- let recoverFromAckTimeout = () => {};
208
207
  const ackTimeoutRecoveryThreshold = Number.isFinite(serverAckTimeoutRecoveryThreshold) && serverAckTimeoutRecoveryThreshold >= 2 ? Math.floor(serverAckTimeoutRecoveryThreshold) : 2;
209
208
  const mutationLifecycle = (0, import_mutationLifecycle.createMutationLifecycle)({
210
209
  ackTimeoutRecoveryThreshold,
211
- recoverFromAckTimeout: input => recoverFromAckTimeout(input)
210
+ recoverFromAckTimeout: input => {
211
+ void reconnectInPlace("server-ack-timeout", `${input.label} server acknowledgement timed out ${input.consecutiveTimeouts} consecutive times (${input.timeoutMs}ms each)`);
212
+ }
212
213
  });
213
214
  const zeroInstanceVersion = createDirectUseQuery ? (0, import_emitter.createEmitter)(`zero-instance-version${emitterScope}`, 0) : null;
214
215
  const AuthDataContext = (0, import_react2.createContext)({});
@@ -321,6 +322,30 @@ function createZeroClientInternal({
321
322
  bump();
322
323
  return true;
323
324
  }
325
+ function emitReconnectStatus(event) {
326
+ const current = zeroEvents.value;
327
+ if (current?.type === "reconnect" && current.status === event.status && ("reasonKey" in current ? current.reasonKey : void 0) === ("reasonKey" in event ? event.reasonKey : void 0) && ("reason" in current ? current.reason : void 0) === ("reason" in event ? event.reason : void 0)) {
328
+ return;
329
+ }
330
+ zeroEvents.emit(event);
331
+ }
332
+ async function reconnectInPlace(reasonKey, reason) {
333
+ emitReconnectStatus({
334
+ type: "reconnect",
335
+ status: "trying",
336
+ reasonKey,
337
+ reason
338
+ });
339
+ return remint({
340
+ dropLocalState: false
341
+ });
342
+ }
343
+ function reloadPage() {
344
+ const location = globalThis.location;
345
+ if (!location?.reload) return false;
346
+ location.reload();
347
+ return true;
348
+ }
324
349
  const DISABLED_ZERO_STUB_CONNECTION_STATE = {
325
350
  current: {
326
351
  name: "closed"
@@ -454,7 +479,6 @@ function createZeroClientInternal({
454
479
  onRecovery: () => mutationLifecycle.fence()
455
480
  };
456
481
  const recovery = (0, import_recoverZeroClient.makeZeroRecovery)(recoveryDeps);
457
- recoverFromAckTimeout = recovery.onServerAckTimeout;
458
482
  const createdInstance = new import_zero.Zero({
459
483
  kvStore: "mem",
460
484
  ...options,
@@ -536,7 +560,13 @@ function createZeroClientInternal({
536
560
  const zeroInstance = (0, import_react.useZero)();
537
561
  const state = (0, import_react.useConnectionState)();
538
562
  const prevState = (0, import_react2.useRef)(state.name);
539
- const staleReconnectRef = (0, import_react2.useRef)(null);
563
+ const hasConnectedRef = (0, import_react2.useRef)(false);
564
+ const currentReconnect = zeroEvents2.value?.type === "reconnect" && zeroEvents2.value.status !== "connected" ? zeroEvents2.value : null;
565
+ const reconnectRef = (0, import_react2.useRef)(currentReconnect ? {
566
+ reasonKey: currentReconnect.reasonKey,
567
+ reason: currentReconnect.reason
568
+ } : null);
569
+ const recoverableErrorRef = (0, import_react2.useRef)(null);
540
570
  const needsAuthRef = (0, import_react2.useRef)(false);
541
571
  (0, import_react2.useEffect)(() => {
542
572
  const name = state.name;
@@ -547,14 +577,56 @@ function createZeroClientInternal({
547
577
  if (reason) document.body.dataset.zeroReason = reason.slice(0, 200);else delete document.body.dataset.zeroReason;
548
578
  if (name === "connected") document.body.dataset.zeroConnected = "true";else delete document.body.dataset.zeroConnected;
549
579
  }
550
- if (name === "error" && (0, import_recoverZeroClient.isRecoverableZeroStalePokeMessage)(reason)) {
551
- if (staleReconnectRef.current !== reason) {
552
- staleReconnectRef.current = reason;
580
+ if (name === "connected") {
581
+ hasConnectedRef.current = true;
582
+ recoverableErrorRef.current = null;
583
+ if (reconnectRef.current) {
584
+ reconnectRef.current = null;
585
+ emitReconnectStatus({
586
+ type: "reconnect",
587
+ status: "connected"
588
+ });
589
+ }
590
+ }
591
+ const reconnectReasonKey = reason.includes("ServerOverloaded") ? "server-overloaded" : reason.includes("Failed to fetch") || reason.includes("fetch failed") || reason.includes("NetworkError when attempting to fetch resource") || reason.includes("Network request failed") || reason.includes("Load failed") ? "transport" : void 0;
592
+ if (name === "error" && ((0, import_recoverZeroClient.isRecoverableZeroStalePokeMessage)(reason) || reconnectReasonKey)) {
593
+ if (recoverableErrorRef.current !== reason) {
594
+ recoverableErrorRef.current = reason;
595
+ reconnectRef.current = {
596
+ reasonKey: reconnectReasonKey ?? "transport",
597
+ reason
598
+ };
599
+ emitReconnectStatus({
600
+ type: "reconnect",
601
+ status: "trying",
602
+ ...reconnectRef.current
603
+ });
553
604
  void Promise.resolve(zeroInstance.connection?.connect?.()).catch(() => {});
554
605
  }
555
606
  return;
556
607
  }
557
- if (name !== "error") staleReconnectRef.current = null;
608
+ if (name !== "error") recoverableErrorRef.current = null;
609
+ if (name === "connecting" && (reconnectRef.current || hasConnectedRef.current || Boolean(reason))) {
610
+ reconnectRef.current = {
611
+ reasonKey: reconnectReasonKey ?? reconnectRef.current?.reasonKey ?? "transport",
612
+ reason: reason || reconnectRef.current?.reason || "connection interrupted"
613
+ };
614
+ emitReconnectStatus({
615
+ type: "reconnect",
616
+ status: reason ? "waiting" : "trying",
617
+ ...reconnectRef.current
618
+ });
619
+ } else if (name === "disconnected" && (reconnectRef.current || hasConnectedRef.current)) {
620
+ reconnectRef.current = {
621
+ reasonKey: reconnectRef.current?.reasonKey ?? "transport",
622
+ reason: reason || reconnectRef.current?.reason || "connection interrupted"
623
+ };
624
+ emitReconnectStatus({
625
+ type: "reconnect",
626
+ status: "waiting",
627
+ ...reconnectRef.current
628
+ });
629
+ }
558
630
  if (name === "needs-auth") {
559
631
  if (refreshAuth && !needsAuthRef.current) {
560
632
  needsAuthRef.current = true;
@@ -612,6 +684,7 @@ function createZeroClientInternal({
612
684
  return {
613
685
  instanceName,
614
686
  zeroEvents,
687
+ reloadPage,
615
688
  ProvideZero,
616
689
  ControlQueries,
617
690
  useQuery,
@@ -178,6 +178,73 @@ async function mount(extraProps = {}, userID = "conn") {
178
178
  (0, import_vitest.expect)(events.some(event => event.type === "error")).toBe(false);
179
179
  off();
180
180
  });
181
+ (0, import_vitest.test)("transport error reconnects in place and publishes trying status", async () => {
182
+ const events = [];
183
+ const off = client.zeroEvents.listen(event => {
184
+ if (event) events.push(event);
185
+ });
186
+ const instance = await mount({}, "conn-transport");
187
+ await (0, import_react.act)(async () => {
188
+ instance.connection.state.set({
189
+ name: "error",
190
+ reason: "Unexpected internal error: Failed to fetch"
191
+ });
192
+ await Promise.resolve();
193
+ });
194
+ (0, import_vitest.expect)(instance.connection.connect).toHaveBeenCalledTimes(1);
195
+ (0, import_vitest.expect)(events).toContainEqual({
196
+ type: "reconnect",
197
+ status: "trying",
198
+ reasonKey: "transport",
199
+ reason: "Unexpected internal error: Failed to fetch"
200
+ });
201
+ (0, import_vitest.expect)(events.some(event => event.type === "error")).toBe(false);
202
+ await (0, import_react.act)(async () => {
203
+ instance.connection.state.set({
204
+ name: "connected"
205
+ });
206
+ await Promise.resolve();
207
+ });
208
+ (0, import_vitest.expect)(events).toContainEqual({
209
+ type: "reconnect",
210
+ status: "connected"
211
+ });
212
+ off();
213
+ });
214
+ (0, import_vitest.test)("server overload publishes waiting status while Zero owns retry backoff", async () => {
215
+ const events = [];
216
+ const off = client.zeroEvents.listen(event => {
217
+ if (event) events.push(event);
218
+ });
219
+ const instance = await mount({}, "conn-overload");
220
+ await (0, import_react.act)(async () => {
221
+ instance.connection.state.set({
222
+ name: "connecting",
223
+ reason: "ServerOverloaded: retry later"
224
+ });
225
+ await Promise.resolve();
226
+ });
227
+ (0, import_vitest.expect)(instance.connection.connect).not.toHaveBeenCalled();
228
+ (0, import_vitest.expect)(events).toContainEqual({
229
+ type: "reconnect",
230
+ status: "waiting",
231
+ reasonKey: "server-overloaded",
232
+ reason: "ServerOverloaded: retry later"
233
+ });
234
+ await (0, import_react.act)(async () => {
235
+ instance.connection.state.set({
236
+ name: "connecting"
237
+ });
238
+ await Promise.resolve();
239
+ });
240
+ (0, import_vitest.expect)(events).toContainEqual({
241
+ type: "reconnect",
242
+ status: "trying",
243
+ reasonKey: "server-overloaded",
244
+ reason: "ServerOverloaded: retry later"
245
+ });
246
+ off();
247
+ });
181
248
  (0, import_vitest.test)("connectionDataset mirrors connection state onto the body dataset", async () => {
182
249
  const instance = await mount({
183
250
  connectionDataset: true
@@ -252,6 +252,75 @@ async function mount() {
252
252
  })).toBe(false);
253
253
  off();
254
254
  });
255
+ (0, import_vitest.test)("transport error reconnects in place and publishes trying status", async function () {
256
+ var events = [];
257
+ var off = client.zeroEvents.listen(function (event) {
258
+ if (event) events.push(event);
259
+ });
260
+ var instance = await mount({}, "conn-transport");
261
+ await (0, import_react.act)(async function () {
262
+ instance.connection.state.set({
263
+ name: "error",
264
+ reason: "Unexpected internal error: Failed to fetch"
265
+ });
266
+ await Promise.resolve();
267
+ });
268
+ (0, import_vitest.expect)(instance.connection.connect).toHaveBeenCalledTimes(1);
269
+ (0, import_vitest.expect)(events).toContainEqual({
270
+ type: "reconnect",
271
+ status: "trying",
272
+ reasonKey: "transport",
273
+ reason: "Unexpected internal error: Failed to fetch"
274
+ });
275
+ (0, import_vitest.expect)(events.some(function (event) {
276
+ return event.type === "error";
277
+ })).toBe(false);
278
+ await (0, import_react.act)(async function () {
279
+ instance.connection.state.set({
280
+ name: "connected"
281
+ });
282
+ await Promise.resolve();
283
+ });
284
+ (0, import_vitest.expect)(events).toContainEqual({
285
+ type: "reconnect",
286
+ status: "connected"
287
+ });
288
+ off();
289
+ });
290
+ (0, import_vitest.test)("server overload publishes waiting status while Zero owns retry backoff", async function () {
291
+ var events = [];
292
+ var off = client.zeroEvents.listen(function (event) {
293
+ if (event) events.push(event);
294
+ });
295
+ var instance = await mount({}, "conn-overload");
296
+ await (0, import_react.act)(async function () {
297
+ instance.connection.state.set({
298
+ name: "connecting",
299
+ reason: "ServerOverloaded: retry later"
300
+ });
301
+ await Promise.resolve();
302
+ });
303
+ (0, import_vitest.expect)(instance.connection.connect).not.toHaveBeenCalled();
304
+ (0, import_vitest.expect)(events).toContainEqual({
305
+ type: "reconnect",
306
+ status: "waiting",
307
+ reasonKey: "server-overloaded",
308
+ reason: "ServerOverloaded: retry later"
309
+ });
310
+ await (0, import_react.act)(async function () {
311
+ instance.connection.state.set({
312
+ name: "connecting"
313
+ });
314
+ await Promise.resolve();
315
+ });
316
+ (0, import_vitest.expect)(events).toContainEqual({
317
+ type: "reconnect",
318
+ status: "trying",
319
+ reasonKey: "server-overloaded",
320
+ reason: "ServerOverloaded: retry later"
321
+ });
322
+ off();
323
+ });
255
324
  (0, import_vitest.test)("connectionDataset mirrors connection state onto the body dataset", async function () {
256
325
  var instance = await mount({
257
326
  connectionDataset: true
@@ -1 +1 @@
1
- {"version":3,"names":["import_jsx_runtime","require","import_zero","import_react","import_client","import_vitest","import_createZeroClient","_class_call_check","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","prototype","_define_property","obj","value","fakeZero","vi","hoisted","FakeConnectionState","FakeConnectionState2","initial","_this","Set","cb","listeners","add","delete","current","set","next","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","done","err","return","FakeZero","FakeZero2","state","name","connect","fn","errors","cleanup","complete","Promise","resolve","instances","push","mock","importOriginal","actual","Zero","globalThis","IS_REACT_ACT_ENVIRONMENT","noteTable","table","columns","id","string","body","primaryKey","schema","createSchema","tables","client","createZeroClient","models","groupedQueries","instanceName","container","root","beforeEach","document","createElement","dataset","zeroState","zeroConnected","zeroReason","afterEach","act","unmount","mount","extraProps","arguments","userID","createRoot","render","jsx","ProvideZero","cacheURL","children","at","test","readinessClient","ready","waitForZero","expect","toBe","install","transport","toHaveBeenCalledOnce","toHaveBeenCalledWith","refreshAuth"],"sources":["../../src/createZeroClient.connection.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["import_jsx_runtime","require","import_zero","import_react","import_client","import_vitest","import_createZeroClient","_class_call_check","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","prototype","_define_property","obj","value","fakeZero","vi","hoisted","FakeConnectionState","FakeConnectionState2","initial","_this","Set","cb","listeners","add","delete","current","set","next","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","done","err","return","FakeZero","FakeZero2","state","name","connect","fn","errors","cleanup","complete","Promise","resolve","instances","push","mock","importOriginal","actual","Zero","globalThis","IS_REACT_ACT_ENVIRONMENT","noteTable","table","columns","id","string","body","primaryKey","schema","createSchema","tables","client","createZeroClient","models","groupedQueries","instanceName","container","root","beforeEach","document","createElement","dataset","zeroState","zeroConnected","zeroReason","afterEach","act","unmount","mount","extraProps","arguments","userID","createRoot","render","jsx","ProvideZero","cacheURL","children","at","test","readinessClient","ready","waitForZero","expect","toBe","install","transport","toHaveBeenCalledOnce","toHaveBeenCalledWith","refreshAuth","events","off","zeroEvents","listen","event","connection","reason","toHaveBeenCalledTimes","auth","toContainEqual","type","reasonKey","message","some"],"sources":["../../src/createZeroClient.connection.test.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -335,12 +335,11 @@ function createZeroClientInternal(param) {
335
335
  });
336
336
  var emitterScope = instanceName === "default" ? "" : `:${instanceName}`;
337
337
  var zeroEvents = (0, import_emitter.createEmitter)(`zero${emitterScope}`, null);
338
- var recoverFromAckTimeout = function recoverFromAckTimeout2() {};
339
338
  var ackTimeoutRecoveryThreshold = Number.isFinite(serverAckTimeoutRecoveryThreshold) && serverAckTimeoutRecoveryThreshold >= 2 ? Math.floor(serverAckTimeoutRecoveryThreshold) : 2;
340
339
  var mutationLifecycle = (0, import_mutationLifecycle.createMutationLifecycle)({
341
340
  ackTimeoutRecoveryThreshold,
342
- recoverFromAckTimeout: function recoverFromAckTimeout1(input) {
343
- return recoverFromAckTimeout(input);
341
+ recoverFromAckTimeout: function recoverFromAckTimeout(input) {
342
+ void reconnectInPlace("server-ack-timeout", `${input.label} server acknowledgement timed out ${input.consecutiveTimeouts} consecutive times (${input.timeoutMs}ms each)`);
344
343
  }
345
344
  });
346
345
  var zeroInstanceVersion = createDirectUseQuery ? (0, import_emitter.createEmitter)(`zero-instance-version${emitterScope}`, 0) : null;
@@ -461,6 +460,30 @@ function createZeroClientInternal(param) {
461
460
  bump();
462
461
  return true;
463
462
  }
463
+ function emitReconnectStatus(event) {
464
+ var current = zeroEvents.value;
465
+ if ((current === null || current === void 0 ? void 0 : current.type) === "reconnect" && current.status === event.status && ("reasonKey" in current ? current.reasonKey : void 0) === ("reasonKey" in event ? event.reasonKey : void 0) && ("reason" in current ? current.reason : void 0) === ("reason" in event ? event.reason : void 0)) {
466
+ return;
467
+ }
468
+ zeroEvents.emit(event);
469
+ }
470
+ async function reconnectInPlace(reasonKey, reason) {
471
+ emitReconnectStatus({
472
+ type: "reconnect",
473
+ status: "trying",
474
+ reasonKey,
475
+ reason
476
+ });
477
+ return remint({
478
+ dropLocalState: false
479
+ });
480
+ }
481
+ function reloadPage() {
482
+ var location = globalThis.location;
483
+ if (!(location === null || location === void 0 ? void 0 : location.reload)) return false;
484
+ location.reload();
485
+ return true;
486
+ }
464
487
  var DISABLED_ZERO_STUB_CONNECTION_STATE = {
465
488
  current: {
466
489
  name: "closed"
@@ -633,7 +656,6 @@ function createZeroClientInternal(param) {
633
656
  }
634
657
  };
635
658
  var recovery = (0, import_recoverZeroClient.makeZeroRecovery)(recoveryDeps);
636
- recoverFromAckTimeout = recovery.onServerAckTimeout;
637
659
  var createdInstance = new import_zero.Zero({
638
660
  kvStore: "mem",
639
661
  ...options,
@@ -741,10 +763,17 @@ function createZeroClientInternal(param) {
741
763
  exposeDataset,
742
764
  datasetCacheUrl
743
765
  } = param2;
766
+ var _zeroEvents_value;
744
767
  var zeroInstance = (0, import_react.useZero)();
745
768
  var state = (0, import_react.useConnectionState)();
746
769
  var prevState = (0, import_react2.useRef)(state.name);
747
- var staleReconnectRef = (0, import_react2.useRef)(null);
770
+ var hasConnectedRef = (0, import_react2.useRef)(false);
771
+ var currentReconnect = ((_zeroEvents_value = zeroEvents2.value) === null || _zeroEvents_value === void 0 ? void 0 : _zeroEvents_value.type) === "reconnect" && zeroEvents2.value.status !== "connected" ? zeroEvents2.value : null;
772
+ var reconnectRef = (0, import_react2.useRef)(currentReconnect ? {
773
+ reasonKey: currentReconnect.reasonKey,
774
+ reason: currentReconnect.reason
775
+ } : null);
776
+ var recoverableErrorRef = (0, import_react2.useRef)(null);
748
777
  var needsAuthRef = (0, import_react2.useRef)(false);
749
778
  (0, import_react2.useEffect)(function () {
750
779
  var name = state.name;
@@ -755,15 +784,61 @@ function createZeroClientInternal(param) {
755
784
  if (reason) document.body.dataset.zeroReason = reason.slice(0, 200);else delete document.body.dataset.zeroReason;
756
785
  if (name === "connected") document.body.dataset.zeroConnected = "true";else delete document.body.dataset.zeroConnected;
757
786
  }
758
- if (name === "error" && (0, import_recoverZeroClient.isRecoverableZeroStalePokeMessage)(reason)) {
759
- if (staleReconnectRef.current !== reason) {
787
+ if (name === "connected") {
788
+ hasConnectedRef.current = true;
789
+ recoverableErrorRef.current = null;
790
+ if (reconnectRef.current) {
791
+ reconnectRef.current = null;
792
+ emitReconnectStatus({
793
+ type: "reconnect",
794
+ status: "connected"
795
+ });
796
+ }
797
+ }
798
+ var reconnectReasonKey = reason.includes("ServerOverloaded") ? "server-overloaded" : reason.includes("Failed to fetch") || reason.includes("fetch failed") || reason.includes("NetworkError when attempting to fetch resource") || reason.includes("Network request failed") || reason.includes("Load failed") ? "transport" : void 0;
799
+ if (name === "error" && ((0, import_recoverZeroClient.isRecoverableZeroStalePokeMessage)(reason) || reconnectReasonKey)) {
800
+ if (recoverableErrorRef.current !== reason) {
760
801
  var _zeroInstance_connection_connect, _zeroInstance_connection;
761
- staleReconnectRef.current = reason;
802
+ recoverableErrorRef.current = reason;
803
+ reconnectRef.current = {
804
+ reasonKey: reconnectReasonKey !== null && reconnectReasonKey !== void 0 ? reconnectReasonKey : "transport",
805
+ reason
806
+ };
807
+ emitReconnectStatus({
808
+ type: "reconnect",
809
+ status: "trying",
810
+ ...reconnectRef.current
811
+ });
762
812
  void Promise.resolve((_zeroInstance_connection = zeroInstance.connection) === null || _zeroInstance_connection === void 0 ? void 0 : (_zeroInstance_connection_connect = _zeroInstance_connection.connect) === null || _zeroInstance_connection_connect === void 0 ? void 0 : _zeroInstance_connection_connect.call(_zeroInstance_connection)).catch(function () {});
763
813
  }
764
814
  return;
765
815
  }
766
- if (name !== "error") staleReconnectRef.current = null;
816
+ if (name !== "error") recoverableErrorRef.current = null;
817
+ if (name === "connecting" && (reconnectRef.current || hasConnectedRef.current || Boolean(reason))) {
818
+ var _ref;
819
+ var _reconnectRef_current, _reconnectRef_current1;
820
+ reconnectRef.current = {
821
+ reasonKey: (_ref = reconnectReasonKey !== null && reconnectReasonKey !== void 0 ? reconnectReasonKey : (_reconnectRef_current = reconnectRef.current) === null || _reconnectRef_current === void 0 ? void 0 : _reconnectRef_current.reasonKey) !== null && _ref !== void 0 ? _ref : "transport",
822
+ reason: reason || ((_reconnectRef_current1 = reconnectRef.current) === null || _reconnectRef_current1 === void 0 ? void 0 : _reconnectRef_current1.reason) || "connection interrupted"
823
+ };
824
+ emitReconnectStatus({
825
+ type: "reconnect",
826
+ status: reason ? "waiting" : "trying",
827
+ ...reconnectRef.current
828
+ });
829
+ } else if (name === "disconnected" && (reconnectRef.current || hasConnectedRef.current)) {
830
+ var _ref1;
831
+ var _reconnectRef_current2, _reconnectRef_current3;
832
+ reconnectRef.current = {
833
+ reasonKey: (_ref1 = (_reconnectRef_current2 = reconnectRef.current) === null || _reconnectRef_current2 === void 0 ? void 0 : _reconnectRef_current2.reasonKey) !== null && _ref1 !== void 0 ? _ref1 : "transport",
834
+ reason: reason || ((_reconnectRef_current3 = reconnectRef.current) === null || _reconnectRef_current3 === void 0 ? void 0 : _reconnectRef_current3.reason) || "connection interrupted"
835
+ };
836
+ emitReconnectStatus({
837
+ type: "reconnect",
838
+ status: "waiting",
839
+ ...reconnectRef.current
840
+ });
841
+ }
767
842
  if (name === "needs-auth") {
768
843
  if (refreshAuth && !needsAuthRef.current) {
769
844
  needsAuthRef.current = true;
@@ -823,6 +898,7 @@ function createZeroClientInternal(param) {
823
898
  return {
824
899
  instanceName,
825
900
  zeroEvents,
901
+ reloadPage,
826
902
  ProvideZero,
827
903
  ControlQueries,
828
904
  useQuery,