@iann29/rastro 0.1.0-alpha.8 → 0.1.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 (105) hide show
  1. package/README.md +274 -75
  2. package/agent/integration.md +223 -65
  3. package/agent/manifest.json +34 -13
  4. package/agent/manifest.schema.json +53 -11
  5. package/dist/client/federation.d.ts +196 -11
  6. package/dist/client/federation.d.ts.map +1 -1
  7. package/dist/client/federation.js +160 -6
  8. package/dist/client/federation.js.map +1 -1
  9. package/dist/client/heat.d.ts +37 -0
  10. package/dist/client/heat.d.ts.map +1 -0
  11. package/dist/client/heat.js +43 -0
  12. package/dist/client/heat.js.map +1 -0
  13. package/dist/client/index.d.ts +448 -105
  14. package/dist/client/index.d.ts.map +1 -1
  15. package/dist/client/index.js +207 -17
  16. package/dist/client/index.js.map +1 -1
  17. package/dist/component/_generated/api.d.ts +6 -0
  18. package/dist/component/_generated/api.d.ts.map +1 -1
  19. package/dist/component/_generated/api.js.map +1 -1
  20. package/dist/component/_generated/component.d.ts +53 -16
  21. package/dist/component/_generated/component.d.ts.map +1 -1
  22. package/dist/component/constants.d.ts +5 -1
  23. package/dist/component/constants.d.ts.map +1 -1
  24. package/dist/component/constants.js +8 -1
  25. package/dist/component/constants.js.map +1 -1
  26. package/dist/component/coverage.d.ts +9 -0
  27. package/dist/component/coverage.d.ts.map +1 -1
  28. package/dist/component/coverage.js +36 -6
  29. package/dist/component/coverage.js.map +1 -1
  30. package/dist/component/eventStore.d.ts +1 -1
  31. package/dist/component/geo.d.ts +2 -0
  32. package/dist/component/geo.d.ts.map +1 -1
  33. package/dist/component/geo.js +56 -19
  34. package/dist/component/geo.js.map +1 -1
  35. package/dist/component/http.d.ts.map +1 -1
  36. package/dist/component/http.js +49 -27
  37. package/dist/component/http.js.map +1 -1
  38. package/dist/component/ingest.d.ts +1 -1
  39. package/dist/component/ingest.d.ts.map +1 -1
  40. package/dist/component/ingest.js +252 -305
  41. package/dist/component/ingest.js.map +1 -1
  42. package/dist/component/localTime.d.ts +25 -0
  43. package/dist/component/localTime.d.ts.map +1 -0
  44. package/dist/component/localTime.js +126 -0
  45. package/dist/component/localTime.js.map +1 -0
  46. package/dist/component/reports.d.ts +46 -15
  47. package/dist/component/reports.d.ts.map +1 -1
  48. package/dist/component/reports.js +193 -38
  49. package/dist/component/reports.js.map +1 -1
  50. package/dist/component/retention.js +26 -8
  51. package/dist/component/retention.js.map +1 -1
  52. package/dist/component/rollupStore.d.ts +320 -0
  53. package/dist/component/rollupStore.d.ts.map +1 -0
  54. package/dist/component/rollupStore.js +596 -0
  55. package/dist/component/rollupStore.js.map +1 -0
  56. package/dist/component/rollups.d.ts +20 -0
  57. package/dist/component/rollups.d.ts.map +1 -0
  58. package/dist/component/rollups.js +73 -0
  59. package/dist/component/rollups.js.map +1 -0
  60. package/dist/component/sanitize.d.ts +5 -0
  61. package/dist/component/sanitize.d.ts.map +1 -1
  62. package/dist/component/sanitize.js +15 -0
  63. package/dist/component/sanitize.js.map +1 -1
  64. package/dist/component/schema.d.ts +349 -15
  65. package/dist/component/schema.js +25 -0
  66. package/dist/component/schema.js.map +1 -1
  67. package/dist/component/sites.d.ts +12 -0
  68. package/dist/component/sites.d.ts.map +1 -1
  69. package/dist/component/sites.js +30 -0
  70. package/dist/component/sites.js.map +1 -1
  71. package/dist/component/validators.d.ts +41 -20
  72. package/dist/component/validators.d.ts.map +1 -1
  73. package/dist/component/validators.js +24 -3
  74. package/dist/component/validators.js.map +1 -1
  75. package/dist/tracker/generated.d.ts +7 -4
  76. package/dist/tracker/generated.d.ts.map +1 -1
  77. package/dist/tracker/generated.js +7 -4
  78. package/dist/tracker/generated.js.map +1 -1
  79. package/dist/tracker/tracker.d.ts +1 -1
  80. package/dist/tracker/tracker.d.ts.map +1 -1
  81. package/dist/tracker/tracker.js +24 -2
  82. package/dist/tracker/tracker.js.map +1 -1
  83. package/dist/tracker.min.js +1 -1
  84. package/docs/federation-setup.md +104 -27
  85. package/docs/federation.md +168 -31
  86. package/docs/upgrading.md +191 -16
  87. package/llms.txt +9 -7
  88. package/package.json +2 -1
  89. package/src/component/_generated/api.ts +6 -0
  90. package/src/component/_generated/component.ts +50 -12
  91. package/src/component/constants.ts +8 -1
  92. package/src/component/coverage.ts +46 -6
  93. package/src/component/geo.ts +82 -28
  94. package/src/component/http.ts +62 -26
  95. package/src/component/ingest.ts +378 -440
  96. package/src/component/localTime.ts +167 -0
  97. package/src/component/reports.ts +261 -39
  98. package/src/component/retention.ts +25 -7
  99. package/src/component/rollupStore.ts +799 -0
  100. package/src/component/rollups.ts +82 -0
  101. package/src/component/sanitize.ts +14 -0
  102. package/src/component/schema.ts +35 -0
  103. package/src/component/sites.ts +32 -0
  104. package/src/component/validators.ts +28 -1
  105. package/src/tracker/generated.ts +12 -0
