@iann29/rastro 0.1.0-alpha.0 → 0.1.0-alpha.10

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 (164) hide show
  1. package/README.md +579 -57
  2. package/agent/integration.md +661 -0
  3. package/agent/manifest.json +187 -0
  4. package/agent/manifest.schema.json +411 -0
  5. package/dist/client/federation.d.ts +236 -0
  6. package/dist/client/federation.d.ts.map +1 -0
  7. package/dist/client/federation.js +196 -0
  8. package/dist/client/federation.js.map +1 -0
  9. package/dist/client/index.d.ts +2467 -18
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +461 -32
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +18 -0
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +302 -4
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/_generated/server.d.ts +4 -0
  19. package/dist/component/_generated/server.d.ts.map +1 -1
  20. package/dist/component/_generated/server.js.map +1 -1
  21. package/dist/component/affiliates.d.ts.map +1 -1
  22. package/dist/component/affiliates.js +6 -2
  23. package/dist/component/affiliates.js.map +1 -1
  24. package/dist/component/cardinality.d.ts +12 -0
  25. package/dist/component/cardinality.d.ts.map +1 -0
  26. package/dist/component/cardinality.js +94 -0
  27. package/dist/component/cardinality.js.map +1 -0
  28. package/dist/component/constants.d.ts +34 -7
  29. package/dist/component/constants.d.ts.map +1 -1
  30. package/dist/component/constants.js +47 -7
  31. package/dist/component/constants.js.map +1 -1
  32. package/dist/component/convex.config.d.ts +6 -1
  33. package/dist/component/convex.config.js +9 -1
  34. package/dist/component/convex.config.js.map +1 -1
  35. package/dist/component/coverage.d.ts +19 -0
  36. package/dist/component/coverage.d.ts.map +1 -0
  37. package/dist/component/coverage.js +30 -0
  38. package/dist/component/coverage.js.map +1 -0
  39. package/dist/component/diagnostics.d.ts +9 -0
  40. package/dist/component/diagnostics.d.ts.map +1 -0
  41. package/dist/component/diagnostics.js +47 -0
  42. package/dist/component/diagnostics.js.map +1 -0
  43. package/dist/component/errors.d.ts +1 -1
  44. package/dist/component/errors.d.ts.map +1 -1
  45. package/dist/component/errors.js.map +1 -1
  46. package/dist/component/eventStore.d.ts +106 -0
  47. package/dist/component/eventStore.d.ts.map +1 -0
  48. package/dist/component/eventStore.js +294 -0
  49. package/dist/component/eventStore.js.map +1 -0
  50. package/dist/component/funnels.d.ts.map +1 -1
  51. package/dist/component/funnels.js +5 -3
  52. package/dist/component/funnels.js.map +1 -1
  53. package/dist/component/geo.d.ts +71 -0
  54. package/dist/component/geo.d.ts.map +1 -0
  55. package/dist/component/geo.js +611 -0
  56. package/dist/component/geo.js.map +1 -0
  57. package/dist/component/goals.d.ts.map +1 -1
  58. package/dist/component/goals.js +25 -9
  59. package/dist/component/goals.js.map +1 -1
  60. package/dist/component/guards.d.ts.map +1 -1
  61. package/dist/component/guards.js.map +1 -1
  62. package/dist/component/http.d.ts.map +1 -1
  63. package/dist/component/http.js +284 -53
  64. package/dist/component/http.js.map +1 -1
  65. package/dist/component/identity.d.ts +13 -0
  66. package/dist/component/identity.d.ts.map +1 -0
  67. package/dist/component/identity.js +58 -0
  68. package/dist/component/identity.js.map +1 -0
  69. package/dist/component/ingest.d.ts +3 -1
  70. package/dist/component/ingest.d.ts.map +1 -1
  71. package/dist/component/ingest.js +1105 -243
  72. package/dist/component/ingest.js.map +1 -1
  73. package/dist/component/live.d.ts +8 -0
  74. package/dist/component/live.d.ts.map +1 -1
  75. package/dist/component/live.js +74 -9
  76. package/dist/component/live.js.map +1 -1
  77. package/dist/component/reports.d.ts +273 -24
  78. package/dist/component/reports.d.ts.map +1 -1
  79. package/dist/component/reports.js +1320 -150
  80. package/dist/component/reports.js.map +1 -1
  81. package/dist/component/retention.d.ts +75 -1
  82. package/dist/component/retention.d.ts.map +1 -1
  83. package/dist/component/retention.js +541 -31
  84. package/dist/component/retention.js.map +1 -1
  85. package/dist/component/sanitize.d.ts +24 -1
  86. package/dist/component/sanitize.d.ts.map +1 -1
  87. package/dist/component/sanitize.js +107 -19
  88. package/dist/component/sanitize.js.map +1 -1
  89. package/dist/component/schema.d.ts +462 -55
  90. package/dist/component/schema.js +195 -15
  91. package/dist/component/schema.js.map +1 -1
  92. package/dist/component/sites.d.ts.map +1 -1
  93. package/dist/component/sites.js +38 -25
  94. package/dist/component/sites.js.map +1 -1
  95. package/dist/component/useragent.d.ts +9 -0
  96. package/dist/component/useragent.d.ts.map +1 -0
  97. package/dist/component/useragent.js +152 -0
  98. package/dist/component/useragent.js.map +1 -0
  99. package/dist/component/validators.d.ts +101 -16
  100. package/dist/component/validators.d.ts.map +1 -1
  101. package/dist/component/validators.js +19 -2
  102. package/dist/component/validators.js.map +1 -1
  103. package/dist/component/visitors.d.ts +19 -0
  104. package/dist/component/visitors.d.ts.map +1 -0
  105. package/dist/component/visitors.js +86 -0
  106. package/dist/component/visitors.js.map +1 -0
  107. package/dist/component/vitals.d.ts +41 -0
  108. package/dist/component/vitals.d.ts.map +1 -0
  109. package/dist/component/vitals.js +115 -0
  110. package/dist/component/vitals.js.map +1 -0
  111. package/dist/react/index.d.ts.map +1 -1
  112. package/dist/react/index.js.map +1 -1
  113. package/dist/tracker/generated.d.ts +8 -4
  114. package/dist/tracker/generated.d.ts.map +1 -1
  115. package/dist/tracker/generated.js +8 -4
  116. package/dist/tracker/generated.js.map +1 -1
  117. package/dist/tracker/tracker.d.ts +1 -1
  118. package/dist/tracker/tracker.d.ts.map +1 -1
  119. package/dist/tracker/tracker.js +81 -33
  120. package/dist/tracker/tracker.js.map +1 -1
  121. package/dist/tracker/vitals.d.ts +10 -0
  122. package/dist/tracker/vitals.d.ts.map +1 -0
  123. package/dist/tracker/vitals.js +140 -0
  124. package/dist/tracker/vitals.js.map +1 -0
  125. package/dist/tracker.min.js +1 -1
  126. package/dist/vitals.min.js +1 -0
  127. package/docs/benchmarks/2026-08-20-realistic.md +171 -0
  128. package/docs/benchmarks/2026-08-21-formal-certification.md +353 -0
  129. package/docs/benchmarks/2026-08-30-alpha6-recertification.md +206 -0
  130. package/docs/federation-setup.md +397 -0
  131. package/docs/federation.md +262 -0
  132. package/docs/upgrading.md +259 -0
  133. package/llms.txt +71 -0
  134. package/package.json +61 -11
  135. package/scripts/benchmark-ingest.mjs +601 -0
  136. package/scripts/generate-federation-keys.mjs +20 -0
  137. package/src/component/_generated/api.ts +18 -0
  138. package/src/component/_generated/component.ts +366 -4
  139. package/src/component/_generated/server.ts +4 -0
  140. package/src/component/affiliates.ts +20 -5
  141. package/src/component/cardinality.ts +117 -0
  142. package/src/component/constants.ts +47 -7
  143. package/src/component/convex.config.ts +11 -1
  144. package/src/component/coverage.ts +36 -0
  145. package/src/component/diagnostics.ts +65 -0
  146. package/src/component/errors.ts +2 -1
  147. package/src/component/eventStore.ts +489 -0
  148. package/src/component/funnels.ts +19 -16
  149. package/src/component/geo.ts +781 -0
  150. package/src/component/goals.ts +45 -16
  151. package/src/component/guards.ts +3 -1
  152. package/src/component/http.ts +403 -60
  153. package/src/component/identity.ts +74 -0
  154. package/src/component/ingest.ts +1652 -291
  155. package/src/component/live.ts +90 -9
  156. package/src/component/reports.ts +1929 -199
  157. package/src/component/retention.ts +774 -97
  158. package/src/component/sanitize.ts +154 -32
  159. package/src/component/schema.ts +219 -15
  160. package/src/component/sites.ts +56 -28
  161. package/src/component/useragent.ts +171 -0
  162. package/src/component/validators.ts +29 -1
  163. package/src/component/visitors.ts +116 -0
  164. package/src/component/vitals.ts +146 -0
