@rocicorp/zero 1.9.0-head-ef892a12-20260713 → 1.9.0

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 (163) hide show
  1. package/out/z2s/src/compiler.d.ts.map +1 -1
  2. package/out/z2s/src/compiler.js +1 -22
  3. package/out/z2s/src/compiler.js.map +1 -1
  4. package/out/zero/package.js +3 -20
  5. package/out/zero/package.js.map +1 -1
  6. package/out/zero-cache/src/config/zero-config.d.ts +9 -0
  7. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  8. package/out/zero-cache/src/config/zero-config.js +32 -2
  9. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  10. package/out/zero-cache/src/custom/fetch.js +1 -1
  11. package/out/zero-cache/src/custom/fetch.js.map +1 -1
  12. package/out/zero-cache/src/db/delete-lite-db.js +2 -1
  13. package/out/zero-cache/src/db/delete-lite-db.js.map +1 -1
  14. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  15. package/out/zero-cache/src/db/migration-lite.js +5 -2
  16. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  17. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  18. package/out/zero-cache/src/db/migration.js +3 -1
  19. package/out/zero-cache/src/db/migration.js.map +1 -1
  20. package/out/zero-cache/src/db/sqlite-corruption.d.ts +12 -0
  21. package/out/zero-cache/src/db/sqlite-corruption.d.ts.map +1 -0
  22. package/out/zero-cache/src/db/sqlite-corruption.js +196 -0
  23. package/out/zero-cache/src/db/sqlite-corruption.js.map +1 -0
  24. package/out/zero-cache/src/observability/metrics.d.ts +1 -1
  25. package/out/zero-cache/src/observability/metrics.d.ts.map +1 -1
  26. package/out/zero-cache/src/observability/metrics.js +5 -1
  27. package/out/zero-cache/src/observability/metrics.js.map +1 -1
  28. package/out/zero-cache/src/server/backup-watermark-reader.js +1 -1
  29. package/out/zero-cache/src/server/backup-watermark-reader.js.map +1 -1
  30. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  31. package/out/zero-cache/src/server/change-streamer.js +10 -5
  32. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  33. package/out/zero-cache/src/server/logging.d.ts +8 -0
  34. package/out/zero-cache/src/server/logging.d.ts.map +1 -1
  35. package/out/zero-cache/src/server/logging.js +27 -5
  36. package/out/zero-cache/src/server/logging.js.map +1 -1
  37. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  38. package/out/zero-cache/src/server/main.js +6 -1
  39. package/out/zero-cache/src/server/main.js.map +1 -1
  40. package/out/zero-cache/src/server/mutator.js +1 -1
  41. package/out/zero-cache/src/server/mutator.js.map +1 -1
  42. package/out/zero-cache/src/server/otel-log-sink.d.ts +7 -1
  43. package/out/zero-cache/src/server/otel-log-sink.d.ts.map +1 -1
  44. package/out/zero-cache/src/server/otel-log-sink.js +7 -2
  45. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  46. package/out/zero-cache/src/server/reaper.js +1 -1
  47. package/out/zero-cache/src/server/reaper.js.map +1 -1
  48. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  49. package/out/zero-cache/src/server/replicator.js +11 -1
  50. package/out/zero-cache/src/server/replicator.js.map +1 -1
  51. package/out/zero-cache/src/server/shadow-syncer.js +1 -1
  52. package/out/zero-cache/src/server/shadow-syncer.js.map +1 -1
  53. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  54. package/out/zero-cache/src/server/syncer.js +6 -1
  55. package/out/zero-cache/src/server/syncer.js.map +1 -1
  56. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  57. package/out/zero-cache/src/services/change-source/common/replica-schema.js +8 -5
  58. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  59. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +1 -1
  60. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  61. package/out/zero-cache/src/services/change-source/pg/change-source.js +20 -10
  62. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  63. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +15 -0
  64. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  65. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +41 -10
  66. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  67. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +65 -1
  68. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  69. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +88 -8
  70. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  71. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +60 -93
  72. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  73. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +15 -11
  74. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  75. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts +1 -0
  76. package/out/zero-cache/src/services/change-source/protocol/current/data.d.ts.map +1 -1
  77. package/out/zero-cache/src/services/change-source/protocol/current/data.js +4 -1
  78. package/out/zero-cache/src/services/change-source/protocol/current/data.js.map +1 -1
  79. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts +3 -0
  80. package/out/zero-cache/src/services/change-source/protocol/current/downstream.d.ts.map +1 -1
  81. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts +1 -0
  82. package/out/zero-cache/src/services/change-source/protocol/current/status.d.ts.map +1 -1
  83. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts +1 -0
  84. package/out/zero-cache/src/services/change-source/protocol/current/upstream.d.ts.map +1 -1
  85. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +4 -4
  86. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  87. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts +1 -0
  88. package/out/zero-cache/src/services/change-streamer/change-streamer.d.ts.map +1 -1
  89. package/out/zero-cache/src/services/change-streamer/change-streamer.js.map +1 -1
  90. package/out/zero-cache/src/services/change-streamer/storer.d.ts +7 -1
  91. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  92. package/out/zero-cache/src/services/change-streamer/storer.js +24 -5
  93. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  94. package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
  95. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  96. package/out/zero-cache/src/services/life-cycle.js +16 -4
  97. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  98. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  99. package/out/zero-cache/src/services/litestream/commands.js +91 -25
  100. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  101. package/out/zero-cache/src/services/litestream/config.yml +3 -2
  102. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  103. package/out/zero-cache/src/services/mutagen/mutagen.js +4 -1
  104. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  105. package/out/zero-cache/src/services/replicator/change-processor.d.ts +6 -0
  106. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  107. package/out/zero-cache/src/services/replicator/change-processor.js +54 -23
  108. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  109. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  110. package/out/zero-cache/src/services/replicator/incremental-sync.js +8 -2
  111. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  112. package/out/zero-cache/src/services/replicator/notifier.d.ts +0 -22
  113. package/out/zero-cache/src/services/replicator/notifier.d.ts.map +1 -1
  114. package/out/zero-cache/src/services/replicator/notifier.js +7 -1
  115. package/out/zero-cache/src/services/replicator/notifier.js.map +1 -1
  116. package/out/zero-cache/src/services/replicator/replicator.d.ts +16 -1
  117. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  118. package/out/zero-cache/src/services/replicator/replicator.js +7 -1
  119. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  120. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +27 -0
  121. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
  122. package/out/zero-cache/src/services/replicator/reporter/recorder.js +32 -0
  123. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  124. package/out/zero-cache/src/services/replicator/reporter/report-schema.d.ts +1 -1
  125. package/out/zero-cache/src/services/replicator/write-worker.js +46 -7
  126. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  127. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts +44 -0
  128. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.d.ts.map +1 -0
  129. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js +59 -0
  130. package/out/zero-cache/src/services/view-syncer/e2e-serving-lag.js.map +1 -0
  131. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  132. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  133. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  134. package/out/zero-cache/src/services/view-syncer/view-syncer.js +18 -1
  135. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  136. package/out/zero-cache/src/types/streams.d.ts +11 -0
  137. package/out/zero-cache/src/types/streams.d.ts.map +1 -1
  138. package/out/zero-cache/src/types/streams.js.map +1 -1
  139. package/out/zero-cache/src/types/subscription.d.ts +11 -0
  140. package/out/zero-cache/src/types/subscription.d.ts.map +1 -1
  141. package/out/zero-cache/src/types/subscription.js +27 -0
  142. package/out/zero-cache/src/types/subscription.js.map +1 -1
  143. package/out/zero-client/src/client/version.js +1 -1
  144. package/out/zero-client/src/client/zero.d.ts +6 -7
  145. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  146. package/out/zero-client/src/client/zero.js +156 -101
  147. package/out/zero-client/src/client/zero.js.map +1 -1
  148. package/out/zero-server/src/custom.js +10 -3
  149. package/out/zero-server/src/custom.js.map +1 -1
  150. package/out/zero-server/src/schema.d.ts +8 -0
  151. package/out/zero-server/src/schema.d.ts.map +1 -1
  152. package/out/zero-server/src/schema.js +63 -24
  153. package/out/zero-server/src/schema.js.map +1 -1
  154. package/out/zql/src/mutate/crud.d.ts +10 -8
  155. package/out/zql/src/mutate/crud.d.ts.map +1 -1
  156. package/out/zql/src/mutate/crud.js.map +1 -1
  157. package/out/zql/src/query/query-delegate-base.d.ts.map +1 -1
  158. package/out/zql/src/query/query-delegate-base.js +5 -1
  159. package/out/zql/src/query/query-delegate-base.js.map +1 -1
  160. package/out/zqlite/src/resolve-scalar-subqueries.d.ts.map +1 -1
  161. package/out/zqlite/src/resolve-scalar-subqueries.js +13 -1
  162. package/out/zqlite/src/resolve-scalar-subqueries.js.map +1 -1
  163. package/package.json +3 -34
