@rocicorp/zero 0.24.2025090402 → 0.24.2025091200
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/out/{chunk-P6JME3HC.js → chunk-6XNI6IVJ.js} +233 -135
- package/out/chunk-6XNI6IVJ.js.map +7 -0
- package/out/chunk-ASRS2LFV.js +35 -0
- package/out/chunk-ASRS2LFV.js.map +7 -0
- package/out/{chunk-G442PJSB.js → chunk-K5ZSWG54.js} +343 -327
- package/out/chunk-K5ZSWG54.js.map +7 -0
- package/out/{chunk-4NLQ25GZ.js → chunk-KXV3BZ4U.js} +3 -3
- package/out/{inspector-4ALIZXAU.js → inspector-ZZSIUMBB.js} +36 -6
- package/out/inspector-ZZSIUMBB.js.map +7 -0
- package/out/react-native.js +276 -278
- package/out/react-native.js.map +4 -4
- package/out/react.js +98 -35
- package/out/react.js.map +2 -2
- package/out/replicache/src/connection-loop.d.ts.map +1 -1
- package/out/replicache/src/deleted-clients.d.ts +17 -10
- package/out/replicache/src/deleted-clients.d.ts.map +1 -1
- package/out/replicache/src/kv/expo-sqlite/store.d.ts +11 -0
- package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -0
- package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
- package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
- package/out/replicache/src/kv/op-sqlite/store.d.ts +14 -0
- package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -0
- package/out/replicache/src/kv/op-sqlite/types.d.ts +13 -0
- package/out/replicache/src/kv/op-sqlite/types.d.ts.map +1 -0
- package/out/replicache/src/kv/read-impl.d.ts.map +1 -1
- package/out/replicache/src/kv/sqlite-store.d.ts +37 -63
- package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
- package/out/replicache/src/kv/throw-if-closed.d.ts +12 -0
- package/out/replicache/src/kv/throw-if-closed.d.ts.map +1 -0
- package/out/replicache/src/kv/write-impl-base.d.ts.map +1 -1
- package/out/replicache/src/kv/write-impl.d.ts.map +1 -1
- package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
- package/out/replicache/src/persist/client-group-gc.d.ts +2 -3
- package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
- package/out/replicache/src/persist/clients.d.ts +2 -1
- package/out/replicache/src/persist/clients.d.ts.map +1 -1
- package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/solid.js +65 -20
- package/out/solid.js.map +3 -3
- package/out/zero/package.json +1 -1
- package/out/zero/src/zero-cache-dev.js +4 -0
- package/out/zero/src/zero-cache-dev.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/normalize.d.ts +1 -0
- package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
- package/out/zero-cache/src/config/normalize.js +6 -0
- package/out/zero-cache/src/config/normalize.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +11 -0
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +53 -1
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +1 -1
- package/out/zero-cache/src/custom-queries/transform-query.js +4 -0
- package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
- package/out/zero-cache/src/server/anonymous-otel-start.d.ts +1 -0
- package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +1 -1
- package/out/zero-cache/src/server/anonymous-otel-start.js +41 -2
- package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.d.ts +9 -0
- package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
- package/out/zero-cache/src/server/inspector-delegate.js +18 -0
- package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
- package/out/zero-cache/src/server/otel-diag-logger.d.ts +16 -0
- package/out/zero-cache/src/server/otel-diag-logger.d.ts.map +1 -0
- package/out/zero-cache/src/server/otel-diag-logger.js +76 -0
- package/out/zero-cache/src/server/otel-diag-logger.js.map +1 -0
- package/out/zero-cache/src/server/otel-start.d.ts.map +1 -1
- package/out/zero-cache/src/server/otel-start.js +13 -13
- package/out/zero-cache/src/server/otel-start.js.map +1 -1
- package/out/zero-cache/src/server/reaper.js +5 -1
- package/out/zero-cache/src/server/reaper.js.map +1 -1
- package/out/zero-cache/src/server/syncer.js +3 -3
- package/out/zero-cache/src/server/syncer.js.map +1 -1
- package/out/zero-cache/src/services/analyze.d.ts +1 -1
- package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
- package/out/zero-cache/src/services/analyze.js +6 -6
- package/out/zero-cache/src/services/analyze.js.map +1 -1
- package/out/zero-cache/src/services/heapz.d.ts +1 -1
- package/out/zero-cache/src/services/heapz.d.ts.map +1 -1
- package/out/zero-cache/src/services/heapz.js +2 -2
- package/out/zero-cache/src/services/heapz.js.map +1 -1
- package/out/zero-cache/src/services/mutagen/pusher.d.ts +12 -4
- package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
- package/out/zero-cache/src/services/statz.d.ts +1 -1
- package/out/zero-cache/src/services/statz.d.ts.map +1 -1
- package/out/zero-cache/src/services/statz.js +3 -3
- package/out/zero-cache/src/services/statz.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts +7 -1
- package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js +17 -8
- package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +0 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.js +6 -19
- package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts +0 -1
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +19 -8
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.js +30 -7
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-client/src/client/active-clients-manager.d.ts +2 -1
- package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/delete-clients-manager.d.ts +3 -3
- package/out/zero-client/src/client/delete-clients-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
- package/out/zero-client/src/client/query-manager.d.ts +2 -0
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +2 -2
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-protocol/src/down.d.ts +5 -0
- package/out/zero-protocol/src/down.d.ts.map +1 -1
- package/out/zero-protocol/src/inspect-down.d.ts +17 -0
- package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
- package/out/zero-protocol/src/inspect-down.js +5 -1
- package/out/zero-protocol/src/inspect-down.js.map +1 -1
- package/out/zero-protocol/src/inspect-up.d.ts +39 -10
- package/out/zero-protocol/src/inspect-up.d.ts.map +1 -1
- package/out/zero-protocol/src/inspect-up.js +10 -3
- package/out/zero-protocol/src/inspect-up.js.map +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts +1 -1
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js +2 -1
- package/out/zero-protocol/src/protocol-version.js.map +1 -1
- package/out/zero-protocol/src/up.d.ts +10 -1
- package/out/zero-protocol/src/up.d.ts.map +1 -1
- package/out/zero-react/src/use-query.d.ts +20 -3
- package/out/zero-react/src/use-query.d.ts.map +1 -1
- package/out/zero-react-native/src/mod.d.ts +2 -2
- package/out/zero-react-native/src/mod.d.ts.map +1 -1
- package/out/zero-solid/src/solid-view.d.ts +24 -5
- package/out/zero-solid/src/solid-view.d.ts.map +1 -1
- package/out/zero-solid/src/use-query.d.ts.map +1 -1
- package/out/zero.js +4 -4
- package/out/zql/src/ivm/array-view.d.ts +2 -1
- package/out/zql/src/ivm/array-view.d.ts.map +1 -1
- package/out/zql/src/ivm/array-view.js +16 -5
- package/out/zql/src/ivm/array-view.js.map +1 -1
- package/out/zql/src/ivm/view.d.ts +2 -1
- package/out/zql/src/ivm/view.d.ts.map +1 -1
- package/out/zql/src/query/query-delegate.d.ts +2 -1
- package/out/zql/src/query/query-delegate.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +17 -5
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/typed-view.d.ts +3 -2
- package/out/zql/src/query/typed-view.d.ts.map +1 -1
- package/out/{zero-cache/src/services/view-syncer → zqlite/src}/database-storage.d.ts +2 -2
- package/out/zqlite/src/database-storage.d.ts.map +1 -0
- package/out/{zero-cache/src/services/view-syncer → zqlite/src}/database-storage.js +1 -1
- package/out/zqlite/src/database-storage.js.map +1 -0
- package/package.json +1 -1
- package/out/chunk-G442PJSB.js.map +0 -7
- package/out/chunk-MKB4RXL3.js +0 -15
- package/out/chunk-MKB4RXL3.js.map +0 -7
- package/out/chunk-P6JME3HC.js.map +0 -7
- package/out/inspector-4ALIZXAU.js.map +0 -7
- package/out/replicache/src/expo/store.d.ts +0 -4
- package/out/replicache/src/expo/store.d.ts.map +0 -1
- package/out/zero-cache/src/services/view-syncer/database-storage.d.ts.map +0 -1
- package/out/zero-cache/src/services/view-syncer/database-storage.js.map +0 -1
- /package/out/{chunk-4NLQ25GZ.js.map → chunk-KXV3BZ4U.js.map} +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
maybeTransactionIsClosedRejection,
|
|
3
|
+
storeIsClosedRejection,
|
|
4
|
+
throwIfStoreClosed,
|
|
5
|
+
transactionIsClosedRejection
|
|
6
|
+
} from "./chunk-ASRS2LFV.js";
|
|
6
7
|
import {
|
|
7
8
|
BTreeRead,
|
|
8
9
|
Chunk,
|
|
@@ -128,7 +129,7 @@ import {
|
|
|
128
129
|
withWrite,
|
|
129
130
|
withWriteNoImplicitCommit,
|
|
130
131
|
wrapIterable
|
|
131
|
-
} from "./chunk-
|
|
132
|
+
} from "./chunk-K5ZSWG54.js";
|
|
132
133
|
import {
|
|
133
134
|
assert,
|
|
134
135
|
assertArray,
|
|
@@ -329,6 +330,14 @@ function mustGetBrowserGlobal(name) {
|
|
|
329
330
|
return r;
|
|
330
331
|
}
|
|
331
332
|
|
|
333
|
+
// ../shared/src/resolved-promises.ts
|
|
334
|
+
var promiseTrue = Promise.resolve(true);
|
|
335
|
+
var promiseFalse = Promise.resolve(false);
|
|
336
|
+
var promiseUndefined = Promise.resolve(void 0);
|
|
337
|
+
var promiseVoid = Promise.resolve();
|
|
338
|
+
var promiseNever = new Promise(() => {
|
|
339
|
+
});
|
|
340
|
+
|
|
332
341
|
// ../replicache/src/kv/write-impl-base.ts
|
|
333
342
|
var deleteSentinel = Symbol();
|
|
334
343
|
var WriteImplBase = class {
|
|
@@ -338,6 +347,9 @@ var WriteImplBase = class {
|
|
|
338
347
|
this.#read = read;
|
|
339
348
|
}
|
|
340
349
|
has(key) {
|
|
350
|
+
if (this.#read.closed) {
|
|
351
|
+
return transactionIsClosedRejection();
|
|
352
|
+
}
|
|
341
353
|
switch (this._pending.get(key)) {
|
|
342
354
|
case void 0:
|
|
343
355
|
return this.#read.has(key);
|
|
@@ -348,6 +360,9 @@ var WriteImplBase = class {
|
|
|
348
360
|
}
|
|
349
361
|
}
|
|
350
362
|
async get(key) {
|
|
363
|
+
if (this.#read.closed) {
|
|
364
|
+
return transactionIsClosedRejection();
|
|
365
|
+
}
|
|
351
366
|
const v = this._pending.get(key);
|
|
352
367
|
switch (v) {
|
|
353
368
|
case deleteSentinel:
|
|
@@ -361,12 +376,10 @@ var WriteImplBase = class {
|
|
|
361
376
|
}
|
|
362
377
|
}
|
|
363
378
|
put(key, value) {
|
|
364
|
-
this._pending.set(key, deepFreeze(value));
|
|
365
|
-
return promiseVoid;
|
|
379
|
+
return maybeTransactionIsClosedRejection(this.#read) ?? (this._pending.set(key, deepFreeze(value)), promiseVoid);
|
|
366
380
|
}
|
|
367
381
|
del(key) {
|
|
368
|
-
this._pending.set(key, deleteSentinel);
|
|
369
|
-
return promiseVoid;
|
|
382
|
+
return maybeTransactionIsClosedRejection(this.#read) ?? (this._pending.set(key, deleteSentinel), promiseVoid);
|
|
370
383
|
}
|
|
371
384
|
release() {
|
|
372
385
|
this.#read.release();
|
|
@@ -387,9 +400,15 @@ var IDBStore = class {
|
|
|
387
400
|
this.#db = openDatabase(name);
|
|
388
401
|
}
|
|
389
402
|
read() {
|
|
403
|
+
if (this.#closed) {
|
|
404
|
+
return storeIsClosedRejection();
|
|
405
|
+
}
|
|
390
406
|
return this.#withReopen(readImpl);
|
|
391
407
|
}
|
|
392
408
|
write() {
|
|
409
|
+
if (this.#closed) {
|
|
410
|
+
return storeIsClosedRejection();
|
|
411
|
+
}
|
|
393
412
|
return this.#withReopen(writeImpl);
|
|
394
413
|
}
|
|
395
414
|
async close() {
|
|
@@ -451,6 +470,9 @@ var ReadImpl = class {
|
|
|
451
470
|
this.#tx = tx;
|
|
452
471
|
}
|
|
453
472
|
has(key) {
|
|
473
|
+
if (this.#closed) {
|
|
474
|
+
return transactionIsClosedRejection();
|
|
475
|
+
}
|
|
454
476
|
return new Promise((resolve, reject) => {
|
|
455
477
|
const req = objectStore(this.#tx).count(key);
|
|
456
478
|
req.onsuccess = () => resolve(req.result > 0);
|
|
@@ -458,6 +480,9 @@ var ReadImpl = class {
|
|
|
458
480
|
});
|
|
459
481
|
}
|
|
460
482
|
get(key) {
|
|
483
|
+
if (this.#closed) {
|
|
484
|
+
return transactionIsClosedRejection();
|
|
485
|
+
}
|
|
461
486
|
return new Promise((resolve, reject) => {
|
|
462
487
|
const req = objectStore(this.#tx).get(key);
|
|
463
488
|
req.onsuccess = () => resolve(deepFreezeAllowUndefined(req.result));
|
|
@@ -479,6 +504,9 @@ var WriteImpl = class extends WriteImplBase {
|
|
|
479
504
|
this.#tx = tx;
|
|
480
505
|
}
|
|
481
506
|
commit() {
|
|
507
|
+
if (this.#closed) {
|
|
508
|
+
return transactionIsClosedRejection();
|
|
509
|
+
}
|
|
482
510
|
if (this._pending.size === 0) {
|
|
483
511
|
return promiseVoid;
|
|
484
512
|
}
|
|
@@ -498,6 +526,7 @@ var WriteImpl = class extends WriteImplBase {
|
|
|
498
526
|
}
|
|
499
527
|
release() {
|
|
500
528
|
this.#closed = true;
|
|
529
|
+
super.release();
|
|
501
530
|
}
|
|
502
531
|
get closed() {
|
|
503
532
|
return this.#closed;
|
|
@@ -550,7 +579,7 @@ var AbortError = class extends Error {
|
|
|
550
579
|
// ../shared/src/sleep.ts
|
|
551
580
|
import { resolver as resolver2 } from "@rocicorp/resolver";
|
|
552
581
|
var promiseVoid2 = Promise.resolve();
|
|
553
|
-
var
|
|
582
|
+
var promiseNever2 = new Promise(() => void 0);
|
|
554
583
|
function sleep(ms, signal) {
|
|
555
584
|
const newAbortError = () => new AbortError("Aborted");
|
|
556
585
|
if (signal?.aborted) {
|
|
@@ -576,7 +605,7 @@ function sleep(ms, signal) {
|
|
|
576
605
|
}
|
|
577
606
|
function sleepWithAbort(ms, signal) {
|
|
578
607
|
if (ms === 0) {
|
|
579
|
-
return [promiseVoid2,
|
|
608
|
+
return [promiseVoid2, promiseNever2];
|
|
580
609
|
}
|
|
581
610
|
const { promise: abortedPromise, resolve: abortedResolve } = resolver2();
|
|
582
611
|
const sleepPromise = new Promise((resolve) => {
|
|
@@ -927,17 +956,46 @@ var WriteImpl2 = class extends ReadImpl2 {
|
|
|
927
956
|
};
|
|
928
957
|
|
|
929
958
|
// ../replicache/src/deleted-clients.ts
|
|
930
|
-
var DELETED_CLIENTS_HEAD_NAME = "deleted-clients";
|
|
931
|
-
var deletedClientsSchema =
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
959
|
+
var DELETED_CLIENTS_HEAD_NAME = "deleted-clients-v2";
|
|
960
|
+
var deletedClientsSchema = readonlyArray(
|
|
961
|
+
readonlyObject({
|
|
962
|
+
clientGroupID: clientGroupIDSchema,
|
|
963
|
+
clientID: clientIDSchema
|
|
964
|
+
})
|
|
965
|
+
);
|
|
966
|
+
function compare(a, b) {
|
|
967
|
+
const cg = stringCompare(a.clientGroupID, b.clientGroupID);
|
|
968
|
+
if (cg !== 0) {
|
|
969
|
+
return cg;
|
|
970
|
+
}
|
|
971
|
+
return stringCompare(a.clientID, b.clientID);
|
|
972
|
+
}
|
|
973
|
+
function normalizeDeletedClients(deletedClients) {
|
|
974
|
+
return [...deletedClients].sort(compare).filter(
|
|
975
|
+
(item, index) => index === 0 || compare(item, [...deletedClients].sort(compare)[index - 1]) !== 0
|
|
976
|
+
);
|
|
977
|
+
}
|
|
978
|
+
function mergeDeletedClients(a, b) {
|
|
979
|
+
const merged = [];
|
|
980
|
+
a = normalizeDeletedClients(a);
|
|
981
|
+
b = normalizeDeletedClients(b);
|
|
982
|
+
for (let i = 0, j = 0; i < a.length || j < b.length; ) {
|
|
983
|
+
if (i < a.length && (j >= b.length || compare(a[i], b[j]) < 0)) {
|
|
984
|
+
merged.push(a[i]);
|
|
985
|
+
i++;
|
|
986
|
+
} else if (j < b.length && (i >= a.length || compare(b[j], a[i]) < 0)) {
|
|
987
|
+
merged.push(b[j]);
|
|
988
|
+
j++;
|
|
989
|
+
} else {
|
|
990
|
+
merged.push(a[i]);
|
|
991
|
+
i++;
|
|
992
|
+
j++;
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
return merged;
|
|
996
|
+
}
|
|
997
|
+
async function setDeletedClients(dagWrite, deletedClients) {
|
|
998
|
+
const data = normalizeDeletedClients(deletedClients);
|
|
941
999
|
const chunkData = deepFreeze(data);
|
|
942
1000
|
const chunk = dagWrite.createChunk(chunkData, []);
|
|
943
1001
|
await dagWrite.putChunk(chunk);
|
|
@@ -947,35 +1005,44 @@ async function setDeletedClients(dagWrite, clientIDs, clientGroupIDs) {
|
|
|
947
1005
|
async function getDeletedClients(dagRead) {
|
|
948
1006
|
const hash = await dagRead.getHead(DELETED_CLIENTS_HEAD_NAME);
|
|
949
1007
|
if (hash === void 0) {
|
|
950
|
-
return
|
|
1008
|
+
return [];
|
|
951
1009
|
}
|
|
952
1010
|
const chunk = await dagRead.mustGetChunk(hash);
|
|
953
|
-
const res = test(chunk.data,
|
|
954
|
-
if (res.ok) {
|
|
955
|
-
return
|
|
1011
|
+
const res = test(chunk.data, deletedClientsSchema);
|
|
1012
|
+
if (!res.ok) {
|
|
1013
|
+
return [];
|
|
956
1014
|
}
|
|
957
|
-
return
|
|
1015
|
+
return res.value;
|
|
958
1016
|
}
|
|
959
|
-
async function addDeletedClients(dagWrite,
|
|
960
|
-
const
|
|
1017
|
+
async function addDeletedClients(dagWrite, deletedClientsToAdd) {
|
|
1018
|
+
const oldDeletedClients = await getDeletedClients(dagWrite);
|
|
961
1019
|
return setDeletedClients(
|
|
962
1020
|
dagWrite,
|
|
963
|
-
|
|
964
|
-
[...oldClientGroupIDs, ...clientGroupIDs]
|
|
1021
|
+
mergeDeletedClients(oldDeletedClients, deletedClientsToAdd)
|
|
965
1022
|
);
|
|
966
1023
|
}
|
|
967
|
-
async function
|
|
968
|
-
const
|
|
969
|
-
const
|
|
970
|
-
|
|
971
|
-
);
|
|
972
|
-
const
|
|
973
|
-
|
|
1024
|
+
async function confirmDeletedClients(dagWrite, deletedClientIds, deletedClientGroupIds) {
|
|
1025
|
+
const deletedClientIDSet = new Set(deletedClientIds);
|
|
1026
|
+
const deletedClientGroupIDSet = new Set(deletedClientGroupIds);
|
|
1027
|
+
const oldDeletedClients = await getDeletedClients(dagWrite);
|
|
1028
|
+
const clients = new Map(await getClients(dagWrite));
|
|
1029
|
+
for (const clientID of deletedClientIds) {
|
|
1030
|
+
clients.delete(clientID);
|
|
1031
|
+
}
|
|
1032
|
+
for (const clientGroupID of deletedClientGroupIds) {
|
|
1033
|
+
for (const [clientID, client] of clients) {
|
|
1034
|
+
if (client.clientGroupID === clientGroupID) {
|
|
1035
|
+
clients.delete(clientID);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
await setClients(clients, dagWrite);
|
|
1040
|
+
return setDeletedClients(
|
|
1041
|
+
dagWrite,
|
|
1042
|
+
oldDeletedClients.filter(
|
|
1043
|
+
({ clientGroupID, clientID }) => !deletedClientGroupIDSet.has(clientGroupID) && !deletedClientIDSet.has(clientID)
|
|
1044
|
+
)
|
|
974
1045
|
);
|
|
975
|
-
return setDeletedClients(dagWrite, newDeletedClients, newDeletedClientGroups);
|
|
976
|
-
}
|
|
977
|
-
function normalize(arr) {
|
|
978
|
-
return [...new Set(arr)].sort();
|
|
979
1046
|
}
|
|
980
1047
|
|
|
981
1048
|
// ../shared/src/navigator.ts
|
|
@@ -1001,10 +1068,10 @@ var ReadImpl3 = class {
|
|
|
1001
1068
|
return this.#closed;
|
|
1002
1069
|
}
|
|
1003
1070
|
has(key) {
|
|
1004
|
-
return Promise.resolve(this.#map.has(key));
|
|
1071
|
+
return maybeTransactionIsClosedRejection(this) ?? Promise.resolve(this.#map.has(key));
|
|
1005
1072
|
}
|
|
1006
1073
|
get(key) {
|
|
1007
|
-
return Promise.resolve(this.#map.get(key));
|
|
1074
|
+
return maybeTransactionIsClosedRejection(this) ?? Promise.resolve(this.#map.get(key));
|
|
1008
1075
|
}
|
|
1009
1076
|
};
|
|
1010
1077
|
|
|
@@ -1016,6 +1083,9 @@ var WriteImpl3 = class extends WriteImplBase {
|
|
|
1016
1083
|
this.#map = map;
|
|
1017
1084
|
}
|
|
1018
1085
|
commit() {
|
|
1086
|
+
if (this.closed) {
|
|
1087
|
+
return transactionIsClosedRejection();
|
|
1088
|
+
}
|
|
1019
1089
|
this._pending.forEach((value, key) => {
|
|
1020
1090
|
if (value === deleteSentinel) {
|
|
1021
1091
|
this.#map.delete(key);
|
|
@@ -1054,10 +1124,12 @@ var MemStore = class {
|
|
|
1054
1124
|
this.#map = map;
|
|
1055
1125
|
}
|
|
1056
1126
|
async read() {
|
|
1127
|
+
throwIfStoreClosed(this);
|
|
1057
1128
|
const release = await this.#rwLock.read();
|
|
1058
1129
|
return new ReadImpl3(this.#map, release);
|
|
1059
1130
|
}
|
|
1060
1131
|
async write() {
|
|
1132
|
+
throwIfStoreClosed(this);
|
|
1061
1133
|
const release = await this.#rwLock.write();
|
|
1062
1134
|
return new WriteImpl3(this.#map, release);
|
|
1063
1135
|
}
|
|
@@ -1312,16 +1384,11 @@ async function collectIDBDatabases(idbDatabasesStore, now, maxAge, kvDropStore,
|
|
|
1312
1384
|
);
|
|
1313
1385
|
const dbNamesToRemove = [];
|
|
1314
1386
|
const dbNamesToKeep = [];
|
|
1315
|
-
const
|
|
1316
|
-
const
|
|
1317
|
-
for (const [
|
|
1318
|
-
dbName,
|
|
1319
|
-
[canCollect, clientIDs, clientGroupIDs]
|
|
1320
|
-
] of collectResults) {
|
|
1387
|
+
const deletedClientsToRemove = [];
|
|
1388
|
+
for (const [dbName, [canCollect, deletedClients]] of collectResults) {
|
|
1321
1389
|
if (canCollect) {
|
|
1322
1390
|
dbNamesToRemove.push(dbName);
|
|
1323
|
-
|
|
1324
|
-
clientGroupIDsToRemove.push(...clientGroupIDs);
|
|
1391
|
+
deletedClientsToRemove.push(...deletedClients);
|
|
1325
1392
|
} else {
|
|
1326
1393
|
dbNamesToKeep.push(dbName);
|
|
1327
1394
|
}
|
|
@@ -1334,24 +1401,22 @@ async function collectIDBDatabases(idbDatabasesStore, now, maxAge, kvDropStore,
|
|
|
1334
1401
|
if (errors.length) {
|
|
1335
1402
|
throw errors[0];
|
|
1336
1403
|
}
|
|
1337
|
-
if (
|
|
1338
|
-
|
|
1339
|
-
const newClientGroupIDsToRemove = clientGroupIDsToRemove;
|
|
1404
|
+
if (deletedClientsToRemove.length > 0) {
|
|
1405
|
+
let allDeletedClients = deletedClientsToRemove;
|
|
1340
1406
|
for (const name of dbNamesToKeep) {
|
|
1341
1407
|
await withWrite(newDagStore(name), async (dagWrite) => {
|
|
1342
|
-
const
|
|
1408
|
+
const newDeletedClients = await addDeletedClients(
|
|
1343
1409
|
dagWrite,
|
|
1344
|
-
|
|
1345
|
-
|
|
1410
|
+
deletedClientsToRemove
|
|
1411
|
+
);
|
|
1412
|
+
allDeletedClients = mergeDeletedClients(
|
|
1413
|
+
allDeletedClients,
|
|
1414
|
+
newDeletedClients
|
|
1346
1415
|
);
|
|
1347
|
-
newClientIDsToRemove.push(...clientIDs);
|
|
1348
|
-
newClientGroupIDsToRemove.push(...clientGroupIDs);
|
|
1349
1416
|
});
|
|
1350
1417
|
}
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
normalize(newClientGroupIDsToRemove)
|
|
1354
|
-
);
|
|
1418
|
+
const normalizedDeletedClients = normalizeDeletedClients(allDeletedClients);
|
|
1419
|
+
await onClientsDeleted(normalizedDeletedClients);
|
|
1355
1420
|
}
|
|
1356
1421
|
}
|
|
1357
1422
|
async function dropDatabaseInternal(name, idbDatabasesStore, kvDropStore) {
|
|
@@ -1428,14 +1493,15 @@ function canDatabaseBeCollectedAndGetDeletedClientIDs(enableMutationRecovery, pe
|
|
|
1428
1493
|
}
|
|
1429
1494
|
}
|
|
1430
1495
|
const clients = await getClients(read);
|
|
1431
|
-
const
|
|
1432
|
-
const
|
|
1433
|
-
const newClientGroupIDs = [...clientGroupIDs];
|
|
1496
|
+
const existingDeletedClients = await getDeletedClients(read);
|
|
1497
|
+
const deletedClients = [...existingDeletedClients];
|
|
1434
1498
|
for (const [clientID, client] of clients) {
|
|
1435
|
-
|
|
1436
|
-
|
|
1499
|
+
deletedClients.push({
|
|
1500
|
+
clientID,
|
|
1501
|
+
clientGroupID: client.clientGroupID
|
|
1502
|
+
});
|
|
1437
1503
|
}
|
|
1438
|
-
return [true,
|
|
1504
|
+
return [true, deletedClients];
|
|
1439
1505
|
});
|
|
1440
1506
|
}
|
|
1441
1507
|
|
|
@@ -1554,7 +1620,7 @@ function table(name) {
|
|
|
1554
1620
|
primaryKey: []
|
|
1555
1621
|
});
|
|
1556
1622
|
}
|
|
1557
|
-
function
|
|
1623
|
+
function string2() {
|
|
1558
1624
|
return new ColumnBuilder({
|
|
1559
1625
|
type: "string",
|
|
1560
1626
|
optional: false,
|
|
@@ -1956,6 +2022,7 @@ var ConnectionLoop = class {
|
|
|
1956
2022
|
#sendResolver = resolver4();
|
|
1957
2023
|
#delegate;
|
|
1958
2024
|
#closed = false;
|
|
2025
|
+
#abortSignal = new AbortController();
|
|
1959
2026
|
/**
|
|
1960
2027
|
* Number of pending send calls.
|
|
1961
2028
|
*
|
|
@@ -1973,6 +2040,7 @@ var ConnectionLoop = class {
|
|
|
1973
2040
|
}
|
|
1974
2041
|
close() {
|
|
1975
2042
|
this.#closed = true;
|
|
2043
|
+
this.#abortSignal.abort();
|
|
1976
2044
|
if (this.#sendCounter > 0) {
|
|
1977
2045
|
this.#sendResolver.resolve({ error: closeError() });
|
|
1978
2046
|
}
|
|
@@ -2015,7 +2083,8 @@ var ConnectionLoop = class {
|
|
|
2015
2083
|
const races = [this.#pendingResolver.promise];
|
|
2016
2084
|
const t2 = delegate.watchdogTimer;
|
|
2017
2085
|
if (t2 !== null) {
|
|
2018
|
-
races.push(sleep(t2))
|
|
2086
|
+
races.push(sleep(t2, this.#abortSignal.signal).catch(() => {
|
|
2087
|
+
}));
|
|
2019
2088
|
}
|
|
2020
2089
|
await Promise.race(races);
|
|
2021
2090
|
if (this.#closed) break;
|
|
@@ -3699,20 +3768,21 @@ function gcClients(clientID, dagStore, clientMaxInactiveTime, onClientsDeleted)
|
|
|
3699
3768
|
if (id === clientID || now - client.heartbeatTimestampMs <= clientMaxInactiveTime) {
|
|
3700
3769
|
newClients.set(id, client);
|
|
3701
3770
|
} else {
|
|
3702
|
-
deletedClients.push(
|
|
3771
|
+
deletedClients.push({
|
|
3772
|
+
clientGroupID: client.clientGroupID,
|
|
3773
|
+
clientID: id
|
|
3774
|
+
});
|
|
3703
3775
|
}
|
|
3704
3776
|
}
|
|
3705
3777
|
if (newClients.size === clients.size) {
|
|
3706
3778
|
return clients;
|
|
3707
3779
|
}
|
|
3708
3780
|
await setClients(newClients, dagWrite);
|
|
3709
|
-
const
|
|
3781
|
+
const normalizedDeletedClients = await addDeletedClients(
|
|
3710
3782
|
dagWrite,
|
|
3711
|
-
deletedClients
|
|
3712
|
-
// gcClients does not delete client groups
|
|
3713
|
-
[]
|
|
3783
|
+
deletedClients
|
|
3714
3784
|
);
|
|
3715
|
-
onClientsDeleted(
|
|
3785
|
+
await onClientsDeleted(normalizedDeletedClients);
|
|
3716
3786
|
return newClients;
|
|
3717
3787
|
});
|
|
3718
3788
|
}
|
|
@@ -3720,15 +3790,11 @@ function gcClients(clientID, dagStore, clientMaxInactiveTime, onClientsDeleted)
|
|
|
3720
3790
|
// ../replicache/src/persist/client-group-gc.ts
|
|
3721
3791
|
var GC_INTERVAL_MS = 5 * 60 * 1e3;
|
|
3722
3792
|
var latestGCUpdate2;
|
|
3723
|
-
function initClientGroupGC(dagStore, enableMutationRecovery,
|
|
3793
|
+
function initClientGroupGC(dagStore, enableMutationRecovery, lc, signal) {
|
|
3724
3794
|
initBgIntervalProcess(
|
|
3725
3795
|
"ClientGroupGC",
|
|
3726
3796
|
() => {
|
|
3727
|
-
latestGCUpdate2 = gcClientGroups(
|
|
3728
|
-
dagStore,
|
|
3729
|
-
enableMutationRecovery,
|
|
3730
|
-
onClientsDeleted
|
|
3731
|
-
);
|
|
3797
|
+
latestGCUpdate2 = gcClientGroups(dagStore, enableMutationRecovery);
|
|
3732
3798
|
return latestGCUpdate2;
|
|
3733
3799
|
},
|
|
3734
3800
|
() => GC_INTERVAL_MS,
|
|
@@ -3736,7 +3802,7 @@ function initClientGroupGC(dagStore, enableMutationRecovery, onClientsDeleted, l
|
|
|
3736
3802
|
signal
|
|
3737
3803
|
);
|
|
3738
3804
|
}
|
|
3739
|
-
function gcClientGroups(dagStore, enableMutationRecovery
|
|
3805
|
+
function gcClientGroups(dagStore, enableMutationRecovery) {
|
|
3740
3806
|
return withWrite(dagStore, async (tx) => {
|
|
3741
3807
|
const clients = await getClients(tx);
|
|
3742
3808
|
const clientGroupIDs = /* @__PURE__ */ new Set();
|
|
@@ -3753,7 +3819,6 @@ function gcClientGroups(dagStore, enableMutationRecovery, onClientsDeleted) {
|
|
|
3753
3819
|
}
|
|
3754
3820
|
}
|
|
3755
3821
|
await setClientGroups(clientGroups, tx);
|
|
3756
|
-
onClientsDeleted([], [...removeClientGroups].sort());
|
|
3757
3822
|
return clientGroups;
|
|
3758
3823
|
});
|
|
3759
3824
|
}
|
|
@@ -4919,8 +4984,7 @@ var ReplicacheImpl = class {
|
|
|
4919
4984
|
enableScheduledRefresh = true,
|
|
4920
4985
|
enablePullAndPushInOpen = true,
|
|
4921
4986
|
enableClientGroupForking = true,
|
|
4922
|
-
onClientsDeleted = () =>
|
|
4923
|
-
}
|
|
4987
|
+
onClientsDeleted = () => promiseVoid
|
|
4924
4988
|
} = implOptions;
|
|
4925
4989
|
this.#zero = implOptions.zero;
|
|
4926
4990
|
this.#auth = auth ?? "";
|
|
@@ -5065,13 +5129,7 @@ var ReplicacheImpl = class {
|
|
|
5065
5129
|
this.#lc,
|
|
5066
5130
|
signal
|
|
5067
5131
|
);
|
|
5068
|
-
initClientGroupGC(
|
|
5069
|
-
this.perdag,
|
|
5070
|
-
enableMutationRecovery,
|
|
5071
|
-
onClientsDeleted,
|
|
5072
|
-
this.#lc,
|
|
5073
|
-
signal
|
|
5074
|
-
);
|
|
5132
|
+
initClientGroupGC(this.perdag, enableMutationRecovery, this.#lc, signal);
|
|
5075
5133
|
initNewClientChannel(
|
|
5076
5134
|
this.name,
|
|
5077
5135
|
this.idbName,
|
|
@@ -5903,6 +5961,11 @@ function validateOptions(options) {
|
|
|
5903
5961
|
}
|
|
5904
5962
|
}
|
|
5905
5963
|
|
|
5964
|
+
// ../shared/src/sentinels.ts
|
|
5965
|
+
function emptyFunction() {
|
|
5966
|
+
}
|
|
5967
|
+
var emptyObject = Object.freeze({});
|
|
5968
|
+
|
|
5906
5969
|
// ../shared/src/subscribable.ts
|
|
5907
5970
|
var Subscribable = class {
|
|
5908
5971
|
_listeners = /* @__PURE__ */ new Set();
|
|
@@ -6361,7 +6424,7 @@ var downstreamSchema = valita_exports.union(
|
|
|
6361
6424
|
);
|
|
6362
6425
|
|
|
6363
6426
|
// ../zero-protocol/src/protocol-version.ts
|
|
6364
|
-
var PROTOCOL_VERSION =
|
|
6427
|
+
var PROTOCOL_VERSION = 31;
|
|
6365
6428
|
var MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 18;
|
|
6366
6429
|
assert(MIN_SERVER_SUPPORTED_SYNC_PROTOCOL < PROTOCOL_VERSION);
|
|
6367
6430
|
|
|
@@ -6588,7 +6651,7 @@ var ActiveClientsManager = class _ActiveClientsManager {
|
|
|
6588
6651
|
}
|
|
6589
6652
|
#removeClient(clientID) {
|
|
6590
6653
|
if (this.#activeClients.delete(clientID)) {
|
|
6591
|
-
this.onDelete?.(clientID);
|
|
6654
|
+
this.onDelete?.(clientID, this.clientGroupID);
|
|
6592
6655
|
}
|
|
6593
6656
|
}
|
|
6594
6657
|
};
|
|
@@ -7430,8 +7493,8 @@ var MemorySource = class _MemorySource {
|
|
|
7430
7493
|
indexSort.push(...requestedSort);
|
|
7431
7494
|
}
|
|
7432
7495
|
const index = this.#getOrCreateIndex(indexSort, from);
|
|
7433
|
-
const { data, comparator:
|
|
7434
|
-
const comparator2 = (r1, r2) =>
|
|
7496
|
+
const { data, comparator: compare2 } = index;
|
|
7497
|
+
const comparator2 = (r1, r2) => compare2(r1, r2) * (req.reverse ? -1 : 1);
|
|
7435
7498
|
const startAt = req.start?.row;
|
|
7436
7499
|
let scanStart;
|
|
7437
7500
|
if (fetchOrPkConstraint) {
|
|
@@ -7631,7 +7694,7 @@ function* genPush(change, exists, connections, setOverlay, setSplitEditOverlay)
|
|
|
7631
7694
|
}
|
|
7632
7695
|
setOverlay(void 0);
|
|
7633
7696
|
}
|
|
7634
|
-
function* generateWithStart(nodes, start,
|
|
7697
|
+
function* generateWithStart(nodes, start, compare2) {
|
|
7635
7698
|
if (!start) {
|
|
7636
7699
|
yield* nodes;
|
|
7637
7700
|
return;
|
|
@@ -7640,11 +7703,11 @@ function* generateWithStart(nodes, start, compare) {
|
|
|
7640
7703
|
for (const node of nodes) {
|
|
7641
7704
|
if (!started) {
|
|
7642
7705
|
if (start.basis === "at") {
|
|
7643
|
-
if (
|
|
7706
|
+
if (compare2(node.row, start.row) >= 0) {
|
|
7644
7707
|
started = true;
|
|
7645
7708
|
}
|
|
7646
7709
|
} else if (start.basis === "after") {
|
|
7647
|
-
if (
|
|
7710
|
+
if (compare2(node.row, start.row) > 0) {
|
|
7648
7711
|
started = true;
|
|
7649
7712
|
}
|
|
7650
7713
|
}
|
|
@@ -7654,7 +7717,7 @@ function* generateWithStart(nodes, start, compare) {
|
|
|
7654
7717
|
}
|
|
7655
7718
|
}
|
|
7656
7719
|
}
|
|
7657
|
-
function* generateWithOverlay(startAt, rows, constraint, overlay, splitEditOverlay, connectionIndex,
|
|
7720
|
+
function* generateWithOverlay(startAt, rows, constraint, overlay, splitEditOverlay, connectionIndex, compare2, filterPredicate) {
|
|
7658
7721
|
let overlayToApply = void 0;
|
|
7659
7722
|
if (splitEditOverlay && splitEditOverlay.outputIndex === connectionIndex) {
|
|
7660
7723
|
overlayToApply = splitEditOverlay;
|
|
@@ -7665,12 +7728,12 @@ function* generateWithOverlay(startAt, rows, constraint, overlay, splitEditOverl
|
|
|
7665
7728
|
startAt,
|
|
7666
7729
|
constraint,
|
|
7667
7730
|
overlayToApply,
|
|
7668
|
-
|
|
7731
|
+
compare2,
|
|
7669
7732
|
filterPredicate
|
|
7670
7733
|
);
|
|
7671
|
-
yield* generateWithOverlayInner(rows, overlays,
|
|
7734
|
+
yield* generateWithOverlayInner(rows, overlays, compare2);
|
|
7672
7735
|
}
|
|
7673
|
-
function computeOverlays(startAt, constraint, overlay,
|
|
7736
|
+
function computeOverlays(startAt, constraint, overlay, compare2, filterPredicate) {
|
|
7674
7737
|
let overlays = {
|
|
7675
7738
|
add: void 0,
|
|
7676
7739
|
remove: void 0
|
|
@@ -7696,7 +7759,7 @@ function computeOverlays(startAt, constraint, overlay, compare, filterPredicate)
|
|
|
7696
7759
|
break;
|
|
7697
7760
|
}
|
|
7698
7761
|
if (startAt) {
|
|
7699
|
-
overlays = overlaysForStartAt(overlays, startAt,
|
|
7762
|
+
overlays = overlaysForStartAt(overlays, startAt, compare2);
|
|
7700
7763
|
}
|
|
7701
7764
|
if (constraint) {
|
|
7702
7765
|
overlays = overlaysForConstraint(overlays, constraint);
|
|
@@ -7706,8 +7769,8 @@ function computeOverlays(startAt, constraint, overlay, compare, filterPredicate)
|
|
|
7706
7769
|
}
|
|
7707
7770
|
return overlays;
|
|
7708
7771
|
}
|
|
7709
|
-
function overlaysForStartAt({ add, remove }, startAt,
|
|
7710
|
-
const undefinedIfBeforeStartAt = (row) => row === void 0 ||
|
|
7772
|
+
function overlaysForStartAt({ add, remove }, startAt, compare2) {
|
|
7773
|
+
const undefinedIfBeforeStartAt = (row) => row === void 0 || compare2(row, startAt) < 0 ? void 0 : row;
|
|
7711
7774
|
return {
|
|
7712
7775
|
add: undefinedIfBeforeStartAt(add),
|
|
7713
7776
|
remove: undefinedIfBeforeStartAt(remove)
|
|
@@ -7727,19 +7790,19 @@ function overlaysForFilterPredicate({ add, remove }, filterPredicate) {
|
|
|
7727
7790
|
remove: undefinedIfDoesntMatchFilter(remove)
|
|
7728
7791
|
};
|
|
7729
7792
|
}
|
|
7730
|
-
function* generateWithOverlayInner(rowIterator, overlays,
|
|
7793
|
+
function* generateWithOverlayInner(rowIterator, overlays, compare2) {
|
|
7731
7794
|
let addOverlayYielded = false;
|
|
7732
7795
|
let removeOverlaySkipped = false;
|
|
7733
7796
|
for (const row of rowIterator) {
|
|
7734
7797
|
if (!addOverlayYielded && overlays.add) {
|
|
7735
|
-
const cmp =
|
|
7798
|
+
const cmp = compare2(overlays.add, row);
|
|
7736
7799
|
if (cmp < 0) {
|
|
7737
7800
|
addOverlayYielded = true;
|
|
7738
7801
|
yield { row: overlays.add, relationships: {} };
|
|
7739
7802
|
}
|
|
7740
7803
|
}
|
|
7741
7804
|
if (!removeOverlaySkipped && overlays.remove) {
|
|
7742
|
-
const cmp =
|
|
7805
|
+
const cmp = compare2(overlays.remove, row);
|
|
7743
7806
|
if (cmp === 0) {
|
|
7744
7807
|
removeOverlaySkipped = true;
|
|
7745
7808
|
continue;
|
|
@@ -8246,11 +8309,6 @@ async function deleteImpl(tx, arg, schema, ivmBranch) {
|
|
|
8246
8309
|
}
|
|
8247
8310
|
}
|
|
8248
8311
|
|
|
8249
|
-
// ../shared/src/sentinels.ts
|
|
8250
|
-
function emptyFunction() {
|
|
8251
|
-
}
|
|
8252
|
-
var emptyObject = Object.freeze({});
|
|
8253
|
-
|
|
8254
8312
|
// ../zero-client/src/client/custom.ts
|
|
8255
8313
|
var TransactionImpl = class {
|
|
8256
8314
|
constructor(lc, repTx, schema) {
|
|
@@ -8371,30 +8429,40 @@ var DeleteClientsManager = class {
|
|
|
8371
8429
|
#send;
|
|
8372
8430
|
#lc;
|
|
8373
8431
|
#dagStore;
|
|
8374
|
-
|
|
8432
|
+
#clientGroupID;
|
|
8433
|
+
constructor(send2, dagStore, lc, clientGroupID) {
|
|
8375
8434
|
this.#send = send2;
|
|
8376
8435
|
this.#dagStore = dagStore;
|
|
8377
8436
|
this.#lc = lc;
|
|
8437
|
+
this.#clientGroupID = clientGroupID;
|
|
8378
8438
|
}
|
|
8379
8439
|
/**
|
|
8380
8440
|
* This gets called by Replicache when it deletes clients from the persistent
|
|
8381
8441
|
* storage.
|
|
8382
8442
|
*/
|
|
8383
|
-
onClientsDeleted(
|
|
8384
|
-
this.#lc.debug?.("DeletedClientsManager, send:",
|
|
8385
|
-
|
|
8443
|
+
async onClientsDeleted(deletedClients) {
|
|
8444
|
+
this.#lc.debug?.("DeletedClientsManager, send:", deletedClients);
|
|
8445
|
+
const clientGroupID = await this.#clientGroupID;
|
|
8446
|
+
this.#send([
|
|
8447
|
+
"deleteClients",
|
|
8448
|
+
{
|
|
8449
|
+
clientIDs: deletedClients.filter((dc) => dc.clientGroupID === clientGroupID).map((dc) => dc.clientID)
|
|
8450
|
+
}
|
|
8451
|
+
]);
|
|
8386
8452
|
}
|
|
8387
8453
|
/**
|
|
8388
8454
|
* Zero calls this after it connects to ensure that the server knows about all
|
|
8389
8455
|
* the clients that might have been deleted locally since the last connection.
|
|
8390
8456
|
*/
|
|
8391
8457
|
async sendDeletedClientsToServer() {
|
|
8458
|
+
const clientGroupID = await this.#clientGroupID;
|
|
8392
8459
|
const deleted = await withRead(
|
|
8393
8460
|
this.#dagStore,
|
|
8394
8461
|
(dagRead) => getDeletedClients(dagRead)
|
|
8395
8462
|
);
|
|
8396
|
-
|
|
8397
|
-
|
|
8463
|
+
const clientIDs = deleted.filter((d) => d.clientGroupID === clientGroupID).map((d) => d.clientID);
|
|
8464
|
+
if (clientIDs.length > 0) {
|
|
8465
|
+
this.#send(["deleteClients", { clientIDs }]);
|
|
8398
8466
|
this.#lc.debug?.("DeletedClientsManager, send:", deleted);
|
|
8399
8467
|
}
|
|
8400
8468
|
}
|
|
@@ -8407,13 +8475,18 @@ var DeleteClientsManager = class {
|
|
|
8407
8475
|
if (clientIDs.length > 0 || clientGroupIDs.length > 0) {
|
|
8408
8476
|
return withWrite(this.#dagStore, async (dagWrite) => {
|
|
8409
8477
|
this.#lc.debug?.("clientsDeletedOnServer:", clientIDs, clientGroupIDs);
|
|
8410
|
-
await
|
|
8478
|
+
await confirmDeletedClients(dagWrite, clientIDs, clientGroupIDs);
|
|
8411
8479
|
});
|
|
8412
8480
|
}
|
|
8413
8481
|
return promiseVoid;
|
|
8414
8482
|
}
|
|
8415
|
-
getDeletedClients() {
|
|
8416
|
-
|
|
8483
|
+
async getDeletedClients() {
|
|
8484
|
+
const deletedClients = await withRead(
|
|
8485
|
+
this.#dagStore,
|
|
8486
|
+
(read) => getDeletedClients(read)
|
|
8487
|
+
);
|
|
8488
|
+
const clientGroupID = await this.#clientGroupID;
|
|
8489
|
+
return deletedClients.filter((d) => d.clientGroupID === clientGroupID);
|
|
8417
8490
|
}
|
|
8418
8491
|
};
|
|
8419
8492
|
|
|
@@ -8665,7 +8738,7 @@ function makeMessage(message, context, logLevel) {
|
|
|
8665
8738
|
}
|
|
8666
8739
|
|
|
8667
8740
|
// ../zero-client/src/client/version.ts
|
|
8668
|
-
var version2 = "0.24.
|
|
8741
|
+
var version2 = "0.24.2025091200";
|
|
8669
8742
|
|
|
8670
8743
|
// ../zero-client/src/client/log-options.ts
|
|
8671
8744
|
var LevelFilterLogSink = class {
|
|
@@ -9347,6 +9420,15 @@ var QueryManager = class {
|
|
|
9347
9420
|
}
|
|
9348
9421
|
return patch;
|
|
9349
9422
|
}
|
|
9423
|
+
handleTransformErrors(errors) {
|
|
9424
|
+
for (const error of errors) {
|
|
9425
|
+
const queryId = error.id;
|
|
9426
|
+
const entry = this.#queries.get(queryId);
|
|
9427
|
+
if (entry) {
|
|
9428
|
+
entry.gotCallbacks.forEach((callback) => callback(false, error));
|
|
9429
|
+
}
|
|
9430
|
+
}
|
|
9431
|
+
}
|
|
9350
9432
|
addCustom(ast, { name, args }, ttl, gotCallback) {
|
|
9351
9433
|
const normalized = normalizeAST(ast);
|
|
9352
9434
|
const queryId = hashOfNameAndArgs(name, args);
|
|
@@ -9404,7 +9486,7 @@ var QueryManager = class {
|
|
|
9404
9486
|
gotCallback(this.#gotQueries.has(queryId));
|
|
9405
9487
|
}
|
|
9406
9488
|
let removed = false;
|
|
9407
|
-
|
|
9489
|
+
const cleanupCb = () => {
|
|
9408
9490
|
if (removed) {
|
|
9409
9491
|
return;
|
|
9410
9492
|
}
|
|
@@ -9417,6 +9499,7 @@ var QueryManager = class {
|
|
|
9417
9499
|
}
|
|
9418
9500
|
this.#remove(entry, queryId, gotCallback);
|
|
9419
9501
|
};
|
|
9502
|
+
return cleanupCb;
|
|
9420
9503
|
}
|
|
9421
9504
|
updateCustom({ name, args }, ttl) {
|
|
9422
9505
|
const queryID = hashOfNameAndArgs(name, args);
|
|
@@ -10409,7 +10492,7 @@ var Zero = class _Zero {
|
|
|
10409
10492
|
enableMutationRecovery: false,
|
|
10410
10493
|
enablePullAndPushInOpen: false,
|
|
10411
10494
|
// Zero calls push in its connection management code
|
|
10412
|
-
onClientsDeleted: (
|
|
10495
|
+
onClientsDeleted: (deletedClients) => this.#deleteClientsManager.onClientsDeleted(deletedClients),
|
|
10413
10496
|
zero: new ZeroRep(
|
|
10414
10497
|
this.#zeroContext,
|
|
10415
10498
|
this.#ivmMain,
|
|
@@ -10433,7 +10516,9 @@ var Zero = class _Zero {
|
|
|
10433
10516
|
rep.clientGroupID,
|
|
10434
10517
|
this.clientID,
|
|
10435
10518
|
this.#closeAbortController.signal,
|
|
10436
|
-
(clientID) => this.#deleteClientsManager.onClientsDeleted([
|
|
10519
|
+
(clientID, clientGroupID) => this.#deleteClientsManager.onClientsDeleted([
|
|
10520
|
+
{ clientGroupID, clientID }
|
|
10521
|
+
])
|
|
10437
10522
|
);
|
|
10438
10523
|
const onUpdateNeededCallback = (reason, serverErrorMsg) => {
|
|
10439
10524
|
if (onUpdateNeeded) {
|
|
@@ -10499,7 +10584,8 @@ var Zero = class _Zero {
|
|
|
10499
10584
|
this.#deleteClientsManager = new DeleteClientsManager(
|
|
10500
10585
|
(msg) => this.#send(msg),
|
|
10501
10586
|
rep.perdag,
|
|
10502
|
-
this.#lc
|
|
10587
|
+
this.#lc,
|
|
10588
|
+
this.#rep.clientGroupID
|
|
10503
10589
|
);
|
|
10504
10590
|
this.query = this.#registerQueries(schema);
|
|
10505
10591
|
reportReloadReason(this.#lc);
|
|
@@ -10749,6 +10835,7 @@ var Zero = class _Zero {
|
|
|
10749
10835
|
case "pushResponse":
|
|
10750
10836
|
return this.#mutationTracker.processPushResponse(downMessage[1]);
|
|
10751
10837
|
case "transformError":
|
|
10838
|
+
this.#queryManager.handleTransformErrors(downMessage[1]);
|
|
10752
10839
|
break;
|
|
10753
10840
|
case "inspect":
|
|
10754
10841
|
break;
|
|
@@ -11445,7 +11532,7 @@ var Zero = class _Zero {
|
|
|
11445
11532
|
*/
|
|
11446
11533
|
async inspect() {
|
|
11447
11534
|
BUNDLE_SIZE: {
|
|
11448
|
-
const m = await import("./inspector-
|
|
11535
|
+
const m = await import("./inspector-ZZSIUMBB.js");
|
|
11449
11536
|
return m.newInspector(
|
|
11450
11537
|
this.#rep,
|
|
11451
11538
|
this.#queryManager,
|
|
@@ -11506,7 +11593,8 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
|
|
|
11506
11593
|
lc.info?.("Connecting to", url.toString());
|
|
11507
11594
|
const WS = mustGetBrowserGlobal("WebSocket");
|
|
11508
11595
|
const queriesPatchP = rep.query((tx) => queryManager.getQueriesPatch(tx));
|
|
11509
|
-
|
|
11596
|
+
const deletedClientsArray = await deleteClientsManager.getDeletedClients();
|
|
11597
|
+
let deletedClients = convertDeletedClientsToBody(deletedClientsArray, clientGroupID);
|
|
11510
11598
|
let queriesPatch = await queriesPatchP;
|
|
11511
11599
|
const { activeClients } = activeClientsManager;
|
|
11512
11600
|
let secProtocol = encodeSecProtocols(
|
|
@@ -11562,6 +11650,16 @@ function skipEmptyDeletedClients(deletedClients) {
|
|
|
11562
11650
|
data.clientGroupIDs = skipEmptyArray(clientGroupIDs);
|
|
11563
11651
|
return data;
|
|
11564
11652
|
}
|
|
11653
|
+
function convertDeletedClientsToBody(deletedClients, clientGroupID) {
|
|
11654
|
+
if (deletedClients.length === 0) {
|
|
11655
|
+
return void 0;
|
|
11656
|
+
}
|
|
11657
|
+
const clientIDs = deletedClients.filter((pair) => pair.clientID && pair.clientGroupID === clientGroupID).map((pair) => pair.clientID);
|
|
11658
|
+
if (clientIDs.length === 0) {
|
|
11659
|
+
return void 0;
|
|
11660
|
+
}
|
|
11661
|
+
return { clientIDs };
|
|
11662
|
+
}
|
|
11565
11663
|
function addWebSocketIDFromSocketToLogContext({ url }, lc) {
|
|
11566
11664
|
const wsid = new URL(url).searchParams.get("wsid") ?? nanoid();
|
|
11567
11665
|
return addWebSocketIDToLogContext(wsid, lc);
|
|
@@ -11602,7 +11700,7 @@ export {
|
|
|
11602
11700
|
transformResponseMessageSchema,
|
|
11603
11701
|
error_kind_enum_exports,
|
|
11604
11702
|
table,
|
|
11605
|
-
|
|
11703
|
+
string2 as string,
|
|
11606
11704
|
number2 as number,
|
|
11607
11705
|
boolean,
|
|
11608
11706
|
json,
|
|
@@ -11612,4 +11710,4 @@ export {
|
|
|
11612
11710
|
update_needed_reason_type_enum_exports,
|
|
11613
11711
|
Zero
|
|
11614
11712
|
};
|
|
11615
|
-
//# sourceMappingURL=chunk-
|
|
11713
|
+
//# sourceMappingURL=chunk-6XNI6IVJ.js.map
|