@rocicorp/zero 1.11.0-canary.1 → 1.11.0-canary.3

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 (102) hide show
  1. package/out/replicache/src/btree/read.d.ts +12 -1
  2. package/out/replicache/src/btree/read.d.ts.map +1 -1
  3. package/out/replicache/src/btree/read.js +24 -12
  4. package/out/replicache/src/btree/read.js.map +1 -1
  5. package/out/replicache/src/db/write.js.map +1 -1
  6. package/out/replicache/src/replicache-impl.d.ts.map +1 -1
  7. package/out/replicache/src/replicache-impl.js +10 -0
  8. package/out/replicache/src/replicache-impl.js.map +1 -1
  9. package/out/replicache/src/transactions.d.ts.map +1 -1
  10. package/out/replicache/src/transactions.js +1 -1
  11. package/out/replicache/src/transactions.js.map +1 -1
  12. package/out/zero/package.js +1 -1
  13. package/out/zero/package.js.map +1 -1
  14. package/out/zero-cache/src/config/zero-config.d.ts +2 -0
  15. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  16. package/out/zero-cache/src/config/zero-config.js +12 -4
  17. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  18. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  19. package/out/zero-cache/src/server/replicator.js +1 -1
  20. package/out/zero-cache/src/server/replicator.js.map +1 -1
  21. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  22. package/out/zero-cache/src/services/change-source/common/replica-schema.js +2 -39
  23. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  24. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts +2 -2
  25. package/out/zero-cache/src/services/change-streamer/change-streamer-http.d.ts.map +1 -1
  26. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js +2 -2
  27. package/out/zero-cache/src/services/change-streamer/change-streamer-http.js.map +1 -1
  28. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +6 -6
  29. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  30. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  31. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  32. package/out/zero-cache/src/services/litestream/commands.js +3 -1
  33. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  34. package/out/zero-cache/src/services/litestream/config-v5.yml +3 -4
  35. package/out/zero-cache/src/services/replicator/change-log-db.js.map +1 -1
  36. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  37. package/out/zero-cache/src/services/replicator/incremental-sync.js +22 -5
  38. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  39. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  40. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts +4 -4
  41. package/out/zero-cache/src/services/replicator/write-worker-client.d.ts.map +1 -1
  42. package/out/zero-cache/src/services/replicator/write-worker-client.js +2 -2
  43. package/out/zero-cache/src/services/replicator/write-worker-client.js.map +1 -1
  44. package/out/zero-cache/src/services/replicator/write-worker.js +10 -4
  45. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  46. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  47. package/out/zero-cache/src/services/view-syncer/view-syncer.js +75 -27
  48. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  49. package/out/zero-cache/src/types/streams.d.ts +6 -6
  50. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  51. package/out/zero-cache/src/types/streams.js +6 -11
  52. package/out/zero-cache/src/types/streams.js.map +1 -1
  53. package/out/zero-client/src/client/context.d.ts +15 -0
  54. package/out/zero-client/src/client/context.d.ts.map +1 -1
  55. package/out/zero-client/src/client/context.js +44 -0
  56. package/out/zero-client/src/client/context.js.map +1 -1
  57. package/out/zero-client/src/client/inspector/lazy-inspector.js +2 -2
  58. package/out/zero-client/src/client/inspector/lazy-inspector.js.map +1 -1
  59. package/out/zero-client/src/client/ivm-branch.js.map +1 -1
  60. package/out/zero-client/src/client/version.js +1 -1
  61. package/out/zero-client/src/client/zero-rep.d.ts.map +1 -1
  62. package/out/zero-client/src/client/zero-rep.js +2 -1
  63. package/out/zero-client/src/client/zero-rep.js.map +1 -1
  64. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  65. package/out/zero-client/src/client/zero.js +48 -11
  66. package/out/zero-client/src/client/zero.js.map +1 -1
  67. package/out/zero-protocol/src/down.d.ts +29 -29
  68. package/out/zero-protocol/src/inspect-down.d.ts +81 -81
  69. package/out/zero-protocol/src/poke.d.ts +6 -6
  70. package/out/zero-react/src/use-query.d.ts.map +1 -1
  71. package/out/zero-react/src/use-query.js +24 -5
  72. package/out/zero-react/src/use-query.js.map +1 -1
  73. package/out/zero-solid/src/use-query.js +4 -1
  74. package/out/zero-solid/src/use-query.js.map +1 -1
  75. package/out/zql/src/ivm/array-view.d.ts.map +1 -1
  76. package/out/zql/src/ivm/array-view.js +5 -3
  77. package/out/zql/src/ivm/array-view.js.map +1 -1
  78. package/out/zql/src/ivm/deferred-input.d.ts +44 -0
  79. package/out/zql/src/ivm/deferred-input.d.ts.map +1 -0
  80. package/out/zql/src/ivm/deferred-input.js +88 -0
  81. package/out/zql/src/ivm/deferred-input.js.map +1 -0
  82. package/out/zql/src/ivm/memory-source.d.ts.map +1 -1
  83. package/out/zql/src/ivm/memory-source.js +5 -10
  84. package/out/zql/src/ivm/memory-source.js.map +1 -1
  85. package/out/zql/src/query/query-delegate-base.d.ts +6 -0
  86. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  87. package/out/zql/src/query/query-delegate-base.js +73 -10
  88. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  89. package/out/zql/src/query/query-delegate.d.ts +22 -0
  90. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  91. package/out/zql/src/query/query-impl.d.ts +12 -11
  92. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  93. package/out/zql/src/query/query-impl.js +383 -60
  94. package/out/zql/src/query/query-impl.js.map +1 -1
  95. package/out/zql/src/query/query-transitions.d.ts +171 -0
  96. package/out/zql/src/query/query-transitions.d.ts.map +1 -0
  97. package/out/zql/src/query/query-transitions.js +207 -0
  98. package/out/zql/src/query/query-transitions.js.map +1 -0
  99. package/out/zql/src/query/runnable-query-impl.d.ts.map +1 -1
  100. package/out/zql/src/query/runnable-query-impl.js +21 -1
  101. package/out/zql/src/query/runnable-query-impl.js.map +1 -1
  102. package/package.json +1 -1
