@rocicorp/zero 0.14.2025020701 → 0.14.2025021100
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-V54OEPTV.js → chunk-OPWNICE2.js} +480 -336
- package/out/chunk-OPWNICE2.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/src/deploy-permissions.d.ts +3 -0
- package/out/zero/src/deploy-permissions.d.ts.map +1 -0
- package/out/zero/src/deploy-permissions.js +3 -0
- package/out/zero/src/deploy-permissions.js.map +1 -0
- 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/read-authorizer.js +1 -1
- package/out/zero-cache/src/auth/read-authorizer.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 +11 -6
- package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
- package/out/zero-cache/src/config/zero-config.d.ts +0 -205
- package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
- package/out/zero-cache/src/config/zero-config.js +0 -22
- package/out/zero-cache/src/config/zero-config.js.map +1 -1
- package/out/zero-cache/src/scripts/deploy-permissions.d.ts +2 -0
- package/out/zero-cache/src/scripts/deploy-permissions.d.ts.map +1 -0
- package/out/zero-cache/src/scripts/deploy-permissions.js +122 -0
- package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -0
- 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/change-source/custom/change-source.js +4 -0
- package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js +3 -1
- package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +2 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
- package/out/zero-cache/src/services/change-source/pg/schema/shard.js +16 -0
- package/out/zero-cache/src/services/change-source/pg/schema/shard.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 +15 -2
- 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 +13 -7
- package/out/zero-cache/src/workers/connection.js.map +1 -1
- package/out/zero-client/src/client/crud.d.ts.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 +11 -3
- package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
- package/out/zero-protocol/src/protocol-version.js +14 -4
- 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/compiled-permissions.d.ts +23 -19
- package/out/zero-schema/src/compiled-permissions.d.ts.map +1 -1
- package/out/zero-schema/src/compiled-permissions.js +7 -4
- package/out/zero-schema/src/compiled-permissions.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 +4 -3
- package/out/chunk-V54OEPTV.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,
|
|
@@ -8971,157 +8937,12 @@ function compareUTF8MaybeNull(a, b) {
|
|
|
8971
8937
|
return 0;
|
|
8972
8938
|
}
|
|
8973
8939
|
|
|
8974
|
-
// ../
|
|
8975
|
-
var
|
|
8976
|
-
|
|
8977
|
-
|
|
8978
|
-
|
|
8979
|
-
|
|
8980
|
-
}
|
|
8981
|
-
get eb() {
|
|
8982
|
-
return this;
|
|
8983
|
-
}
|
|
8984
|
-
cmp(field, opOrValue, value) {
|
|
8985
|
-
return cmp(field, opOrValue, value);
|
|
8986
|
-
}
|
|
8987
|
-
cmpLit(left, op, right) {
|
|
8988
|
-
return {
|
|
8989
|
-
type: "simple",
|
|
8990
|
-
left: isParameterReference(left) ? left[toStaticParam]() : { type: "literal", value: left },
|
|
8991
|
-
right: isParameterReference(right) ? right[toStaticParam]() : { type: "literal", value: right },
|
|
8992
|
-
op
|
|
8993
|
-
};
|
|
8994
|
-
}
|
|
8995
|
-
and = and;
|
|
8996
|
-
or = or;
|
|
8997
|
-
not = not;
|
|
8998
|
-
exists(relationship, cb) {
|
|
8999
|
-
return this.#exists(relationship, cb);
|
|
9000
|
-
}
|
|
9001
|
-
};
|
|
9002
|
-
function and(...conditions) {
|
|
9003
|
-
const expressions = filterTrue(filterUndefined(conditions));
|
|
9004
|
-
if (expressions.length === 1) {
|
|
9005
|
-
return expressions[0];
|
|
9006
|
-
}
|
|
9007
|
-
if (expressions.some(isAlwaysFalse)) {
|
|
9008
|
-
return FALSE;
|
|
9009
|
-
}
|
|
9010
|
-
return { type: "and", conditions: expressions };
|
|
9011
|
-
}
|
|
9012
|
-
function or(...conditions) {
|
|
9013
|
-
const expressions = filterFalse(filterUndefined(conditions));
|
|
9014
|
-
if (expressions.length === 1) {
|
|
9015
|
-
return expressions[0];
|
|
9016
|
-
}
|
|
9017
|
-
if (expressions.some(isAlwaysTrue)) {
|
|
9018
|
-
return TRUE;
|
|
9019
|
-
}
|
|
9020
|
-
return { type: "or", conditions: expressions };
|
|
9021
|
-
}
|
|
9022
|
-
function not(expression) {
|
|
9023
|
-
switch (expression.type) {
|
|
9024
|
-
case "and":
|
|
9025
|
-
return {
|
|
9026
|
-
type: "or",
|
|
9027
|
-
conditions: expression.conditions.map(not)
|
|
9028
|
-
};
|
|
9029
|
-
case "or":
|
|
9030
|
-
return {
|
|
9031
|
-
type: "and",
|
|
9032
|
-
conditions: expression.conditions.map(not)
|
|
9033
|
-
};
|
|
9034
|
-
case "correlatedSubquery":
|
|
9035
|
-
return {
|
|
9036
|
-
type: "correlatedSubquery",
|
|
9037
|
-
related: expression.related,
|
|
9038
|
-
op: negateOperator(expression.op)
|
|
9039
|
-
};
|
|
9040
|
-
case "simple":
|
|
9041
|
-
return {
|
|
9042
|
-
type: "simple",
|
|
9043
|
-
op: negateOperator(expression.op),
|
|
9044
|
-
left: expression.left,
|
|
9045
|
-
right: expression.right
|
|
9046
|
-
};
|
|
9047
|
-
}
|
|
9048
|
-
}
|
|
9049
|
-
function cmp(field, opOrValue, value) {
|
|
9050
|
-
let op;
|
|
9051
|
-
if (value === void 0) {
|
|
9052
|
-
value = opOrValue;
|
|
9053
|
-
op = "=";
|
|
9054
|
-
} else {
|
|
9055
|
-
op = opOrValue;
|
|
9056
|
-
}
|
|
9057
|
-
return {
|
|
9058
|
-
type: "simple",
|
|
9059
|
-
left: { type: "column", name: field },
|
|
9060
|
-
right: isParameterReference(value) ? value[toStaticParam]() : { type: "literal", value },
|
|
9061
|
-
op
|
|
9062
|
-
};
|
|
9063
|
-
}
|
|
9064
|
-
function isParameterReference(value) {
|
|
9065
|
-
return value !== null && typeof value === "object" && value[toStaticParam];
|
|
9066
|
-
}
|
|
9067
|
-
var TRUE = {
|
|
9068
|
-
type: "and",
|
|
9069
|
-
conditions: []
|
|
9070
|
-
};
|
|
9071
|
-
var FALSE = {
|
|
9072
|
-
type: "or",
|
|
9073
|
-
conditions: []
|
|
9074
|
-
};
|
|
9075
|
-
function isAlwaysTrue(condition) {
|
|
9076
|
-
return condition.type === "and" && condition.conditions.length === 0;
|
|
9077
|
-
}
|
|
9078
|
-
function isAlwaysFalse(condition) {
|
|
9079
|
-
return condition.type === "or" && condition.conditions.length === 0;
|
|
9080
|
-
}
|
|
9081
|
-
function flatten(type, conditions) {
|
|
9082
|
-
const flattened2 = [];
|
|
9083
|
-
for (const c of conditions) {
|
|
9084
|
-
if (c.type === type) {
|
|
9085
|
-
flattened2.push(...c.conditions);
|
|
9086
|
-
} else {
|
|
9087
|
-
flattened2.push(c);
|
|
9088
|
-
}
|
|
9089
|
-
}
|
|
9090
|
-
return flattened2;
|
|
9091
|
-
}
|
|
9092
|
-
var negateSimpleOperatorMap = {
|
|
9093
|
-
["="]: "!=",
|
|
9094
|
-
["!="]: "=",
|
|
9095
|
-
["<"]: ">=",
|
|
9096
|
-
[">"]: "<=",
|
|
9097
|
-
[">="]: "<",
|
|
9098
|
-
["<="]: ">",
|
|
9099
|
-
["IN"]: "NOT IN",
|
|
9100
|
-
["NOT IN"]: "IN",
|
|
9101
|
-
["LIKE"]: "NOT LIKE",
|
|
9102
|
-
["NOT LIKE"]: "LIKE",
|
|
9103
|
-
["ILIKE"]: "NOT ILIKE",
|
|
9104
|
-
["NOT ILIKE"]: "ILIKE",
|
|
9105
|
-
["IS"]: "IS NOT",
|
|
9106
|
-
["IS NOT"]: "IS"
|
|
9107
|
-
};
|
|
9108
|
-
var negateOperatorMap = {
|
|
9109
|
-
...negateSimpleOperatorMap,
|
|
9110
|
-
["EXISTS"]: "NOT EXISTS",
|
|
9111
|
-
["NOT EXISTS"]: "EXISTS"
|
|
9112
|
-
};
|
|
9113
|
-
function negateOperator(op) {
|
|
9114
|
-
return must(negateOperatorMap[op]);
|
|
9115
|
-
}
|
|
9116
|
-
function filterUndefined(array9) {
|
|
9117
|
-
return array9.filter((e) => e !== void 0);
|
|
9118
|
-
}
|
|
9119
|
-
function filterTrue(conditions) {
|
|
9120
|
-
return conditions.filter((c) => !isAlwaysTrue(c));
|
|
9121
|
-
}
|
|
9122
|
-
function filterFalse(conditions) {
|
|
9123
|
-
return conditions.filter((c) => !isAlwaysFalse(c));
|
|
9124
|
-
}
|
|
8940
|
+
// ../zero-protocol/src/protocol-version.ts
|
|
8941
|
+
var PROTOCOL_VERSION = 5;
|
|
8942
|
+
var MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 2;
|
|
8943
|
+
assert(MIN_SERVER_SUPPORTED_SYNC_PROTOCOL < PROTOCOL_VERSION);
|
|
8944
|
+
var MIN_SERVER_SUPPORTED_PERMISSIONS_PROTOCOL = 4;
|
|
8945
|
+
assert(MIN_SERVER_SUPPORTED_PERMISSIONS_PROTOCOL < PROTOCOL_VERSION);
|
|
9125
8946
|
|
|
9126
8947
|
// ../zql/src/query/query-impl.ts
|
|
9127
8948
|
import { resolver as resolver7 } from "@rocicorp/resolver";
|
|
@@ -9619,11 +9440,11 @@ var Join = class {
|
|
|
9619
9440
|
const childSchema = child.getSchema();
|
|
9620
9441
|
this.#schema = {
|
|
9621
9442
|
...parentSchema,
|
|
9622
|
-
isHidden: hidden,
|
|
9623
9443
|
relationships: {
|
|
9624
9444
|
...parentSchema.relationships,
|
|
9625
9445
|
[relationshipName]: {
|
|
9626
9446
|
...childSchema,
|
|
9447
|
+
isHidden: hidden,
|
|
9627
9448
|
system
|
|
9628
9449
|
}
|
|
9629
9450
|
}
|
|
@@ -9686,7 +9507,15 @@ var Join = class {
|
|
|
9686
9507
|
});
|
|
9687
9508
|
break;
|
|
9688
9509
|
case "child":
|
|
9689
|
-
this.#output.push(
|
|
9510
|
+
this.#output.push({
|
|
9511
|
+
type: "child",
|
|
9512
|
+
node: this.#processParentNode(
|
|
9513
|
+
change.node.row,
|
|
9514
|
+
change.node.relationships,
|
|
9515
|
+
"fetch"
|
|
9516
|
+
),
|
|
9517
|
+
child: change.child
|
|
9518
|
+
});
|
|
9690
9519
|
break;
|
|
9691
9520
|
case "edit": {
|
|
9692
9521
|
if (rowEqualsForCompoundKey(
|
|
@@ -10564,11 +10393,11 @@ function createPredicateImpl(rhs, operator) {
|
|
|
10564
10393
|
case "LIKE":
|
|
10565
10394
|
return getLikePredicate(rhs, "");
|
|
10566
10395
|
case "NOT LIKE":
|
|
10567
|
-
return
|
|
10396
|
+
return not(getLikePredicate(rhs, ""));
|
|
10568
10397
|
case "ILIKE":
|
|
10569
10398
|
return getLikePredicate(rhs, "i");
|
|
10570
10399
|
case "NOT ILIKE":
|
|
10571
|
-
return
|
|
10400
|
+
return not(getLikePredicate(rhs, "i"));
|
|
10572
10401
|
case "IN": {
|
|
10573
10402
|
assert(Array.isArray(rhs));
|
|
10574
10403
|
const set = new Set(rhs);
|
|
@@ -10584,7 +10413,7 @@ function createPredicateImpl(rhs, operator) {
|
|
|
10584
10413
|
throw new Error(`Unexpected operator: ${operator}`);
|
|
10585
10414
|
}
|
|
10586
10415
|
}
|
|
10587
|
-
function
|
|
10416
|
+
function not(f) {
|
|
10588
10417
|
return (lhs) => !f(lhs);
|
|
10589
10418
|
}
|
|
10590
10419
|
function transformFilters(filters) {
|
|
@@ -10955,9 +10784,161 @@ var ArrayView = class {
|
|
|
10955
10784
|
}
|
|
10956
10785
|
};
|
|
10957
10786
|
|
|
10958
|
-
// ../zql/src/query/
|
|
10959
|
-
|
|
10960
|
-
|
|
10787
|
+
// ../zql/src/query/expression.ts
|
|
10788
|
+
var ExpressionBuilder = class {
|
|
10789
|
+
#exists;
|
|
10790
|
+
constructor(exists) {
|
|
10791
|
+
this.#exists = exists;
|
|
10792
|
+
this.exists = this.exists.bind(this);
|
|
10793
|
+
}
|
|
10794
|
+
get eb() {
|
|
10795
|
+
return this;
|
|
10796
|
+
}
|
|
10797
|
+
cmp(field, opOrValue, value) {
|
|
10798
|
+
return cmp(field, opOrValue, value);
|
|
10799
|
+
}
|
|
10800
|
+
cmpLit(left, op, right) {
|
|
10801
|
+
return {
|
|
10802
|
+
type: "simple",
|
|
10803
|
+
left: isParameterReference(left) ? left[toStaticParam]() : { type: "literal", value: left },
|
|
10804
|
+
right: isParameterReference(right) ? right[toStaticParam]() : { type: "literal", value: right },
|
|
10805
|
+
op
|
|
10806
|
+
};
|
|
10807
|
+
}
|
|
10808
|
+
and = and;
|
|
10809
|
+
or = or;
|
|
10810
|
+
not = not2;
|
|
10811
|
+
exists(relationship, cb) {
|
|
10812
|
+
return this.#exists(relationship, cb);
|
|
10813
|
+
}
|
|
10814
|
+
};
|
|
10815
|
+
function and(...conditions) {
|
|
10816
|
+
const expressions = filterTrue(filterUndefined(conditions));
|
|
10817
|
+
if (expressions.length === 1) {
|
|
10818
|
+
return expressions[0];
|
|
10819
|
+
}
|
|
10820
|
+
if (expressions.some(isAlwaysFalse)) {
|
|
10821
|
+
return FALSE;
|
|
10822
|
+
}
|
|
10823
|
+
return { type: "and", conditions: expressions };
|
|
10824
|
+
}
|
|
10825
|
+
function or(...conditions) {
|
|
10826
|
+
const expressions = filterFalse(filterUndefined(conditions));
|
|
10827
|
+
if (expressions.length === 1) {
|
|
10828
|
+
return expressions[0];
|
|
10829
|
+
}
|
|
10830
|
+
if (expressions.some(isAlwaysTrue)) {
|
|
10831
|
+
return TRUE;
|
|
10832
|
+
}
|
|
10833
|
+
return { type: "or", conditions: expressions };
|
|
10834
|
+
}
|
|
10835
|
+
function not2(expression) {
|
|
10836
|
+
switch (expression.type) {
|
|
10837
|
+
case "and":
|
|
10838
|
+
return {
|
|
10839
|
+
type: "or",
|
|
10840
|
+
conditions: expression.conditions.map(not2)
|
|
10841
|
+
};
|
|
10842
|
+
case "or":
|
|
10843
|
+
return {
|
|
10844
|
+
type: "and",
|
|
10845
|
+
conditions: expression.conditions.map(not2)
|
|
10846
|
+
};
|
|
10847
|
+
case "correlatedSubquery":
|
|
10848
|
+
return {
|
|
10849
|
+
type: "correlatedSubquery",
|
|
10850
|
+
related: expression.related,
|
|
10851
|
+
op: negateOperator(expression.op)
|
|
10852
|
+
};
|
|
10853
|
+
case "simple":
|
|
10854
|
+
return {
|
|
10855
|
+
type: "simple",
|
|
10856
|
+
op: negateOperator(expression.op),
|
|
10857
|
+
left: expression.left,
|
|
10858
|
+
right: expression.right
|
|
10859
|
+
};
|
|
10860
|
+
}
|
|
10861
|
+
}
|
|
10862
|
+
function cmp(field, opOrValue, value) {
|
|
10863
|
+
let op;
|
|
10864
|
+
if (value === void 0) {
|
|
10865
|
+
value = opOrValue;
|
|
10866
|
+
op = "=";
|
|
10867
|
+
} else {
|
|
10868
|
+
op = opOrValue;
|
|
10869
|
+
}
|
|
10870
|
+
return {
|
|
10871
|
+
type: "simple",
|
|
10872
|
+
left: { type: "column", name: field },
|
|
10873
|
+
right: isParameterReference(value) ? value[toStaticParam]() : { type: "literal", value },
|
|
10874
|
+
op
|
|
10875
|
+
};
|
|
10876
|
+
}
|
|
10877
|
+
function isParameterReference(value) {
|
|
10878
|
+
return value !== null && typeof value === "object" && value[toStaticParam];
|
|
10879
|
+
}
|
|
10880
|
+
var TRUE = {
|
|
10881
|
+
type: "and",
|
|
10882
|
+
conditions: []
|
|
10883
|
+
};
|
|
10884
|
+
var FALSE = {
|
|
10885
|
+
type: "or",
|
|
10886
|
+
conditions: []
|
|
10887
|
+
};
|
|
10888
|
+
function isAlwaysTrue(condition) {
|
|
10889
|
+
return condition.type === "and" && condition.conditions.length === 0;
|
|
10890
|
+
}
|
|
10891
|
+
function isAlwaysFalse(condition) {
|
|
10892
|
+
return condition.type === "or" && condition.conditions.length === 0;
|
|
10893
|
+
}
|
|
10894
|
+
function flatten(type, conditions) {
|
|
10895
|
+
const flattened2 = [];
|
|
10896
|
+
for (const c of conditions) {
|
|
10897
|
+
if (c.type === type) {
|
|
10898
|
+
flattened2.push(...c.conditions);
|
|
10899
|
+
} else {
|
|
10900
|
+
flattened2.push(c);
|
|
10901
|
+
}
|
|
10902
|
+
}
|
|
10903
|
+
return flattened2;
|
|
10904
|
+
}
|
|
10905
|
+
var negateSimpleOperatorMap = {
|
|
10906
|
+
["="]: "!=",
|
|
10907
|
+
["!="]: "=",
|
|
10908
|
+
["<"]: ">=",
|
|
10909
|
+
[">"]: "<=",
|
|
10910
|
+
[">="]: "<",
|
|
10911
|
+
["<="]: ">",
|
|
10912
|
+
["IN"]: "NOT IN",
|
|
10913
|
+
["NOT IN"]: "IN",
|
|
10914
|
+
["LIKE"]: "NOT LIKE",
|
|
10915
|
+
["NOT LIKE"]: "LIKE",
|
|
10916
|
+
["ILIKE"]: "NOT ILIKE",
|
|
10917
|
+
["NOT ILIKE"]: "ILIKE",
|
|
10918
|
+
["IS"]: "IS NOT",
|
|
10919
|
+
["IS NOT"]: "IS"
|
|
10920
|
+
};
|
|
10921
|
+
var negateOperatorMap = {
|
|
10922
|
+
...negateSimpleOperatorMap,
|
|
10923
|
+
["EXISTS"]: "NOT EXISTS",
|
|
10924
|
+
["NOT EXISTS"]: "EXISTS"
|
|
10925
|
+
};
|
|
10926
|
+
function negateOperator(op) {
|
|
10927
|
+
return must(negateOperatorMap[op]);
|
|
10928
|
+
}
|
|
10929
|
+
function filterUndefined(array12) {
|
|
10930
|
+
return array12.filter((e) => e !== void 0);
|
|
10931
|
+
}
|
|
10932
|
+
function filterTrue(conditions) {
|
|
10933
|
+
return conditions.filter((c) => !isAlwaysTrue(c));
|
|
10934
|
+
}
|
|
10935
|
+
function filterFalse(conditions) {
|
|
10936
|
+
return conditions.filter((c) => !isAlwaysFalse(c));
|
|
10937
|
+
}
|
|
10938
|
+
|
|
10939
|
+
// ../zql/src/query/dnf.ts
|
|
10940
|
+
function dnf(condition) {
|
|
10941
|
+
return unwrap(dnfInner(condition));
|
|
10961
10942
|
}
|
|
10962
10943
|
function dnfInner(condition) {
|
|
10963
10944
|
switch (condition.type) {
|
|
@@ -11009,6 +10990,7 @@ function unwrap(c) {
|
|
|
11009
10990
|
}
|
|
11010
10991
|
|
|
11011
10992
|
// ../zql/src/query/query-impl.ts
|
|
10993
|
+
var astForTestingSymbol = Symbol();
|
|
11012
10994
|
function newQuery(delegate, schema, table2) {
|
|
11013
10995
|
return new QueryImpl(delegate, schema, table2);
|
|
11014
10996
|
}
|
|
@@ -11039,6 +11021,10 @@ var AbstractQuery = class {
|
|
|
11039
11021
|
get format() {
|
|
11040
11022
|
return this.#format;
|
|
11041
11023
|
}
|
|
11024
|
+
// Not part of Query or QueryInternal interface
|
|
11025
|
+
get [astForTestingSymbol]() {
|
|
11026
|
+
return this.#ast;
|
|
11027
|
+
}
|
|
11042
11028
|
hash() {
|
|
11043
11029
|
if (!this.#hash) {
|
|
11044
11030
|
const ast = this._completeAst();
|
|
@@ -11166,6 +11152,7 @@ var AbstractQuery = class {
|
|
|
11166
11152
|
parentField: firstRelation.sourceField,
|
|
11167
11153
|
childField: firstRelation.destField
|
|
11168
11154
|
},
|
|
11155
|
+
hidden: true,
|
|
11169
11156
|
subquery: {
|
|
11170
11157
|
table: junctionSchema,
|
|
11171
11158
|
alias: relationship,
|
|
@@ -11180,7 +11167,6 @@ var AbstractQuery = class {
|
|
|
11180
11167
|
parentField: secondRelation.sourceField,
|
|
11181
11168
|
childField: secondRelation.destField
|
|
11182
11169
|
},
|
|
11183
|
-
hidden: true,
|
|
11184
11170
|
subquery: addPrimaryKeysToAst(
|
|
11185
11171
|
this.#schema.tables[destSchema],
|
|
11186
11172
|
sq.#ast
|
|
@@ -11393,21 +11379,14 @@ var AbstractQuery = class {
|
|
|
11393
11379
|
return this.#completedAST;
|
|
11394
11380
|
}
|
|
11395
11381
|
};
|
|
11396
|
-
var astForTestingSymbol = Symbol();
|
|
11397
11382
|
var completedAstSymbol = Symbol();
|
|
11398
11383
|
var QueryImpl = class extends AbstractQuery {
|
|
11399
11384
|
#delegate;
|
|
11400
|
-
#ast;
|
|
11401
11385
|
constructor(delegate, schema, tableName, ast = { table: tableName }, format) {
|
|
11402
11386
|
super(schema, tableName, ast, format);
|
|
11403
11387
|
this.#delegate = delegate;
|
|
11404
|
-
this.#ast = ast;
|
|
11405
11388
|
}
|
|
11406
11389
|
_system = "client";
|
|
11407
|
-
// Not part of Query or QueryInternal interface
|
|
11408
|
-
get [astForTestingSymbol]() {
|
|
11409
|
-
return this.#ast;
|
|
11410
|
-
}
|
|
11411
11390
|
get [completedAstSymbol]() {
|
|
11412
11391
|
return this._completeAst();
|
|
11413
11392
|
}
|
|
@@ -11498,8 +11477,8 @@ function isCompoundKey(field) {
|
|
|
11498
11477
|
return Array.isArray(field) && field.length >= 1;
|
|
11499
11478
|
}
|
|
11500
11479
|
|
|
11501
|
-
// ../zql/src/query/
|
|
11502
|
-
var
|
|
11480
|
+
// ../zql/src/query/static-query.ts
|
|
11481
|
+
var StaticQuery = class _StaticQuery extends AbstractQuery {
|
|
11503
11482
|
constructor(schema, tableName, ast = { table: tableName }, format) {
|
|
11504
11483
|
super(schema, tableName, ast, format);
|
|
11505
11484
|
}
|
|
@@ -11508,7 +11487,7 @@ var AuthQuery = class _AuthQuery extends AbstractQuery {
|
|
|
11508
11487
|
}
|
|
11509
11488
|
_system = "permissions";
|
|
11510
11489
|
_newQuery(schema, tableName, ast, format) {
|
|
11511
|
-
return new
|
|
11490
|
+
return new _StaticQuery(schema, tableName, ast, format);
|
|
11512
11491
|
}
|
|
11513
11492
|
get ast() {
|
|
11514
11493
|
return this._completeAst();
|
|
@@ -11524,13 +11503,97 @@ var AuthQuery = class _AuthQuery extends AbstractQuery {
|
|
|
11524
11503
|
}
|
|
11525
11504
|
};
|
|
11526
11505
|
|
|
11506
|
+
// ../zero-schema/src/name-mapper.ts
|
|
11507
|
+
function clientToServer(tables) {
|
|
11508
|
+
return createMapperFrom("client", tables);
|
|
11509
|
+
}
|
|
11510
|
+
function serverToClient(tables) {
|
|
11511
|
+
return createMapperFrom("server", tables);
|
|
11512
|
+
}
|
|
11513
|
+
function createMapperFrom(src, tables) {
|
|
11514
|
+
const mapping = new Map(
|
|
11515
|
+
Object.entries(tables).map(
|
|
11516
|
+
([tableName, { serverName: serverTableName, columns }]) => {
|
|
11517
|
+
let allColumnsSame = true;
|
|
11518
|
+
const names = {};
|
|
11519
|
+
for (const [name, { serverName }] of Object.entries(columns)) {
|
|
11520
|
+
if (serverName && serverName !== name) {
|
|
11521
|
+
allColumnsSame = false;
|
|
11522
|
+
}
|
|
11523
|
+
if (src === "client") {
|
|
11524
|
+
names[name] = serverName ?? name;
|
|
11525
|
+
} else {
|
|
11526
|
+
names[serverName ?? name] = name;
|
|
11527
|
+
}
|
|
11528
|
+
}
|
|
11529
|
+
return [
|
|
11530
|
+
src === "client" ? tableName : serverTableName ?? tableName,
|
|
11531
|
+
{
|
|
11532
|
+
tableName: src === "client" ? serverTableName ?? tableName : tableName,
|
|
11533
|
+
columns: names,
|
|
11534
|
+
allColumnsSame
|
|
11535
|
+
}
|
|
11536
|
+
];
|
|
11537
|
+
}
|
|
11538
|
+
)
|
|
11539
|
+
);
|
|
11540
|
+
return new NameMapper(mapping);
|
|
11541
|
+
}
|
|
11542
|
+
var NameMapper = class {
|
|
11543
|
+
#tables = /* @__PURE__ */ new Map();
|
|
11544
|
+
constructor(tables) {
|
|
11545
|
+
this.#tables = tables;
|
|
11546
|
+
}
|
|
11547
|
+
#getTable(src, ctx) {
|
|
11548
|
+
const table2 = this.#tables.get(src);
|
|
11549
|
+
if (!table2) {
|
|
11550
|
+
throw new Error(
|
|
11551
|
+
`unknown table "${src}" ${!ctx ? "" : `in ${JSON.stringify(ctx)}`}`
|
|
11552
|
+
);
|
|
11553
|
+
}
|
|
11554
|
+
return table2;
|
|
11555
|
+
}
|
|
11556
|
+
tableName(src, context) {
|
|
11557
|
+
return this.#getTable(src, context).tableName;
|
|
11558
|
+
}
|
|
11559
|
+
columnName(table2, src, ctx) {
|
|
11560
|
+
const dst = this.#getTable(table2, ctx).columns[src];
|
|
11561
|
+
if (!dst) {
|
|
11562
|
+
throw new Error(
|
|
11563
|
+
`unknown column "${src}" of "${table2}" table ${!ctx ? "" : `in ${JSON.stringify(ctx)}`}`
|
|
11564
|
+
);
|
|
11565
|
+
}
|
|
11566
|
+
return dst;
|
|
11567
|
+
}
|
|
11568
|
+
row(table2, row) {
|
|
11569
|
+
const dest = this.#getTable(table2);
|
|
11570
|
+
const { allColumnsSame, columns } = dest;
|
|
11571
|
+
if (allColumnsSame) {
|
|
11572
|
+
return row;
|
|
11573
|
+
}
|
|
11574
|
+
const clientRow = {};
|
|
11575
|
+
for (const col in row) {
|
|
11576
|
+
clientRow[columns[col] ?? col] = row[col];
|
|
11577
|
+
}
|
|
11578
|
+
return clientRow;
|
|
11579
|
+
}
|
|
11580
|
+
columns(table2, cols) {
|
|
11581
|
+
const dest = this.#getTable(table2);
|
|
11582
|
+
const { allColumnsSame, columns } = dest;
|
|
11583
|
+
return cols === void 0 || allColumnsSame ? cols : cols.map((col) => columns[col] ?? col);
|
|
11584
|
+
}
|
|
11585
|
+
};
|
|
11586
|
+
|
|
11527
11587
|
// ../zero-schema/src/permissions.ts
|
|
11528
11588
|
var ANYONE_CAN = void 0;
|
|
11529
11589
|
var NOBODY_CAN = [];
|
|
11530
11590
|
async function definePermissions(schema, definer) {
|
|
11531
11591
|
const expressionBuilders = {};
|
|
11532
11592
|
for (const name of Object.keys(schema.tables)) {
|
|
11533
|
-
expressionBuilders[name] = new
|
|
11593
|
+
expressionBuilders[name] = new StaticQuery(
|
|
11594
|
+
schema,
|
|
11595
|
+
name
|
|
11596
|
+
).expressionBuilder();
|
|
11534
11597
|
}
|
|
11535
11598
|
const config = await definer();
|
|
11536
11599
|
return compilePermissions(schema, config, expressionBuilders);
|
|
@@ -11540,10 +11603,13 @@ function compilePermissions(schema, authz, expressionBuilders) {
|
|
|
11540
11603
|
return void 0;
|
|
11541
11604
|
}
|
|
11542
11605
|
const nameMapper = clientToServer(schema.tables);
|
|
11543
|
-
const ret = {
|
|
11606
|
+
const ret = {
|
|
11607
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
11608
|
+
tables: {}
|
|
11609
|
+
};
|
|
11544
11610
|
for (const [tableName, tableConfig] of Object.entries(authz)) {
|
|
11545
11611
|
const serverName = schema.tables[tableName].serverName ?? tableName;
|
|
11546
|
-
ret[serverName] = {
|
|
11612
|
+
ret.tables[serverName] = {
|
|
11547
11613
|
row: compileRowConfig(
|
|
11548
11614
|
nameMapper,
|
|
11549
11615
|
tableName,
|
|
@@ -11720,7 +11786,8 @@ var connectedMessageSchema = valita_exports.tuple([
|
|
|
11720
11786
|
connectedBodySchema
|
|
11721
11787
|
]);
|
|
11722
11788
|
var initConnectionBodySchema = valita_exports.object({
|
|
11723
|
-
desiredQueriesPatch: queriesPatchSchema
|
|
11789
|
+
desiredQueriesPatch: queriesPatchSchema,
|
|
11790
|
+
deletedClients: valita_exports.array(valita_exports.string()).optional()
|
|
11724
11791
|
});
|
|
11725
11792
|
var initConnectionMessageSchema = valita_exports.tuple([
|
|
11726
11793
|
valita_exports.literal("initConnection"),
|
|
@@ -11734,6 +11801,15 @@ function encodeSecProtocols(initConnectionMessage, authToken) {
|
|
|
11734
11801
|
return encodeURIComponent(btoa(JSON.stringify(protocols)));
|
|
11735
11802
|
}
|
|
11736
11803
|
|
|
11804
|
+
// ../zero-protocol/src/delete-clients.ts
|
|
11805
|
+
var deleteClientsBodySchema = valita_exports.object({
|
|
11806
|
+
clientIDs: valita_exports.array(valita_exports.string())
|
|
11807
|
+
});
|
|
11808
|
+
var deleteClientsMessageSchema = valita_exports.tuple([
|
|
11809
|
+
valita_exports.literal("deleteClients"),
|
|
11810
|
+
deleteClientsBodySchema
|
|
11811
|
+
]);
|
|
11812
|
+
|
|
11737
11813
|
// ../zero-protocol/src/error-kind-enum.ts
|
|
11738
11814
|
var AuthInvalidated = "AuthInvalidated";
|
|
11739
11815
|
var ClientNotFound = "ClientNotFound";
|
|
@@ -11895,6 +11971,10 @@ var pokePartBodySchema = valita_exports.object({
|
|
|
11895
11971
|
});
|
|
11896
11972
|
var pokeEndBodySchema = valita_exports.object({
|
|
11897
11973
|
pokeID: valita_exports.string(),
|
|
11974
|
+
// If present, this should be the cookie stored with the client,
|
|
11975
|
+
// instead of the cookie presented in pokeStart.
|
|
11976
|
+
// TODO: Consider making this required and removing it from pokeStart.
|
|
11977
|
+
cookie: versionSchema.optional(),
|
|
11898
11978
|
// If `true`, the poke with id `pokeID` should be discarded without
|
|
11899
11979
|
// applying it.
|
|
11900
11980
|
cancel: valita_exports.boolean().optional()
|
|
@@ -11954,18 +12034,14 @@ var downstreamSchema = valita_exports.union(
|
|
|
11954
12034
|
pokeStartMessageSchema,
|
|
11955
12035
|
pokePartMessageSchema,
|
|
11956
12036
|
pokeEndMessageSchema,
|
|
11957
|
-
pullResponseMessageSchema
|
|
12037
|
+
pullResponseMessageSchema,
|
|
12038
|
+
deleteClientsMessageSchema
|
|
11958
12039
|
);
|
|
11959
12040
|
|
|
11960
12041
|
// ../zero-protocol/src/mutation-type-enum.ts
|
|
11961
12042
|
var CRUD = "crud";
|
|
11962
12043
|
var Custom = "custom";
|
|
11963
12044
|
|
|
11964
|
-
// ../zero-protocol/src/protocol-version.ts
|
|
11965
|
-
var PROTOCOL_VERSION = 4;
|
|
11966
|
-
var MIN_SERVER_SUPPORTED_PROTOCOL_VERSION = 2;
|
|
11967
|
-
assert(MIN_SERVER_SUPPORTED_PROTOCOL_VERSION < PROTOCOL_VERSION);
|
|
11968
|
-
|
|
11969
12045
|
// ../zero-protocol/src/push.ts
|
|
11970
12046
|
var CRUD_MUTATION_NAME = "_zero_crud";
|
|
11971
12047
|
var insertOpSchema = valita_exports.object({
|
|
@@ -13308,48 +13384,28 @@ var ZeroContext = class {
|
|
|
13308
13384
|
// ../zero-client/src/client/crud.ts
|
|
13309
13385
|
function makeCRUDMutate(schema, repMutate) {
|
|
13310
13386
|
const { [CRUD_MUTATION_NAME]: zeroCRUD } = repMutate;
|
|
13311
|
-
let inBatch = false;
|
|
13312
13387
|
const mutateBatch = async (body) => {
|
|
13313
|
-
|
|
13314
|
-
|
|
13315
|
-
|
|
13316
|
-
|
|
13317
|
-
try {
|
|
13318
|
-
const ops = [];
|
|
13319
|
-
const m = {};
|
|
13320
|
-
for (const name of Object.keys(schema.tables)) {
|
|
13321
|
-
m[name] = makeBatchCRUDMutate(name, schema, ops);
|
|
13322
|
-
}
|
|
13323
|
-
const rv = await body(m);
|
|
13324
|
-
await zeroCRUD({ ops });
|
|
13325
|
-
return rv;
|
|
13326
|
-
} finally {
|
|
13327
|
-
inBatch = false;
|
|
13328
|
-
}
|
|
13329
|
-
};
|
|
13330
|
-
const assertNotInBatch = (tableName, op) => {
|
|
13331
|
-
if (inBatch) {
|
|
13332
|
-
throw new Error(`Cannot call mutate.${tableName}.${op} inside a batch`);
|
|
13388
|
+
const ops = [];
|
|
13389
|
+
const m = {};
|
|
13390
|
+
for (const name of Object.keys(schema.tables)) {
|
|
13391
|
+
m[name] = makeBatchCRUDMutate(name, schema, ops);
|
|
13333
13392
|
}
|
|
13393
|
+
const rv = await body(m);
|
|
13394
|
+
await zeroCRUD({ ops });
|
|
13395
|
+
return rv;
|
|
13334
13396
|
};
|
|
13335
13397
|
const mutate = {};
|
|
13336
13398
|
for (const [name, tableSchema] of Object.entries(schema.tables)) {
|
|
13337
|
-
mutate[name] = makeEntityCRUDMutate(
|
|
13338
|
-
name,
|
|
13339
|
-
tableSchema.primaryKey,
|
|
13340
|
-
zeroCRUD,
|
|
13341
|
-
assertNotInBatch
|
|
13342
|
-
);
|
|
13399
|
+
mutate[name] = makeEntityCRUDMutate(name, tableSchema.primaryKey, zeroCRUD);
|
|
13343
13400
|
}
|
|
13344
13401
|
return {
|
|
13345
13402
|
mutate,
|
|
13346
13403
|
mutateBatch
|
|
13347
13404
|
};
|
|
13348
13405
|
}
|
|
13349
|
-
function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD
|
|
13406
|
+
function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD) {
|
|
13350
13407
|
return {
|
|
13351
13408
|
insert: (value) => {
|
|
13352
|
-
assertNotInBatch(tableName, "insert");
|
|
13353
13409
|
const op = {
|
|
13354
13410
|
op: "insert",
|
|
13355
13411
|
tableName,
|
|
@@ -13359,7 +13415,6 @@ function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD, assertNotInBatch)
|
|
|
13359
13415
|
return zeroCRUD({ ops: [op] });
|
|
13360
13416
|
},
|
|
13361
13417
|
upsert: (value) => {
|
|
13362
|
-
assertNotInBatch(tableName, "upsert");
|
|
13363
13418
|
const op = {
|
|
13364
13419
|
op: "upsert",
|
|
13365
13420
|
tableName,
|
|
@@ -13369,7 +13424,6 @@ function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD, assertNotInBatch)
|
|
|
13369
13424
|
return zeroCRUD({ ops: [op] });
|
|
13370
13425
|
},
|
|
13371
13426
|
update: (value) => {
|
|
13372
|
-
assertNotInBatch(tableName, "update");
|
|
13373
13427
|
const op = {
|
|
13374
13428
|
op: "update",
|
|
13375
13429
|
tableName,
|
|
@@ -13379,7 +13433,6 @@ function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD, assertNotInBatch)
|
|
|
13379
13433
|
return zeroCRUD({ ops: [op] });
|
|
13380
13434
|
},
|
|
13381
13435
|
delete: (id) => {
|
|
13382
|
-
assertNotInBatch(tableName, "delete");
|
|
13383
13436
|
const op = {
|
|
13384
13437
|
op: "delete",
|
|
13385
13438
|
tableName,
|
|
@@ -13630,6 +13683,53 @@ function makeTableCRUD(schema, tableName, tx, ivmBranch) {
|
|
|
13630
13683
|
};
|
|
13631
13684
|
}
|
|
13632
13685
|
|
|
13686
|
+
// ../zero-client/src/client/delete-clients-manager.ts
|
|
13687
|
+
var DeleteClientsManager = class {
|
|
13688
|
+
#send;
|
|
13689
|
+
#lc;
|
|
13690
|
+
#dagStore;
|
|
13691
|
+
constructor(send2, dagStore, lc) {
|
|
13692
|
+
this.#send = send2;
|
|
13693
|
+
this.#dagStore = dagStore;
|
|
13694
|
+
this.#lc = lc;
|
|
13695
|
+
}
|
|
13696
|
+
/**
|
|
13697
|
+
* This gets called by Replicache when it deletes clients from the persistent
|
|
13698
|
+
* storage.
|
|
13699
|
+
*/
|
|
13700
|
+
onClientsDeleted(clientIDs) {
|
|
13701
|
+
this.#lc.debug?.("DeletedClientsManager, send:", clientIDs);
|
|
13702
|
+
this.#send(["deleteClients", { clientIDs }]);
|
|
13703
|
+
}
|
|
13704
|
+
/**
|
|
13705
|
+
* Zero calls this after it connects to ensure that the server knows about all
|
|
13706
|
+
* the clients that might have been deleted locally since the last connection.
|
|
13707
|
+
*/
|
|
13708
|
+
async sendDeletedClientsToServer() {
|
|
13709
|
+
const deletedClients = await withRead(
|
|
13710
|
+
this.#dagStore,
|
|
13711
|
+
(dagRead) => getDeletedClients(dagRead)
|
|
13712
|
+
);
|
|
13713
|
+
if (deletedClients.length > 0) {
|
|
13714
|
+
this.#send(["deleteClients", { clientIDs: deletedClients }]);
|
|
13715
|
+
this.#lc.debug?.("DeletedClientsManager, send:", deletedClients);
|
|
13716
|
+
}
|
|
13717
|
+
}
|
|
13718
|
+
/**
|
|
13719
|
+
* This is called as a response to the server telling us which clients it
|
|
13720
|
+
* actually deleted.
|
|
13721
|
+
*/
|
|
13722
|
+
clientsDeletedOnServer(clientIDs) {
|
|
13723
|
+
return withWrite(this.#dagStore, async (dagWrite) => {
|
|
13724
|
+
this.#lc.debug?.("clientsDeletedOnServer:", clientIDs);
|
|
13725
|
+
await removeDeletedClients(dagWrite, clientIDs);
|
|
13726
|
+
});
|
|
13727
|
+
}
|
|
13728
|
+
getDeletedClients() {
|
|
13729
|
+
return withRead(this.#dagStore, getDeletedClients);
|
|
13730
|
+
}
|
|
13731
|
+
};
|
|
13732
|
+
|
|
13633
13733
|
// ../zero-client/src/client/enable-analytics.ts
|
|
13634
13734
|
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
13735
|
var IPV6_ADDRESS_HOSTNAME_REGEX = /^\[[a-fA-F0-9:]*:[a-fA-F0-9:]*\]$/;
|
|
@@ -13878,7 +13978,7 @@ function makeMessage(message, context, logLevel) {
|
|
|
13878
13978
|
}
|
|
13879
13979
|
|
|
13880
13980
|
// ../zero-client/src/client/version.ts
|
|
13881
|
-
var version2 = "0.14.
|
|
13981
|
+
var version2 = "0.14.2025021100";
|
|
13882
13982
|
|
|
13883
13983
|
// ../zero-client/src/client/log-options.ts
|
|
13884
13984
|
var LevelFilterLogSink = class {
|
|
@@ -14568,7 +14668,7 @@ var PokeHandler = class {
|
|
|
14568
14668
|
this.#receivingPoke = void 0;
|
|
14569
14669
|
return;
|
|
14570
14670
|
}
|
|
14571
|
-
this.#pokeBuffer.push(this.#receivingPoke);
|
|
14671
|
+
this.#pokeBuffer.push({ ...this.#receivingPoke, pokeEnd });
|
|
14572
14672
|
this.#receivingPoke = void 0;
|
|
14573
14673
|
if (!this.#pokePlaybackLoopRunning) {
|
|
14574
14674
|
this.#startPlaybackLoop();
|
|
@@ -14644,7 +14744,8 @@ function mergePokes(pokeBuffer, schema, serverToClient2) {
|
|
|
14644
14744
|
return void 0;
|
|
14645
14745
|
}
|
|
14646
14746
|
const { baseCookie } = pokeBuffer[0].pokeStart;
|
|
14647
|
-
const
|
|
14747
|
+
const lastPoke = pokeBuffer[pokeBuffer.length - 1];
|
|
14748
|
+
const cookie = lastPoke.pokeEnd.cookie ?? lastPoke.pokeStart.cookie;
|
|
14648
14749
|
const mergedPatch = [];
|
|
14649
14750
|
const mergedLastMutationIDChanges = {};
|
|
14650
14751
|
let prevPokeStart = void 0;
|
|
@@ -14850,6 +14951,7 @@ var Zero = class {
|
|
|
14850
14951
|
#queryManager;
|
|
14851
14952
|
#ivmSources;
|
|
14852
14953
|
#clientToServer;
|
|
14954
|
+
#deleteClientsManager;
|
|
14853
14955
|
/**
|
|
14854
14956
|
* The queries we sent when inside the sec-protocol header when establishing a connection.
|
|
14855
14957
|
* More queries could be registered while we're waiting for the 'connected' message
|
|
@@ -14860,6 +14962,12 @@ var Zero = class {
|
|
|
14860
14962
|
* and an `initConnection` message must be sent to the server after receiving the `connected` message.
|
|
14861
14963
|
*/
|
|
14862
14964
|
#initConnectionQueries;
|
|
14965
|
+
/**
|
|
14966
|
+
* We try to send the deleted clients as part of the sec-protocol header. If we can't
|
|
14967
|
+
* because the header would get to long we keep track of the deleted clients and send
|
|
14968
|
+
* them after the connection is established.
|
|
14969
|
+
*/
|
|
14970
|
+
#deletedClients;
|
|
14863
14971
|
#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
|
|
14864
14972
|
#onPong = () => void 0;
|
|
14865
14973
|
#online = false;
|
|
@@ -14995,7 +15103,8 @@ var Zero = class {
|
|
|
14995
15103
|
};
|
|
14996
15104
|
const replicacheImplOptions = {
|
|
14997
15105
|
enableClientGroupForking: false,
|
|
14998
|
-
enableMutationRecovery: false
|
|
15106
|
+
enableMutationRecovery: false,
|
|
15107
|
+
onClientsDeleted: (clientIDs) => this.#deleteClientsManager.onClientsDeleted(clientIDs)
|
|
14999
15108
|
};
|
|
15000
15109
|
const rep = new ReplicacheImpl(replicacheOptions, replicacheImplOptions);
|
|
15001
15110
|
this.#rep = rep;
|
|
@@ -15054,6 +15163,11 @@ var Zero = class {
|
|
|
15054
15163
|
maxRecentQueries
|
|
15055
15164
|
);
|
|
15056
15165
|
this.#clientToServer = clientToServer(schema.tables);
|
|
15166
|
+
this.#deleteClientsManager = new DeleteClientsManager(
|
|
15167
|
+
(msg) => this.#send(msg),
|
|
15168
|
+
rep.perdag,
|
|
15169
|
+
this.#lc
|
|
15170
|
+
);
|
|
15057
15171
|
this.#zeroContext = new ZeroContext(
|
|
15058
15172
|
this.#ivmSources.main,
|
|
15059
15173
|
(ast, gotCallback) => this.#queryManager.add(ast, gotCallback),
|
|
@@ -15104,6 +15218,9 @@ var Zero = class {
|
|
|
15104
15218
|
}
|
|
15105
15219
|
}
|
|
15106
15220
|
#sendChangeDesiredQueries(msg) {
|
|
15221
|
+
this.#send(msg);
|
|
15222
|
+
}
|
|
15223
|
+
#send(msg) {
|
|
15107
15224
|
if (this.#socket && this.#connectionState === Connected) {
|
|
15108
15225
|
send(this.#socket, msg);
|
|
15109
15226
|
}
|
|
@@ -15250,6 +15367,10 @@ var Zero = class {
|
|
|
15250
15367
|
return this.#handlePullResponse(lc, downMessage);
|
|
15251
15368
|
case "warm":
|
|
15252
15369
|
break;
|
|
15370
|
+
case "deleteClients":
|
|
15371
|
+
return this.#deleteClientsManager.clientsDeletedOnServer(
|
|
15372
|
+
downMessage[1].clientIDs
|
|
15373
|
+
);
|
|
15253
15374
|
default:
|
|
15254
15375
|
msgType;
|
|
15255
15376
|
rejectInvalidMessage();
|
|
@@ -15320,8 +15441,8 @@ var Zero = class {
|
|
|
15320
15441
|
this.#metrics.lastConnectError.clear();
|
|
15321
15442
|
const proceedingConnectErrorCount = this.#connectErrorCount;
|
|
15322
15443
|
this.#connectErrorCount = 0;
|
|
15323
|
-
let timeToConnectMs
|
|
15324
|
-
let connectMsgLatencyMs
|
|
15444
|
+
let timeToConnectMs;
|
|
15445
|
+
let connectMsgLatencyMs;
|
|
15325
15446
|
if (this.#connectStart === void 0) {
|
|
15326
15447
|
lc.error?.(
|
|
15327
15448
|
"Got connected message but connect start time is undefined. This should not happen."
|
|
@@ -15332,7 +15453,7 @@ var Zero = class {
|
|
|
15332
15453
|
connectMsgLatencyMs = connectBody.timestamp !== void 0 ? now - connectBody.timestamp : void 0;
|
|
15333
15454
|
this.#connectStart = void 0;
|
|
15334
15455
|
}
|
|
15335
|
-
let totalTimeToConnectMs
|
|
15456
|
+
let totalTimeToConnectMs;
|
|
15336
15457
|
if (this.#totalToConnectStart === void 0) {
|
|
15337
15458
|
lc.error?.(
|
|
15338
15459
|
"Got connected message but total to connect start time is undefined. This should not happen."
|
|
@@ -15352,26 +15473,38 @@ var Zero = class {
|
|
|
15352
15473
|
});
|
|
15353
15474
|
this.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
|
|
15354
15475
|
lc.debug?.("Resolving connect resolver");
|
|
15355
|
-
|
|
15476
|
+
const socket = must(this.#socket);
|
|
15356
15477
|
const queriesPatch = await this.#rep.query(
|
|
15357
15478
|
(tx) => this.#queryManager.getQueriesPatch(tx, this.#initConnectionQueries)
|
|
15358
15479
|
);
|
|
15480
|
+
const maybeSendDeletedClients = () => {
|
|
15481
|
+
if (this.#deletedClients) {
|
|
15482
|
+
if (this.#deletedClients.length > 0) {
|
|
15483
|
+
send(socket, ["deleteClients", { clientIDs: this.#deletedClients }]);
|
|
15484
|
+
}
|
|
15485
|
+
this.#deletedClients = void 0;
|
|
15486
|
+
}
|
|
15487
|
+
};
|
|
15359
15488
|
if (queriesPatch.size > 0 && this.#initConnectionQueries !== void 0) {
|
|
15360
|
-
|
|
15489
|
+
maybeSendDeletedClients();
|
|
15490
|
+
send(socket, [
|
|
15361
15491
|
"changeDesiredQueries",
|
|
15362
15492
|
{
|
|
15363
15493
|
desiredQueriesPatch: [...queriesPatch.values()]
|
|
15364
15494
|
}
|
|
15365
15495
|
]);
|
|
15366
15496
|
} else if (this.#initConnectionQueries === void 0) {
|
|
15367
|
-
send(
|
|
15497
|
+
send(socket, [
|
|
15368
15498
|
"initConnection",
|
|
15369
15499
|
{
|
|
15370
|
-
desiredQueriesPatch: [...queriesPatch.values()]
|
|
15500
|
+
desiredQueriesPatch: [...queriesPatch.values()],
|
|
15501
|
+
deletedClients: this.#deletedClients && this.#deletedClients.length > 0 ? this.#deletedClients : void 0
|
|
15371
15502
|
}
|
|
15372
15503
|
]);
|
|
15504
|
+
this.#deletedClients = void 0;
|
|
15373
15505
|
}
|
|
15374
15506
|
this.#initConnectionQueries = void 0;
|
|
15507
|
+
maybeSendDeletedClients();
|
|
15375
15508
|
this.#setConnectionState(Connected);
|
|
15376
15509
|
this.#connectResolver.resolve();
|
|
15377
15510
|
}
|
|
@@ -15425,9 +15558,10 @@ var Zero = class {
|
|
|
15425
15558
|
clearTimeout(timeoutID);
|
|
15426
15559
|
};
|
|
15427
15560
|
this.#closeAbortController.signal.addEventListener("abort", abortHandler);
|
|
15428
|
-
const [ws, initConnectionQueries] = await createSocket(
|
|
15561
|
+
const [ws, initConnectionQueries, deletedClients] = await createSocket(
|
|
15429
15562
|
this.#rep,
|
|
15430
15563
|
this.#queryManager,
|
|
15564
|
+
this.#deleteClientsManager,
|
|
15431
15565
|
toWSString(this.#server),
|
|
15432
15566
|
this.#connectCookie,
|
|
15433
15567
|
this.clientID,
|
|
@@ -15446,6 +15580,7 @@ var Zero = class {
|
|
|
15446
15580
|
return;
|
|
15447
15581
|
}
|
|
15448
15582
|
this.#initConnectionQueries = initConnectionQueries;
|
|
15583
|
+
this.#deletedClients = deletedClients;
|
|
15449
15584
|
ws.addEventListener("message", this.#onMessage);
|
|
15450
15585
|
ws.addEventListener("open", this.#onOpen);
|
|
15451
15586
|
ws.addEventListener("close", this.#onClose);
|
|
@@ -15901,7 +16036,7 @@ var Zero = class {
|
|
|
15901
16036
|
return rv;
|
|
15902
16037
|
}
|
|
15903
16038
|
};
|
|
15904
|
-
async function createSocket(rep, queryManager, socketOrigin, baseCookie, clientID, clientGroupID, schemaVersion, userID, auth, lmid, wsid, debugPerf, lc, maxHeaderLength = 1024 * 8, additionalConnectParams) {
|
|
16039
|
+
async function createSocket(rep, queryManager, deleteClientsManager, socketOrigin, baseCookie, clientID, clientGroupID, schemaVersion, userID, auth, lmid, wsid, debugPerf, lc, maxHeaderLength = 1024 * 8, additionalConnectParams) {
|
|
15905
16040
|
const url = new URL(
|
|
15906
16041
|
appendPath(socketOrigin, `/sync/v${PROTOCOL_VERSION}/connect`)
|
|
15907
16042
|
);
|
|
@@ -15928,16 +16063,24 @@ async function createSocket(rep, queryManager, socketOrigin, baseCookie, clientI
|
|
|
15928
16063
|
}
|
|
15929
16064
|
lc.info?.("Connecting to", url.toString());
|
|
15930
16065
|
const WS = mustGetBrowserGlobal("WebSocket");
|
|
15931
|
-
|
|
15932
|
-
|
|
15933
|
-
|
|
16066
|
+
const queriesPatchP = rep.query((tx) => queryManager.getQueriesPatch(tx));
|
|
16067
|
+
let deletedClients = await deleteClientsManager.getDeletedClients();
|
|
16068
|
+
let queriesPatch = await queriesPatchP;
|
|
15934
16069
|
let secProtocol = encodeSecProtocols(
|
|
15935
|
-
[
|
|
16070
|
+
[
|
|
16071
|
+
"initConnection",
|
|
16072
|
+
{
|
|
16073
|
+
desiredQueriesPatch: [...queriesPatch.values()],
|
|
16074
|
+
deletedClients: deletedClients.length > 0 ? deletedClients : void 0
|
|
16075
|
+
}
|
|
16076
|
+
],
|
|
15936
16077
|
auth
|
|
15937
16078
|
);
|
|
15938
16079
|
if (secProtocol.length > maxHeaderLength) {
|
|
15939
16080
|
secProtocol = encodeSecProtocols(void 0, auth);
|
|
15940
16081
|
queriesPatch = void 0;
|
|
16082
|
+
} else {
|
|
16083
|
+
deletedClients = void 0;
|
|
15941
16084
|
}
|
|
15942
16085
|
return [
|
|
15943
16086
|
new WS(
|
|
@@ -15945,7 +16088,8 @@ async function createSocket(rep, queryManager, socketOrigin, baseCookie, clientI
|
|
|
15945
16088
|
url.toString(),
|
|
15946
16089
|
secProtocol
|
|
15947
16090
|
),
|
|
15948
|
-
queriesPatch
|
|
16091
|
+
queriesPatch,
|
|
16092
|
+
deletedClients
|
|
15949
16093
|
];
|
|
15950
16094
|
}
|
|
15951
16095
|
function addWebSocketIDFromSocketToLogContext({ url }, lc) {
|
|
@@ -15978,7 +16122,7 @@ export {
|
|
|
15978
16122
|
dropAllDatabases,
|
|
15979
16123
|
relationships,
|
|
15980
16124
|
table,
|
|
15981
|
-
|
|
16125
|
+
string8 as string,
|
|
15982
16126
|
number4 as number,
|
|
15983
16127
|
boolean3 as boolean,
|
|
15984
16128
|
json,
|
|
@@ -15990,4 +16134,4 @@ export {
|
|
|
15990
16134
|
escapeLike,
|
|
15991
16135
|
Zero
|
|
15992
16136
|
};
|
|
15993
|
-
//# sourceMappingURL=chunk-
|
|
16137
|
+
//# sourceMappingURL=chunk-OPWNICE2.js.map
|