@rocicorp/zero 0.13.2025020700 → 0.14.2025021001
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-FVVIM6TT.js → chunk-MVLDKRBK.js} +305 -143
- package/out/chunk-MVLDKRBK.js.map +7 -0
- package/out/replicache/src/deleted-clients.d.ts +20 -0
- package/out/replicache/src/deleted-clients.d.ts.map +1 -0
- package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
- package/out/replicache/src/persist/client-group-gc.d.ts +5 -2
- package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
- package/out/replicache/src/persist/clients.d.ts +0 -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 +1 -1
- package/out/replicache/src/replicache-impl.d.ts.map +1 -1
- package/out/shared/src/queue.d.ts +15 -0
- package/out/shared/src/queue.d.ts.map +1 -1
- package/out/shared/src/queue.js +23 -0
- package/out/shared/src/queue.js.map +1 -1
- package/out/shared/src/resolved-promises.d.ts +4 -0
- package/out/shared/src/resolved-promises.d.ts.map +1 -1
- package/out/shared/src/resolved-promises.js +4 -0
- package/out/shared/src/resolved-promises.js.map +1 -1
- package/out/solid.js +1 -1
- package/out/zero-cache/src/auth/load-schema.d.ts +5 -3
- package/out/zero-cache/src/auth/load-schema.d.ts.map +1 -1
- package/out/zero-cache/src/auth/load-schema.js +19 -13
- package/out/zero-cache/src/auth/load-schema.js.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.d.ts +1 -2
- package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
- package/out/zero-cache/src/auth/write-authorizer.js +5 -4
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/server/multi/config.d.ts +4 -0
- package/out/zero-cache/src/server/multi/config.d.ts.map +1 -1
- package/out/zero-cache/src/server/multi/config.js +4 -0
- package/out/zero-cache/src/server/multi/config.js.map +1 -1
- package/out/zero-cache/src/server/multi/run-worker.d.ts.map +1 -1
- package/out/zero-cache/src/server/multi/run-worker.js +4 -2
- package/out/zero-cache/src/server/multi/run-worker.js.map +1 -1
- package/out/zero-cache/src/server/syncer.d.ts.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/mutagen/mutagen.d.ts +1 -2
- package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
- package/out/zero-cache/src/services/mutagen/mutagen.js +2 -2
- package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +6 -4
- package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/client-handler.js +49 -11
- package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +1 -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 +18 -3
- 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 +8 -8
- package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
- package/out/zero-cache/src/services/view-syncer/cvr.js +14 -16
- package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
- package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +4 -0
- 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 +40 -16
- package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
- package/out/zero-cache/src/types/pg.d.ts +6 -0
- package/out/zero-cache/src/types/pg.d.ts.map +1 -1
- package/out/zero-cache/src/types/pg.js +9 -0
- package/out/zero-cache/src/types/pg.js.map +1 -1
- package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
- package/out/zero-cache/src/workers/connection.js +11 -5
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-client/src/client/delete-clients-manager.d.ts +34 -0
- package/out/zero-client/src/client/delete-clients-manager.d.ts.map +1 -0
- package/out/zero-client/src/client/query-manager.d.ts +1 -1
- package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
- package/out/zero-client/src/client/zero-poke-handler.d.ts +1 -0
- package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
- package/out/zero-client/src/client/zero.d.ts +6 -1
- package/out/zero-client/src/client/zero.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.d.ts +2 -0
- package/out/zero-protocol/src/connect.d.ts.map +1 -1
- package/out/zero-protocol/src/connect.js +1 -0
- package/out/zero-protocol/src/connect.js.map +1 -1
- package/out/zero-protocol/src/down.d.ts +3 -0
- package/out/zero-protocol/src/down.d.ts.map +1 -1
- package/out/zero-protocol/src/down.js +2 -1
- package/out/zero-protocol/src/down.js.map +1 -1
- package/out/zero-protocol/src/poke.d.ts +2 -0
- package/out/zero-protocol/src/poke.d.ts.map +1 -1
- package/out/zero-protocol/src/poke.js +4 -0
- package/out/zero-protocol/src/poke.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 +1 -0
- package/out/zero-protocol/src/up.d.ts.map +1 -1
- package/out/zero-schema/src/builder/schema-builder.d.ts +0 -1
- package/out/zero-schema/src/builder/schema-builder.d.ts.map +1 -1
- package/out/zero-schema/src/builder/schema-builder.js +0 -49
- package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
- package/out/zero-schema/src/mod.d.ts +1 -1
- package/out/zero-schema/src/mod.d.ts.map +1 -1
- package/out/zero-schema/src/permissions.d.ts.map +1 -1
- package/out/zero.js +1 -1
- package/out/zql/src/ivm/join.d.ts.map +1 -1
- package/out/zql/src/ivm/join.js +6 -2
- package/out/zql/src/ivm/join.js.map +1 -1
- package/out/zql/src/query/query-impl.d.ts +2 -2
- package/out/zql/src/query/query-impl.d.ts.map +1 -1
- package/out/zql/src/query/query-impl.js +6 -8
- package/out/zql/src/query/query-impl.js.map +1 -1
- package/out/zql/src/query/{auth-query.d.ts → static-query.d.ts} +7 -3
- package/out/zql/src/query/static-query.d.ts.map +1 -0
- package/out/zql/src/query/{auth-query.js → static-query.js} +9 -5
- package/out/zql/src/query/static-query.js.map +1 -0
- package/package.json +1 -1
- package/out/chunk-FVVIM6TT.js.map +0 -7
- package/out/zql/src/query/auth-query.d.ts.map +0 -1
- package/out/zql/src/query/auth-query.js.map +0 -1
|
@@ -397,6 +397,8 @@ var promiseTrue = Promise.resolve(true);
|
|
|
397
397
|
var promiseFalse = Promise.resolve(false);
|
|
398
398
|
var promiseUndefined = Promise.resolve(void 0);
|
|
399
399
|
var promiseVoid = Promise.resolve();
|
|
400
|
+
var promiseNever = new Promise(() => {
|
|
401
|
+
});
|
|
400
402
|
|
|
401
403
|
// ../replicache/src/frozen-json.ts
|
|
402
404
|
var deepFrozenObjects = /* @__PURE__ */ new WeakSet();
|
|
@@ -723,7 +725,7 @@ var AbortError = class extends Error {
|
|
|
723
725
|
// ../shared/src/sleep.ts
|
|
724
726
|
import { resolver as resolver2 } from "@rocicorp/resolver";
|
|
725
727
|
var promiseVoid2 = Promise.resolve();
|
|
726
|
-
var
|
|
728
|
+
var promiseNever2 = new Promise(() => void 0);
|
|
727
729
|
function sleep(ms, signal) {
|
|
728
730
|
const newAbortError = () => new AbortError("Aborted");
|
|
729
731
|
if (signal?.aborted) {
|
|
@@ -749,7 +751,7 @@ function sleep(ms, signal) {
|
|
|
749
751
|
}
|
|
750
752
|
function sleepWithAbort(ms, signal) {
|
|
751
753
|
if (ms === 0) {
|
|
752
|
-
return [promiseVoid2,
|
|
754
|
+
return [promiseVoid2, promiseNever2];
|
|
753
755
|
}
|
|
754
756
|
const { promise: abortedPromise, resolve: abortedResolve } = resolver2();
|
|
755
757
|
const sleepPromise = new Promise((resolve) => {
|
|
@@ -1416,6 +1418,40 @@ var WriteImpl2 = class extends ReadImpl2 {
|
|
|
1416
1418
|
}
|
|
1417
1419
|
};
|
|
1418
1420
|
|
|
1421
|
+
// ../replicache/src/deleted-clients.ts
|
|
1422
|
+
var DELETED_CLIENTS_HEAD_NAME = "deleted-clients";
|
|
1423
|
+
async function setDeletedClients(dagWrite, deletedClients) {
|
|
1424
|
+
const normalized = normalize(deletedClients);
|
|
1425
|
+
const chunkData = deepFreeze(normalized);
|
|
1426
|
+
const chunk = dagWrite.createChunk(chunkData, []);
|
|
1427
|
+
await dagWrite.putChunk(chunk);
|
|
1428
|
+
await dagWrite.setHead(DELETED_CLIENTS_HEAD_NAME, chunk.hash);
|
|
1429
|
+
return normalized;
|
|
1430
|
+
}
|
|
1431
|
+
var deletedClientsSchema = valita_exports.array(valita_exports.string());
|
|
1432
|
+
async function getDeletedClients(dagRead) {
|
|
1433
|
+
const hash2 = await dagRead.getHead(DELETED_CLIENTS_HEAD_NAME);
|
|
1434
|
+
if (hash2 === void 0) {
|
|
1435
|
+
return [];
|
|
1436
|
+
}
|
|
1437
|
+
const chunk = await dagRead.mustGetChunk(hash2);
|
|
1438
|
+
return parse(chunk.data, deletedClientsSchema);
|
|
1439
|
+
}
|
|
1440
|
+
async function addDeletedClients(dagWrite, clientIDs) {
|
|
1441
|
+
const deletedClients = await getDeletedClients(dagWrite);
|
|
1442
|
+
return setDeletedClients(dagWrite, [...deletedClients, ...clientIDs]);
|
|
1443
|
+
}
|
|
1444
|
+
async function removeDeletedClients(dagWrite, clientIDs) {
|
|
1445
|
+
const deletedClients = await getDeletedClients(dagWrite);
|
|
1446
|
+
const newDeletedClients = deletedClients.filter(
|
|
1447
|
+
(clientID) => !clientIDs.includes(clientID)
|
|
1448
|
+
);
|
|
1449
|
+
return setDeletedClients(dagWrite, newDeletedClients);
|
|
1450
|
+
}
|
|
1451
|
+
function normalize(arr) {
|
|
1452
|
+
return [...new Set(arr)].sort();
|
|
1453
|
+
}
|
|
1454
|
+
|
|
1419
1455
|
// ../replicache/src/format-version-enum.ts
|
|
1420
1456
|
var DD31 = 5;
|
|
1421
1457
|
var V6 = 6;
|
|
@@ -3059,13 +3095,13 @@ var DataNodeImpl = class extends NodeImpl {
|
|
|
3059
3095
|
}
|
|
3060
3096
|
}
|
|
3061
3097
|
};
|
|
3062
|
-
function readonlySplice(
|
|
3063
|
-
const arr =
|
|
3098
|
+
function readonlySplice(array12, start, deleteCount, ...items) {
|
|
3099
|
+
const arr = array12.slice(0, start);
|
|
3064
3100
|
for (let i = 0; i < items.length; i++) {
|
|
3065
3101
|
arr.push(items[i]);
|
|
3066
3102
|
}
|
|
3067
|
-
for (let i = start + deleteCount; i <
|
|
3068
|
-
arr.push(
|
|
3103
|
+
for (let i = start + deleteCount; i < array12.length; i++) {
|
|
3104
|
+
arr.push(array12[i]);
|
|
3069
3105
|
}
|
|
3070
3106
|
return arr;
|
|
3071
3107
|
}
|
|
@@ -5973,7 +6009,8 @@ function gcClients(clientID, dagStore, clientMaxInactiveTime, onClientsDeleted)
|
|
|
5973
6009
|
return clients;
|
|
5974
6010
|
}
|
|
5975
6011
|
await setClients(newClients, dagWrite);
|
|
5976
|
-
|
|
6012
|
+
const normalized = await addDeletedClients(dagWrite, deletedClients);
|
|
6013
|
+
onClientsDeleted(normalized);
|
|
5977
6014
|
return newClients;
|
|
5978
6015
|
});
|
|
5979
6016
|
}
|
|
@@ -5981,11 +6018,11 @@ function gcClients(clientID, dagStore, clientMaxInactiveTime, onClientsDeleted)
|
|
|
5981
6018
|
// ../replicache/src/persist/client-group-gc.ts
|
|
5982
6019
|
var GC_INTERVAL_MS = 5 * 60 * 1e3;
|
|
5983
6020
|
var latestGCUpdate2;
|
|
5984
|
-
function initClientGroupGC(dagStore, lc, signal) {
|
|
6021
|
+
function initClientGroupGC(dagStore, enableMutationRecovery, lc, signal) {
|
|
5985
6022
|
initBgIntervalProcess(
|
|
5986
6023
|
"ClientGroupGC",
|
|
5987
6024
|
() => {
|
|
5988
|
-
latestGCUpdate2 = gcClientGroups(dagStore);
|
|
6025
|
+
latestGCUpdate2 = gcClientGroups(dagStore, enableMutationRecovery);
|
|
5989
6026
|
return latestGCUpdate2;
|
|
5990
6027
|
},
|
|
5991
6028
|
() => GC_INTERVAL_MS,
|
|
@@ -5993,17 +6030,16 @@ function initClientGroupGC(dagStore, lc, signal) {
|
|
|
5993
6030
|
signal
|
|
5994
6031
|
);
|
|
5995
6032
|
}
|
|
5996
|
-
function gcClientGroups(dagStore) {
|
|
6033
|
+
function gcClientGroups(dagStore, enableMutationRecovery) {
|
|
5997
6034
|
return withWrite(dagStore, async (tx) => {
|
|
5998
6035
|
const clients = await getClients(tx);
|
|
5999
6036
|
const clientGroupIDs = /* @__PURE__ */ new Set();
|
|
6000
6037
|
for (const client of clients.values()) {
|
|
6001
|
-
assertClientV6(client);
|
|
6002
6038
|
clientGroupIDs.add(client.clientGroupID);
|
|
6003
6039
|
}
|
|
6004
6040
|
const clientGroups = /* @__PURE__ */ new Map();
|
|
6005
6041
|
for (const [clientGroupID, clientGroup] of await getClientGroups(tx)) {
|
|
6006
|
-
if (clientGroupIDs.has(clientGroupID) || clientGroupHasPendingMutations(clientGroup)) {
|
|
6042
|
+
if (clientGroupIDs.has(clientGroupID) || enableMutationRecovery && clientGroupHasPendingMutations(clientGroup)) {
|
|
6007
6043
|
clientGroups.set(clientGroupID, clientGroup);
|
|
6008
6044
|
}
|
|
6009
6045
|
}
|
|
@@ -7020,14 +7056,14 @@ function diffBinarySearch(diff2, prefix, compareKey) {
|
|
|
7020
7056
|
}
|
|
7021
7057
|
|
|
7022
7058
|
// ../shared/src/random-values.ts
|
|
7023
|
-
function getNonCryptoRandomValues(
|
|
7024
|
-
if (
|
|
7059
|
+
function getNonCryptoRandomValues(array12) {
|
|
7060
|
+
if (array12 === null) {
|
|
7025
7061
|
throw new TypeError("array cannot be null");
|
|
7026
7062
|
}
|
|
7027
|
-
for (let i = 0; i <
|
|
7028
|
-
|
|
7063
|
+
for (let i = 0; i < array12.length; i++) {
|
|
7064
|
+
array12[i] = Math.floor(Math.random() * 256);
|
|
7029
7065
|
}
|
|
7030
|
-
return
|
|
7066
|
+
return array12;
|
|
7031
7067
|
}
|
|
7032
7068
|
|
|
7033
7069
|
// ../replicache/src/sync/request-id.ts
|
|
@@ -7244,8 +7280,7 @@ var ReplicacheImpl = class {
|
|
|
7244
7280
|
enableScheduledRefresh = true,
|
|
7245
7281
|
enablePullAndPushInOpen = true,
|
|
7246
7282
|
enableClientGroupForking = true,
|
|
7247
|
-
onClientsDeleted = (
|
|
7248
|
-
this.#lc.info?.("ClientIDs deleted", clientIDs);
|
|
7283
|
+
onClientsDeleted = () => {
|
|
7249
7284
|
}
|
|
7250
7285
|
} = implOptions;
|
|
7251
7286
|
this.auth = auth ?? "";
|
|
@@ -7389,7 +7424,7 @@ var ReplicacheImpl = class {
|
|
|
7389
7424
|
this.#lc,
|
|
7390
7425
|
signal
|
|
7391
7426
|
);
|
|
7392
|
-
initClientGroupGC(this.perdag, this.#lc, signal);
|
|
7427
|
+
initClientGroupGC(this.perdag, enableMutationRecovery, this.#lc, signal);
|
|
7393
7428
|
initNewClientChannel(
|
|
7394
7429
|
this.name,
|
|
7395
7430
|
this.idbName,
|
|
@@ -8251,11 +8286,14 @@ async function collectIDBDatabases(idbDatabasesStore, now, maxAge, kvDropStore,
|
|
|
8251
8286
|
)
|
|
8252
8287
|
);
|
|
8253
8288
|
const dbNamesToRemove = [];
|
|
8289
|
+
const dbNamesToKeep = [];
|
|
8254
8290
|
const clientIDsToRemove = [];
|
|
8255
8291
|
for (const [dbName, [canCollect, clientIDs]] of collectResults) {
|
|
8256
8292
|
if (canCollect) {
|
|
8257
8293
|
dbNamesToRemove.push(dbName);
|
|
8258
8294
|
clientIDsToRemove.push(...clientIDs);
|
|
8295
|
+
} else {
|
|
8296
|
+
dbNamesToKeep.push(dbName);
|
|
8259
8297
|
}
|
|
8260
8298
|
}
|
|
8261
8299
|
const { errors } = await dropDatabases(
|
|
@@ -8267,7 +8305,15 @@ async function collectIDBDatabases(idbDatabasesStore, now, maxAge, kvDropStore,
|
|
|
8267
8305
|
throw errors[0];
|
|
8268
8306
|
}
|
|
8269
8307
|
if (clientIDsToRemove.length) {
|
|
8270
|
-
|
|
8308
|
+
const toRemoveIncludingOld = clientIDsToRemove;
|
|
8309
|
+
for (const name of dbNamesToKeep) {
|
|
8310
|
+
await withWrite(newDagStore(name), async (dagWrite) => {
|
|
8311
|
+
toRemoveIncludingOld.push(
|
|
8312
|
+
...await addDeletedClients(dagWrite, clientIDsToRemove)
|
|
8313
|
+
);
|
|
8314
|
+
});
|
|
8315
|
+
}
|
|
8316
|
+
onClientsDeleted(normalize(toRemoveIncludingOld));
|
|
8271
8317
|
}
|
|
8272
8318
|
}
|
|
8273
8319
|
async function dropDatabaseInternal(name, idbDatabasesStore, kvDropStore) {
|
|
@@ -8345,7 +8391,8 @@ function canDatabaseBeCollectedAndGetDeletedClientIDs(enableMutationRecovery, pe
|
|
|
8345
8391
|
}
|
|
8346
8392
|
}
|
|
8347
8393
|
const clients = await getClients(read);
|
|
8348
|
-
|
|
8394
|
+
const oldDeletedClients = await getDeletedClients(read);
|
|
8395
|
+
return [true, [...clients.keys(), ...oldDeletedClients]];
|
|
8349
8396
|
});
|
|
8350
8397
|
}
|
|
8351
8398
|
|
|
@@ -8374,87 +8421,6 @@ function one(...args) {
|
|
|
8374
8421
|
}));
|
|
8375
8422
|
}
|
|
8376
8423
|
|
|
8377
|
-
// ../zero-schema/src/name-mapper.ts
|
|
8378
|
-
function clientToServer(tables) {
|
|
8379
|
-
return createMapperFrom("client", tables);
|
|
8380
|
-
}
|
|
8381
|
-
function serverToClient(tables) {
|
|
8382
|
-
return createMapperFrom("server", tables);
|
|
8383
|
-
}
|
|
8384
|
-
function createMapperFrom(src, tables) {
|
|
8385
|
-
const mapping = new Map(
|
|
8386
|
-
Object.entries(tables).map(
|
|
8387
|
-
([tableName, { serverName: serverTableName, columns }]) => {
|
|
8388
|
-
let allColumnsSame = true;
|
|
8389
|
-
const names = {};
|
|
8390
|
-
for (const [name, { serverName }] of Object.entries(columns)) {
|
|
8391
|
-
if (serverName && serverName !== name) {
|
|
8392
|
-
allColumnsSame = false;
|
|
8393
|
-
}
|
|
8394
|
-
if (src === "client") {
|
|
8395
|
-
names[name] = serverName ?? name;
|
|
8396
|
-
} else {
|
|
8397
|
-
names[serverName ?? name] = name;
|
|
8398
|
-
}
|
|
8399
|
-
}
|
|
8400
|
-
return [
|
|
8401
|
-
src === "client" ? tableName : serverTableName ?? tableName,
|
|
8402
|
-
{
|
|
8403
|
-
tableName: src === "client" ? serverTableName ?? tableName : tableName,
|
|
8404
|
-
columns: names,
|
|
8405
|
-
allColumnsSame
|
|
8406
|
-
}
|
|
8407
|
-
];
|
|
8408
|
-
}
|
|
8409
|
-
)
|
|
8410
|
-
);
|
|
8411
|
-
return new NameMapper(mapping);
|
|
8412
|
-
}
|
|
8413
|
-
var NameMapper = class {
|
|
8414
|
-
#tables = /* @__PURE__ */ new Map();
|
|
8415
|
-
constructor(tables) {
|
|
8416
|
-
this.#tables = tables;
|
|
8417
|
-
}
|
|
8418
|
-
#getTable(src, ctx) {
|
|
8419
|
-
const table2 = this.#tables.get(src);
|
|
8420
|
-
if (!table2) {
|
|
8421
|
-
throw new Error(
|
|
8422
|
-
`unknown table "${src}" ${!ctx ? "" : `in ${JSON.stringify(ctx)}`}`
|
|
8423
|
-
);
|
|
8424
|
-
}
|
|
8425
|
-
return table2;
|
|
8426
|
-
}
|
|
8427
|
-
tableName(src, context) {
|
|
8428
|
-
return this.#getTable(src, context).tableName;
|
|
8429
|
-
}
|
|
8430
|
-
columnName(table2, src, ctx) {
|
|
8431
|
-
const dst = this.#getTable(table2, ctx).columns[src];
|
|
8432
|
-
if (!dst) {
|
|
8433
|
-
throw new Error(
|
|
8434
|
-
`unknown column "${src}" of "${table2}" table ${!ctx ? "" : `in ${JSON.stringify(ctx)}`}`
|
|
8435
|
-
);
|
|
8436
|
-
}
|
|
8437
|
-
return dst;
|
|
8438
|
-
}
|
|
8439
|
-
row(table2, row) {
|
|
8440
|
-
const dest = this.#getTable(table2);
|
|
8441
|
-
const { allColumnsSame, columns } = dest;
|
|
8442
|
-
if (allColumnsSame) {
|
|
8443
|
-
return row;
|
|
8444
|
-
}
|
|
8445
|
-
const clientRow = {};
|
|
8446
|
-
for (const col in row) {
|
|
8447
|
-
clientRow[columns[col] ?? col] = row[col];
|
|
8448
|
-
}
|
|
8449
|
-
return clientRow;
|
|
8450
|
-
}
|
|
8451
|
-
columns(table2, cols) {
|
|
8452
|
-
const dest = this.#getTable(table2);
|
|
8453
|
-
const { allColumnsSame, columns } = dest;
|
|
8454
|
-
return cols === void 0 || allColumnsSame ? cols : cols.map((col) => columns[col] ?? col);
|
|
8455
|
-
}
|
|
8456
|
-
};
|
|
8457
|
-
|
|
8458
8424
|
// ../zero-schema/src/builder/table-builder.ts
|
|
8459
8425
|
function table(name) {
|
|
8460
8426
|
return new TableBuilder({
|
|
@@ -8463,7 +8429,7 @@ function table(name) {
|
|
|
8463
8429
|
primaryKey: []
|
|
8464
8430
|
});
|
|
8465
8431
|
}
|
|
8466
|
-
function
|
|
8432
|
+
function string8() {
|
|
8467
8433
|
return new ColumnBuilder({
|
|
8468
8434
|
type: "string",
|
|
8469
8435
|
optional: false,
|
|
@@ -9113,8 +9079,8 @@ var negateOperatorMap = {
|
|
|
9113
9079
|
function negateOperator(op) {
|
|
9114
9080
|
return must(negateOperatorMap[op]);
|
|
9115
9081
|
}
|
|
9116
|
-
function filterUndefined(
|
|
9117
|
-
return
|
|
9082
|
+
function filterUndefined(array12) {
|
|
9083
|
+
return array12.filter((e) => e !== void 0);
|
|
9118
9084
|
}
|
|
9119
9085
|
function filterTrue(conditions) {
|
|
9120
9086
|
return conditions.filter((c) => !isAlwaysTrue(c));
|
|
@@ -9619,11 +9585,11 @@ var Join = class {
|
|
|
9619
9585
|
const childSchema = child.getSchema();
|
|
9620
9586
|
this.#schema = {
|
|
9621
9587
|
...parentSchema,
|
|
9622
|
-
isHidden: hidden,
|
|
9623
9588
|
relationships: {
|
|
9624
9589
|
...parentSchema.relationships,
|
|
9625
9590
|
[relationshipName]: {
|
|
9626
9591
|
...childSchema,
|
|
9592
|
+
isHidden: hidden,
|
|
9627
9593
|
system
|
|
9628
9594
|
}
|
|
9629
9595
|
}
|
|
@@ -9686,7 +9652,15 @@ var Join = class {
|
|
|
9686
9652
|
});
|
|
9687
9653
|
break;
|
|
9688
9654
|
case "child":
|
|
9689
|
-
this.#output.push(
|
|
9655
|
+
this.#output.push({
|
|
9656
|
+
type: "child",
|
|
9657
|
+
node: this.#processParentNode(
|
|
9658
|
+
change.node.row,
|
|
9659
|
+
change.node.relationships,
|
|
9660
|
+
"fetch"
|
|
9661
|
+
),
|
|
9662
|
+
child: change.child
|
|
9663
|
+
});
|
|
9690
9664
|
break;
|
|
9691
9665
|
case "edit": {
|
|
9692
9666
|
if (rowEqualsForCompoundKey(
|
|
@@ -11009,6 +10983,7 @@ function unwrap(c) {
|
|
|
11009
10983
|
}
|
|
11010
10984
|
|
|
11011
10985
|
// ../zql/src/query/query-impl.ts
|
|
10986
|
+
var astForTestingSymbol = Symbol();
|
|
11012
10987
|
function newQuery(delegate, schema, table2) {
|
|
11013
10988
|
return new QueryImpl(delegate, schema, table2);
|
|
11014
10989
|
}
|
|
@@ -11039,6 +11014,10 @@ var AbstractQuery = class {
|
|
|
11039
11014
|
get format() {
|
|
11040
11015
|
return this.#format;
|
|
11041
11016
|
}
|
|
11017
|
+
// Not part of Query or QueryInternal interface
|
|
11018
|
+
get [astForTestingSymbol]() {
|
|
11019
|
+
return this.#ast;
|
|
11020
|
+
}
|
|
11042
11021
|
hash() {
|
|
11043
11022
|
if (!this.#hash) {
|
|
11044
11023
|
const ast = this._completeAst();
|
|
@@ -11166,6 +11145,7 @@ var AbstractQuery = class {
|
|
|
11166
11145
|
parentField: firstRelation.sourceField,
|
|
11167
11146
|
childField: firstRelation.destField
|
|
11168
11147
|
},
|
|
11148
|
+
hidden: true,
|
|
11169
11149
|
subquery: {
|
|
11170
11150
|
table: junctionSchema,
|
|
11171
11151
|
alias: relationship,
|
|
@@ -11180,7 +11160,6 @@ var AbstractQuery = class {
|
|
|
11180
11160
|
parentField: secondRelation.sourceField,
|
|
11181
11161
|
childField: secondRelation.destField
|
|
11182
11162
|
},
|
|
11183
|
-
hidden: true,
|
|
11184
11163
|
subquery: addPrimaryKeysToAst(
|
|
11185
11164
|
this.#schema.tables[destSchema],
|
|
11186
11165
|
sq.#ast
|
|
@@ -11393,21 +11372,14 @@ var AbstractQuery = class {
|
|
|
11393
11372
|
return this.#completedAST;
|
|
11394
11373
|
}
|
|
11395
11374
|
};
|
|
11396
|
-
var astForTestingSymbol = Symbol();
|
|
11397
11375
|
var completedAstSymbol = Symbol();
|
|
11398
11376
|
var QueryImpl = class extends AbstractQuery {
|
|
11399
11377
|
#delegate;
|
|
11400
|
-
#ast;
|
|
11401
11378
|
constructor(delegate, schema, tableName, ast = { table: tableName }, format) {
|
|
11402
11379
|
super(schema, tableName, ast, format);
|
|
11403
11380
|
this.#delegate = delegate;
|
|
11404
|
-
this.#ast = ast;
|
|
11405
11381
|
}
|
|
11406
11382
|
_system = "client";
|
|
11407
|
-
// Not part of Query or QueryInternal interface
|
|
11408
|
-
get [astForTestingSymbol]() {
|
|
11409
|
-
return this.#ast;
|
|
11410
|
-
}
|
|
11411
11383
|
get [completedAstSymbol]() {
|
|
11412
11384
|
return this._completeAst();
|
|
11413
11385
|
}
|
|
@@ -11498,8 +11470,8 @@ function isCompoundKey(field) {
|
|
|
11498
11470
|
return Array.isArray(field) && field.length >= 1;
|
|
11499
11471
|
}
|
|
11500
11472
|
|
|
11501
|
-
// ../zql/src/query/
|
|
11502
|
-
var
|
|
11473
|
+
// ../zql/src/query/static-query.ts
|
|
11474
|
+
var StaticQuery = class _StaticQuery extends AbstractQuery {
|
|
11503
11475
|
constructor(schema, tableName, ast = { table: tableName }, format) {
|
|
11504
11476
|
super(schema, tableName, ast, format);
|
|
11505
11477
|
}
|
|
@@ -11508,7 +11480,7 @@ var AuthQuery = class _AuthQuery extends AbstractQuery {
|
|
|
11508
11480
|
}
|
|
11509
11481
|
_system = "permissions";
|
|
11510
11482
|
_newQuery(schema, tableName, ast, format) {
|
|
11511
|
-
return new
|
|
11483
|
+
return new _StaticQuery(schema, tableName, ast, format);
|
|
11512
11484
|
}
|
|
11513
11485
|
get ast() {
|
|
11514
11486
|
return this._completeAst();
|
|
@@ -11524,13 +11496,97 @@ var AuthQuery = class _AuthQuery extends AbstractQuery {
|
|
|
11524
11496
|
}
|
|
11525
11497
|
};
|
|
11526
11498
|
|
|
11499
|
+
// ../zero-schema/src/name-mapper.ts
|
|
11500
|
+
function clientToServer(tables) {
|
|
11501
|
+
return createMapperFrom("client", tables);
|
|
11502
|
+
}
|
|
11503
|
+
function serverToClient(tables) {
|
|
11504
|
+
return createMapperFrom("server", tables);
|
|
11505
|
+
}
|
|
11506
|
+
function createMapperFrom(src, tables) {
|
|
11507
|
+
const mapping = new Map(
|
|
11508
|
+
Object.entries(tables).map(
|
|
11509
|
+
([tableName, { serverName: serverTableName, columns }]) => {
|
|
11510
|
+
let allColumnsSame = true;
|
|
11511
|
+
const names = {};
|
|
11512
|
+
for (const [name, { serverName }] of Object.entries(columns)) {
|
|
11513
|
+
if (serverName && serverName !== name) {
|
|
11514
|
+
allColumnsSame = false;
|
|
11515
|
+
}
|
|
11516
|
+
if (src === "client") {
|
|
11517
|
+
names[name] = serverName ?? name;
|
|
11518
|
+
} else {
|
|
11519
|
+
names[serverName ?? name] = name;
|
|
11520
|
+
}
|
|
11521
|
+
}
|
|
11522
|
+
return [
|
|
11523
|
+
src === "client" ? tableName : serverTableName ?? tableName,
|
|
11524
|
+
{
|
|
11525
|
+
tableName: src === "client" ? serverTableName ?? tableName : tableName,
|
|
11526
|
+
columns: names,
|
|
11527
|
+
allColumnsSame
|
|
11528
|
+
}
|
|
11529
|
+
];
|
|
11530
|
+
}
|
|
11531
|
+
)
|
|
11532
|
+
);
|
|
11533
|
+
return new NameMapper(mapping);
|
|
11534
|
+
}
|
|
11535
|
+
var NameMapper = class {
|
|
11536
|
+
#tables = /* @__PURE__ */ new Map();
|
|
11537
|
+
constructor(tables) {
|
|
11538
|
+
this.#tables = tables;
|
|
11539
|
+
}
|
|
11540
|
+
#getTable(src, ctx) {
|
|
11541
|
+
const table2 = this.#tables.get(src);
|
|
11542
|
+
if (!table2) {
|
|
11543
|
+
throw new Error(
|
|
11544
|
+
`unknown table "${src}" ${!ctx ? "" : `in ${JSON.stringify(ctx)}`}`
|
|
11545
|
+
);
|
|
11546
|
+
}
|
|
11547
|
+
return table2;
|
|
11548
|
+
}
|
|
11549
|
+
tableName(src, context) {
|
|
11550
|
+
return this.#getTable(src, context).tableName;
|
|
11551
|
+
}
|
|
11552
|
+
columnName(table2, src, ctx) {
|
|
11553
|
+
const dst = this.#getTable(table2, ctx).columns[src];
|
|
11554
|
+
if (!dst) {
|
|
11555
|
+
throw new Error(
|
|
11556
|
+
`unknown column "${src}" of "${table2}" table ${!ctx ? "" : `in ${JSON.stringify(ctx)}`}`
|
|
11557
|
+
);
|
|
11558
|
+
}
|
|
11559
|
+
return dst;
|
|
11560
|
+
}
|
|
11561
|
+
row(table2, row) {
|
|
11562
|
+
const dest = this.#getTable(table2);
|
|
11563
|
+
const { allColumnsSame, columns } = dest;
|
|
11564
|
+
if (allColumnsSame) {
|
|
11565
|
+
return row;
|
|
11566
|
+
}
|
|
11567
|
+
const clientRow = {};
|
|
11568
|
+
for (const col in row) {
|
|
11569
|
+
clientRow[columns[col] ?? col] = row[col];
|
|
11570
|
+
}
|
|
11571
|
+
return clientRow;
|
|
11572
|
+
}
|
|
11573
|
+
columns(table2, cols) {
|
|
11574
|
+
const dest = this.#getTable(table2);
|
|
11575
|
+
const { allColumnsSame, columns } = dest;
|
|
11576
|
+
return cols === void 0 || allColumnsSame ? cols : cols.map((col) => columns[col] ?? col);
|
|
11577
|
+
}
|
|
11578
|
+
};
|
|
11579
|
+
|
|
11527
11580
|
// ../zero-schema/src/permissions.ts
|
|
11528
11581
|
var ANYONE_CAN = void 0;
|
|
11529
11582
|
var NOBODY_CAN = [];
|
|
11530
11583
|
async function definePermissions(schema, definer) {
|
|
11531
11584
|
const expressionBuilders = {};
|
|
11532
11585
|
for (const name of Object.keys(schema.tables)) {
|
|
11533
|
-
expressionBuilders[name] = new
|
|
11586
|
+
expressionBuilders[name] = new StaticQuery(
|
|
11587
|
+
schema,
|
|
11588
|
+
name
|
|
11589
|
+
).expressionBuilder();
|
|
11534
11590
|
}
|
|
11535
11591
|
const config = await definer();
|
|
11536
11592
|
return compilePermissions(schema, config, expressionBuilders);
|
|
@@ -11720,7 +11776,8 @@ var connectedMessageSchema = valita_exports.tuple([
|
|
|
11720
11776
|
connectedBodySchema
|
|
11721
11777
|
]);
|
|
11722
11778
|
var initConnectionBodySchema = valita_exports.object({
|
|
11723
|
-
desiredQueriesPatch: queriesPatchSchema
|
|
11779
|
+
desiredQueriesPatch: queriesPatchSchema,
|
|
11780
|
+
deletedClients: valita_exports.array(valita_exports.string()).optional()
|
|
11724
11781
|
});
|
|
11725
11782
|
var initConnectionMessageSchema = valita_exports.tuple([
|
|
11726
11783
|
valita_exports.literal("initConnection"),
|
|
@@ -11734,6 +11791,15 @@ function encodeSecProtocols(initConnectionMessage, authToken) {
|
|
|
11734
11791
|
return encodeURIComponent(btoa(JSON.stringify(protocols)));
|
|
11735
11792
|
}
|
|
11736
11793
|
|
|
11794
|
+
// ../zero-protocol/src/delete-clients.ts
|
|
11795
|
+
var deleteClientsBodySchema = valita_exports.object({
|
|
11796
|
+
clientIDs: valita_exports.array(valita_exports.string())
|
|
11797
|
+
});
|
|
11798
|
+
var deleteClientsMessageSchema = valita_exports.tuple([
|
|
11799
|
+
valita_exports.literal("deleteClients"),
|
|
11800
|
+
deleteClientsBodySchema
|
|
11801
|
+
]);
|
|
11802
|
+
|
|
11737
11803
|
// ../zero-protocol/src/error-kind-enum.ts
|
|
11738
11804
|
var AuthInvalidated = "AuthInvalidated";
|
|
11739
11805
|
var ClientNotFound = "ClientNotFound";
|
|
@@ -11895,6 +11961,10 @@ var pokePartBodySchema = valita_exports.object({
|
|
|
11895
11961
|
});
|
|
11896
11962
|
var pokeEndBodySchema = valita_exports.object({
|
|
11897
11963
|
pokeID: valita_exports.string(),
|
|
11964
|
+
// If present, this should be the cookie stored with the client,
|
|
11965
|
+
// instead of the cookie presented in pokeStart.
|
|
11966
|
+
// TODO: Consider making this required and removing it from pokeStart.
|
|
11967
|
+
cookie: versionSchema.optional(),
|
|
11898
11968
|
// If `true`, the poke with id `pokeID` should be discarded without
|
|
11899
11969
|
// applying it.
|
|
11900
11970
|
cancel: valita_exports.boolean().optional()
|
|
@@ -11954,7 +12024,8 @@ var downstreamSchema = valita_exports.union(
|
|
|
11954
12024
|
pokeStartMessageSchema,
|
|
11955
12025
|
pokePartMessageSchema,
|
|
11956
12026
|
pokeEndMessageSchema,
|
|
11957
|
-
pullResponseMessageSchema
|
|
12027
|
+
pullResponseMessageSchema,
|
|
12028
|
+
deleteClientsMessageSchema
|
|
11958
12029
|
);
|
|
11959
12030
|
|
|
11960
12031
|
// ../zero-protocol/src/mutation-type-enum.ts
|
|
@@ -11962,7 +12033,7 @@ var CRUD = "crud";
|
|
|
11962
12033
|
var Custom = "custom";
|
|
11963
12034
|
|
|
11964
12035
|
// ../zero-protocol/src/protocol-version.ts
|
|
11965
|
-
var PROTOCOL_VERSION =
|
|
12036
|
+
var PROTOCOL_VERSION = 5;
|
|
11966
12037
|
var MIN_SERVER_SUPPORTED_PROTOCOL_VERSION = 2;
|
|
11967
12038
|
assert(MIN_SERVER_SUPPORTED_PROTOCOL_VERSION < PROTOCOL_VERSION);
|
|
11968
12039
|
|
|
@@ -13630,6 +13701,53 @@ function makeTableCRUD(schema, tableName, tx, ivmBranch) {
|
|
|
13630
13701
|
};
|
|
13631
13702
|
}
|
|
13632
13703
|
|
|
13704
|
+
// ../zero-client/src/client/delete-clients-manager.ts
|
|
13705
|
+
var DeleteClientsManager = class {
|
|
13706
|
+
#send;
|
|
13707
|
+
#lc;
|
|
13708
|
+
#dagStore;
|
|
13709
|
+
constructor(send2, dagStore, lc) {
|
|
13710
|
+
this.#send = send2;
|
|
13711
|
+
this.#dagStore = dagStore;
|
|
13712
|
+
this.#lc = lc;
|
|
13713
|
+
}
|
|
13714
|
+
/**
|
|
13715
|
+
* This gets called by Replicache when it deletes clients from the persistent
|
|
13716
|
+
* storage.
|
|
13717
|
+
*/
|
|
13718
|
+
onClientsDeleted(clientIDs) {
|
|
13719
|
+
this.#lc.debug?.("DeletedClientsManager, send:", clientIDs);
|
|
13720
|
+
this.#send(["deleteClients", { clientIDs }]);
|
|
13721
|
+
}
|
|
13722
|
+
/**
|
|
13723
|
+
* Zero calls this after it connects to ensure that the server knows about all
|
|
13724
|
+
* the clients that might have been deleted locally since the last connection.
|
|
13725
|
+
*/
|
|
13726
|
+
async sendDeletedClientsToServer() {
|
|
13727
|
+
const deletedClients = await withRead(
|
|
13728
|
+
this.#dagStore,
|
|
13729
|
+
(dagRead) => getDeletedClients(dagRead)
|
|
13730
|
+
);
|
|
13731
|
+
if (deletedClients.length > 0) {
|
|
13732
|
+
this.#send(["deleteClients", { clientIDs: deletedClients }]);
|
|
13733
|
+
this.#lc.debug?.("DeletedClientsManager, send:", deletedClients);
|
|
13734
|
+
}
|
|
13735
|
+
}
|
|
13736
|
+
/**
|
|
13737
|
+
* This is called as a response to the server telling us which clients it
|
|
13738
|
+
* actually deleted.
|
|
13739
|
+
*/
|
|
13740
|
+
clientsDeletedOnServer(clientIDs) {
|
|
13741
|
+
return withWrite(this.#dagStore, async (dagWrite) => {
|
|
13742
|
+
this.#lc.debug?.("clientsDeletedOnServer:", clientIDs);
|
|
13743
|
+
await removeDeletedClients(dagWrite, clientIDs);
|
|
13744
|
+
});
|
|
13745
|
+
}
|
|
13746
|
+
getDeletedClients() {
|
|
13747
|
+
return withRead(this.#dagStore, getDeletedClients);
|
|
13748
|
+
}
|
|
13749
|
+
};
|
|
13750
|
+
|
|
13633
13751
|
// ../zero-client/src/client/enable-analytics.ts
|
|
13634
13752
|
var IPV4_ADDRESS_REGEX = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
|
13635
13753
|
var IPV6_ADDRESS_HOSTNAME_REGEX = /^\[[a-fA-F0-9:]*:[a-fA-F0-9:]*\]$/;
|
|
@@ -13878,7 +13996,7 @@ function makeMessage(message, context, logLevel) {
|
|
|
13878
13996
|
}
|
|
13879
13997
|
|
|
13880
13998
|
// ../zero-client/src/client/version.ts
|
|
13881
|
-
var version2 = "0.
|
|
13999
|
+
var version2 = "0.14.2025021001";
|
|
13882
14000
|
|
|
13883
14001
|
// ../zero-client/src/client/log-options.ts
|
|
13884
14002
|
var LevelFilterLogSink = class {
|
|
@@ -14568,7 +14686,7 @@ var PokeHandler = class {
|
|
|
14568
14686
|
this.#receivingPoke = void 0;
|
|
14569
14687
|
return;
|
|
14570
14688
|
}
|
|
14571
|
-
this.#pokeBuffer.push(this.#receivingPoke);
|
|
14689
|
+
this.#pokeBuffer.push({ ...this.#receivingPoke, pokeEnd });
|
|
14572
14690
|
this.#receivingPoke = void 0;
|
|
14573
14691
|
if (!this.#pokePlaybackLoopRunning) {
|
|
14574
14692
|
this.#startPlaybackLoop();
|
|
@@ -14644,7 +14762,8 @@ function mergePokes(pokeBuffer, schema, serverToClient2) {
|
|
|
14644
14762
|
return void 0;
|
|
14645
14763
|
}
|
|
14646
14764
|
const { baseCookie } = pokeBuffer[0].pokeStart;
|
|
14647
|
-
const
|
|
14765
|
+
const lastPoke = pokeBuffer[pokeBuffer.length - 1];
|
|
14766
|
+
const cookie = lastPoke.pokeEnd.cookie ?? lastPoke.pokeStart.cookie;
|
|
14648
14767
|
const mergedPatch = [];
|
|
14649
14768
|
const mergedLastMutationIDChanges = {};
|
|
14650
14769
|
let prevPokeStart = void 0;
|
|
@@ -14850,6 +14969,7 @@ var Zero = class {
|
|
|
14850
14969
|
#queryManager;
|
|
14851
14970
|
#ivmSources;
|
|
14852
14971
|
#clientToServer;
|
|
14972
|
+
#deleteClientsManager;
|
|
14853
14973
|
/**
|
|
14854
14974
|
* The queries we sent when inside the sec-protocol header when establishing a connection.
|
|
14855
14975
|
* More queries could be registered while we're waiting for the 'connected' message
|
|
@@ -14860,6 +14980,12 @@ var Zero = class {
|
|
|
14860
14980
|
* and an `initConnection` message must be sent to the server after receiving the `connected` message.
|
|
14861
14981
|
*/
|
|
14862
14982
|
#initConnectionQueries;
|
|
14983
|
+
/**
|
|
14984
|
+
* We try to send the deleted clients as part of the sec-protocol header. If we can't
|
|
14985
|
+
* because the header would get to long we keep track of the deleted clients and send
|
|
14986
|
+
* them after the connection is established.
|
|
14987
|
+
*/
|
|
14988
|
+
#deletedClients;
|
|
14863
14989
|
#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
|
|
14864
14990
|
#onPong = () => void 0;
|
|
14865
14991
|
#online = false;
|
|
@@ -14995,7 +15121,8 @@ var Zero = class {
|
|
|
14995
15121
|
};
|
|
14996
15122
|
const replicacheImplOptions = {
|
|
14997
15123
|
enableClientGroupForking: false,
|
|
14998
|
-
enableMutationRecovery: false
|
|
15124
|
+
enableMutationRecovery: false,
|
|
15125
|
+
onClientsDeleted: (clientIDs) => this.#deleteClientsManager.onClientsDeleted(clientIDs)
|
|
14999
15126
|
};
|
|
15000
15127
|
const rep = new ReplicacheImpl(replicacheOptions, replicacheImplOptions);
|
|
15001
15128
|
this.#rep = rep;
|
|
@@ -15054,6 +15181,11 @@ var Zero = class {
|
|
|
15054
15181
|
maxRecentQueries
|
|
15055
15182
|
);
|
|
15056
15183
|
this.#clientToServer = clientToServer(schema.tables);
|
|
15184
|
+
this.#deleteClientsManager = new DeleteClientsManager(
|
|
15185
|
+
(msg) => this.#send(msg),
|
|
15186
|
+
rep.perdag,
|
|
15187
|
+
this.#lc
|
|
15188
|
+
);
|
|
15057
15189
|
this.#zeroContext = new ZeroContext(
|
|
15058
15190
|
this.#ivmSources.main,
|
|
15059
15191
|
(ast, gotCallback) => this.#queryManager.add(ast, gotCallback),
|
|
@@ -15104,6 +15236,9 @@ var Zero = class {
|
|
|
15104
15236
|
}
|
|
15105
15237
|
}
|
|
15106
15238
|
#sendChangeDesiredQueries(msg) {
|
|
15239
|
+
this.#send(msg);
|
|
15240
|
+
}
|
|
15241
|
+
#send(msg) {
|
|
15107
15242
|
if (this.#socket && this.#connectionState === Connected) {
|
|
15108
15243
|
send(this.#socket, msg);
|
|
15109
15244
|
}
|
|
@@ -15250,6 +15385,10 @@ var Zero = class {
|
|
|
15250
15385
|
return this.#handlePullResponse(lc, downMessage);
|
|
15251
15386
|
case "warm":
|
|
15252
15387
|
break;
|
|
15388
|
+
case "deleteClients":
|
|
15389
|
+
return this.#deleteClientsManager.clientsDeletedOnServer(
|
|
15390
|
+
downMessage[1].clientIDs
|
|
15391
|
+
);
|
|
15253
15392
|
default:
|
|
15254
15393
|
msgType;
|
|
15255
15394
|
rejectInvalidMessage();
|
|
@@ -15320,8 +15459,8 @@ var Zero = class {
|
|
|
15320
15459
|
this.#metrics.lastConnectError.clear();
|
|
15321
15460
|
const proceedingConnectErrorCount = this.#connectErrorCount;
|
|
15322
15461
|
this.#connectErrorCount = 0;
|
|
15323
|
-
let timeToConnectMs
|
|
15324
|
-
let connectMsgLatencyMs
|
|
15462
|
+
let timeToConnectMs;
|
|
15463
|
+
let connectMsgLatencyMs;
|
|
15325
15464
|
if (this.#connectStart === void 0) {
|
|
15326
15465
|
lc.error?.(
|
|
15327
15466
|
"Got connected message but connect start time is undefined. This should not happen."
|
|
@@ -15332,7 +15471,7 @@ var Zero = class {
|
|
|
15332
15471
|
connectMsgLatencyMs = connectBody.timestamp !== void 0 ? now - connectBody.timestamp : void 0;
|
|
15333
15472
|
this.#connectStart = void 0;
|
|
15334
15473
|
}
|
|
15335
|
-
let totalTimeToConnectMs
|
|
15474
|
+
let totalTimeToConnectMs;
|
|
15336
15475
|
if (this.#totalToConnectStart === void 0) {
|
|
15337
15476
|
lc.error?.(
|
|
15338
15477
|
"Got connected message but total to connect start time is undefined. This should not happen."
|
|
@@ -15352,26 +15491,38 @@ var Zero = class {
|
|
|
15352
15491
|
});
|
|
15353
15492
|
this.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
|
|
15354
15493
|
lc.debug?.("Resolving connect resolver");
|
|
15355
|
-
|
|
15494
|
+
const socket = must(this.#socket);
|
|
15356
15495
|
const queriesPatch = await this.#rep.query(
|
|
15357
15496
|
(tx) => this.#queryManager.getQueriesPatch(tx, this.#initConnectionQueries)
|
|
15358
15497
|
);
|
|
15498
|
+
const maybeSendDeletedClients = () => {
|
|
15499
|
+
if (this.#deletedClients) {
|
|
15500
|
+
if (this.#deletedClients.length > 0) {
|
|
15501
|
+
send(socket, ["deleteClients", { clientIDs: this.#deletedClients }]);
|
|
15502
|
+
}
|
|
15503
|
+
this.#deletedClients = void 0;
|
|
15504
|
+
}
|
|
15505
|
+
};
|
|
15359
15506
|
if (queriesPatch.size > 0 && this.#initConnectionQueries !== void 0) {
|
|
15360
|
-
|
|
15507
|
+
maybeSendDeletedClients();
|
|
15508
|
+
send(socket, [
|
|
15361
15509
|
"changeDesiredQueries",
|
|
15362
15510
|
{
|
|
15363
15511
|
desiredQueriesPatch: [...queriesPatch.values()]
|
|
15364
15512
|
}
|
|
15365
15513
|
]);
|
|
15366
15514
|
} else if (this.#initConnectionQueries === void 0) {
|
|
15367
|
-
send(
|
|
15515
|
+
send(socket, [
|
|
15368
15516
|
"initConnection",
|
|
15369
15517
|
{
|
|
15370
|
-
desiredQueriesPatch: [...queriesPatch.values()]
|
|
15518
|
+
desiredQueriesPatch: [...queriesPatch.values()],
|
|
15519
|
+
deletedClients: this.#deletedClients && this.#deletedClients.length > 0 ? this.#deletedClients : void 0
|
|
15371
15520
|
}
|
|
15372
15521
|
]);
|
|
15522
|
+
this.#deletedClients = void 0;
|
|
15373
15523
|
}
|
|
15374
15524
|
this.#initConnectionQueries = void 0;
|
|
15525
|
+
maybeSendDeletedClients();
|
|
15375
15526
|
this.#setConnectionState(Connected);
|
|
15376
15527
|
this.#connectResolver.resolve();
|
|
15377
15528
|
}
|
|
@@ -15425,9 +15576,10 @@ var Zero = class {
|
|
|
15425
15576
|
clearTimeout(timeoutID);
|
|
15426
15577
|
};
|
|
15427
15578
|
this.#closeAbortController.signal.addEventListener("abort", abortHandler);
|
|
15428
|
-
const [ws, initConnectionQueries] = await createSocket(
|
|
15579
|
+
const [ws, initConnectionQueries, deletedClients] = await createSocket(
|
|
15429
15580
|
this.#rep,
|
|
15430
15581
|
this.#queryManager,
|
|
15582
|
+
this.#deleteClientsManager,
|
|
15431
15583
|
toWSString(this.#server),
|
|
15432
15584
|
this.#connectCookie,
|
|
15433
15585
|
this.clientID,
|
|
@@ -15446,6 +15598,7 @@ var Zero = class {
|
|
|
15446
15598
|
return;
|
|
15447
15599
|
}
|
|
15448
15600
|
this.#initConnectionQueries = initConnectionQueries;
|
|
15601
|
+
this.#deletedClients = deletedClients;
|
|
15449
15602
|
ws.addEventListener("message", this.#onMessage);
|
|
15450
15603
|
ws.addEventListener("open", this.#onOpen);
|
|
15451
15604
|
ws.addEventListener("close", this.#onClose);
|
|
@@ -15901,7 +16054,7 @@ var Zero = class {
|
|
|
15901
16054
|
return rv;
|
|
15902
16055
|
}
|
|
15903
16056
|
};
|
|
15904
|
-
async function createSocket(rep, queryManager, socketOrigin, baseCookie, clientID, clientGroupID, schemaVersion, userID, auth, lmid, wsid, debugPerf, lc, maxHeaderLength = 1024 * 8, additionalConnectParams) {
|
|
16057
|
+
async function createSocket(rep, queryManager, deleteClientsManager, socketOrigin, baseCookie, clientID, clientGroupID, schemaVersion, userID, auth, lmid, wsid, debugPerf, lc, maxHeaderLength = 1024 * 8, additionalConnectParams) {
|
|
15905
16058
|
const url = new URL(
|
|
15906
16059
|
appendPath(socketOrigin, `/sync/v${PROTOCOL_VERSION}/connect`)
|
|
15907
16060
|
);
|
|
@@ -15928,16 +16081,24 @@ async function createSocket(rep, queryManager, socketOrigin, baseCookie, clientI
|
|
|
15928
16081
|
}
|
|
15929
16082
|
lc.info?.("Connecting to", url.toString());
|
|
15930
16083
|
const WS = mustGetBrowserGlobal("WebSocket");
|
|
15931
|
-
|
|
15932
|
-
|
|
15933
|
-
|
|
16084
|
+
const queriesPatchP = rep.query((tx) => queryManager.getQueriesPatch(tx));
|
|
16085
|
+
let deletedClients = await deleteClientsManager.getDeletedClients();
|
|
16086
|
+
let queriesPatch = await queriesPatchP;
|
|
15934
16087
|
let secProtocol = encodeSecProtocols(
|
|
15935
|
-
[
|
|
16088
|
+
[
|
|
16089
|
+
"initConnection",
|
|
16090
|
+
{
|
|
16091
|
+
desiredQueriesPatch: [...queriesPatch.values()],
|
|
16092
|
+
deletedClients: deletedClients.length > 0 ? deletedClients : void 0
|
|
16093
|
+
}
|
|
16094
|
+
],
|
|
15936
16095
|
auth
|
|
15937
16096
|
);
|
|
15938
16097
|
if (secProtocol.length > maxHeaderLength) {
|
|
15939
16098
|
secProtocol = encodeSecProtocols(void 0, auth);
|
|
15940
16099
|
queriesPatch = void 0;
|
|
16100
|
+
} else {
|
|
16101
|
+
deletedClients = void 0;
|
|
15941
16102
|
}
|
|
15942
16103
|
return [
|
|
15943
16104
|
new WS(
|
|
@@ -15945,7 +16106,8 @@ async function createSocket(rep, queryManager, socketOrigin, baseCookie, clientI
|
|
|
15945
16106
|
url.toString(),
|
|
15946
16107
|
secProtocol
|
|
15947
16108
|
),
|
|
15948
|
-
queriesPatch
|
|
16109
|
+
queriesPatch,
|
|
16110
|
+
deletedClients
|
|
15949
16111
|
];
|
|
15950
16112
|
}
|
|
15951
16113
|
function addWebSocketIDFromSocketToLogContext({ url }, lc) {
|
|
@@ -15978,7 +16140,7 @@ export {
|
|
|
15978
16140
|
dropAllDatabases,
|
|
15979
16141
|
relationships,
|
|
15980
16142
|
table,
|
|
15981
|
-
|
|
16143
|
+
string8 as string,
|
|
15982
16144
|
number4 as number,
|
|
15983
16145
|
boolean3 as boolean,
|
|
15984
16146
|
json,
|
|
@@ -15990,4 +16152,4 @@ export {
|
|
|
15990
16152
|
escapeLike,
|
|
15991
16153
|
Zero
|
|
15992
16154
|
};
|
|
15993
|
-
//# sourceMappingURL=chunk-
|
|
16155
|
+
//# sourceMappingURL=chunk-MVLDKRBK.js.map
|