@@ -0,0 +1,596 @@
1
+ import { v } from "convex/values";
2
+ import { internal } from "./_generated/api.js";
3
+ import { addVisitor, createVisitorSketch, unionVisitorSketches, } from "./cardinality.js";
4
+ import { DAY_MS, MAX_FUNNEL_STEPS, MAX_SITE_MAP_ROUTES_PER_DAY, REPORT_ROLLUP_SHARDS, ROLLUP_FOLD_LEASE_MS, ROUTE_TRANSITION_SLOTS, SITE_MAP_OTHER_ROUTE, VITAL_PAGE_SLOTS, } from "./constants.js";
5
+ import { fail } from "./errors.js";
6
+ import { stableHash } from "./sanitize.js";
7
+ import { vitalMetricValidator } from "./validators.js";
8
+ import { mergeVitalHistograms, VITAL_ALL, VITAL_OTHER_PAGES, } from "./vitals.js";
9
+ export function createReportRollupDeltas() {
10
+ return {
11
+ goals: new Map(),
12
+ funnels: new Map(),
13
+ funnelSteps: new Map(),
14
+ affiliates: new Map(),
15
+ vitals: new Map(),
16
+ routes: new Map(),
17
+ };
18
+ }
19
+ export function reportRollupCoordinates(siteId, definitionId, timestamp, visitorId) {
20
+ const bucketStart = Math.floor(timestamp / DAY_MS) * DAY_MS;
21
+ const shard = stableHash(visitorId) % REPORT_ROLLUP_SHARDS;
22
+ return {
23
+ bucketStart,
24
+ shard,
25
+ key: `${siteId}:${definitionId}:${bucketStart}:${shard}`,
26
+ };
27
+ }
28
+ export function countReportRollupRows(deltas) {
29
+ return (deltas.goals.size +
30
+ deltas.funnels.size +
31
+ deltas.funnelSteps.size +
32
+ deltas.affiliates.size +
33
+ deltas.vitals.size +
34
+ deltas.routes.size);
35
+ }
36
+ // ---------------------------------------------------------------------------
37
+ // The queue document: the same deltas, serialized. Visitor identity travels as
38
+ // the bounded list of keys a batch saw (a batch is one browser, so usually
39
+ // one) and only becomes a sketch when it is folded into the row.
40
+ const queuedGoalValidator = v.object({
41
+ goalId: v.id("goals"),
42
+ bucketStart: v.number(),
43
+ shard: v.number(),
44
+ goalKey: v.string(),
45
+ completions: v.number(),
46
+ valueCents: v.number(),
47
+ });
48
+ const queuedFunnelValidator = v.object({
49
+ funnelId: v.id("funnels"),
50
+ bucketStart: v.number(),
51
+ shard: v.number(),
52
+ steps: v.array(v.object({
53
+ step: v.number(),
54
+ entrants: v.number(),
55
+ completions: v.number(),
56
+ })),
57
+ });
58
+ const queuedFunnelStepValidator = v.object({
59
+ funnelId: v.id("funnels"),
60
+ bucketStart: v.number(),
61
+ step: v.number(),
62
+ shard: v.number(),
63
+ entrants: v.number(),
64
+ completions: v.number(),
65
+ });
66
+ const queuedAffiliateValidator = v.object({
67
+ affiliateId: v.id("affiliates"),
68
+ bucketStart: v.number(),
69
+ shard: v.number(),
70
+ affiliateSlug: v.string(),
71
+ visits: v.number(),
72
+ visitorKeys: v.array(v.string()),
73
+ conversions: v.number(),
74
+ revenueCents: v.number(),
75
+ commissionCents: v.number(),
76
+ });
77
+ const queuedRouteValidator = v.object({
78
+ route: v.string(),
79
+ bucketStart: v.number(),
80
+ shard: v.number(),
81
+ pageviews: v.number(),
82
+ entries: v.number(),
83
+ continued: v.number(),
84
+ dwellMs: v.number(),
85
+ dwellSamples: v.number(),
86
+ visitorKeys: v.array(v.string()),
87
+ outgoing: v.array(v.object({ route: v.string(), count: v.number() })),
88
+ });
89
+ const queuedVitalValidator = v.object({
90
+ bucketStart: v.number(),
91
+ device: v.string(),
92
+ page: v.string(),
93
+ shard: v.number(),
94
+ metrics: v.array(v.object({
95
+ metric: vitalMetricValidator,
96
+ count: v.number(),
97
+ sum: v.number(),
98
+ histogram: v.array(v.number()),
99
+ })),
100
+ });
101
+ export const reportRollupQueueFields = {
102
+ siteId: v.id("sites"),
103
+ createdAt: v.number(),
104
+ goals: v.array(queuedGoalValidator),
105
+ funnels: v.array(queuedFunnelValidator),
106
+ funnelSteps: v.array(queuedFunnelStepValidator),
107
+ affiliates: v.array(queuedAffiliateValidator),
108
+ routes: v.array(queuedRouteValidator),
109
+ vitals: v.array(queuedVitalValidator),
110
+ };
111
+ export const rollupFoldStateFields = {
112
+ siteId: v.id("sites"),
113
+ leaseUntil: v.number(),
114
+ token: v.string(),
115
+ };
116
+ function serializeReportRollupDeltas(siteId, deltas, createdAt) {
117
+ return {
118
+ siteId,
119
+ createdAt,
120
+ goals: [...deltas.goals.values()].map(({ goalId, bucketStart, shard, goalKey, completions, valueCents }) => ({
121
+ goalId,
122
+ bucketStart,
123
+ shard,
124
+ goalKey,
125
+ completions,
126
+ valueCents,
127
+ })),
128
+ funnels: [...deltas.funnels.values()].map(({ funnelId, bucketStart, shard, steps }) => ({
129
+ funnelId,
130
+ bucketStart,
131
+ shard,
132
+ steps: [...steps.values()].map((step) => ({ ...step })),
133
+ })),
134
+ funnelSteps: [...deltas.funnelSteps.values()].map(({ funnelId, bucketStart, step, shard, entrants, completions }) => ({
135
+ funnelId,
136
+ bucketStart,
137
+ step,
138
+ shard,
139
+ entrants,
140
+ completions,
141
+ })),
142
+ affiliates: [...deltas.affiliates.values()].map(({ siteId: _siteId, visitorKeys, ...rest }) => ({
143
+ ...rest,
144
+ visitorKeys: [...visitorKeys],
145
+ })),
146
+ routes: [...deltas.routes.values()].map(({ siteId: _siteId, visitorKeys, outgoing, ...rest }) => ({
147
+ ...rest,
148
+ visitorKeys: [...visitorKeys],
149
+ outgoing: [...outgoing].map(([route, count]) => ({ route, count })),
150
+ })),
151
+ vitals: [...deltas.vitals.values()].map(({ siteId: _siteId, metrics, ...rest }) => ({
152
+ ...rest,
153
+ metrics: [...metrics].map(([metric, entry]) => ({
154
+ metric,
155
+ count: entry.count,
156
+ sum: entry.sum,
157
+ histogram: [...entry.histogram],
158
+ })),
159
+ })),
160
+ };
161
+ }
162
+ /** Accumulates one queued document into the deltas the fold will write. */
163
+ export function mergeQueuedRollups(deltas, queued) {
164
+ const siteId = queued.siteId;
165
+ for (const goal of queued.goals) {
166
+ const key = `${siteId}:${goal.goalId}:${goal.bucketStart}:${goal.shard}`;
167
+ const current = deltas.goals.get(key) ?? {
168
+ siteId,
169
+ goalId: goal.goalId,
170
+ bucketStart: goal.bucketStart,
171
+ shard: goal.shard,
172
+ goalKey: goal.goalKey,
173
+ completions: 0,
174
+ valueCents: 0,
175
+ };
176
+ current.completions += goal.completions;
177
+ current.valueCents += goal.valueCents;
178
+ current.goalKey = goal.goalKey;
179
+ deltas.goals.set(key, current);
180
+ }
181
+ for (const funnel of queued.funnels) {
182
+ const key = `${siteId}:${funnel.funnelId}:${funnel.bucketStart}:${funnel.shard}`;
183
+ const current = deltas.funnels.get(key) ?? {
184
+ siteId,
185
+ funnelId: funnel.funnelId,
186
+ bucketStart: funnel.bucketStart,
187
+ shard: funnel.shard,
188
+ steps: new Map(),
189
+ };
190
+ for (const step of funnel.steps) {
191
+ const entry = current.steps.get(step.step) ?? {
192
+ step: step.step,
193
+ entrants: 0,
194
+ completions: 0,
195
+ };
196
+ entry.entrants += step.entrants;
197
+ entry.completions += step.completions;
198
+ current.steps.set(step.step, entry);
199
+ }
200
+ deltas.funnels.set(key, current);
201
+ }
202
+ for (const step of queued.funnelSteps) {
203
+ const key = `${siteId}:${step.funnelId}:${step.bucketStart}:${step.step}:${step.shard}`;
204
+ const current = deltas.funnelSteps.get(key) ?? {
205
+ siteId,
206
+ funnelId: step.funnelId,
207
+ bucketStart: step.bucketStart,
208
+ step: step.step,
209
+ shard: step.shard,
210
+ entrants: 0,
211
+ completions: 0,
212
+ };
213
+ current.entrants += step.entrants;
214
+ current.completions += step.completions;
215
+ deltas.funnelSteps.set(key, current);
216
+ }
217
+ for (const affiliate of queued.affiliates) {
218
+ const key = `${siteId}:${affiliate.affiliateId}:${affiliate.bucketStart}:${affiliate.shard}`;
219
+ const current = deltas.affiliates.get(key) ?? {
220
+ siteId,
221
+ affiliateId: affiliate.affiliateId,
222
+ bucketStart: affiliate.bucketStart,
223
+ shard: affiliate.shard,
224
+ affiliateSlug: affiliate.affiliateSlug,
225
+ visits: 0,
226
+ visitorKeys: new Set(),
227
+ conversions: 0,
228
+ revenueCents: 0,
229
+ commissionCents: 0,
230
+ };
231
+ current.affiliateSlug = affiliate.affiliateSlug;
232
+ current.visits += affiliate.visits;
233
+ current.conversions += affiliate.conversions;
234
+ current.revenueCents += affiliate.revenueCents;
235
+ current.commissionCents += affiliate.commissionCents;
236
+ for (const visitorKey of affiliate.visitorKeys) {
237
+ current.visitorKeys.add(visitorKey);
238
+ }
239
+ deltas.affiliates.set(key, current);
240
+ }
241
+ for (const route of queued.routes) {
242
+ const key = `${siteId}:route:${route.route}:${route.bucketStart}:${route.shard}`;
243
+ const current = deltas.routes.get(key) ?? {
244
+ siteId,
245
+ bucketStart: route.bucketStart,
246
+ shard: route.shard,
247
+ route: route.route,
248
+ pageviews: 0,
249
+ entries: 0,
250
+ continued: 0,
251
+ dwellMs: 0,
252
+ dwellSamples: 0,
253
+ visitorKeys: new Set(),
254
+ outgoing: new Map(),
255
+ };
256
+ current.pageviews += route.pageviews;
257
+ current.entries += route.entries;
258
+ current.continued += route.continued;
259
+ current.dwellMs += route.dwellMs;
260
+ current.dwellSamples += route.dwellSamples;
261
+ for (const visitorKey of route.visitorKeys) {
262
+ current.visitorKeys.add(visitorKey);
263
+ }
264
+ for (const transition of route.outgoing) {
265
+ current.outgoing.set(transition.route, (current.outgoing.get(transition.route) ?? 0) + transition.count);
266
+ }
267
+ deltas.routes.set(key, current);
268
+ }
269
+ for (const vital of queued.vitals) {
270
+ const key = JSON.stringify([
271
+ siteId,
272
+ vital.bucketStart,
273
+ vital.device,
274
+ vital.page,
275
+ vital.shard,
276
+ ]);
277
+ const current = deltas.vitals.get(key) ?? {
278
+ siteId,
279
+ bucketStart: vital.bucketStart,
280
+ device: vital.device,
281
+ page: vital.page,
282
+ shard: vital.shard,
283
+ metrics: new Map(),
284
+ };
285
+ for (const metric of vital.metrics) {
286
+ const entry = current.metrics.get(metric.metric);
287
+ if (entry) {
288
+ entry.count += metric.count;
289
+ entry.sum += metric.sum;
290
+ entry.histogram = mergeVitalHistograms(entry.histogram, metric.histogram);
291
+ }
292
+ else {
293
+ current.metrics.set(metric.metric, {
294
+ count: metric.count,
295
+ sum: metric.sum,
296
+ histogram: [...metric.histogram],
297
+ });
298
+ }
299
+ }
300
+ deltas.vitals.set(key, current);
301
+ }
302
+ }
303
+ /**
304
+ * Appends a batch's rollup deltas to the site's queue and makes sure a fold
305
+ * job will pick them up. The only document this reads is the site's fold
306
+ * state, which the fold job rewrites about twice a minute under load, so
307
+ * concurrent ingests almost never retry because of it.
308
+ */
309
+ export async function enqueueReportRollups(ctx, siteId, deltas, now) {
310
+ if (countReportRollupRows(deltas) === 0)
311
+ return;
312
+ await ctx.db.insert("reportRollupQueue", serializeReportRollupDeltas(siteId, deltas, now));
313
+ await ensureRollupFold(ctx, siteId, now);
314
+ }
315
+ export async function ensureRollupFold(ctx, siteId, now) {
316
+ const state = await ctx.db
317
+ .query("rollupFoldStates")
318
+ .withIndex("by_siteId", (range) => range.eq("siteId", siteId))
319
+ .unique();
320
+ if (state && state.leaseUntil > now)
321
+ return;
322
+ const token = crypto.randomUUID();
323
+ const leaseUntil = now + ROLLUP_FOLD_LEASE_MS;
324
+ if (state) {
325
+ await ctx.db.patch("rollupFoldStates", state._id, { leaseUntil, token });
326
+ }
327
+ else {
328
+ await ctx.db.insert("rollupFoldStates", { siteId, leaseUntil, token });
329
+ }
330
+ await ctx.scheduler.runAfter(0, internal.rollups.fold, { siteId, token });
331
+ }
332
+ // ---------------------------------------------------------------------------
333
+ // Writing the rows. Only the fold job calls this, one site at a time.
334
+ export async function flushReportRollups(ctx, deltas) {
335
+ for (const delta of deltas.goals.values()) {
336
+ const existing = await ctx.db
337
+ .query("goalDailyRollups")
338
+ .withIndex("by_siteId_and_goalId_and_bucketStart_and_shard", (range) => range
339
+ .eq("siteId", delta.siteId)
340
+ .eq("goalId", delta.goalId)
341
+ .eq("bucketStart", delta.bucketStart)
342
+ .eq("shard", delta.shard))
343
+ .unique();
344
+ const fields = {
345
+ siteId: delta.siteId,
346
+ goalId: delta.goalId,
347
+ bucketStart: delta.bucketStart,
348
+ shard: delta.shard,
349
+ generation: 1,
350
+ goalKey: delta.goalKey,
351
+ completions: (existing?.completions ?? 0) + delta.completions,
352
+ valueCents: (existing?.valueCents ?? 0) + delta.valueCents,
353
+ };
354
+ if (existing) {
355
+ await ctx.db.replace("goalDailyRollups", existing._id, fields);
356
+ }
357
+ else {
358
+ await ctx.db.insert("goalDailyRollups", fields);
359
+ }
360
+ }
361
+ for (const delta of deltas.funnels.values()) {
362
+ const existing = await ctx.db
363
+ .query("funnelDailyRollups")
364
+ .withIndex("by_siteId_and_funnelId_and_bucketStart_and_shard", (range) => range
365
+ .eq("siteId", delta.siteId)
366
+ .eq("funnelId", delta.funnelId)
367
+ .eq("bucketStart", delta.bucketStart)
368
+ .eq("shard", delta.shard))
369
+ .unique();
370
+ const steps = existing?.steps.map((step) => ({ ...step })) ?? [];
371
+ for (const addition of delta.steps.values()) {
372
+ const current = steps.find((step) => step.step === addition.step);
373
+ if (current) {
374
+ current.entrants += addition.entrants;
375
+ current.completions += addition.completions;
376
+ }
377
+ else {
378
+ if (steps.length >= MAX_FUNNEL_STEPS) {
379
+ fail("LIMIT_EXCEEDED", "daily funnel rollup step limit exceeded");
380
+ }
381
+ steps.push({ ...addition });
382
+ }
383
+ }
384
+ const fields = {
385
+ siteId: delta.siteId,
386
+ funnelId: delta.funnelId,
387
+ bucketStart: delta.bucketStart,
388
+ shard: delta.shard,
389
+ generation: 1,
390
+ steps,
391
+ };
392
+ if (existing) {
393
+ await ctx.db.replace("funnelDailyRollups", existing._id, fields);
394
+ }
395
+ else {
396
+ await ctx.db.insert("funnelDailyRollups", fields);
397
+ }
398
+ }
399
+ for (const delta of deltas.funnelSteps.values()) {
400
+ const bucket = await ctx.db
401
+ .query("funnelStepBuckets")
402
+ .withIndex("by_siteId_and_funnelId_and_bucketStart_and_step_and_shard", (range) => range
403
+ .eq("siteId", delta.siteId)
404
+ .eq("funnelId", delta.funnelId)
405
+ .eq("bucketStart", delta.bucketStart)
406
+ .eq("step", delta.step)
407
+ .eq("shard", delta.shard))
408
+ .unique();
409
+ if (bucket) {
410
+ await ctx.db.patch("funnelStepBuckets", bucket._id, {
411
+ entrants: bucket.entrants + delta.entrants,
412
+ completions: bucket.completions + delta.completions,
413
+ });
414
+ }
415
+ else {
416
+ await ctx.db.insert("funnelStepBuckets", {
417
+ siteId: delta.siteId,
418
+ funnelId: delta.funnelId,
419
+ bucketStart: delta.bucketStart,
420
+ step: delta.step,
421
+ shard: delta.shard,
422
+ entrants: delta.entrants,
423
+ completions: delta.completions,
424
+ });
425
+ }
426
+ }
427
+ for (const delta of deltas.affiliates.values()) {
428
+ const existing = await ctx.db
429
+ .query("affiliateDailyRollups")
430
+ .withIndex("by_siteId_and_affiliateId_and_bucketStart_and_shard", (range) => range
431
+ .eq("siteId", delta.siteId)
432
+ .eq("affiliateId", delta.affiliateId)
433
+ .eq("bucketStart", delta.bucketStart)
434
+ .eq("shard", delta.shard))
435
+ .unique();
436
+ const fields = {
437
+ siteId: delta.siteId,
438
+ affiliateId: delta.affiliateId,
439
+ bucketStart: delta.bucketStart,
440
+ shard: delta.shard,
441
+ generation: 1,
442
+ affiliateSlug: delta.affiliateSlug,
443
+ visits: (existing?.visits ?? 0) + delta.visits,
444
+ visitorSketch: sketchWithKeys(existing?.visitorSketch, delta.visitorKeys),
445
+ conversions: (existing?.conversions ?? 0) + delta.conversions,
446
+ revenueCents: (existing?.revenueCents ?? 0) + delta.revenueCents,
447
+ commissionCents: (existing?.commissionCents ?? 0) + delta.commissionCents,
448
+ };
449
+ if (existing) {
450
+ await ctx.db.replace("affiliateDailyRollups", existing._id, fields);
451
+ }
452
+ else {
453
+ await ctx.db.insert("affiliateDailyRollups", fields);
454
+ }
455
+ }
456
+ const routeDayRowCounts = new Map();
457
+ for (const delta of deltas.routes.values()) {
458
+ await upsertRouteRollup(ctx, delta, routeDayRowCounts);
459
+ }
460
+ for (const delta of deltas.vitals.values()) {
461
+ await upsertVitalRollup(ctx, delta);
462
+ }
463
+ }
464
+ function sketchWithKeys(existing, visitorKeys) {
465
+ let sketch = createVisitorSketch();
466
+ for (const visitorKey of visitorKeys) {
467
+ sketch = addVisitor(sketch, visitorKey);
468
+ }
469
+ return existing ? unionVisitorSketches(existing, sketch) : sketch;
470
+ }
471
+ async function upsertRouteRollup(ctx, delta, dayRowCounts) {
472
+ const existing = await ctx.db
473
+ .query("routeDailyRollups")
474
+ .withIndex("by_siteId_and_route_and_bucketStart_and_shard", (range) => range
475
+ .eq("siteId", delta.siteId)
476
+ .eq("route", delta.route)
477
+ .eq("bucketStart", delta.bucketStart)
478
+ .eq("shard", delta.shard))
479
+ .unique();
480
+ if (!existing && delta.route !== SITE_MAP_OTHER_ROUTE) {
481
+ // A new route row spends one bounded read per fold to respect the daily
482
+ // cap; past it, the day's remaining routes fold into "(other)".
483
+ const capRows = MAX_SITE_MAP_ROUTES_PER_DAY * REPORT_ROLLUP_SHARDS;
484
+ const dayKey = `${delta.siteId}:${delta.bucketStart}`;
485
+ let dayRows = dayRowCounts.get(dayKey);
486
+ if (dayRows === undefined) {
487
+ dayRows = (await ctx.db
488
+ .query("routeDailyRollups")
489
+ .withIndex("by_siteId_and_bucketStart", (range) => range
490
+ .eq("siteId", delta.siteId)
491
+ .eq("bucketStart", delta.bucketStart))
492
+ .take(capRows + 1)).length;
493
+ }
494
+ if (dayRows >= capRows) {
495
+ await upsertRouteRollup(ctx, { ...delta, route: SITE_MAP_OTHER_ROUTE }, dayRowCounts);
496
+ return;
497
+ }
498
+ dayRowCounts.set(dayKey, dayRows + 1);
499
+ }
500
+ const outgoing = existing?.outgoing.map((entry) => ({ ...entry })) ?? [];
501
+ for (const [target, count] of delta.outgoing) {
502
+ let entry = outgoing.find((candidate) => candidate.route === target);
503
+ if (!entry) {
504
+ const named = outgoing.filter((candidate) => candidate.route !== SITE_MAP_OTHER_ROUTE).length;
505
+ const route = target !== SITE_MAP_OTHER_ROUTE && named >= ROUTE_TRANSITION_SLOTS
506
+ ? SITE_MAP_OTHER_ROUTE
507
+ : target;
508
+ entry = outgoing.find((candidate) => candidate.route === route);
509
+ if (!entry) {
510
+ entry = { route, count: 0 };
511
+ outgoing.push(entry);
512
+ }
513
+ }
514
+ entry.count += count;
515
+ }
516
+ const fields = {
517
+ siteId: delta.siteId,
518
+ bucketStart: delta.bucketStart,
519
+ shard: delta.shard,
520
+ generation: 1,
521
+ route: delta.route,
522
+ pageviews: (existing?.pageviews ?? 0) + delta.pageviews,
523
+ entries: (existing?.entries ?? 0) + delta.entries,
524
+ continued: (existing?.continued ?? 0) + delta.continued,
525
+ dwellMs: (existing?.dwellMs ?? 0) + delta.dwellMs,
526
+ dwellSamples: (existing?.dwellSamples ?? 0) + delta.dwellSamples,
527
+ visitorSketch: sketchWithKeys(existing?.visitorSketch, delta.visitorKeys),
528
+ outgoing,
529
+ };
530
+ if (existing) {
531
+ await ctx.db.replace("routeDailyRollups", existing._id, fields);
532
+ }
533
+ else {
534
+ await ctx.db.insert("routeDailyRollups", fields);
535
+ }
536
+ }
537
+ async function upsertVitalRollup(ctx, delta) {
538
+ const existing = await ctx.db
539
+ .query("vitalRollups")
540
+ .withIndex("by_key", (range) => range
541
+ .eq("siteId", delta.siteId)
542
+ .eq("bucketStart", delta.bucketStart)
543
+ .eq("device", delta.device)
544
+ .eq("page", delta.page)
545
+ .eq("shard", delta.shard))
546
+ .unique();
547
+ if (!existing &&
548
+ delta.device === VITAL_ALL &&
549
+ delta.page !== VITAL_OTHER_PAGES) {
550
+ // A new page row spends one bounded read to respect the daily page slots;
551
+ // past the cap, the day's remaining pages fold into "(other)".
552
+ const pageRows = await ctx.db
553
+ .query("vitalRollups")
554
+ .withIndex("by_key", (range) => range
555
+ .eq("siteId", delta.siteId)
556
+ .eq("bucketStart", delta.bucketStart)
557
+ .eq("device", VITAL_ALL))
558
+ .take(VITAL_PAGE_SLOTS * REPORT_ROLLUP_SHARDS + 1);
559
+ if (pageRows.length > VITAL_PAGE_SLOTS * REPORT_ROLLUP_SHARDS) {
560
+ await upsertVitalRollup(ctx, { ...delta, page: VITAL_OTHER_PAGES });
561
+ return;
562
+ }
563
+ }
564
+ const metrics = existing?.metrics.map((entry) => ({ ...entry })) ?? [];
565
+ for (const [metric, addition] of delta.metrics) {
566
+ const entry = metrics.find((candidate) => candidate.metric === metric);
567
+ if (entry) {
568
+ entry.count += addition.count;
569
+ entry.sum += addition.sum;
570
+ entry.histogram = mergeVitalHistograms(entry.histogram, addition.histogram);
571
+ }
572
+ else {
573
+ metrics.push({
574
+ metric,
575
+ count: addition.count,
576
+ sum: addition.sum,
577
+ histogram: [...addition.histogram],
578
+ });
579
+ }
580
+ }
581
+ const fields = {
582
+ siteId: delta.siteId,
583
+ bucketStart: delta.bucketStart,
584
+ device: delta.device,
585
+ page: delta.page,
586
+ shard: delta.shard,
587
+ metrics,
588
+ };
589
+ if (existing) {
590
+ await ctx.db.replace("vitalRollups", existing._id, fields);
591
+ }
592
+ else {
593
+ await ctx.db.insert("vitalRollups", fields);
594
+ }
595
+ }
596
+ //# sourceMappingURL=rollupStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollupStore.js","sourceRoot":"","sources":["../../src/component/rollupStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,2BAA2B,EAC3B,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EACL,oBAAoB,EACpB,SAAS,EACT,iBAAiB,GAElB,MAAM,aAAa,CAAC;AAoFrB,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,OAAO,EAAE,IAAI,GAAG,EAAE;QAClB,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,MAAM,EAAE,IAAI,GAAG,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAmB,EACnB,YAAoB,EACpB,SAAiB,EACjB,SAAiB;IAEjB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;IAC5D,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,oBAAoB,CAAC;IAC3D,OAAO;QACL,WAAW;QACX,KAAK;QACL,GAAG,EAAE,GAAG,MAAM,IAAI,YAAY,IAAI,WAAW,IAAI,KAAK,EAAE;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA0B;IAC9D,OAAO,CACL,MAAM,CAAC,KAAK,CAAC,IAAI;QACjB,MAAM,CAAC,OAAO,CAAC,IAAI;QACnB,MAAM,CAAC,WAAW,CAAC,IAAI;QACvB,MAAM,CAAC,UAAU,CAAC,IAAI;QACtB,MAAM,CAAC,MAAM,CAAC,IAAI;QAClB,MAAM,CAAC,MAAM,CAAC,IAAI,CACnB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,iEAAiE;AAEjE,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AACH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;IACzB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;KACxB,CAAC,CACH;CACF,CAAC,CAAC;AACH,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;IACzB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;CACxB,CAAC,CAAC;AACH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;CAC5B,CAAC,CAAC;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CACtE,CAAC,CAAC;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,oBAAoB;QAC5B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC/B,CAAC,CACH;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC;IACnC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC;IAC/C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CACtC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IACrB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC;AAIF,SAAS,2BAA2B,CAClC,MAAmB,EACnB,MAA0B,EAC1B,SAAiB;IAEjB,OAAO;QACL,MAAM;QACN,SAAS;QACT,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CACnC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YACrE,MAAM;YACN,WAAW;YACX,KAAK;YACL,OAAO;YACP,WAAW;YACX,UAAU;SACX,CAAC,CACH;QACD,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CACvC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5C,QAAQ;YACR,WAAW;YACX,KAAK;YACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;SACxD,CAAC,CACH;QACD,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAC/C,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;YAClE,QAAQ;YACR,WAAW;YACX,IAAI;YACJ,KAAK;YACL,QAAQ;YACR,WAAW;SACZ,CAAC,CACH;QACD,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAC7C,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9C,GAAG,IAAI;YACP,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC;SAC9B,CAAC,CACH;QACD,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CACrC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACxD,GAAG,IAAI;YACP,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC;YAC7B,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SACpE,CAAC,CACH;QACD,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CACrC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAC1C,GAAG,IAAI;YACP,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;aAChC,CAAC,CAAC;SACJ,CAAC,CACH;KACF,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAChC,MAA0B,EAC1B,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACzE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YACvC,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,CAAC;YACd,UAAU,EAAE,CAAC;SACd,CAAC;QACF,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACxC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC;QACtC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YACzC,MAAM;YACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,IAAI,GAAG,EAAE;SACjB,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAC5C,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,CAAC;gBACX,WAAW,EAAE,CAAC;aACf,CAAC;YACF,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;YAChC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YAC7C,MAAM;YACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,CAAC;SACf,CAAC;QACF,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAClC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACxC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YAC5C,MAAM;YACN,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,MAAM,EAAE,CAAC;YACT,WAAW,EAAE,IAAI,GAAG,EAAU;YAC9B,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,eAAe,EAAE,CAAC;SACnB,CAAC;QACF,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC;QAChD,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC;QACnC,OAAO,CAAC,WAAW,IAAI,SAAS,CAAC,WAAW,CAAC;QAC7C,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,CAAC;QAC/C,OAAO,CAAC,eAAe,IAAI,SAAS,CAAC,eAAe,CAAC;QACrD,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;YAC/C,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,GAAG,MAAM,UAAU,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACjF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YACxC,MAAM;YACN,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;YACV,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,IAAI,GAAG,EAAU;YAC9B,QAAQ,EAAE,IAAI,GAAG,EAAkB;SACpC,CAAC;QACF,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QACrC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;QACjC,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC;QACrC,OAAO,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;QACjC,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC,YAAY,CAAC;QAC3C,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YAC3C,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAClB,UAAU,CAAC,KAAK,EAChB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;YACzB,MAAM;YACN,KAAK,CAAC,WAAW;YACjB,KAAK,CAAC,MAAM;YACZ,KAAK,CAAC,IAAI;YACV,KAAK,CAAC,KAAK;SACZ,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YACxC,MAAM;YACN,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,IAAI,GAAG,EAGb;SACJ,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC;gBAC5B,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;gBACxB,KAAK,CAAC,SAAS,GAAG,oBAAoB,CACpC,KAAK,CAAC,SAAS,EACf,MAAM,CAAC,SAAS,CACjB,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE;oBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAgB,EAChB,MAAmB,EACnB,MAA0B,EAC1B,GAAW;IAEX,IAAI,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO;IAChD,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CACjB,mBAAmB,EACnB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CACjD,CAAC;IACF,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAgB,EAChB,MAAmB,EACnB,GAAW;IAEX,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE;SACvB,KAAK,CAAC,kBAAkB,CAAC;SACzB,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;SAC7D,MAAM,EAAE,CAAC;IACZ,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG;QAAE,OAAO;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,GAAG,GAAG,oBAAoB,CAAC;IAC9C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,8EAA8E;AAC9E,sEAAsE;AAEtE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAgB,EAChB,MAA0B;IAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE;aAC1B,KAAK,CAAC,kBAAkB,CAAC;aACzB,SAAS,CAAC,gDAAgD,EAAE,CAAC,KAAK,EAAE,EAAE,CACrE,KAAK;aACF,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;aAC1B,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;aAC1B,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;aACpC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAC5B;aACA,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,CAAU;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW;YAC7D,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU;SAC3D,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE;aAC1B,KAAK,CAAC,oBAAoB,CAAC;aAC3B,SAAS,CAAC,kDAAkD,EAAE,CAAC,KAAK,EAAE,EAAE,CACvE,KAAK;aACF,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;aAC1B,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;aAC9B,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;aACpC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAC5B;aACA,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;gBACtC,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,IAAI,KAAK,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;oBACrC,IAAI,CAAC,gBAAgB,EAAE,yCAAyC,CAAC,CAAC;gBACpE,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,CAAU;YACtB,KAAK;SACN,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,oBAAoB,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;aACxB,KAAK,CAAC,mBAAmB,CAAC;aAC1B,SAAS,CACR,2DAA2D,EAC3D,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;aACF,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;aAC1B,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC;aAC9B,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;aACpC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;aACtB,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAC9B;aACA,MAAM,EAAE,CAAC;QACZ,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,EAAE;gBAClD,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ;gBAC1C,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW;aACpD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE;gBACvC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE;aAC1B,KAAK,CAAC,uBAAuB,CAAC;aAC9B,SAAS,CACR,qDAAqD,EACrD,CAAC,KAAK,EAAE,EAAE,CACR,KAAK;aACF,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;aAC1B,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;aACpC,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;aACpC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAC9B;aACA,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG;YACb,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,UAAU,EAAE,CAAU;YACtB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM;YAC9C,aAAa,EAAE,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;YACzE,WAAW,EAAE,CAAC,QAAQ,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW;YAC7D,YAAY,EAAE,CAAC,QAAQ,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY;YAChE,eAAe,EAAE,CAAC,QAAQ,EAAE,eAAe,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,eAAe;SAC1E,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,uBAAuB,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,QAAmC,EACnC,WAAwB;IAExB,IAAI,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACpE,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,GAAgB,EAChB,KAAuB,EACvB,YAAiC;IAEjC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE;SAC1B,KAAK,CAAC,mBAAmB,CAAC;SAC1B,SAAS,CAAC,+CAA+C,EAAE,CAAC,KAAK,EAAE,EAAE,CACpE,KAAK;SACF,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;SAC1B,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC;SACxB,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;SACpC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAC5B;SACA,MAAM,EAAE,CAAC;IACZ,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,oBAAoB,EAAE,CAAC;QACtD,wEAAwE;QACxE,gEAAgE;QAChE,MAAM,OAAO,GAAG,2BAA2B,GAAG,oBAAoB,CAAC;QACnE,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtD,IAAI,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,GAAG,CACR,MAAM,GAAG,CAAC,EAAE;iBACT,KAAK,CAAC,mBAAmB,CAAC;iBAC1B,SAAS,CAAC,2BAA2B,EAAE,CAAC,KAAK,EAAE,EAAE,CAChD,KAAK;iBACF,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;iBAC1B,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC,CACxC;iBACA,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CACrB,CAAC,MAAM,CAAC;QACX,CAAC;QACD,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;YACvB,MAAM,iBAAiB,CACrB,GAAG,EACH,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,EACzC,YAAY,CACb,CAAC;YACF,OAAO;QACT,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7C,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAC3B,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,oBAAoB,CACxD,CAAC,MAAM,CAAC;YACT,MAAM,KAAK,GACT,MAAM,KAAK,oBAAoB,IAAI,KAAK,IAAI,sBAAsB;gBAChE,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,MAAM,CAAC;YACb,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;IACvB,CAAC;IACD,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,UAAU,EAAE,CAAU;QACtB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS;QACvD,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO;QACjD,SAAS,EAAE,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS;QACvD,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO;QACjD,YAAY,EAAE,CAAC,QAAQ,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY;QAChE,aAAa,EAAE,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;QACzE,QAAQ;KACT,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAgB,EAAE,KAAuB;IACxE,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE;SAC1B,KAAK,CAAC,cAAc,CAAC;SACrB,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAC7B,KAAK;SACF,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;SAC1B,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;SACpC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;SAC1B,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;SACtB,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAC5B;SACA,MAAM,EAAE,CAAC;IACZ,IACE,CAAC,QAAQ;QACT,KAAK,CAAC,MAAM,KAAK,SAAS;QAC1B,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAChC,CAAC;QACD,0EAA0E;QAC1E,+DAA+D;QAC/D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE;aAC1B,KAAK,CAAC,cAAc,CAAC;aACrB,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAC7B,KAAK;aACF,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;aAC1B,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,WAAW,CAAC;aACpC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAC3B;aACA,IAAI,CAAC,gBAAgB,GAAG,oBAAoB,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,gBAAgB,GAAG,oBAAoB,EAAE,CAAC;YAC9D,MAAM,iBAAiB,CAAC,GAAG,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QACvE,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;YAC9B,KAAK,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC;YAC1B,KAAK,CAAC,SAAS,GAAG,oBAAoB,CACpC,KAAK,CAAC,SAAS,EACf,QAAQ,CAAC,SAAS,CACnB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM;gBACN,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;aACnC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO;KACR,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Folds a site's queued report rollup deltas into the rollup rows. Exactly
3
+ * one chain runs per site: ingestion starts one when no lease is held, every
4
+ * run carries the token of the lease it belongs to, and a run whose token is
5
+ * no longer current exits without touching anything. A run that finds more
6
+ * queued documents than it could take continues at once; a run that drains
7
+ * the queue releases the lease. A batch that lands while a run is draining
8
+ * is never stranded: the run read the queue range the batch inserted into
9
+ * and the batch read the lease the run released, so one of the two retries
10
+ * and sees the other's work.
11
+ */
12
+ export declare const fold: import("convex/server").RegisteredMutation<"internal", {
13
+ siteId: import("convex/values").GenericId<"sites">;
14
+ token: string;
15
+ }, Promise<{
16
+ folded: number;
17
+ remaining: boolean;
18
+ stale: boolean;
19
+ }>>;
20
+ //# sourceMappingURL=rollups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollups.d.ts","sourceRoot":"","sources":["../../src/component/rollups.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,IAAI;;;;;;;GAuDf,CAAC"}