@rocicorp/zero 0.23.2025081200 → 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 (132) hide show
  1. package/out/{chunk-ZJ4VVIKN.js → chunk-JHJ3MBXW.js} +5 -5
  2. package/out/{chunk-6TQKR5IL.js → chunk-O536GEIT.js} +89 -17
  3. package/out/chunk-O536GEIT.js.map +7 -0
  4. package/out/{chunk-YTS56A64.js → chunk-ZKRMVMWK.js} +20 -29
  5. package/out/chunk-ZKRMVMWK.js.map +7 -0
  6. package/out/{inspector-RB55U26N.js → inspector-J5P4DOGH.js} +52 -16
  7. package/out/inspector-J5P4DOGH.js.map +7 -0
  8. package/out/react.js +2 -2
  9. package/out/shared/src/binary-search.js +31 -0
  10. package/out/shared/src/binary-search.js.map +1 -0
  11. package/out/shared/src/centroid.js +28 -0
  12. package/out/shared/src/centroid.js.map +1 -0
  13. package/out/shared/src/dotenv.js +0 -5
  14. package/out/shared/src/dotenv.js.map +1 -1
  15. package/out/shared/src/logging-test-utils.d.ts +12 -0
  16. package/out/shared/src/logging-test-utils.d.ts.map +1 -0
  17. package/out/shared/src/logging-test-utils.js +21 -0
  18. package/out/shared/src/logging-test-utils.js.map +1 -0
  19. package/out/shared/src/objects.d.ts +3 -1
  20. package/out/shared/src/objects.d.ts.map +1 -1
  21. package/out/shared/src/objects.js.map +1 -1
  22. package/out/shared/src/tdigest-schema.d.ts +8 -0
  23. package/out/shared/src/tdigest-schema.d.ts.map +1 -0
  24. package/out/shared/src/tdigest-schema.js +7 -0
  25. package/out/shared/src/tdigest-schema.js.map +1 -0
  26. package/out/shared/src/tdigest.d.ts +11 -0
  27. package/out/shared/src/tdigest.d.ts.map +1 -1
  28. package/out/shared/src/tdigest.js +304 -0
  29. package/out/shared/src/tdigest.js.map +1 -0
  30. package/out/solid.js +3 -3
  31. package/out/zero/package.json +3 -1
  32. package/out/zero-cache/src/config/zero-config.d.ts +18 -287
  33. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  34. package/out/zero-cache/src/config/zero-config.js +43 -0
  35. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  36. package/out/zero-cache/src/observability/events.d.ts +15 -0
  37. package/out/zero-cache/src/observability/events.d.ts.map +1 -0
  38. package/out/zero-cache/src/observability/events.js +93 -0
  39. package/out/zero-cache/src/observability/events.js.map +1 -0
  40. package/out/zero-cache/src/server/anonymous-otel-start.d.ts +1 -1
  41. package/out/zero-cache/src/server/anonymous-otel-start.d.ts.map +1 -1
  42. package/out/zero-cache/src/server/anonymous-otel-start.js +40 -18
  43. package/out/zero-cache/src/server/anonymous-otel-start.js.map +1 -1
  44. package/out/zero-cache/src/server/change-streamer.js +4 -4
  45. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  46. package/out/zero-cache/src/server/main.js +4 -4
  47. package/out/zero-cache/src/server/main.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 +7 -6
  50. package/out/zero-cache/src/server/replicator.js.map +1 -1
  51. package/out/zero-cache/src/server/runner/run-worker.d.ts.map +1 -1
  52. package/out/zero-cache/src/server/runner/run-worker.js +3 -2
  53. package/out/zero-cache/src/server/runner/run-worker.js.map +1 -1
  54. package/out/zero-cache/src/server/syncer.js +5 -5
  55. package/out/zero-cache/src/server/syncer.js.map +1 -1
  56. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  57. package/out/zero-cache/src/services/change-source/custom/change-source.js +46 -35
  58. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  59. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  60. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +7 -2
  61. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  62. package/out/zero-cache/src/services/mutagen/mutagen.js +1 -1
  63. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  64. package/out/zero-cache/src/services/mutagen/pusher.d.ts +28 -2
  65. package/out/zero-cache/src/services/mutagen/pusher.d.ts.map +1 -1
  66. package/out/zero-cache/src/services/mutagen/pusher.js +1 -1
  67. package/out/zero-cache/src/services/mutagen/pusher.js.map +1 -1
  68. package/out/zero-cache/src/services/replicator/change-processor.d.ts +5 -1
  69. package/out/zero-cache/src/services/replicator/change-processor.d.ts.map +1 -1
  70. package/out/zero-cache/src/services/replicator/change-processor.js +10 -8
  71. package/out/zero-cache/src/services/replicator/change-processor.js.map +1 -1
  72. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts +1 -1
  73. package/out/zero-cache/src/services/replicator/incremental-sync.d.ts.map +1 -1
  74. package/out/zero-cache/src/services/replicator/incremental-sync.js +17 -3
  75. package/out/zero-cache/src/services/replicator/incremental-sync.js.map +1 -1
  76. package/out/zero-cache/src/services/replicator/replication-status.d.ts +12 -0
  77. package/out/zero-cache/src/services/replicator/replication-status.d.ts.map +1 -0
  78. package/out/zero-cache/src/services/replicator/replication-status.js +92 -0
  79. package/out/zero-cache/src/services/replicator/replication-status.js.map +1 -0
  80. package/out/zero-cache/src/services/replicator/replicator.d.ts +1 -1
  81. package/out/zero-cache/src/services/replicator/replicator.d.ts.map +1 -1
  82. package/out/zero-cache/src/services/replicator/replicator.js +2 -2
  83. package/out/zero-cache/src/services/replicator/replicator.js.map +1 -1
  84. package/out/zero-cache/src/services/statz.d.ts.map +1 -1
  85. package/out/zero-cache/src/services/statz.js +0 -23
  86. package/out/zero-cache/src/services/statz.js.map +1 -1
  87. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +10 -1
  88. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  89. package/out/zero-cache/src/services/view-syncer/view-syncer.js +77 -8
  90. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  91. package/out/zero-client/src/client/inspector/inspector.d.ts +7 -7
  92. package/out/zero-client/src/client/inspector/inspector.d.ts.map +1 -1
  93. package/out/zero-client/src/client/inspector/types.d.ts +3 -1
  94. package/out/zero-client/src/client/inspector/types.d.ts.map +1 -1
  95. package/out/zero-client/src/client/query-manager.d.ts +8 -8
  96. package/out/zero-client/src/client/query-manager.d.ts.map +1 -1
  97. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  98. package/out/zero-events/src/index.d.ts +29 -0
  99. package/out/zero-events/src/index.d.ts.map +1 -0
  100. package/out/zero-events/src/index.js +28 -0
  101. package/out/zero-events/src/index.js.map +1 -0
  102. package/out/zero-events/src/status.d.ts +113 -0
  103. package/out/zero-events/src/status.d.ts.map +1 -0
  104. package/out/zero-events/src/status.js +72 -0
  105. package/out/zero-events/src/status.js.map +1 -0
  106. package/out/zero-protocol/src/connect.d.ts.map +1 -1
  107. package/out/zero-protocol/src/connect.js +4 -1
  108. package/out/zero-protocol/src/connect.js.map +1 -1
  109. package/out/zero-protocol/src/down.d.ts +18 -2
  110. package/out/zero-protocol/src/down.d.ts.map +1 -1
  111. package/out/zero-protocol/src/inspect-down.d.ts +64 -6
  112. package/out/zero-protocol/src/inspect-down.d.ts.map +1 -1
  113. package/out/zero-protocol/src/inspect-down.js +18 -3
  114. package/out/zero-protocol/src/inspect-down.js.map +1 -1
  115. package/out/zero-protocol/src/inspect-up.d.ts +25 -6
  116. package/out/zero-protocol/src/inspect-up.d.ts.map +1 -1
  117. package/out/zero-protocol/src/inspect-up.js +8 -3
  118. package/out/zero-protocol/src/inspect-up.js.map +1 -1
  119. package/out/zero-protocol/src/protocol-version.d.ts +1 -1
  120. package/out/zero-protocol/src/protocol-version.d.ts.map +1 -1
  121. package/out/zero-protocol/src/protocol-version.js +3 -1
  122. package/out/zero-protocol/src/protocol-version.js.map +1 -1
  123. package/out/zero-protocol/src/up.d.ts +7 -2
  124. package/out/zero-protocol/src/up.d.ts.map +1 -1
  125. package/out/zero.js +3 -3
  126. package/out/zql/src/query/metrics-delegate.d.ts +5 -1
  127. package/out/zql/src/query/metrics-delegate.d.ts.map +1 -1
  128. package/package.json +3 -1
  129. package/out/chunk-6TQKR5IL.js.map +0 -7
  130. package/out/chunk-YTS56A64.js.map +0 -7
  131. package/out/inspector-RB55U26N.js.map +0 -7
  132. /package/out/{chunk-ZJ4VVIKN.js.map → chunk-JHJ3MBXW.js.map} +0 -0
