@iann29/rastro 0.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +352 -0
  3. package/assets/rastro-live-atlas.png +0 -0
  4. package/dist/client/_generated/_ignore.d.ts +1 -0
  5. package/dist/client/_generated/_ignore.d.ts.map +1 -0
  6. package/dist/client/_generated/_ignore.js +3 -0
  7. package/dist/client/_generated/_ignore.js.map +1 -0
  8. package/dist/client/index.d.ts +960 -0
  9. package/dist/client/index.d.ts.map +1 -0
  10. package/dist/client/index.js +591 -0
  11. package/dist/client/index.js.map +1 -0
  12. package/dist/component/_generated/api.d.ts +60 -0
  13. package/dist/component/_generated/api.d.ts.map +1 -0
  14. package/dist/component/_generated/api.js +31 -0
  15. package/dist/component/_generated/api.js.map +1 -0
  16. package/dist/component/_generated/component.d.ts +569 -0
  17. package/dist/component/_generated/component.d.ts.map +1 -0
  18. package/dist/component/_generated/component.js +11 -0
  19. package/dist/component/_generated/component.js.map +1 -0
  20. package/dist/component/_generated/dataModel.d.ts +46 -0
  21. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  22. package/dist/component/_generated/dataModel.js +11 -0
  23. package/dist/component/_generated/dataModel.js.map +1 -0
  24. package/dist/component/_generated/server.d.ts +133 -0
  25. package/dist/component/_generated/server.d.ts.map +1 -0
  26. package/dist/component/_generated/server.js +80 -0
  27. package/dist/component/_generated/server.js.map +1 -0
  28. package/dist/component/affiliates.d.ts +28 -0
  29. package/dist/component/affiliates.d.ts.map +1 -0
  30. package/dist/component/affiliates.js +110 -0
  31. package/dist/component/affiliates.js.map +1 -0
  32. package/dist/component/constants.d.ts +28 -0
  33. package/dist/component/constants.d.ts.map +1 -0
  34. package/dist/component/constants.js +28 -0
  35. package/dist/component/constants.js.map +1 -0
  36. package/dist/component/convex.config.d.ts +3 -0
  37. package/dist/component/convex.config.d.ts.map +1 -0
  38. package/dist/component/convex.config.js +3 -0
  39. package/dist/component/convex.config.js.map +1 -0
  40. package/dist/component/errors.d.ts +3 -0
  41. package/dist/component/errors.d.ts.map +1 -0
  42. package/dist/component/errors.js +5 -0
  43. package/dist/component/errors.js.map +1 -0
  44. package/dist/component/funnels.d.ts +36 -0
  45. package/dist/component/funnels.d.ts.map +1 -0
  46. package/dist/component/funnels.js +117 -0
  47. package/dist/component/funnels.js.map +1 -0
  48. package/dist/component/goals.d.ts +30 -0
  49. package/dist/component/goals.d.ts.map +1 -0
  50. package/dist/component/goals.js +110 -0
  51. package/dist/component/goals.js.map +1 -0
  52. package/dist/component/guards.d.ts +2 -0
  53. package/dist/component/guards.d.ts.map +1 -0
  54. package/dist/component/guards.js +4 -0
  55. package/dist/component/guards.js.map +1 -0
  56. package/dist/component/http.d.ts +3 -0
  57. package/dist/component/http.d.ts.map +1 -0
  58. package/dist/component/http.js +270 -0
  59. package/dist/component/http.js.map +1 -0
  60. package/dist/component/ingest.d.ts +51 -0
  61. package/dist/component/ingest.d.ts.map +1 -0
  62. package/dist/component/ingest.js +991 -0
  63. package/dist/component/ingest.js.map +1 -0
  64. package/dist/component/live.d.ts +9 -0
  65. package/dist/component/live.d.ts.map +1 -0
  66. package/dist/component/live.js +36 -0
  67. package/dist/component/live.js.map +1 -0
  68. package/dist/component/reports.d.ts +330 -0
  69. package/dist/component/reports.d.ts.map +1 -0
  70. package/dist/component/reports.js +595 -0
  71. package/dist/component/reports.js.map +1 -0
  72. package/dist/component/retention.d.ts +10 -0
  73. package/dist/component/retention.d.ts.map +1 -0
  74. package/dist/component/retention.js +107 -0
  75. package/dist/component/retention.js.map +1 -0
  76. package/dist/component/sanitize.d.ts +20 -0
  77. package/dist/component/sanitize.d.ts.map +1 -0
  78. package/dist/component/sanitize.js +269 -0
  79. package/dist/component/sanitize.js.map +1 -0
  80. package/dist/component/schema.d.ts +517 -0
  81. package/dist/component/schema.d.ts.map +1 -0
  82. package/dist/component/schema.js +209 -0
  83. package/dist/component/schema.js.map +1 -0
  84. package/dist/component/sites.d.ts +54 -0
  85. package/dist/component/sites.d.ts.map +1 -0
  86. package/dist/component/sites.js +164 -0
  87. package/dist/component/sites.js.map +1 -0
  88. package/dist/component/validators.d.ts +377 -0
  89. package/dist/component/validators.d.ts.map +1 -0
  90. package/dist/component/validators.js +176 -0
  91. package/dist/component/validators.js.map +1 -0
  92. package/dist/react/index.d.ts +40 -0
  93. package/dist/react/index.d.ts.map +1 -0
  94. package/dist/react/index.js +31 -0
  95. package/dist/react/index.js.map +1 -0
  96. package/dist/tracker/generated.d.ts +5 -0
  97. package/dist/tracker/generated.d.ts.map +1 -0
  98. package/dist/tracker/generated.js +6 -0
  99. package/dist/tracker/generated.js.map +1 -0
  100. package/dist/tracker/tracker.d.ts +27 -0
  101. package/dist/tracker/tracker.d.ts.map +1 -0
  102. package/dist/tracker/tracker.js +108 -0
  103. package/dist/tracker/tracker.js.map +1 -0
  104. package/dist/tracker.min.js +1 -0
  105. package/package.json +121 -0
  106. package/src/component/_generated/api.ts +76 -0
  107. package/src/component/_generated/component.ts +706 -0
  108. package/src/component/_generated/dataModel.ts +60 -0
  109. package/src/component/_generated/server.ts +169 -0
  110. package/src/component/affiliates.ts +119 -0
  111. package/src/component/constants.ts +28 -0
  112. package/src/component/convex.config.ts +3 -0
  113. package/src/component/errors.ts +20 -0
  114. package/src/component/funnels.ts +134 -0
  115. package/src/component/goals.ts +122 -0
  116. package/src/component/guards.ts +3 -0
  117. package/src/component/http.ts +301 -0
  118. package/src/component/ingest.ts +1364 -0
  119. package/src/component/live.ts +36 -0
  120. package/src/component/reports.ts +720 -0
  121. package/src/component/retention.ts +180 -0
  122. package/src/component/sanitize.ts +278 -0
  123. package/src/component/schema.ts +232 -0
  124. package/src/component/sites.ts +188 -0
  125. package/src/component/validators.ts +226 -0
  126. package/src/test.ts +19 -0
