@rocicorp/zero 0.14.2025021100 → 0.14.2025021201

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.
Files changed (146) hide show
  1. package/out/{chunk-OPWNICE2.js → chunk-M54D33ZI.js} +333 -477
  2. package/out/chunk-M54D33ZI.js.map +7 -0
  3. package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
  4. package/out/replicache/src/persist/client-group-gc.d.ts +2 -5
  5. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  6. package/out/replicache/src/persist/clients.d.ts +1 -0
  7. package/out/replicache/src/persist/clients.d.ts.map +1 -1
  8. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  9. package/out/replicache/src/replicache-impl.d.ts +1 -1
  10. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  11. package/out/shared/src/queue.d.ts +0 -15
  12. package/out/shared/src/queue.d.ts.map +1 -1
  13. package/out/shared/src/queue.js +0 -23
  14. package/out/shared/src/queue.js.map +1 -1
  15. package/out/shared/src/resolved-promises.d.ts +0 -4
  16. package/out/shared/src/resolved-promises.d.ts.map +1 -1
  17. package/out/shared/src/resolved-promises.js +0 -4
  18. package/out/shared/src/resolved-promises.js.map +1 -1
  19. package/out/solid.js +1 -1
  20. package/out/zero-cache/src/auth/load-schema.d.ts +3 -5
  21. package/out/zero-cache/src/auth/load-schema.d.ts.map +1 -1
  22. package/out/zero-cache/src/auth/load-schema.js +13 -19
  23. package/out/zero-cache/src/auth/load-schema.js.map +1 -1
  24. package/out/zero-cache/src/auth/read-authorizer.js +1 -1
  25. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  26. package/out/zero-cache/src/auth/write-authorizer.d.ts +2 -1
  27. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  28. package/out/zero-cache/src/auth/write-authorizer.js +6 -11
  29. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  30. package/out/zero-cache/src/config/zero-config.d.ts +205 -0
  31. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  32. package/out/zero-cache/src/config/zero-config.js +22 -0
  33. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  34. package/out/zero-cache/src/server/multi/config.d.ts +0 -4
  35. package/out/zero-cache/src/server/multi/config.d.ts.map +1 -1
  36. package/out/zero-cache/src/server/multi/config.js +0 -4
  37. package/out/zero-cache/src/server/multi/config.js.map +1 -1
  38. package/out/zero-cache/src/server/multi/run-worker.d.ts.map +1 -1
  39. package/out/zero-cache/src/server/multi/run-worker.js +2 -4
  40. package/out/zero-cache/src/server/multi/run-worker.js.map +1 -1
  41. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  42. package/out/zero-cache/src/server/syncer.js +3 -3
  43. package/out/zero-cache/src/server/syncer.js.map +1 -1
  44. package/out/zero-cache/src/services/change-source/custom/change-source.js +0 -4
  45. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  46. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  47. package/out/zero-cache/src/services/change-source/pg/schema/init.js +1 -3
  48. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  49. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +1 -2
  50. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  51. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +0 -16
  52. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  53. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +2 -1
  54. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  55. package/out/zero-cache/src/services/mutagen/mutagen.js +2 -2
  56. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  57. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +4 -6
  58. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  59. package/out/zero-cache/src/services/view-syncer/client-handler.js +11 -49
  60. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  61. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +1 -1
  62. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  63. package/out/zero-cache/src/services/view-syncer/cvr-store.js +3 -18
  64. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  65. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +8 -8
  66. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  67. package/out/zero-cache/src/services/view-syncer/cvr.js +16 -14
  68. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  69. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -1
  70. package/out/zero-cache/src/services/view-syncer/schema/init.js +0 -8
  71. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  72. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +0 -4
  73. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  74. package/out/zero-cache/src/services/view-syncer/view-syncer.js +16 -40
  75. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  76. package/out/zero-cache/src/types/pg.d.ts +0 -6
  77. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  78. package/out/zero-cache/src/types/pg.js +2 -15
  79. package/out/zero-cache/src/types/pg.js.map +1 -1
  80. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  81. package/out/zero-cache/src/workers/connection.js +7 -13
  82. package/out/zero-cache/src/workers/connection.js.map +1 -1
  83. package/out/zero-client/src/client/crud.d.ts.map +1 -1
  84. package/out/zero-client/src/client/query-manager.d.ts +1 -1
  85. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  86. package/out/zero-client/src/client/zero-poke-handler.d.ts +0 -1
  87. package/out/zero-client/src/client/zero-poke-handler.d.ts.map +1 -1
  88. package/out/zero-client/src/client/zero.d.ts +1 -6
  89. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  90. package/out/zero-protocol/src/connect.d.ts +0 -2
  91. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  92. package/out/zero-protocol/src/connect.js +0 -1
  93. package/out/zero-protocol/src/connect.js.map +1 -1
  94. package/out/zero-protocol/src/down.d.ts +0 -3
  95. package/out/zero-protocol/src/down.d.ts.map +1 -1
  96. package/out/zero-protocol/src/down.js +1 -2
  97. package/out/zero-protocol/src/down.js.map +1 -1
  98. package/out/zero-protocol/src/poke.d.ts +0 -2
  99. package/out/zero-protocol/src/poke.d.ts.map +1 -1
  100. package/out/zero-protocol/src/poke.js +0 -4
  101. package/out/zero-protocol/src/poke.js.map +1 -1
  102. package/out/zero-protocol/src/protocol-version.d.ts +3 -11
  103. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  104. package/out/zero-protocol/src/protocol-version.js +4 -14
  105. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  106. package/out/zero-protocol/src/up.d.ts +0 -1
  107. package/out/zero-protocol/src/up.d.ts.map +1 -1
  108. package/out/zero-schema/src/builder/schema-builder.d.ts +1 -0
  109. package/out/zero-schema/src/builder/schema-builder.d.ts.map +1 -1
  110. package/out/zero-schema/src/builder/schema-builder.js +49 -0
  111. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  112. package/out/zero-schema/src/compiled-permissions.d.ts +19 -23
  113. package/out/zero-schema/src/compiled-permissions.d.ts.map +1 -1
  114. package/out/zero-schema/src/compiled-permissions.js +4 -7
  115. package/out/zero-schema/src/compiled-permissions.js.map +1 -1
  116. package/out/zero-schema/src/mod.d.ts +1 -1
  117. package/out/zero-schema/src/mod.d.ts.map +1 -1
  118. package/out/zero-schema/src/permissions.d.ts.map +1 -1
  119. package/out/zero.js +1 -1
  120. package/out/zql/src/ivm/join.d.ts.map +1 -1
  121. package/out/zql/src/ivm/join.js +2 -6
  122. package/out/zql/src/ivm/join.js.map +1 -1
  123. package/out/zql/src/query/{static-query.d.ts → auth-query.d.ts} +3 -7
  124. package/out/zql/src/query/auth-query.d.ts.map +1 -0
  125. package/out/zql/src/query/{static-query.js → auth-query.js} +5 -9
  126. package/out/zql/src/query/auth-query.js.map +1 -0
  127. package/out/zql/src/query/query-impl.d.ts +2 -2
  128. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  129. package/out/zql/src/query/query-impl.js +8 -6
  130. package/out/zql/src/query/query-impl.js.map +1 -1
  131. package/package.json +3 -4
  132. package/out/chunk-OPWNICE2.js.map +0 -7
  133. package/out/replicache/src/deleted-clients.d.ts +0 -20
  134. package/out/replicache/src/deleted-clients.d.ts.map +0 -1
  135. package/out/zero/src/deploy-permissions.d.ts +0 -3
  136. package/out/zero/src/deploy-permissions.d.ts.map +0 -1
  137. package/out/zero/src/deploy-permissions.js +0 -3
  138. package/out/zero/src/deploy-permissions.js.map +0 -1
  139. package/out/zero-cache/src/scripts/deploy-permissions.d.ts +0 -2
  140. package/out/zero-cache/src/scripts/deploy-permissions.d.ts.map +0 -1
  141. package/out/zero-cache/src/scripts/deploy-permissions.js +0 -122
  142. package/out/zero-cache/src/scripts/deploy-permissions.js.map +0 -1
  143. package/out/zero-client/src/client/delete-clients-manager.d.ts +0 -34
  144. package/out/zero-client/src/client/delete-clients-manager.d.ts.map +0 -1
  145. package/out/zql/src/query/static-query.d.ts.map +0 -1
  146. package/out/zql/src/query/static-query.js.map +0 -1
