@rocicorp/zero 0.22.2025081301 → 0.23.2025081400

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 (204) hide show
  1. package/out/analyze-query/src/bin-analyze.js +5 -8
  2. package/out/analyze-query/src/bin-analyze.js.map +1 -1
  3. package/out/{chunk-C3ZE2IHA.js → chunk-JHJ3MBXW.js} +8 -6
  4. package/out/chunk-JHJ3MBXW.js.map +7 -0
  5. package/out/chunk-MKB4RXL3.js +15 -0
  6. package/out/chunk-MKB4RXL3.js.map +7 -0
  7. package/out/{chunk-LENWM5WE.js → chunk-O536GEIT.js} +410 -218
  8. package/out/chunk-O536GEIT.js.map +7 -0
  9. package/out/chunk-SGW2EIVJ.js +192 -0
  10. package/out/chunk-SGW2EIVJ.js.map +7 -0
  11. package/out/{chunk-N2EOVSVB.js → chunk-ZKRMVMWK.js} +209 -153
  12. package/out/chunk-ZKRMVMWK.js.map +7 -0
  13. package/out/expo.js +356 -0
  14. package/out/expo.js.map +7 -0
  15. package/out/{inspector-AF3UI76B.js → inspector-J5P4DOGH.js} +122 -26
  16. package/out/inspector-J5P4DOGH.js.map +7 -0
  17. package/out/{inspector-ENPS6L3H.js → inspector-YIRP3TTL.js} +1 -1
  18. package/out/{inspector-ENPS6L3H.js.map → inspector-YIRP3TTL.js.map} +1 -1
  19. package/out/react.js +7 -4
  20. package/out/react.js.map +2 -2
  21. package/out/replicache/src/kv/sqlite-store.d.ts +117 -0
  22. package/out/replicache/src/kv/sqlite-store.d.ts.map +1 -0
  23. package/out/shared/src/binary-search.js +31 -0
  24. package/out/shared/src/binary-search.js.map +1 -0
  25. package/out/shared/src/centroid.d.ts +10 -0
  26. package/out/shared/src/centroid.d.ts.map +1 -0
  27. package/out/shared/src/centroid.js +28 -0
  28. package/out/shared/src/centroid.js.map +1 -0
  29. package/out/shared/src/logging-test-utils.d.ts +12 -0
  30. package/out/shared/src/logging-test-utils.d.ts.map +1 -0
  31. package/out/shared/src/logging-test-utils.js +21 -0
  32. package/out/shared/src/logging-test-utils.js.map +1 -0
  33. package/out/shared/src/objects.d.ts +3 -1
  34. package/out/shared/src/objects.d.ts.map +1 -1
  35. package/out/shared/src/objects.js.map +1 -1
  36. package/out/shared/src/tdigest-schema.d.ts +8 -0
  37. package/out/shared/src/tdigest-schema.d.ts.map +1 -0
  38. package/out/shared/src/tdigest-schema.js +7 -0
  39. package/out/shared/src/tdigest-schema.js.map +1 -0
  40. package/out/shared/src/tdigest.d.ts +53 -0
  41. package/out/shared/src/tdigest.d.ts.map +1 -0
  42. package/out/shared/src/tdigest.js +304 -0
  43. package/out/shared/src/tdigest.js.map +1 -0
  44. package/out/solid.js +13 -9
  45. package/out/solid.js.map +2 -2
  46. package/out/zero/package.json +9 -4
  47. package/out/zero/src/expo.d.ts +2 -0
  48. package/out/zero/src/expo.d.ts.map +1 -0
  49. package/out/zero/src/zero-cache-dev.js.map +1 -1
  50. package/out/zero-cache/src/auth/write-authorizer.d.ts.map +1 -1
  51. package/out/zero-cache/src/auth/write-authorizer.js +3 -2
  52. package/out/zero-cache/src/auth/write-authorizer.js.map +1 -1
  53. package/out/zero-cache/src/config/zero-config.d.ts +18 -297
  54. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  55. package/out/zero-cache/src/config/zero-config.js +43 -5
  56. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  57. package/out/zero-cache/src/observability/events.d.ts +15 -0
  58. package/out/zero-cache/src/observability/events.d.ts.map +1 -0
  59. package/out/zero-cache/src/observability/events.js +93 -0
  60. package/out/zero-cache/src/observability/events.js.map +1 -0
  61. package/out/zero-cache/src/server/anonymous-otel-start.d.ts +1 -1
  62. package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +1 -1
  63. package/out/zero-cache/src/server/anonymous-otel-start.js +40 -18
  64. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  65. package/out/zero-cache/src/server/change-streamer.js +4 -4
  66. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  67. package/out/zero-cache/src/server/main.js +4 -4
  68. package/out/zero-cache/src/server/main.js.map +1 -1
  69. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  70. package/out/zero-cache/src/server/replicator.js +7 -6
  71. package/out/zero-cache/src/server/replicator.js.map +1 -1
  72. package/out/zero-cache/src/server/runner/run-worker.d.ts.map +1 -1
  73. package/out/zero-cache/src/server/runner/run-worker.js +3 -2
  74. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  75. package/out/zero-cache/src/server/syncer.js +5 -5
  76. package/out/zero-cache/src/server/syncer.js.map +1 -1
  77. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  78. package/out/zero-cache/src/services/change-source/custom/change-source.js +46 -35
  79. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  80. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  81. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +7 -2
  82. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  83. package/out/zero-cache/src/services/mutagen/mutagen.js +1 -1
  84. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  85. package/out/zero-cache/src/services/mutagen/pusher.d.ts +28 -2
  86. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  87. package/out/zero-cache/src/services/mutagen/pusher.js +1 -1
  88. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  89. package/out/zero-cache/src/services/replicator/change-processor.d.ts +5 -1
  90. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  91. package/out/zero-cache/src/services/replicator/change-processor.js +10 -8
  92. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  93. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
  94. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  95. package/out/zero-cache/src/services/replicator/incremental-sync.js +17 -3
  96. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  97. package/out/zero-cache/src/services/replicator/replication-status.d.ts +12 -0
  98. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -0
  99. package/out/zero-cache/src/services/replicator/replication-status.js +92 -0
  100. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -0
  101. package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
  102. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  103. package/out/zero-cache/src/services/replicator/replicator.js +2 -2
  104. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  105. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  106. package/out/zero-cache/src/services/statz.js +0 -23
  107. package/out/zero-cache/src/services/statz.js.map +1 -1
  108. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  109. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +2 -1
  110. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  111. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +10 -1
  112. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  113. package/out/zero-cache/src/services/view-syncer/view-syncer.js +77 -8
  114. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  115. package/out/zero-cache/src/types/pg.d.ts +9 -0
  116. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  117. package/out/zero-cache/src/types/pg.js +78 -1
  118. package/out/zero-cache/src/types/pg.js.map +1 -1
  119. package/out/zero-client/src/client/context.d.ts +11 -11
  120. package/out/zero-client/src/client/context.d.ts.map +1 -1
  121. package/out/zero-client/src/client/custom.d.ts +6 -6
  122. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  123. package/out/zero-client/src/client/inspector/inspector.d.ts +10 -1
  124. package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
  125. package/out/zero-client/src/client/inspector/types.d.ts +10 -0
  126. package/out/zero-client/src/client/inspector/types.d.ts.map +1 -1
  127. package/out/zero-client/src/client/measure-push-operator.d.ts +17 -0
  128. package/out/zero-client/src/client/measure-push-operator.d.ts.map +1 -0
  129. package/out/zero-client/src/client/options.d.ts +2 -2
  130. package/out/zero-client/src/client/options.d.ts.map +1 -1
  131. package/out/zero-client/src/client/query-manager.d.ts +18 -5
  132. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  133. package/out/zero-client/src/client/zero.d.ts +4 -4
  134. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  135. package/out/zero-client/src/mod.d.ts +1 -1
  136. package/out/zero-client/src/mod.d.ts.map +1 -1
  137. package/out/zero-events/src/index.d.ts +29 -0
  138. package/out/zero-events/src/index.d.ts.map +1 -0
  139. package/out/zero-events/src/index.js +28 -0
  140. package/out/zero-events/src/index.js.map +1 -0
  141. package/out/zero-events/src/status.d.ts +113 -0
  142. package/out/zero-events/src/status.d.ts.map +1 -0
  143. package/out/zero-events/src/status.js +72 -0
  144. package/out/zero-events/src/status.js.map +1 -0
  145. package/out/zero-expo/src/mod.d.ts +2 -0
  146. package/out/zero-expo/src/mod.d.ts.map +1 -0
  147. package/out/zero-expo/src/store.d.ts +4 -0
  148. package/out/zero-expo/src/store.d.ts.map +1 -0
  149. package/out/zero-protocol/src/down.d.ts +18 -2
  150. package/out/zero-protocol/src/down.d.ts.map +1 -1
  151. package/out/zero-protocol/src/inspect-down.d.ts +64 -6
  152. package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
  153. package/out/zero-protocol/src/inspect-down.js +18 -3
  154. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  155. package/out/zero-protocol/src/inspect-up.d.ts +25 -6
  156. package/out/zero-protocol/src/inspect-up.d.ts.map +1 -1
  157. package/out/zero-protocol/src/inspect-up.js +8 -3
  158. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  159. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  160. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  161. package/out/zero-protocol/src/protocol-version.js +3 -1
  162. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  163. package/out/zero-protocol/src/up.d.ts +7 -2
  164. package/out/zero-protocol/src/up.d.ts.map +1 -1
  165. package/out/zero-react/src/components/inspector.d.ts +1 -1
  166. package/out/zero-react/src/components/inspector.d.ts.map +1 -1
  167. package/out/zero-react/src/components/zero-inspector.d.ts +1 -1
  168. package/out/zero-react/src/components/zero-inspector.d.ts.map +1 -1
  169. package/out/zero-react/src/zero-provider.d.ts +4 -4
  170. package/out/zero-react/src/zero-provider.d.ts.map +1 -1
  171. package/out/zero-schema/src/permissions.d.ts +15 -0
  172. package/out/zero-schema/src/permissions.d.ts.map +1 -1
  173. package/out/zero-schema/src/table-schema.d.ts +1 -8
  174. package/out/zero-schema/src/table-schema.d.ts.map +1 -1
  175. package/out/zero-schema/src/table-schema.js.map +1 -1
  176. package/out/zero-solid/src/use-zero.d.ts +4 -4
  177. package/out/zero-solid/src/use-zero.d.ts.map +1 -1
  178. package/out/zero.js +5 -3
  179. package/out/zql/src/builder/builder.d.ts +3 -2
  180. package/out/zql/src/builder/builder.d.ts.map +1 -1
  181. package/out/zql/src/builder/builder.js +9 -8
  182. package/out/zql/src/builder/builder.js.map +1 -1
  183. package/out/zql/src/ivm/operator.d.ts +1 -1
  184. package/out/zql/src/ivm/operator.d.ts.map +1 -1
  185. package/out/zql/src/ivm/operator.js +0 -1
  186. package/out/zql/src/ivm/operator.js.map +1 -1
  187. package/out/zql/src/query/metrics-delegate.d.ts +14 -0
  188. package/out/zql/src/query/metrics-delegate.d.ts.map +1 -0
  189. package/out/zql/src/query/metrics-delegate.js +2 -0
  190. package/out/zql/src/query/metrics-delegate.js.map +1 -0
  191. package/out/zql/src/query/query-delegate.d.ts +7 -2
  192. package/out/zql/src/query/query-delegate.d.ts.map +1 -1
  193. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  194. package/out/zql/src/query/query-impl.js +17 -14
  195. package/out/zql/src/query/query-impl.js.map +1 -1
  196. package/out/zqlite/src/query-delegate.d.ts +7 -6
  197. package/out/zqlite/src/query-delegate.d.ts.map +1 -1
  198. package/out/zqlite/src/query-delegate.js +5 -2
  199. package/out/zqlite/src/query-delegate.js.map +1 -1
  200. package/package.json +9 -4
  201. package/out/chunk-C3ZE2IHA.js.map +0 -7
  202. package/out/chunk-LENWM5WE.js.map +0 -7
  203. package/out/chunk-N2EOVSVB.js.map +0 -7
  204. package/out/inspector-AF3UI76B.js.map +0 -7