@@ -25,6 +25,7 @@ import { ClientHandler, startPoke } from "./client-handler.js";
25
25
  import { tracer } from "./tracer.js";
26
26
  import { CVRStore, ClientNotFoundError } from "./cvr-store.js";
27
27
  import { CVRConfigDrivenUpdater, CVRQueryDrivenUpdater, nextEvictionTime } from "./cvr.js";
28
+ import { E2EServingLagTracker } from "./e2e-serving-lag.js";
28
29
  import { handleInspect } from "./inspect-handler.js";
29
30
  import { QueryCoveringIndex } from "./query-covering.js";
30
31
  import { resolver } from "@rocicorp/resolver";
@@ -90,6 +91,7 @@ var ViewSyncerService = class {
90
91
  #cvr;
91
92
  #pipelinesSynced = false;
92
93
  #servedVersion = null;
94
+ #e2eServingLagTracker = new E2EServingLagTracker();
93
95
  #expiredQueriesTimer = 0;
94
96
  #authMaintenanceTimer = 0;
95
97
  #setTimeout;
@@ -102,6 +104,14 @@ var ViewSyncerService = class {
102
104
  description: "Time from ViewSyncer query sync requiring hydration to output for a client group. Includes query transformation, query materialization, CVR flush, catchup, and pokeEnd.",
103
105
  unit: "s"
104
106
  });