@@ -397,8 +397,6 @@ 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
- });
402
400
 
403
401
  // ../replicache/src/frozen-json.ts
404
402
  var deepFrozenObjects = /* @__PURE__ */ new WeakSet();
@@ -725,7 +723,7 @@ var AbortError = class extends Error {
725
723
  // ../shared/src/sleep.ts
726
724
  import { resolver as resolver2 } from "@rocicorp/resolver";
727
725
  var promiseVoid2 = Promise.resolve();
728
- var promiseNever2 = new Promise(() => void 0);
726
+ var promiseNever = new Promise(() => void 0);
729
727
  function sleep(ms, signal) {
730
728
  const newAbortError = () => new AbortError("Aborted");
731
729
  if (signal?.aborted) {
@@ -751,7 +749,7 @@ function sleep(ms, signal) {
751
749
  }
752
750
  function sleepWithAbort(ms, signal) {
753
751
  if (ms === 0) {
754
- return [promiseVoid2, promiseNever2];
752
+ return [promiseVoid2, promiseNever];
755
753
  }
756
754
  const { promise: abortedPromise, resolve: abortedResolve } = resolver2();
757
755
  const sleepPromise = new Promise((resolve) => {
@@ -1418,40 +1416,6 @@ var WriteImpl2 = class extends ReadImpl2 {
1418
1416
  }
1419
1417
  };
1420
1418
 
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
-
1455
1419
  // ../replicache/src/format-version-enum.ts
1456
1420
  var DD31 = 5;
1457
1421
  var V6 = 6;
@@ -3095,13 +3059,13 @@ var DataNodeImpl = class extends NodeImpl {
3095
3059
  }
3096
3060
  }
3097
3061
  };
3098
- function readonlySplice(array12, start, deleteCount, ...items) {
3099
- const arr = array12.slice(0, start);
3062
+ function readonlySplice(array9, start, deleteCount, ...items) {
3063
+ const arr = array9.slice(0, start);
3100
3064
  for (let i = 0; i < items.length; i++) {
3101
3065
  arr.push(items[i]);
3102
3066
  }
3103
- for (let i = start + deleteCount; i < array12.length; i++) {
3104
- arr.push(array12[i]);
3067
+ for (let i = start + deleteCount; i < array9.length; i++) {
3068
+ arr.push(array9[i]);
3105
3069
  }
3106
3070
  return arr;
3107
3071
  }
@@ -6009,8 +5973,7 @@ function gcClients(clientID, dagStore, clientMaxInactiveTime, onClientsDeleted)
6009
5973
  return clients;
6010
5974
  }
6011
5975
  await setClients(newClients, dagWrite);
6012
- const normalized = await addDeletedClients(dagWrite, deletedClients);
6013
- onClientsDeleted(normalized);
5976
+ onClientsDeleted(deletedClients);
6014
5977
  return newClients;
6015
5978
  });
6016
5979
  }
@@ -6018,11 +5981,11 @@ function gcClients(clientID, dagStore, clientMaxInactiveTime, onClientsDeleted)
6018
5981
  // ../replicache/src/persist/client-group-gc.ts
6019
5982
  var GC_INTERVAL_MS = 5 * 60 * 1e3;
6020
5983
  var latestGCUpdate2;
6021
- function initClientGroupGC(dagStore, enableMutationRecovery, lc, signal) {
5984
+ function initClientGroupGC(dagStore, lc, signal) {
6022
5985
  initBgIntervalProcess(
6023
5986
  "ClientGroupGC",
6024
5987
  () => {
6025
- latestGCUpdate2 = gcClientGroups(dagStore, enableMutationRecovery);
5988
+ latestGCUpdate2 = gcClientGroups(dagStore);
6026
5989
  return latestGCUpdate2;
6027
5990
  },
6028
5991
  () => GC_INTERVAL_MS,
@@ -6030,16 +5993,17 @@ function initClientGroupGC(dagStore, enableMutationRecovery, lc, signal) {
6030
5993
  signal
6031
5994
  );
6032
5995
  }
6033
- function gcClientGroups(dagStore, enableMutationRecovery) {
5996
+ function gcClientGroups(dagStore) {
6034
5997
  return withWrite(dagStore, async (tx) => {
6035
5998
  const clients = await getClients(tx);
6036
5999
  const clientGroupIDs = /* @__PURE__ */ new Set();
6037
6000
  for (const client of clients.values()) {
6001
+ assertClientV6(client);
6038
6002
  clientGroupIDs.add(client.clientGroupID);
6039
6003
  }
6040
6004
  const clientGroups = /* @__PURE__ */ new Map();
6041
6005
  for (const [clientGroupID, clientGroup] of await getClientGroups(tx)) {
6042
- if (clientGroupIDs.has(clientGroupID) || enableMutationRecovery && clientGroupHasPendingMutations(clientGroup)) {
6006
+ if (clientGroupIDs.has(clientGroupID) || clientGroupHasPendingMutations(clientGroup)) {
6043
6007
  clientGroups.set(clientGroupID, clientGroup);
6044
6008
  }
6045
6009
  }
@@ -7056,14 +7020,14 @@ function diffBinarySearch(diff2, prefix, compareKey) {
7056
7020
  }
7057
7021
 
7058
7022
  // ../shared/src/random-values.ts
7059
- function getNonCryptoRandomValues(array12) {
7060
- if (array12 === null) {
7023
+ function getNonCryptoRandomValues(array9) {
7024
+ if (array9 === null) {
7061
7025
  throw new TypeError("array cannot be null");
7062
7026
  }
7063
- for (let i = 0; i < array12.length; i++) {
7064
- array12[i] = Math.floor(Math.random() * 256);
7027
+ for (let i = 0; i < array9.length; i++) {
7028
+ array9[i] = Math.floor(Math.random() * 256);
7065
7029
  }
7066
- return array12;
7030
+ return array9;
7067
7031
  }
7068
7032
 
7069
7033
  // ../replicache/src/sync/request-id.ts
@@ -7280,7 +7244,8 @@ var ReplicacheImpl = class {
7280
7244
  enableScheduledRefresh = true,
7281
7245
  enablePullAndPushInOpen = true,
7282
7246
  enableClientGroupForking = true,
7283
- onClientsDeleted = () => {
7247
+ onClientsDeleted = (clientIDs) => {
7248
+ this.#lc.info?.("ClientIDs deleted", clientIDs);
7284
7249
  }
7285
7250
  } = implOptions;
7286
7251
  this.auth = auth ?? "";
@@ -7424,7 +7389,7 @@ var ReplicacheImpl = class {
7424
7389
  this.#lc,
7425
7390
  signal
7426
7391
  );
7427
- initClientGroupGC(this.perdag, enableMutationRecovery, this.#lc, signal);
7392
+ initClientGroupGC(this.perdag, this.#lc, signal);
7428
7393
  initNewClientChannel(
7429
7394
  this.name,
7430
7395
  this.idbName,
@@ -8286,14 +8251,11 @@ async function collectIDBDatabases(idbDatabasesStore, now, maxAge, kvDropStore,
8286
8251
  )
8287
8252
  );
8288
8253
  const dbNamesToRemove = [];
8289
- const dbNamesToKeep = [];
8290
8254
  const clientIDsToRemove = [];
8291
8255
  for (const [dbName, [canCollect, clientIDs]] of collectResults) {
8292
8256
  if (canCollect) {
8293
8257
  dbNamesToRemove.push(dbName);
8294
8258
  clientIDsToRemove.push(...clientIDs);
8295
- } else {
8296
- dbNamesToKeep.push(dbName);
8297
8259
  }
8298
8260
  }
8299
8261
  const { errors } = await dropDatabases(
@@ -8305,15 +8267,7 @@ async function collectIDBDatabases(idbDatabasesStore, now, maxAge, kvDropStore,
8305
8267
  throw errors[0];
8306
8268
  }
8307
8269
  if (clientIDsToRemove.length) {
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));
8270
+ onClientsDeleted(clientIDsToRemove);
8317
8271
  }
8318
8272
  }
8319
8273
  async function dropDatabaseInternal(name, idbDatabasesStore, kvDropStore) {
@@ -8391,8 +8345,7 @@ function canDatabaseBeCollectedAndGetDeletedClientIDs(enableMutationRecovery, pe
8391
8345
  }
8392
8346
  }
8393
8347
  const clients = await getClients(read);
8394
- const oldDeletedClients = await getDeletedClients(read);
8395
- return [true, [...clients.keys(), ...oldDeletedClients]];
8348
+ return [true, [...clients.keys()]];
8396
8349
  });
8397
8350
  }
8398
8351
 
@@ -8421,6 +8374,87 @@ function one(...args) {
8421
8374
  }));
8422
8375
  }
8423
8376
 
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
+
8424
8458
  // ../zero-schema/src/builder/table-builder.ts
8425
8459
  function table(name) {
8426
8460
  return new TableBuilder({
@@ -8429,7 +8463,7 @@ function table(name) {
8429
8463
  primaryKey: []
8430
8464
  });
8431
8465
  }
8432
- function string8() {
8466
+ function string7() {
8433
8467
  return new ColumnBuilder({
8434
8468
  type: "string",
8435
8469
  optional: false,
@@ -8937,12 +8971,157 @@ function compareUTF8MaybeNull(a, b) {
8937
8971
  return 0;
8938
8972
  }
8939
8973
 
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);
8974
+ // ../zql/src/query/expression.ts
8975
+ var ExpressionBuilder = class {
8976
+ #exists;
8977
+ constructor(exists) {
8978
+ this.#exists = exists;
8979
+ this.exists = this.exists.bind(this);
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
+ }
8946
9125
 
8947
9126
  // ../zql/src/query/query-impl.ts
8948
9127
  import { resolver as resolver7 } from "@rocicorp/resolver";
@@ -9440,11 +9619,11 @@ var Join = class {
9440
9619
  const childSchema = child.getSchema();
9441
9620
  this.#schema = {
9442
9621
  ...parentSchema,
9622
+ isHidden: hidden,
9443
9623
  relationships: {
9444
9624
  ...parentSchema.relationships,
9445
9625
  [relationshipName]: {
9446
9626
  ...childSchema,
9447
- isHidden: hidden,
9448
9627
  system
9449
9628
  }
9450
9629
  }
@@ -9507,15 +9686,7 @@ var Join = class {
9507
9686
  });
9508
9687
  break;
9509
9688
  case "child":
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
- });
9689
+ this.#output.push(change);
9519
9690
  break;
9520
9691
  case "edit": {
9521
9692
  if (rowEqualsForCompoundKey(
@@ -10393,11 +10564,11 @@ function createPredicateImpl(rhs, operator) {
10393
10564
  case "LIKE":
10394
10565
  return getLikePredicate(rhs, "");
10395
10566
  case "NOT LIKE":
10396
- return not(getLikePredicate(rhs, ""));
10567
+ return not2(getLikePredicate(rhs, ""));
10397
10568
  case "ILIKE":
10398
10569
  return getLikePredicate(rhs, "i");
10399
10570
  case "NOT ILIKE":
10400
- return not(getLikePredicate(rhs, "i"));
10571
+ return not2(getLikePredicate(rhs, "i"));
10401
10572
  case "IN": {
10402
10573
  assert(Array.isArray(rhs));
10403
10574
  const set = new Set(rhs);
@@ -10413,7 +10584,7 @@ function createPredicateImpl(rhs, operator) {
10413
10584
  throw new Error(`Unexpected operator: ${operator}`);
10414
10585
  }
10415
10586
  }
10416
- function not(f) {
10587
+ function not2(f) {
10417
10588
  return (lhs) => !f(lhs);
10418
10589
  }
10419
10590
  function transformFilters(filters) {
@@ -10784,158 +10955,6 @@ var ArrayView = class {
10784
10955
  }
10785
10956
  };
10786
10957
 
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
10958
  // ../zql/src/query/dnf.ts
10940
10959
  function dnf(condition) {
10941
10960
  return unwrap(dnfInner(condition));
@@ -10990,7 +11009,6 @@ function unwrap(c) {
10990
11009
  }
10991
11010
 
10992
11011
  // ../zql/src/query/query-impl.ts
10993
- var astForTestingSymbol = Symbol();
10994
11012
  function newQuery(delegate, schema, table2) {
10995
11013
  return new QueryImpl(delegate, schema, table2);
10996
11014
  }
@@ -11021,10 +11039,6 @@ var AbstractQuery = class {
11021
11039
  get format() {
11022
11040
  return this.#format;
11023
11041
  }
11024
- // Not part of Query or QueryInternal interface
11025
- get [astForTestingSymbol]() {
11026
- return this.#ast;
11027
- }
11028
11042
  hash() {
11029
11043
  if (!this.#hash) {
11030
11044
  const ast = this._completeAst();
@@ -11152,7 +11166,6 @@ var AbstractQuery = class {
11152
11166
  parentField: firstRelation.sourceField,
11153
11167
  childField: firstRelation.destField
11154
11168
  },
11155
- hidden: true,
11156
11169
  subquery: {
11157
11170
  table: junctionSchema,
11158
11171
  alias: relationship,
@@ -11167,6 +11180,7 @@ var AbstractQuery = class {
11167
11180
  parentField: secondRelation.sourceField,
11168
11181
  childField: secondRelation.destField
11169
11182
  },
11183
+ hidden: true,
11170
11184
  subquery: addPrimaryKeysToAst(
11171
11185
  this.#schema.tables[destSchema],
11172
11186
  sq.#ast
@@ -11379,14 +11393,21 @@ var AbstractQuery = class {
11379
11393
  return this.#completedAST;
11380
11394
  }
11381
11395
  };
11396
+ var astForTestingSymbol = Symbol();
11382
11397
  var completedAstSymbol = Symbol();
11383
11398
  var QueryImpl = class extends AbstractQuery {
11384
11399
  #delegate;
11400
+ #ast;
11385
11401
  constructor(delegate, schema, tableName, ast = { table: tableName }, format) {
11386
11402
  super(schema, tableName, ast, format);
11387
11403
  this.#delegate = delegate;
11404
+ this.#ast = ast;
11388
11405
  }
11389
11406
  _system = "client";
11407
+ // Not part of Query or QueryInternal interface
11408
+ get [astForTestingSymbol]() {
11409
+ return this.#ast;
11410
+ }
11390
11411
  get [completedAstSymbol]() {
11391
11412
  return this._completeAst();
11392
11413
  }
@@ -11477,8 +11498,8 @@ function isCompoundKey(field) {
11477
11498
  return Array.isArray(field) && field.length >= 1;
11478
11499
  }
11479
11500
 
11480
- // ../zql/src/query/static-query.ts
11481
- var StaticQuery = class _StaticQuery extends AbstractQuery {
11501
+ // ../zql/src/query/auth-query.ts
11502
+ var AuthQuery = class _AuthQuery extends AbstractQuery {
11482
11503
  constructor(schema, tableName, ast = { table: tableName }, format) {
11483
11504
  super(schema, tableName, ast, format);
11484
11505
  }
@@ -11487,7 +11508,7 @@ var StaticQuery = class _StaticQuery extends AbstractQuery {
11487
11508
  }
11488
11509
  _system = "permissions";
11489
11510
  _newQuery(schema, tableName, ast, format) {
11490
- return new _StaticQuery(schema, tableName, ast, format);
11511
+ return new _AuthQuery(schema, tableName, ast, format);
11491
11512
  }
11492
11513
  get ast() {
11493
11514
  return this._completeAst();
@@ -11503,97 +11524,13 @@ var StaticQuery = class _StaticQuery extends AbstractQuery {
11503
11524
  }
11504
11525
  };
11505
11526
 
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
-
11587
11527
  // ../zero-schema/src/permissions.ts
11588
11528
  var ANYONE_CAN = void 0;
11589
11529
  var NOBODY_CAN = [];
11590
11530
  async function definePermissions(schema, definer) {
11591
11531
  const expressionBuilders = {};
11592
11532
  for (const name of Object.keys(schema.tables)) {
11593
- expressionBuilders[name] = new StaticQuery(
11594
- schema,
11595
- name
11596
- ).expressionBuilder();
11533
+ expressionBuilders[name] = new AuthQuery(schema, name).expressionBuilder();
11597
11534
  }
11598
11535
  const config = await definer();
11599
11536
  return compilePermissions(schema, config, expressionBuilders);
@@ -11603,13 +11540,10 @@ function compilePermissions(schema, authz, expressionBuilders) {
11603
11540
  return void 0;
11604
11541
  }
11605
11542
  const nameMapper = clientToServer(schema.tables);
11606
- const ret = {
11607
- protocolVersion: PROTOCOL_VERSION,
11608
- tables: {}
11609
- };
11543
+ const ret = {};
11610
11544
  for (const [tableName, tableConfig] of Object.entries(authz)) {
11611
11545
  const serverName = schema.tables[tableName].serverName ?? tableName;
11612
- ret.tables[serverName] = {
11546
+ ret[serverName] = {
11613
11547
  row: compileRowConfig(
11614
11548
  nameMapper,
11615
11549
  tableName,
@@ -11786,8 +11720,7 @@ var connectedMessageSchema = valita_exports.tuple([
11786
11720
  connectedBodySchema
11787
11721
  ]);
11788
11722
  var initConnectionBodySchema = valita_exports.object({
11789
- desiredQueriesPatch: queriesPatchSchema,
11790
- deletedClients: valita_exports.array(valita_exports.string()).optional()
11723
+ desiredQueriesPatch: queriesPatchSchema
11791
11724
  });
11792
11725
  var initConnectionMessageSchema = valita_exports.tuple([
11793
11726
  valita_exports.literal("initConnection"),
@@ -11801,15 +11734,6 @@ function encodeSecProtocols(initConnectionMessage, authToken) {
11801
11734
  return encodeURIComponent(btoa(JSON.stringify(protocols)));
11802
11735
  }
11803
11736
 
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
-
11813
11737
  // ../zero-protocol/src/error-kind-enum.ts
11814
11738
  var AuthInvalidated = "AuthInvalidated";
11815
11739
  var ClientNotFound = "ClientNotFound";
@@ -11971,10 +11895,6 @@ var pokePartBodySchema = valita_exports.object({
11971
11895
  });
11972
11896
  var pokeEndBodySchema = valita_exports.object({
11973
11897
  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(),
11978
11898
  // If `true`, the poke with id `pokeID` should be discarded without
11979
11899
  // applying it.
11980
11900
  cancel: valita_exports.boolean().optional()
@@ -12034,14 +11954,18 @@ var downstreamSchema = valita_exports.union(
12034
11954
  pokeStartMessageSchema,
12035
11955
  pokePartMessageSchema,
12036
11956
  pokeEndMessageSchema,
12037
- pullResponseMessageSchema,
12038
- deleteClientsMessageSchema
11957
+ pullResponseMessageSchema
12039
11958
  );
12040
11959
 
12041
11960
  // ../zero-protocol/src/mutation-type-enum.ts
12042
11961
  var CRUD = "crud";
12043
11962
  var Custom = "custom";
12044
11963
 
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
+
12045
11969
  // ../zero-protocol/src/push.ts
12046
11970
  var CRUD_MUTATION_NAME = "_zero_crud";
12047
11971
  var insertOpSchema = valita_exports.object({
@@ -13384,28 +13308,48 @@ var ZeroContext = class {
13384
13308
  // ../zero-client/src/client/crud.ts
13385
13309
  function makeCRUDMutate(schema, repMutate) {
13386
13310
  const { [CRUD_MUTATION_NAME]: zeroCRUD } = repMutate;
13311
+ let inBatch = false;
13387
13312
  const mutateBatch = async (body) => {
13388
- const ops = [];
13389
- const m = {};
13390
- for (const name of Object.keys(schema.tables)) {
13391
- m[name] = makeBatchCRUDMutate(name, schema, ops);
13313
+ if (inBatch) {
13314
+ throw new Error("Cannot call mutate inside a batch");
13315
+ }
13316
+ inBatch = true;
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`);
13392
13333
  }
13393
- const rv = await body(m);
13394
- await zeroCRUD({ ops });
13395
- return rv;
13396
13334
  };
13397
13335
  const mutate = {};
13398
13336
  for (const [name, tableSchema] of Object.entries(schema.tables)) {
13399
- mutate[name] = makeEntityCRUDMutate(name, tableSchema.primaryKey, zeroCRUD);
13337
+ mutate[name] = makeEntityCRUDMutate(
13338
+ name,
13339
+ tableSchema.primaryKey,
13340
+ zeroCRUD,
13341
+ assertNotInBatch
13342
+ );
13400
13343
  }
13401
13344
  return {
13402
13345
  mutate,
13403
13346
  mutateBatch
13404
13347
  };
13405
13348
  }
13406
- function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD) {
13349
+ function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD, assertNotInBatch) {
13407
13350
  return {
13408
13351
  insert: (value) => {
13352
+ assertNotInBatch(tableName, "insert");
13409
13353
  const op = {
13410
13354
  op: "insert",
13411
13355
  tableName,
@@ -13415,6 +13359,7 @@ function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD) {
13415
13359
  return zeroCRUD({ ops: [op] });
13416
13360
  },
13417
13361
  upsert: (value) => {
13362
+ assertNotInBatch(tableName, "upsert");
13418
13363
  const op = {
13419
13364
  op: "upsert",
13420
13365
  tableName,
@@ -13424,6 +13369,7 @@ function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD) {
13424
13369
  return zeroCRUD({ ops: [op] });
13425
13370
  },
13426
13371
  update: (value) => {
13372
+ assertNotInBatch(tableName, "update");
13427
13373
  const op = {
13428
13374
  op: "update",
13429
13375
  tableName,
@@ -13433,6 +13379,7 @@ function makeEntityCRUDMutate(tableName, primaryKey, zeroCRUD) {
13433
13379
  return zeroCRUD({ ops: [op] });
13434
13380
  },
13435
13381
  delete: (id) => {
13382
+ assertNotInBatch(tableName, "delete");
13436
13383
  const op = {
13437
13384
  op: "delete",
13438
13385
  tableName,
@@ -13683,53 +13630,6 @@ function makeTableCRUD(schema, tableName, tx, ivmBranch) {
13683
13630
  };
13684
13631
  }
13685
13632
 
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
-
13733
13633
  // ../zero-client/src/client/enable-analytics.ts
13734
13634
  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]?)$/;
13735
13635
  var IPV6_ADDRESS_HOSTNAME_REGEX = /^\[[a-fA-F0-9:]*:[a-fA-F0-9:]*\]$/;
@@ -13978,7 +13878,7 @@ function makeMessage(message, context, logLevel) {
13978
13878
  }
13979
13879
 
13980
13880
  // ../zero-client/src/client/version.ts
13981
- var version2 = "0.14.2025021100";
13881
+ var version2 = "0.14.2025021201";
13982
13882
 
13983
13883
  // ../zero-client/src/client/log-options.ts
13984
13884
  var LevelFilterLogSink = class {
@@ -14668,7 +14568,7 @@ var PokeHandler = class {
14668
14568
  this.#receivingPoke = void 0;
14669
14569
  return;
14670
14570
  }
14671
- this.#pokeBuffer.push({ ...this.#receivingPoke, pokeEnd });
14571
+ this.#pokeBuffer.push(this.#receivingPoke);
14672
14572
  this.#receivingPoke = void 0;
14673
14573
  if (!this.#pokePlaybackLoopRunning) {
14674
14574
  this.#startPlaybackLoop();
@@ -14744,8 +14644,7 @@ function mergePokes(pokeBuffer, schema, serverToClient2) {
14744
14644
  return void 0;
14745
14645
  }
14746
14646
  const { baseCookie } = pokeBuffer[0].pokeStart;
14747
- const lastPoke = pokeBuffer[pokeBuffer.length - 1];
14748
- const cookie = lastPoke.pokeEnd.cookie ?? lastPoke.pokeStart.cookie;
14647
+ const { cookie } = pokeBuffer[pokeBuffer.length - 1].pokeStart;
14749
14648
  const mergedPatch = [];
14750
14649
  const mergedLastMutationIDChanges = {};
14751
14650
  let prevPokeStart = void 0;
@@ -14951,7 +14850,6 @@ var Zero = class {
14951
14850
  #queryManager;
14952
14851
  #ivmSources;
14953
14852
  #clientToServer;
14954
- #deleteClientsManager;
14955
14853
  /**
14956
14854
  * The queries we sent when inside the sec-protocol header when establishing a connection.
14957
14855
  * More queries could be registered while we're waiting for the 'connected' message
@@ -14962,12 +14860,6 @@ var Zero = class {
14962
14860
  * and an `initConnection` message must be sent to the server after receiving the `connected` message.
14963
14861
  */
14964
14862
  #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;
14971
14863
  #lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
14972
14864
  #onPong = () => void 0;
14973
14865
  #online = false;
@@ -15103,8 +14995,7 @@ var Zero = class {
15103
14995
  };
15104
14996
  const replicacheImplOptions = {
15105
14997
  enableClientGroupForking: false,
15106
- enableMutationRecovery: false,
15107
- onClientsDeleted: (clientIDs) => this.#deleteClientsManager.onClientsDeleted(clientIDs)
14998
+ enableMutationRecovery: false
15108
14999
  };
15109
15000
  const rep = new ReplicacheImpl(replicacheOptions, replicacheImplOptions);
15110
15001
  this.#rep = rep;
@@ -15163,11 +15054,6 @@ var Zero = class {
15163
15054
  maxRecentQueries
15164
15055
  );
15165
15056
  this.#clientToServer = clientToServer(schema.tables);
15166
- this.#deleteClientsManager = new DeleteClientsManager(
15167
- (msg) => this.#send(msg),
15168
- rep.perdag,
15169
- this.#lc
15170
- );
15171
15057
  this.#zeroContext = new ZeroContext(
15172
15058
  this.#ivmSources.main,
15173
15059
  (ast, gotCallback) => this.#queryManager.add(ast, gotCallback),
@@ -15218,9 +15104,6 @@ var Zero = class {
15218
15104
  }
15219
15105
  }
15220
15106
  #sendChangeDesiredQueries(msg) {
15221
- this.#send(msg);
15222
- }
15223
- #send(msg) {
15224
15107
  if (this.#socket && this.#connectionState === Connected) {
15225
15108
  send(this.#socket, msg);
15226
15109
  }
@@ -15367,10 +15250,6 @@ var Zero = class {
15367
15250
  return this.#handlePullResponse(lc, downMessage);
15368
15251
  case "warm":
15369
15252
  break;
15370
- case "deleteClients":
15371
- return this.#deleteClientsManager.clientsDeletedOnServer(
15372
- downMessage[1].clientIDs
15373
- );
15374
15253
  default:
15375
15254
  msgType;
15376
15255
  rejectInvalidMessage();
@@ -15441,8 +15320,8 @@ var Zero = class {
15441
15320
  this.#metrics.lastConnectError.clear();
15442
15321
  const proceedingConnectErrorCount = this.#connectErrorCount;
15443
15322
  this.#connectErrorCount = 0;
15444
- let timeToConnectMs;
15445
- let connectMsgLatencyMs;
15323
+ let timeToConnectMs = void 0;
15324
+ let connectMsgLatencyMs = void 0;
15446
15325
  if (this.#connectStart === void 0) {
15447
15326
  lc.error?.(
15448
15327
  "Got connected message but connect start time is undefined. This should not happen."
@@ -15453,7 +15332,7 @@ var Zero = class {
15453
15332
  connectMsgLatencyMs = connectBody.timestamp !== void 0 ? now - connectBody.timestamp : void 0;
15454
15333
  this.#connectStart = void 0;
15455
15334
  }
15456
- let totalTimeToConnectMs;
15335
+ let totalTimeToConnectMs = void 0;
15457
15336
  if (this.#totalToConnectStart === void 0) {
15458
15337
  lc.error?.(
15459
15338
  "Got connected message but total to connect start time is undefined. This should not happen."
@@ -15473,38 +15352,26 @@ var Zero = class {
15473
15352
  });
15474
15353
  this.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
15475
15354
  lc.debug?.("Resolving connect resolver");
15476
- const socket = must(this.#socket);
15355
+ assert(this.#socket);
15477
15356
  const queriesPatch = await this.#rep.query(
15478
15357
  (tx) => this.#queryManager.getQueriesPatch(tx, this.#initConnectionQueries)
15479
15358
  );
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
- };
15488
15359
  if (queriesPatch.size > 0 && this.#initConnectionQueries !== void 0) {
15489
- maybeSendDeletedClients();
15490
- send(socket, [
15360
+ send(this.#socket, [
15491
15361
  "changeDesiredQueries",
15492
15362
  {
15493
15363
  desiredQueriesPatch: [...queriesPatch.values()]
15494
15364
  }
15495
15365
  ]);
15496
15366
  } else if (this.#initConnectionQueries === void 0) {
15497
- send(socket, [
15367
+ send(this.#socket, [
15498
15368
  "initConnection",
15499
15369
  {
15500
- desiredQueriesPatch: [...queriesPatch.values()],
15501
- deletedClients: this.#deletedClients && this.#deletedClients.length > 0 ? this.#deletedClients : void 0
15370
+ desiredQueriesPatch: [...queriesPatch.values()]
15502
15371
  }
15503
15372
  ]);
15504
- this.#deletedClients = void 0;
15505
15373
  }
15506
15374
  this.#initConnectionQueries = void 0;
15507
- maybeSendDeletedClients();
15508
15375
  this.#setConnectionState(Connected);
15509
15376
  this.#connectResolver.resolve();
15510
15377
  }
@@ -15558,10 +15425,9 @@ var Zero = class {
15558
15425
  clearTimeout(timeoutID);
15559
15426
  };
15560
15427
  this.#closeAbortController.signal.addEventListener("abort", abortHandler);
15561
- const [ws, initConnectionQueries, deletedClients] = await createSocket(
15428
+ const [ws, initConnectionQueries] = await createSocket(
15562
15429
  this.#rep,
15563
15430
  this.#queryManager,
15564
- this.#deleteClientsManager,
15565
15431
  toWSString(this.#server),
15566
15432
  this.#connectCookie,
15567
15433
  this.clientID,
@@ -15580,7 +15446,6 @@ var Zero = class {
15580
15446
  return;
15581
15447
  }
15582
15448
  this.#initConnectionQueries = initConnectionQueries;
15583
- this.#deletedClients = deletedClients;
15584
15449
  ws.addEventListener("message", this.#onMessage);
15585
15450
  ws.addEventListener("open", this.#onOpen);
15586
15451
  ws.addEventListener("close", this.#onClose);
@@ -16036,7 +15901,7 @@ var Zero = class {
16036
15901
  return rv;
16037
15902
  }
16038
15903
  };
16039
- async function createSocket(rep, queryManager, deleteClientsManager, socketOrigin, baseCookie, clientID, clientGroupID, schemaVersion, userID, auth, lmid, wsid, debugPerf, lc, maxHeaderLength = 1024 * 8, additionalConnectParams) {
15904
+ async function createSocket(rep, queryManager, socketOrigin, baseCookie, clientID, clientGroupID, schemaVersion, userID, auth, lmid, wsid, debugPerf, lc, maxHeaderLength = 1024 * 8, additionalConnectParams) {
16040
15905
  const url = new URL(
16041
15906
  appendPath(socketOrigin, `/sync/v${PROTOCOL_VERSION}/connect`)
16042
15907
  );
@@ -16063,24 +15928,16 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
16063
15928
  }
16064
15929
  lc.info?.("Connecting to", url.toString());
16065
15930
  const WS = mustGetBrowserGlobal("WebSocket");
16066
- const queriesPatchP = rep.query((tx) => queryManager.getQueriesPatch(tx));
16067
- let deletedClients = await deleteClientsManager.getDeletedClients();
16068
- let queriesPatch = await queriesPatchP;
15931
+ let queriesPatch = await rep.query(
15932
+ (tx) => queryManager.getQueriesPatch(tx)
15933
+ );
16069
15934
  let secProtocol = encodeSecProtocols(
16070
- [
16071
- "initConnection",
16072
- {
16073
- desiredQueriesPatch: [...queriesPatch.values()],
16074
- deletedClients: deletedClients.length > 0 ? deletedClients : void 0
16075
- }
16076
- ],
15935
+ ["initConnection", { desiredQueriesPatch: [...queriesPatch.values()] }],
16077
15936
  auth
16078
15937
  );
16079
15938
  if (secProtocol.length > maxHeaderLength) {
16080
15939
  secProtocol = encodeSecProtocols(void 0, auth);
16081
15940
  queriesPatch = void 0;
16082
- } else {
16083
- deletedClients = void 0;
16084
15941
  }
16085
15942
  return [
16086
15943
  new WS(
@@ -16088,8 +15945,7 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
16088
15945
  url.toString(),
16089
15946
  secProtocol
16090
15947
  ),
16091
- queriesPatch,
16092
- deletedClients
15948
+ queriesPatch
16093
15949
  ];
16094
15950
  }
16095
15951
  function addWebSocketIDFromSocketToLogContext({ url }, lc) {
@@ -16122,7 +15978,7 @@ export {
16122
15978
  dropAllDatabases,
16123
15979
  relationships,
16124
15980
  table,
16125
- string8 as string,
15981
+ string7 as string,
16126
15982
  number4 as number,
16127
15983
  boolean3 as boolean,
16128
15984
  json,
@@ -16134,4 +15990,4 @@ export {
16134
15990
  escapeLike,
16135
15991
  Zero
16136
15992
  };
16137
- //# sourceMappingURL=chunk-OPWNICE2.js.map
15993
+ //# sourceMappingURL=chunk-M54D33ZI.js.map