@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.
- package/README.md +203 -56
- package/agent/integration.md +17 -15
- package/agent/manifest.json +6 -4
- package/agent/manifest.schema.json +8 -5
- package/dist/client/federation.d.ts +34 -8
- package/dist/client/federation.d.ts.map +1 -1
- package/dist/client/federation.js +17 -3
- package/dist/client/federation.js.map +1 -1
- package/dist/client/index.d.ts +486 -31
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +209 -41
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +8 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +82 -8
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/affiliates.d.ts.map +1 -1
- package/dist/component/affiliates.js +6 -2
- package/dist/component/affiliates.js.map +1 -1
- package/dist/component/cardinality.d.ts.map +1 -1
- package/dist/component/cardinality.js.map +1 -1
- package/dist/component/constants.d.ts +6 -0
- package/dist/component/constants.d.ts.map +1 -1
- package/dist/component/constants.js +12 -0
- package/dist/component/constants.js.map +1 -1
- package/dist/component/diagnostics.d.ts.map +1 -1
- package/dist/component/diagnostics.js.map +1 -1
- package/dist/component/eventStore.d.ts +3 -1
- package/dist/component/eventStore.d.ts.map +1 -1
- package/dist/component/eventStore.js +13 -10
- package/dist/component/eventStore.js.map +1 -1
- package/dist/component/funnels.d.ts.map +1 -1
- package/dist/component/funnels.js +5 -3
- package/dist/component/funnels.js.map +1 -1
- package/dist/component/geo.d.ts.map +1 -1
- package/dist/component/geo.js +3 -2
- package/dist/component/geo.js.map +1 -1
- package/dist/component/goals.d.ts.map +1 -1
- package/dist/component/goals.js +8 -5
- package/dist/component/goals.js.map +1 -1
- package/dist/component/guards.d.ts.map +1 -1
- package/dist/component/guards.js.map +1 -1
- package/dist/component/http.d.ts.map +1 -1
- package/dist/component/http.js +71 -37
- package/dist/component/http.js.map +1 -1
- package/dist/component/identity.d.ts +13 -0
- package/dist/component/identity.d.ts.map +1 -0
- package/dist/component/identity.js +58 -0
- package/dist/component/identity.js.map +1 -0
- package/dist/component/ingest.d.ts +3 -1
- package/dist/component/ingest.d.ts.map +1 -1
- package/dist/component/ingest.js +168 -29
- package/dist/component/ingest.js.map +1 -1
- package/dist/component/live.d.ts.map +1 -1
- package/dist/component/live.js +1 -3
- package/dist/component/live.js.map +1 -1
- package/dist/component/reports.d.ts +70 -4
- package/dist/component/reports.d.ts.map +1 -1
- package/dist/component/reports.js +232 -59
- package/dist/component/reports.js.map +1 -1
- package/dist/component/retention.d.ts +4 -4
- package/dist/component/retention.d.ts.map +1 -1
- package/dist/component/retention.js +54 -22
- package/dist/component/retention.js.map +1 -1
- package/dist/component/sanitize.d.ts.map +1 -1
- package/dist/component/sanitize.js +42 -11
- package/dist/component/sanitize.js.map +1 -1
- package/dist/component/schema.d.ts +83 -10
- package/dist/component/schema.js +34 -1
- package/dist/component/schema.js.map +1 -1
- package/dist/component/sites.d.ts.map +1 -1
- package/dist/component/sites.js +6 -6
- package/dist/component/sites.js.map +1 -1
- package/dist/component/useragent.d.ts +9 -0
- package/dist/component/useragent.d.ts.map +1 -0
- package/dist/component/useragent.js +152 -0
- package/dist/component/useragent.js.map +1 -0
- package/dist/component/validators.d.ts +29 -18
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +8 -2
- package/dist/component/validators.js.map +1 -1
- package/dist/component/visitors.d.ts +19 -0
- package/dist/component/visitors.d.ts.map +1 -0
- package/dist/component/visitors.js +86 -0
- package/dist/component/visitors.js.map +1 -0
- package/dist/component/vitals.d.ts +41 -0
- package/dist/component/vitals.d.ts.map +1 -0
- package/dist/component/vitals.js +115 -0
- package/dist/component/vitals.js.map +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/tracker/generated.d.ts +8 -4
- package/dist/tracker/generated.d.ts.map +1 -1
- package/dist/tracker/generated.js +8 -4
- package/dist/tracker/generated.js.map +1 -1
- package/dist/tracker/tracker.d.ts.map +1 -1
- package/dist/tracker/tracker.js +23 -11
- package/dist/tracker/tracker.js.map +1 -1
- package/dist/tracker/vitals.d.ts +10 -0
- package/dist/tracker/vitals.d.ts.map +1 -0
- package/dist/tracker/vitals.js +137 -0
- package/dist/tracker/vitals.js.map +1 -0
- package/dist/tracker.min.js +1 -1
- package/dist/vitals.min.js +1 -0
- package/docs/benchmarks/2026-08-20-realistic.md +71 -71
- package/docs/benchmarks/2026-08-21-formal-certification.md +50 -30
- package/docs/benchmarks/2026-08-30-alpha6-recertification.md +206 -0
- package/docs/federation.md +1 -1
- package/package.json +27 -9
- package/scripts/benchmark-ingest.mjs +101 -48
- package/src/component/_generated/api.ts +8 -0
- package/src/component/_generated/component.ts +87 -5
- package/src/component/affiliates.ts +20 -5
- package/src/component/cardinality.ts +8 -7
- package/src/component/constants.ts +12 -0
- package/src/component/diagnostics.ts +3 -2
- package/src/component/eventStore.ts +53 -46
- package/src/component/funnels.ts +19 -16
- package/src/component/geo.ts +16 -14
- package/src/component/goals.ts +29 -21
- package/src/component/guards.ts +3 -1
- package/src/component/http.ts +126 -78
- package/src/component/identity.ts +74 -0
- package/src/component/ingest.ts +349 -130
- package/src/component/live.ts +5 -4
- package/src/component/reports.ts +572 -221
- package/src/component/retention.ts +221 -98
- package/src/component/sanitize.ts +77 -27
- package/src/component/schema.ts +46 -5
- package/src/component/sites.ts +22 -11
- package/src/component/useragent.ts +171 -0
- package/src/component/validators.ts +19 -7
- package/src/component/visitors.ts +116 -0
- 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),
|
|
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) =>
|
|
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 =
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
|
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),
|
|
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(
|
|
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(
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
v.
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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) =>
|
|
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
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
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(
|
|
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")
|
|
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(
|
|
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(
|
|
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
|
|
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 =
|
|
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 (
|
|
615
|
-
|
|
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 =
|
|
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 (
|
|
650
|
-
|
|
651
|
-
|
|
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 (
|
|
655
|
-
|
|
656
|
-
|
|
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 (
|
|
660
|
-
|
|
661
|
-
|
|
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 (
|
|
665
|
-
.
|
|
666
|
-
.
|
|
667
|
-
.
|
|
668
|
-
|
|
669
|
-
|
|
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 (
|
|
673
|
-
|
|
674
|
-
|
|
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 (
|
|
678
|
-
|
|
679
|
-
|
|
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 (
|
|
683
|
-
|
|
684
|
-
|
|
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 (
|
|
688
|
-
|
|
689
|
-
|
|
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 (
|
|
693
|
-
|
|
694
|
-
|
|
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 (
|
|
698
|
-
|
|
699
|
-
|
|
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 (
|
|
703
|
-
|
|
704
|
-
|
|
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 (
|
|
708
|
-
|
|
709
|
-
|
|
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 (
|
|
713
|
-
|
|
714
|
-
|
|
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 (
|
|
717
|
-
|
|
718
|
-
|
|
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
|
}
|