107
+ #e2eServingLag = getOrCreateNativeHistogram("sync", "e2e_serving_lag", {
108
+ description: "End-to-end lag from upstream commit to ViewSyncer output. Spans the whole pipeline: the upstream transaction commit, replication to the replica, IVM advancement, CVR flush, and pokeEnd. Recorded once per served version, not sampled, so each observation is the completion latency of real replicated work.",
109
+ unit: "s"
110
+ });
111
+ #e2eServingLagClamps = getOrCreateCounter("sync", "e2e_serving_lag_clamps", {
112
+ description: "Observations of sync.e2e_serving_lag that came out negative and were clamped to zero. Non-zero means the upstream database clock is running ahead of this pod by more than the entire pipeline latency, so sync.e2e_serving_lag is biased low and reads healthier than reality. See replication.upstream_clock_skew for the magnitude.",
113
+ unit: "{observation}"
114
+ });
105
115
  #transactionAdvanceTime = getOrCreateLatencyHistogram("sync", "advance-time", "Time to advance all queries for a given client group after applying a new transaction to the replica.");
106
116
  #queryTransformations = getOrCreateCounter("sync", "query.transformations", "Number of query transformations performed");
107
117
  #queryTransformationTime = getOrCreateLatencyHistogram("sync", "query.transformation-time", "Time to transform custom queries via API server.");
@@ -186,12 +196,14 @@ var ViewSyncerService = class {
186
196
  this.#lc.debug?.(`draining view-syncer ${this.id} before running`);
187
197
  this.stop();
188
198
  }
189
- for await (const { state } of this.#stateChanges) {
199
+ for await (const replicaState of this.#stateChanges) {
200
+ const { state } = replicaState;
190
201
  if (this.#drainCoordinator.shouldDrain()) {
191
202
  this.#lc.debug?.(`draining view-syncer ${this.id} (elective)`);
192
203
  break;
193
204
  }
194
205
  assert(state === "version-ready", "state should be version-ready");
206
+ this.#e2eServingLagTracker.onVersionReady(replicaState);
195
207
  await this.#runInLockWithCVR(async (lc, cvr) => {
196
208
  const clientSchema = must(cvr.clientSchema, "cvr.clientSchema missing after initialization");
197
209
  if (!this.#pipelines.initialized()) this.#pipelines.init(clientSchema);
@@ -258,6 +270,11 @@ var ViewSyncerService = class {
258
270
  }
259
271
  #markVersionServed(version) {
260
272
  this.#servedVersion = version.stateVersion;
273
+ const observation = this.#e2eServingLagTracker.onVersionServed(version.stateVersion, Date.now());
274
+ if (observation !== null) {
275
+ this.#e2eServingLag.recordMs(observation.lagMs);
276
+ if (observation.clamped) this.#e2eServingLagClamps.add(1);
277
+ }
261
278
  }
262
279
  #keepAliveUntil = 0;
263
280
  /**