@@ -2,10 +2,14 @@ import {
2
2
  ENTITIES_KEY_PREFIX,
3
3
  Latest,
4
4
  SUBQ_PREFIX,
5
+ TDigest,
5
6
  getClient,
6
7
  getClientGroup,
7
8
  getClients,
9
+ inspectMetricsDownSchema,
8
10
  inspectQueriesDownSchema,
11
+ inspectVersionDownSchema,
12
+ mapValues,
9
13
  must,
10
14
  nanoid,
11
15
  normalizeTTL,
@@ -13,7 +17,7 @@ import {
13
17
  test,
14
18
  valita_exports,
15
19
  withRead
16
- } from "./chunk-6TQKR5IL.js";
20
+ } from "./chunk-O536GEIT.js";
17
21
  import {
18
22
  assert,
19
23
  unreachable
@@ -191,11 +195,11 @@ function transformParameter(param) {
191
195
  }
192
196
 
193
197
  // ../zero-client/src/client/inspector/inspector.ts
194
- async function newInspector(rep, metricsDelegate, schema, socket) {
198
+ async function newInspector(rep, clientMetricsDelegate, schema, socket) {
195
199
  const clientGroupID = await rep.clientGroupID;
196
200
  return new Inspector(
197
201
  rep,
198
- metricsDelegate,
202
+ clientMetricsDelegate,
199
203
  schema,
200
204
  rep.clientID,
201
205
  clientGroupID,
@@ -209,12 +213,12 @@ var Inspector = class {
209
213
  #schema;
210
214
  socket;
211
215
  #metricsDelegate;
212
- constructor(rep, metricsDelegate, schema, clientID, clientGroupID, socket) {
216
+ constructor(rep, clientMetricsDelegate, schema, clientID, clientGroupID, socket) {
213
217
  this.#rep = rep;
214
218
  this.#schema = schema;
215
219
  this.client = new Client(
216
220
  rep,
217
- metricsDelegate,
221
+ clientMetricsDelegate,
218
222
  schema,
219
223
  socket,
220
224
  clientID,
@@ -222,10 +226,16 @@ var Inspector = class {
222
226
  );
223
227
  this.clientGroup = this.client.clientGroup;
224
228
  this.socket = socket;
225
- this.#metricsDelegate = metricsDelegate;
226
- }
227
- get metrics() {
228
- return this.#metricsDelegate.metrics;
229
+ this.#metricsDelegate = clientMetricsDelegate;
230
+ }
231
+ async metrics() {
232
+ const clientMetrics = this.#metricsDelegate.metrics;
233
+ const serverMetricsJSON = await rpc(
234
+ await this.socket(),
235
+ { op: "metrics" },
236
+ inspectMetricsDownSchema
237
+ );
238
+ return mergeMetrics(clientMetrics, serverMetricsJSON);
229
239
  }
230
240
  clients() {
231
241
  return withDagRead(
@@ -251,6 +261,9 @@ var Inspector = class {
251
261
  )
252
262
  );
253
263
  }
264
+ async serverVersion() {
265
+ return rpc(await this.socket(), { op: "version" }, inspectVersionDownSchema);
266
+ }
254
267
  };
255
268
  function rpc(socket, arg, downSchema) {
256
269
  return new Promise((resolve, reject) => {
@@ -282,19 +295,19 @@ var Client = class {
282
295
  id;
283
296
  clientGroup;
284
297
  #socket;
285
- #metricsDelegate;
286
- constructor(rep, metricsDelegate, schema, socket, id, clientGroupID) {
298
+ #clientMetricsDelegate;
299
+ constructor(rep, clientMetricsDelegate, schema, socket, id, clientGroupID) {
287
300
  this.#rep = rep;
288
301
  this.#socket = socket;
289
302
  this.id = id;
290
303
  this.clientGroup = new ClientGroup(
291
304
  rep,
292
- metricsDelegate,
305
+ clientMetricsDelegate,
293
306
  socket,
294
307
  schema,
295
308
  clientGroupID
296
309
  );
297
- this.#metricsDelegate = metricsDelegate;
310
+ this.#clientMetricsDelegate = clientMetricsDelegate;
298
311
  }
299
312
  async queries() {
300
313
  const rows = await rpc(
@@ -302,7 +315,7 @@ var Client = class {
302
315
  { op: "queries", clientID: this.id },
303
316
  inspectQueriesDownSchema
304
317
  );
305
- return rows.map((row) => new Query(row, this.#metricsDelegate));
318
+ return rows.map((row) => new Query(row, this.#clientMetricsDelegate));
306
319
  }
307
320
  map() {
308
321
  return withDagRead(this.#rep, async (dagRead) => {
@@ -454,10 +467,33 @@ var Query = class {
454
467
  this.rowCount = row.rowCount;
455
468
  this.deleted = row.deleted;
456
469
  this.zql = ast ? ast.table + astToZQL(ast) : null;
457
- this.metrics = metricsDelegate.getQueryMetrics(queryID) ?? null;
470
+ const clientMetrics = metricsDelegate.getQueryMetrics(queryID);
471
+ const serverMetrics = row.metrics;
472
+ this.metrics = mergeMetrics(clientMetrics, serverMetrics);
458
473
  }
459
474
  };
475
+ function mergeMetrics(clientMetrics, serverMetrics) {
476
+ return {
477
+ ...clientMetrics ?? newClientMetrics(),
478
+ ...serverMetrics ? convertServerMetrics(serverMetrics) : newServerMetrics()
479
+ };
480
+ }
481
+ function newClientMetrics() {
482
+ return {
483
+ "query-materialization-client": new TDigest(),
484
+ "query-materialization-end-to-end": new TDigest(),
485
+ "query-update-client": new TDigest()
486
+ };
487
+ }
488
+ function newServerMetrics() {
489
+ return {
490
+ "query-materialization-server": new TDigest()
491
+ };
492
+ }
493
+ function convertServerMetrics(metrics) {
494
+ return mapValues(metrics, (v) => TDigest.fromJSON(v));
495
+ }
460
496
  export {
461
497
  newInspector
462
498
  };
463
- //# sourceMappingURL=inspector-RB55U26N.js.map
499
+ //# sourceMappingURL=inspector-J5P4DOGH.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../ast-to-zql/src/ast-to-zql.ts", "../../zero-client/src/client/inspector/inspector.ts"],
4
+ "sourcesContent": ["import {unreachable} from '../../shared/src/asserts.ts';\nimport {must} from '../../shared/src/must.ts';\nimport type {\n AST,\n Condition,\n Conjunction,\n CorrelatedSubquery,\n CorrelatedSubqueryCondition,\n Disjunction,\n LiteralReference,\n Ordering,\n Parameter,\n SimpleCondition,\n ValuePosition,\n} from '../../zero-protocol/src/ast.ts';\nimport {SUBQ_PREFIX} from '../../zql/src/query/query-impl.ts';\n\n/**\n * Converts an AST to the equivalent query builder code.\n * This is useful for debugging and understanding queries.\n *\n * @example\n * ```\n * const ast = query.issue.where('id', '=', 123)[astSymbol];\n * console.log(astToZQL(ast)); // outputs: .where('id', '=', 123)\n * ```\n */\nexport function astToZQL(ast: AST): string {\n let code = '';\n\n // Handle where conditions\n if (ast.where) {\n code += transformCondition(ast.where, '.where', new Set());\n }\n\n // Handle related subqueries\n if (ast.related && ast.related.length > 0) {\n for (const related of ast.related) {\n if (related.hidden) {\n const nestedRelated = related.subquery.related?.[0];\n if (nestedRelated) {\n code += transformRelated(nestedRelated);\n }\n } else {\n code += transformRelated(related);\n }\n }\n }\n\n // Handle orderBy\n if (ast.orderBy && ast.orderBy.length > 0) {\n code += transformOrder(ast.orderBy);\n }\n\n // Handle limit\n if (ast.limit !== undefined) {\n code += `.limit(${ast.limit})`;\n }\n\n // Handle start\n if (ast.start) {\n const {row, exclusive} = ast.start;\n code += `.start(${JSON.stringify(row)}${\n exclusive ? '' : ', { inclusive: true }'\n })`;\n }\n\n return code;\n}\n\ntype Args = Set<string>;\n\ntype Prefix = '.where' | 'cmp';\n\nfunction transformCondition(\n condition: Condition,\n prefix: Prefix,\n args: Args,\n): string {\n switch (condition.type) {\n case 'simple':\n return transformSimpleCondition(condition, prefix);\n case 'and':\n case 'or':\n return transformLogicalCondition(condition, prefix, args);\n case 'correlatedSubquery':\n return transformExistsCondition(condition, prefix, args);\n default:\n unreachable(condition);\n }\n}\n\nfunction transformSimpleCondition(\n condition: SimpleCondition,\n prefix: Prefix,\n): string {\n const {left, op, right} = condition;\n\n const leftCode = transformValuePosition(left);\n const rightCode = transformValuePosition(right);\n\n // Handle the shorthand form for equals\n if (op === '=') {\n return `${prefix}(${leftCode}, ${rightCode})`;\n }\n\n return `${prefix}(${leftCode}, '${op}', ${rightCode})`;\n}\n\nfunction transformLogicalCondition(\n condition: Conjunction | Disjunction,\n prefix: Prefix,\n args: Args,\n): string {\n const {type, conditions} = condition;\n\n // For single condition, no need for logical operator\n if (conditions.length === 1) {\n return transformCondition(conditions[0], prefix, args);\n }\n\n // Generate multiple where calls for top-level AND conditions\n if (type === 'and') {\n const parts = conditions.map(c => transformCondition(c, prefix, args));\n // Simply concatenate the where conditions\n if (prefix === '.where') {\n return parts.join('');\n }\n args.add('and');\n return 'and(' + parts.join(', ') + ')';\n }\n\n args = new Set<string>();\n\n // Handle nested conditions with a callback for OR conditions and nested ANDs/ORs\n const conditionsCode = conditions\n .map(c => transformCondition(c, 'cmp', args))\n .join(', ');\n\n args.add('cmp');\n args.add(type);\n const argsCode = [...args].sort().join(', ');\n\n return `.where(({${argsCode}}) => ${type}(${conditionsCode}))`;\n}\n\nfunction transformExistsCondition(\n condition: CorrelatedSubqueryCondition,\n prefix: '.where' | 'cmp',\n args: Set<string>,\n): string {\n const {related, op} = condition;\n const relationship = extractRelationshipName(related);\n\n const nextSubquery = getNextExistsSubquery(related);\n\n // Check if subquery has additional properties\n const hasSubQueryProps =\n nextSubquery.where ||\n (nextSubquery.related && nextSubquery.related.length > 0) ||\n nextSubquery.orderBy ||\n nextSubquery.limit;\n\n if (op === 'EXISTS') {\n if (!hasSubQueryProps) {\n if (prefix === '.where') {\n return `.whereExists('${relationship}')`;\n }\n args.add('exists');\n return `exists('${relationship}')`;\n }\n\n if (prefix === '.where') {\n return `.whereExists('${relationship}', q => q${astToZQL(nextSubquery)})`;\n }\n prefix satisfies 'cmp';\n args.add('exists');\n return `exists('${relationship}', q => q${astToZQL(nextSubquery)})`;\n }\n\n op satisfies 'NOT EXISTS';\n\n if (hasSubQueryProps) {\n if (prefix === '.where') {\n return `.where(({exists, not}) => not(exists('${relationship}', q => q${astToZQL(\n nextSubquery,\n )})))`;\n }\n prefix satisfies 'cmp';\n args.add('not');\n args.add('exists');\n return `not(exists('${relationship}', q => q${astToZQL(nextSubquery)}))`;\n }\n\n if (prefix === '.where') {\n return `.where(({exists, not}) => not(exists('${relationship}')))`;\n }\n args.add('not');\n args.add('exists');\n\n return `not(exists('${relationship}')))`;\n}\n\n// If the `exists` is applied against a junction edge, both hops will have the same alias and both hops will be exists conditions.\nfunction getNextExistsSubquery(related: CorrelatedSubquery): AST {\n if (\n related.subquery.where?.type === 'correlatedSubquery' &&\n related.subquery.where.related.subquery.alias?.includes(\n SUBQ_PREFIX + 'zhidden_',\n )\n ) {\n return getNextExistsSubquery(related.subquery.where.related);\n }\n\n return related.subquery;\n}\n\nfunction extractRelationshipName(related: CorrelatedSubquery): string {\n const alias = must(related.subquery.alias);\n return alias.startsWith(SUBQ_PREFIX)\n ? alias.substring(SUBQ_PREFIX.length)\n : alias;\n}\n\nfunction transformRelated(related: CorrelatedSubquery): string {\n const {alias} = related.subquery;\n if (!alias) return '';\n\n const relationship = alias;\n let code = `.related('${relationship}'`;\n\n // If the subquery has additional filters or configurations\n if (\n related.subquery.where ||\n (related.subquery.related && related.subquery.related.length > 0) ||\n related.subquery.orderBy ||\n related.subquery.limit\n ) {\n code += ', q => q' + astToZQL(related.subquery);\n }\n\n code += ')';\n return code;\n}\n\nfunction transformOrder(orderBy: Ordering): string {\n let code = '';\n for (const [field, direction] of orderBy) {\n code += `.orderBy('${field}', '${direction}')`;\n }\n return code;\n}\n\nfunction transformValuePosition(value: ValuePosition): string {\n switch (value.type) {\n case 'literal':\n return transformLiteral(value);\n case 'column':\n return `'${value.name}'`;\n case 'static':\n return transformParameter(value);\n default:\n unreachable(value);\n }\n}\n\nfunction transformLiteral(literal: LiteralReference): string {\n if (literal.value === null) {\n return 'null';\n }\n if (Array.isArray(literal.value)) {\n return JSON.stringify(literal.value);\n }\n if (typeof literal.value === 'string') {\n return `'${literal.value.replace(/'/g, \"\\\\'\")}'`;\n }\n return String(literal.value);\n}\n\nfunction transformParameter(param: Parameter): string {\n const fieldStr = Array.isArray(param.field)\n ? `[${param.field.map(f => `'${f}'`).join(', ')}]`\n : `'${param.field}'`;\n\n return `authParam(${fieldStr})`;\n}\n", "import {astToZQL} from '../../../../ast-to-zql/src/ast-to-zql.ts';\nimport type {BTreeRead} from '../../../../replicache/src/btree/read.ts';\nimport {type Read} from '../../../../replicache/src/dag/store.ts';\nimport {readFromHash} from '../../../../replicache/src/db/read.ts';\nimport * as FormatVersion from '../../../../replicache/src/format-version-enum.ts';\nimport {getClientGroup} from '../../../../replicache/src/persist/client-groups.ts';\nimport {\n getClient,\n getClients,\n type ClientMap,\n} from '../../../../replicache/src/persist/clients.ts';\nimport type {ReplicacheImpl} from '../../../../replicache/src/replicache-impl.ts';\nimport {withRead} from '../../../../replicache/src/with-transactions.ts';\nimport {assert} from '../../../../shared/src/asserts.ts';\nimport type {ReadonlyJSONValue} from '../../../../shared/src/json.ts';\nimport {mapValues} from '../../../../shared/src/objects.ts';\nimport {TDigest, type ReadonlyTDigest} from '../../../../shared/src/tdigest.ts';\nimport * as valita from '../../../../shared/src/valita.ts';\nimport type {AST} from '../../../../zero-protocol/src/ast.ts';\nimport type {Row} from '../../../../zero-protocol/src/data.ts';\nimport {\n inspectMetricsDownSchema,\n inspectQueriesDownSchema,\n inspectVersionDownSchema,\n type InspectDownBody,\n type InspectQueryRow,\n type ServerMetrics as ServerMetricsJSON,\n} from '../../../../zero-protocol/src/inspect-down.ts';\nimport type {\n InspectQueriesUpBody,\n InspectUpBody,\n InspectUpMessage,\n} from '../../../../zero-protocol/src/inspect-up.ts';\nimport type {Schema} from '../../../../zero-schema/src/builder/schema-builder.ts';\nimport type {\n ClientMetricMap,\n MetricMap,\n ServerMetricMap,\n} from '../../../../zql/src/query/metrics-delegate.ts';\nimport {normalizeTTL, type TTL} from '../../../../zql/src/query/ttl.ts';\nimport {nanoid} from '../../util/nanoid.ts';\nimport {ENTITIES_KEY_PREFIX} from '../keys.ts';\nimport type {MutatorDefs} from '../replicache-types.ts';\nimport type {\n ClientGroup as ClientGroupInterface,\n Client as ClientInterface,\n Inspector as InspectorInterface,\n Query as QueryInterface,\n} from './types.ts';\n\ntype Rep = ReplicacheImpl<MutatorDefs>;\n\ntype GetWebSocket = () => Promise<WebSocket>;\n\ntype Metrics = {\n readonly [K in keyof MetricMap]: ReadonlyTDigest;\n};\n\ntype ClientMetrics = {\n readonly [K in keyof ClientMetricMap]: ReadonlyTDigest;\n};\n\ntype ServerMetrics = {\n readonly [K in keyof ServerMetricMap]: ReadonlyTDigest;\n};\n\nexport interface InspectorClientMetricsDelegate {\n getQueryMetrics(hash: string): ClientMetrics | undefined;\n readonly metrics: ClientMetrics;\n}\n\nexport async function newInspector(\n rep: Rep,\n clientMetricsDelegate: InspectorClientMetricsDelegate,\n schema: Schema,\n socket: GetWebSocket,\n): Promise<InspectorInterface> {\n const clientGroupID = await rep.clientGroupID;\n return new Inspector(\n rep,\n clientMetricsDelegate,\n schema,\n rep.clientID,\n clientGroupID,\n socket,\n );\n}\n\nclass Inspector implements InspectorInterface {\n readonly #rep: Rep;\n readonly client: Client;\n readonly clientGroup: ClientGroup;\n readonly #schema: Schema;\n readonly socket: GetWebSocket;\n readonly #metricsDelegate: InspectorClientMetricsDelegate;\n\n constructor(\n rep: ReplicacheImpl,\n clientMetricsDelegate: InspectorClientMetricsDelegate,\n schema: Schema,\n clientID: string,\n clientGroupID: string,\n socket: GetWebSocket,\n ) {\n this.#rep = rep;\n this.#schema = schema;\n this.client = new Client(\n rep,\n clientMetricsDelegate,\n schema,\n socket,\n clientID,\n clientGroupID,\n );\n this.clientGroup = this.client.clientGroup;\n this.socket = socket;\n this.#metricsDelegate = clientMetricsDelegate;\n }\n\n async metrics(): Promise<Metrics> {\n const clientMetrics = this.#metricsDelegate.metrics;\n const serverMetricsJSON = await rpc(\n await this.socket(),\n {op: 'metrics'},\n inspectMetricsDownSchema,\n );\n return mergeMetrics(clientMetrics, serverMetricsJSON);\n }\n\n clients(): Promise<ClientInterface[]> {\n return withDagRead(this.#rep, dagRead =>\n clients(\n this.#rep,\n this.#metricsDelegate,\n this.socket,\n this.#schema,\n dagRead,\n ),\n );\n }\n\n clientsWithQueries(): Promise<ClientInterface[]> {\n return withDagRead(this.#rep, dagRead =>\n clientsWithQueries(\n this.#rep,\n this.#metricsDelegate,\n this.socket,\n this.#schema,\n dagRead,\n ),\n );\n }\n\n async serverVersion(): Promise<string> {\n return rpc(await this.socket(), {op: 'version'}, inspectVersionDownSchema);\n }\n}\n\nfunction rpc<T extends InspectDownBody>(\n socket: WebSocket,\n arg: Omit<InspectUpBody, 'id'>,\n downSchema: valita.Type<T>,\n): Promise<T['value']> {\n return new Promise((resolve, reject) => {\n const id = nanoid();\n const f = (ev: MessageEvent) => {\n const msg = JSON.parse(ev.data);\n if (msg[0] === 'inspect') {\n const body = msg[1];\n if (body.id !== id) {\n return;\n }\n const res = valita.test(body, downSchema);\n if (res.ok) {\n resolve(res.value.value);\n } else {\n reject(res.error);\n }\n socket.removeEventListener('message', f);\n }\n };\n socket.addEventListener('message', f);\n socket.send(\n JSON.stringify(['inspect', {...arg, id}] satisfies InspectUpMessage),\n );\n });\n}\n\nclass Client implements ClientInterface {\n readonly #rep: Rep;\n readonly id: string;\n readonly clientGroup: ClientGroup;\n readonly #socket: GetWebSocket;\n readonly #clientMetricsDelegate: InspectorClientMetricsDelegate;\n\n constructor(\n rep: Rep,\n clientMetricsDelegate: InspectorClientMetricsDelegate,\n schema: Schema,\n socket: GetWebSocket,\n id: string,\n clientGroupID: string,\n ) {\n this.#rep = rep;\n this.#socket = socket;\n this.id = id;\n this.clientGroup = new ClientGroup(\n rep,\n clientMetricsDelegate,\n socket,\n schema,\n clientGroupID,\n );\n this.#clientMetricsDelegate = clientMetricsDelegate;\n }\n\n async queries(): Promise<QueryInterface[]> {\n const rows: InspectQueryRow[] = await rpc(\n await this.#socket(),\n {op: 'queries', clientID: this.id} as InspectQueriesUpBody,\n inspectQueriesDownSchema,\n );\n return rows.map(row => new Query(row, this.#clientMetricsDelegate));\n }\n\n map(): Promise<Map<string, ReadonlyJSONValue>> {\n return withDagRead(this.#rep, async dagRead => {\n const tree = await getBTree(dagRead, this.id);\n const map = new Map<string, ReadonlyJSONValue>();\n for await (const [key, value] of tree.scan('')) {\n map.set(key, value);\n }\n return map;\n });\n }\n\n rows(tableName: string): Promise<Row[]> {\n return withDagRead(this.#rep, async dagRead => {\n const prefix = ENTITIES_KEY_PREFIX + tableName;\n const tree = await getBTree(dagRead, this.id);\n const rows: Row[] = [];\n for await (const [key, value] of tree.scan(prefix)) {\n if (!key.startsWith(prefix)) {\n break;\n }\n rows.push(value as Row);\n }\n return rows;\n });\n }\n}\n\nclass ClientGroup implements ClientGroupInterface {\n readonly #rep: Rep;\n readonly id: string;\n readonly #schema: Schema;\n readonly #socket: GetWebSocket;\n readonly #metricsDelegate: InspectorClientMetricsDelegate;\n\n constructor(\n rep: Rep,\n metricsDelegate: InspectorClientMetricsDelegate,\n socket: GetWebSocket,\n schema: Schema,\n id: string,\n ) {\n this.#rep = rep;\n this.#metricsDelegate = metricsDelegate;\n this.#socket = socket;\n this.#schema = schema;\n this.id = id;\n }\n\n clients(): Promise<ClientInterface[]> {\n return withDagRead(this.#rep, dagRead =>\n clients(\n this.#rep,\n this.#metricsDelegate,\n this.#socket,\n this.#schema,\n dagRead,\n ([_, v]) => v.clientGroupID === this.id,\n ),\n );\n }\n\n clientsWithQueries(): Promise<ClientInterface[]> {\n return withDagRead(this.#rep, dagRead =>\n clientsWithQueries(\n this.#rep,\n this.#metricsDelegate,\n this.#socket,\n this.#schema,\n dagRead,\n ([_, v]) => v.clientGroupID === this.id,\n ),\n );\n }\n\n async queries(): Promise<QueryInterface[]> {\n const rows: InspectQueryRow[] = await rpc(\n await this.#socket(),\n {op: 'queries'},\n inspectQueriesDownSchema,\n );\n return rows.map(row => new Query(row, this.#metricsDelegate));\n }\n}\n\nasync function withDagRead<T>(\n rep: Rep,\n f: (dagRead: Read) => Promise<T>,\n): Promise<T> {\n await rep.refresh();\n await rep.persist();\n return withRead(rep.perdag, f);\n}\n\nasync function getBTree(dagRead: Read, clientID: string): Promise<BTreeRead> {\n const client = await getClient(clientID, dagRead);\n assert(client, `Client not found: ${clientID}`);\n const {clientGroupID} = client;\n const clientGroup = await getClientGroup(clientGroupID, dagRead);\n assert(clientGroup, `Client group not found: ${clientGroupID}`);\n const dbRead = await readFromHash(\n clientGroup.headHash,\n dagRead,\n FormatVersion.Latest,\n );\n return dbRead.map;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype MapEntry<T extends ReadonlyMap<any, any>> =\n T extends ReadonlyMap<infer K, infer V> ? readonly [K, V] : never;\n\nasync function clients(\n rep: Rep,\n metricsDelegate: InspectorClientMetricsDelegate,\n socket: GetWebSocket,\n schema: Schema,\n dagRead: Read,\n predicate: (entry: MapEntry<ClientMap>) => boolean = () => true,\n): Promise<ClientInterface[]> {\n const clients = await getClients(dagRead);\n return [...clients.entries()]\n .filter(predicate)\n .map(\n ([clientID, {clientGroupID}]) =>\n new Client(\n rep,\n metricsDelegate,\n schema,\n socket,\n clientID,\n clientGroupID,\n ),\n );\n}\n\nasync function clientsWithQueries(\n rep: Rep,\n metricsDelegate: InspectorClientMetricsDelegate,\n socket: GetWebSocket,\n schema: Schema,\n dagRead: Read,\n predicate: (entry: MapEntry<ClientMap>) => boolean = () => true,\n): Promise<ClientInterface[]> {\n const allClients = await clients(\n rep,\n metricsDelegate,\n socket,\n schema,\n dagRead,\n predicate,\n );\n const clientsWithQueries: ClientInterface[] = [];\n await Promise.all(\n allClients.map(async client => {\n const queries = await client.queries();\n if (queries.length > 0) {\n clientsWithQueries.push(client);\n }\n }),\n );\n return clientsWithQueries;\n}\n\nclass Query implements QueryInterface {\n readonly ast: AST | null;\n readonly name: string | null;\n readonly args: ReadonlyArray<ReadonlyJSONValue> | null;\n readonly got: boolean;\n readonly ttl: TTL;\n readonly inactivatedAt: Date | null;\n readonly rowCount: number;\n readonly deleted: boolean;\n readonly id: string;\n readonly zql: string | null;\n readonly clientID: string;\n readonly metrics: Metrics | null;\n\n constructor(\n row: InspectQueryRow,\n metricsDelegate: InspectorClientMetricsDelegate,\n ) {\n const {ast, queryID, inactivatedAt} = row;\n // Use own properties to make this more useful in dev tools. For example, in\n // Chrome dev tools, if you do console.table(queries) you'll see the\n // properties in the table, if these were getters you would not see them in the table.\n this.clientID = row.clientID;\n this.id = queryID;\n this.inactivatedAt =\n inactivatedAt === null ? null : new Date(inactivatedAt);\n this.ttl = normalizeTTL(row.ttl);\n this.ast = ast;\n this.name = row.name;\n this.args = row.args;\n this.got = row.got;\n this.rowCount = row.rowCount;\n this.deleted = row.deleted;\n this.zql = ast ? ast.table + astToZQL(ast) : null;\n\n // Merge client and server metrics\n const clientMetrics = metricsDelegate.getQueryMetrics(queryID);\n const serverMetrics = row.metrics;\n\n this.metrics = mergeMetrics(clientMetrics, serverMetrics);\n }\n}\n\nfunction mergeMetrics(\n clientMetrics: ClientMetrics | undefined,\n serverMetrics: ServerMetricsJSON | null | undefined,\n): Metrics {\n return {\n ...(clientMetrics ?? newClientMetrics()),\n ...(serverMetrics\n ? convertServerMetrics(serverMetrics)\n : newServerMetrics()),\n };\n}\n\nfunction newClientMetrics(): ClientMetrics {\n return {\n 'query-materialization-client': new TDigest(),\n 'query-materialization-end-to-end': new TDigest(),\n 'query-update-client': new TDigest(),\n };\n}\n\nfunction newServerMetrics(): ServerMetrics {\n return {\n 'query-materialization-server': new TDigest(),\n };\n}\n\nfunction convertServerMetrics(metrics: ServerMetricsJSON): ServerMetrics {\n return mapValues(metrics, v => TDigest.fromJSON(v));\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["clients", "clientsWithQueries"]
7
+ }
package/out/react.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Zero
3
- } from "./chunk-YTS56A64.js";
3
+ } from "./chunk-ZKRMVMWK.js";
4
4
  import "./chunk-MKB4RXL3.js";
5
5
  import {
6
6
  DEFAULT_TTL_MS
7
- } from "./chunk-6TQKR5IL.js";
7
+ } from "./chunk-O536GEIT.js";
8
8
  import {
9
9
  hasOwn
10
10
  } from "./chunk-SGW2EIVJ.js";
@@ -0,0 +1,31 @@
1
+ /**
2
+ * This is a binary search that returns the index of the first element in the
3
+ * array that is greater than or equal to the given value.
4
+ *
5
+ * Typical usage:
6
+ *
7
+ * ```
8
+ * const haystack = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
9
+ * const needle = 3;
10
+ * const index = binarySearch(haystack.length, i => needle - haystack[i]);
11
+ * const found = index < haystack.length && haystack[index] === needle;
12
+ * ```
13
+ */
14
+ export function binarySearch(high, compare) {
15
+ let low = 0;
16
+ while (low < high) {
17
+ const mid = low + ((high - low) >> 1);
18
+ const i = compare(mid);
19
+ if (i === 0) {
20
+ return mid;
21
+ }
22
+ if (i > 0) {
23
+ low = mid + 1;
24
+ }
25
+ else {
26
+ high = mid;
27
+ }
28
+ }
29
+ return low;
30
+ }
31
+ //# sourceMappingURL=binary-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-search.js","sourceRoot":"","sources":["../../../../shared/src/binary-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAA8B;IACvE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,28 @@
1
+ // Apache License 2.0
2
+ // https://github.com/influxdata/tdigest
3
+ // Centroid average position of all points in a shape
4
+ export class Centroid {
5
+ mean;
6
+ weight;
7
+ constructor(mean, weight) {
8
+ this.mean = mean;
9
+ this.weight = weight;
10
+ }
11
+ add(r) {
12
+ if (r.weight < 0) {
13
+ throw new Error('centroid weight cannot be less than zero');
14
+ }
15
+ if (this.weight !== 0) {
16
+ this.weight += r.weight;
17
+ this.mean += (r.weight * (r.mean - this.mean)) / this.weight;
18
+ }
19
+ else {
20
+ this.weight = r.weight;
21
+ this.mean = r.mean;
22
+ }
23
+ }
24
+ }
25
+ export function sortCentroidList(centroids) {
26
+ centroids.sort((a, b) => a.mean - b.mean);
27
+ }
28
+ //# sourceMappingURL=centroid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"centroid.js","sourceRoot":"","sources":["../../../../shared/src/centroid.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,wCAAwC;AAExC,qDAAqD;AACrD,MAAM,OAAO,QAAQ;IACnB,IAAI,CAAS;IACb,MAAM,CAAS;IAEf,YAAY,IAAY,EAAE,MAAc;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,GAAG,CAAC,CAAW;QACb,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC;YACxB,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;YACvB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;CACF;AAKD,MAAM,UAAU,gBAAgB,CAAC,SAAuB;IACtD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,12 +1,7 @@
1
1
  import { config as dotenvxConfig } from '@dotenvx/dotenvx';
2
- import path from 'path';
3
- import { fileURLToPath } from 'url';
4
- const filename = fileURLToPath(import.meta.url);
5
- const dirname = path.dirname(filename);
6
2
  // Import env vars from .env file if present but don't whine if not present.
7
3
  // Also no free marketing for dotenvx.
8
4
  dotenvxConfig({
9
- path: path.resolve(dirname, '../../../apps/zbugs/.env'),
10
5
  ignore: ['MISSING_ENV_FILE'],
11
6
  quiet: true,
12
7
  });
@@ -1 +1 @@
1
- {"version":3,"file":"dotenv.js","sourceRoot":"","sources":["../../../../shared/src/dotenv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,IAAI,aAAa,EAAC,MAAM,kBAAkB,CAAC;AACzD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAC,aAAa,EAAC,MAAM,KAAK,CAAC;AAElC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvC,4EAA4E;AAC5E,sCAAsC;AACtC,aAAa,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,0BAA0B,CAAC;IACvD,MAAM,EAAE,CAAC,kBAAkB,CAAC;IAC5B,KAAK,EAAE,IAAI;CACZ,CAAC,CAAC"}
1
+ {"version":3,"file":"dotenv.js","sourceRoot":"","sources":["../../../../shared/src/dotenv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,IAAI,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAEzD,4EAA4E;AAC5E,sCAAsC;AACtC,aAAa,CAAC;IACZ,MAAM,EAAE,CAAC,kBAAkB,CAAC;IAC5B,KAAK,EAAE,IAAI;CACZ,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type Context, LogContext, type LogLevel, type LogSink } from '@rocicorp/logger';
2
+ export declare class TestLogSink implements LogSink {
3
+ messages: [LogLevel, Context | undefined, unknown[]][];
4
+ flushCallCount: number;
5
+ log(level: LogLevel, context: Context | undefined, ...args: unknown[]): void;
6
+ flush(): Promise<void>;
7
+ }
8
+ export declare class SilentLogSink implements LogSink {
9
+ log(_l: LogLevel, _c: Context | undefined, ..._args: unknown[]): void;
10
+ }
11
+ export declare function createSilentLogContext(): LogContext<unknown[], unknown[], unknown[], unknown[]>;
12
+ //# sourceMappingURL=logging-test-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-test-utils.d.ts","sourceRoot":"","sources":["../../../../shared/src/logging-test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,OAAO,EACb,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,WAAY,YAAW,OAAO;IACzC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,CAAM;IAC5D,cAAc,SAAK;IAEnB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI5E,KAAK;CAIN;AAED,qBAAa,aAAc,YAAW,OAAO;IAC3C,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,GAAG,SAAS,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;CAGtE;AAED,wBAAgB,sBAAsB,2DAErC"}
@@ -0,0 +1,21 @@
1
+ import { LogContext, } from '@rocicorp/logger';
2
+ export class TestLogSink {
3
+ messages = [];
4
+ flushCallCount = 0;
5
+ log(level, context, ...args) {
6
+ this.messages.push([level, context, args]);
7
+ }
8
+ flush() {
9
+ this.flushCallCount++;
10
+ return Promise.resolve();
11
+ }
12
+ }
13
+ export class SilentLogSink {
14
+ log(_l, _c, ..._args) {
15
+ return;
16
+ }
17
+ }
18
+ export function createSilentLogContext() {
19
+ return new LogContext('error', undefined, new SilentLogSink());
20
+ }
21
+ //# sourceMappingURL=logging-test-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-test-utils.js","sourceRoot":"","sources":["../../../../shared/src/logging-test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,GAGX,MAAM,kBAAkB,CAAC;AAE1B,MAAM,OAAO,WAAW;IACtB,QAAQ,GAAiD,EAAE,CAAC;IAC5D,cAAc,GAAG,CAAC,CAAC;IAEnB,GAAG,CAAC,KAAe,EAAE,OAA4B,EAAE,GAAG,IAAe;QACnE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK;QACH,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,aAAa;IACxB,GAAG,CAAC,EAAY,EAAE,EAAuB,EAAE,GAAG,KAAgB;QAC5D,OAAO;IACT,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;AACjE,CAAC"}
@@ -1,4 +1,6 @@
1
- export declare function mapValues<T, U>(input: Record<string, T>, mapper: (value: T) => U): Record<string, U>;
1
+ export declare function mapValues<T extends Record<string, unknown>, U>(input: T, mapper: (value: T[keyof T]) => U): {
2
+ [K in keyof T]: U;
3
+ };
2
4
  export declare function mapEntries<T, U>(input: Record<string, T>, mapper: (key: string, val: T) => [key: string, val: U]): Record<string, U>;
3
5
  export declare function mapAllEntries<T, U>(input: Record<string, T>, mapper: (entries: [key: string, val: T][]) => [key: string, val: U][]): Record<string, U>;
4
6
  //# sourceMappingURL=objects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"objects.d.ts","sourceRoot":"","sources":["../../../../shared/src/objects.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GACtB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAEnB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GACrD,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAYnB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GACpE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAQnB"}
1
+ {"version":3,"file":"objects.d.ts","sourceRoot":"","sources":["../../../../shared/src/objects.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAC5D,KAAK,EAAE,CAAC,EACR,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAC/B;KAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC;CAAC,CAIrB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GACrD,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAYnB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EACxB,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GACpE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAQnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"objects.js","sourceRoot":"","sources":["../../../../shared/src/objects.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CACvB,KAAwB,EACxB,MAAuB;IAEvB,OAAO,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAAwB,EACxB,MAAsD;IAEtD,wDAAwD;IACxD,qEAAqE;IACrE,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,4EAA4E;IAC5E,+DAA+D;IAC/D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAwB,EACxB,MAAqE;IAErE,wDAAwD;IACxD,qEAAqE;IACrE,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"objects.js","sourceRoot":"","sources":["../../../../shared/src/objects.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CACvB,KAAQ,EACR,MAAgC;IAEhC,OAAO,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAe,CAAC,CAAC,CAE9D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,KAAwB,EACxB,MAAsD;IAEtD,wDAAwD;IACxD,qEAAqE;IACrE,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,4EAA4E;IAC5E,+DAA+D;IAC/D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAwB,EACxB,MAAqE;IAErE,wDAAwD;IACxD,qEAAqE;IACrE,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import * as v from './valita.ts';
2
+ /**
3
+ * Valita schema for TDigest JSON representation.
4
+ * Matches the structure returned by TDigest.toJSON().
5
+ */
6
+ export declare const tdigestSchema: v.VariadicTupleType<[v.Type<number>], v.Type<number>, []>;
7
+ export type TDigestJSON = v.Infer<typeof tdigestSchema>;
8
+ //# sourceMappingURL=tdigest-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tdigest-schema.d.ts","sourceRoot":"","sources":["../../../../shared/src/tdigest-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC;;;GAGG;AACH,eAAO,MAAM,aAAa,2DAAoD,CAAC;AAE/E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import * as v from "./valita.js";
2
+ /**
3
+ * Valita schema for TDigest JSON representation.
4
+ * Matches the structure returned by TDigest.toJSON().
5
+ */
6
+ export const tdigestSchema = v.tuple([v.number()]).concat(v.array(v.number()));
7
+ //# sourceMappingURL=tdigest-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tdigest-schema.js","sourceRoot":"","sources":["../../../../shared/src/tdigest-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,aAAa,CAAC;AAEjC;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { Centroid, type CentroidList } from './centroid.ts';
2
+ import type { TDigestJSON } from './tdigest-schema.ts';
2
3
  export interface ReadonlyTDigest {
3
4
  readonly count: () => number;
4
5
  readonly quantile: (q: number) => number;
@@ -8,6 +9,11 @@ export declare class TDigest {
8
9
  #private;
9
10
  readonly compression: number;
10
11
  constructor(compression?: number);
12
+ /**
13
+ * fromJSON creates a TDigest from a JSON-serializable representation.
14
+ * The data should be an object with compression and centroids array.
15
+ */
16
+ static fromJSON(data: Readonly<TDigestJSON>): TDigest;
11
17
  reset(): void;
12
18
  add(mean: number, weight?: number): void;
13
19
  /** AddCentroidList can quickly add multiple centroids. */
@@ -32,6 +38,11 @@ export declare class TDigest {
32
38
  */
33
39
  centroids(cl?: CentroidList): CentroidList;
34
40
  count(): number;
41
+ /**
42
+ * toJSON returns a JSON-serializable representation of the digest.
43
+ * This processes the digest and returns an object with compression and centroid data.
44
+ */
45
+ toJSON(): TDigestJSON;
35
46
  quantile(q: number): number;
36
47
  /**
37
48
  * CDF returns the cumulative distribution function for a given value x.
@@ -1 +1 @@
1
- {"version":3,"file":"tdigest.d.ts","sourceRoot":"","sources":["../../../../shared/src/tdigest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,QAAQ,EAAoB,KAAK,YAAY,EAAC,MAAM,eAAe,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAID,qBAAa,OAAO;;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAYjB,WAAW,GAAE,MAAa;IAOtC,KAAK,IAAI,IAAI;IAUb,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU;IAIpC,0DAA0D;IAC1D,eAAe,CAAC,YAAY,EAAE,YAAY;IAM1C;;;OAGG;IACH,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI;IAqB9B;;;;QAII;IACJ,KAAK,CAAC,EAAE,EAAE,OAAO;IA4CjB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,GAAE,YAAiB,GAAG,YAAY;IAK9C,KAAK,IAAI,MAAM;IAoCf,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IA6C3B;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAyFvB;AAID,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoB3D"}
1
+ {"version":3,"file":"tdigest.d.ts","sourceRoot":"","sources":["../../../../shared/src/tdigest.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,QAAQ,EAAoB,KAAK,YAAY,EAAC,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC;AAID,qBAAa,OAAO;;IAClB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAYjB,WAAW,GAAE,MAAa;IAOtC;;;OAGG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,OAAO;IAWrD,KAAK,IAAI,IAAI;IAUb,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU;IAIpC,0DAA0D;IAC1D,eAAe,CAAC,YAAY,EAAE,YAAY;IAM1C;;;OAGG;IACH,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI;IAqB9B;;;;QAII;IACJ,KAAK,CAAC,EAAE,EAAE,OAAO;IA4CjB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,GAAE,YAAiB,GAAG,YAAY;IAK9C,KAAK,IAAI,MAAM;IAQf;;;OAGG;IACH,MAAM,IAAI,WAAW;IAqCrB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IA6C3B;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAyFvB;AAID,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoB3D"}