on-zero 0.6.6 → 0.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/helpers/createMutators.cjs +7 -2
- package/dist/cjs/helpers/createMutators.native.js +7 -2
- package/dist/cjs/helpers/createMutators.native.js.map +1 -1
- package/dist/cjs/helpers/createMutators.test.cjs +43 -0
- package/dist/cjs/helpers/createMutators.test.native.js +46 -0
- package/dist/cjs/helpers/createMutators.test.native.js.map +1 -0
- package/dist/cjs/httpPull/completeAck.test.cjs +69 -0
- package/dist/cjs/httpPull/completeAck.test.native.js +76 -0
- package/dist/cjs/httpPull/completeAck.test.native.js.map +1 -0
- package/dist/cjs/httpPull/transport.test.cjs +177 -1
- package/dist/cjs/httpPull/transport.test.native.js +192 -0
- package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
- package/dist/cjs/httpPullTransport.cjs +138 -12
- package/dist/cjs/httpPullTransport.native.js +173 -13
- package/dist/cjs/httpPullTransport.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.mjs +7 -2
- package/dist/esm/helpers/createMutators.mjs.map +1 -1
- package/dist/esm/helpers/createMutators.native.js +7 -2
- package/dist/esm/helpers/createMutators.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.test.mjs +44 -0
- package/dist/esm/helpers/createMutators.test.mjs.map +1 -0
- package/dist/esm/helpers/createMutators.test.native.js +44 -0
- package/dist/esm/helpers/createMutators.test.native.js.map +1 -0
- package/dist/esm/httpPull/completeAck.test.mjs +70 -0
- package/dist/esm/httpPull/completeAck.test.mjs.map +1 -0
- package/dist/esm/httpPull/completeAck.test.native.js +74 -0
- package/dist/esm/httpPull/completeAck.test.native.js.map +1 -0
- package/dist/esm/httpPull/transport.test.mjs +176 -0
- package/dist/esm/httpPull/transport.test.mjs.map +1 -1
- package/dist/esm/httpPull/transport.test.native.js +192 -0
- package/dist/esm/httpPull/transport.test.native.js.map +1 -1
- package/dist/esm/httpPullTransport.mjs +138 -12
- package/dist/esm/httpPullTransport.mjs.map +1 -1
- package/dist/esm/httpPullTransport.native.js +173 -13
- package/dist/esm/httpPullTransport.native.js.map +1 -1
- package/package.json +2 -2
- package/src/helpers/createMutators.test.ts +51 -0
- package/src/helpers/createMutators.ts +7 -2
- package/src/httpPull/completeAck.test.ts +80 -0
- package/src/httpPull/transport.test.ts +134 -0
- package/src/httpPullTransport.ts +198 -13
- package/types/helpers/createMutators.d.ts.map +1 -1
- package/types/helpers/createMutators.test.d.ts +2 -0
- package/types/helpers/createMutators.test.d.ts.map +1 -0
- package/types/httpPull/completeAck.test.d.ts +2 -0
- package/types/httpPull/completeAck.test.d.ts.map +1 -0
- package/types/httpPullTransport.d.ts +4 -0
- package/types/httpPullTransport.d.ts.map +1 -1
|
@@ -147,6 +147,7 @@ function installHttpPullTransport(opts) {
|
|
|
147
147
|
if (!fetchImpl) {
|
|
148
148
|
throw new Error("installHttpPullTransport requires a fetch implementation");
|
|
149
149
|
}
|
|
150
|
+
var _opts_wake;
|
|
150
151
|
var state = {
|
|
151
152
|
origin: new URL(opts.origin),
|
|
152
153
|
originString: trimTrailingSlash(new URL(opts.origin).toString()),
|
|
@@ -157,6 +158,10 @@ function installHttpPullTransport(opts) {
|
|
|
157
158
|
nativeWebSocket: previousWebSocket,
|
|
158
159
|
sockets: /* @__PURE__ */new Set(),
|
|
159
160
|
pullIntervalMs: opts.pullIntervalMs,
|
|
161
|
+
wakeEnabled: (_opts_wake = opts.wake) !== null && _opts_wake !== void 0 ? _opts_wake : false,
|
|
162
|
+
queryTransform: opts.queryTransform,
|
|
163
|
+
queryForward: opts.queryForward === true,
|
|
164
|
+
queryAware: opts.queryTransform !== void 0 || opts.queryForward === true,
|
|
160
165
|
nextPokeID: 0,
|
|
161
166
|
transientFailureCount: 0
|
|
162
167
|
};
|
|
@@ -220,12 +225,18 @@ var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
|
220
225
|
_define_property(this, "wsid", void 0);
|
|
221
226
|
_define_property(this, "cookie", void 0);
|
|
222
227
|
_define_property(this, "pendingGotQueriesPatch", void 0);
|
|
228
|
+
_define_property(this, "desiredQueryPatch", void 0);
|
|
229
|
+
_define_property(this, "queryVersion", void 0);
|
|
230
|
+
_define_property(this, "sentQueryVersion", void 0);
|
|
231
|
+
_define_property(this, "sentQueryPatchLen", void 0);
|
|
223
232
|
_define_property(this, "pullInFlight", void 0);
|
|
224
233
|
_define_property(this, "pullAfterCurrent", void 0);
|
|
225
234
|
_define_property(this, "pushChain", void 0);
|
|
226
235
|
_define_property(this, "nextLocalCookieID", void 0);
|
|
227
236
|
_define_property(this, "openTimer", void 0);
|
|
228
237
|
_define_property(this, "pullTimer", void 0);
|
|
238
|
+
_define_property(this, "wakeSocket", void 0);
|
|
239
|
+
_define_property(this, "wakeReconnectTimer", void 0);
|
|
229
240
|
this.state = state;
|
|
230
241
|
this.CONNECTING = 0;
|
|
231
242
|
this.OPEN = 1;
|
|
@@ -239,6 +250,9 @@ var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
|
239
250
|
error: /* @__PURE__ */new Set()
|
|
240
251
|
};
|
|
241
252
|
this.pendingGotQueriesPatch = [];
|
|
253
|
+
this.desiredQueryPatch = [];
|
|
254
|
+
this.queryVersion = 0;
|
|
255
|
+
this.sentQueryPatchLen = 0;
|
|
242
256
|
this.pullAfterCurrent = false;
|
|
243
257
|
this.pushChain = Promise.resolve();
|
|
244
258
|
this.connectURL = toHttpURL(url);
|
|
@@ -319,6 +333,7 @@ var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
|
319
333
|
if (this.readyState === this.CLOSED) return;
|
|
320
334
|
if (this.openTimer) clearTimeout(this.openTimer);
|
|
321
335
|
if (this.pullTimer) clearInterval(this.pullTimer);
|
|
336
|
+
this.closeWakeChannel();
|
|
322
337
|
this.readyState = this.CLOSED;
|
|
323
338
|
this.state.sockets.delete(this);
|
|
324
339
|
this.emit("close", {
|
|
@@ -333,7 +348,8 @@ var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
|
333
348
|
var _this = this;
|
|
334
349
|
if (this.readyState !== this.OPEN) return Promise.resolve();
|
|
335
350
|
if (this.pullInFlight) return this.pullInFlight;
|
|
336
|
-
this.pullInFlight = this.fetchPull(this.clientGroupID, this.cookie).then(function (response) {
|
|
351
|
+
this.pullInFlight = this.fetchPull(this.clientGroupID, this.cookie, true).then(function (response) {
|
|
352
|
+
if (_this.state.queryAware) _this.applyServerGotQueries(response);
|
|
337
353
|
if (response.unchanged) {
|
|
338
354
|
_this.emitGotQueriesPatch(response.cookie);
|
|
339
355
|
return;
|
|
@@ -369,13 +385,129 @@ var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
|
369
385
|
_this.run(_this.pull());
|
|
370
386
|
}, this.state.pullIntervalMs);
|
|
371
387
|
}
|
|
388
|
+
if (this.state.wakeEnabled) this.openWakeChannel();
|
|
389
|
+
}
|
|
390
|
+
}, {
|
|
391
|
+
key: "openWakeChannel",
|
|
392
|
+
value:
|
|
393
|
+
// notification-only wake channel: a real WebSocket to <origin>/wake that
|
|
394
|
+
// carries no data. any frame means "pull now", so a wake triggers an
|
|
395
|
+
// immediate (coalesced) pull — push-shaped propagation without waiting on
|
|
396
|
+
// the poll interval. advisory only: if it drops we reconnect, and the
|
|
397
|
+
// interval poll remains the safety net that guarantees convergence.
|
|
398
|
+
function openWakeChannel() {
|
|
399
|
+
var _this = this;
|
|
400
|
+
var Native = this.state.nativeWebSocket;
|
|
401
|
+
if (!Native || this.wakeSocket || this.readyState !== this.OPEN) return;
|
|
402
|
+
var wsBase = this.state.originString.replace(/^http/, "ws");
|
|
403
|
+
var url = `${wsBase}/wake?clientID=${encodeURIComponent(this.clientID)}`;
|
|
404
|
+
var socket;
|
|
405
|
+
try {
|
|
406
|
+
socket = new Native(url);
|
|
407
|
+
} catch (e) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
this.wakeSocket = socket;
|
|
411
|
+
var reconnect = function () {
|
|
412
|
+
if (_this.wakeSocket !== socket) return;
|
|
413
|
+
_this.wakeSocket = void 0;
|
|
414
|
+
if (_this.readyState !== _this.OPEN || _this.wakeReconnectTimer) return;
|
|
415
|
+
_this.wakeReconnectTimer = setTimeout(function () {
|
|
416
|
+
_this.wakeReconnectTimer = void 0;
|
|
417
|
+
_this.openWakeChannel();
|
|
418
|
+
}, 500);
|
|
419
|
+
};
|
|
420
|
+
socket.onmessage = function () {
|
|
421
|
+
return _this.requestPullAfterCurrent();
|
|
422
|
+
};
|
|
423
|
+
socket.onclose = reconnect;
|
|
424
|
+
socket.onerror = reconnect;
|
|
425
|
+
}
|
|
426
|
+
}, {
|
|
427
|
+
key: "closeWakeChannel",
|
|
428
|
+
value: function closeWakeChannel() {
|
|
429
|
+
if (this.wakeReconnectTimer) {
|
|
430
|
+
clearTimeout(this.wakeReconnectTimer);
|
|
431
|
+
this.wakeReconnectTimer = void 0;
|
|
432
|
+
}
|
|
433
|
+
var socket = this.wakeSocket;
|
|
434
|
+
this.wakeSocket = void 0;
|
|
435
|
+
if (socket) {
|
|
436
|
+
try {
|
|
437
|
+
socket.close();
|
|
438
|
+
} catch (e) {}
|
|
439
|
+
}
|
|
372
440
|
}
|
|
373
441
|
}, {
|
|
374
442
|
key: "queueDesiredQueries",
|
|
375
|
-
value:
|
|
443
|
+
value:
|
|
444
|
+
// best effort: an already-closing wake socket is harmless
|
|
445
|
+
function queueDesiredQueries(body) {
|
|
376
446
|
var desiredQueriesPatch = body === null || body === void 0 ? void 0 : body.desiredQueriesPatch;
|
|
377
447
|
if (!Array.isArray(desiredQueriesPatch)) return;
|
|
378
|
-
this.
|
|
448
|
+
if (!this.state.queryAware) {
|
|
449
|
+
this.pendingGotQueriesPatch.push(...gotQueriesPatch(desiredQueriesPatch));
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
var transform = this.state.queryTransform;
|
|
453
|
+
var _iteratorNormalCompletion = true,
|
|
454
|
+
_didIteratorError = false,
|
|
455
|
+
_iteratorError = void 0;
|
|
456
|
+
try {
|
|
457
|
+
for (var _iterator = desiredQueriesPatch[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
458
|
+
var op = _step.value;
|
|
459
|
+
if (op.op === "clear") {
|
|
460
|
+
this.desiredQueryPatch.push({
|
|
461
|
+
op: "clear"
|
|
462
|
+
});
|
|
463
|
+
} else if (op.op === "del") {
|
|
464
|
+
this.desiredQueryPatch.push({
|
|
465
|
+
op: "del",
|
|
466
|
+
hash: op.hash
|
|
467
|
+
});
|
|
468
|
+
} else if (op.op === "put") {
|
|
469
|
+
var inline = op.ast;
|
|
470
|
+
var _op_name;
|
|
471
|
+
var name = (_op_name = op.name) !== null && _op_name !== void 0 ? _op_name : "";
|
|
472
|
+
var _op_args;
|
|
473
|
+
var args = (_op_args = op.args) !== null && _op_args !== void 0 ? _op_args : [];
|
|
474
|
+
if (this.state.queryForward) {
|
|
475
|
+
this.desiredQueryPatch.push({
|
|
476
|
+
op: "put",
|
|
477
|
+
hash: op.hash,
|
|
478
|
+
name,
|
|
479
|
+
args
|
|
480
|
+
});
|
|
481
|
+
} else if (inline !== void 0) {
|
|
482
|
+
this.desiredQueryPatch.push({
|
|
483
|
+
op: "put",
|
|
484
|
+
hash: op.hash,
|
|
485
|
+
ast: inline
|
|
486
|
+
});
|
|
487
|
+
} else if (transform) {
|
|
488
|
+
this.desiredQueryPatch.push({
|
|
489
|
+
op: "put",
|
|
490
|
+
hash: op.hash,
|
|
491
|
+
ast: transform(name, args)
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
} catch (err) {
|
|
497
|
+
_didIteratorError = true;
|
|
498
|
+
_iteratorError = err;
|
|
499
|
+
} finally {
|
|
500
|
+
try {
|
|
501
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
502
|
+
_iterator.return();
|
|
503
|
+
}
|
|
504
|
+
} finally {
|
|
505
|
+
if (_didIteratorError) {
|
|
506
|
+
throw _iteratorError;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
this.queryVersion++;
|
|
379
511
|
}
|
|
380
512
|
}, {
|
|
381
513
|
key: "push",
|
|
@@ -404,10 +536,26 @@ var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
|
404
536
|
}
|
|
405
537
|
this.run(this.pull());
|
|
406
538
|
}
|
|
539
|
+
}, {
|
|
540
|
+
key: "applyServerGotQueries",
|
|
541
|
+
value:
|
|
542
|
+
// in query-aware mode the got-query ack is authoritative from the server:
|
|
543
|
+
// take the server's gotQueries.patch as the got patch to emit (replacing
|
|
544
|
+
// local synthesis), and clear the acked prefix of the shipped desired delta
|
|
545
|
+
// once the server acks that version (the ack never leads its row effects —
|
|
546
|
+
// invariant 13 — so the client marks a query got only after its rows land).
|
|
547
|
+
function applyServerGotQueries(response) {
|
|
548
|
+
var got = response.gotQueries;
|
|
549
|
+
this.pendingGotQueriesPatch = got ? got.patch : [];
|
|
550
|
+
if (got && this.sentQueryVersion !== void 0 && got.version >= this.sentQueryVersion) {
|
|
551
|
+
this.desiredQueryPatch.splice(0, this.sentQueryPatchLen);
|
|
552
|
+
this.sentQueryVersion = void 0;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
407
555
|
}, {
|
|
408
556
|
key: "answerMutationRecoveryPull",
|
|
409
557
|
value: async function answerMutationRecoveryPull(body) {
|
|
410
|
-
var response = await this.fetchPull(body.clientGroupID, body.cookie);
|
|
558
|
+
var response = await this.fetchPull(body.clientGroupID, body.cookie, false);
|
|
411
559
|
var cookie = toWebSocketCookie(response.cookie);
|
|
412
560
|
var _ref;
|
|
413
561
|
this.emitMessage(["pull", {
|
|
@@ -418,12 +566,23 @@ var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
|
418
566
|
}
|
|
419
567
|
}, {
|
|
420
568
|
key: "fetchPull",
|
|
421
|
-
value: async function fetchPull(clientGroupID, cookie) {
|
|
422
|
-
|
|
569
|
+
value: async function fetchPull(clientGroupID, cookie, includeQueries) {
|
|
570
|
+
var body = {
|
|
423
571
|
clientID: this.clientID,
|
|
424
572
|
clientGroupID,
|
|
425
573
|
cookie: toHttpCookie(cookie)
|
|
426
|
-
}
|
|
574
|
+
};
|
|
575
|
+
if (includeQueries && this.state.queryAware && this.desiredQueryPatch.length > 0) {
|
|
576
|
+
this.sentQueryVersion = this.queryVersion;
|
|
577
|
+
this.sentQueryPatchLen = this.desiredQueryPatch.length;
|
|
578
|
+
body.queries = {
|
|
579
|
+
version: this.queryVersion,
|
|
580
|
+
patch: [...this.desiredQueryPatch]
|
|
581
|
+
};
|
|
582
|
+
} else {
|
|
583
|
+
this.sentQueryVersion = void 0;
|
|
584
|
+
}
|
|
585
|
+
return await this.postJSON("/pull", body);
|
|
427
586
|
}
|
|
428
587
|
}, {
|
|
429
588
|
key: "postJSON",
|
|
@@ -481,9 +640,14 @@ var ZeroHttpSocket = /* @__PURE__ */function () {
|
|
|
481
640
|
}, {
|
|
482
641
|
key: "emitPoke",
|
|
483
642
|
value: function emitPoke(response) {
|
|
484
|
-
var
|
|
485
|
-
|
|
643
|
+
var currentServer = toHttpCookie(this.cookie);
|
|
644
|
+
var nextCookie;
|
|
645
|
+
if (currentServer !== null && response.cookie < currentServer) {
|
|
486
646
|
throw new Error(`zero-http pull returned stale cookie ${response.cookie} for ${this.cookie}`);
|
|
647
|
+
} else if (currentServer !== null && response.cookie === currentServer) {
|
|
648
|
+
nextCookie = toLocalWebSocketCookie(response.cookie, ++this.nextLocalCookieID);
|
|
649
|
+
} else {
|
|
650
|
+
nextCookie = toWebSocketCookie(response.cookie);
|
|
487
651
|
}
|
|
488
652
|
var pokeID = `zero-http-${++this.state.nextPokeID}`;
|
|
489
653
|
var gotQueries = this.pendingGotQueriesPatch;
|
|
@@ -658,10 +822,6 @@ function toWebSocketCookie(cookie) {
|
|
|
658
822
|
function toLocalWebSocketCookie(cookie, localID) {
|
|
659
823
|
return `${String(cookie).padStart(COOKIE_WIDTH, "0")}#${String(localID).padStart(6, "0")}`;
|
|
660
824
|
}
|
|
661
|
-
function isStaleCookie(current, next) {
|
|
662
|
-
var currentNumber = toHttpCookie(current);
|
|
663
|
-
return currentNumber !== null && next <= currentNumber;
|
|
664
|
-
}
|
|
665
825
|
function errorMessage(error) {
|
|
666
826
|
return _instanceof(error, Error) ? error.message : String(error);
|
|
667
827
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_assert_this_initialized","self","ReferenceError","_call_super","_this","derived","args","_get_prototype_of","_possible_constructor_return","_is_native_reflect_construct","Reflect","construct","constructor","apply","_class_call_check","instance","Constructor","TypeError","_construct","Parent","Class","Parent2","args2","Class2","a","push","Function","bind","_set_prototype_of","prototype","arguments","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","_define_property","obj","value","o","setPrototypeOf","getPrototypeOf","o2","__proto__","_inherits","subClass","superClass","create","_instanceof","left","right","Symbol","hasInstance","_is_native_function","fn","toString","call","indexOf","_type_of","p","p2","_wrap_native_super","_cache","Map","wrapNativeSuper","has","get","set","Wrapper","result","Boolean","valueOf","_","COOKIE_WIDTH","TRANSIENT_RECONNECT_BACKOFF_BASE_MS","TRANSIENT_RECONNECT_BACKOFF_MAX_MS","installHttpPullTransport","opts","_class","previousWebSocket","globalThis","WebSocket","_opts_fetch","fetchImpl","fetch","Error","state","origin","URL","originString","trimTrailingSlash","nativeWebSocket","sockets","Set","pullIntervalMs","nextPokeID","transientFailureCount","Shim","_class2","url","protocols","shouldIntercept","ZeroHttpSocket","String","pull","Promise","all","map","socket","connections","size","uninstall","transportsByOrigin","ensureHttpPullTransport","existing","transport","ZeroHttpSocket2","_this_cookie","_decoded_initConnectionMessage","CONNECTING","OPEN","CLOSING","CLOSED","readyState","listeners","open","message","close","error","pendingGotQueriesPatch","pullAfterCurrent","pushChain","resolve","connectURL","toHttpURL","_this_connectURL_searchParams_get","clientID","searchParams","_this_connectURL_searchParams_get1","clientGroupID","_this_connectURL_searchParams_get2","wsid","Date","now","baseCookie","cookie","suffixMatch","match","nextLocalCookieID","Number","decoded","decodeSecProtocol","authToken","queueDesiredQueries","initConnectionMessage","add","openTimer","setTimeout","reconnectDelayMs","addEventListener","type","listener","_this_listeners_type","removeEventListener","delete","dispatchEvent","event","emit","send","data","JSON","parse","requestPullAfterCurrent","auth","enqueuePush","emitMessage","run","answerMutationRecoveryPull","code","reason","clearTimeout","pullTimer","clearInterval","wasClean","pullInFlight","fetchPull","then","response","unchanged","emitGotQueriesPatch","emitPoke","catch","fail","finally","pullAgain","timestamp","setInterval","body","desiredQueriesPatch","Array","isArray","gotQueriesPatch","postJSON","filterMutationResultsToClient","pushResponse","nextPush","toWebSocketCookie","_ref","requestID","lastMutationIDChanges","toHttpCookie","path","method","headers","authorization","stringify","ok","ZeroHttpResponseError","status","resetTransientFailures"],"sources":["../../src/httpPullTransport.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_assert_this_initialized","self","ReferenceError","_call_super","_this","derived","args","_get_prototype_of","_possible_constructor_return","_is_native_reflect_construct","Reflect","construct","constructor","apply","_class_call_check","instance","Constructor","TypeError","_construct","Parent","Class","Parent2","args2","Class2","a","push","Function","bind","_set_prototype_of","prototype","arguments","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","_define_property","obj","value","o","setPrototypeOf","getPrototypeOf","o2","__proto__","_inherits","subClass","superClass","create","_instanceof","left","right","Symbol","hasInstance","_is_native_function","fn","toString","call","indexOf","_type_of","p","p2","_wrap_native_super","_cache","Map","wrapNativeSuper","has","get","set","Wrapper","result","Boolean","valueOf","_","COOKIE_WIDTH","TRANSIENT_RECONNECT_BACKOFF_BASE_MS","TRANSIENT_RECONNECT_BACKOFF_MAX_MS","installHttpPullTransport","opts","_class","previousWebSocket","globalThis","WebSocket","_opts_fetch","fetchImpl","fetch","Error","_opts_wake","state","origin","URL","originString","trimTrailingSlash","nativeWebSocket","sockets","Set","pullIntervalMs","wakeEnabled","wake","queryTransform","queryForward","queryAware","nextPokeID","transientFailureCount","Shim","_class2","url","protocols","shouldIntercept","ZeroHttpSocket","String","pull","Promise","all","map","socket","connections","size","uninstall","transportsByOrigin","ensureHttpPullTransport","existing","transport","ZeroHttpSocket2","_this_cookie","_decoded_initConnectionMessage","CONNECTING","OPEN","CLOSING","CLOSED","readyState","listeners","open","message","close","error","pendingGotQueriesPatch","desiredQueryPatch","queryVersion","sentQueryPatchLen","pullAfterCurrent","pushChain","resolve","connectURL","toHttpURL","_this_connectURL_searchParams_get","clientID","searchParams","_this_connectURL_searchParams_get1","clientGroupID","_this_connectURL_searchParams_get2","wsid","Date","now","baseCookie","cookie","suffixMatch","match","nextLocalCookieID","Number","decoded","decodeSecProtocol","authToken","queueDesiredQueries","initConnectionMessage","add","openTimer","setTimeout","reconnectDelayMs","addEventListener","type","listener","_this_listeners_type","removeEventListener","delete","dispatchEvent","event","emit","send","data","JSON","parse","requestPullAfterCurrent","auth","enqueuePush","emitMessage","run","answerMutationRecoveryPull","code","reason","clearTimeout","pullTimer","clearInterval","closeWakeChannel","wasClean","pullInFlight","fetchPull","then","response","applyServerGotQueries","unchanged","emitGotQueriesPatch","emitPoke","catch","fail","finally","pullAgain","timestamp","setInterval","openWakeChannel","Native","wakeSocket","wsBase","replace","encodeURIComponent","e","reconnect","wakeReconnectTimer","onmessage","onclose","onerror","body","desiredQueriesPatch","Array","isArray","gotQueriesPatch","transform","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","iterator","_step","next","done","op","hash","inline","ast","_op_name","name","_op_args","err","return","postJSON","filterMutationResultsToClient","pushResponse","nextPush","got","gotQueries","patch","sentQueryVersion","version","splice"],"sources":["../../src/httpPullTransport.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "on-zero",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.8",
|
|
4
4
|
"description": "A typed layer over @rocicorp/zero with queries, mutations, and permissions",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
}
|
|
84
84
|
},
|
|
85
85
|
"dependencies": {
|
|
86
|
-
"@take-out/helpers": "0.6.
|
|
86
|
+
"@take-out/helpers": "0.6.8",
|
|
87
87
|
"chokidar": "^4.0.3",
|
|
88
88
|
"citty": "^0.1.6",
|
|
89
89
|
"valibot": "^1.1.0"
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test, vi } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { createMutators } from './createMutators'
|
|
4
|
+
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
vi.useRealTimers()
|
|
7
|
+
})
|
|
8
|
+
|
|
9
|
+
describe('createMutators timeout guard', () => {
|
|
10
|
+
test('releases the timeout when a mutation succeeds', async () => {
|
|
11
|
+
vi.useFakeTimers()
|
|
12
|
+
const mutators = createMutators({
|
|
13
|
+
environment: 'server',
|
|
14
|
+
authData: null,
|
|
15
|
+
can: {} as never,
|
|
16
|
+
models: {
|
|
17
|
+
task: {
|
|
18
|
+
mutate: {
|
|
19
|
+
create: async () => {},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
} as never,
|
|
23
|
+
}) as any
|
|
24
|
+
|
|
25
|
+
await mutators.task.create({}, {})
|
|
26
|
+
|
|
27
|
+
expect(vi.getTimerCount()).toBe(0)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
test('releases the timeout when a mutation fails', async () => {
|
|
31
|
+
vi.useFakeTimers()
|
|
32
|
+
const mutators = createMutators({
|
|
33
|
+
environment: 'server',
|
|
34
|
+
authData: null,
|
|
35
|
+
can: {} as never,
|
|
36
|
+
models: {
|
|
37
|
+
task: {
|
|
38
|
+
mutate: {
|
|
39
|
+
create: async () => {
|
|
40
|
+
throw new Error('nope')
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
} as never,
|
|
45
|
+
}) as any
|
|
46
|
+
|
|
47
|
+
await expect(mutators.task.create({}, {})).rejects.toThrow('nope')
|
|
48
|
+
|
|
49
|
+
expect(vi.getTimerCount()).toBe(0)
|
|
50
|
+
})
|
|
51
|
+
})
|
|
@@ -131,13 +131,18 @@ export function createMutators<Models extends GenericModels>({
|
|
|
131
131
|
timeoutMs: number = time.ms.minutes(1),
|
|
132
132
|
) {
|
|
133
133
|
return async (...args: Args): Promise<void> => {
|
|
134
|
+
let timeoutId: ReturnType<typeof setTimeout> | undefined
|
|
134
135
|
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
135
|
-
setTimeout(() => {
|
|
136
|
+
timeoutId = setTimeout(() => {
|
|
136
137
|
reject(new Error(`[mutator] ${name} timeout after ${timeoutMs}ms`))
|
|
137
138
|
}, timeoutMs)
|
|
138
139
|
})
|
|
139
140
|
|
|
140
|
-
|
|
141
|
+
try {
|
|
142
|
+
return await Promise.race([fn(...args), timeoutPromise])
|
|
143
|
+
} finally {
|
|
144
|
+
if (timeoutId !== undefined) clearTimeout(timeoutId)
|
|
145
|
+
}
|
|
141
146
|
}
|
|
142
147
|
}
|
|
143
148
|
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { afterEach, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
eventually,
|
|
5
|
+
startZeroHttpHarness,
|
|
6
|
+
waitForComplete,
|
|
7
|
+
type ZeroHttpHarness,
|
|
8
|
+
} from './testHarness'
|
|
9
|
+
|
|
10
|
+
// repro for the soot `sb read-state` hang (2026-07-10): named-query `complete`
|
|
11
|
+
// never resolves for queries that were already desired when the socket
|
|
12
|
+
// (re)connects, while queries desired after connect ack fine. these tests pin
|
|
13
|
+
// the got-ack contract across the transport's reconnect path.
|
|
14
|
+
|
|
15
|
+
let harness: ZeroHttpHarness | undefined
|
|
16
|
+
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await harness?.close()
|
|
19
|
+
harness = undefined
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
test('query desired before first connect reaches complete', async () => {
|
|
23
|
+
harness = await startZeroHttpHarness({
|
|
24
|
+
seed: { user: [{ id: 'u1', name: 'ada' }] },
|
|
25
|
+
})
|
|
26
|
+
const zero = harness.createZero('u1')
|
|
27
|
+
// materialize synchronously after construction so the desired query rides
|
|
28
|
+
// the initial connection handshake, not a later changeDesiredQueries.
|
|
29
|
+
const view = zero.query.user.materialize()
|
|
30
|
+
const rows = await waitForComplete<any[]>(view)
|
|
31
|
+
expect(rows).toEqual([{ id: 'u1', name: 'ada' }])
|
|
32
|
+
view.destroy()
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test('existing + new queries reach complete again after a transport drop', async () => {
|
|
36
|
+
let failNextPull = false
|
|
37
|
+
harness = await startZeroHttpHarness({
|
|
38
|
+
seed: {
|
|
39
|
+
user: [{ id: 'u1', name: 'ada' }],
|
|
40
|
+
project: [{ id: 'p1', ownerId: 'u1', name: 'first' }],
|
|
41
|
+
},
|
|
42
|
+
interceptFetch: (next) => (input, init) => {
|
|
43
|
+
const url = String(input)
|
|
44
|
+
if (failNextPull && url.endsWith('/pull')) {
|
|
45
|
+
failNextPull = false
|
|
46
|
+
return Promise.reject(new Error('injected transient pull failure'))
|
|
47
|
+
}
|
|
48
|
+
return next(input, init)
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
const zero = harness.createZero('u1')
|
|
52
|
+
|
|
53
|
+
const userView = zero.query.user.materialize()
|
|
54
|
+
await waitForComplete<any[]>(userView)
|
|
55
|
+
|
|
56
|
+
// drop the socket: a failed pull closes it (1011) and zero reconnects with
|
|
57
|
+
// every currently-desired query in the connection handshake.
|
|
58
|
+
failNextPull = true
|
|
59
|
+
await harness.transport.pull().catch(() => {})
|
|
60
|
+
|
|
61
|
+
// wait until sync is live again (a write round-trips).
|
|
62
|
+
const mutation = zero.mutate.project.create({ id: 'p2', ownerId: 'u1', name: 'second' })
|
|
63
|
+
await mutation.client
|
|
64
|
+
await mutation.server.catch(() => {})
|
|
65
|
+
|
|
66
|
+
// the already-desired query must be able to reach complete again on the new
|
|
67
|
+
// socket (this is what sb read-state does: re-run an already-subscribed
|
|
68
|
+
// named query with {type:'complete'}).
|
|
69
|
+
const userAgain = zero.query.user.materialize()
|
|
70
|
+
await waitForComplete<any[]>(userAgain)
|
|
71
|
+
|
|
72
|
+
// and a query desired only after the reconnect must too.
|
|
73
|
+
const projectView = zero.query.project.materialize()
|
|
74
|
+
const projects = await waitForComplete<any[]>(projectView)
|
|
75
|
+
expect(projects.map((p: any) => p.id).sort()).toEqual(['p1', 'p2'])
|
|
76
|
+
|
|
77
|
+
userView.destroy()
|
|
78
|
+
userAgain.destroy()
|
|
79
|
+
projectView.destroy()
|
|
80
|
+
})
|
|
@@ -662,3 +662,137 @@ function defer<T>() {
|
|
|
662
662
|
})
|
|
663
663
|
return { promise, resolve, reject }
|
|
664
664
|
}
|
|
665
|
+
|
|
666
|
+
// installs the transport with the query-aware extension on (a queryTransform
|
|
667
|
+
// resolver), pushing it for afterEach cleanup.
|
|
668
|
+
function installWithQueries(
|
|
669
|
+
fetch: typeof globalThis.fetch,
|
|
670
|
+
queryTransform: (name: string, args: readonly unknown[]) => unknown,
|
|
671
|
+
) {
|
|
672
|
+
const transport = installHttpPullTransport({ origin: ORIGIN, fetch, queryTransform })
|
|
673
|
+
transports.push(transport)
|
|
674
|
+
return transport
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
describe('zero-http query-aware extension', () => {
|
|
678
|
+
test('ships desired queries with pull state (transformed AST) and emits server got-query ack', async () => {
|
|
679
|
+
const requests: RequestRecord[] = []
|
|
680
|
+
const fetch = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
681
|
+
const request = recordRequest(input, init)
|
|
682
|
+
requests.push(request)
|
|
683
|
+
return jsonResponse({
|
|
684
|
+
cookie: 1,
|
|
685
|
+
lastMutationIDChanges: {},
|
|
686
|
+
rowsPatch: [{ op: 'clear' }],
|
|
687
|
+
gotQueries: { version: 1, patch: [{ op: 'put', hash: 'h1' }] },
|
|
688
|
+
})
|
|
689
|
+
})
|
|
690
|
+
installWithQueries(fetch, (name, args) => ({ resolved: name, args }))
|
|
691
|
+
|
|
692
|
+
const { messages } = openRawSocketWithMessages({
|
|
693
|
+
desiredQueriesPatch: [
|
|
694
|
+
{ op: 'put', hash: 'h1', name: 'byOwner', args: [{ ownerId: 'u1' }] },
|
|
695
|
+
],
|
|
696
|
+
})
|
|
697
|
+
|
|
698
|
+
await eventually(() => expect(requests.length).toBeGreaterThan(0))
|
|
699
|
+
// the pull body ships {queries:{version, patch:[{op:'put',hash,ast}]}} with
|
|
700
|
+
// name+args resolved to the AST by the transform
|
|
701
|
+
expect(requests[0].body.queries).toEqual({
|
|
702
|
+
version: 1,
|
|
703
|
+
patch: [
|
|
704
|
+
{
|
|
705
|
+
op: 'put',
|
|
706
|
+
hash: 'h1',
|
|
707
|
+
ast: { resolved: 'byOwner', args: [{ ownerId: 'u1' }] },
|
|
708
|
+
},
|
|
709
|
+
],
|
|
710
|
+
})
|
|
711
|
+
// the server's got-query ack is emitted to the client (not synthesized)
|
|
712
|
+
await eventually(() => {
|
|
713
|
+
const poke = messages.find(
|
|
714
|
+
(m) => m[0] === 'pokePart' && Array.isArray(m[1].gotQueriesPatch),
|
|
715
|
+
)
|
|
716
|
+
expect(poke?.[1].gotQueriesPatch).toEqual([{ op: 'put', hash: 'h1' }])
|
|
717
|
+
})
|
|
718
|
+
})
|
|
719
|
+
|
|
720
|
+
test('an ad-hoc put with an inline ast ships that ast unchanged', async () => {
|
|
721
|
+
const requests: RequestRecord[] = []
|
|
722
|
+
const fetch = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
723
|
+
requests.push(recordRequest(input, init))
|
|
724
|
+
return jsonResponse({ cookie: 1, unchanged: true })
|
|
725
|
+
})
|
|
726
|
+
// a transform that would throw if called — an inline ast must bypass it
|
|
727
|
+
installWithQueries(fetch, () => {
|
|
728
|
+
throw new Error('transform should not run for an inline ast')
|
|
729
|
+
})
|
|
730
|
+
|
|
731
|
+
openRawSocketWithMessages({
|
|
732
|
+
desiredQueriesPatch: [{ op: 'put', hash: 'h2', ast: { inline: true } }],
|
|
733
|
+
})
|
|
734
|
+
|
|
735
|
+
await eventually(() => expect(requests.length).toBeGreaterThan(0))
|
|
736
|
+
expect(requests[0].body.queries.patch).toEqual([
|
|
737
|
+
{ op: 'put', hash: 'h2', ast: { inline: true } },
|
|
738
|
+
])
|
|
739
|
+
})
|
|
740
|
+
|
|
741
|
+
test('reconnect re-ships the desired set', async () => {
|
|
742
|
+
const requests: RequestRecord[] = []
|
|
743
|
+
const fetch = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
744
|
+
requests.push(recordRequest(input, init))
|
|
745
|
+
// never ack the query version, so the desire stays un-acked
|
|
746
|
+
return jsonResponse({ cookie: 1, unchanged: true })
|
|
747
|
+
})
|
|
748
|
+
installWithQueries(fetch, (name) => ({ resolved: name }))
|
|
749
|
+
|
|
750
|
+
const desired = [{ op: 'put', hash: 'h1', name: 'byOwner', args: [] }]
|
|
751
|
+
const first = openRawSocketWithMessages({ desiredQueriesPatch: desired })
|
|
752
|
+
await eventually(() => expect(requests.length).toBeGreaterThan(0))
|
|
753
|
+
first.socket.close()
|
|
754
|
+
|
|
755
|
+
const before = requests.length
|
|
756
|
+
openRawSocketWithMessages({ desiredQueriesPatch: desired })
|
|
757
|
+
await eventually(() => expect(requests.length).toBeGreaterThan(before))
|
|
758
|
+
// the reconnected socket re-ships the (still un-acked) desired query
|
|
759
|
+
const replay = requests[requests.length - 1].body.queries
|
|
760
|
+
expect(replay.patch).toEqual([
|
|
761
|
+
{ op: 'put', hash: 'h1', ast: { resolved: 'byOwner' } },
|
|
762
|
+
])
|
|
763
|
+
})
|
|
764
|
+
|
|
765
|
+
test('queryForward ships name+args for the server to resolve (no client transform)', async () => {
|
|
766
|
+
const requests: RequestRecord[] = []
|
|
767
|
+
const fetch = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => {
|
|
768
|
+
requests.push(recordRequest(input, init))
|
|
769
|
+
return jsonResponse({ cookie: 1, unchanged: true })
|
|
770
|
+
})
|
|
771
|
+
// queryForward on, no transform: the permission transform stays server-side
|
|
772
|
+
const transport = installHttpPullTransport({
|
|
773
|
+
origin: ORIGIN,
|
|
774
|
+
fetch,
|
|
775
|
+
queryForward: true,
|
|
776
|
+
})
|
|
777
|
+
transports.push(transport)
|
|
778
|
+
|
|
779
|
+
openRawSocketWithMessages({
|
|
780
|
+
desiredQueriesPatch: [
|
|
781
|
+
{
|
|
782
|
+
op: 'put',
|
|
783
|
+
hash: 'h3',
|
|
784
|
+
name: 'byOwner',
|
|
785
|
+
args: [{ ownerId: 'u1' }],
|
|
786
|
+
// Zero may include a locally evaluable AST on a named query put.
|
|
787
|
+
// queryForward must discard it so the server remains authoritative.
|
|
788
|
+
ast: { table: 'secret' },
|
|
789
|
+
},
|
|
790
|
+
],
|
|
791
|
+
})
|
|
792
|
+
|
|
793
|
+
await eventually(() => expect(requests.length).toBeGreaterThan(0))
|
|
794
|
+
expect(requests[0].body.queries.patch).toEqual([
|
|
795
|
+
{ op: 'put', hash: 'h3', name: 'byOwner', args: [{ ownerId: 'u1' }] },
|
|
796
|
+
])
|
|
797
|
+
})
|
|
798
|
+
})
|