@iann29/rastro 0.1.0-alpha.4 → 0.1.0-alpha.6

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 (135) hide show
  1. package/README.md +203 -56
  2. package/agent/integration.md +17 -15
  3. package/agent/manifest.json +6 -4
  4. package/agent/manifest.schema.json +8 -5
  5. package/dist/client/federation.d.ts +34 -8
  6. package/dist/client/federation.d.ts.map +1 -1
  7. package/dist/client/federation.js +17 -3
  8. package/dist/client/federation.js.map +1 -1
  9. package/dist/client/index.d.ts +486 -31
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +209 -41
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +8 -0
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +82 -8
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/affiliates.d.ts.map +1 -1
  19. package/dist/component/affiliates.js +6 -2
  20. package/dist/component/affiliates.js.map +1 -1
  21. package/dist/component/cardinality.d.ts.map +1 -1
  22. package/dist/component/cardinality.js.map +1 -1
  23. package/dist/component/constants.d.ts +6 -0
  24. package/dist/component/constants.d.ts.map +1 -1
  25. package/dist/component/constants.js +12 -0
  26. package/dist/component/constants.js.map +1 -1
  27. package/dist/component/diagnostics.d.ts.map +1 -1
  28. package/dist/component/diagnostics.js.map +1 -1
  29. package/dist/component/eventStore.d.ts +3 -1
  30. package/dist/component/eventStore.d.ts.map +1 -1
  31. package/dist/component/eventStore.js +13 -10
  32. package/dist/component/eventStore.js.map +1 -1
  33. package/dist/component/funnels.d.ts.map +1 -1
  34. package/dist/component/funnels.js +5 -3
  35. package/dist/component/funnels.js.map +1 -1
  36. package/dist/component/geo.d.ts.map +1 -1
  37. package/dist/component/geo.js +3 -2
  38. package/dist/component/geo.js.map +1 -1
  39. package/dist/component/goals.d.ts.map +1 -1
  40. package/dist/component/goals.js +8 -5
  41. package/dist/component/goals.js.map +1 -1
  42. package/dist/component/guards.d.ts.map +1 -1
  43. package/dist/component/guards.js.map +1 -1
  44. package/dist/component/http.d.ts.map +1 -1
  45. package/dist/component/http.js +71 -37
  46. package/dist/component/http.js.map +1 -1
  47. package/dist/component/identity.d.ts +13 -0
  48. package/dist/component/identity.d.ts.map +1 -0
  49. package/dist/component/identity.js +58 -0
  50. package/dist/component/identity.js.map +1 -0
  51. package/dist/component/ingest.d.ts +3 -1
  52. package/dist/component/ingest.d.ts.map +1 -1
  53. package/dist/component/ingest.js +168 -29
  54. package/dist/component/ingest.js.map +1 -1
  55. package/dist/component/live.d.ts.map +1 -1
  56. package/dist/component/live.js +1 -3
  57. package/dist/component/live.js.map +1 -1
  58. package/dist/component/reports.d.ts +70 -4
  59. package/dist/component/reports.d.ts.map +1 -1
  60. package/dist/component/reports.js +232 -59
  61. package/dist/component/reports.js.map +1 -1
  62. package/dist/component/retention.d.ts +4 -4
  63. package/dist/component/retention.d.ts.map +1 -1
  64. package/dist/component/retention.js +54 -22
  65. package/dist/component/retention.js.map +1 -1
  66. package/dist/component/sanitize.d.ts.map +1 -1
  67. package/dist/component/sanitize.js +42 -11
  68. package/dist/component/sanitize.js.map +1 -1
  69. package/dist/component/schema.d.ts +83 -10
  70. package/dist/component/schema.js +34 -1
  71. package/dist/component/schema.js.map +1 -1
  72. package/dist/component/sites.d.ts.map +1 -1
  73. package/dist/component/sites.js +6 -6
  74. package/dist/component/sites.js.map +1 -1
  75. package/dist/component/useragent.d.ts +9 -0
  76. package/dist/component/useragent.d.ts.map +1 -0
  77. package/dist/component/useragent.js +152 -0
  78. package/dist/component/useragent.js.map +1 -0
  79. package/dist/component/validators.d.ts +29 -18
  80. package/dist/component/validators.d.ts.map +1 -1
  81. package/dist/component/validators.js +8 -2
  82. package/dist/component/validators.js.map +1 -1
  83. package/dist/component/visitors.d.ts +19 -0
  84. package/dist/component/visitors.d.ts.map +1 -0
  85. package/dist/component/visitors.js +86 -0
  86. package/dist/component/visitors.js.map +1 -0
  87. package/dist/component/vitals.d.ts +41 -0
  88. package/dist/component/vitals.d.ts.map +1 -0
  89. package/dist/component/vitals.js +115 -0
  90. package/dist/component/vitals.js.map +1 -0
  91. package/dist/react/index.d.ts.map +1 -1
  92. package/dist/react/index.js.map +1 -1
  93. package/dist/tracker/generated.d.ts +8 -4
  94. package/dist/tracker/generated.d.ts.map +1 -1
  95. package/dist/tracker/generated.js +8 -4
  96. package/dist/tracker/generated.js.map +1 -1
  97. package/dist/tracker/tracker.d.ts.map +1 -1
  98. package/dist/tracker/tracker.js +23 -11
  99. package/dist/tracker/tracker.js.map +1 -1
  100. package/dist/tracker/vitals.d.ts +10 -0
  101. package/dist/tracker/vitals.d.ts.map +1 -0
  102. package/dist/tracker/vitals.js +137 -0
  103. package/dist/tracker/vitals.js.map +1 -0
  104. package/dist/tracker.min.js +1 -1
  105. package/dist/vitals.min.js +1 -0
  106. package/docs/benchmarks/2026-08-20-realistic.md +71 -71
  107. package/docs/benchmarks/2026-08-21-formal-certification.md +50 -30
  108. package/docs/benchmarks/2026-08-30-alpha6-recertification.md +206 -0
  109. package/docs/federation.md +1 -1
  110. package/package.json +27 -9
  111. package/scripts/benchmark-ingest.mjs +101 -48
  112. package/src/component/_generated/api.ts +8 -0
  113. package/src/component/_generated/component.ts +87 -5
  114. package/src/component/affiliates.ts +20 -5
  115. package/src/component/cardinality.ts +8 -7
  116. package/src/component/constants.ts +12 -0
  117. package/src/component/diagnostics.ts +3 -2
  118. package/src/component/eventStore.ts +53 -46
  119. package/src/component/funnels.ts +19 -16
  120. package/src/component/geo.ts +16 -14
  121. package/src/component/goals.ts +29 -21
  122. package/src/component/guards.ts +3 -1
  123. package/src/component/http.ts +126 -78
  124. package/src/component/identity.ts +74 -0
  125. package/src/component/ingest.ts +349 -130
  126. package/src/component/live.ts +5 -4
  127. package/src/component/reports.ts +572 -221
  128. package/src/component/retention.ts +221 -98
  129. package/src/component/sanitize.ts +77 -27
  130. package/src/component/schema.ts +46 -5
  131. package/src/component/sites.ts +22 -11
  132. package/src/component/useragent.ts +171 -0
  133. package/src/component/validators.ts +19 -7
  134. package/src/component/visitors.ts +116 -0
  135. package/src/component/vitals.ts +146 -0
