@rocicorp/zero 0.22.2025063000 → 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 (108) 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-WOYR3FAT.js → chunk-HTNKB2W7.js} +248 -53
  4. package/out/{chunk-WOYR3FAT.js.map → chunk-HTNKB2W7.js.map} +4 -4
  5. package/out/{chunk-J67XJRPS.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/solid.js +111 -99
  10. package/out/solid.js.map +4 -4
  11. package/out/zero-cache/src/config/zero-config.d.ts +8 -0
  12. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  13. package/out/zero-cache/src/config/zero-config.js +9 -0
  14. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  15. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  16. package/out/zero-cache/src/server/change-streamer.js +2 -2
  17. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  18. package/out/zero-cache/src/services/change-source/pg/copy-runner.d.ts.map +1 -1
  19. package/out/zero-cache/src/services/change-source/pg/copy-runner.js +4 -3
  20. package/out/zero-cache/src/services/change-source/pg/copy-runner.js.map +1 -1
  21. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  22. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +1 -1
  23. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  24. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +1 -1
  25. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  26. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +4 -4
  27. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  28. package/out/zero-cache/src/services/change-streamer/storer.d.ts +1 -1
  29. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  30. package/out/zero-cache/src/services/change-streamer/storer.js +10 -3
  31. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  32. package/out/zero-cache/src/services/mutagen/pusher.d.ts +6 -2
  33. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  34. package/out/zero-cache/src/services/view-syncer/cvr-store.js +8 -8
  35. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  36. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  37. package/out/zero-cache/src/services/view-syncer/cvr.js +13 -23
  38. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  39. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  40. package/out/zero-cache/src/services/view-syncer/schema/types.js +3 -0
  41. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  42. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +0 -3
  43. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  44. package/out/zero-cache/src/services/view-syncer/view-syncer.js +29 -28
  45. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  46. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  47. package/out/zero-cache/src/workers/connection.js +1 -25
  48. package/out/zero-cache/src/workers/connection.js.map +1 -1
  49. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  50. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +1 -1
  51. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  52. package/out/zero-client/src/client/active-clients-manager.d.ts +49 -0
  53. package/out/zero-client/src/client/active-clients-manager.d.ts.map +1 -0
  54. package/out/zero-client/src/client/inspector/types.d.ts +4 -2
  55. package/out/zero-client/src/client/inspector/types.d.ts.map +1 -1
  56. package/out/zero-client/src/client/zero.d.ts +2 -1
  57. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  58. package/out/zero-protocol/src/close-connection.d.ts +4 -0
  59. package/out/zero-protocol/src/close-connection.d.ts.map +1 -1
  60. package/out/zero-protocol/src/close-connection.js +2 -0
  61. package/out/zero-protocol/src/close-connection.js.map +1 -1
  62. package/out/zero-protocol/src/connect.d.ts +14 -0
  63. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  64. package/out/zero-protocol/src/connect.js +7 -0
  65. package/out/zero-protocol/src/connect.js.map +1 -1
  66. package/out/zero-protocol/src/down.d.ts +3 -1
  67. package/out/zero-protocol/src/down.d.ts.map +1 -1
  68. package/out/zero-protocol/src/inspect-down.d.ts +12 -4
  69. package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
  70. package/out/zero-protocol/src/inspect-down.js +7 -1
  71. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  72. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  73. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  74. package/out/zero-protocol/src/protocol-version.js +3 -1
  75. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  76. package/out/zero-protocol/src/up.d.ts +1 -0
  77. package/out/zero-protocol/src/up.d.ts.map +1 -1
  78. package/out/zero-solid/src/mod.d.ts +2 -2
  79. package/out/zero-solid/src/mod.d.ts.map +1 -1
  80. package/out/zero-solid/src/solid-view.d.ts +8 -6
  81. package/out/zero-solid/src/solid-view.d.ts.map +1 -1
  82. package/out/zero-solid/src/{create-query.d.ts → use-query.d.ts} +7 -7
  83. package/out/zero-solid/src/use-query.d.ts.map +1 -0
  84. package/out/zero-solid/src/use-zero.d.ts +11 -0
  85. package/out/zero-solid/src/use-zero.d.ts.map +1 -0
  86. package/out/zero.js +3 -3
  87. package/out/zql/src/ivm/take.d.ts.map +1 -1
  88. package/out/zql/src/ivm/take.js +6 -0
  89. package/out/zql/src/ivm/take.js.map +1 -1
  90. package/out/zql/src/query/query-impl.d.ts +3 -3
  91. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  92. package/out/zql/src/query/query-impl.js +4 -4
  93. package/out/zql/src/query/query-impl.js.map +1 -1
  94. package/out/zql/src/query/query.d.ts +1 -1
  95. package/out/zql/src/query/ttl.d.ts +4 -0
  96. package/out/zql/src/query/ttl.d.ts.map +1 -1
  97. package/out/zql/src/query/ttl.js +12 -1
  98. package/out/zql/src/query/ttl.js.map +1 -1
  99. package/out/zqlite/src/table-source.d.ts.map +1 -1
  100. package/out/zqlite/src/table-source.js +12 -8
  101. package/out/zqlite/src/table-source.js.map +1 -1
  102. package/package.json +3 -3
  103. package/out/shared/src/ref-count.d.ts +0 -16
  104. package/out/shared/src/ref-count.d.ts.map +0 -1
  105. package/out/zero-solid/src/create-query.d.ts.map +0 -1
  106. package/out/zero-solid/src/create-zero.d.ts +0 -3
  107. package/out/zero-solid/src/create-zero.d.ts.map +0 -1
  108. /package/out/{chunk-J67XJRPS.js.map → chunk-ODTJYJ37.js.map} +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";
@@ -5841,7 +5841,7 @@ var SchemaVersionNotSupported2 = "SchemaVersionNotSupported";
5841
5841
 
5842
5842
  // ../zero-client/src/client/zero.ts
5843
5843
  import "@rocicorp/logger";
5844
- import { resolver as resolver8 } from "@rocicorp/resolver";
5844
+ import { resolver as resolver9 } from "@rocicorp/resolver";
5845
5845
 
5846
5846
  // ../zero-protocol/src/delete-clients.ts
5847
5847
  var deleteClientsBodySchema = valita_exports.union(
@@ -5900,7 +5900,14 @@ var initConnectionBodySchema = valita_exports.object({
5900
5900
  desiredQueriesPatch: upQueriesPatchSchema,
5901
5901
  clientSchema: clientSchemaSchema.optional(),
5902
5902
  deleted: deleteClientsBodySchema.optional(),
5903
- 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()
5904
5911
  });
5905
5912
  var initConnectionMessageSchema = valita_exports.tuple([
5906
5913
  valita_exports.literal("initConnection"),
@@ -6241,7 +6248,7 @@ var downstreamSchema = valita_exports.union(
6241
6248
  );
6242
6249
 
6243
6250
  // ../zero-protocol/src/protocol-version.ts
6244
- var PROTOCOL_VERSION = 18;
6251
+ var PROTOCOL_VERSION = 20;
6245
6252
  var MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 6;
6246
6253
  assert(MIN_SERVER_SUPPORTED_SYNC_PROTOCOL < PROTOCOL_VERSION);
6247
6254
 
@@ -6338,6 +6345,201 @@ function send(ws, data) {
6338
6345
  ws.send(JSON.stringify(data));
6339
6346
  }
6340
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
+
6341
6543
  // ../zero-client/src/client/connection-state-enum.ts
6342
6544
  var Disconnected = 0;
6343
6545
  var Connecting = 1;
@@ -8331,7 +8533,7 @@ function makeMessage(message, context, logLevel) {
8331
8533
  }
8332
8534
 
8333
8535
  // ../zero-client/src/client/version.ts
8334
- var version2 = "0.22.2025063000";
8536
+ var version2 = "0.22.2025070200";
8335
8537
 
8336
8538
  // ../zero-client/src/client/log-options.ts
8337
8539
  var LevelFilterLogSink = class {
@@ -8626,7 +8828,7 @@ var State = class {
8626
8828
  };
8627
8829
 
8628
8830
  // ../zero-client/src/client/mutation-tracker.ts
8629
- import { resolver as resolver7 } from "@rocicorp/resolver";
8831
+ import { resolver as resolver8 } from "@rocicorp/resolver";
8630
8832
  var transientPushErrorTypes = [
8631
8833
  "zeroPusher",
8632
8834
  "http",
@@ -8656,7 +8858,7 @@ var MutationTracker = class {
8656
8858
  }
8657
8859
  trackMutation() {
8658
8860
  const id = nextEphemeralID();
8659
- const mutationResolver = resolver7();
8861
+ const mutationResolver = resolver8();
8660
8862
  this.#outstandingMutations.set(id, {
8661
8863
  resolver: mutationResolver
8662
8864
  });
@@ -9684,12 +9886,12 @@ var Zero = class _Zero {
9684
9886
  };
9685
9887
  #zeroContext;
9686
9888
  queryDelegate;
9687
- #connectResolver = resolver8();
9889
+ #connectResolver = resolver9();
9688
9890
  #pendingPullsByRequestID = /* @__PURE__ */ new Map();
9689
9891
  #lastMutationIDReceived = 0;
9690
9892
  #socket = void 0;
9691
- #socketResolver = resolver8();
9692
- #connectionStateChangeResolver = resolver8();
9893
+ #socketResolver = resolver9();
9894
+ #connectionStateChangeResolver = resolver9();
9693
9895
  /**
9694
9896
  * This resolver is only used for rejections. It is awaited in the connected
9695
9897
  * state (including when waiting for a pong). It is rejected when we get an
@@ -9700,13 +9902,14 @@ var Zero = class _Zero {
9700
9902
  #visibilityWatcher;
9701
9903
  // We use an accessor pair to allow the subclass to override the setter.
9702
9904
  #connectionState = Disconnected;
9905
+ #activeClientsManager;
9703
9906
  #setConnectionState(state) {
9704
9907
  if (state === this.#connectionState) {
9705
9908
  return;
9706
9909
  }
9707
9910
  this.#connectionState = state;
9708
9911
  this.#connectionStateChangeResolver.resolve(state);
9709
- this.#connectionStateChangeResolver = resolver8();
9912
+ this.#connectionStateChangeResolver = resolver9();
9710
9913
  if (false) {
9711
9914
  asTestZero(this)[onSetConnectionStateSymbol]?.(state);
9712
9915
  }
@@ -9893,6 +10096,12 @@ var Zero = class _Zero {
9893
10096
  this.userID = userID;
9894
10097
  this.#lc = lc.withContext("clientID", rep.clientID);
9895
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
+ );
9896
10105
  const onUpdateNeededCallback = (reason, serverErrorMsg) => {
9897
10106
  if (onUpdateNeeded) {
9898
10107
  onUpdateNeeded(reason);
@@ -10124,21 +10333,12 @@ var Zero = class _Zero {
10124
10333
  const lc = this.#lc.withContext("close");
10125
10334
  lc.debug?.("Closing Zero instance. Stack:", new Error().stack);
10126
10335
  if (this.#connectionState !== Disconnected) {
10127
- let closeReason = JSON.stringify([
10128
- "closeConnection",
10129
- []
10130
- ]);
10131
- if (closeReason.length > 123) {
10132
- lc.warn?.("Close reason is too long. Removing it.");
10133
- closeReason = "";
10134
- }
10135
10336
  this.#disconnect(
10136
10337
  lc,
10137
10338
  {
10138
10339
  client: "ClientClosed"
10139
10340
  },
10140
- CLOSE_CODE_NORMAL,
10141
- closeReason
10341
+ CLOSE_CODE_NORMAL
10142
10342
  );
10143
10343
  }
10144
10344
  lc.debug?.("Aborting closeAbortController due to close()");
@@ -10148,15 +10348,6 @@ var Zero = class _Zero {
10148
10348
  this.#unexpose();
10149
10349
  return ret;
10150
10350
  }
10151
- #onPageHide = (e) => {
10152
- if (e.persisted) {
10153
- this.#lc.debug?.("Ignoring pagehide event because it was persisted");
10154
- } else {
10155
- this.#lc.debug?.("Closing client because we got a clean close");
10156
- this.close().catch(() => {
10157
- });
10158
- }
10159
- };
10160
10351
  #onMessage = (e) => {
10161
10352
  const lc = this.#lc;
10162
10353
  lc.debug?.("received message", e.data);
@@ -10417,7 +10608,8 @@ var Zero = class _Zero {
10417
10608
  lc,
10418
10609
  this.#options.push,
10419
10610
  this.#options.maxHeaderLength,
10420
- additionalConnectParams
10611
+ additionalConnectParams,
10612
+ await this.#activeClientsManager
10421
10613
  );
10422
10614
  if (this.closed) {
10423
10615
  return;
@@ -10429,10 +10621,6 @@ var Zero = class _Zero {
10429
10621
  ws.addEventListener("close", this.#onClose);
10430
10622
  this.#socket = ws;
10431
10623
  this.#socketResolver.resolve(ws);
10432
- getBrowserGlobal("window")?.addEventListener?.(
10433
- "pagehide",
10434
- this.#onPageHide
10435
- );
10436
10624
  try {
10437
10625
  lc.debug?.("Waiting for connection to be acknowledged");
10438
10626
  await this.#connectResolver.promise;
@@ -10447,7 +10635,7 @@ var Zero = class _Zero {
10447
10635
  );
10448
10636
  }
10449
10637
  }
10450
- #disconnect(lc, reason, closeCode, closeReason) {
10638
+ #disconnect(lc, reason, closeCode) {
10451
10639
  if (this.#connectionState === Connecting) {
10452
10640
  this.#connectErrorCount++;
10453
10641
  }
@@ -10491,9 +10679,9 @@ var Zero = class _Zero {
10491
10679
  lc.error?.("disconnect() called while disconnected");
10492
10680
  break;
10493
10681
  }
10494
- this.#socketResolver = resolver8();
10682
+ this.#socketResolver = resolver9();
10495
10683
  lc.debug?.("Creating new connect resolver");
10496
- this.#connectResolver = resolver8();
10684
+ this.#connectResolver = resolver9();
10497
10685
  this.#setConnectionState(Disconnected);
10498
10686
  this.#messageCount = 0;
10499
10687
  this.#connectStart = void 0;
@@ -10501,14 +10689,10 @@ var Zero = class _Zero {
10501
10689
  this.#socket?.removeEventListener("message", this.#onMessage);
10502
10690
  this.#socket?.removeEventListener("open", this.#onOpen);
10503
10691
  this.#socket?.removeEventListener("close", this.#onClose);
10504
- this.#socket?.close(closeCode, closeReason);
10692
+ this.#socket?.close(closeCode);
10505
10693
  this.#socket = void 0;
10506
10694
  this.#lastMutationIDSent = NULL_LAST_MUTATION_ID_SENT;
10507
10695
  this.#pokeHandler.handleDisconnect();
10508
- getBrowserGlobal("window")?.removeEventListener?.(
10509
- "pagehide",
10510
- this.#onPageHide
10511
- );
10512
10696
  }
10513
10697
  #handlePokeStart(_lc, pokeMessage) {
10514
10698
  this.#abortPingTimeout();
@@ -10544,12 +10728,12 @@ var Zero = class _Zero {
10544
10728
  const body = pullResponseMessage[1];
10545
10729
  lc = lc.withContext("requestID", body.requestID);
10546
10730
  lc.debug?.("Handling pull response", body);
10547
- const resolver9 = this.#pendingPullsByRequestID.get(body.requestID);
10548
- if (!resolver9) {
10731
+ const resolver10 = this.#pendingPullsByRequestID.get(body.requestID);
10732
+ if (!resolver10) {
10549
10733
  lc.debug?.("No resolver found");
10550
10734
  return;
10551
10735
  }
10552
- resolver9.resolve(pullResponseMessage[1]);
10736
+ resolver10.resolve(pullResponseMessage[1]);
10553
10737
  }
10554
10738
  async #pusher(req, requestID) {
10555
10739
  assert(req.pushVersion === 1);
@@ -10680,7 +10864,7 @@ var Zero = class _Zero {
10680
10864
  PING_INTERVAL_MS,
10681
10865
  controller.signal
10682
10866
  );
10683
- this.#rejectMessageError = resolver8();
10867
+ this.#rejectMessageError = resolver9();
10684
10868
  const PING = 0;
10685
10869
  const HIDDEN = 2;
10686
10870
  const raceResult = await promiseRace([
@@ -10790,7 +10974,7 @@ var Zero = class _Zero {
10790
10974
  }
10791
10975
  ];
10792
10976
  send(socket, pullRequestMessage);
10793
- const pullResponseResolver = resolver8();
10977
+ const pullResponseResolver = resolver9();
10794
10978
  this.#pendingPullsByRequestID.set(requestID, pullResponseResolver);
10795
10979
  try {
10796
10980
  const TIMEOUT = 0;
@@ -10848,7 +11032,7 @@ var Zero = class _Zero {
10848
11032
  */
10849
11033
  async #ping(lc, messageErrorRejectionPromise) {
10850
11034
  lc.debug?.("pinging");
10851
- const { promise, resolve } = resolver8();
11035
+ const { promise, resolve } = resolver9();
10852
11036
  this.#onPong = resolve;
10853
11037
  const pingMessage = ["ping", {}];
10854
11038
  const t0 = performance.now();
@@ -10894,7 +11078,7 @@ var Zero = class _Zero {
10894
11078
  */
10895
11079
  async inspect() {
10896
11080
  BUNDLE_SIZE: {
10897
- const m = await import("./inspector-LF6RTN44.js");
11081
+ const m = await import("./inspector-WSEHHWA3.js");
10898
11082
  return m.newInspector(this.#rep, this.#schema, async () => {
10899
11083
  await this.#connectResolver.promise;
10900
11084
  return this.#socket;
@@ -10902,7 +11086,7 @@ var Zero = class _Zero {
10902
11086
  }
10903
11087
  }
10904
11088
  };
10905
- 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) {
10906
11090
  const url = new URL(
10907
11091
  appendPath(socketOrigin, `/sync/v${PROTOCOL_VERSION}/connect`)
10908
11092
  );
@@ -10931,6 +11115,7 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
10931
11115
  const queriesPatchP = rep.query((tx) => queryManager.getQueriesPatch(tx));
10932
11116
  let deletedClients = await deleteClientsManager.getDeletedClients();
10933
11117
  let queriesPatch = await queriesPatchP;
11118
+ const { activeClients } = activeClientsManager;
10934
11119
  let secProtocol = encodeSecProtocols(
10935
11120
  [
10936
11121
  "initConnection",
@@ -10940,7 +11125,8 @@ async function createSocket(rep, queryManager, deleteClientsManager, socketOrigi
10940
11125
  // The clientSchema only needs to be sent for the very first request.
10941
11126
  // Henceforth it is stored with the CVR and verified automatically.
10942
11127
  ...baseCookie === null ? { clientSchema } : {},
10943
- userPushParams
11128
+ userPushParams,
11129
+ activeClients: [...activeClients]
10944
11130
  }
10945
11131
  ],
10946
11132
  auth
@@ -11001,6 +11187,15 @@ var CloseError = class extends Error {
11001
11187
  };
11002
11188
  function assertValidRunOptions2(_options) {
11003
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
+ }
11004
11199
 
11005
11200
  export {
11006
11201
  getDefaultPuller,
@@ -11021,4 +11216,4 @@ export {
11021
11216
  update_needed_reason_type_enum_exports,
11022
11217
  Zero
11023
11218
  };
11024
- //# sourceMappingURL=chunk-WOYR3FAT.js.map
11219
+ //# sourceMappingURL=chunk-HTNKB2W7.js.map