@rocicorp/zero 1.8.0 → 1.9.0-canary.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 (157) hide show
  1. package/out/shared/src/cache.d.ts +8 -1
  2. package/out/shared/src/cache.d.ts.map +1 -1
  3. package/out/shared/src/cache.js +25 -9
  4. package/out/shared/src/cache.js.map +1 -1
  5. package/out/shared/src/objects.d.ts +6 -1
  6. package/out/shared/src/objects.d.ts.map +1 -1
  7. package/out/shared/src/objects.js +19 -4
  8. package/out/shared/src/objects.js.map +1 -1
  9. package/out/zero/package.js +2 -19
  10. package/out/zero/package.js.map +1 -1
  11. package/out/zero-cache/src/config/zero-config.d.ts +4 -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 +21 -6
  14. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  15. package/out/zero-cache/src/custom-queries/transform-query.d.ts +6 -0
  16. package/out/zero-cache/src/custom-queries/transform-query.d.ts.map +1 -1
  17. package/out/zero-cache/src/custom-queries/transform-query.js +8 -0
  18. package/out/zero-cache/src/custom-queries/transform-query.js.map +1 -1
  19. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  20. package/out/zero-cache/src/db/migration-lite.js +5 -2
  21. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  22. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  23. package/out/zero-cache/src/db/migration.js +3 -1
  24. package/out/zero-cache/src/db/migration.js.map +1 -1
  25. package/out/zero-cache/src/db/sqlite-corruption.d.ts +11 -0
  26. package/out/zero-cache/src/db/sqlite-corruption.d.ts.map +1 -0
  27. package/out/zero-cache/src/db/sqlite-corruption.js +191 -0
  28. package/out/zero-cache/src/db/sqlite-corruption.js.map +1 -0
  29. package/out/zero-cache/src/server/anonymous-otel-start.d.ts +1 -1
  30. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  31. package/out/zero-cache/src/server/backup-watermark-reader.js +1 -1
  32. package/out/zero-cache/src/server/backup-watermark-reader.js.map +1 -1
  33. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  34. package/out/zero-cache/src/server/change-streamer.js +7 -2
  35. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  36. package/out/zero-cache/src/server/logging.d.ts +8 -0
  37. package/out/zero-cache/src/server/logging.d.ts.map +1 -1
  38. package/out/zero-cache/src/server/logging.js +27 -5
  39. package/out/zero-cache/src/server/logging.js.map +1 -1
  40. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  41. package/out/zero-cache/src/server/main.js +6 -1
  42. package/out/zero-cache/src/server/main.js.map +1 -1
  43. package/out/zero-cache/src/server/mutator.js +1 -1
  44. package/out/zero-cache/src/server/mutator.js.map +1 -1
  45. package/out/zero-cache/src/server/otel-log-sink.d.ts +7 -1
  46. package/out/zero-cache/src/server/otel-log-sink.d.ts.map +1 -1
  47. package/out/zero-cache/src/server/otel-log-sink.js +7 -2
  48. package/out/zero-cache/src/server/otel-log-sink.js.map +1 -1
  49. package/out/zero-cache/src/server/reaper.js +1 -1
  50. package/out/zero-cache/src/server/reaper.js.map +1 -1
  51. package/out/zero-cache/src/server/replicator.d.ts.map +1 -1
  52. package/out/zero-cache/src/server/replicator.js +11 -1
  53. package/out/zero-cache/src/server/replicator.js.map +1 -1
  54. package/out/zero-cache/src/server/shadow-syncer.js +1 -1
  55. package/out/zero-cache/src/server/shadow-syncer.js.map +1 -1
  56. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  57. package/out/zero-cache/src/server/syncer.js +6 -1
  58. package/out/zero-cache/src/server/syncer.js.map +1 -1
  59. package/out/zero-cache/src/services/change-source/common/replica-schema.d.ts.map +1 -1
  60. package/out/zero-cache/src/services/change-source/common/replica-schema.js +8 -5
  61. package/out/zero-cache/src/services/change-source/common/replica-schema.js.map +1 -1
  62. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +36 -2
  63. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  64. package/out/zero-cache/src/services/change-source/pg/change-source.js +76 -33
  65. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  66. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +15 -0
  67. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  68. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +41 -10
  69. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  70. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts +21 -0
  71. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.d.ts.map +1 -1
  72. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js +34 -5
  73. package/out/zero-cache/src/services/change-source/pg/logical-replication/stream.js.map +1 -1
  74. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts +2 -2
  75. package/out/zero-cache/src/services/change-source/pg/replication-slots.d.ts.map +1 -1
  76. package/out/zero-cache/src/services/change-source/pg/replication-slots.js.map +1 -1
  77. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +61 -87
  78. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  79. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +17 -12
  80. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  81. package/out/zero-cache/src/services/life-cycle.d.ts +1 -1
  82. package/out/zero-cache/src/services/life-cycle.d.ts.map +1 -1
  83. package/out/zero-cache/src/services/life-cycle.js +15 -3
  84. package/out/zero-cache/src/services/life-cycle.js.map +1 -1
  85. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  86. package/out/zero-cache/src/services/litestream/commands.js +20 -3
  87. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  88. package/out/zero-cache/src/services/litestream/vfs-watermark-reader.js +2 -2
  89. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  90. package/out/zero-cache/src/services/mutagen/mutagen.js +4 -1
  91. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  92. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  93. package/out/zero-cache/src/services/replicator/change-processor.js +28 -15
  94. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  95. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts +1 -1
  96. package/out/zero-cache/src/services/replicator/reporter/recorder.d.ts.map +1 -1
  97. package/out/zero-cache/src/services/replicator/reporter/recorder.js +5 -12
  98. package/out/zero-cache/src/services/replicator/reporter/recorder.js.map +1 -1
  99. package/out/zero-cache/src/services/replicator/write-worker.js +38 -7
  100. package/out/zero-cache/src/services/replicator/write-worker.js.map +1 -1
  101. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  102. package/out/zero-cache/src/services/view-syncer/cvr.js +8 -1
  103. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  104. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  105. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +66 -26
  106. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  107. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts +28 -0
  108. package/out/zero-cache/src/services/view-syncer/query-covering.d.ts.map +1 -0
  109. package/out/zero-cache/src/services/view-syncer/query-covering.js +159 -0
  110. package/out/zero-cache/src/services/view-syncer/query-covering.js.map +1 -0
  111. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +2 -0
  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 +71 -1
  114. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  115. package/out/zero-cache/src/types/lite.d.ts.map +1 -1
  116. package/out/zero-cache/src/types/lite.js +4 -1
  117. package/out/zero-cache/src/types/lite.js.map +1 -1
  118. package/out/zero-cache/src/types/pg.d.ts +18 -0
  119. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  120. package/out/zero-cache/src/types/pg.js +50 -0
  121. package/out/zero-cache/src/types/pg.js.map +1 -1
  122. package/out/zero-cache/src/workers/syncer.d.ts +1 -1
  123. package/out/zero-cache/src/workers/syncer.d.ts.map +1 -1
  124. package/out/zero-cache/src/workers/syncer.js +1 -0
  125. package/out/zero-cache/src/workers/syncer.js.map +1 -1
  126. package/out/zero-client/src/client/crud.d.ts.map +1 -1
  127. package/out/zero-client/src/client/crud.js +3 -4
  128. package/out/zero-client/src/client/crud.js.map +1 -1
  129. package/out/zero-client/src/client/version.js +1 -1
  130. package/out/zero-schema/src/builder/relationship-builder.d.ts.map +1 -1
  131. package/out/zero-schema/src/builder/relationship-builder.js +3 -2
  132. package/out/zero-schema/src/builder/relationship-builder.js.map +1 -1
  133. package/out/zero-schema/src/builder/schema-builder.d.ts.map +1 -1
  134. package/out/zero-schema/src/builder/schema-builder.js +7 -7
  135. package/out/zero-schema/src/builder/schema-builder.js.map +1 -1
  136. package/out/zero-schema/src/builder/table-builder.d.ts.map +1 -1
  137. package/out/zero-schema/src/builder/table-builder.js +2 -1
  138. package/out/zero-schema/src/builder/table-builder.js.map +1 -1
  139. package/out/zero-server/src/custom.js +2 -1
  140. package/out/zero-server/src/custom.js.map +1 -1
  141. package/out/zql/src/ivm/view-apply-change.d.ts.map +1 -1
  142. package/out/zql/src/ivm/view-apply-change.js +2 -1
  143. package/out/zql/src/ivm/view-apply-change.js.map +1 -1
  144. package/out/zql/src/mutate/crud.d.ts +10 -8
  145. package/out/zql/src/mutate/crud.d.ts.map +1 -1
  146. package/out/zql/src/mutate/crud.js +3 -4
  147. package/out/zql/src/mutate/crud.js.map +1 -1
  148. package/out/zqlite/src/db.js +2 -2
  149. package/out/zqlite/src/internal/statement-cache.d.ts +25 -1
  150. package/out/zqlite/src/internal/statement-cache.d.ts.map +1 -1
  151. package/out/zqlite/src/internal/statement-cache.js +48 -18
  152. package/out/zqlite/src/internal/statement-cache.js.map +1 -1
  153. package/out/zqlite/src/query-builder.js +3 -3
  154. package/out/zqlite/src/query-builder.js.map +1 -1
  155. package/out/zqlite/src/sqlite-cost-model.js +5 -5
  156. package/out/zqlite/src/table-source.js +3 -3
  157. package/package.json +2 -33
