@rocicorp/zero 0.24.2025091100 → 0.24.2025092400

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 (232) hide show
  1. package/out/analyze-query/src/bin-analyze.js +7 -8
  2. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  3. package/out/analyze-query/src/explain-queries.d.ts +1 -1
  4. package/out/analyze-query/src/explain-queries.d.ts.map +1 -1
  5. package/out/analyze-query/src/run-ast.d.ts +13 -23
  6. package/out/analyze-query/src/run-ast.d.ts.map +1 -1
  7. package/out/analyze-query/src/run-ast.js +25 -20
  8. package/out/analyze-query/src/run-ast.js.map +1 -1
  9. package/out/{chunk-V2KPKXLX.js → chunk-5JTC5G4I.js} +254 -156
  10. package/out/chunk-5JTC5G4I.js.map +7 -0
  11. package/out/chunk-ASRS2LFV.js +35 -0
  12. package/out/chunk-ASRS2LFV.js.map +7 -0
  13. package/out/{chunk-FH5Q72JS.js → chunk-OQGMEB3H.js} +3 -3
  14. package/out/{chunk-MLYQCVBG.js → chunk-QZPMFA73.js} +1465 -945
  15. package/out/chunk-QZPMFA73.js.map +7 -0
  16. package/out/{inspector-NC6TPMRA.js → lazy-inspector-TOTYUTBC.js} +298 -231
  17. package/out/lazy-inspector-TOTYUTBC.js.map +7 -0
  18. package/out/react-native.js +276 -278
  19. package/out/react-native.js.map +4 -4
  20. package/out/react.js +13 -25
  21. package/out/react.js.map +2 -2
  22. package/out/replicache/src/connection-loop.d.ts.map +1 -1
  23. package/out/replicache/src/deleted-clients.d.ts +17 -10
  24. package/out/replicache/src/deleted-clients.d.ts.map +1 -1
  25. package/out/replicache/src/kv/expo-sqlite/store.d.ts +11 -0
  26. package/out/replicache/src/kv/expo-sqlite/store.d.ts.map +1 -0
  27. package/out/replicache/src/kv/idb-store.d.ts.map +1 -1
  28. package/out/replicache/src/kv/mem-store.d.ts.map +1 -1
  29. package/out/replicache/src/kv/op-sqlite/store.d.ts +14 -0
  30. package/out/replicache/src/kv/op-sqlite/store.d.ts.map +1 -0
  31. package/out/replicache/src/kv/op-sqlite/types.d.ts +13 -0
  32. package/out/replicache/src/kv/op-sqlite/types.d.ts.map +1 -0
  33. package/out/replicache/src/kv/read-impl.d.ts.map +1 -1
  34. package/out/replicache/src/kv/sqlite-store.d.ts +37 -63
  35. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -1
  36. package/out/replicache/src/kv/throw-if-closed.d.ts +12 -0
  37. package/out/replicache/src/kv/throw-if-closed.d.ts.map +1 -0
  38. package/out/replicache/src/kv/write-impl-base.d.ts.map +1 -1
  39. package/out/replicache/src/kv/write-impl.d.ts.map +1 -1
  40. package/out/replicache/src/persist/client-gc.d.ts.map +1 -1
  41. package/out/replicache/src/persist/client-group-gc.d.ts +2 -3
  42. package/out/replicache/src/persist/client-group-gc.d.ts.map +1 -1
  43. package/out/replicache/src/persist/clients.d.ts +2 -1
  44. package/out/replicache/src/persist/clients.d.ts.map +1 -1
  45. package/out/replicache/src/persist/collect-idb-databases.d.ts.map +1 -1
  46. package/out/replicache/src/process-scheduler.d.ts.map +1 -1
  47. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  48. package/out/shared/src/sentinels.d.ts +2 -0
  49. package/out/shared/src/sentinels.d.ts.map +1 -1
  50. package/out/shared/src/sentinels.js +7 -0
  51. package/out/shared/src/sentinels.js.map +1 -0
  52. package/out/shared/src/valita.js +1 -1
  53. package/out/shared/src/valita.js.map +1 -1
  54. package/out/solid.js +4 -4
  55. package/out/zero/package.json +4 -4
  56. package/out/zero/src/zero-cache-dev.js +4 -0
  57. package/out/zero/src/zero-cache-dev.js.map +1 -1
  58. package/out/zero-cache/src/config/network.d.ts.map +1 -1
  59. package/out/zero-cache/src/config/network.js +1 -2
  60. package/out/zero-cache/src/config/network.js.map +1 -1
  61. package/out/zero-cache/src/config/normalize.d.ts +1 -0
  62. package/out/zero-cache/src/config/normalize.d.ts.map +1 -1
  63. package/out/zero-cache/src/config/normalize.js +6 -0
  64. package/out/zero-cache/src/config/normalize.js.map +1 -1
  65. package/out/zero-cache/src/config/zero-config.d.ts +3 -0
  66. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  67. package/out/zero-cache/src/config/zero-config.js +35 -1
  68. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  69. package/out/zero-cache/src/server/anonymous-otel-start.d.ts +1 -0
  70. package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +1 -1
  71. package/out/zero-cache/src/server/anonymous-otel-start.js +18 -0
  72. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  73. package/out/zero-cache/src/server/inspector-delegate.d.ts +9 -0
  74. package/out/zero-cache/src/server/inspector-delegate.d.ts.map +1 -1
  75. package/out/zero-cache/src/server/inspector-delegate.js +19 -0
  76. package/out/zero-cache/src/server/inspector-delegate.js.map +1 -1
  77. package/out/zero-cache/src/server/reaper.d.ts.map +1 -1
  78. package/out/zero-cache/src/server/reaper.js +8 -0
  79. package/out/zero-cache/src/server/reaper.js.map +1 -1
  80. package/out/zero-cache/src/server/syncer.js +2 -2
  81. package/out/zero-cache/src/server/syncer.js.map +1 -1
  82. package/out/zero-cache/src/services/analyze.d.ts +9 -1
  83. package/out/zero-cache/src/services/analyze.d.ts.map +1 -1
  84. package/out/zero-cache/src/services/analyze.js +109 -39
  85. package/out/zero-cache/src/services/analyze.js.map +1 -1
  86. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +3 -1
  87. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  88. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -1
  89. package/out/zero-cache/src/services/change-streamer/schema/init.js +1 -0
  90. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  91. package/out/zero-cache/src/services/heapz.d.ts +1 -1
  92. package/out/zero-cache/src/services/heapz.d.ts.map +1 -1
  93. package/out/zero-cache/src/services/heapz.js +2 -2
  94. package/out/zero-cache/src/services/heapz.js.map +1 -1
  95. package/out/zero-cache/src/services/mutagen/pusher.d.ts +36 -0
  96. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  97. package/out/zero-cache/src/services/replicator/change-processor.js +1 -1
  98. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  99. package/out/zero-cache/src/services/replicator/incremental-sync.js +2 -2
  100. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  101. package/out/zero-cache/src/services/statz.d.ts +1 -1
  102. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  103. package/out/zero-cache/src/services/statz.js +3 -3
  104. package/out/zero-cache/src/services/statz.js.map +1 -1
  105. package/out/zero-cache/src/services/view-syncer/active-users-gauge.d.ts +16 -0
  106. package/out/zero-cache/src/services/view-syncer/active-users-gauge.d.ts.map +1 -0
  107. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js +50 -0
  108. package/out/zero-cache/src/services/view-syncer/active-users-gauge.js.map +1 -0
  109. package/out/zero-cache/src/services/view-syncer/client-schema.js +1 -1
  110. package/out/zero-cache/src/services/view-syncer/client-schema.js.map +1 -1
  111. package/out/zero-cache/src/services/view-syncer/cvr-purger.d.ts.map +1 -1
  112. package/out/zero-cache/src/services/view-syncer/cvr-purger.js +21 -5
  113. package/out/zero-cache/src/services/view-syncer/cvr-purger.js.map +1 -1
  114. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +1 -1
  115. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  116. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +2 -3
  117. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  118. package/out/zero-cache/src/services/view-syncer/view-syncer.js +41 -1
  119. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  120. package/out/zero-client/src/client/active-clients-manager.d.ts +2 -1
  121. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -1
  122. package/out/zero-client/src/client/delete-clients-manager.d.ts +3 -3
  123. package/out/zero-client/src/client/delete-clients-manager.d.ts.map +1 -1
  124. package/out/zero-client/src/client/inspector/client-group.d.ts +12 -0
  125. package/out/zero-client/src/client/inspector/client-group.d.ts.map +1 -0
  126. package/out/zero-client/src/client/inspector/client.d.ts +15 -0
  127. package/out/zero-client/src/client/inspector/client.d.ts.map +1 -0
  128. package/out/zero-client/src/client/inspector/html-dialog-prompt.d.ts +5 -0
  129. package/out/zero-client/src/client/inspector/html-dialog-prompt.d.ts.map +1 -0
  130. package/out/zero-client/src/client/inspector/inspector.d.ts +14 -18
  131. package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
  132. package/out/zero-client/src/client/inspector/lazy-inspector.d.ts +49 -0
  133. package/out/zero-client/src/client/inspector/lazy-inspector.d.ts.map +1 -0
  134. package/out/zero-client/src/client/inspector/query.d.ts +31 -0
  135. package/out/zero-client/src/client/inspector/query.d.ts.map +1 -0
  136. package/out/zero-client/src/client/options.d.ts +8 -4
  137. package/out/zero-client/src/client/options.d.ts.map +1 -1
  138. package/out/zero-client/src/client/zero.d.ts +6 -6
  139. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  140. package/out/zero-client/src/mod.d.ts +4 -1
  141. package/out/zero-client/src/mod.d.ts.map +1 -1
  142. package/out/zero-protocol/src/analyze-query-result.d.ts +22 -0
  143. package/out/zero-protocol/src/analyze-query-result.d.ts.map +1 -0
  144. package/out/zero-protocol/src/analyze-query-result.js +18 -0
  145. package/out/zero-protocol/src/analyze-query-result.js.map +1 -0
  146. package/out/zero-protocol/src/ast.d.ts +2 -0
  147. package/out/zero-protocol/src/ast.d.ts.map +1 -1
  148. package/out/zero-protocol/src/ast.js +2 -0
  149. package/out/zero-protocol/src/ast.js.map +1 -1
  150. package/out/zero-protocol/src/down.d.ts +20 -0
  151. package/out/zero-protocol/src/down.d.ts.map +1 -1
  152. package/out/zero-protocol/src/inspect-down.d.ts +64 -0
  153. package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
  154. package/out/zero-protocol/src/inspect-down.js +10 -1
  155. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  156. package/out/zero-protocol/src/inspect-up.d.ts +73 -10
  157. package/out/zero-protocol/src/inspect-up.d.ts.map +1 -1
  158. package/out/zero-protocol/src/inspect-up.js +20 -3
  159. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  160. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  161. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  162. package/out/zero-protocol/src/protocol-version.js +4 -1
  163. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  164. package/out/zero-protocol/src/up.d.ts +19 -1
  165. package/out/zero-protocol/src/up.d.ts.map +1 -1
  166. package/out/zero-react/src/use-query.d.ts.map +1 -1
  167. package/out/zero-react-native/src/mod.d.ts +2 -2
  168. package/out/zero-react-native/src/mod.d.ts.map +1 -1
  169. package/out/zero.js +4 -4
  170. package/out/zql/src/builder/builder.d.ts.map +1 -1
  171. package/out/zql/src/builder/builder.js +23 -11
  172. package/out/zql/src/builder/builder.js.map +1 -1
  173. package/out/zql/src/builder/debug-delegate.d.ts +2 -5
  174. package/out/zql/src/builder/debug-delegate.d.ts.map +1 -1
  175. package/out/zql/src/builder/debug-delegate.js +1 -0
  176. package/out/zql/src/builder/debug-delegate.js.map +1 -1
  177. package/out/zql/src/ivm/constraint.js +1 -1
  178. package/out/zql/src/ivm/constraint.js.map +1 -1
  179. package/out/zql/src/ivm/fan-in.d.ts.map +1 -1
  180. package/out/zql/src/ivm/fan-in.js +3 -92
  181. package/out/zql/src/ivm/fan-in.js.map +1 -1
  182. package/out/zql/src/ivm/fan-out.js +2 -2
  183. package/out/zql/src/ivm/fan-out.js.map +1 -1
  184. package/out/zql/src/ivm/flipped-join.d.ts +33 -0
  185. package/out/zql/src/ivm/flipped-join.d.ts.map +1 -0
  186. package/out/zql/src/ivm/flipped-join.js +341 -0
  187. package/out/zql/src/ivm/flipped-join.js.map +1 -0
  188. package/out/zql/src/ivm/join-utils.d.ts +14 -0
  189. package/out/zql/src/ivm/join-utils.d.ts.map +1 -0
  190. package/out/zql/src/ivm/join-utils.js +94 -0
  191. package/out/zql/src/ivm/join-utils.js.map +1 -0
  192. package/out/zql/src/ivm/join.d.ts +1 -1
  193. package/out/zql/src/ivm/join.d.ts.map +1 -1
  194. package/out/zql/src/ivm/join.js +3 -101
  195. package/out/zql/src/ivm/join.js.map +1 -1
  196. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  197. package/out/zql/src/ivm/memory-source.js +15 -4
  198. package/out/zql/src/ivm/memory-source.js.map +1 -1
  199. package/out/zql/src/ivm/push-accumulated.d.ts +88 -0
  200. package/out/zql/src/ivm/push-accumulated.d.ts.map +1 -0
  201. package/out/zql/src/ivm/push-accumulated.js +326 -0
  202. package/out/zql/src/ivm/push-accumulated.js.map +1 -0
  203. package/out/zql/src/query/expression.d.ts +3 -3
  204. package/out/zql/src/query/expression.d.ts.map +1 -1
  205. package/out/zql/src/query/expression.js +1 -1
  206. package/out/zql/src/query/expression.js.map +1 -1
  207. package/out/zql/src/query/query-impl.d.ts +3 -4
  208. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  209. package/out/zql/src/query/query-impl.js +12 -5
  210. package/out/zql/src/query/query-impl.js.map +1 -1
  211. package/out/zql/src/query/query.d.ts +6 -3
  212. package/out/zql/src/query/query.d.ts.map +1 -1
  213. package/out/zql/src/query/query.js.map +1 -1
  214. package/out/zqlite/src/db.d.ts +1 -1
  215. package/out/zqlite/src/db.d.ts.map +1 -1
  216. package/out/zqlite/src/db.js +3 -3
  217. package/out/zqlite/src/db.js.map +1 -1
  218. package/out/zqlite/src/table-source.d.ts +0 -1
  219. package/out/zqlite/src/table-source.d.ts.map +1 -1
  220. package/out/zqlite/src/table-source.js +4 -5
  221. package/out/zqlite/src/table-source.js.map +1 -1
  222. package/package.json +4 -4
  223. package/out/chunk-MKB4RXL3.js +0 -15
  224. package/out/chunk-MKB4RXL3.js.map +0 -7
  225. package/out/chunk-MLYQCVBG.js.map +0 -7
  226. package/out/chunk-V2KPKXLX.js.map +0 -7
  227. package/out/inspector-NC6TPMRA.js.map +0 -7
  228. package/out/replicache/src/expo/store.d.ts +0 -4
  229. package/out/replicache/src/expo/store.d.ts.map +0 -1
  230. package/out/zero-client/src/client/inspector/types.d.ts +0 -50
  231. package/out/zero-client/src/client/inspector/types.d.ts.map +0 -1
  232. /package/out/{chunk-FH5Q72JS.js.map → chunk-OQGMEB3H.js.map} +0 -0