@@ -29,6 +29,7 @@ export const cleanupKindValidator = v.union(
29
29
  v.literal("goalRollups"),
30
30
  v.literal("funnelRollups"),
31
31
  v.literal("affiliateRollups"),
32
+ v.literal("vitalRollups"),
32
33
  v.literal("attributions"),
33
34
  v.literal("liveSessions"),
34
35
  v.literal("ingestWindows"),
@@ -110,7 +111,8 @@ export const setPolicy = mutation({
110
111
  updatedAt: now,
111
112
  };
112
113
  const stateId = existing
113
- ? (await ctx.db.replace("retentionStates", existing._id, fields), existing._id)
114
+ ? (await ctx.db.replace("retentionStates", existing._id, fields),
115
+ existing._id)
114
116
  : await ctx.db.insert("retentionStates", fields);
115
117
  await ctx.scheduler.runAfter(0, internal.retention.runScheduled, {
116
118
  stateId,
@@ -133,7 +135,9 @@ export const disablePolicy = mutation({
133
135
  const now = Date.now();
134
136
  const states = await ctx.db
135
137
  .query("retentionStates")
136
- .withIndex("by_siteId_and_kind", (range) => range.eq("siteId", args.siteId))
138
+ .withIndex("by_siteId_and_kind", (range) =>
139
+ range.eq("siteId", args.siteId),
140
+ )
137
141
  .take(POLICY_CLEANUP_KINDS.length + 1);
138
142
  for (const state of states) {
139
143
  await ctx.db.patch("retentionStates", state._id, {
@@ -170,29 +174,33 @@ export const runPolicy = mutation({
170
174
  ) {
171
175
  return { deleted: 0, hasMore: true, before: existing.before };
172
176
  }
173
- const before = existing && existing.status !== "complete"
174
- ? existing.before
175
- : safeCleanupBoundary(
176
- args.kind,
177
- now - retentionDaysForKind(policy, args.kind) * DAY_MS,
178
- now,
179
- );
177
+ const before =
178
+ existing && existing.status !== "complete"
179
+ ? existing.before
180
+ : safeCleanupBoundary(
181
+ args.kind,
182
+ now - retentionDaysForKind(policy, args.kind) * DAY_MS,
183
+ now,
184
+ );
180
185
  const result = await executeCleanupBatch(ctx, { ...args, before });
181
186
  const generation = existing?.generation ?? 1;
182
187
  const fields = {
183
188
  siteId: args.siteId,
184
189
  kind: args.kind,
185
190
  before,
186
- status: result.hasMore ? "pending" as const : "complete" as const,
191
+ status: result.hasMore ? ("pending" as const) : ("complete" as const),
187
192
  generation,
188
193
  attempt: existing?.attempt ?? 0,
189
194
  scheduledAt: result.hasMore ? now : now + RETENTION_POLICY_INTERVAL_MS,
190
195
  deleted:
191
- existing?.before === before ? existing.deleted + result.deleted : result.deleted,
196
+ existing?.before === before
197
+ ? existing.deleted + result.deleted
198
+ : result.deleted,
192
199
  updatedAt: now,
193
200
  };
194
201
  const stateId = existing
195
- ? (await ctx.db.replace("retentionStates", existing._id, fields), existing._id)
202
+ ? (await ctx.db.replace("retentionStates", existing._id, fields),
203
+ existing._id)
196
204
  : await ctx.db.insert("retentionStates", fields);
197
205
  await recordRetentionBoundary(ctx, args.siteId, args.kind, before);
198
206
  if (result.hasMore) {
@@ -295,7 +303,12 @@ export const executeScheduled = internalMutation({
295
303
  deleted: state.deleted + result.deleted,
296
304
  updatedAt: now,
297
305
  });
298
- await recordRetentionBoundary(ctx, state.siteId, state.kind as CleanupKind, state.before);
306
+ await recordRetentionBoundary(
307
+ ctx,
308
+ state.siteId,
309
+ state.kind as CleanupKind,
310
+ state.before,
311
+ );
299
312
  if (result.hasMore) {
300
313
  await ctx.scheduler.runAfter(0, internal.retention.runScheduled, {
301
314
  stateId: state._id,
@@ -361,19 +374,24 @@ export const startScheduledCycle = internalMutation({
361
374
  export const status = query({
362
375
  args: { siteId: v.id("sites") },
363
376
  returns: v.object({
364
- policy: v.union(policyValidator.extend({ updatedAt: v.number() }), v.null()),
365
- jobs: v.array(v.object({
366
- kind: cleanupKindValidator,
367
- before: v.number(),
368
- status: v.union(
369
- v.literal("pending"),
370
- v.literal("running"),
371
- v.literal("complete"),
372
- ),
373
- deleted: v.number(),
374
- scheduledAt: v.union(v.number(), v.null()),
375
- updatedAt: v.number(),
376
- })),
377
+ policy: v.union(
378
+ policyValidator.extend({ updatedAt: v.number() }),
379
+ v.null(),
380
+ ),
381
+ jobs: v.array(
382
+ v.object({
383
+ kind: cleanupKindValidator,
384
+ before: v.number(),
385
+ status: v.union(
386
+ v.literal("pending"),
387
+ v.literal("running"),
388
+ v.literal("complete"),
389
+ ),
390
+ deleted: v.number(),
391
+ scheduledAt: v.union(v.number(), v.null()),
392
+ updatedAt: v.number(),
393
+ }),
394
+ ),
377
395
  backlog: v.number(),
378
396
  }),
379
397
  handler: async (ctx, args) => {
@@ -383,23 +401,20 @@ export const status = query({
383
401
  .unique();
384
402
  const jobs = await ctx.db
385
403
  .query("retentionStates")
386
- .withIndex("by_siteId_and_kind", (range) => range.eq("siteId", args.siteId))
404
+ .withIndex("by_siteId_and_kind", (range) =>
405
+ range.eq("siteId", args.siteId),
406
+ )
387
407
  .take(POLICY_CLEANUP_KINDS.length + 1);
388
- const publicJobs = jobs.map(({
389
- kind,
390
- before,
391
- status,
392
- deleted,
393
- scheduledAt,
394
- updatedAt,
395
- }) => ({
396
- kind: kind as CleanupKind,
397
- before,
398
- status,
399
- deleted,
400
- scheduledAt: scheduledAt ?? null,
401
- updatedAt,
402
- }));
408
+ const publicJobs = jobs.map(
409
+ ({ kind, before, status, deleted, scheduledAt, updatedAt }) => ({
410
+ kind: kind as CleanupKind,
411
+ before,
412
+ status,
413
+ deleted,
414
+ scheduledAt: scheduledAt ?? null,
415
+ updatedAt,
416
+ }),
417
+ );
403
418
  return {
404
419
  policy: policy
405
420
  ? {
@@ -430,6 +445,7 @@ type CleanupKind =
430
445
  | "goalRollups"
431
446
  | "funnelRollups"
432
447
  | "affiliateRollups"
448
+ | "vitalRollups"
433
449
  | "attributions"
434
450
  | "liveSessions"
435
451
  | "ingestWindows"
@@ -448,6 +464,7 @@ const POLICY_CLEANUP_KINDS: CleanupKind[] = [
448
464
  "goalRollups",
449
465
  "funnelRollups",
450
466
  "affiliateRollups",
467
+ "vitalRollups",
451
468
  "attributions",
452
469
  "ingestWindows",
453
470
  "siteIngestWindows",
@@ -487,19 +504,25 @@ function retentionDaysForKind(
487
504
  return policy.reportsDays;
488
505
  }
489
506
 
490
- function safeCleanupBoundary(kind: CleanupKind, requested: number, now: number) {
507
+ function safeCleanupBoundary(
508
+ kind: CleanupKind,
509
+ requested: number,
510
+ now: number,
511
+ ) {
491
512
  if (!Number.isFinite(requested) || requested < 0) {
492
513
  fail("INVALID_ARGUMENT", "before must be a positive timestamp");
493
514
  }
494
515
  if (kind === "events") return safeBucketBoundary(requested, now, MINUTE_MS);
495
- if (kind === "aggregateHour") return safeBucketBoundary(requested, now, HOUR_MS);
516
+ if (kind === "aggregateHour")
517
+ return safeBucketBoundary(requested, now, HOUR_MS);
496
518
  if (
497
519
  kind === "aggregateDay" ||
498
520
  kind === "funnelSteps" ||
499
521
  kind === "affiliateStats" ||
500
522
  kind === "goalRollups" ||
501
523
  kind === "funnelRollups" ||
502
- kind === "affiliateRollups"
524
+ kind === "affiliateRollups" ||
525
+ kind === "vitalRollups"
503
526
  ) {
504
527
  return safeBucketBoundary(requested, now, DAY_MS);
505
528
  }
@@ -512,14 +535,22 @@ function safeCleanupBoundary(kind: CleanupKind, requested: number, now: number)
512
535
  return Math.trunc(requested);
513
536
  }
514
537
 
515
- function safeBucketBoundary(requested: number, now: number, intervalMs: number) {
538
+ function safeBucketBoundary(
539
+ requested: number,
540
+ now: number,
541
+ intervalMs: number,
542
+ ) {
516
543
  return Math.min(
517
544
  Math.floor(requested / intervalMs) * intervalMs,
518
545
  Math.floor(now / intervalMs) * intervalMs,
519
546
  );
520
547
  }
521
548
 
522
- async function loadState(ctx: MutationCtx, siteId: Id<"sites">, kind: CleanupKind) {
549
+ async function loadState(
550
+ ctx: MutationCtx,
551
+ siteId: Id<"sites">,
552
+ kind: CleanupKind,
553
+ ) {
523
554
  return ctx.db
524
555
  .query("retentionStates")
525
556
  .withIndex("by_siteId_and_kind", (range) =>
@@ -539,11 +570,13 @@ async function persistDirectState(
539
570
  siteId: args.siteId,
540
571
  kind: args.kind,
541
572
  before: args.before,
542
- status: result.hasMore ? "pending" as const : "complete" as const,
573
+ status: result.hasMore ? ("pending" as const) : ("complete" as const),
543
574
  generation: (existing?.generation ?? 0) + 1,
544
575
  attempt: 0,
545
576
  deleted:
546
- existing?.before === args.before ? existing.deleted + result.deleted : result.deleted,
577
+ existing?.before === args.before
578
+ ? existing.deleted + result.deleted
579
+ : result.deleted,
547
580
  updatedAt: now,
548
581
  };
549
582
  if (existing) {
@@ -573,7 +606,8 @@ async function recordRetentionBoundary(
573
606
  );
574
607
  let changed = retained.length !== coverage.retained.length;
575
608
  for (const dataset of datasets) {
576
- const prior = coverage.retained.find((item) => item.dataset === dataset)?.before ?? 0;
609
+ const prior =
610
+ coverage.retained.find((item) => item.dataset === dataset)?.before ?? 0;
577
611
  const next = Math.max(prior, before);
578
612
  retained.push({ dataset, before: next });
579
613
  changed ||= next !== prior;
@@ -598,6 +632,7 @@ function coverageDatasetsForKind(kind: CleanupKind): string[] {
598
632
  if (kind === "goalRollups") return ["goalRollups"];
599
633
  if (kind === "funnelRollups") return ["funnelRollups"];
600
634
  if (kind === "affiliateRollups") return ["affiliateRollups"];
635
+ if (kind === "vitalRollups") return ["vitalRollups"];
601
636
  return [];
602
637
  }
603
638
 
@@ -611,10 +646,18 @@ async function executeCleanupBatch(
611
646
  },
612
647
  ) {
613
648
  const batchSize = args.batchSize ?? 100;
614
- if (!Number.isSafeInteger(batchSize) || batchSize < 1 || batchSize > MAX_RETENTION_BATCH) {
615
- fail("INVALID_ARGUMENT", `batchSize must be an integer between 1 and ${MAX_RETENTION_BATCH}`);
649
+ if (
650
+ !Number.isSafeInteger(batchSize) ||
651
+ batchSize < 1 ||
652
+ batchSize > MAX_RETENTION_BATCH
653
+ ) {
654
+ fail(
655
+ "INVALID_ARGUMENT",
656
+ `batchSize must be an integer between 1 and ${MAX_RETENTION_BATCH}`,
657
+ );
616
658
  }
617
- const effectiveBatchSize = args.kind === "events" ? Math.min(batchSize, 32) : batchSize;
659
+ const effectiveBatchSize =
660
+ args.kind === "events" ? Math.min(batchSize, 32) : batchSize;
618
661
  if (args.kind === "events") {
619
662
  return deleteTelemetryBefore(ctx, {
620
663
  siteId: args.siteId,
@@ -646,74 +689,154 @@ async function deletionsForCleanup(
646
689
  limit: number,
647
690
  ): Promise<CleanupDelete[]> {
648
691
  if (kind === "sessions") {
649
- return (await ctx.db.query("sessions")
650
- .withIndex("by_siteId_and_lastSeenAt", (q) => q.eq("siteId", siteId).lt("lastSeenAt", before))
651
- .take(limit)).map((row) => () => ctx.db.delete("sessions", row._id));
692
+ return (
693
+ await ctx.db
694
+ .query("sessions")
695
+ .withIndex("by_siteId_and_lastSeenAt", (q) =>
696
+ q.eq("siteId", siteId).lt("lastSeenAt", before),
697
+ )
698
+ .take(limit)
699
+ ).map((row) => () => ctx.db.delete("sessions", row._id));
652
700
  }
653
701
  if (kind === "conversions") {
654
- return (await ctx.db.query("conversions")
655
- .withIndex("by_siteId_and_timestamp", (q) => q.eq("siteId", siteId).lt("timestamp", before))
656
- .take(limit)).map((row) => () => ctx.db.delete("conversions", row._id));
702
+ return (
703
+ await ctx.db
704
+ .query("conversions")
705
+ .withIndex("by_siteId_and_timestamp", (q) =>
706
+ q.eq("siteId", siteId).lt("timestamp", before),
707
+ )
708
+ .take(limit)
709
+ ).map((row) => () => ctx.db.delete("conversions", row._id));
657
710
  }
658
711
  if (kind === "goalCompletions") {
659
- return (await ctx.db.query("goalCompletions")
660
- .withIndex("by_siteId_and_timestamp", (q) => q.eq("siteId", siteId).lt("timestamp", before))
661
- .take(limit)).map((row) => () => ctx.db.delete("goalCompletions", row._id));
712
+ return (
713
+ await ctx.db
714
+ .query("goalCompletions")
715
+ .withIndex("by_siteId_and_timestamp", (q) =>
716
+ q.eq("siteId", siteId).lt("timestamp", before),
717
+ )
718
+ .take(limit)
719
+ ).map((row) => () => ctx.db.delete("goalCompletions", row._id));
662
720
  }
663
721
  if (kind === "aggregateHour" || kind === "aggregateDay") {
664
- return (await ctx.db.query("aggregateBuckets")
665
- .withIndex("by_siteId_and_granularity_and_bucketStart", (q) => q
666
- .eq("siteId", siteId)
667
- .eq("granularity", kind === "aggregateHour" ? "hour" : "day")
668
- .lt("bucketStart", before))
669
- .take(limit)).map((row) => () => ctx.db.delete("aggregateBuckets", row._id));
722
+ return (
723
+ await ctx.db
724
+ .query("aggregateBuckets")
725
+ .withIndex("by_siteId_and_granularity_and_bucketStart", (q) =>
726
+ q
727
+ .eq("siteId", siteId)
728
+ .eq("granularity", kind === "aggregateHour" ? "hour" : "day")
729
+ .lt("bucketStart", before),
730
+ )
731
+ .take(limit)
732
+ ).map((row) => () => ctx.db.delete("aggregateBuckets", row._id));
670
733
  }
671
734
  if (kind === "funnelProgress") {
672
- return (await ctx.db.query("funnelProgress")
673
- .withIndex("by_siteId_and_lastStepAt", (q) => q.eq("siteId", siteId).lt("lastStepAt", before))
674
- .take(limit)).map((row) => () => ctx.db.delete("funnelProgress", row._id));
735
+ return (
736
+ await ctx.db
737
+ .query("funnelProgress")
738
+ .withIndex("by_siteId_and_lastStepAt", (q) =>
739
+ q.eq("siteId", siteId).lt("lastStepAt", before),
740
+ )
741
+ .take(limit)
742
+ ).map((row) => () => ctx.db.delete("funnelProgress", row._id));
675
743
  }
676
744
  if (kind === "funnelSteps") {
677
- return (await ctx.db.query("funnelStepBuckets")
678
- .withIndex("by_siteId_and_bucketStart", (q) => q.eq("siteId", siteId).lt("bucketStart", before))
679
- .take(limit)).map((row) => () => ctx.db.delete("funnelStepBuckets", row._id));
745
+ return (
746
+ await ctx.db
747
+ .query("funnelStepBuckets")
748
+ .withIndex("by_siteId_and_bucketStart", (q) =>
749
+ q.eq("siteId", siteId).lt("bucketStart", before),
750
+ )
751
+ .take(limit)
752
+ ).map((row) => () => ctx.db.delete("funnelStepBuckets", row._id));
680
753
  }
681
754
  if (kind === "affiliateStats") {
682
- return (await ctx.db.query("affiliateDailyStats")
683
- .withIndex("by_siteId_and_bucketStart", (q) => q.eq("siteId", siteId).lt("bucketStart", before))
684
- .take(limit)).map((row) => () => ctx.db.delete("affiliateDailyStats", row._id));
755
+ return (
756
+ await ctx.db
757
+ .query("affiliateDailyStats")
758
+ .withIndex("by_siteId_and_bucketStart", (q) =>
759
+ q.eq("siteId", siteId).lt("bucketStart", before),
760
+ )
761
+ .take(limit)
762
+ ).map((row) => () => ctx.db.delete("affiliateDailyStats", row._id));
685
763
  }
686
764
  if (kind === "goalRollups") {
687
- return (await ctx.db.query("goalDailyRollups")
688
- .withIndex("by_siteId_and_bucketStart", (q) => q.eq("siteId", siteId).lt("bucketStart", before))
689
- .take(limit)).map((row) => () => ctx.db.delete("goalDailyRollups", row._id));
765
+ return (
766
+ await ctx.db
767
+ .query("goalDailyRollups")
768
+ .withIndex("by_siteId_and_bucketStart", (q) =>
769
+ q.eq("siteId", siteId).lt("bucketStart", before),
770
+ )
771
+ .take(limit)
772
+ ).map((row) => () => ctx.db.delete("goalDailyRollups", row._id));
690
773
  }
691
774
  if (kind === "funnelRollups") {
692
- return (await ctx.db.query("funnelDailyRollups")
693
- .withIndex("by_siteId_and_bucketStart", (q) => q.eq("siteId", siteId).lt("bucketStart", before))
694
- .take(limit)).map((row) => () => ctx.db.delete("funnelDailyRollups", row._id));
775
+ return (
776
+ await ctx.db
777
+ .query("funnelDailyRollups")
778
+ .withIndex("by_siteId_and_bucketStart", (q) =>
779
+ q.eq("siteId", siteId).lt("bucketStart", before),
780
+ )
781
+ .take(limit)
782
+ ).map((row) => () => ctx.db.delete("funnelDailyRollups", row._id));
695
783
  }
696
784
  if (kind === "affiliateRollups") {
697
- return (await ctx.db.query("affiliateDailyRollups")
698
- .withIndex("by_siteId_and_bucketStart", (q) => q.eq("siteId", siteId).lt("bucketStart", before))
699
- .take(limit)).map((row) => () => ctx.db.delete("affiliateDailyRollups", row._id));
785
+ return (
786
+ await ctx.db
787
+ .query("affiliateDailyRollups")
788
+ .withIndex("by_siteId_and_bucketStart", (q) =>
789
+ q.eq("siteId", siteId).lt("bucketStart", before),
790
+ )
791
+ .take(limit)
792
+ ).map((row) => () => ctx.db.delete("affiliateDailyRollups", row._id));
793
+ }
794
+ if (kind === "vitalRollups") {
795
+ return (
796
+ await ctx.db
797
+ .query("vitalRollups")
798
+ .withIndex("by_siteId_and_bucketStart", (q) =>
799
+ q.eq("siteId", siteId).lt("bucketStart", before),
800
+ )
801
+ .take(limit)
802
+ ).map((row) => () => ctx.db.delete("vitalRollups", row._id));
700
803
  }
701
804
  if (kind === "attributions") {
702
- return (await ctx.db.query("visitorAttributions")
703
- .withIndex("by_siteId_and_expiresAt", (q) => q.eq("siteId", siteId).lt("expiresAt", before))
704
- .take(limit)).map((row) => () => ctx.db.delete("visitorAttributions", row._id));
805
+ return (
806
+ await ctx.db
807
+ .query("visitorAttributions")
808
+ .withIndex("by_siteId_and_expiresAt", (q) =>
809
+ q.eq("siteId", siteId).lt("expiresAt", before),
810
+ )
811
+ .take(limit)
812
+ ).map((row) => () => ctx.db.delete("visitorAttributions", row._id));
705
813
  }
706
814
  if (kind === "liveSessions") {
707
- return (await ctx.db.query("liveSessions")
708
- .withIndex("by_siteId_and_expiresAt", (q) => q.eq("siteId", siteId).lt("expiresAt", before))
709
- .take(limit)).map((row) => () => ctx.db.delete("liveSessions", row._id));
815
+ return (
816
+ await ctx.db
817
+ .query("liveSessions")
818
+ .withIndex("by_siteId_and_expiresAt", (q) =>
819
+ q.eq("siteId", siteId).lt("expiresAt", before),
820
+ )
821
+ .take(limit)
822
+ ).map((row) => () => ctx.db.delete("liveSessions", row._id));
710
823
  }
711
824
  if (kind === "siteIngestWindows") {
712
- return (await ctx.db.query("siteIngestWindows")
713
- .withIndex("by_siteId_and_updatedAt", (q) => q.eq("siteId", siteId).lt("updatedAt", before))
714
- .take(limit)).map((row) => () => ctx.db.delete("siteIngestWindows", row._id));
825
+ return (
826
+ await ctx.db
827
+ .query("siteIngestWindows")
828
+ .withIndex("by_siteId_and_updatedAt", (q) =>
829
+ q.eq("siteId", siteId).lt("updatedAt", before),
830
+ )
831
+ .take(limit)
832
+ ).map((row) => () => ctx.db.delete("siteIngestWindows", row._id));
715
833
  }
716
- return (await ctx.db.query("ingestWindows")
717
- .withIndex("by_siteId_and_updatedAt", (q) => q.eq("siteId", siteId).lt("updatedAt", before))
718
- .take(limit)).map((row) => () => ctx.db.delete("ingestWindows", row._id));
834
+ return (
835
+ await ctx.db
836
+ .query("ingestWindows")
837
+ .withIndex("by_siteId_and_updatedAt", (q) =>
838
+ q.eq("siteId", siteId).lt("updatedAt", before),
839
+ )
840
+ .take(limit)
841
+ ).map((row) => () => ctx.db.delete("ingestWindows", row._id));
719
842
  }