@rocicorp/zero 0.21.2025070201 → 0.22.2025070200

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 (122) hide show
  1. package/out/{chunk-CESYRWV4.js → chunk-43L7S6AU.js} +46 -34
  2. package/out/{chunk-CESYRWV4.js.map → chunk-43L7S6AU.js.map} +4 -4
  3. package/out/{chunk-UOYRI2SS.js → chunk-HTNKB2W7.js} +253 -55
  4. package/out/chunk-HTNKB2W7.js.map +7 -0
  5. package/out/{chunk-UYT6AWSA.js → chunk-ODTJYJ37.js} +3 -3
  6. package/out/{inspector-LF6RTN44.js → inspector-WSEHHWA3.js} +7 -3
  7. package/out/{inspector-LF6RTN44.js.map → inspector-WSEHHWA3.js.map} +2 -2
  8. package/out/react.js +2 -2
  9. package/out/shared/src/broadcast-channel.d.ts.map +1 -0
  10. package/out/solid.js +111 -99
  11. package/out/solid.js.map +4 -4
  12. package/out/zero-cache/src/config/zero-config.d.ts +8 -0
  13. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  14. package/out/zero-cache/src/config/zero-config.js +9 -0
  15. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  16. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  17. package/out/zero-cache/src/server/change-streamer.js +2 -2
  18. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  19. package/out/zero-cache/src/services/change-source/pg/copy-runner.d.ts.map +1 -1
  20. package/out/zero-cache/src/services/change-source/pg/copy-runner.js +4 -3
  21. package/out/zero-cache/src/services/change-source/pg/copy-runner.js.map +1 -1
  22. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  23. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +1 -1
  24. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  25. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +1 -1
  26. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  27. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +4 -4
  28. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  29. package/out/zero-cache/src/services/change-streamer/storer.d.ts +1 -1
  30. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  31. package/out/zero-cache/src/services/change-streamer/storer.js +10 -3
  32. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  33. package/out/zero-cache/src/services/mutagen/pusher.d.ts +6 -2
  34. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  35. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +12 -1
  36. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  37. package/out/zero-cache/src/services/view-syncer/cvr-store.js +41 -10
  38. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  39. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +4 -6
  40. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  41. package/out/zero-cache/src/services/view-syncer/cvr.js +16 -29
  42. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  43. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +2 -1
  44. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
  45. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +8 -7
  46. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  47. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -1
  48. package/out/zero-cache/src/services/view-syncer/schema/init.js +7 -0
  49. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  50. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  51. package/out/zero-cache/src/services/view-syncer/schema/types.js +3 -0
  52. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  53. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +2 -4
  54. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  55. package/out/zero-cache/src/services/view-syncer/view-syncer.js +144 -48
  56. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  57. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  58. package/out/zero-cache/src/workers/connection.js +1 -25
  59. package/out/zero-cache/src/workers/connection.js.map +1 -1
  60. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  61. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +1 -1
  62. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  63. package/out/zero-client/src/client/active-clients-manager.d.ts +49 -0
  64. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -0
  65. package/out/zero-client/src/client/inspector/types.d.ts +4 -2
  66. package/out/zero-client/src/client/inspector/types.d.ts.map +1 -1
  67. package/out/zero-client/src/client/zero.d.ts +2 -1
  68. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  69. package/out/zero-protocol/src/close-connection.d.ts +4 -0
  70. package/out/zero-protocol/src/close-connection.d.ts.map +1 -1
  71. package/out/zero-protocol/src/close-connection.js +2 -0
  72. package/out/zero-protocol/src/close-connection.js.map +1 -1
  73. package/out/zero-protocol/src/connect.d.ts +14 -0
  74. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  75. package/out/zero-protocol/src/connect.js +7 -0
  76. package/out/zero-protocol/src/connect.js.map +1 -1
  77. package/out/zero-protocol/src/down.d.ts +3 -1
  78. package/out/zero-protocol/src/down.d.ts.map +1 -1
  79. package/out/zero-protocol/src/inspect-down.d.ts +12 -4
  80. package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
  81. package/out/zero-protocol/src/inspect-down.js +7 -1
  82. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  83. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  84. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  85. package/out/zero-protocol/src/protocol-version.js +3 -1
  86. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  87. package/out/zero-protocol/src/up.d.ts +1 -0
  88. package/out/zero-protocol/src/up.d.ts.map +1 -1
  89. package/out/zero-schema/src/builder/table-builder.d.ts.map +1 -1
  90. package/out/zero-schema/src/builder/table-builder.js +6 -1
  91. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  92. package/out/zero-solid/src/mod.d.ts +2 -2
  93. package/out/zero-solid/src/mod.d.ts.map +1 -1
  94. package/out/zero-solid/src/solid-view.d.ts +8 -6
  95. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  96. package/out/zero-solid/src/{create-query.d.ts → use-query.d.ts} +7 -7
  97. package/out/zero-solid/src/use-query.d.ts.map +1 -0
  98. package/out/zero-solid/src/use-zero.d.ts +11 -0
  99. package/out/zero-solid/src/use-zero.d.ts.map +1 -0
  100. package/out/zero.js +3 -3
  101. package/out/zql/src/ivm/take.d.ts.map +1 -1
  102. package/out/zql/src/ivm/take.js +6 -0
  103. package/out/zql/src/ivm/take.js.map +1 -1
  104. package/out/zql/src/query/query-impl.d.ts +3 -3
  105. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  106. package/out/zql/src/query/query-impl.js +4 -4
  107. package/out/zql/src/query/query-impl.js.map +1 -1
  108. package/out/zql/src/query/query.d.ts +1 -1
  109. package/out/zql/src/query/ttl.d.ts +4 -0
  110. package/out/zql/src/query/ttl.d.ts.map +1 -1
  111. package/out/zql/src/query/ttl.js +12 -1
  112. package/out/zql/src/query/ttl.js.map +1 -1
  113. package/package.json +3 -3
  114. package/out/chunk-UOYRI2SS.js.map +0 -7
  115. package/out/replicache/src/broadcast-channel.d.ts.map +0 -1
  116. package/out/shared/src/ref-count.d.ts +0 -16
  117. package/out/shared/src/ref-count.d.ts.map +0 -1
  118. package/out/zero-solid/src/create-query.d.ts.map +0 -1
  119. package/out/zero-solid/src/create-zero.d.ts +0 -3
  120. package/out/zero-solid/src/create-zero.d.ts.map +0 -1
  121. /package/out/{chunk-UYT6AWSA.js.map → chunk-ODTJYJ37.js.map} +0 -0
  122. /package/out/{replicache → shared}/src/broadcast-channel.d.ts +0 -0