@@ -1,3 +1,8 @@
1
+ import {
2
+ promiseFalse,
3
+ promiseTrue,
4
+ promiseVoid
5
+ } from "./chunk-MKB4RXL3.js";
1
6
  import {
2
7
  BTreeRead,
3
8
  Chunk,
@@ -10,11 +15,10 @@ import {
10
15
  GOT_QUERIES_KEY_PREFIX,
11
16
  Latest,
12
17
  MUTATIONS_KEY_PREFIX,
18
+ TDigest,
13
19
  V6,
14
20
  V7,
15
21
  addDiffsForIndexes,
16
- assert,
17
- assertArray,
18
22
  assertClientV6,
19
23
  assertCookie,
20
24
  assertHasClientState,
@@ -22,14 +26,10 @@ import {
22
26
  assertJSONObject,
23
27
  assertJSONValue,
24
28
  assertLocalMetaDD31,
25
- assertNotNull,
26
- assertNumber,
27
- assertObject,
28
29
  assertOrderingIncludesPK,
29
30
  assertRefs,
30
31
  assertSnapshotCommitDD31,
31
32
  assertSnapshotMetaDD31,
32
- assertString,
33
33
  astSchema,
34
34
  asyncIterableToArray,
35
35
  baseSnapshotFromCommit,
@@ -51,8 +51,6 @@ import {
51
51
  createPredicate,
52
52
  decodeIndexKey,
53
53
  deepEqual,
54
- deepFreeze,
55
- deepFreezeAllowUndefined,
56
54
  desiredQueriesPrefixForClient,
57
55
  diff,
58
56
  diff2,
@@ -70,13 +68,11 @@ import {
70
68
  getSizeOfValue,
71
69
  h64,
72
70
  hasClientState,
73
- hasOwn,
74
71
  hashOfAST,
75
72
  hashOfNameAndArgs,
76
73
  initClientV6,
77
74
  inspectDownMessageSchema,
78
75
  isLocalMetaDD31,
79
- isProd,
80
76
  joinIterables,
81
77
  jsonObjectSchema,
82
78
  jsonSchema,
@@ -87,6 +83,8 @@ import {
87
83
  makeClientID,
88
84
  makeComparator,
89
85
  mapAST,
86
+ mapAllEntries,
87
+ mapEntries,
90
88
  must,
91
89
  mustGetChunk,
92
90
  mustGetClient,
@@ -115,12 +113,12 @@ import {
115
113
  sourceNameFromKey,
116
114
  stringCompare,
117
115
  test,
116
+ throwOutput,
118
117
  toDesiredQueriesKey,
119
118
  toGotQueriesKey,
120
119
  toMutationResponseKey,
121
120
  toPrimaryKeyString,
122
121
  transformFilters,
123
- unreachable,
124
122
  using,
125
123
  valita_exports,
126
124
  valuesEqual,
@@ -128,7 +126,20 @@ import {
128
126
  withWrite,
129
127
  withWriteNoImplicitCommit,
130
128
  wrapIterable
131
- } from "./chunk-LENWM5WE.js";
129
+ } from "./chunk-O536GEIT.js";
130
+ import {
131
+ assert,
132
+ assertArray,
133
+ assertNotNull,
134
+ assertNumber,
135
+ assertObject,
136
+ assertString,
137
+ deepFreeze,
138
+ deepFreezeAllowUndefined,
139
+ hasOwn,
140
+ isProd,
141
+ unreachable
142
+ } from "./chunk-SGW2EIVJ.js";
132
143
  import {
133
144
  __export
134
145
  } from "./chunk-424PT5DM.js";
@@ -316,14 +327,6 @@ function mustGetBrowserGlobal(name) {
316
327
  return r;
317
328
  }
318
329
 
319
- // ../shared/src/resolved-promises.ts
320
- var promiseTrue = Promise.resolve(true);
321
- var promiseFalse = Promise.resolve(false);
322
- var promiseUndefined = Promise.resolve(void 0);
323
- var promiseVoid = Promise.resolve();
324
- var promiseNever = new Promise(() => {
325
- });
326
-
327
330
  // ../replicache/src/kv/write-impl-base.ts
328
331
  var deleteSentinel = Symbol();
329
332
  var WriteImplBase = class {
@@ -826,7 +829,7 @@ import { resolver as resolver4 } from "@rocicorp/resolver";
826
829
  // ../shared/src/sleep.ts
827
830
  import { resolver as resolver3 } from "@rocicorp/resolver";
828
831
  var promiseVoid2 = Promise.resolve();
829
- var promiseNever2 = new Promise(() => void 0);
832
+ var promiseNever = new Promise(() => void 0);
830
833
  function sleep(ms, signal) {
831
834
  const newAbortError = () => new AbortError("Aborted");
832
835
  if (signal?.aborted) {
@@ -852,7 +855,7 @@ function sleep(ms, signal) {
852
855
  }
853
856
  function sleepWithAbort(ms, signal) {
854
857
  if (ms === 0) {
855
- return [promiseVoid2, promiseNever2];
858
+ return [promiseVoid2, promiseNever];
856
859
  }
857
860
  const { promise: abortedPromise, resolve: abortedResolve } = resolver3();
858
861
  const sleepPromise = new Promise((resolve) => {
@@ -5711,23 +5714,6 @@ var ColumnBuilder = class _ColumnBuilder {
5711
5714
  }
5712
5715
  };
5713
5716
 
5714
- // ../shared/src/objects.ts
5715
- function mapEntries(input, mapper) {
5716
- const output = {};
5717
- for (const entry of Object.entries(input)) {
5718
- const mapped = mapper(entry[0], entry[1]);
5719
- output[mapped[0]] = mapped[1];
5720
- }
5721
- return output;
5722
- }
5723
- function mapAllEntries(input, mapper) {
5724
- const output = {};
5725
- for (const mapped of mapper(Object.entries(input))) {
5726
- output[mapped[0]] = mapped[1];
5727
- }
5728
- return output;
5729
- }
5730
-
5731
5717
  // ../zero-protocol/src/client-schema.ts
5732
5718
  var valueTypeSchema = literalUnion(
5733
5719
  "string",
@@ -5849,6 +5835,38 @@ var SchemaVersionNotSupported2 = "SchemaVersionNotSupported";
5849
5835
  import "@rocicorp/logger";
5850
5836
  import { resolver as resolver9 } from "@rocicorp/resolver";
5851
5837
 
5838
+ // ../shared/src/subscribable.ts
5839
+ var Subscribable = class {
5840
+ _listeners = /* @__PURE__ */ new Set();
5841
+ /**
5842
+ * Subscribe to the subscribable.
5843
+ *
5844
+ * @param listener - The listener to subscribe to.
5845
+ * @returns A function to unsubscribe from the subscribable.
5846
+ */
5847
+ subscribe = (listener) => {
5848
+ this._listeners.add(listener);
5849
+ return () => {
5850
+ this._listeners.delete(listener);
5851
+ };
5852
+ };
5853
+ /**
5854
+ * Notify all listeners.
5855
+ *
5856
+ * @param update - The update to notify listeners with.
5857
+ */
5858
+ notify = (update) => {
5859
+ this._listeners.forEach((listener) => listener(update));
5860
+ };
5861
+ hasListeners = () => this._listeners.size > 0;
5862
+ /**
5863
+ * Unsubscribe all listeners.
5864
+ */
5865
+ cleanup = () => {
5866
+ this._listeners.clear();
5867
+ };
5868
+ };
5869
+
5852
5870
  // ../zero-protocol/src/delete-clients.ts
5853
5871
  var deleteClientsBodySchema = valita_exports.union(
5854
5872
  readonlyObject({
@@ -6289,7 +6307,7 @@ var downstreamSchema = valita_exports.union(
6289
6307
  );
6290
6308
 
6291
6309
  // ../zero-protocol/src/protocol-version.ts
6292
- var PROTOCOL_VERSION = 25;
6310
+ var PROTOCOL_VERSION = 27;
6293
6311
  var MIN_SERVER_SUPPORTED_SYNC_PROTOCOL = 18;
6294
6312
  assert(MIN_SERVER_SUPPORTED_SYNC_PROTOCOL < PROTOCOL_VERSION);
6295
6313
 
@@ -7813,6 +7831,44 @@ function applyDiffs(diffs, branch) {
7813
7831
  }
7814
7832
  }
7815
7833
 
7834
+ // ../zero-client/src/client/measure-push-operator.ts
7835
+ var MeasurePushOperator = class {
7836
+ #input;
7837
+ #queryID;
7838
+ #metricsDelegate;
7839
+ #output = throwOutput;
7840
+ constructor(input, queryID, metricsDelegate) {
7841
+ this.#input = input;
7842
+ this.#queryID = queryID;
7843
+ this.#metricsDelegate = metricsDelegate;
7844
+ input.setOutput(this);
7845
+ }
7846
+ setOutput(output) {
7847
+ this.#output = output;
7848
+ }
7849
+ fetch(req) {
7850
+ return this.#input.fetch(req);
7851
+ }
7852
+ cleanup(req) {
7853
+ return this.#input.cleanup(req);
7854
+ }
7855
+ getSchema() {
7856
+ return this.#input.getSchema();
7857
+ }
7858
+ destroy() {
7859
+ this.#input.destroy();
7860
+ }
7861
+ push(change) {
7862
+ const startTime = performance.now();
7863
+ this.#output.push(change);
7864
+ this.#metricsDelegate.addMetric(
7865
+ "query-update-client",
7866
+ performance.now() - startTime,
7867
+ this.#queryID
7868
+ );
7869
+ }
7870
+ };
7871
+
7816
7872
  // ../zero-client/src/client/context.ts
7817
7873
  var ZeroContext = class {
7818
7874
  // It is a bummer to have to maintain separate MemorySources here and copy the
@@ -7820,14 +7876,13 @@ var ZeroContext = class {
7820
7876
  // pipelines *synchronously* and the core Replicache infra is all async. So
7821
7877
  // that needs to be fixed.
7822
7878
  #mainSources;
7823
- #addQuery;
7824
- #addCustomQuery;
7825
- #updateQuery;
7826
- #updateCustomQuery;
7827
- #flushQueryChanges;
7879
+ addServerQuery;
7880
+ addCustomQuery;
7881
+ updateServerQuery;
7882
+ updateCustomQuery;
7883
+ flushQueryChanges;
7828
7884
  #batchViewUpdates;
7829
7885
  #commitListeners = /* @__PURE__ */ new Set();
7830
- #slowMaterializeThreshold;
7831
7886
  #lc;
7832
7887
  assertValidRunOptions;
7833
7888
  /**
@@ -7835,58 +7890,22 @@ var ZeroContext = class {
7835
7890
  * "complete" once the server has sent back the query result.
7836
7891
  */
7837
7892
  defaultQueryComplete = false;
7838
- constructor(lc, mainSources, addQuery, addCustomQuery, updateQuery, updateCustomQuery, flushQueryChanges, batchViewUpdates, slowMaterializeThreshold, assertValidRunOptions3) {
7893
+ addMetric;
7894
+ constructor(lc, mainSources, addQuery, addCustomQuery, updateQuery, updateCustomQuery, flushQueryChanges, batchViewUpdates, addMetric, assertValidRunOptions3) {
7839
7895
  this.#mainSources = mainSources;
7840
- this.#addQuery = addQuery;
7841
- this.#updateQuery = updateQuery;
7842
- this.#updateCustomQuery = updateCustomQuery;
7896
+ this.addServerQuery = addQuery;
7897
+ this.updateServerQuery = updateQuery;
7898
+ this.updateCustomQuery = updateCustomQuery;
7843
7899
  this.#batchViewUpdates = batchViewUpdates;
7844
7900
  this.#lc = lc;
7845
- this.#slowMaterializeThreshold = slowMaterializeThreshold;
7846
7901
  this.assertValidRunOptions = assertValidRunOptions3;
7847
- this.#addCustomQuery = addCustomQuery;
7848
- this.#flushQueryChanges = flushQueryChanges;
7902
+ this.addCustomQuery = addCustomQuery;
7903
+ this.flushQueryChanges = flushQueryChanges;
7904
+ this.addMetric = addMetric;
7849
7905
  }
7850
7906
  getSource(name) {
7851
7907
  return this.#mainSources.getSource(name);
7852
7908
  }
7853
- addCustomQuery(customQueryID, ttl, gotCallback) {
7854
- return this.#addCustomQuery(
7855
- customQueryID.name,
7856
- customQueryID.args,
7857
- ttl,
7858
- gotCallback
7859
- );
7860
- }
7861
- addServerQuery(ast, ttl, gotCallback) {
7862
- return this.#addQuery(ast, ttl, gotCallback);
7863
- }
7864
- updateServerQuery(ast, ttl) {
7865
- this.#updateQuery(ast, ttl);
7866
- }
7867
- updateCustomQuery(customQueryID, ttl) {
7868
- this.#updateCustomQuery(customQueryID.name, customQueryID.args, ttl);
7869
- }
7870
- flushQueryChanges() {
7871
- this.#flushQueryChanges();
7872
- }
7873
- onQueryMaterialized(hash, ast, duration) {
7874
- if (this.#slowMaterializeThreshold !== void 0 && duration > this.#slowMaterializeThreshold) {
7875
- this.#lc.warn?.(
7876
- "Slow query materialization (including server/network)",
7877
- hash,
7878
- ast,
7879
- duration
7880
- );
7881
- } else {
7882
- this.#lc.debug?.(
7883
- "Materialized query (including server/network)",
7884
- hash,
7885
- ast,
7886
- duration
7887
- );
7888
- }
7889
- }
7890
7909
  mapAst(ast) {
7891
7910
  return ast;
7892
7911
  }
@@ -7899,6 +7918,9 @@ var ZeroContext = class {
7899
7918
  decorateFilterInput(input) {
7900
7919
  return input;
7901
7920
  }
7921
+ decorateSourceInput(input, queryID) {
7922
+ return new MeasurePushOperator(input, queryID, this);
7923
+ }
7902
7924
  onTransactionCommit(cb) {
7903
7925
  this.#commitListeners.add(cb);
7904
7926
  return () => {
@@ -8168,7 +8190,7 @@ var emptyObject = Object.freeze({});
8168
8190
 
8169
8191
  // ../zero-client/src/client/custom.ts
8170
8192
  var TransactionImpl = class {
8171
- constructor(lc, repTx, schema, slowMaterializeThreshold) {
8193
+ constructor(lc, repTx, schema) {
8172
8194
  const castedRepTx = repTx;
8173
8195
  must(repTx.reason === "initial" || repTx.reason === "rebase");
8174
8196
  this.clientID = repTx.clientID;
@@ -8186,8 +8208,7 @@ var TransactionImpl = class {
8186
8208
  this.query = makeSchemaQuery(
8187
8209
  lc,
8188
8210
  schema,
8189
- txData.ivmSources,
8190
- slowMaterializeThreshold
8211
+ txData.ivmSources
8191
8212
  );
8192
8213
  this.token = txData.token;
8193
8214
  }
@@ -8199,9 +8220,9 @@ var TransactionImpl = class {
8199
8220
  query;
8200
8221
  token;
8201
8222
  };
8202
- function makeReplicacheMutator(lc, mutator, schema, slowMaterializeThreshold) {
8223
+ function makeReplicacheMutator(lc, mutator, schema) {
8203
8224
  return async (repTx, args) => {
8204
- const tx = new TransactionImpl(lc, repTx, schema, slowMaterializeThreshold);
8225
+ const tx = new TransactionImpl(lc, repTx, schema);
8205
8226
  await mutator(tx, args);
8206
8227
  };
8207
8228
  }
@@ -8225,7 +8246,7 @@ function assertValidRunOptions(options) {
8225
8246
  "Cannot wait for complete results in custom mutations"
8226
8247
  );
8227
8248
  }
8228
- function makeSchemaQuery(lc, schema, ivmBranch, slowMaterializeThreshold) {
8249
+ function makeSchemaQuery(lc, schema, ivmBranch) {
8229
8250
  const context = new ZeroContext(
8230
8251
  lc,
8231
8252
  ivmBranch,
@@ -8235,7 +8256,7 @@ function makeSchemaQuery(lc, schema, ivmBranch, slowMaterializeThreshold) {
8235
8256
  emptyFunction,
8236
8257
  emptyFunction,
8237
8258
  (applyViewUpdates) => applyViewUpdates(),
8238
- slowMaterializeThreshold,
8259
+ emptyFunction,
8239
8260
  assertValidRunOptions
8240
8261
  );
8241
8262
  return new Proxy(
@@ -8581,7 +8602,7 @@ function makeMessage(message, context, logLevel) {
8581
8602
  }
8582
8603
 
8583
8604
  // ../zero-client/src/client/version.ts
8584
- var version2 = "0.22.2025081301";
8605
+ var version2 = "0.23.2025081400";
8585
8606
 
8586
8607
  // ../zero-client/src/client/log-options.ts
8587
8608
  var LevelFilterLogSink = class {
@@ -9150,7 +9171,10 @@ var QueryManager = class {
9150
9171
  #pendingRemovals = [];
9151
9172
  #batchTimer;
9152
9173
  #lc;
9153
- constructor(lc, mutationTracker, clientID, tables, send2, experimentalWatch, recentQueriesMaxSize, queryChangeThrottleMs) {
9174
+ #metrics = newMetrics();
9175
+ #queryMetrics = /* @__PURE__ */ new Map();
9176
+ #slowMaterializeThreshold;
9177
+ constructor(lc, mutationTracker, clientID, tables, send2, experimentalWatch, recentQueriesMaxSize, queryChangeThrottleMs, slowMaterializeThreshold) {
9154
9178
  this.#lc = lc.withContext("QueryManager");
9155
9179
  this.#clientID = clientID;
9156
9180
  this.#clientToServer = clientToServer(tables);
@@ -9158,6 +9182,7 @@ var QueryManager = class {
9158
9182
  this.#send = send2;
9159
9183
  this.#mutationTracker = mutationTracker;
9160
9184
  this.#queryChangeThrottleMs = queryChangeThrottleMs;
9185
+ this.#slowMaterializeThreshold = slowMaterializeThreshold;
9161
9186
  this.#mutationTracker.onAllMutationsApplied(() => {
9162
9187
  if (this.#pendingRemovals.length === 0) {
9163
9188
  return;
@@ -9253,7 +9278,7 @@ var QueryManager = class {
9253
9278
  }
9254
9279
  return patch;
9255
9280
  }
9256
- addCustom(name, args, ttl, gotCallback) {
9281
+ addCustom({ name, args }, ttl, gotCallback) {
9257
9282
  const queryId = hashOfNameAndArgs(name, args);
9258
9283
  return this.#add(
9259
9284
  queryId,
@@ -9333,7 +9358,7 @@ var QueryManager = class {
9333
9358
  this.#remove(entry, queryId, gotCallback);
9334
9359
  };
9335
9360
  }
9336
- updateCustom(name, args, ttl) {
9361
+ updateCustom({ name, args }, ttl) {
9337
9362
  const hash = hashOfNameAndArgs(name, args);
9338
9363
  const entry = must(this.#queries.get(hash));
9339
9364
  this.#updateEntry(entry, hash, ttl);
@@ -9394,15 +9419,61 @@ var QueryManager = class {
9394
9419
  if (entry.count === 0) {
9395
9420
  this.#recentQueries.add(astHash);
9396
9421
  if (this.#recentQueries.size > this.#recentQueriesMaxSize) {
9397
- const lruAstHash = this.#recentQueries.values().next().value;
9398
- assert(lruAstHash);
9399
- this.#queries.delete(lruAstHash);
9400
- this.#recentQueries.delete(lruAstHash);
9401
- this.#queueQueryChange({ op: "del", hash: lruAstHash });
9422
+ const lruQueryID = this.#recentQueries.values().next().value;
9423
+ assert(lruQueryID);
9424
+ this.#queries.delete(lruQueryID);
9425
+ this.#recentQueries.delete(lruQueryID);
9426
+ this.#queryMetrics.delete(lruQueryID);
9427
+ this.#queueQueryChange({ op: "del", hash: lruQueryID });
9402
9428
  }
9403
9429
  }
9404
9430
  }
9431
+ /**
9432
+ * Gets the aggregated metrics for all queries managed by this QueryManager.
9433
+ */
9434
+ get metrics() {
9435
+ return this.#metrics;
9436
+ }
9437
+ addMetric(metric, value, ...args) {
9438
+ metric;
9439
+ this.#metrics[metric].add(value);
9440
+ const queryID = args[0];
9441
+ if (metric === "query-materialization-end-to-end") {
9442
+ const ast = args[1];
9443
+ if (this.#slowMaterializeThreshold !== void 0 && value > this.#slowMaterializeThreshold) {
9444
+ this.#lc.warn?.(
9445
+ "Slow query materialization (including server/network)",
9446
+ queryID,
9447
+ ast,
9448
+ value
9449
+ );
9450
+ } else {
9451
+ this.#lc.debug?.(
9452
+ "Materialized query (including server/network)",
9453
+ queryID,
9454
+ ast,
9455
+ value
9456
+ );
9457
+ }
9458
+ }
9459
+ let existing = this.#queryMetrics.get(queryID);
9460
+ if (!existing) {
9461
+ existing = newMetrics();
9462
+ this.#queryMetrics.set(queryID, existing);
9463
+ }
9464
+ existing[metric].add(value);
9465
+ }
9466
+ getQueryMetrics(queryID) {
9467
+ return this.#queryMetrics.get(queryID);
9468
+ }
9405
9469
  };
9470
+ function newMetrics() {
9471
+ return {
9472
+ "query-materialization-client": new TDigest(),
9473
+ "query-materialization-end-to-end": new TDigest(),
9474
+ "query-update-client": new TDigest()
9475
+ };
9476
+ }
9406
9477
 
9407
9478
  // ../zero-client/src/client/options.ts
9408
9479
  var updateNeededReasonTypeSchema = literalUnion(
@@ -9966,38 +10037,6 @@ var ZeroRep = class {
9966
10037
  }
9967
10038
  };
9968
10039
 
9969
- // ../shared/src/subscribable.ts
9970
- var Subscribable = class {
9971
- _listeners = /* @__PURE__ */ new Set();
9972
- /**
9973
- * Subscribe to the subscribable.
9974
- *
9975
- * @param listener - The listener to subscribe to.
9976
- * @returns A function to unsubscribe from the subscribable.
9977
- */
9978
- subscribe = (listener) => {
9979
- this._listeners.add(listener);
9980
- return () => {
9981
- this._listeners.delete(listener);
9982
- };
9983
- };
9984
- /**
9985
- * Notify all listeners.
9986
- *
9987
- * @param update - The update to notify listeners with.
9988
- */
9989
- notify = (update) => {
9990
- this._listeners.forEach((listener) => listener(update));
9991
- };
9992
- hasListeners = () => this._listeners.size > 0;
9993
- /**
9994
- * Unsubscribe all listeners.
9995
- */
9996
- cleanup = () => {
9997
- this._listeners.clear();
9998
- };
9999
- };
10000
-
10001
10040
  // ../zero-client/src/client/zero.ts
10002
10041
  var onSetConnectionStateSymbol = Symbol();
10003
10042
  var exposedToTestingSymbol = Symbol();
@@ -10228,8 +10267,7 @@ var Zero = class _Zero {
10228
10267
  replicacheMutators[key] = makeReplicacheMutator(
10229
10268
  lc,
10230
10269
  mutatorOrMutators,
10231
- schema,
10232
- slowMaterializeThreshold
10270
+ schema
10233
10271
  // Replicache expects mutators to only be able to return JSON
10234
10272
  // but Zero wraps the return with: `{server?: Promise<MutationResult>, client?: T}`
10235
10273
  );
@@ -10245,8 +10283,7 @@ var Zero = class _Zero {
10245
10283
  replicacheMutators[key] = makeReplicacheMutator(
10246
10284
  lc,
10247
10285
  mutator,
10248
- schema,
10249
- slowMaterializeThreshold
10286
+ schema
10250
10287
  );
10251
10288
  }
10252
10289
  continue;
@@ -10280,12 +10317,12 @@ var Zero = class _Zero {
10280
10317
  lc,
10281
10318
  this.#ivmMain,
10282
10319
  (ast, ttl, gotCallback) => this.#queryManager.addLegacy(ast, ttl, gotCallback),
10283
- (queryName, queryArgs, ttl, gotCallback) => this.#queryManager.addCustom(queryName, queryArgs, ttl, gotCallback),
10320
+ (customQueryID, ttl, gotCallback) => this.#queryManager.addCustom(customQueryID, ttl, gotCallback),
10284
10321
  (ast, ttl) => this.#queryManager.updateLegacy(ast, ttl),
10285
- (name, args, ttl) => this.#queryManager.updateCustom(name, args, ttl),
10322
+ (customQueryID, ttl) => this.#queryManager.updateCustom(customQueryID, ttl),
10286
10323
  () => this.#queryManager.flushBatch(),
10287
10324
  batchViewUpdates,
10288
- slowMaterializeThreshold,
10325
+ this.#addMetric,
10289
10326
  assertValidRunOptions2
10290
10327
  );
10291
10328
  this.queryDelegate = this.#zeroContext;
@@ -10377,7 +10414,8 @@ var Zero = class _Zero {
10377
10414
  (msg) => this.#send(msg),
10378
10415
  rep.experimentalWatch.bind(rep),
10379
10416
  maxRecentQueries,
10380
- options.queryChangeThrottleMs ?? DEFAULT_QUERY_CHANGE_THROTTLE_MS
10417
+ options.queryChangeThrottleMs ?? DEFAULT_QUERY_CHANGE_THROTTLE_MS,
10418
+ slowMaterializeThreshold
10381
10419
  );
10382
10420
  this.#clientToServer = clientToServer(schema.tables);
10383
10421
  this.#deleteClientsManager = new DeleteClientsManager(
@@ -11316,13 +11354,32 @@ var Zero = class _Zero {
11316
11354
  */
11317
11355
  async inspect() {
11318
11356
  BUNDLE_SIZE: {
11319
- const m = await import("./inspector-AF3UI76B.js");
11320
- return m.newInspector(this.#rep, this.#schema, async () => {
11321
- await this.#connectResolver.promise;
11322
- return this.#socket;
11323
- });
11357
+ const m = await import("./inspector-J5P4DOGH.js");
11358
+ return m.newInspector(
11359
+ this.#rep,
11360
+ this.#queryManager,
11361
+ this.#schema,
11362
+ async () => {
11363
+ await this.#connectResolver.promise;
11364
+ return this.#socket;
11365
+ }
11366
+ );
11324
11367
  }
11325
11368
  }
11369
+ #addMetric = (metric, value, ...args) => {
11370
+ switch (metric) {
11371
+ case "query-materialization-client":
11372
+ case "query-materialization-end-to-end":
11373
+ case "query-update-client":
11374
+ this.#queryManager.addMetric(metric, value, ...args);
11375
+ break;
11376
+ case "query-materialization-server":
11377
+ unreachable();
11378
+ // eslint-disable-next-line no-fallthrough
11379
+ default:
11380
+ unreachable(metric);
11381
+ }
11382
+ };
11326
11383
  };
11327
11384
  var OnlineManager = class extends Subscribable {
11328
11385
  #online = false;
@@ -11457,7 +11514,6 @@ export {
11457
11514
  dropDatabase,
11458
11515
  dropAllDatabases,
11459
11516
  error_kind_enum_exports,
11460
- mapEntries,
11461
11517
  table,
11462
11518
  string3 as string,
11463
11519
  number2 as number,
@@ -11469,4 +11525,4 @@ export {
11469
11525
  update_needed_reason_type_enum_exports,
11470
11526
  Zero
11471
11527
  };
11472
- //# sourceMappingURL=chunk-N2EOVSVB.js.map
11528
+ //# sourceMappingURL=chunk-ZKRMVMWK.js.map