@@ -26,6 +26,7 @@ import { tracer } from "./tracer.js";
26
26
  import { CVRStore, ClientNotFoundError } from "./cvr-store.js";
27
27
  import { CVRConfigDrivenUpdater, CVRQueryDrivenUpdater, nextEvictionTime } from "./cvr.js";
28
28
  import { handleInspect } from "./inspect-handler.js";
29
+ import { QueryCoveringIndex } from "./query-covering.js";
29
30
  import { resolver } from "@rocicorp/resolver";
30
31
  import { Lock } from "@rocicorp/lock";
31
32
  //#region ../zero-cache/src/services/view-syncer/view-syncer.ts
@@ -109,6 +110,7 @@ var ViewSyncerService = class {
109
110
  #lockWaitTime = getOrCreateLatencyHistogram("sync", "lock-wait-time", "Time spent waiting to acquire the ViewSyncer lock.");
110
111
  #pipelineResets = getOrCreateCounter("sync", "pipeline-resets", "Number of pipeline resets");
111
112
  #rowSetSignatureDrifts = getOrCreateCounter("sync", "query.row-set-signature-drifts", "Number of times re-hydration of an unchanged query produced a different row-set signature than what is stored in the CVR (forcing a configVersion bump and full re-execution). Expected to be near-zero in steady state; persistent non-zero values indicate non-deterministic query execution (e.g. Cap operator picking different N-row subsets).");
113
+ #sameHashRehydrationVersionBumps = getOrCreateCounter("sync", "query.same-hash-rehydrations-forced-bump", "Number of times query-set reconciliation forced a configVersion bump for already-gotten same-transformation-hash query rehydration because trackQueries would not otherwise bump. Expected to be near-zero; non-zero values indicate pipeline/CVR row-set drift reached query-set reconciliation.");
112
114
  #inspectorDelegate;
113
115
  #config;
114
116
  #runPriorityOp;
@@ -251,6 +253,9 @@ var ViewSyncerService = class {
251
253
  get servedVersion() {
252
254
  return this.#servedVersion;
253
255
  }
256
+ get servingLagEligible() {
257
+ return this.#clients.size > 0 && this.connContextManager.getBackgroundConnectionContext() !== void 0;
258
+ }
254
259
  #markVersionServed(version) {
255
260
  this.#servedVersion = version.stateVersion;
256
261
  }
@@ -630,9 +635,19 @@ var ViewSyncerService = class {
630
635
  }
631
636
  lc.info?.(`hydrateUnchangedQueries: ${gotQueries.length} got queries, ${inactivatedCount} inactivated, ${customErrorCount} custom transform errors, ${customHashMismatchCount} custom hash mismatches, ${otherHashMismatchCount} other hash mismatches, ${transformedQueries.length} hydrated`);
632
637
  const driftedQueryIDs = /* @__PURE__ */ new Set();
638
+ const queryCoveringIndex = this.#config.enableQueryCovering ? new QueryCoveringIndex(this.#pipelines.queries()) : void 0;
639
+ let totalHydratedQueries = 0;
640
+ let coveredHydratedQueries = 0;
641
+ let firstCoveredQuery;
633
642
  for (const { id: queryID, transformationHash, transformedAst } of transformedQueries) {
634
643
  const query = cvr.queries[queryID];
635
644
  const queryName = query.type === "custom" ? query.name : void 0;
645
+ const covered = queryCoveringIndex ? this.#findQueryCoverageShadowHit(queryCoveringIndex, queryID, transformationHash, transformedAst, queryName) : void 0;
646
+ totalHydratedQueries++;
647
+ if (covered) {
648
+ coveredHydratedQueries++;
649
+ firstCoveredQuery ??= covered;
650
+ }
636
651
  const timer = new TimeSliceTimer(lc);
637
652
  let count = 0;
638
653
  await startAsyncSpan(tracer, "vs.#hydrateUnchangedQueries.addQuery", async (span) => {
@@ -649,6 +664,7 @@ var ViewSyncerService = class {
649
664
  this.#addQueryMaterializationServerMetric(transformationHash, elapsed);
650
665
  this.#inspectorDelegate.addQuery(transformationHash, transformedAst);
651
666
  lc.debug?.(`hydrated ${count} rows for ${queryID} (${elapsed} ms)`);
667
+ let drifted = false;
652
668
  const storedSigHex = cvr.queries[queryID]?.rowSetSignature;
653
669
  if (storedSigHex !== void 0 && storedSigHex !== null) {
654
670
  const priorSig = parseSignature(storedSigHex);
@@ -658,9 +674,16 @@ var ViewSyncerService = class {
658
674
  this.#rowSetSignatureDrifts.add(1);
659
675
  this.#pipelines.removeQuery(queryID);
660
676
  driftedQueryIDs.add(queryID);
677
+ drifted = true;
661
678
  }
662
679
  }
680
+ if (!drifted && queryCoveringIndex) queryCoveringIndex.add(queryID, {
681
+ transformedAst,
682
+ transformationHash,
683
+ ...queryName !== void 0 && { queryName }
684
+ });
663
685
  }
686
+ this.#logQueryCoverageShadowSummary(lc, "hydrate-unchanged", totalHydratedQueries, coveredHydratedQueries, firstCoveredQuery);
664
687
  return driftedQueryIDs;
665
688
  }
666
689
  #processTransformedCustomQueries(lc, transformedCustomQueries, cb, customQueryMap) {
@@ -706,6 +729,28 @@ var ViewSyncerService = class {
706
729
  #addQueryMaterializationServerMetric(queryID, elapsed) {
707
730
  this.#inspectorDelegate.addMetric("query-materialization-server", elapsed, queryID);
708
731
  }
732
+ #findQueryCoverageShadowHit(queryCoveringIndex, queryID, transformationHash, ast, queryName) {
733
+ const covering = queryCoveringIndex.findCoveringQuery(queryID, ast);
734
+ if (!covering) return;
735
+ return {
736
+ coveredQueryHash: queryID,
737
+ coveredTransformationHash: transformationHash,
738
+ ...queryName !== void 0 && { coveredQueryName: queryName },
739
+ coveringQueryHash: covering.queryID,
740
+ coveringTransformationHash: covering.transformationHash,
741
+ ...covering.queryName !== void 0 && { coveringQueryName: covering.queryName }
742
+ };
743
+ }
744
+ #logQueryCoverageShadowSummary(lc, hydrationPath, totalHydratedQueries, coveredHydratedQueries, firstCoveredQuery) {
745
+ if (!this.#config.enableQueryCovering || totalHydratedQueries === 0) return;
746
+ let coverageLC = lc.withContext("appID", this.#shard.appID).withContext("shardNum", this.#shard.shardNum).withContext("clientGroupID", this.id).withContext("queryCoverageMode", "shadow").withContext("hydrationPath", hydrationPath).withContext("totalHydratedQueries", totalHydratedQueries).withContext("coveredHydratedQueries", coveredHydratedQueries).withContext("uncoveredHydratedQueries", totalHydratedQueries - coveredHydratedQueries);
747
+ if (firstCoveredQuery) {
748
+ coverageLC = coverageLC.withContext("firstCoveredQueryHash", firstCoveredQuery.coveredQueryHash).withContext("firstCoveredTransformationHash", firstCoveredQuery.coveredTransformationHash).withContext("firstCoveringQueryHash", firstCoveredQuery.coveringQueryHash).withContext("firstCoveringTransformationHash", firstCoveredQuery.coveringTransformationHash);
749
+ if (firstCoveredQuery.coveredQueryName !== void 0) coverageLC = coverageLC.withContext("firstCoveredQueryName", firstCoveredQuery.coveredQueryName);
750
+ if (firstCoveredQuery.coveringQueryName !== void 0) coverageLC = coverageLC.withContext("firstCoveringQueryName", firstCoveredQuery.coveringQueryName);
751
+ }
752
+ coverageLC.info?.("query coverage shadow summary");
753
+ }
709
754
  /**
710
755
  * Adds and/or removes queries to/from the PipelineDriver to bring it
711
756
  * in sync with the set of queries in the CVR (both got and desired).
@@ -843,7 +888,15 @@ var ViewSyncerService = class {
843
888
  lc = lc.withContext("stateVersion", stateVersion);
844
889
  lc.info?.(`hydrating ${addQueries.length} queries`);
845
890
  const updater = new CVRQueryDrivenUpdater(this.#cvrStore, cvr, stateVersion, this.#pipelines.replicaVersion, (queryID) => this.#pipelines.rowSetSignature(queryID));
846
- if (addQueries.some((q) => driftedQueryIDs.has(q.id))) updater.ensureNewVersion();
891
+ const sameHashRehydratedQueryIDs = addQueries.filter((q) => cvr.queries[q.id]?.transformationHash === q.transformationHash).map((q) => q.id);
892
+ const trackQueriesWillBumpVersion = stateVersion > cvr.version.stateVersion || removeQueries.length > 0 || addQueries.some((q) => cvr.queries[q.id]?.transformationHash !== q.transformationHash);
893
+ if (sameHashRehydratedQueryIDs.length > 0 && !trackQueriesWillBumpVersion) {
894
+ const drifted = sameHashRehydratedQueryIDs.filter((id) => driftedQueryIDs.has(id)).length;
895
+ const missing = sameHashRehydratedQueryIDs.length - drifted;
896
+ const reason = drifted && missing ? "mixed" : drifted ? "row-set-signature-drift" : "missing-pipeline";
897
+ this.#sameHashRehydrationVersionBumps.add(1, { reason });
898
+ updater.ensureNewVersion();
899
+ }
847
900
  const { queryPatches, newVersion } = updater.trackQueries(lc, addQueries, removeQueries);
848
901
  const pokers = startPoke(this.#getClients(), newVersion);
849
902
  for (const patch of queryPatches) await pokers.addPatch(patch);
@@ -857,6 +910,10 @@ var ViewSyncerService = class {
857
910
  const pipelines = this.#pipelines;
858
911
  const hydrations = this.#hydrations;
859
912
  const hydrationTime = this.#hydrationTime;
913
+ const queryCoveringIndex = this.#config.enableQueryCovering ? new QueryCoveringIndex(this.#pipelines.queries()) : void 0;
914
+ let totalHydratedQueries = 0;
915
+ let coveredHydratedQueries = 0;
916
+ let firstCoveredQuery;
860
917
  const self = this;
861
918
  await yieldProcess(lc);
862
919
  function* generateRowChanges(slowHydrateThreshold) {
@@ -864,11 +921,22 @@ var ViewSyncerService = class {
864
921
  let queryLC = lc.withContext("hash", q.id).withContext("queryHash", q.id).withContext("transformationHash", q.transformationHash);
865
922
  if (q.name !== void 0) queryLC = queryLC.withContext("queryName", q.name);
866
923
  queryLC.debug?.(`adding pipeline for query`, q.ast);
924
+ const covered = queryCoveringIndex ? self.#findQueryCoverageShadowHit(queryCoveringIndex, q.id, q.transformationHash, q.ast, q.name) : void 0;
925
+ totalHydratedQueries++;
926
+ if (covered) {
927
+ coveredHydratedQueries++;
928
+ firstCoveredQuery ??= covered;
929
+ }
867
930
  yield* pipelines.addQuery(q.transformationHash, q.id, q.ast, timer.startWithoutYielding(), q.name, "query-set-sync");
868
931
  const elapsed = timer.stop();
869
932
  totalProcessTime += elapsed;
870
933
  self.#addQueryMaterializationServerMetric(q.id, elapsed);
871
934
  self.#inspectorDelegate.addQuery(q.id, q.ast);
935
+ queryCoveringIndex?.add(q.id, {
936
+ transformedAst: q.ast,
937
+ transformationHash: q.transformationHash,
938
+ ...q.name !== void 0 && { queryName: q.name }
939
+ });
872
940
  if (elapsed > slowHydrateThreshold) queryLC.warn?.("Slow query materialization", elapsed, q.ast);
873
941
  manualSpan(tracer, "vs.addAndConsumeQuery", elapsed, {
874
942
  hash: q.id,
@@ -880,6 +948,7 @@ var ViewSyncerService = class {
880
948
  hydrationTime.recordMs(totalProcessTime);
881
949
  }
882
950
  await this.#processChanges(lc, timer, generateRowChanges(this.#slowHydrateThreshold), updater, pokers);
951
+ this.#logQueryCoverageShadowSummary(lc, "add", totalHydratedQueries, coveredHydratedQueries, firstCoveredQuery);
883
952
  await startAsyncSpan(tracer, "vs.#syncQueryPipelineSet.deleteUnreferencedRows", async () => {
884
953
  for (const patch of await updater.deleteUnreferencedRows(lc)) await pokers.addPatch(patch);
885
954
  });
@@ -1159,6 +1228,7 @@ var ViewSyncerService = class {
1159
1228
  this.#stopTTLClockInterval();
1160
1229
  this.#stopExpireTimer();
1161
1230
  this.#stopAuthMaintenanceTimer();
1231
+ this.#customQueryTransformer?.destroy();
1162
1232
  for (const client of this.#clients.values()) if (err) client.fail(err);
1163
1233
  else client.close(`closed clientGroupID=${this.id}`);
1164
1234
  await this.#lock.withLock(() => {});