@@ -0,0 +1,595 @@
1
+ import { paginationOptsValidator, paginationResultValidator, } from "convex/server";
2
+ import { v } from "convex/values";
3
+ import { query } from "./_generated/server.js";
4
+ import { AGGREGATE_SHARDS, DAY_MS, HOUR_MS, MAX_AFFILIATES_PER_SITE, MAX_FUNNELS_PER_SITE, MAX_GOALS_PER_SITE, MAX_JOURNEY_EVENTS, MAX_LIVE_VISITORS, MAX_MANUAL_PAGINATION_OFFSET, MAX_OVERVIEW_AGGREGATE_ROWS, MAX_REPORT_RANGE_DAYS, MAX_REPORT_SITES, } from "./constants.js";
5
+ import { fail } from "./errors.js";
6
+ import { isPlainRecord } from "./guards.js";
7
+ import { affiliateFieldsValidator, eventFieldsValidator, funnelFieldsValidator, goalFieldsValidator, sessionFieldsValidator, } from "./validators.js";
8
+ const sessionDocumentValidator = sessionFieldsValidator.extend({
9
+ _id: v.id("sessions"),
10
+ _creationTime: v.number(),
11
+ });
12
+ const eventDocumentValidator = eventFieldsValidator.extend({
13
+ _id: v.id("events"),
14
+ _creationTime: v.number(),
15
+ });
16
+ const liveSessionDocumentValidator = v.object({
17
+ _id: v.id("liveSessions"),
18
+ _creationTime: v.number(),
19
+ siteId: v.id("sites"),
20
+ sessionId: v.string(),
21
+ visitorId: v.string(),
22
+ path: v.string(),
23
+ startedAt: v.number(),
24
+ lastSeenAt: v.number(),
25
+ expiresAt: v.number(),
26
+ country: v.optional(v.string()),
27
+ city: v.optional(v.string()),
28
+ latitude: v.optional(v.number()),
29
+ longitude: v.optional(v.number()),
30
+ browser: v.string(),
31
+ os: v.string(),
32
+ source: v.string(),
33
+ device: v.string(),
34
+ pageviewCount: v.number(),
35
+ eventCount: v.number(),
36
+ });
37
+ const conversionDocumentValidator = v.object({
38
+ _id: v.id("conversions"),
39
+ _creationTime: v.number(),
40
+ siteId: v.id("sites"),
41
+ eventId: v.string(),
42
+ sessionId: v.string(),
43
+ visitorId: v.string(),
44
+ timestamp: v.number(),
45
+ path: v.string(),
46
+ revenueCents: v.number(),
47
+ currency: v.string(),
48
+ source: v.union(v.literal("tracker"), v.literal("trusted")),
49
+ goalKey: v.optional(v.string()),
50
+ affiliateId: v.optional(v.id("affiliates")),
51
+ affiliateAttributedAt: v.optional(v.number()),
52
+ affiliateExpiresAt: v.optional(v.number()),
53
+ affiliateSlug: v.optional(v.string()),
54
+ commissionCents: v.number(),
55
+ });
56
+ const metricTotalsValidator = v.object({
57
+ events: v.number(),
58
+ pageviews: v.number(),
59
+ clicks: v.number(),
60
+ customEvents: v.number(),
61
+ outboundClicks: v.number(),
62
+ sessions: v.number(),
63
+ visitors: v.number(),
64
+ conversions: v.number(),
65
+ revenueCents: v.number(),
66
+ });
67
+ const timePointValidator = metricTotalsValidator.extend({ timestamp: v.number() });
68
+ const topItemValidator = v.object({
69
+ value: v.string(),
70
+ count: v.number(),
71
+ revenueCents: v.number(),
72
+ });
73
+ export const overview = query({
74
+ args: {
75
+ siteIds: v.array(v.id("sites")),
76
+ from: v.number(),
77
+ to: v.number(),
78
+ interval: v.optional(v.union(v.literal("hour"), v.literal("day"))),
79
+ },
80
+ returns: v.object({
81
+ from: v.number(),
82
+ to: v.number(),
83
+ interval: v.union(v.literal("hour"), v.literal("day")),
84
+ currency: v.string(),
85
+ totals: metricTotalsValidator,
86
+ timeSeries: v.array(timePointValidator),
87
+ topSources: v.array(topItemValidator),
88
+ topPages: v.array(topItemValidator),
89
+ topCountries: v.array(topItemValidator),
90
+ topDevices: v.array(topItemValidator),
91
+ topBrowsers: v.array(topItemValidator),
92
+ topEvents: v.array(topItemValidator),
93
+ topGoals: v.array(topItemValidator),
94
+ }),
95
+ handler: async (ctx, args) => {
96
+ const siteIds = validateSiteIds(args.siteIds);
97
+ const currencies = new Set();
98
+ for (const siteId of siteIds) {
99
+ const site = await ctx.db.get("sites", siteId);
100
+ if (!site)
101
+ fail("NOT_FOUND", "site not found", { siteId: String(siteId) });
102
+ currencies.add(site.currency ?? "USD");
103
+ }
104
+ if (currencies.size !== 1) {
105
+ fail("CURRENCY_MISMATCH", "overview sites must use the same currency", {
106
+ currencies: [...currencies].sort().join(","),
107
+ });
108
+ }
109
+ const currency = [...currencies][0];
110
+ const { from, to } = validateRange(args.from, args.to, MAX_REPORT_RANGE_DAYS);
111
+ const interval = args.interval ?? (to - from <= 7 * DAY_MS ? "hour" : "day");
112
+ if (interval === "hour" && to - from > 7 * DAY_MS) {
113
+ fail("INVALID_ARGUMENT", "hourly reports are limited to seven days");
114
+ }
115
+ const intervalMs = interval === "hour" ? HOUR_MS : DAY_MS;
116
+ const firstBucket = Math.floor(from / intervalMs) * intervalMs;
117
+ const lastBucket = Math.floor(to / intervalMs) * intervalMs;
118
+ const bucketCount = Math.floor((lastBucket - firstBucket) / intervalMs) + 1;
119
+ const perSiteLimit = bucketCount * AGGREGATE_SHARDS;
120
+ if (perSiteLimit * siteIds.length > MAX_OVERVIEW_AGGREGATE_ROWS) {
121
+ fail("LIMIT_EXCEEDED", "overview range is too wide for the requested number of sites", { maximumAggregateRows: MAX_OVERVIEW_AGGREGATE_ROWS });
122
+ }
123
+ const totals = emptyTotals();
124
+ const points = new Map();
125
+ const dimensions = new Map();
126
+ for (const siteId of siteIds) {
127
+ const buckets = await ctx.db
128
+ .query("aggregateBuckets")
129
+ .withIndex("by_siteId_and_granularity_and_bucketStart", (range) => range
130
+ .eq("siteId", siteId)
131
+ .eq("granularity", interval)
132
+ .gte("bucketStart", firstBucket)
133
+ .lte("bucketStart", lastBucket))
134
+ .take(perSiteLimit);
135
+ for (const bucket of buckets) {
136
+ addMetrics(totals, bucket);
137
+ const point = points.get(bucket.bucketStart) ?? emptyTotals();
138
+ addMetrics(point, bucket);
139
+ points.set(bucket.bucketStart, point);
140
+ for (const dimension of bucket.dimensions) {
141
+ const key = `${dimension.type}:${dimension.value}`;
142
+ const current = dimensions.get(key) ?? {
143
+ value: dimension.value,
144
+ count: 0,
145
+ revenueCents: 0,
146
+ };
147
+ current.count += dimension.count;
148
+ current.revenueCents += dimension.revenueCents;
149
+ dimensions.set(key, current);
150
+ }
151
+ }
152
+ }
153
+ const top = (type) => [...dimensions.entries()]
154
+ .filter(([key]) => key.startsWith(`${type}:`))
155
+ .map(([, value]) => value)
156
+ .sort((left, right) => right.count - left.count || left.value.localeCompare(right.value))
157
+ .slice(0, 10);
158
+ return {
159
+ from,
160
+ to,
161
+ interval,
162
+ currency,
163
+ totals,
164
+ timeSeries: [...points.entries()]
165
+ .sort(([left], [right]) => left - right)
166
+ .map(([timestamp, metrics]) => ({ timestamp, ...metrics })),
167
+ topSources: top("source"),
168
+ topPages: top("page"),
169
+ topCountries: top("country"),
170
+ topDevices: top("device"),
171
+ topBrowsers: top("browser"),
172
+ topEvents: top("event"),
173
+ topGoals: top("goal"),
174
+ };
175
+ },
176
+ });
177
+ export const liveVisitors = query({
178
+ args: {
179
+ siteIds: v.array(v.id("sites")),
180
+ now: v.number(),
181
+ limit: v.optional(v.number()),
182
+ },
183
+ returns: v.array(liveSessionDocumentValidator),
184
+ handler: async (ctx, args) => {
185
+ const siteIds = validateSiteIds(args.siteIds);
186
+ const limit = args.limit ?? 100;
187
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_LIVE_VISITORS) {
188
+ fail("INVALID_ARGUMENT", `limit must be an integer between 1 and ${MAX_LIVE_VISITORS}`);
189
+ }
190
+ if (!Number.isFinite(args.now) || args.now < 0) {
191
+ fail("INVALID_ARGUMENT", "now must be a positive timestamp");
192
+ }
193
+ const rows = [];
194
+ for (const siteId of siteIds) {
195
+ rows.push(...(await ctx.db
196
+ .query("liveSessions")
197
+ .withIndex("by_siteId_and_expiresAt", (range) => range.eq("siteId", siteId).gte("expiresAt", args.now))
198
+ .order("desc")
199
+ .take(limit)));
200
+ }
201
+ return rows
202
+ .sort((left, right) => right.lastSeenAt - left.lastSeenAt)
203
+ .slice(0, limit)
204
+ .map((row) => ({
205
+ _id: row._id,
206
+ _creationTime: row._creationTime,
207
+ siteId: row.siteId,
208
+ sessionId: row.sessionId,
209
+ visitorId: row.visitorId,
210
+ path: row.path,
211
+ startedAt: row.startedAt,
212
+ lastSeenAt: row.lastSeenAt,
213
+ expiresAt: row.expiresAt,
214
+ ...(row.country ? { country: row.country } : {}),
215
+ ...(row.city ? { city: row.city } : {}),
216
+ ...(row.latitude !== undefined ? { latitude: row.latitude } : {}),
217
+ ...(row.longitude !== undefined ? { longitude: row.longitude } : {}),
218
+ browser: row.browser,
219
+ os: row.os,
220
+ source: row.source,
221
+ device: row.device,
222
+ pageviewCount: row.pageviewCount,
223
+ eventCount: row.eventCount,
224
+ }));
225
+ },
226
+ });
227
+ export const listSessions = query({
228
+ args: {
229
+ siteId: v.id("sites"),
230
+ from: v.number(),
231
+ to: v.number(),
232
+ paginationOpts: paginationOptsValidator,
233
+ },
234
+ returns: paginationResultValidator(sessionDocumentValidator),
235
+ handler: async (ctx, args) => {
236
+ validateRange(args.from, args.to, MAX_REPORT_RANGE_DAYS);
237
+ const pagination = parseManualPagination(args.paginationOpts);
238
+ const rows = await ctx.db
239
+ .query("sessions")
240
+ .withIndex("by_siteId_and_lastSeenAt", (range) => range
241
+ .eq("siteId", args.siteId)
242
+ .gte("lastSeenAt", args.from)
243
+ .lte("lastSeenAt", args.to))
244
+ .order("desc")
245
+ .take(pagination.offset + pagination.numItems + 1);
246
+ return manualPaginationResult(rows, pagination);
247
+ },
248
+ });
249
+ export const sessionJourney = query({
250
+ args: {
251
+ siteId: v.id("sites"),
252
+ sessionId: v.string(),
253
+ from: v.number(),
254
+ to: v.number(),
255
+ paginationOpts: paginationOptsValidator,
256
+ },
257
+ returns: paginationResultValidator(eventDocumentValidator),
258
+ handler: async (ctx, args) => {
259
+ validateRange(args.from, args.to, MAX_REPORT_RANGE_DAYS);
260
+ const pagination = parseManualPagination(args.paginationOpts);
261
+ const rows = await ctx.db
262
+ .query("events")
263
+ .withIndex("by_siteId_and_sessionId_and_timestamp", (range) => range
264
+ .eq("siteId", args.siteId)
265
+ .eq("sessionId", args.sessionId)
266
+ .gte("timestamp", args.from)
267
+ .lte("timestamp", args.to))
268
+ .order("asc")
269
+ .take(pagination.offset + pagination.numItems + 1);
270
+ return manualPaginationResult(rows, pagination);
271
+ },
272
+ });
273
+ export const listConversions = query({
274
+ args: {
275
+ siteId: v.id("sites"),
276
+ from: v.number(),
277
+ to: v.number(),
278
+ paginationOpts: paginationOptsValidator,
279
+ },
280
+ returns: paginationResultValidator(conversionDocumentValidator),
281
+ handler: async (ctx, args) => {
282
+ validateRange(args.from, args.to, MAX_REPORT_RANGE_DAYS);
283
+ const pagination = parseManualPagination(args.paginationOpts);
284
+ const rows = await ctx.db
285
+ .query("conversions")
286
+ .withIndex("by_siteId_and_timestamp", (range) => range
287
+ .eq("siteId", args.siteId)
288
+ .gte("timestamp", args.from)
289
+ .lte("timestamp", args.to))
290
+ .order("desc")
291
+ .take(pagination.offset + pagination.numItems + 1);
292
+ return manualPaginationResult(rows, pagination);
293
+ },
294
+ });
295
+ export const visitorJourney = query({
296
+ args: {
297
+ siteIds: v.array(v.id("sites")),
298
+ visitorId: v.string(),
299
+ from: v.number(),
300
+ to: v.number(),
301
+ limit: v.optional(v.number()),
302
+ },
303
+ returns: v.array(eventDocumentValidator),
304
+ handler: async (ctx, args) => {
305
+ const siteIds = validateSiteIds(args.siteIds);
306
+ validateRange(args.from, args.to, MAX_REPORT_RANGE_DAYS);
307
+ const limit = args.limit ?? 200;
308
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_JOURNEY_EVENTS) {
309
+ fail("INVALID_ARGUMENT", `limit must be an integer between 1 and ${MAX_JOURNEY_EVENTS}`);
310
+ }
311
+ const rows = [];
312
+ for (const siteId of siteIds) {
313
+ rows.push(...(await ctx.db
314
+ .query("events")
315
+ .withIndex("by_siteId_and_visitorId_and_timestamp", (range) => range
316
+ .eq("siteId", siteId)
317
+ .eq("visitorId", args.visitorId)
318
+ .gte("timestamp", args.from)
319
+ .lte("timestamp", args.to))
320
+ .order("asc")
321
+ .take(limit)));
322
+ }
323
+ return rows
324
+ .sort((left, right) => left.timestamp - right.timestamp || left.sequence - right.sequence)
325
+ .slice(0, limit);
326
+ },
327
+ });
328
+ const goalReportItemValidator = goalFieldsValidator.extend({
329
+ _id: v.id("goals"),
330
+ _creationTime: v.number(),
331
+ completions: v.number(),
332
+ valueCents: v.number(),
333
+ });
334
+ export const goalsReport = query({
335
+ args: { siteId: v.id("sites"), from: v.number(), to: v.number() },
336
+ returns: v.object({
337
+ goals: v.array(goalReportItemValidator),
338
+ truncated: v.boolean(),
339
+ }),
340
+ handler: async (ctx, args) => {
341
+ validateRange(args.from, args.to, MAX_REPORT_RANGE_DAYS);
342
+ const goals = await ctx.db
343
+ .query("goals")
344
+ .withIndex("by_siteId", (range) => range.eq("siteId", args.siteId))
345
+ .take(MAX_GOALS_PER_SITE);
346
+ const completions = await ctx.db
347
+ .query("goalCompletions")
348
+ .withIndex("by_siteId_and_timestamp", (range) => range
349
+ .eq("siteId", args.siteId)
350
+ .gte("timestamp", args.from)
351
+ .lte("timestamp", args.to))
352
+ .take(5_001);
353
+ const totals = new Map();
354
+ for (const completion of completions.slice(0, 5_000)) {
355
+ const key = String(completion.goalId);
356
+ const total = totals.get(key) ?? { completions: 0, valueCents: 0 };
357
+ total.completions += 1;
358
+ total.valueCents += completion.valueCents;
359
+ totals.set(key, total);
360
+ }
361
+ return {
362
+ goals: goals.map((goal) => ({
363
+ ...goal,
364
+ ...(totals.get(String(goal._id)) ?? { completions: 0, valueCents: 0 }),
365
+ })),
366
+ truncated: completions.length > 5_000,
367
+ };
368
+ },
369
+ });
370
+ const funnelReportItemValidator = funnelFieldsValidator.extend({
371
+ _id: v.id("funnels"),
372
+ _creationTime: v.number(),
373
+ stepsReport: v.array(v.object({ step: v.number(), name: v.string(), entrants: v.number(), completions: v.number() })),
374
+ truncated: v.boolean(),
375
+ });
376
+ export const funnelsReport = query({
377
+ args: { siteId: v.id("sites"), from: v.number(), to: v.number() },
378
+ returns: v.array(funnelReportItemValidator),
379
+ handler: async (ctx, args) => {
380
+ validateRange(args.from, args.to, 90);
381
+ const funnels = await ctx.db
382
+ .query("funnels")
383
+ .withIndex("by_siteId", (range) => range.eq("siteId", args.siteId))
384
+ .take(MAX_FUNNELS_PER_SITE);
385
+ const reports = [];
386
+ for (const funnel of funnels) {
387
+ const buckets = await ctx.db
388
+ .query("funnelStepBuckets")
389
+ .withIndex("by_siteId_and_funnelId_and_bucketStart", (range) => range
390
+ .eq("siteId", args.siteId)
391
+ .eq("funnelId", funnel._id)
392
+ .gte("bucketStart", Math.floor(args.from / DAY_MS) * DAY_MS)
393
+ .lte("bucketStart", Math.floor(args.to / DAY_MS) * DAY_MS))
394
+ .take(601);
395
+ const stepsReport = funnel.steps.map((step, index) => ({
396
+ step: index,
397
+ name: step.name,
398
+ entrants: 0,
399
+ completions: 0,
400
+ }));
401
+ for (const bucket of buckets.slice(0, 600)) {
402
+ const step = stepsReport[bucket.step];
403
+ if (step) {
404
+ step.entrants += bucket.entrants;
405
+ step.completions += bucket.completions;
406
+ }
407
+ }
408
+ reports.push({
409
+ ...funnel,
410
+ stepsReport,
411
+ truncated: buckets.length > 600,
412
+ });
413
+ }
414
+ return reports;
415
+ },
416
+ });
417
+ const affiliateReportItemValidator = affiliateFieldsValidator.extend({
418
+ _id: v.id("affiliates"),
419
+ _creationTime: v.number(),
420
+ visits: v.number(),
421
+ uniqueVisitors: v.number(),
422
+ conversions: v.number(),
423
+ revenueCents: v.number(),
424
+ commissionCents: v.number(),
425
+ });
426
+ export const affiliatesReport = query({
427
+ args: { siteId: v.id("sites"), from: v.number(), to: v.number() },
428
+ returns: v.object({
429
+ affiliates: v.array(affiliateReportItemValidator),
430
+ truncated: v.boolean(),
431
+ }),
432
+ handler: async (ctx, args) => {
433
+ validateRange(args.from, args.to, MAX_REPORT_RANGE_DAYS);
434
+ const affiliateRows = await ctx.db
435
+ .query("affiliates")
436
+ .withIndex("by_siteId", (range) => range.eq("siteId", args.siteId))
437
+ .order("desc")
438
+ .take(MAX_AFFILIATES_PER_SITE + 1);
439
+ const affiliates = affiliateRows.slice(0, MAX_AFFILIATES_PER_SITE);
440
+ const stats = await ctx.db
441
+ .query("affiliateDailyStats")
442
+ .withIndex("by_siteId_and_bucketStart", (range) => range
443
+ .eq("siteId", args.siteId)
444
+ .gte("bucketStart", Math.floor(args.from / DAY_MS) * DAY_MS)
445
+ .lte("bucketStart", Math.floor(args.to / DAY_MS) * DAY_MS))
446
+ .take(5_001);
447
+ const sessions = await ctx.db
448
+ .query("sessions")
449
+ .withIndex("by_siteId_and_startedAt", (range) => range
450
+ .eq("siteId", args.siteId)
451
+ .gte("startedAt", args.from)
452
+ .lte("startedAt", args.to))
453
+ .take(5_001);
454
+ const visits = new Map();
455
+ for (const session of sessions.slice(0, 5_000)) {
456
+ if (!session.affiliateId)
457
+ continue;
458
+ const key = String(session.affiliateId);
459
+ const total = visits.get(key) ?? {
460
+ visits: 0,
461
+ visitors: new Set(),
462
+ };
463
+ total.visits += 1;
464
+ total.visitors.add(session.visitorId);
465
+ visits.set(key, total);
466
+ }
467
+ const totals = new Map();
468
+ for (const row of stats.slice(0, 5_000)) {
469
+ const key = String(row.affiliateId);
470
+ const total = totals.get(key) ?? {
471
+ conversions: 0,
472
+ revenueCents: 0,
473
+ commissionCents: 0,
474
+ };
475
+ total.conversions += row.conversions;
476
+ total.revenueCents += row.revenueCents;
477
+ total.commissionCents += row.commissionCents;
478
+ totals.set(key, total);
479
+ }
480
+ return {
481
+ affiliates: affiliates.map((affiliate) => {
482
+ const performance = totals.get(String(affiliate._id)) ?? {
483
+ conversions: 0,
484
+ revenueCents: 0,
485
+ commissionCents: 0,
486
+ };
487
+ const traffic = visits.get(String(affiliate._id));
488
+ return {
489
+ ...affiliate,
490
+ ...performance,
491
+ visits: traffic?.visits ?? 0,
492
+ uniqueVisitors: traffic?.visitors.size ?? 0,
493
+ };
494
+ }),
495
+ truncated: affiliateRows.length > MAX_AFFILIATES_PER_SITE ||
496
+ stats.length > 5_000 ||
497
+ sessions.length > 5_000,
498
+ };
499
+ },
500
+ });
501
+ function emptyTotals() {
502
+ return {
503
+ events: 0,
504
+ pageviews: 0,
505
+ clicks: 0,
506
+ customEvents: 0,
507
+ outboundClicks: 0,
508
+ sessions: 0,
509
+ visitors: 0,
510
+ conversions: 0,
511
+ revenueCents: 0,
512
+ };
513
+ }
514
+ function addMetrics(target, source) {
515
+ target.events += source.events;
516
+ target.pageviews += source.pageviews;
517
+ target.clicks += source.clicks;
518
+ target.customEvents += source.customEvents;
519
+ target.outboundClicks += source.outboundClicks;
520
+ target.sessions += source.sessions;
521
+ target.visitors += source.visitors;
522
+ target.conversions += source.conversions;
523
+ target.revenueCents += source.revenueCents;
524
+ }
525
+ function validateSiteIds(siteIds) {
526
+ const unique = [...new Set(siteIds)];
527
+ if (unique.length < 1 || unique.length > MAX_REPORT_SITES || unique.length !== siteIds.length) {
528
+ fail("INVALID_ARGUMENT", `siteIds must contain 1-${MAX_REPORT_SITES} unique IDs`);
529
+ }
530
+ return unique;
531
+ }
532
+ function validateRange(from, to, maxDays) {
533
+ if (!Number.isFinite(from) ||
534
+ !Number.isFinite(to) ||
535
+ from < 0 ||
536
+ to <= from ||
537
+ to - from > maxDays * DAY_MS) {
538
+ fail("INVALID_ARGUMENT", `range must be positive, ordered, and at most ${maxDays} days`);
539
+ }
540
+ return { from: Math.trunc(from), to: Math.trunc(to) };
541
+ }
542
+ function parseManualPagination(options) {
543
+ validatePagination(options);
544
+ if (options.cursor === null) {
545
+ return { offset: 0, numItems: options.numItems };
546
+ }
547
+ let decoded;
548
+ try {
549
+ decoded = JSON.parse(atob(options.cursor));
550
+ }
551
+ catch {
552
+ fail("INVALID_ARGUMENT", "pagination cursor is malformed");
553
+ }
554
+ if (!isPlainRecord(decoded) ||
555
+ decoded.v !== 1 ||
556
+ typeof decoded.o !== "number" ||
557
+ !Number.isSafeInteger(decoded.o) ||
558
+ decoded.o < 0 ||
559
+ decoded.o > MAX_MANUAL_PAGINATION_OFFSET) {
560
+ fail("INVALID_ARGUMENT", "pagination cursor is invalid or exceeds the offset limit");
561
+ }
562
+ return { offset: decoded.o, numItems: options.numItems };
563
+ }
564
+ function manualPaginationResult(rows, pagination) {
565
+ const page = rows.slice(pagination.offset, pagination.offset + pagination.numItems);
566
+ const nextOffset = pagination.offset + page.length;
567
+ const isDone = rows.length <= pagination.offset + pagination.numItems ||
568
+ nextOffset >= MAX_MANUAL_PAGINATION_OFFSET;
569
+ return {
570
+ page,
571
+ isDone,
572
+ continueCursor: btoa(JSON.stringify({
573
+ v: 1,
574
+ o: Math.min(nextOffset, MAX_MANUAL_PAGINATION_OFFSET),
575
+ })),
576
+ };
577
+ }
578
+ function validatePagination(options) {
579
+ if (!Number.isSafeInteger(options.numItems) || options.numItems < 1 || options.numItems > 100) {
580
+ fail("INVALID_ARGUMENT", "pagination numItems must be an integer between 1 and 100");
581
+ }
582
+ if (options.maximumRowsRead !== undefined &&
583
+ (!Number.isSafeInteger(options.maximumRowsRead) ||
584
+ options.maximumRowsRead < 1 ||
585
+ options.maximumRowsRead > 1_000)) {
586
+ fail("INVALID_ARGUMENT", "maximumRowsRead must be an integer between 1 and 1000");
587
+ }
588
+ if (options.maximumBytesRead !== undefined &&
589
+ (!Number.isSafeInteger(options.maximumBytesRead) ||
590
+ options.maximumBytesRead < 1 ||
591
+ options.maximumBytesRead > 8_000_000)) {
592
+ fail("INVALID_ARGUMENT", "maximumBytesRead must be an integer between 1 and 8000000");
593
+ }
594
+ }
595
+ //# sourceMappingURL=reports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/component/reports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare const cleanup: import("convex/server").RegisteredMutation<"public", {
2
+ batchSize?: number | undefined;
3
+ before: number;
4
+ kind: "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelSteps" | "goalCompletions" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
5
+ siteId: import("convex/values").GenericId<"sites">;
6
+ }, Promise<{
7
+ deleted: number;
8
+ hasMore: boolean;
9
+ }>>;
10
+ //# sourceMappingURL=retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/component/retention.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,OAAO;;;;;;;;GA+BlB,CAAC"}