@@ -90,6 +90,11 @@ var DEFAULT_DISCONNECT_TIMEOUT_MS = 60 * 1e3;
90
90
  * consider it timed out.
91
91
  */
92
92
  var CONNECT_TIMEOUT_MS = 1e4;
93
+ /**
94
+ * Setting up active-client tracking blocks the first connect attempt. Above
95
+ * this, say so.
96
+ */
97
+ var SLOW_ACTIVE_CLIENTS_THRESHOLD_MS = 50;
93
98
  var CHECK_CONNECTIVITY_ON_ERROR_FREQUENCY = 6;
94
99
  var DEFAULT_QUERY_CHANGE_THROTTLE_MS = 10;
95
100
  function convertOnUpdateNeededReason(reason) {
@@ -302,6 +307,7 @@ var Zero = class Zero {
302
307
  }, (ast, customQueryID, ttl, gotCallback) => this.#queryManager.addCustom(ast, customQueryID, ttl, gotCallback), (ast, ttl) => {
303
308
  if (enableLegacyQueries) this.#queryManager.updateLegacy(ast, ttl);
304
309
  }, (customQueryID, ttl) => this.#queryManager.updateCustom(customQueryID, ttl), () => this.#queryManager.flushBatch(), batchViewUpdates, this.#addMetric, assertValidRunOptions);
310
+ this.#zeroContext.deferPipelines();
305
311
  this.query = createRunnableBuilder(this.#zeroContext, schema);
306
312
  const rep = new ReplicacheImpl(replicacheOptions, {
307
313
  enableClientGroupForking: false,
@@ -321,7 +327,7 @@ var Zero = class Zero {
321
327
  this.#activeClientsManager = makeActiveClientsManager(rep.clientGroupID, this.clientID, this.#closeAbortController.signal, (clientID, clientGroupID) => this.#deleteClientsManager.onClientsDeleted([{
322
328
  clientGroupID,
323
329
  clientID
324
- }]));
330
+ }]), this.#lc);
325
331
  const onUpdateNeededCallback = (reason) => {
326
332
  if (onUpdateNeeded) onUpdateNeeded(reason);
327
333
  else reloadWithReason(this.#lc, this.#reload, reason.type, updateNeededReloadReasonMessage(reason));
@@ -933,11 +939,42 @@ var Zero = class Zero {
933
939
  this.#socketResolver.resolve(ws);
934
940
  this.#addConnectEvent(lc, attempt, "waiting for the server acknowledgement");
935
941
  lc.debug?.("Waiting for connection to be acknowledged");
942
+ attempt.clearTimeout?.();
943
+ attempt.clearTimeout = this.#armConnectTimeout(lc, attempt, "ack");
936
944
  await attempt.connected.promise;
937
945
  if (signal.aborted) throw signal.reason;
938
946
  this.#mutationTracker.onConnected(this.#lastMutationIDReceived);
939
947
  this.#rep.push().catch(() => {});
940
948
  }
949
+ /**
950
+ * Starts the deadline for one phase of a connection attempt, and returns a
951
+ * function that cancels it.
952
+ *
953
+ * The two phases are measured separately because they fail for unrelated
954
+ * reasons. `setup` covers local work — reading the cookie, the client group
955
+ * ID and the active clients from IDB, then preparing and opening the socket
956
+ * — whose duration says nothing about whether the server is reachable.
957
+ * `ack` covers the wait for the server's response. Running them on one
958
+ * budget meant a slow cold boot spent the server's time before the socket
959
+ * existed, and reported a healthy server as unreachable.
960
+ */
961
+ #armConnectTimeout(lc, attempt, phase) {
962
+ const { signal } = attempt.controller;
963
+ if (signal.aborted) return () => {};
964
+ const timeoutID = setTimeout(() => {
965
+ lc.debug?.("Connection attempt timed out");
966
+ this.#disconnect(lc, new ClientError({
967
+ kind: ConnectTimeout,
968
+ message: (phase === "setup" ? `Connection setup timed out after ${CONNECT_TIMEOUT_MS / 1e3} seconds. ` : `Server did not acknowledge the connection within ${CONNECT_TIMEOUT_MS / 1e3} seconds. `) + `Connect events: ${JSON.stringify(attempt.events)}`
969
+ }));
970
+ }, CONNECT_TIMEOUT_MS);
971
+ const clear = () => {
972
+ clearTimeout(timeoutID);
973
+ signal.removeEventListener("abort", clear);
974
+ };
975
+ signal.addEventListener("abort", clear, { once: true });
976
+ return clear;
977
+ }
941
978
  #addConnectEvent(lc, attempt, event) {