@@ -1,6 +1,9 @@
1
1
  import { v } from "convex/values";
2
2
  import { internal } from "./_generated/api.js";
3
3
  import { internalMutation } from "./_generated/server.js";
4
+ import { LIVE_SWEEP_INTERVAL_MS } from "./constants.js";
5
+
6
+ const SWEEP_BATCH_SIZE = 500;
4
7
 
5
8
  export const expire = internalMutation({
6
9
  args: {
@@ -20,17 +23,95 @@ export const expire = internalMutation({
20
23
  if (liveSession.expiryChainDeadline !== args.scheduledDeadline) {
21
24
  return { expired: false, rescheduled: false, stale: true };
22
25
  }
23
- if (liveSession.expiresAt > Date.now()) {
24
- await ctx.db.patch("liveSessions", liveSession._id, {
25
- expiryChainDeadline: liveSession.expiresAt,
26
- });
27
- await ctx.scheduler.runAt(liveSession.expiresAt, internal.live.expire, {
28
- liveSessionId: liveSession._id,
29
- scheduledDeadline: liveSession.expiresAt,
30
- });
31
- return { expired: false, rescheduled: true, stale: false };
26
+ const now = Date.now();
27
+ if (liveSession.expiresAt > now) {
28
+ const state = await ctx.db
29
+ .query("liveSweepStates")
30
+ .withIndex("by_siteId", (range) =>
31
+ range.eq("siteId", liveSession.siteId),
32
+ )
33
+ .unique();
34
+ const scheduledAt = Math.min(
35
+ liveSession.expiresAt,
36
+ now + LIVE_SWEEP_INTERVAL_MS,
37
+ );
38
+ if (
39
+ !state ||
40
+ state.scheduledAt <= now ||
41
+ state.scheduledAt > scheduledAt
42
+ ) {
43
+ if (state) {
44
+ await ctx.db.patch("liveSweepStates", state._id, {
45
+ scheduledAt,
46
+ });
47
+ } else {
48
+ await ctx.db.insert("liveSweepStates", {
49
+ siteId: liveSession.siteId,
50
+ scheduledAt,
51
+ });
52
+ }
53
+ await ctx.scheduler.runAt(scheduledAt, internal.live.sweep, {
54
+ siteId: liveSession.siteId,
55
+ scheduledAt,
56
+ });
57
+ return { expired: false, rescheduled: true, stale: false };
58
+ }
59
+ return { expired: false, rescheduled: false, stale: false };
32
60
  }
33
61
  await ctx.db.delete("liveSessions", liveSession._id);
34
62
  return { expired: true, rescheduled: false, stale: false };
35
63
  },
36
64
  });
65
+
66
+ export const sweep = internalMutation({
67
+ args: {
68
+ siteId: v.id("sites"),
69
+ scheduledAt: v.number(),
70
+ },
71
+ returns: v.object({
72
+ expired: v.number(),
73
+ rescheduled: v.boolean(),
74
+ stale: v.boolean(),
75
+ }),
76
+ handler: async (ctx, args) => {
77
+ const state = await ctx.db
78
+ .query("liveSweepStates")
79
+ .withIndex("by_siteId", (range) => range.eq("siteId", args.siteId))
80
+ .unique();
81
+ if (!state || state.scheduledAt !== args.scheduledAt) {
82
+ return { expired: 0, rescheduled: false, stale: true };
83
+ }
84
+
85
+ const now = Date.now();
86
+ const expired = await ctx.db
87
+ .query("liveSessions")
88
+ .withIndex("by_siteId_and_expiresAt", (range) =>
89
+ range.eq("siteId", args.siteId).lte("expiresAt", now),
90
+ )
91
+ .take(SWEEP_BATCH_SIZE);
92
+ for (const session of expired) {
93
+ await ctx.db.delete("liveSessions", session._id);
94
+ }
95
+
96
+ const next = await ctx.db
97
+ .query("liveSessions")
98
+ .withIndex("by_siteId_and_expiresAt", (range) =>
99
+ range.eq("siteId", args.siteId),
100
+ )
101
+ .order("asc")
102
+ .first();
103
+ if (!next) {
104
+ await ctx.db.delete("liveSweepStates", state._id);
105
+ return { expired: expired.length, rescheduled: false, stale: false };
106
+ }
107
+
108
+ const scheduledAt =
109
+ expired.length === SWEEP_BATCH_SIZE ? now : now + LIVE_SWEEP_INTERVAL_MS;
110
+ await ctx.db.patch("liveSweepStates", state._id, { scheduledAt });
111
+ await ctx.scheduler.runAt(scheduledAt, internal.live.sweep, {
112
+ siteId: args.siteId,
113
+ scheduledAt,
114
+ });
115
+ return { expired: expired.length, rescheduled: true, stale: false };
116
+ },
117
+ });