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.
- package/README.md +15 -2
- package/dist/cjs/combineZeroClients.cjs +21 -1
- package/dist/cjs/combineZeroClients.native.js +34 -9
- package/dist/cjs/combineZeroClients.native.js.map +1 -1
- package/dist/cjs/createZeroClient.cjs +81 -8
- package/dist/cjs/createZeroClient.connection.test.cjs +67 -0
- package/dist/cjs/createZeroClient.connection.test.native.js +69 -0
- package/dist/cjs/createZeroClient.connection.test.native.js.map +1 -1
- package/dist/cjs/createZeroClient.native.js +85 -9
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroClient.recovery.test.cjs +19 -8
- package/dist/cjs/createZeroClient.recovery.test.native.js +20 -8
- package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.cjs +0 -3
- package/dist/cjs/helpers/recoverZeroClient.native.js +0 -3
- package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/cjs/multiInstance.test.cjs +54 -0
- package/dist/cjs/multiInstance.test.native.js +58 -0
- package/dist/cjs/multiInstance.test.native.js.map +1 -1
- package/dist/esm/combineZeroClients.mjs +21 -1
- package/dist/esm/combineZeroClients.mjs.map +1 -1
- package/dist/esm/combineZeroClients.native.js +34 -9
- package/dist/esm/combineZeroClients.native.js.map +1 -1
- package/dist/esm/createZeroClient.connection.test.mjs +67 -0
- package/dist/esm/createZeroClient.connection.test.mjs.map +1 -1
- package/dist/esm/createZeroClient.connection.test.native.js +69 -0
- package/dist/esm/createZeroClient.connection.test.native.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +81 -8
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +85 -9
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.mjs +19 -8
- package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.native.js +20 -8
- package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.mjs +0 -3
- package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.native.js +0 -3
- package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/esm/multiInstance.test.mjs +54 -0
- package/dist/esm/multiInstance.test.mjs.map +1 -1
- package/dist/esm/multiInstance.test.native.js +58 -0
- package/dist/esm/multiInstance.test.native.js.map +1 -1
- package/package.json +1 -1
- package/src/combineZeroClients.tsx +30 -1
- package/src/createZeroClient.connection.test.tsx +66 -0
- package/src/createZeroClient.recovery.test.tsx +21 -12
- package/src/createZeroClient.tsx +127 -18
- package/src/helpers/recoverZeroClient.ts +0 -13
- package/src/multiInstance.test.tsx +49 -0
- package/src/types.ts +13 -2
- package/types/combineZeroClients.d.ts +2 -0
- package/types/combineZeroClients.d.ts.map +1 -1
- package/types/createZeroClient.d.ts +2 -0
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/helpers/recoverZeroClient.d.ts +1 -6
- package/types/helpers/recoverZeroClient.d.ts.map +1 -1
- package/types/types.d.ts +10 -1
- 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
|
|
850
|
-
|
|
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 =>
|
|
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 (
|
|
46
|
-
return [
|
|
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 (
|
|
100
|
-
return
|
|
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
|
-
|
|
107
|
+
var _loop = function () {
|
|
107
108
|
var client = _step.value;
|
|
108
109
|
client.zeroEvents.listen(function (event) {
|
|
109
|
-
|
|
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,
|
|
132
|
-
return /* @__PURE__ */(0, import_jsx_runtime.jsx)(
|
|
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","
|
|
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 =>
|
|
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
|
|
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 === "
|
|
551
|
-
|
|
552
|
-
|
|
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")
|
|
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":"AAEA;;AACA,IAAAA,kBAAoB,GAAAC,OAAA;AACpB,IAAAC,WAAA,GAAAD,OAAsC;AACtC,IAAAE,YAAA,GAAAF,OAAwD;AAgDxD,IAAAG,aAAA,GAAAH,OAAA,mBAAiC;AA2CzB,IAAAI,aAAA,GAAAJ,OAAA;AAvFR,IAAAK,uBAAiB,GAAAL,OAAG,+BAAc;AAAA,SAC1BM,kBAAAC,QAAoB,EAAAC,WAAA;EAAA,IACxB,EAAAD,QAAA,YAAAC,WAAA,aAAAC,SAAA;AAAA;AACgC,SAChCC,iBAAwDA,CAAAC,MAAA,EAAAC,KAAA;EACtD,SAAKC,CAAA,MAAAA,CAAA,GAAUD,KAAA,CAAAE,MAAA,EAAAD,CAAA;IACjB,IAAAE,UAAA,GAAAH,KAAA,CAAAC,CAAA;IACAE,UAAA,CAAAC,UAAgC,GAAAD,UAAA,CAAAC,UAAA;IAC9BD,UAAK,CAAAE,YAAgB;IACrB,WAAO,IAAMF,UAAA,EAAAA,UAAA,CAAAG,QAAA;IACXC,MAAA,CAAAC,cAAe,CAAAT,MAAS,EAAAI,UAAA,CAAAM,GAAA,EAAAN,UAAA;EAAA;AAC1B;AACF,SACIO,aAAyCA,CAAAd,WAAA,EAAAe,UAAA,EAAAC,WAAA;EAC3C,IAAAD,UAAK,EAAAb,iBAAU,CAAAF,WAAA,CAAAiB,SAAA,EAAAF,UAAA;EACf,IAAAC,WAAW,EAAAd,iBAAW,CAAAF,WAAc,EAAAgB,WAAA;EAAA,OACtChB,WAAA;AAAA;AACF,SAEMkB,gBAASA,CAAAC,GAAA,EAAAN,GAAA,EAAAO,KAAA;EAAA,IACJP,GAAA,IAAAM,GAAW;IACXR,MAAA,CAAAC,cAAa,CAAAO,GAAA,EAAAN,GAAA;MACpBO,KAAA;MACAZ,UAAS;MAAmBC,YAAC;MAC/BC,QAAA;IACS;EAA2C,OAC3CS,GAAQ,CAAAN,GAAA,IAAAO,KAAA;EAAM,OACdD,GAAM;AAAoB;AACc,IAACE,QAAG,GAAAzB,aAAkB,CAAA0B,EAAA,CAAAC,OAAY;EAAA,IAEnFC,mBAAc;IACZ,YAAU;;IACZ,SAAAC,qBAAAC,OAAA;MACF,IAAAC,KAAA;MAEA7B,iBAA+B,OAAA2B,oBAAA;MAC/BP,gBAAmB,uBAAqB;MACzCA,gBAAA,uCAAAU,GAAA;MAEDV,gBAAQ,kBAAkB,YAAOW,EAAA;QACzBF,KAAA,CAAAG,SAAe,CAAAC,GAAA,CAAAF,EAAA;QACrB,OAAY,YAAQ;UACrBF,KAAA,CAAAG,SAAA,CAAAE,MAAA,CAAAH,EAAA;QAQD;MAEM;MACA,KAAAI,OAAA,GAASP,OAAA;IAEf;IACEZ,aAAA,CAAAW,oBAAA,GACA;MACAZ,GAAA,OAAgB;MAChBO,KAAA,WAAcc,IAAAC,IAAA;QACf,KAAAF,OAAA,GAAAE,IAAA;QAEG,IAAAC,yBAAA;UAAAC,iBAAA;UAAAC,cAAA;QACA;UAEJ,SAAAC,SAAW,OAAM,CAAAT,SAAA,CAAAU,MAAA,CAAAC,QAAA,KAAAC,KAAA,IAAAN,yBAAA,IAAAM,KAAA,GAAAH,SAAA,CAAAJ,IAAA,IAAAQ,IAAA,GAAAP,yBAAA;YACN,IAAAP,EAAA,GAAUa,KAAA,CAAAtB,KAAS;YAChBS,EAAA;UACL;QACA,SAASe,GAAA,EAAK;UACdP,iBAAc,GAAQ;UACtBC,cAAc,GAAAM,GAAQ;QAC9B;UAED;YACY,KAAAR,yBAAU,IAAMG,SAAS,CAAAM,MAAA;cACpCN,SAAA,CAAAM,MAAA;YAED;UACE,CAAO;YACD,IAAAR,iBAAI;cACF,MAAAC,cAAA;YACJ;UAAC;QAAA;MAAA;IACU,EACT;IACI,OAEJb,oBAAA;EAAQ;EAAA,IACVqB,QAAA,YAAAC,UAAA;IACF;;IACAjD,iBAAc,KAAQ,EAAAiD,SAAA;IACvB7B,gBAAA;IACDA,gBAAgB,mBAAe;MACjC8B,KAAA,MAAAxB,mBAAA;QAEAyB,IAAA;MACE,EAAM;MACJC,OAAA,EAAAtD,aAAA,CAAA0B,EAAA,CAAA6B,EAAA,oBACA;IACA;IACAjC,gBAAc,iBAAAtB,aAAA,CAAA0B,EAAA,CAAA6B,EAAA;MACf;QACKC,MAAA,EAAQ;MAEd;IACA;IACElC,gBAAM,gBAAAtB,aAAA,CAAA0B,EAAA,CAAA6B,EAAA;IAAAjC,gBACJ,cAAAtB,aAAA,CAAA0B,EAAA,CAAA6B,EAAA;MAAA,OAAC;IAAgB;IAAhBjC,gBACU,kBAAAtB,aAAA,CAAA0B,EAAA,CAAA6B,EAAA;MAAA,OACT;QAAOE,OAEP,WAAAA,QAAA,GAAQ;QACVC,QAAA,EAAAC,OAAA,CAAAC,OAAA;MACF;IACA;IACDC,SAAA,CAAAC,IAAA;EAED;EACD,IAAAD,SAAA;EAAA,OAED;IACEX,QAAM;IAENtB,mBAAc;IAEdiC;EACA;AACF,CAAC;AAAA7D,aAED,CAAA0B,EAAA,CAAAqC,IAAA,iBAAK,kBAAAC,cAAA;EACH,IAAAC,MAAM,SAAAD,cAAc;EACpB,OAAM;IACN,GAAAC,MAAM;IACJC,IAAI,EAAAzC,QAAO,CAAAyB;EACb,CAAC;AACD;AAEAiB,UAAA,CAAAC,wBAAU,OAAY;AACpB,IAAAC,SAAS,OAAAxE,WAAiB,CAAAyE,KAAM,QAAM,EAAAC,OAAA;EACtCC,EAAA,MAAM3E,WAAQ,CAAA4E,MAAQ;EACxBC,IAAC,MAAA7E,WAAA,CAAA4E,MAAA;AAED,GAAAE,UAAA;AACA,IAAAC,MAAA,GAAM,IAAA/E,WAAA,CAAAgF,YAAI,EAAY;EACpBC,MAAA,EAAM,CACPT,SAAA;AAED;AAA8B,IAC5BU,MAAM,OAAA9E,uBAAA,CAAA+E,gBAAA;EAAAJ,MACN;EAAWK,MACX;EACFC,cAAC;EACDC,YAAI;AACN,CAAC;AAAA,IAEDC,SAAA;AACE,IAAAC,IAAM;AACN,IAAArF,aAAY,CAAAsF,UAAO,cAAmB;EACpC7D,QAAI,CAAAoC,SAAO,CAAAnD,MAAY;EACzB0E,SAAC,GAAAG,QAAA,CAAAC,aAAA;EACDH,IAAA,GAAM;EAEN,OAAAE,QAAM,CAAAb,IAAA,CAAAe,OAAI,CAAAC,SAAA;EACR,OAAAH,QAAS,CAAAb,IAAA,CAAAe,OAAiB,CAAAE,aAAI;EAAA,OAC5BJ,QAAM,CAAAb,IAAA,CAAAe,OAAA,CAAAG,UAAA;AAAA;AACE,IACV5F,aAAC,CAAA6F,SAAA;EACD,IAAAR,IAAM,MAAAvF,YAAgB,CAAAgG,GAAA;IACvB,OAAAT,IAAA,aAAAA,IAAA,uBAAAA,IAAA,CAAAU,OAAA;EAGD;AACA;AAEA,eAAAC,MAAA;EACA,IAAIC,UAAA,GAAAC,SAAA,CAAAxF,MAAA,QAAAwF,SAAA,iBAAAA,SAAA;IAAAC,MAAA,GAAAD,SAAA,CAAAxF,MAAA,QAAAwF,SAAA,iBAAAA,SAAA;EACLb,IAAA,OAAAtF,aAAA,CAAAqG,UAAA,EAAAhB,SAAA;EAAA,MAED,IAAAtF,YAAK,CAAAgG,GAAA;IACHT,IAAM,
|
|
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
|
|
343
|
-
|
|
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
|
|
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 === "
|
|
759
|
-
|
|
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
|
-
|
|
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")
|
|
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,
|