@iann29/rastro 0.1.0-alpha.2 → 0.1.0-alpha.3

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 (70) hide show
  1. package/README.md +79 -30
  2. package/dist/component/_generated/api.d.ts +5 -5
  3. package/dist/component/_generated/api.d.ts.map +1 -1
  4. package/dist/component/_generated/api.js.map +1 -1
  5. package/dist/component/_generated/component.d.ts +10 -0
  6. package/dist/component/_generated/component.d.ts.map +1 -1
  7. package/dist/component/_generated/server.d.ts +4 -0
  8. package/dist/component/_generated/server.d.ts.map +1 -1
  9. package/dist/component/_generated/server.js.map +1 -1
  10. package/dist/component/convex.config.d.ts +7 -2
  11. package/dist/component/convex.config.d.ts.map +1 -1
  12. package/dist/component/convex.config.js +9 -4
  13. package/dist/component/convex.config.js.map +1 -1
  14. package/dist/component/diagnostics.d.ts +9 -0
  15. package/dist/component/diagnostics.d.ts.map +1 -0
  16. package/dist/component/diagnostics.js +47 -0
  17. package/dist/component/diagnostics.js.map +1 -0
  18. package/dist/component/eventStore.d.ts +11 -9
  19. package/dist/component/eventStore.d.ts.map +1 -1
  20. package/dist/component/eventStore.js +55 -227
  21. package/dist/component/eventStore.js.map +1 -1
  22. package/dist/component/geo.d.ts +71 -0
  23. package/dist/component/geo.d.ts.map +1 -0
  24. package/dist/component/geo.js +610 -0
  25. package/dist/component/geo.js.map +1 -0
  26. package/dist/component/http.d.ts.map +1 -1
  27. package/dist/component/http.js +124 -11
  28. package/dist/component/http.js.map +1 -1
  29. package/dist/component/ingest.d.ts.map +1 -1
  30. package/dist/component/ingest.js +34 -14
  31. package/dist/component/ingest.js.map +1 -1
  32. package/dist/component/reports.d.ts +8 -8
  33. package/dist/component/reports.d.ts.map +1 -1
  34. package/dist/component/reports.js +2 -1
  35. package/dist/component/reports.js.map +1 -1
  36. package/dist/component/schema.d.ts +15 -52
  37. package/dist/component/schema.js +14 -16
  38. package/dist/component/schema.js.map +1 -1
  39. package/dist/component/validators.d.ts +3 -50
  40. package/dist/component/validators.d.ts.map +1 -1
  41. package/dist/component/validators.js +4 -12
  42. package/dist/component/validators.js.map +1 -1
  43. package/dist/tracker/generated.d.ts +4 -4
  44. package/dist/tracker/generated.d.ts.map +1 -1
  45. package/dist/tracker/generated.js +4 -4
  46. package/dist/tracker/generated.js.map +1 -1
  47. package/dist/tracker/tracker.js +7 -6
  48. package/dist/tracker/tracker.js.map +1 -1
  49. package/dist/tracker.min.js +1 -1
  50. package/docs/benchmarks/2026-08-20-realistic.md +1 -1
  51. package/package.json +2 -6
  52. package/scripts/benchmark-ingest.mjs +81 -32
  53. package/src/component/_generated/api.ts +5 -5
  54. package/src/component/_generated/component.ts +13 -0
  55. package/src/component/_generated/server.ts +4 -0
  56. package/src/component/convex.config.ts +11 -5
  57. package/src/component/diagnostics.ts +64 -0
  58. package/src/component/eventStore.ts +78 -280
  59. package/src/component/geo.ts +779 -0
  60. package/src/component/http.ts +184 -17
  61. package/src/component/ingest.ts +49 -15
  62. package/src/component/reports.ts +4 -1
  63. package/src/component/schema.ts +15 -16
  64. package/src/component/validators.ts +4 -13
  65. package/src/test.ts +0 -2
  66. package/dist/component/migrations.d.ts +0 -17
  67. package/dist/component/migrations.d.ts.map +0 -1
  68. package/dist/component/migrations.js +0 -44
  69. package/dist/component/migrations.js.map +0 -1
  70. package/src/component/migrations.ts +0 -52