@@ -1,8 +1,9 @@
1
1
  import {
2
- promiseFalse,
3
- promiseTrue,
4
- promiseVoid
5
- } from "./chunk-MKB4RXL3.js";
2
+ maybeTransactionIsClosedRejection,
3
+ storeIsClosedRejection,
4
+ throwIfStoreClosed,
5
+ transactionIsClosedRejection
6
+ } from "./chunk-ASRS2LFV.js";
6
7
  import {
7
8
  BTreeRead,
8
9
  Chunk,
@@ -13,6 +14,7 @@ import {
13
14
  DiffsMap,
14
15
  ENTITIES_KEY_PREFIX,
15
16
  GOT_QUERIES_KEY_PREFIX,
17
+ Inspector,
16
18
  Latest,
17
19
  MUTATIONS_KEY_PREFIX,
18
20
  TDigest,
@@ -57,7 +59,9 @@ import {
57
59
  diff2,
58
60
  diffCommits,
59
61
  disableClientGroup,
62
+ emptyFunction,
60
63
  emptyHash,
64
+ emptyObject,
61
65
  encodeIndexScanKey,
62
66
  filterPush,
63
67
  getClientGroup,
@@ -128,7 +132,7 @@ import {
128
132
  withWrite,
129
133
  withWriteNoImplicitCommit,
130
134
  wrapIterable
131
- } from "./chunk-MLYQCVBG.js";
135
+ } from "./chunk-QZPMFA73.js";
132
136
  import {
133
137
  assert,
134
138
  assertArray,
@@ -329,6 +333,14 @@ function mustGetBrowserGlobal(name) {
329
333
  return r;
330
334
  }
331
335
 
336
+ // ../shared/src/resolved-promises.ts
337
+ var promiseTrue = Promise.resolve(true);
338
+ var promiseFalse = Promise.resolve(false);
339
+ var promiseUndefined = Promise.resolve(void 0);
340
+ var promiseVoid = Promise.resolve();
341
+ var promiseNever = new Promise(() => {
342
+ });
343
+
332
344
  // ../replicache/src/kv/write-impl-base.ts
333
345
  var deleteSentinel = Symbol();
334
346
  var WriteImplBase = class {
@@ -338,6 +350,9 @@ var WriteImplBase = class {
338
350
  this.#read = read;
339
351
  }
340
352
  has(key) {
353
+ if (this.#read.closed) {
354
+ return transactionIsClosedRejection();
355
+ }
341
356
  switch (this._pending.get(key)) {
342
357
  case void 0:
343
358
  return this.#read.has(key);
@@ -348,6 +363,9 @@ var WriteImplBase = class {
348
363
  }
349
364
  }
350
365
  async get(key) {
366
+ if (this.#read.closed) {
367
+ return transactionIsClosedRejection();
368
+ }
351
369
  const v = this._pending.get(key);
352
370
  switch (v) {
353
371
  case deleteSentinel:
@@ -361,12 +379,10 @@ var WriteImplBase = class {
361
379
  }
362
380
  }
363
381
  put(key, value) {
364
- this._pending.set(key, deepFreeze(value));
365
- return promiseVoid;
382
+ return maybeTransactionIsClosedRejection(this.#read) ?? (this._pending.set(key, deepFreeze(value)), promiseVoid);
366
383
  }
367
384
  del(key) {
368
- this._pending.set(key, deleteSentinel);
369
- return promiseVoid;
385
+ return maybeTransactionIsClosedRejection(this.#read) ?? (this._pending.set(key, deleteSentinel), promiseVoid);
370
386
  }
371
387
  release() {
372
388
  this.#read.release();
@@ -387,9 +403,15 @@ var IDBStore = class {
387
403
  this.#db = openDatabase(name);
388
404
  }
389
405
  read() {
406
+ if (this.#closed) {
407
+ return storeIsClosedRejection();
408
+ }
390
409
  return this.#withReopen(readImpl);
391
410
  }
392
411
  write() {
412
+ if (this.#closed) {
413
+ return storeIsClosedRejection();
414
+ }
393
415
  return this.#withReopen(writeImpl);
394
416
  }
395
417
  async close() {
@@ -451,6 +473,9 @@ var ReadImpl = class {
451
473
  this.#tx = tx;
452
474
  }
453
475
  has(key) {
476
+ if (this.#closed) {
477
+ return transactionIsClosedRejection();
478
+ }
454
479
  return new Promise((resolve, reject) => {
455
480
  const req = objectStore(this.#tx).count(key);
456
481
  req.onsuccess = () => resolve(req.result > 0);
@@ -458,6 +483,9 @@ var ReadImpl = class {
458
483
  });
459
484
  }
460
485
  get(key) {
486
+ if (this.#closed) {
487
+ return transactionIsClosedRejection();
488
+ }
461
489
  return new Promise((resolve, reject) => {
462
490
  const req = objectStore(this.#tx).get(key);
463
491
  req.onsuccess = () => resolve(deepFreezeAllowUndefined(req.result));
@@ -479,6 +507,9 @@ var WriteImpl = class extends WriteImplBase {
479
507
  this.#tx = tx;
480
508
  }
481
509
  commit() {
510
+ if (this.#closed) {
511
+ return transactionIsClosedRejection();
512
+ }
482
513
  if (this._pending.size === 0) {
483
514
  return promiseVoid;
484
515
  }
@@ -498,6 +529,7 @@ var WriteImpl = class extends WriteImplBase {
498
529
  }
499
530
  release() {
500
531
  this.#closed = true;
532
+ super.release();
501
533
  }
502
534
  get closed() {
503
535
  return this.#closed;
@@ -550,7 +582,7 @@ var AbortError = class extends Error {
550
582
  // ../shared/src/sleep.ts
551
583
  import { resolver as resolver2 } from "@rocicorp/resolver";
552
584
  var promiseVoid2 = Promise.resolve();
553
- var promiseNever = new Promise(() => void 0);
585
+ var promiseNever2 = new Promise(() => void 0);
554
586
  function sleep(ms, signal) {
555
587
  const newAbortError = () => new AbortError("Aborted");
556
588
  if (signal?.aborted) {
@@ -576,7 +608,7 @@ function sleep(ms, signal) {
576
608
  }
577
609
  function sleepWithAbort(ms, signal) {
578
610
  if (ms === 0) {
579
- return [promiseVoid2, promiseNever];
611
+ return [promiseVoid2, promiseNever2];
580
612
  }
581
613
  const { promise: abortedPromise, resolve: abortedResolve } = resolver2();
582
614
  const sleepPromise = new Promise((resolve) => {
@@ -927,17 +959,46 @@ var WriteImpl2 = class extends ReadImpl2 {
927
959
  };
928
960
 
929
961
  // ../replicache/src/deleted-clients.ts
930
- var DELETED_CLIENTS_HEAD_NAME = "deleted-clients";
931
- var deletedClientsSchema = readonlyObject({
932
- clientIDs: readonlyArray(valita_exports.string()),
933
- clientGroupIDs: readonlyArray(valita_exports.string())
934
- });
935
- var legacyDeletedClientsSchema = readonlyArray(valita_exports.string());
936
- async function setDeletedClients(dagWrite, clientIDs, clientGroupIDs) {
937
- const data = {
938
- clientIDs: normalize(clientIDs),
939
- clientGroupIDs: normalize(clientGroupIDs)
940
- };
962
+ var DELETED_CLIENTS_HEAD_NAME = "deleted-clients-v2";
963
+ var deletedClientsSchema = readonlyArray(
964
+ readonlyObject({
965
+ clientGroupID: clientGroupIDSchema,
966
+ clientID: clientIDSchema
967
+ })
968
+ );
969
+ function compare(a, b) {
970
+ const cg = stringCompare(a.clientGroupID, b.clientGroupID);
971
+ if (cg !== 0) {
972
+ return cg;
973
+ }
974
+ return stringCompare(a.clientID, b.clientID);
975
+ }
976
+ function normalizeDeletedClients(deletedClients) {
977
+ return [...deletedClients].sort(compare).filter(
978
+ (item, index) => index === 0 || compare(item, [...deletedClients].sort(compare)[index - 1]) !== 0
979
+ );
980
+ }
981
+ function mergeDeletedClients(a, b) {
982
+ const merged = [];
983
+ a = normalizeDeletedClients(a);
984
+ b = normalizeDeletedClients(b);
985
+ for (let i = 0, j = 0; i < a.length || j < b.length; ) {
986
+ if (i < a.length && (j >= b.length || compare(a[i], b[j]) < 0)) {
987
+ merged.push(a[i]);
988
+ i++;
989
+ } else if (j < b.length && (i >= a.length || compare(b[j], a[i]) < 0)) {
990
+ merged.push(b[j]);
991
+ j++;
992
+ } else {
993
+ merged.push(a[i]);
994
+ i++;
995
+ j++;
996
+ }
997
+ }
998
+ return merged;
999
+ }
1000
+ async function setDeletedClients(dagWrite, deletedClients) {
1001
+ const data = normalizeDeletedClients(deletedClients);
941
1002
  const chunkData = deepFreeze(data);
942
1003
  const chunk = dagWrite.createChunk(chunkData, []);
943
1004
  await dagWrite.putChunk(chunk);
@@ -947,35 +1008,44 @@ async function setDeletedClients(dagWrite, clientIDs, clientGroupIDs) {
947
1008
  async function getDeletedClients(dagRead) {
948
1009
  const hash = await dagRead.getHead(DELETED_CLIENTS_HEAD_NAME);
949
1010
  if (hash === void 0) {
950
- return { clientIDs: [], clientGroupIDs: [] };
1011
+ return [];
951
1012
  }
952
1013
  const chunk = await dagRead.mustGetChunk(hash);
953
- const res = test(chunk.data, legacyDeletedClientsSchema);
954
- if (res.ok) {
955
- return { clientIDs: res.value, clientGroupIDs: [] };
1014
+ const res = test(chunk.data, deletedClientsSchema);
1015
+ if (!res.ok) {
1016
+ return [];
956
1017
  }
957
- return parse(chunk.data, deletedClientsSchema);
1018
+ return res.value;
958
1019
  }
959
- async function addDeletedClients(dagWrite, clientIDs, clientGroupIDs) {
960
- const { clientIDs: oldClientIDs, clientGroupIDs: oldClientGroupIDs } = await getDeletedClients(dagWrite);
1020
+ async function addDeletedClients(dagWrite, deletedClientsToAdd) {
1021
+ const oldDeletedClients = await getDeletedClients(dagWrite);
961
1022
  return setDeletedClients(
962
1023
  dagWrite,
963
- [...oldClientIDs, ...clientIDs],
964
- [...oldClientGroupIDs, ...clientGroupIDs]
1024
+ mergeDeletedClients(oldDeletedClients, deletedClientsToAdd)
965
1025
  );
966
1026
  }
967
- async function removeDeletedClients(dagWrite, clientIDs, clientGroupIDs) {
968
- const { clientIDs: oldClientIDs, clientGroupIDs: oldClientGroupIDs } = await getDeletedClients(dagWrite);
969
- const newDeletedClients = oldClientIDs.filter(
970
- (clientID) => !clientIDs.includes(clientID)
971
- );
972
- const newDeletedClientGroups = oldClientGroupIDs.filter(
973
- (clientGroupID) => !clientGroupIDs.includes(clientGroupID)
1027
+ async function confirmDeletedClients(dagWrite, deletedClientIds, deletedClientGroupIds) {
1028
+ const deletedClientIDSet = new Set(deletedClientIds);
1029
+ const deletedClientGroupIDSet = new Set(deletedClientGroupIds);
1030
+ const oldDeletedClients = await getDeletedClients(dagWrite);
1031
+ const clients = new Map(await getClients(dagWrite));
1032
+ for (const clientID of deletedClientIds) {
1033
+ clients.delete(clientID);
1034
+ }
1035
+ for (const clientGroupID of deletedClientGroupIds) {
1036
+ for (const [clientID, client] of clients) {
1037
+ if (client.clientGroupID === clientGroupID) {
1038
+ clients.delete(clientID);
1039
+ }
1040
+ }
1041
+ }
1042
+ await setClients(clients, dagWrite);
1043
+ return setDeletedClients(
1044
+ dagWrite,
1045
+ oldDeletedClients.filter(
1046
+ ({ clientGroupID, clientID }) => !deletedClientGroupIDSet.has(clientGroupID) && !deletedClientIDSet.has(clientID)
1047
+ )
974
1048
  );
975
- return setDeletedClients(dagWrite, newDeletedClients, newDeletedClientGroups);
976
- }
977
- function normalize(arr) {
978
- return [...new Set(arr)].sort();
979
1049
  }
980
1050
 
981
1051
  // ../shared/src/navigator.ts
@@ -1001,10 +1071,10 @@ var ReadImpl3 = class {
1001
1071
  return this.#closed;
1002
1072
  }
1003
1073
  has(key) {
1004
- return Promise.resolve(this.#map.has(key));
1074
+ return maybeTransactionIsClosedRejection(this) ?? Promise.resolve(this.#map.has(key));
1005
1075
  }
1006
1076
  get(key) {
1007
- return Promise.resolve(this.#map.get(key));
1077
+ return maybeTransactionIsClosedRejection(this) ?? Promise.resolve(this.#map.get(key));
1008
1078
  }
1009
1079
  };
1010
1080
 
@@ -1016,6 +1086,9 @@ var WriteImpl3 = class extends WriteImplBase {
1016
1086
  this.#map = map;
1017
1087
  }
1018
1088
  commit() {
1089
+ if (this.closed) {
1090
+ return transactionIsClosedRejection();
1091
+ }
1019
1092
  this._pending.forEach((value, key) => {
1020
1093
  if (value === deleteSentinel) {
1021
1094
  this.#map.delete(key);
@@ -1054,10 +1127,12 @@ var MemStore = class {
1054
1127
  this.#map = map;
1055
1128
  }
1056
1129
  async read() {
1130
+ throwIfStoreClosed(this);
1057
1131
  const release = await this.#rwLock.read();
1058
1132
  return new ReadImpl3(this.#map, release);
1059
1133
  }
1060
1134
  async write() {
1135
+ throwIfStoreClosed(this);
1061
1136
  const release = await this.#rwLock.write();
1062
1137
  return new WriteImpl3(this.#map, release);
1063
1138
  }
@@ -1312,16 +1387,11 @@ async function collectIDBDatabases(idbDatabasesStore, now, maxAge, kvDropStore,
1312
1387
  );
1313
1388
  const dbNamesToRemove = [];
1314
1389
  const dbNamesToKeep = [];
1315
- const clientIDsToRemove = [];
1316
- const clientGroupIDsToRemove = [];
1317
- for (const [
1318
- dbName,
1319
- [canCollect, clientIDs, clientGroupIDs]
1320
- ] of collectResults) {
1390
+ const deletedClientsToRemove = [];
1391
+ for (const [dbName, [canCollect, deletedClients]] of collectResults) {
1321
1392
  if (canCollect) {
1322
1393
  dbNamesToRemove.push(dbName);
1323
- clientIDsToRemove.push(...clientIDs);
1324
- clientGroupIDsToRemove.push(...clientGroupIDs);
1394
+ deletedClientsToRemove.push(...deletedClients);
1325
1395
  } else {
1326
1396
  dbNamesToKeep.push(dbName);
1327
1397
  }
@@ -1334,24 +1404,22 @@ async function collectIDBDatabases(idbDatabasesStore, now, maxAge, kvDropStore,
1334
1404
  if (errors.length) {
1335
1405
  throw errors[0];
1336
1406
  }
1337
- if (clientIDsToRemove.length || clientGroupIDsToRemove.length) {
1338
- const newClientIDsToRemove = clientIDsToRemove;
1339
- const newClientGroupIDsToRemove = clientGroupIDsToRemove;
1407
+ if (deletedClientsToRemove.length > 0) {
1408
+ let allDeletedClients = deletedClientsToRemove;
1340
1409
  for (const name of dbNamesToKeep) {
1341
1410
  await withWrite(newDagStore(name), async (dagWrite) => {
1342
- const { clientIDs, clientGroupIDs } = await addDeletedClients(
1411
+ const newDeletedClients = await addDeletedClients(
1343
1412
  dagWrite,
1344
- clientIDsToRemove,
1345
- clientGroupIDsToRemove
1413
+ deletedClientsToRemove
1414
+ );
1415
+ allDeletedClients = mergeDeletedClients(
1416
+ allDeletedClients,
1417
+ newDeletedClients
1346
1418
  );
1347
- newClientIDsToRemove.push(...clientIDs);
1348
- newClientGroupIDsToRemove.push(...clientGroupIDs);
1349
1419
  });
1350
1420
  }
1351
- onClientsDeleted(
1352
- normalize(newClientIDsToRemove),
1353
- normalize(newClientGroupIDsToRemove)
1354
- );
1421
+ const normalizedDeletedClients = normalizeDeletedClients(allDeletedClients);
1422
+ await onClientsDeleted(normalizedDeletedClients);
1355
1423
  }
1356
1424
  }
1357
1425
  async function dropDatabaseInternal(name, idbDatabasesStore, kvDropStore) {
@@ -1428,14 +1496,15 @@ function canDatabaseBeCollectedAndGetDeletedClientIDs(enableMutationRecovery, pe
1428
1496
  }
1429
1497
  }
1430
1498
  const clients = await getClients(read);
1431
- const { clientIDs, clientGroupIDs } = await getDeletedClients(read);
1432
- const newClientIDs = [...clientIDs];
1433
- const newClientGroupIDs = [...clientGroupIDs];
1499
+ const existingDeletedClients = await getDeletedClients(read);
1500
+ const deletedClients = [...existingDeletedClients];
1434
1501
  for (const [clientID, client] of clients) {
1435
- newClientIDs.push(clientID);
1436
- newClientGroupIDs.push(client.clientGroupID);
1502
+ deletedClients.push({
1503
+ clientID,
1504
+ clientGroupID: client.clientGroupID
1505
+ });
1437
1506
  }
1438
- return [true, newClientIDs, newClientGroupIDs];
1507
+ return [true, deletedClients];
1439
1508
  });
1440
1509
  }
1441
1510
 
@@ -1554,7 +1623,7 @@ function table(name) {
1554
1623
  primaryKey: []
1555
1624
  });
1556
1625
  }
1557
- function string3() {
1626
+ function string2() {
1558
1627
  return new ColumnBuilder({
1559
1628
  type: "string",
1560
1629
  optional: false,
@@ -2058,7 +2127,7 @@ var ConnectionLoop = class {
2058
2127
  }
2059
2128
  }
2060
2129
  counter++;
2061
- (async () => {
2130
+ void (async () => {
2062
2131
  const start = Date.now();
2063
2132
  let ok;
2064
2133
  let error;
@@ -3702,20 +3771,21 @@ function gcClients(clientID, dagStore, clientMaxInactiveTime, onClientsDeleted)
3702
3771
  if (id === clientID || now - client.heartbeatTimestampMs <= clientMaxInactiveTime) {
3703
3772
  newClients.set(id, client);
3704
3773
  } else {
3705
- deletedClients.push(id);
3774
+ deletedClients.push({
3775
+ clientGroupID: client.clientGroupID,
3776
+ clientID: id
3777
+ });
3706
3778
  }
3707
3779
  }
3708
3780
  if (newClients.size === clients.size) {
3709
3781
  return clients;
3710
3782
  }
3711
3783
  await setClients(newClients, dagWrite);
3712
- const { clientIDs, clientGroupIDs } = await addDeletedClients(
3784
+ const normalizedDeletedClients = await addDeletedClients(
3713
3785
  dagWrite,
3714
- deletedClients,
3715
- // gcClients does not delete client groups
3716
- []
3786
+ deletedClients
3717
3787
  );
3718
- onClientsDeleted(clientIDs, clientGroupIDs);
3788
+ await onClientsDeleted(normalizedDeletedClients);
3719
3789
  return newClients;
3720
3790
  });
3721
3791
  }
@@ -3723,15 +3793,11 @@ function gcClients(clientID, dagStore, clientMaxInactiveTime, onClientsDeleted)
3723
3793
  // ../replicache/src/persist/client-group-gc.ts
3724
3794
  var GC_INTERVAL_MS = 5 * 60 * 1e3;
3725
3795
  var latestGCUpdate2;
3726
- function initClientGroupGC(dagStore, enableMutationRecovery, onClientsDeleted, lc, signal) {
3796
+ function initClientGroupGC(dagStore, enableMutationRecovery, lc, signal) {
3727
3797
  initBgIntervalProcess(
3728
3798
  "ClientGroupGC",
3729
3799
  () => {
3730
- latestGCUpdate2 = gcClientGroups(
3731
- dagStore,
3732
- enableMutationRecovery,
3733
- onClientsDeleted
3734
- );
3800
+ latestGCUpdate2 = gcClientGroups(dagStore, enableMutationRecovery);
3735
3801
  return latestGCUpdate2;
3736
3802
  },
3737
3803
  () => GC_INTERVAL_MS,
@@ -3739,7 +3805,7 @@ function initClientGroupGC(dagStore, enableMutationRecovery, onClientsDeleted, l
3739
3805
  signal
3740
3806
  );
3741
3807
  }
3742
- function gcClientGroups(dagStore, enableMutationRecovery, onClientsDeleted) {
3808
+ function gcClientGroups(dagStore, enableMutationRecovery) {
3743
3809
  return withWrite(dagStore, async (tx) => {
3744
3810
  const clients = await getClients(tx);
3745
3811
  const clientGroupIDs = /* @__PURE__ */ new Set();
@@ -3756,7 +3822,6 @@ function gcClientGroups(dagStore, enableMutationRecovery, onClientsDeleted) {
3756
3822
  }
3757
3823
  }
3758
3824
  await setClientGroups(clientGroups, tx);
3759
- onClientsDeleted([], [...removeClientGroups].sort());
3760
3825
  return clientGroups;
3761
3826
  });
3762
3827
  }
@@ -4262,7 +4327,9 @@ var ProcessScheduler = class {
4262
4327
  #requestIdle;
4263
4328
  #scheduledResolver = void 0;
4264
4329
  #runResolver = void 0;
4330
+ // eslint-disable-next-line no-unused-private-class-members -- False positive, this is used in #run
4265
4331
  #runPromise = Promise.resolve();
4332
+ // eslint-disable-next-line no-unused-private-class-members -- False positive, this is used in #run
4266
4333
  #throttlePromise = Promise.resolve();
4267
4334
  /**
4268
4335
  * Supports scheduling a `process` to be run with certain constraints.
@@ -4309,7 +4376,7 @@ var ProcessScheduler = class {
4309
4376
  async #scheduleInternal() {
4310
4377
  try {
4311
4378
  await this.#runPromise;
4312
- } catch (e) {
4379
+ } catch (_e) {
4313
4380
  }
4314
4381
  await this.#throttlePromise;
4315
4382
  if (!this.#scheduledResolver) {
@@ -4922,8 +4989,7 @@ var ReplicacheImpl = class {
4922
4989
  enableScheduledRefresh = true,
4923
4990
  enablePullAndPushInOpen = true,
4924
4991
  enableClientGroupForking = true,
4925
- onClientsDeleted = () => {
4926
- }
4992
+ onClientsDeleted = () => promiseVoid
4927
4993
  } = implOptions;
4928
4994
  this.#zero = implOptions.zero;
4929
4995
  this.#auth = auth ?? "";
@@ -5068,13 +5134,7 @@ var ReplicacheImpl = class {
5068
5134
  this.#lc,
5069
5135
  signal
5070
5136
  );
5071
- initClientGroupGC(
5072
- this.perdag,
5073
- enableMutationRecovery,
5074
- onClientsDeleted,
5075
- this.#lc,
5076
- signal
5077
- );
5137
+ initClientGroupGC(this.perdag, enableMutationRecovery, this.#lc, signal);
5078
5138
  initNewClientChannel(
5079
5139
  this.name,
5080
5140
  this.idbName,
@@ -5655,7 +5715,7 @@ var ReplicacheImpl = class {
5655
5715
  const counter = this.#pushCounter + this.#pullCounter;
5656
5716
  if (delta === 1 && counter === 1 || counter === 0) {
5657
5717
  const syncing = counter > 0;
5658
- Promise.resolve().then(() => this.onSync?.(syncing));
5718
+ void Promise.resolve().then(() => this.onSync?.(syncing));
5659
5719
  }
5660
5720
  }
5661
5721
  /**
@@ -5757,6 +5817,7 @@ var ReplicacheImpl = class {
5757
5817
  return {
5758
5818
  client: result,
5759
5819
  server: trackingData.serverPromise,
5820
+ // eslint-disable-next-line no-thenable
5760
5821
  then: (onFulfilled, onRejected) => {
5761
5822
  this.#lc.warn?.(
5762
5823
  "Awaiting the mutator result directly is being deprecated. Please use `await z.mutate[mutatorName].client` or `await result.mutate[mutatorName].server`"
@@ -6364,7 +6425,7 @@ var downstreamSchema = valita_exports.union(
6364
6425
  );
6365
6426
 
6366
6427
  // ../zero-protocol/src/protocol-version.ts
6367
- var PROTOCOL_VERSION = 30;
6428
+ var PROTOCOL_VERSION = 33;
6368
6429
  var MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 18;
6369
6430
  assert(MIN_SERVER_SUPPORTED_SYNC_PROTOCOL < PROTOCOL_VERSION);
6370
6431
 
@@ -6591,7 +6652,7 @@ var ActiveClientsManager = class _ActiveClientsManager {
6591
6652
  }
6592
6653
  #removeClient(clientID) {
6593
6654
  if (this.#activeClients.delete(clientID)) {
6594
- this.onDelete?.(clientID);
6655
+ this.onDelete?.(clientID, this.clientGroupID);
6595
6656
  }
6596
6657
  }
6597
6658
  };
@@ -7247,7 +7308,7 @@ function constraintMatchesPrimaryKey(constraint, primary) {
7247
7308
  }
7248
7309
  constraintKeys.sort(stringCompare);
7249
7310
  for (let i = 0; i < constraintKeys.length; i++) {
7250
- if (constraintKeys[i][0] !== primary[i]) {
7311
+ if (constraintKeys[i] !== primary[i]) {
7251
7312
  return false;
7252
7313
  }
7253
7314
  }
@@ -7417,7 +7478,8 @@ var MemorySource = class _MemorySource {
7417
7478
  const callingConnectionIndex = this.#connections.indexOf(from);
7418
7479
  assert(callingConnectionIndex !== -1, "Output not found");
7419
7480
  const conn = this.#connections[callingConnectionIndex];
7420
- const { sort: requestedSort } = conn;
7481
+ const { sort: requestedSort, compareRows } = conn;
7482
+ const connectionComparator = (r1, r2) => compareRows(r1, r2) * (req.reverse ? -1 : 1);
7421
7483
  const pkConstraint = primaryKeyConstraintFromFilters(
7422
7484
  conn.filters?.condition,
7423
7485
  this.#primaryKey
@@ -7433,8 +7495,8 @@ var MemorySource = class _MemorySource {
7433
7495
  indexSort.push(...requestedSort);
7434
7496
  }
7435
7497
  const index = this.#getOrCreateIndex(indexSort, from);
7436
- const { data, comparator: compare } = index;
7437
- const comparator2 = (r1, r2) => compare(r1, r2) * (req.reverse ? -1 : 1);
7498
+ const { data, comparator: compare2 } = index;
7499
+ const indexComparator = (r1, r2) => compare2(r1, r2) * (req.reverse ? -1 : 1);
7438
7500
  const startAt = req.start?.row;
7439
7501
  let scanStart;
7440
7502
  if (fetchOrPkConstraint) {
@@ -7464,11 +7526,20 @@ var MemorySource = class _MemorySource {
7464
7526
  this.#overlay,
7465
7527
  this.#splitEditOverlay,
7466
7528
  callingConnectionIndex,
7467
- comparator2,
7529
+ // Use indexComparator, generateWithOverlayInner has a subtle dependency
7530
+ // on this. Since generateWithConstraint is done after
7531
+ // generateWithOverlay, the generator consumed by generateWithOverlayInner
7532
+ // does not end when the constraint stops matching and so the final
7533
+ // check to yield an add overlay if not yet yielded is not reached.
7534
+ // However, using the indexComparator the add overlay will be less than
7535
+ // the first row that does not match the constraint, and so any
7536
+ // not yet yielded add overlay will be yielded when the first row
7537
+ // not matching the constraint is reached.
7538
+ indexComparator,
7468
7539
  conn.filters?.predicate
7469
7540
  );
7470
7541
  const withConstraint = generateWithConstraint(
7471
- generateWithStart(withOverlay, req.start, comparator2),
7542
+ generateWithStart(withOverlay, req.start, connectionComparator),
7472
7543
  // we use `req.constraint` and not `fetchOrPkConstraint` here because we need to
7473
7544
  // AND the constraint with what could have been the primary key constraint
7474
7545
  req.constraint
@@ -7634,7 +7705,7 @@ function* genPush(change, exists, connections, setOverlay, setSplitEditOverlay)
7634
7705
  }
7635
7706
  setOverlay(void 0);
7636
7707
  }
7637
- function* generateWithStart(nodes, start, compare) {
7708
+ function* generateWithStart(nodes, start, compare2) {
7638
7709
  if (!start) {
7639
7710
  yield* nodes;
7640
7711
  return;
@@ -7643,11 +7714,11 @@ function* generateWithStart(nodes, start, compare) {
7643
7714
  for (const node of nodes) {
7644
7715
  if (!started) {
7645
7716
  if (start.basis === "at") {
7646
- if (compare(node.row, start.row) >= 0) {
7717
+ if (compare2(node.row, start.row) >= 0) {
7647
7718
  started = true;
7648
7719
  }
7649
7720
  } else if (start.basis === "after") {
7650
- if (compare(node.row, start.row) > 0) {
7721
+ if (compare2(node.row, start.row) > 0) {
7651
7722
  started = true;
7652
7723
  }
7653
7724
  }
@@ -7657,7 +7728,7 @@ function* generateWithStart(nodes, start, compare) {
7657
7728
  }
7658
7729
  }
7659
7730
  }
7660
- function* generateWithOverlay(startAt, rows, constraint, overlay, splitEditOverlay, connectionIndex, compare, filterPredicate) {
7731
+ function* generateWithOverlay(startAt, rows, constraint, overlay, splitEditOverlay, connectionIndex, compare2, filterPredicate) {
7661
7732
  let overlayToApply = void 0;
7662
7733
  if (splitEditOverlay && splitEditOverlay.outputIndex === connectionIndex) {
7663
7734
  overlayToApply = splitEditOverlay;
@@ -7668,12 +7739,12 @@ function* generateWithOverlay(startAt, rows, constraint, overlay, splitEditOverl
7668
7739
  startAt,
7669
7740
  constraint,
7670
7741
  overlayToApply,
7671
- compare,
7742
+ compare2,
7672
7743
  filterPredicate
7673
7744
  );
7674
- yield* generateWithOverlayInner(rows, overlays, compare);
7745
+ yield* generateWithOverlayInner(rows, overlays, compare2);
7675
7746
  }
7676
- function computeOverlays(startAt, constraint, overlay, compare, filterPredicate) {
7747
+ function computeOverlays(startAt, constraint, overlay, compare2, filterPredicate) {
7677
7748
  let overlays = {
7678
7749
  add: void 0,
7679
7750
  remove: void 0
@@ -7699,7 +7770,7 @@ function computeOverlays(startAt, constraint, overlay, compare, filterPredicate)
7699
7770
  break;
7700
7771
  }
7701
7772
  if (startAt) {
7702
- overlays = overlaysForStartAt(overlays, startAt, compare);
7773
+ overlays = overlaysForStartAt(overlays, startAt, compare2);
7703
7774
  }
7704
7775
  if (constraint) {
7705
7776
  overlays = overlaysForConstraint(overlays, constraint);
@@ -7709,8 +7780,8 @@ function computeOverlays(startAt, constraint, overlay, compare, filterPredicate)
7709
7780
  }
7710
7781
  return overlays;
7711
7782
  }
7712
- function overlaysForStartAt({ add, remove }, startAt, compare) {
7713
- const undefinedIfBeforeStartAt = (row) => row === void 0 || compare(row, startAt) < 0 ? void 0 : row;
7783
+ function overlaysForStartAt({ add, remove }, startAt, compare2) {
7784
+ const undefinedIfBeforeStartAt = (row) => row === void 0 || compare2(row, startAt) < 0 ? void 0 : row;
7714
7785
  return {
7715
7786
  add: undefinedIfBeforeStartAt(add),
7716
7787
  remove: undefinedIfBeforeStartAt(remove)
@@ -7730,19 +7801,19 @@ function overlaysForFilterPredicate({ add, remove }, filterPredicate) {
7730
7801
  remove: undefinedIfDoesntMatchFilter(remove)
7731
7802
  };
7732
7803
  }
7733
- function* generateWithOverlayInner(rowIterator, overlays, compare) {
7804
+ function* generateWithOverlayInner(rowIterator, overlays, compare2) {
7734
7805
  let addOverlayYielded = false;
7735
7806
  let removeOverlaySkipped = false;
7736
7807
  for (const row of rowIterator) {
7737
7808
  if (!addOverlayYielded && overlays.add) {
7738
- const cmp = compare(overlays.add, row);
7809
+ const cmp = compare2(overlays.add, row);
7739
7810
  if (cmp < 0) {
7740
7811
  addOverlayYielded = true;
7741
7812
  yield { row: overlays.add, relationships: {} };
7742
7813
  }
7743
7814
  }
7744
7815
  if (!removeOverlaySkipped && overlays.remove) {
7745
- const cmp = compare(overlays.remove, row);
7816
+ const cmp = compare2(overlays.remove, row);
7746
7817
  if (cmp === 0) {
7747
7818
  removeOverlaySkipped = true;
7748
7819
  continue;
@@ -8249,11 +8320,6 @@ async function deleteImpl(tx, arg, schema, ivmBranch) {
8249
8320
  }
8250
8321
  }
8251
8322
 
8252
- // ../shared/src/sentinels.ts
8253
- function emptyFunction() {
8254
- }
8255
- var emptyObject = Object.freeze({});
8256
-
8257
8323
  // ../zero-client/src/client/custom.ts
8258
8324
  var TransactionImpl = class {
8259
8325
  constructor(lc, repTx, schema) {
@@ -8374,30 +8440,40 @@ var DeleteClientsManager = class {
8374
8440
  #send;
8375
8441
  #lc;
8376
8442
  #dagStore;
8377
- constructor(send2, dagStore, lc) {
8443
+ #clientGroupID;
8444
+ constructor(send2, dagStore, lc, clientGroupID) {
8378
8445
  this.#send = send2;
8379
8446
  this.#dagStore = dagStore;
8380
8447
  this.#lc = lc;
8448
+ this.#clientGroupID = clientGroupID;
8381
8449
  }
8382
8450
  /**
8383
8451
  * This gets called by Replicache when it deletes clients from the persistent
8384
8452
  * storage.
8385
8453
  */
8386
- onClientsDeleted(clientIDs, clientGroupIDs) {
8387
- this.#lc.debug?.("DeletedClientsManager, send:", clientIDs);
8388
- this.#send(["deleteClients", { clientIDs, clientGroupIDs }]);
8454
+ async onClientsDeleted(deletedClients) {
8455
+ this.#lc.debug?.("DeletedClientsManager, send:", deletedClients);
8456
+ const clientGroupID = await this.#clientGroupID;
8457
+ this.#send([
8458
+ "deleteClients",
8459
+ {
8460
+ clientIDs: deletedClients.filter((dc) => dc.clientGroupID === clientGroupID).map((dc) => dc.clientID)
8461
+ }
8462
+ ]);
8389
8463
  }
8390
8464
  /**
8391
8465
  * Zero calls this after it connects to ensure that the server knows about all
8392
8466
  * the clients that might have been deleted locally since the last connection.
8393
8467
  */
8394
8468
  async sendDeletedClientsToServer() {
8469
+ const clientGroupID = await this.#clientGroupID;
8395
8470
  const deleted = await withRead(
8396
8471
  this.#dagStore,
8397
8472
  (dagRead) => getDeletedClients(dagRead)
8398
8473
  );
8399
- if (deleted.clientIDs.length > 0 || deleted.clientGroupIDs.length > 0) {
8400
- this.#send(["deleteClients", deleted]);
8474
+ const clientIDs = deleted.filter((d) => d.clientGroupID === clientGroupID).map((d) => d.clientID);
8475
+ if (clientIDs.length > 0) {
8476
+ this.#send(["deleteClients", { clientIDs }]);
8401
8477
  this.#lc.debug?.("DeletedClientsManager, send:", deleted);
8402
8478
  }
8403
8479
  }
@@ -8410,13 +8486,18 @@ var DeleteClientsManager = class {
8410
8486
  if (clientIDs.length > 0 || clientGroupIDs.length > 0) {
8411
8487
  return withWrite(this.#dagStore, async (dagWrite) => {
8412
8488
  this.#lc.debug?.("clientsDeletedOnServer:", clientIDs, clientGroupIDs);
8413
- await removeDeletedClients(dagWrite, clientIDs, clientGroupIDs);
8489
+ await confirmDeletedClients(dagWrite, clientIDs, clientGroupIDs);
8414
8490
  });
8415
8491
  }
8416
8492
  return promiseVoid;
8417
8493
  }
8418
- getDeletedClients() {
8419
- return withRead(this.#dagStore, getDeletedClients);
8494
+ async getDeletedClients() {
8495
+ const deletedClients = await withRead(
8496
+ this.#dagStore,
8497
+ (read) => getDeletedClients(read)
8498
+ );
8499
+ const clientGroupID = await this.#clientGroupID;
8500
+ return deletedClients.filter((d) => d.clientGroupID === clientGroupID);
8420
8501
  }
8421
8502
  };
8422
8503
 
@@ -8668,7 +8749,7 @@ function makeMessage(message, context, logLevel) {
8668
8749
  }
8669
8750
 
8670
8751
  // ../zero-client/src/client/version.ts
8671
- var version2 = "0.24.2025091100";
8752
+ var version2 = "0.24.2025092400";
8672
8753
 
8673
8754
  // ../zero-client/src/client/log-options.ts
8674
8755
  var LevelFilterLogSink = class {
@@ -10126,7 +10207,7 @@ var DEFAULT_QUERY_CHANGE_THROTTLE_MS = 10;
10126
10207
  function convertOnUpdateNeededReason(reason) {
10127
10208
  return { type: reason.type };
10128
10209
  }
10129
- function updateNeededReloadReasonMessage(reason, serverErrMsg) {
10210
+ function updateNeededReloadReasonMessage(reason) {
10130
10211
  const { type } = reason;
10131
10212
  let reasonMsg = "";
10132
10213
  switch (type) {
@@ -10142,8 +10223,8 @@ function updateNeededReloadReasonMessage(reason, serverErrMsg) {
10142
10223
  default:
10143
10224
  unreachable(type);
10144
10225
  }
10145
- if (serverErrMsg) {
10146
- reasonMsg += " " + serverErrMsg;
10226
+ if (reason.message) {
10227
+ reasonMsg += " " + reason.message;
10147
10228
  }
10148
10229
  return reasonMsg;
10149
10230
  }
@@ -10162,7 +10243,6 @@ var Zero = class _Zero {
10162
10243
  #lc;
10163
10244
  #logOptions;
10164
10245
  #enableAnalytics;
10165
- #schema;
10166
10246
  #clientSchema;
10167
10247
  #pokeHandler;
10168
10248
  #queryManager;
@@ -10223,6 +10303,7 @@ var Zero = class _Zero {
10223
10303
  // We use an accessor pair to allow the subclass to override the setter.
10224
10304
  #connectionState = Disconnected;
10225
10305
  #activeClientsManager;
10306
+ #inspector;
10226
10307
  #setConnectionState(state) {
10227
10308
  if (state === this.#connectionState) {
10228
10309
  return;
@@ -10366,7 +10447,6 @@ var Zero = class _Zero {
10366
10447
  }
10367
10448
  }
10368
10449
  this.storageKey = storageKey ?? "";
10369
- this.#schema = schema;
10370
10450
  const { clientSchema, hash } = clientSchemaFrom(schema);
10371
10451
  this.#clientSchema = clientSchema;
10372
10452
  const nameKey = JSON.stringify({
@@ -10422,7 +10502,7 @@ var Zero = class _Zero {
10422
10502
  enableMutationRecovery: false,
10423
10503
  enablePullAndPushInOpen: false,
10424
10504
  // Zero calls push in its connection management code
10425
- onClientsDeleted: (clientIDs, clientGroupIDs) => this.#deleteClientsManager.onClientsDeleted(clientIDs, clientGroupIDs),
10505
+ onClientsDeleted: (deletedClients) => this.#deleteClientsManager.onClientsDeleted(deletedClients),
10426
10506
  zero: new ZeroRep(
10427
10507
  this.#zeroContext,
10428
10508
  this.#ivmMain,
@@ -10446,9 +10526,11 @@ var Zero = class _Zero {
10446
10526
  rep.clientGroupID,
10447
10527
  this.clientID,
10448
10528
  this.#closeAbortController.signal,
10449
- (clientID) => this.#deleteClientsManager.onClientsDeleted([clientID], [])
10529
+ (clientID, clientGroupID) => this.#deleteClientsManager.onClientsDeleted([
10530
+ { clientGroupID, clientID }
10531
+ ])
10450
10532
  );
10451
- const onUpdateNeededCallback = (reason, serverErrorMsg) => {
10533
+ const onUpdateNeededCallback = (reason) => {
10452
10534
  if (onUpdateNeeded) {
10453
10535
  onUpdateNeeded(reason);
10454
10536
  } else {
@@ -10456,7 +10538,7 @@ var Zero = class _Zero {
10456
10538
  this.#lc,
10457
10539
  this.#reload,
10458
10540
  reason.type,
10459
- updateNeededReloadReasonMessage(reason, serverErrorMsg)
10541
+ updateNeededReloadReasonMessage(reason)
10460
10542
  );
10461
10543
  }
10462
10544
  };
@@ -10512,7 +10594,8 @@ var Zero = class _Zero {
10512
10594
  this.#deleteClientsManager = new DeleteClientsManager(
10513
10595
  (msg) => this.#send(msg),
10514
10596
  rep.perdag,
10515
- this.#lc
10597
+ this.#lc,
10598
+ this.#rep.clientGroupID
10516
10599
  );
10517
10600
  this.query = this.#registerQueries(schema);
10518
10601
  reportReloadReason(this.#lc);
@@ -10810,15 +10893,21 @@ var Zero = class _Zero {
10810
10893
  }
10811
10894
  lc.info?.(`${kind}: ${message}}`);
10812
10895
  const error = new ServerError(downMessage[1]);
10896
+ lc.error?.(`${error.kind}:
10897
+
10898
+ ${error.errorBody.message}`, error);
10813
10899
  this.#rejectMessageError?.reject(error);
10814
10900
  lc.debug?.("Rejecting connect resolver due to error", error);
10815
10901
  this.#connectResolver.reject(error);
10816
10902
  this.#disconnect(lc, { server: kind });
10817
10903
  if (kind === error_kind_enum_exports.VersionNotSupported) {
10818
- this.#onUpdateNeeded?.({ type: kind }, message);
10904
+ this.#onUpdateNeeded({ type: kind, message });
10819
10905
  } else if (kind === error_kind_enum_exports.SchemaVersionNotSupported) {
10820
10906
  await this.#rep.disableClientGroup();
10821
- this.#onUpdateNeeded?.({ type: "SchemaVersionNotSupported" }, message);
10907
+ this.#onUpdateNeeded({
10908
+ type: "SchemaVersionNotSupported",
10909
+ message
10910
+ });
10822
10911
  } else if (kind === error_kind_enum_exports.ClientNotFound) {
10823
10912
  await this.#rep.disableClientGroup();
10824
10913
  this.#onClientStateNotFound?.(onClientStateNotFoundServerReason(message));
@@ -10979,9 +11068,9 @@ var Zero = class _Zero {
10979
11068
  lc,
10980
11069
  this.#options.mutateURL,
10981
11070
  this.#options.getQueriesURL,
10982
- this.#options.maxHeaderLength,
10983
11071
  additionalConnectParams,
10984
- await this.#activeClientsManager
11072
+ await this.#activeClientsManager,
11073
+ this.#options.maxHeaderLength
10985
11074
  );
10986
11075
  if (this.closed) {
10987
11076
  return;
@@ -11454,16 +11543,14 @@ var Zero = class _Zero {
11454
11543
  return rv;
11455
11544
  }
11456
11545
  /**
11457
- * `inspect` returns an object that can be used to inspect the state of the
11546
+ * `inspector` is an object that can be used to inspect the state of the
11458
11547
  * queries a Zero instance uses. It is intended for debugging purposes.
11459
11548
  */
11460
- async inspect() {
11549
+ get inspector() {
11461
11550
  BUNDLE_SIZE: {
11462
- const m = await import("./inspector-NC6TPMRA.js");
11463
- return m.newInspector(
11551
+ return this.#inspector ??= new Inspector(
11464
11552
  this.#rep,
11465
11553
  this.#queryManager,
11466
- this.#schema,
11467
11554
  async () => {
11468
11555
  await this.#connectResolver.promise;
11469
11556
  return this.#socket;
@@ -11493,7 +11580,7 @@ var OnlineManager = class extends Subscribable {
11493
11580
  return this.#online;
11494
11581
  }
11495
11582
  };
11496
- async function createSocket(rep, queryManager, deleteClientsManager, socketOrigin, baseCookie, clientID, clientGroupID, clientSchema, userID, auth, lmid, wsid, debugPerf, lc, userPushURL, userQueryURL, maxHeaderLength = 1024 * 8, additionalConnectParams, activeClientsManager) {
11583
+ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigin, baseCookie, clientID, clientGroupID, clientSchema, userID, auth, lmid, wsid, debugPerf, lc, userPushURL, userQueryURL, additionalConnectParams, activeClientsManager, maxHeaderLength = 1024 * 8) {
11497
11584
  const url = new URL(
11498
11585
  appendPath(socketOrigin, `/sync/v${PROTOCOL_VERSION}/connect`)
11499
11586
  );
@@ -11520,7 +11607,8 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
11520
11607
  lc.info?.("Connecting to", url.toString());
11521
11608
  const WS = mustGetBrowserGlobal("WebSocket");
11522
11609
  const queriesPatchP = rep.query((tx) => queryManager.getQueriesPatch(tx));
11523
- let deletedClients = await deleteClientsManager.getDeletedClients();
11610
+ const deletedClientsArray = await deleteClientsManager.getDeletedClients();
11611
+ let deletedClients = convertDeletedClientsToBody(deletedClientsArray, clientGroupID);
11524
11612
  let queriesPatch = await queriesPatchP;
11525
11613
  const { activeClients } = activeClientsManager;
11526
11614
  let secProtocol = encodeSecProtocols(
@@ -11576,6 +11664,16 @@ function skipEmptyDeletedClients(deletedClients) {
11576
11664
  data.clientGroupIDs = skipEmptyArray(clientGroupIDs);
11577
11665
  return data;
11578
11666
  }
11667
+ function convertDeletedClientsToBody(deletedClients, clientGroupID) {
11668
+ if (deletedClients.length === 0) {
11669
+ return void 0;
11670
+ }
11671
+ const clientIDs = deletedClients.filter((pair) => pair.clientID && pair.clientGroupID === clientGroupID).map((pair) => pair.clientID);
11672
+ if (clientIDs.length === 0) {
11673
+ return void 0;
11674
+ }
11675
+ return { clientIDs };
11676
+ }
11579
11677
  function addWebSocketIDFromSocketToLogContext({ url }, lc) {
11580
11678
  const wsid = new URL(url).searchParams.get("wsid") ?? nanoid();
11581
11679
  return addWebSocketIDToLogContext(wsid, lc);
@@ -11616,7 +11714,7 @@ export {
11616
11714
  transformResponseMessageSchema,
11617
11715
  error_kind_enum_exports,
11618
11716
  table,
11619
- string3 as string,
11717
+ string2 as string,
11620
11718
  number2 as number,
11621
11719
  boolean,
11622
11720
  json,
@@ -11626,4 +11724,4 @@ export {
11626
11724
  update_needed_reason_type_enum_exports,
11627
11725
  Zero
11628
11726
  };
11629
- //# sourceMappingURL=chunk-V2KPKXLX.js.map
11727
+ //# sourceMappingURL=chunk-5JTC5G4I.js.map