@@ -126,7 +126,7 @@ import {
126
126
  withWrite,
127
127
  withWriteNoImplicitCommit,
128
128
  wrapIterable
129
- } from "./chunk-CESYRWV4.js";
129
+ } from "./chunk-43L7S6AU.js";
130
130
  import {
131
131
  __export
132
132
  } from "./chunk-424PT5DM.js";
@@ -2815,7 +2815,7 @@ async function callPusher(pusher, body, requestID) {
2815
2815
  // ../replicache/src/mutation-recovery.ts
2816
2816
  var MUTATION_RECOVERY_LAZY_STORE_SOURCE_CHUNK_CACHE_SIZE_LIMIT = 10 * 2 ** 20;
2817
2817
 
2818
- // ../replicache/src/broadcast-channel.ts
2818
+ // ../shared/src/broadcast-channel.ts
2819
2819
  var NoopBroadcastChannel = class {
2820
2820
  name;
2821
2821
  onmessage = null;
@@ -5636,7 +5636,10 @@ var TableBuilder = class _TableBuilder {
5636
5636
  from(serverName) {
5637
5637
  return new _TableBuilder({
5638
5638
  ...this.#schema,
5639
- serverName
5639
+ // Strip the "public." schema if specified, as tables in the upstream
5640
+ // "public" schema are created without the schema prefix on the replica.
5641
+ // See liteTableName() in zero-cache/src/types/names.ts
5642
+ serverName: serverName.startsWith("public.") ? serverName.substring("public.".length) : serverName
5640
5643
  });
5641
5644
  }
5642
5645
  columns(columns) {
@@ -5838,7 +5841,7 @@ var SchemaVersionNotSupported2 = "SchemaVersionNotSupported";
5838
5841
 
5839
5842
  // ../zero-client/src/client/zero.ts
5840
5843
  import "@rocicorp/logger";
5841
- import { resolver as resolver8 } from "@rocicorp/resolver";
5844
+ import { resolver as resolver9 } from "@rocicorp/resolver";
5842
5845
 
5843
5846
  // ../zero-protocol/src/delete-clients.ts
5844
5847
  var deleteClientsBodySchema = valita_exports.union(
@@ -5897,7 +5900,14 @@ var initConnectionBodySchema = valita_exports.object({
5897
5900
  desiredQueriesPatch: upQueriesPatchSchema,
5898
5901
  clientSchema: clientSchemaSchema.optional(),
5899
5902
  deleted: deleteClientsBodySchema.optional(),
5900
- userPushParams: userPushParamsSchema.optional()
5903
+ userPushParams: userPushParamsSchema.optional(),
5904
+ /**
5905
+ * `activeClients` is an optional array of client IDs that are currently active
5906
+ * in the client group. This is used to inform the server about the clients
5907
+ * that are currently active (aka running, aka alive), so it can inactive
5908
+ * queries from inactive clients.
5909
+ */
5910
+ activeClients: valita_exports.array(valita_exports.string()).optional()
5901
5911
  });
5902
5912
  var initConnectionMessageSchema = valita_exports.tuple([
5903
5913
  valita_exports.literal("initConnection"),
@@ -6238,7 +6248,7 @@ var downstreamSchema = valita_exports.union(
6238
6248
  );
6239
6249
 
6240
6250
  // ../zero-protocol/src/protocol-version.ts
6241
- var PROTOCOL_VERSION = 18;
6251
+ var PROTOCOL_VERSION = 20;
6242
6252
  var MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 6;
6243
6253
  assert(MIN_SERVER_SUPPORTED_SYNC_PROTOCOL < PROTOCOL_VERSION);
6244
6254
 
@@ -6335,6 +6345,201 @@ function send(ws, data) {
6335
6345
  ws.send(JSON.stringify(data));
6336
6346
  }
6337
6347
 
6348
+ // ../zero-client/src/client/active-clients-manager.ts
6349
+ import { resolver as resolver7 } from "@rocicorp/resolver";
6350
+ var keyPrefix = "zero-active";
6351
+ function toLockName(clientGroupID, clientID) {
6352
+ return `${keyPrefix}/${clientGroupID}/${clientID}`;
6353
+ }
6354
+ function toBroadcastChannelName(clientGroupID) {
6355
+ return `${keyPrefix}/${clientGroupID}`;
6356
+ }
6357
+ function fromLockName(lockKey) {
6358
+ if (!lockKey || !lockKey.startsWith(keyPrefix)) {
6359
+ return void 0;
6360
+ }
6361
+ const parts = lockKey.slice(keyPrefix.length).split("/");
6362
+ if (parts.length !== 3) {
6363
+ return void 0;
6364
+ }
6365
+ return {
6366
+ clientGroupID: parts[1],
6367
+ clientID: parts[2]
6368
+ };
6369
+ }
6370
+ function ignoreAbortError(e) {
6371
+ if (e instanceof Error && e.name === "AbortError") {
6372
+ return;
6373
+ }
6374
+ throw e;
6375
+ }
6376
+ var ActiveClientsManager = class _ActiveClientsManager {
6377
+ clientGroupID;
6378
+ clientID;
6379
+ #resolver = resolver7();
6380
+ #lockManager;
6381
+ #activeClients = /* @__PURE__ */ new Set();
6382
+ /**
6383
+ * A callback that is called when a client is added to the client group.
6384
+ * It receives the client ID of the added client.
6385
+ */
6386
+ onAdd;
6387
+ /**
6388
+ * A callback that is called when a client is deleted from the client group.
6389
+ * It receives the client ID of the deleted client.
6390
+ */
6391
+ onDelete;
6392
+ /**
6393
+ * Creates an instance of `ActiveClientsManager` for the specified client
6394
+ * group and client ID. It will return a promise that resolves when the
6395
+ * instance is ready to use, which means that it has successfully acquired the
6396
+ * exclusive lock for the client and has retrieved the list of active clients.
6397
+ */
6398
+ static async create(clientGroupID, clientID, signal) {
6399
+ const instance = new _ActiveClientsManager(clientGroupID, clientID, signal);
6400
+ await instance.#init(clientGroupID, clientID, signal);
6401
+ return instance;
6402
+ }
6403
+ constructor(clientGroupID, clientID, signal) {
6404
+ this.clientGroupID = clientGroupID;
6405
+ this.clientID = clientID;
6406
+ this.#lockManager = getClientLockManager(signal);
6407
+ this.#activeClients.add(clientID);
6408
+ }
6409
+ async #init(clientGroupID, clientID, signal) {
6410
+ const name = toLockName(clientGroupID, clientID);
6411
+ const channel = new bc(toBroadcastChannelName(clientGroupID));
6412
+ channel.addEventListener(
6413
+ "message",
6414
+ (e) => {
6415
+ const client = fromLockName(e.data);
6416
+ if (client?.clientGroupID === this.clientGroupID) {
6417
+ this.#addClient(client.clientID);
6418
+ }
6419
+ },
6420
+ { signal }
6421
+ );
6422
+ this.#lockManager.request(name, "exclusive", () => this.#resolver.promise).catch(ignoreAbortError);
6423
+ signal.addEventListener(
6424
+ "abort",
6425
+ () => {
6426
+ this.#lockManager.release(name, () => this.#resolver.resolve());
6427
+ channel.close();
6428
+ },
6429
+ { once: true }
6430
+ );
6431
+ for (const clientID2 of await this.#getActiveClients()) {
6432
+ if (clientID2 !== this.clientID) {
6433
+ this.#addClient(clientID2);
6434
+ }
6435
+ }
6436
+ if (!signal.aborted) {
6437
+ channel.postMessage(name);
6438
+ }
6439
+ }
6440
+ get activeClients() {
6441
+ return this.#activeClients;
6442
+ }
6443
+ async #getActiveClients() {
6444
+ const activeClients = /* @__PURE__ */ new Set();
6445
+ for await (const lockName of this.#lockManager.queryExclusive()) {
6446
+ const client = fromLockName(lockName);
6447
+ if (client?.clientGroupID === this.clientGroupID) {
6448
+ activeClients.add(client.clientID);
6449
+ }
6450
+ }
6451
+ return activeClients;
6452
+ }
6453
+ /**
6454
+ * This gets called when a new client is added to the client group.
6455
+ *
6456
+ * It will request a shared lock for the client, and when the exclusive lock
6457
+ * is released, it will notify that the client has been deactivated.
6458
+ */
6459
+ #addSharedLockForOtherClient(clientID) {
6460
+ const name = toLockName(this.clientGroupID, clientID);
6461
+ this.#lockManager.request(name, "shared", () => this.#removeClient(clientID)).catch(ignoreAbortError);
6462
+ }
6463
+ #addClient(clientID) {
6464
+ if (!this.#activeClients.has(clientID)) {
6465
+ this.#activeClients.add(clientID);
6466
+ this.#addSharedLockForOtherClient(clientID);
6467
+ this.onAdd?.(clientID);
6468
+ }
6469
+ }
6470
+ #removeClient(clientID) {
6471
+ if (this.#activeClients.delete(clientID)) {
6472
+ this.onDelete?.(clientID);
6473
+ }
6474
+ }
6475
+ };
6476
+ function getClientLockManager(signal) {
6477
+ const locks = getBrowserGlobal("navigator")?.locks;
6478
+ if (locks) {
6479
+ return new NativeClientLockManager(locks, signal);
6480
+ }
6481
+ return new MockClientLockManager();
6482
+ }
6483
+ var NativeClientLockManager = class {
6484
+ #locks;
6485
+ #signal;
6486
+ constructor(locks, signal) {
6487
+ this.#locks = locks;
6488
+ this.#signal = signal;
6489
+ }
6490
+ request(name, mode, fn) {
6491
+ return this.#locks.request(name, { mode, signal: this.#signal }, fn);
6492
+ }
6493
+ release(_name, fn) {
6494
+ fn();
6495
+ }
6496
+ async *queryExclusive() {
6497
+ const snapshot = await this.#locks.query();
6498
+ for (const lock of [
6499
+ ...snapshot.held ?? [],
6500
+ ...snapshot.pending ?? []
6501
+ ]) {
6502
+ if (lock.mode === "exclusive" && lock.name) {
6503
+ yield lock.name;
6504
+ }
6505
+ }
6506
+ }
6507
+ };
6508
+ var mockLockNames = /* @__PURE__ */ new Set();
6509
+ var mockListeners = /* @__PURE__ */ new Set();
6510
+ var MockClientLockManager = class {
6511
+ #listeners = /* @__PURE__ */ new Set();
6512
+ request(name, mode, fn) {
6513
+ if (mode === "exclusive") {
6514
+ mockLockNames.add(name);
6515
+ } else {
6516
+ mode;
6517
+ const listener = (removed) => {
6518
+ if (removed === name) {
6519
+ mockListeners.delete(listener);
6520
+ return fn();
6521
+ }
6522
+ };
6523
+ mockListeners.add(listener);
6524
+ this.#listeners.add(listener);
6525
+ }
6526
+ return Promise.resolve();
6527
+ }
6528
+ release(name, fn) {
6529
+ mockLockNames.delete(name);
6530
+ for (const listener of mockListeners) {
6531
+ listener(name);
6532
+ }
6533
+ for (const listener of this.#listeners) {
6534
+ mockListeners.delete(listener);
6535
+ }
6536
+ fn();
6537
+ }
6538
+ async *queryExclusive() {
6539
+ yield* mockLockNames;
6540
+ }
6541
+ };
6542
+
6338
6543
  // ../zero-client/src/client/connection-state-enum.ts
6339
6544
  var Disconnected = 0;
6340
6545
  var Connecting = 1;
@@ -8328,7 +8533,7 @@ function makeMessage(message, context, logLevel) {
8328
8533
  }
8329
8534
 
8330
8535
  // ../zero-client/src/client/version.ts
8331
- var version2 = "0.21.2025070201";
8536
+ var version2 = "0.22.2025070200";
8332
8537
 
8333
8538
  // ../zero-client/src/client/log-options.ts
8334
8539
  var LevelFilterLogSink = class {
@@ -8623,7 +8828,7 @@ var State = class {
8623
8828
  };
8624
8829
 
8625
8830
  // ../zero-client/src/client/mutation-tracker.ts
8626
- import { resolver as resolver7 } from "@rocicorp/resolver";
8831
+ import { resolver as resolver8 } from "@rocicorp/resolver";
8627
8832
  var transientPushErrorTypes = [
8628
8833
  "zeroPusher",
8629
8834
  "http",
@@ -8653,7 +8858,7 @@ var MutationTracker = class {
8653
8858
  }
8654
8859
  trackMutation() {
8655
8860
  const id = nextEphemeralID();
8656
- const mutationResolver = resolver7();
8861
+ const mutationResolver = resolver8();
8657
8862
  this.#outstandingMutations.set(id, {
8658
8863
  resolver: mutationResolver
8659
8864
  });
@@ -9681,12 +9886,12 @@ var Zero = class _Zero {
9681
9886
  };
9682
9887
  #zeroContext;
9683
9888
  queryDelegate;
9684
- #connectResolver = resolver8();
9889
+ #connectResolver = resolver9();
9685
9890
  #pendingPullsByRequestID = /* @__PURE__ */ new Map();
9686
9891
  #lastMutationIDReceived = 0;
9687
9892
  #socket = void 0;
9688
- #socketResolver = resolver8();
9689
- #connectionStateChangeResolver = resolver8();
9893
+ #socketResolver = resolver9();
9894
+ #connectionStateChangeResolver = resolver9();
9690
9895
  /**
9691
9896
  * This resolver is only used for rejections. It is awaited in the connected
9692
9897
  * state (including when waiting for a pong). It is rejected when we get an
@@ -9697,13 +9902,14 @@ var Zero = class _Zero {
9697
9902
  #visibilityWatcher;
9698
9903
  // We use an accessor pair to allow the subclass to override the setter.
9699
9904
  #connectionState = Disconnected;
9905
+ #activeClientsManager;
9700
9906
  #setConnectionState(state) {
9701
9907
  if (state === this.#connectionState) {
9702
9908
  return;
9703
9909
  }
9704
9910
  this.#connectionState = state;
9705
9911
  this.#connectionStateChangeResolver.resolve(state);
9706
- this.#connectionStateChangeResolver = resolver8();
9912
+ this.#connectionStateChangeResolver = resolver9();
9707
9913
  if (false) {
9708
9914
  asTestZero(this)[onSetConnectionStateSymbol]?.(state);
9709
9915
  }
@@ -9890,6 +10096,12 @@ var Zero = class _Zero {
9890
10096
  this.userID = userID;
9891
10097
  this.#lc = lc.withContext("clientID", rep.clientID);
9892
10098
  this.#mutationTracker.clientID = rep.clientID;
10099
+ this.#activeClientsManager = makeActiveClientsManager(
10100
+ rep.clientGroupID,
10101
+ this.clientID,
10102
+ this.#closeAbortController.signal,
10103
+ (clientID) => this.#deleteClientsManager.onClientsDeleted([clientID], [])
10104
+ );
9893
10105
  const onUpdateNeededCallback = (reason, serverErrorMsg) => {
9894
10106
  if (onUpdateNeeded) {
9895
10107
  onUpdateNeeded(reason);
@@ -10121,21 +10333,12 @@ var Zero = class _Zero {
10121
10333
  const lc = this.#lc.withContext("close");
10122
10334
  lc.debug?.("Closing Zero instance. Stack:", new Error().stack);
10123
10335
  if (this.#connectionState !== Disconnected) {
10124
- let closeReason = JSON.stringify([
10125
- "closeConnection",
10126
- []
10127
- ]);
10128
- if (closeReason.length > 123) {
10129
- lc.warn?.("Close reason is too long. Removing it.");
10130
- closeReason = "";
10131
- }
10132
10336
  this.#disconnect(
10133
10337
  lc,
10134
10338
  {
10135
10339
  client: "ClientClosed"
10136
10340
  },
10137
- CLOSE_CODE_NORMAL,
10138
- closeReason
10341
+ CLOSE_CODE_NORMAL
10139
10342
  );
10140
10343
  }
10141
10344
  lc.debug?.("Aborting closeAbortController due to close()");
@@ -10145,15 +10348,6 @@ var Zero = class _Zero {
10145
10348
  this.#unexpose();
10146
10349
  return ret;
10147
10350
  }
10148
- #onPageHide = (e) => {
10149
- if (e.persisted) {
10150
- this.#lc.debug?.("Ignoring pagehide event because it was persisted");
10151
- } else {
10152
- this.#lc.debug?.("Closing client because we got a clean close");
10153
- this.close().catch(() => {
10154
- });
10155
- }
10156
- };
10157
10351
  #onMessage = (e) => {
10158
10352
  const lc = this.#lc;
10159
10353
  lc.debug?.("received message", e.data);
@@ -10414,7 +10608,8 @@ var Zero = class _Zero {
10414
10608
  lc,
10415
10609
  this.#options.push,
10416
10610
  this.#options.maxHeaderLength,
10417
- additionalConnectParams
10611
+ additionalConnectParams,
10612
+ await this.#activeClientsManager
10418
10613
  );
10419
10614
  if (this.closed) {
10420
10615
  return;
@@ -10426,10 +10621,6 @@ var Zero = class _Zero {
10426
10621
  ws.addEventListener("close", this.#onClose);
10427
10622
  this.#socket = ws;
10428
10623
  this.#socketResolver.resolve(ws);
10429
- getBrowserGlobal("window")?.addEventListener?.(
10430
- "pagehide",
10431
- this.#onPageHide
10432
- );
10433
10624
  try {
10434
10625
  lc.debug?.("Waiting for connection to be acknowledged");
10435
10626
  await this.#connectResolver.promise;
@@ -10444,7 +10635,7 @@ var Zero = class _Zero {
10444
10635
  );
10445
10636
  }
10446
10637
  }
10447
- #disconnect(lc, reason, closeCode, closeReason) {
10638
+ #disconnect(lc, reason, closeCode) {
10448
10639
  if (this.#connectionState === Connecting) {
10449
10640
  this.#connectErrorCount++;
10450
10641
  }
@@ -10488,9 +10679,9 @@ var Zero = class _Zero {
10488
10679
  lc.error?.("disconnect() called while disconnected");
10489
10680
  break;
10490
10681
  }
10491
- this.#socketResolver = resolver8();
10682
+ this.#socketResolver = resolver9();
10492
10683
  lc.debug?.("Creating new connect resolver");
10493
- this.#connectResolver = resolver8();
10684
+ this.#connectResolver = resolver9();
10494
10685
  this.#setConnectionState(Disconnected);
10495
10686
  this.#messageCount = 0;
10496
10687
  this.#connectStart = void 0;
@@ -10498,14 +10689,10 @@ var Zero = class _Zero {
10498
10689
  this.#socket?.removeEventListener("message", this.#onMessage);
10499
10690
  this.#socket?.removeEventListener("open", this.#onOpen);
10500
10691
  this.#socket?.removeEventListener("close", this.#onClose);
10501
- this.#socket?.close(closeCode, closeReason);
10692
+ this.#socket?.close(closeCode);
10502
10693
  this.#socket = void 0;
10503
10694
  this.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
10504
10695
  this.#pokeHandler.handleDisconnect();
10505
- getBrowserGlobal("window")?.removeEventListener?.(
10506
- "pagehide",
10507
- this.#onPageHide
10508
- );
10509
10696
  }
10510
10697
  #handlePokeStart(_lc, pokeMessage) {
10511
10698
  this.#abortPingTimeout();
@@ -10541,12 +10728,12 @@ var Zero = class _Zero {
10541
10728
  const body = pullResponseMessage[1];
10542
10729
  lc = lc.withContext("requestID", body.requestID);
10543
10730
  lc.debug?.("Handling pull response", body);
10544
- const resolver9 = this.#pendingPullsByRequestID.get(body.requestID);
10545
- if (!resolver9) {
10731
+ const resolver10 = this.#pendingPullsByRequestID.get(body.requestID);
10732
+ if (!resolver10) {
10546
10733
  lc.debug?.("No resolver found");
10547
10734
  return;
10548
10735
  }
10549
- resolver9.resolve(pullResponseMessage[1]);
10736
+ resolver10.resolve(pullResponseMessage[1]);
10550
10737
  }
10551
10738
  async #pusher(req, requestID) {
10552
10739
  assert(req.pushVersion === 1);
@@ -10677,7 +10864,7 @@ var Zero = class _Zero {
10677
10864
  PING_INTERVAL_MS,
10678
10865
  controller.signal
10679
10866
  );
10680
- this.#rejectMessageError = resolver8();
10867
+ this.#rejectMessageError = resolver9();
10681
10868
  const PING = 0;
10682
10869
  const HIDDEN = 2;
10683
10870
  const raceResult = await promiseRace([
@@ -10787,7 +10974,7 @@ var Zero = class _Zero {
10787
10974
  }
10788
10975
  ];
10789
10976
  send(socket, pullRequestMessage);
10790
- const pullResponseResolver = resolver8();
10977
+ const pullResponseResolver = resolver9();
10791
10978
  this.#pendingPullsByRequestID.set(requestID, pullResponseResolver);
10792
10979
  try {
10793
10980
  const TIMEOUT = 0;
@@ -10845,7 +11032,7 @@ var Zero = class _Zero {
10845
11032
  */
10846
11033
  async #ping(lc, messageErrorRejectionPromise) {
10847
11034
  lc.debug?.("pinging");
10848
- const { promise, resolve } = resolver8();
11035
+ const { promise, resolve } = resolver9();
10849
11036
  this.#onPong = resolve;
10850
11037
  const pingMessage = ["ping", {}];
10851
11038
  const t0 = performance.now();
@@ -10891,7 +11078,7 @@ var Zero = class _Zero {
10891
11078
  */
10892
11079
  async inspect() {
10893
11080
  BUNDLE_SIZE: {
10894
- const m = await import("./inspector-LF6RTN44.js");
11081
+ const m = await import("./inspector-WSEHHWA3.js");
10895
11082
  return m.newInspector(this.#rep, this.#schema, async () => {
10896
11083
  await this.#connectResolver.promise;
10897
11084
  return this.#socket;
@@ -10899,7 +11086,7 @@ var Zero = class _Zero {
10899
11086
  }
10900
11087
  }
10901
11088
  };
10902
- async function createSocket(rep, queryManager, deleteClientsManager, socketOrigin, baseCookie, clientID, clientGroupID, clientSchema, userID, auth, lmid, wsid, debugPerf, lc, userPushParams, maxHeaderLength = 1024 * 8, additionalConnectParams) {
11089
+ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigin, baseCookie, clientID, clientGroupID, clientSchema, userID, auth, lmid, wsid, debugPerf, lc, userPushParams, maxHeaderLength = 1024 * 8, additionalConnectParams, activeClientsManager) {
10903
11090
  const url = new URL(
10904
11091
  appendPath(socketOrigin, `/sync/v${PROTOCOL_VERSION}/connect`)
10905
11092
  );
@@ -10928,6 +11115,7 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
10928
11115
  const queriesPatchP = rep.query((tx) => queryManager.getQueriesPatch(tx));
10929
11116
  let deletedClients = await deleteClientsManager.getDeletedClients();
10930
11117
  let queriesPatch = await queriesPatchP;
11118
+ const { activeClients } = activeClientsManager;
10931
11119
  let secProtocol = encodeSecProtocols(
10932
11120
  [
10933
11121
  "initConnection",
@@ -10937,7 +11125,8 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
10937
11125
  // The clientSchema only needs to be sent for the very first request.
10938
11126
  // Henceforth it is stored with the CVR and verified automatically.
10939
11127
  ...baseCookie === null ? { clientSchema } : {},
10940
- userPushParams
11128
+ userPushParams,
11129
+ activeClients: [...activeClients]
10941
11130
  }
10942
11131
  ],
10943
11132
  auth
@@ -10998,6 +11187,15 @@ var CloseError = class extends Error {
10998
11187
  };
10999
11188
  function assertValidRunOptions2(_options) {
11000
11189
  }
11190
+ async function makeActiveClientsManager(clientGroupID, clientID, signal, onDelete) {
11191
+ const manager = await ActiveClientsManager.create(
11192
+ await clientGroupID,
11193
+ clientID,
11194
+ signal
11195
+ );
11196
+ manager.onDelete = onDelete;
11197
+ return manager;
11198
+ }
11001
11199
 
11002
11200
  export {
11003
11201
  getDefaultPuller,
@@ -11018,4 +11216,4 @@ export {
11018
11216
  update_needed_reason_type_enum_exports,
11019
11217
  Zero
11020
11218
  };
11021
- //# sourceMappingURL=chunk-UOYRI2SS.js.map
11219
+ //# sourceMappingURL=chunk-HTNKB2W7.js.map