@@ -0,0 +1,610 @@
1
+ import { v } from "convex/values";
2
+ import { env, internalAction, internalMutation } from "./_generated/server.js";
3
+ import { AGGREGATE_SHARDS, DAY_MS, DIMENSION_SLOTS, HOURLY_AGGREGATE_SHARDS, HOUR_MS, MAX_BATCH_EVENT_GROUPS, MAX_BATCH_EVENTS, MAX_EVENTS_PER_SESSION_WINDOW, } from "./constants.js";
4
+ import { eventBatchKey, eventBucketStart } from "./eventStore.js";
5
+ import { isPlainRecord } from "./guards.js";
6
+ import { sanitizeContext, stableHash } from "./sanitize.js";
7
+ import { trackerEventValidator, } from "./validators.js";
8
+ const GEOIP_TIMEOUT_MS = 1_500;
9
+ const MAX_ENRICHMENT_SESSIONS = 4;
10
+ const DEFAULT_GEOIP_DAILY_LIMIT = 1_000;
11
+ const MAX_GEOIP_DAILY_LIMIT = 1_000_000;
12
+ const geoContextValidator = v.object({
13
+ country: v.optional(v.string()),
14
+ city: v.optional(v.string()),
15
+ latitude: v.optional(v.number()),
16
+ longitude: v.optional(v.number()),
17
+ });
18
+ const geoCandidateEventValidator = trackerEventValidator.pick("eventId", "sessionId", "visitorId", "timestamp", "sequence");
19
+ const geoAggregateEventValidator = v.object({
20
+ sessionId: v.string(),
21
+ timestamp: v.number(),
22
+ priorCountry: v.string(),
23
+ });
24
+ export const probe = internalAction({
25
+ args: { ip: v.optional(v.string()) },
26
+ returns: v.object({
27
+ ipAvailable: v.boolean(),
28
+ requestIpKind: v.union(v.literal("public"), v.literal("private"), v.literal("invalid"), v.literal("unavailable")),
29
+ provider: v.union(v.literal("ipinfo"), v.literal("ipwhois"), v.null()),
30
+ status: v.union(v.literal("disabled"), v.literal("ready"), v.literal("missingToken")),
31
+ location: v.union(geoContextValidator, v.null()),
32
+ }),
33
+ handler: async (ctx, args) => {
34
+ const metadata = await readRequestMetadata(ctx);
35
+ const provider = env.RASTRO_GEOIP_PROVIDER;
36
+ const status = geoIpStatus(provider, env.RASTRO_GEOIP_TOKEN);
37
+ const ip = args.ip && args.ip.length <= 64 ? args.ip : metadata.ip;
38
+ const location = ip && provider && status === "ready"
39
+ ? await resolveGeoIp(ip, provider, env.RASTRO_GEOIP_TOKEN)
40
+ : undefined;
41
+ return {
42
+ ipAvailable: metadata.ip !== null,
43
+ requestIpKind: classifyIp(metadata.ip),
44
+ provider: provider ?? null,
45
+ status,
46
+ location: location ?? null,
47
+ };
48
+ },
49
+ });
50
+ export const claimEnrichment = internalMutation({
51
+ args: {
52
+ siteId: v.id("sites"),
53
+ events: v.array(geoCandidateEventValidator),
54
+ dailyLimit: v.number(),
55
+ },
56
+ returns: v.object({
57
+ sessionIds: v.array(v.string()),
58
+ events: v.array(geoAggregateEventValidator),
59
+ }),
60
+ handler: async (ctx, args) => {
61
+ if (args.events.length === 0 ||
62
+ args.events.length > MAX_BATCH_EVENTS ||
63
+ !Number.isSafeInteger(args.dailyLimit) ||
64
+ args.dailyLimit < 0 ||
65
+ args.dailyLimit > MAX_GEOIP_DAILY_LIMIT) {
66
+ return { sessionIds: [], events: [] };
67
+ }
68
+ const groups = new Map();
69
+ for (const event of args.events) {
70
+ const bucketStart = eventBucketStart(event.timestamp);
71
+ const key = eventBatchKey(event.sessionId, bucketStart);
72
+ const group = groups.get(key) ?? {
73
+ sessionId: event.sessionId,
74
+ bucketStart,
75
+ eventIds: new Set(),
76
+ };
77
+ group.eventIds.add(event.eventId);
78
+ groups.set(key, group);
79
+ }
80
+ if (groups.size > MAX_BATCH_EVENT_GROUPS) {
81
+ return { sessionIds: [], events: [] };
82
+ }
83
+ const persistedEvents = new Map();
84
+ await Promise.all([...groups].map(async ([key, group]) => {
85
+ const batches = await ctx.db
86
+ .query("eventBatches")
87
+ .withIndex("by_siteId_and_sessionId_and_bucketStart", (range) => range
88
+ .eq("siteId", args.siteId)
89
+ .eq("sessionId", group.sessionId)
90
+ .eq("bucketStart", group.bucketStart))
91
+ .take(MAX_EVENTS_PER_SESSION_WINDOW + 1);
92
+ persistedEvents.set(key, new Map(batches.flatMap((batch) => batch.events
93
+ .filter((event) => group.eventIds.has(event.eventId))
94
+ .map((event) => [
95
+ event.eventId,
96
+ event.aggregateCountry ?? event.country,
97
+ ]))));
98
+ }));
99
+ const eligible = [];
100
+ const initialEvents = args.events.filter((event) => event.sequence === 0);
101
+ for (const event of initialEvents) {
102
+ if (eligible.includes(event.sessionId))
103
+ continue;
104
+ const persisted = persistedEvents.get(eventBatchKey(event.sessionId, eventBucketStart(event.timestamp)));
105
+ if (!persisted?.has(event.eventId))
106
+ continue;
107
+ const session = await ctx.db
108
+ .query("sessions")
109
+ .withIndex("by_siteId_and_sessionId", (range) => range.eq("siteId", args.siteId).eq("sessionId", event.sessionId))
110
+ .unique();
111
+ if (!session ||
112
+ session.visitorId !== event.visitorId ||
113
+ session.startedAt !== event.timestamp ||
114
+ session.geoLookupAttemptedAt !== undefined ||
115
+ (session.latitude !== undefined && session.longitude !== undefined)) {
116
+ continue;
117
+ }
118
+ eligible.push(event.sessionId);
119
+ }
120
+ const now = Date.now();
121
+ const dayStart = Math.floor(now / DAY_MS) * DAY_MS;
122
+ const budget = await ctx.db
123
+ .query("geoLookupBudgets")
124
+ .withIndex("by_siteId", (range) => range.eq("siteId", args.siteId))
125
+ .unique();
126
+ const used = budget?.dayStart === dayStart ? budget.count : 0;
127
+ const sessionIds = eligible.slice(0, Math.max(0, Math.min(MAX_ENRICHMENT_SESSIONS, args.dailyLimit - used)));
128
+ for (const sessionId of sessionIds) {
129
+ const session = await ctx.db
130
+ .query("sessions")
131
+ .withIndex("by_siteId_and_sessionId", (range) => range.eq("siteId", args.siteId).eq("sessionId", sessionId))
132
+ .unique();
133
+ if (!session || session.geoLookupAttemptedAt !== undefined)
134
+ continue;
135
+ await ctx.db.patch("sessions", session._id, {
136
+ geoLookupAttemptedAt: now,
137
+ });
138
+ }
139
+ if (sessionIds.length > 0) {
140
+ if (budget) {
141
+ await ctx.db.patch("geoLookupBudgets", budget._id, {
142
+ dayStart,
143
+ count: used + sessionIds.length,
144
+ });
145
+ }
146
+ else {
147
+ await ctx.db.insert("geoLookupBudgets", {
148
+ siteId: args.siteId,
149
+ dayStart,
150
+ count: sessionIds.length,
151
+ });
152
+ }
153
+ }
154
+ const claimed = new Set(sessionIds);
155
+ const seenEvents = new Set();
156
+ const correctionEvents = [];
157
+ for (const event of args.events) {
158
+ const key = `${eventBatchKey(event.sessionId, eventBucketStart(event.timestamp))}:${event.eventId}`;
159
+ if (seenEvents.has(key) ||
160
+ !claimed.has(event.sessionId) ||
161
+ !persistedEvents
162
+ .get(eventBatchKey(event.sessionId, eventBucketStart(event.timestamp)))
163
+ ?.has(event.eventId)) {
164
+ continue;
165
+ }
166
+ seenEvents.add(key);
167
+ const priorCountry = persistedEvents
168
+ .get(eventBatchKey(event.sessionId, eventBucketStart(event.timestamp)))
169
+ ?.get(event.eventId);
170
+ if (priorCountry === undefined)
171
+ continue;
172
+ correctionEvents.push({
173
+ sessionId: event.sessionId,
174
+ timestamp: event.timestamp,
175
+ priorCountry,
176
+ });
177
+ }
178
+ return { sessionIds, events: correctionEvents };
179
+ },
180
+ });
181
+ export const applyEnrichment = internalMutation({
182
+ args: {
183
+ siteId: v.id("sites"),
184
+ sessionIds: v.array(v.string()),
185
+ events: v.array(geoAggregateEventValidator),
186
+ context: geoContextValidator,
187
+ },
188
+ returns: v.number(),
189
+ handler: async (ctx, args) => {
190
+ if (args.sessionIds.length === 0 ||
191
+ args.sessionIds.length > MAX_ENRICHMENT_SESSIONS ||
192
+ args.events.length > MAX_BATCH_EVENTS) {
193
+ return 0;
194
+ }
195
+ const context = sanitizeContext(args.context);
196
+ const sessionCountries = new Map();
197
+ let updated = 0;
198
+ for (const sessionId of new Set(args.sessionIds)) {
199
+ const session = await ctx.db
200
+ .query("sessions")
201
+ .withIndex("by_siteId_and_sessionId", (range) => range.eq("siteId", args.siteId).eq("sessionId", sessionId))
202
+ .unique();
203
+ if (!session || session.geoLookupAttemptedAt === undefined)
204
+ continue;
205
+ const sessionCountry = session.country ?? context.country;
206
+ if (sessionCountry)
207
+ sessionCountries.set(sessionId, sessionCountry);
208
+ const sessionGeo = missingGeo(session, context);
209
+ if (Object.keys(sessionGeo).length > 0) {
210
+ await ctx.db.patch("sessions", session._id, sessionGeo);
211
+ }
212
+ const liveSession = await ctx.db
213
+ .query("liveSessions")
214
+ .withIndex("by_siteId_and_sessionId", (range) => range.eq("siteId", args.siteId).eq("sessionId", sessionId))
215
+ .unique();
216
+ if (liveSession) {
217
+ const liveGeo = missingGeo(liveSession, context);
218
+ if (Object.keys(liveGeo).length > 0) {
219
+ await ctx.db.patch("liveSessions", liveSession._id, liveGeo);
220
+ }
221
+ }
222
+ updated += 1;
223
+ }
224
+ if (sessionCountries.size > 0) {
225
+ await correctCountryAggregates(ctx, args.siteId, args.events, sessionCountries);
226
+ }
227
+ return updated;
228
+ },
229
+ });
230
+ export function geoIpDailyLimit(value) {
231
+ if (value === undefined)
232
+ return DEFAULT_GEOIP_DAILY_LIMIT;
233
+ const parsed = Number(value);
234
+ return Number.isSafeInteger(parsed) &&
235
+ parsed >= 0 &&
236
+ parsed <= MAX_GEOIP_DAILY_LIMIT
237
+ ? parsed
238
+ : DEFAULT_GEOIP_DAILY_LIMIT;
239
+ }
240
+ export function geoIpStatus(provider, token) {
241
+ if (!provider)
242
+ return "disabled";
243
+ if (provider === "ipinfo" && !token)
244
+ return "missingToken";
245
+ return "ready";
246
+ }
247
+ export async function readRequestMetadata(ctx) {
248
+ try {
249
+ const metadata = await ctx.meta.getRequestMetadata();
250
+ return { ip: metadata.ip, userAgent: metadata.userAgent };
251
+ }
252
+ catch {
253
+ // Older self-hosted runtimes and convex-test may not implement this syscall.
254
+ return { ip: null, userAgent: null };
255
+ }
256
+ }
257
+ export async function resolveGeoIp(ip, provider, token, fetcher = fetch) {
258
+ if (geoIpStatus(provider, token) !== "ready" || classifyIp(ip) !== "public") {
259
+ return undefined;
260
+ }
261
+ const controller = new AbortController();
262
+ const timeout = setTimeout(() => controller.abort(), GEOIP_TIMEOUT_MS);
263
+ try {
264
+ const response = await fetcher(geoIpRequest(ip, provider, token), provider === "ipinfo"
265
+ ? {
266
+ headers: { Authorization: `Bearer ${token}` },
267
+ signal: controller.signal,
268
+ }
269
+ : { signal: controller.signal });
270
+ if (!response.ok)
271
+ return undefined;
272
+ const value = await response.json();
273
+ return provider === "ipinfo"
274
+ ? parseIpinfoResponse(value)
275
+ : parseIpwhoisResponse(value);
276
+ }
277
+ catch {
278
+ return undefined;
279
+ }
280
+ finally {
281
+ clearTimeout(timeout);
282
+ }
283
+ }
284
+ export function classifyIp(ip) {
285
+ if (ip === null || ip.trim() === "")
286
+ return "unavailable";
287
+ const normalized = ip.trim().toLowerCase();
288
+ const ipv4 = /^\d+\.\d+\.\d+\.\d+$/.test(normalized) ? normalized : undefined;
289
+ if (ipv4)
290
+ return classifyIpv4(ipv4);
291
+ if (!normalized.includes(":"))
292
+ return "invalid";
293
+ return classifyIpv6(normalized);
294
+ }
295
+ export function resolveClientIp(nativeIp, headers, trustProxy = false) {
296
+ if (classifyIp(nativeIp) === "public") {
297
+ return { ip: nativeIp, source: "native" };
298
+ }
299
+ // Forwarded headers require an explicit operator trust decision and a
300
+ // private immediate peer so direct client requests cannot spoof the IP.
301
+ if (!trustProxy || classifyIp(nativeIp) !== "private") {
302
+ return { ip: null, source: "unavailable" };
303
+ }
304
+ const candidates = [
305
+ ...(headers.get("x-forwarded-for")?.split(",").reverse() ?? []),
306
+ headers.get("x-real-ip"),
307
+ headers.get("cf-connecting-ip"),
308
+ ];
309
+ for (const candidate of candidates) {
310
+ const ip = normalizeForwardedIp(candidate);
311
+ if (ip && classifyIp(ip) === "public") {
312
+ return { ip, source: "forwarded" };
313
+ }
314
+ }
315
+ return { ip: null, source: "unavailable" };
316
+ }
317
+ export function isTrustedProxyRequest(nativeIp, trustProxy) {
318
+ return trustProxy && classifyIp(nativeIp) === "private";
319
+ }
320
+ function classifyIpv4(ip) {
321
+ const octets = ip.split(".").map(Number);
322
+ if (octets.length !== 4 ||
323
+ octets.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) {
324
+ return "invalid";
325
+ }
326
+ const [a, b, c] = octets;
327
+ if (a === 0 ||
328
+ a === 10 ||
329
+ a === 127 ||
330
+ (a === 100 && b >= 64 && b <= 127) ||
331
+ (a === 169 && b === 254) ||
332
+ (a === 172 && b >= 16 && b <= 31) ||
333
+ (a === 192 && b === 0 && c === 0) ||
334
+ (a === 192 && b === 0 && c === 2) ||
335
+ (a === 192 && b === 168) ||
336
+ (a === 198 && (b === 18 || b === 19)) ||
337
+ (a === 198 && b === 51 && c === 100) ||
338
+ (a === 203 && b === 0 && c === 113) ||
339
+ a >= 224) {
340
+ return "private";
341
+ }
342
+ return "public";
343
+ }
344
+ function classifyIpv6(ip) {
345
+ const groups = parseIpv6(ip);
346
+ if (!groups)
347
+ return "invalid";
348
+ if (groups.every((group) => group === 0) ||
349
+ (groups.slice(0, 7).every((group) => group === 0) && groups[7] === 1) ||
350
+ (groups[0] & 0xfe00) === 0xfc00 ||
351
+ (groups[0] & 0xffc0) === 0xfe80 ||
352
+ (groups[0] & 0xffc0) === 0xfec0 ||
353
+ (groups[0] & 0xff00) === 0xff00 ||
354
+ (groups[0] === 0x0100 && groups.slice(1, 4).every((group) => group === 0)) ||
355
+ (groups[0] === 0x0064 && groups[1] === 0xff9b && groups[2] === 1) ||
356
+ (groups[0] === 0x2001 && (groups[1] & 0xfe00) === 0) ||
357
+ (groups[0] === 0x2001 && groups[1] === 0x0db8) ||
358
+ groups[0] === 0x2002 ||
359
+ (groups[0] & 0xfff0) === 0x3ff0) {
360
+ return "private";
361
+ }
362
+ if (groups.slice(0, 6).every((group) => group === 0)) {
363
+ return "private";
364
+ }
365
+ if (groups.slice(0, 5).every((group) => group === 0) &&
366
+ groups[5] === 0xffff) {
367
+ const ipv4 = `${groups[6] >> 8}.${groups[6] & 255}.${groups[7] >> 8}.${groups[7] & 255}`;
368
+ return classifyIpv4(ipv4);
369
+ }
370
+ // Current globally routable unicast allocations are within 2000::/3.
371
+ // Unknown/special space fails closed so it is never sent to a provider.
372
+ return (groups[0] & 0xe000) === 0x2000 ? "public" : "private";
373
+ }
374
+ function parseIpv6(ip) {
375
+ let normalized = ip;
376
+ const dottedTail = normalized.match(/(\d+\.\d+\.\d+\.\d+)$/)?.[1];
377
+ if (dottedTail) {
378
+ if (classifyIpv4(dottedTail) === "invalid")
379
+ return undefined;
380
+ const octets = dottedTail.split(".").map(Number);
381
+ normalized =
382
+ normalized.slice(0, -dottedTail.length) +
383
+ `${((octets[0] << 8) | octets[1]).toString(16)}:${((octets[2] << 8) | octets[3]).toString(16)}`;
384
+ }
385
+ const halves = normalized.split("::");
386
+ if (halves.length > 2)
387
+ return undefined;
388
+ const left = halves[0] ? halves[0].split(":") : [];
389
+ const right = halves[1] ? halves[1].split(":") : [];
390
+ if ([...left, ...right].some((group) => !/^[0-9a-f]{1,4}$/.test(group)) ||
391
+ (halves.length === 1 && left.length !== 8) ||
392
+ (halves.length === 2 && left.length + right.length >= 8)) {
393
+ return undefined;
394
+ }
395
+ const fill = halves.length === 2
396
+ ? Array(8 - left.length - right.length).fill(0)
397
+ : [];
398
+ return [...left.map(hexGroup), ...fill, ...right.map(hexGroup)];
399
+ }
400
+ function hexGroup(value) {
401
+ return Number.parseInt(value, 16);
402
+ }
403
+ function normalizeForwardedIp(value) {
404
+ if (!value)
405
+ return undefined;
406
+ let normalized = value.trim().replace(/^"|"$/g, "");
407
+ if (normalized.startsWith("[")) {
408
+ const end = normalized.indexOf("]");
409
+ return end > 0 ? normalized.slice(1, end) : undefined;
410
+ }
411
+ if (/^\d+\.\d+\.\d+\.\d+:\d+$/.test(normalized)) {
412
+ normalized = normalized.slice(0, normalized.lastIndexOf(":"));
413
+ }
414
+ return normalized || undefined;
415
+ }
416
+ async function correctCountryAggregates(ctx, siteId, events, sessionCountries) {
417
+ const corrections = new Map();
418
+ for (const event of events) {
419
+ const country = sessionCountries.get(event.sessionId);
420
+ if (!country || country === event.priorCountry)
421
+ continue;
422
+ for (const granularity of ["hour", "day"]) {
423
+ const interval = granularity === "hour" ? HOUR_MS : DAY_MS;
424
+ const bucketStart = Math.floor(event.timestamp / interval) * interval;
425
+ const shard = stableHash(event.sessionId) %
426
+ (granularity === "hour" ? HOURLY_AGGREGATE_SHARDS : AGGREGATE_SHARDS);
427
+ const key = `${granularity}:${bucketStart}:${shard}`;
428
+ const correction = corrections.get(key) ?? {
429
+ granularity,
430
+ bucketStart,
431
+ shard,
432
+ moves: new Map(),
433
+ };
434
+ const moveKey = `${event.priorCountry}:${country}`;
435
+ const move = correction.moves.get(moveKey) ?? {
436
+ from: event.priorCountry,
437
+ to: country,
438
+ count: 0,
439
+ };
440
+ move.count += 1;
441
+ correction.moves.set(moveKey, move);
442
+ corrections.set(key, correction);
443
+ }
444
+ }
445
+ for (const correction of corrections.values()) {
446
+ const bucket = await ctx.db
447
+ .query("aggregateBuckets")
448
+ .withIndex("by_siteId_and_granularity_and_bucketStart_and_shard", (range) => range
449
+ .eq("siteId", siteId)
450
+ .eq("granularity", correction.granularity)
451
+ .eq("bucketStart", correction.bucketStart)
452
+ .eq("shard", correction.shard))
453
+ .unique();
454
+ if (!bucket)
455
+ continue;
456
+ let dimensions = bucket.dimensions;
457
+ let changed = false;
458
+ for (const move of correction.moves.values()) {
459
+ const corrected = moveCountryCount(dimensions, move.from, move.to, move.count);
460
+ if (corrected) {
461
+ dimensions = corrected;
462
+ changed = true;
463
+ }
464
+ }
465
+ if (changed) {
466
+ await ctx.db.patch("aggregateBuckets", bucket._id, { dimensions });
467
+ }
468
+ }
469
+ }
470
+ function moveCountryCount(current, from, to, requested) {
471
+ const dimensions = current.map((slot) => ({ ...slot }));
472
+ let sourceIndex = dimensions.findIndex((slot) => slot.type === "country" && slot.value === from);
473
+ if (sourceIndex < 0) {
474
+ sourceIndex = dimensions.findIndex((slot) => slot.type === "country" && slot.value === "(other)");
475
+ }
476
+ if (sourceIndex < 0)
477
+ return undefined;
478
+ const source = dimensions[sourceIndex];
479
+ const moved = Math.min(source.count, requested);
480
+ if (moved <= 0)
481
+ return undefined;
482
+ source.count -= moved;
483
+ if (source.count === 0 && source.revenueCents === 0) {
484
+ dimensions.splice(sourceIndex, 1);
485
+ }
486
+ const target = dimensions.find((slot) => slot.type === "country" && slot.value === to);
487
+ if (target) {
488
+ target.count += moved;
489
+ return dimensions;
490
+ }
491
+ const countrySlots = dimensions.filter((slot) => slot.type === "country");
492
+ if (countrySlots.length < DIMENSION_SLOTS - 1) {
493
+ const occupied = new Set(countrySlots.map((slot) => slot.slot));
494
+ let slot = stableHash(to) % DIMENSION_SLOTS;
495
+ while (occupied.has(slot))
496
+ slot = (slot + 1) % DIMENSION_SLOTS;
497
+ dimensions.push({
498
+ type: "country",
499
+ slot,
500
+ value: to,
501
+ count: moved,
502
+ revenueCents: 0,
503
+ });
504
+ return dimensions;
505
+ }
506
+ const overflow = countrySlots.find((slot) => slot.value === "(other)");
507
+ if (overflow) {
508
+ overflow.count += moved;
509
+ return dimensions;
510
+ }
511
+ const occupied = new Set(countrySlots.map((slot) => slot.slot));
512
+ if (countrySlots.length < DIMENSION_SLOTS) {
513
+ let slot = stableHash("(other)") % DIMENSION_SLOTS;
514
+ while (occupied.has(slot))
515
+ slot = (slot + 1) % DIMENSION_SLOTS;
516
+ dimensions.push({
517
+ type: "country",
518
+ slot,
519
+ value: "(other)",
520
+ count: moved,
521
+ revenueCents: 0,
522
+ });
523
+ return dimensions;
524
+ }
525
+ let replacement = countrySlots[0];
526
+ for (const candidate of countrySlots.slice(1)) {
527
+ if (candidate.count < replacement.count)
528
+ replacement = candidate;
529
+ }
530
+ replacement.value = "(other)";
531
+ replacement.count += moved;
532
+ return dimensions;
533
+ }
534
+ function missingGeo(existing, context) {
535
+ const coordinates = (existing.latitude === undefined || existing.longitude === undefined) &&
536
+ context.latitude !== undefined &&
537
+ context.longitude !== undefined
538
+ ? { latitude: context.latitude, longitude: context.longitude }
539
+ : {};
540
+ return {
541
+ ...(existing.country === undefined && context.country !== undefined
542
+ ? { country: context.country }
543
+ : {}),
544
+ ...(existing.city === undefined && context.city !== undefined
545
+ ? { city: context.city }
546
+ : {}),
547
+ ...coordinates,
548
+ };
549
+ }
550
+ function geoIpRequest(ip, provider, token) {
551
+ const encodedIp = encodeURIComponent(ip);
552
+ if (provider === "ipinfo") {
553
+ return new URL(`https://api.ipinfo.io/lookup/${encodedIp}`);
554
+ }
555
+ const url = new URL(token
556
+ ? `https://ipwhois.pro/${encodedIp}`
557
+ : `https://ipwho.is/${encodedIp}`);
558
+ url.searchParams.set("fields", "success,country_code,city,latitude,longitude");
559
+ if (token)
560
+ url.searchParams.set("key", token);
561
+ return url;
562
+ }
563
+ function parseIpinfoResponse(value) {
564
+ if (!isPlainRecord(value) || !isPlainRecord(value.geo))
565
+ return undefined;
566
+ return geoContext({
567
+ country: value.geo.country_code,
568
+ city: value.geo.city,
569
+ latitude: value.geo.latitude,
570
+ longitude: value.geo.longitude,
571
+ });
572
+ }
573
+ function parseIpwhoisResponse(value) {
574
+ if (!isPlainRecord(value) || value.success === false)
575
+ return undefined;
576
+ return geoContext({
577
+ country: value.country_code,
578
+ city: value.city,
579
+ latitude: value.latitude,
580
+ longitude: value.longitude,
581
+ });
582
+ }
583
+ function geoContext(value) {
584
+ const country = typeof value.country === "string" ? value.country : undefined;
585
+ const city = typeof value.city === "string" ? value.city : undefined;
586
+ const latitude = finiteNumber(value.latitude);
587
+ const longitude = finiteNumber(value.longitude);
588
+ const coordinates = latitude !== undefined &&
589
+ longitude !== undefined &&
590
+ latitude >= -90 &&
591
+ latitude <= 90 &&
592
+ longitude >= -180 &&
593
+ longitude <= 180
594
+ ? { latitude, longitude }
595
+ : {};
596
+ if (!country && !city && Object.keys(coordinates).length === 0) {
597
+ return undefined;
598
+ }
599
+ return {
600
+ ...(country ? { country } : {}),
601
+ ...(city ? { city } : {}),
602
+ ...coordinates,
603
+ };
604
+ }
605
+ function finiteNumber(value) {
606
+ return typeof value === "number" && Number.isFinite(value)
607
+ ? value
608
+ : undefined;
609
+ }
610
+ //# sourceMappingURL=geo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geo.js","sourceRoot":"","sources":["../../src/component/geo.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"AAkBA,QAAA,MAAM,IAAI,oCAAe,CAAC;eAqUX,IAAI"}
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/component/http.ts"],"names":[],"mappings":"AA+BA,QAAA,MAAM,IAAI,oCAAe,CAAC;eA+dX,IAAI"}