942
979
  attempt.events.push([/* @__PURE__ */ new Date(), event]);
943
980
  lc.debug?.("Connect event", event);
@@ -1146,16 +1183,10 @@ var Zero = class Zero {
1146
1183
  };
1147
1184
  this.#currentConnectAttempt = attempt;
1148
1185
  this.#addConnectEvent(lc, attempt, "starting the connection");
1186
+ attempt.clearTimeout = this.#armConnectTimeout(lc, attempt, "setup");
1149
1187
  const canceled = resolver();
1150
1188
  const abortHandler = () => canceled.reject(attempt.controller.signal.reason);
1151
1189
  attempt.controller.signal.addEventListener("abort", abortHandler, { once: true });
1152
- const timeoutID = setTimeout(() => {
1153
- lc.debug?.("Connection attempt timed out");
1154
- this.#disconnect(lc, new ClientError({
1155
- kind: ConnectTimeout,
1156
- message: `Connection attempt timed out after ${CONNECT_TIMEOUT_MS / 1e3} seconds. Connect events: ${JSON.stringify(attempt.events)}`
1157
- }));
1158
- }, CONNECT_TIMEOUT_MS);
1159
1190
  try {
1160
1191
  try {
1161
1192
  await Promise.race([this.#connectAttempt(lc, additionalConnectParams, attempt), canceled.promise]);
@@ -1172,7 +1203,7 @@ var Zero = class Zero {
1172
1203
  ready.resolve();
1173
1204
  additionalConnectParams = void 0;
1174
1205
  } finally {
1175
- clearTimeout(timeoutID);
1206
+ attempt.clearTimeout?.();
1176
1207
  attempt.controller.signal.removeEventListener("abort", abortHandler);
1177
1208
  if (this.#currentConnectAttempt === attempt) this.#currentConnectAttempt = void 0;
1178
1209
  }
@@ -1549,8 +1580,14 @@ function addWebSocketIDToLogContext(wsid, lc) {
1549
1580
  return lc.withContext("wsid", wsid);
1550
1581
  }
1551
1582
  function assertValidRunOptions(_options) {}
1552
- async function makeActiveClientsManager(clientGroupID, clientID, signal, onDelete) {
1553
- const manager = await ActiveClientsManager.create(await clientGroupID, clientID, signal);
1583
+ async function makeActiveClientsManager(clientGroupID, clientID, signal, onDelete, lc) {
1584
+ const groupID = await clientGroupID;
1585
+ const start = performance.now();
1586
+ const manager = await ActiveClientsManager.create(groupID, clientID, signal);
1587
+ const elapsed = performance.now() - start;
1588
+ const locks = getBrowserGlobal("navigator")?.locks ? "native" : "fallback";
1589
+ if (elapsed > SLOW_ACTIVE_CLIENTS_THRESHOLD_MS) lc.warn?.(`Initializing active clients took ${Math.round(elapsed)}ms`, { locks });
1590
+ else lc.debug?.("Initialized active clients in", Math.round(elapsed), "ms", { locks });
1554
1591
  manager.onDelete = onDelete;
1555
1592
  return manager;
1556
1593
  }