@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
@@ -4,8 +4,33 @@ export const FEDERATED_ANALYTICS_CLAIMS = Object.freeze({
4
4
  connectionId: "rastro_connection_id",
5
5
  organizationId: "rastro_organization_id",
6
6
  permissions: "rastro_permissions",
7
+ /**
8
+ * Optional: the sites the token may read, a subset of the grant. A public
9
+ * link's token carries the sites the link was created for.
10
+ */
11
+ siteIds: "rastro_site_ids",
7
12
  });
8
13
  export const FEDERATED_ANALYTICS_READ_PERMISSION = "analytics:read";
14
+ /**
15
+ * The opt-in write scope. A token carries it only for organization owners and
16
+ * admins, and a host honors it only when its local grant lists it too: both
17
+ * sides must agree before any configuration function runs.
18
+ */
19
+ export const FEDERATED_ANALYTICS_CONFIGURE_PERMISSION = "analytics:configure";
20
+ /**
21
+ * The permission a public link's token carries instead of `analytics:read`.
22
+ * It reaches only the overview, the live visitors, the site summaries, the
23
+ * coverage and the connection status — never sessions, journeys, conversions
24
+ * or the configure scope — and a host honors it only when its local grant lists
25
+ * it, so a customer decides twice before a dashboard goes public. A host from
26
+ * before this permission rejects the token whole, which is the safe failure.
27
+ */
28
+ export const FEDERATED_ANALYTICS_PUBLIC_PERMISSION = "analytics:public";
29
+ export const FEDERATED_ANALYTICS_PERMISSIONS = Object.freeze([
30
+ FEDERATED_ANALYTICS_READ_PERMISSION,
31
+ FEDERATED_ANALYTICS_CONFIGURE_PERMISSION,
32
+ FEDERATED_ANALYTICS_PUBLIC_PERMISSION,
33
+ ]);
9
34
  export const FEDERATED_ANALYTICS_ERROR_CODES = Object.freeze({
10
35
  UNAUTHENTICATED: "FEDERATION_UNAUTHENTICATED",
11
36
  ISSUER_MISMATCH: "FEDERATION_ISSUER_MISMATCH",
@@ -13,6 +38,8 @@ export const FEDERATED_ANALYTICS_ERROR_CODES = Object.freeze({
13
38
  CONNECTION_DENIED: "FEDERATION_CONNECTION_DENIED",
14
39
  INVALID_SCOPE: "FEDERATION_INVALID_SCOPE",
15
40
  SITE_DENIED: "FEDERATION_SITE_DENIED",
41
+ CONFIGURE_FORBIDDEN: "FEDERATION_CONFIGURE_FORBIDDEN",
42
+ PUBLIC_FORBIDDEN: "FEDERATION_PUBLIC_FORBIDDEN",
16
43
  });
17
44
  const MAX_CONNECTION_SITE_IDS = MAX_REPORT_SITES;
18
45
  /**
@@ -48,15 +75,56 @@ export const FEDERATED_ANALYTICS_REQUIRED_CAPABILITIES = Object.freeze([
48
75
  "affiliates",
49
76
  "dataCoverage",
50
77
  ]);
78
+ /**
79
+ * The optional configuration surface behind the `configure` capability. Every
80
+ * function here requires the configure permission on the token and on the
81
+ * host's grant; a host that keeps its grants read-only never runs them.
82
+ */
83
+ export const FEDERATED_ANALYTICS_CONFIGURE_FUNCTIONS = Object.freeze({
84
+ siteSettings: "siteSettings",
85
+ updateSite: "updateSite",
86
+ listGoals: "listGoals",
87
+ upsertGoal: "upsertGoal",
88
+ removeGoal: "removeGoal",
89
+ listFunnels: "listFunnels",
90
+ upsertFunnel: "upsertFunnel",
91
+ removeFunnel: "removeFunnel",
92
+ listAffiliates: "listAffiliates",
93
+ upsertAffiliate: "upsertAffiliate",
94
+ removeAffiliate: "removeAffiliate",
95
+ retentionStatus: "retentionStatus",
96
+ setRetentionPolicy: "setRetentionPolicy",
97
+ disableRetentionPolicy: "disableRetentionPolicy",
98
+ });
99
+ /**
100
+ * The functions a public token may run: the aggregate overview (redacted of
101
+ * revenue, conversions, goals, campaigns and custom events), the live visitors
102
+ * (with the visitor identity replaced by the session id), the redacted site
103
+ * summaries, the coverage and the connection status. Everything else on the
104
+ * surface needs a reader's token.
105
+ */
106
+ export const FEDERATED_ANALYTICS_PUBLIC_FUNCTIONS = Object.freeze({
107
+ manifest: "manifest",
108
+ connectionStatus: "connectionStatus",
109
+ listSites: "listSites",
110
+ overview: "overview",
111
+ liveVisitors: "liveVisitors",
112
+ dataCoverage: "dataCoverage",
113
+ });
51
114
  const FEDERATED_ANALYTICS_FUNCTION_NAMES = Object.freeze({
52
115
  ...FEDERATED_ANALYTICS_REQUIRED_FUNCTIONS,
53
116
  vitalsReport: "vitalsReport",
54
117
  siteMap: "siteMap",
118
+ ...FEDERATED_ANALYTICS_CONFIGURE_FUNCTIONS,
55
119
  });
56
120
  const FEDERATED_ANALYTICS_CAPABILITIES = Object.freeze([
57
121
  ...FEDERATED_ANALYTICS_REQUIRED_CAPABILITIES,
58
122
  "vitals",
59
123
  "siteMap",
124
+ // The daily overview answers whole calendar days in the site's timezone
125
+ // from its own buckets (alpha.11); dashboards must not require it.
126
+ "localDays",
127
+ "configure",
60
128
  ]);
61
129
  const FEDERATED_ANALYTICS_LIMITS = Object.freeze({
62
130
  maxSitesPerRequest: MAX_REPORT_SITES,
@@ -75,7 +143,8 @@ export const FEDERATED_ANALYTICS_CONNECTOR_MANIFEST = Object.freeze({
75
143
  });
76
144
  const MAX_CLAIM_LENGTH = 128;
77
145
  const MAX_PERMISSIONS = 16;
78
- const federatedAnalyticsCapabilityValidator = v.union(v.literal("siteSummaries"), v.literal("overview"), v.literal("liveVisitors"), v.literal("sessions"), v.literal("sessionJourney"), v.literal("conversions"), v.literal("visitorJourney"), v.literal("goals"), v.literal("funnels"), v.literal("affiliates"), v.literal("dataCoverage"), v.literal("vitals"), v.literal("siteMap"));
146
+ const federatedAnalyticsCapabilityValidator = v.union(v.literal("siteSummaries"), v.literal("overview"), v.literal("liveVisitors"), v.literal("sessions"), v.literal("sessionJourney"), v.literal("conversions"), v.literal("visitorJourney"), v.literal("goals"), v.literal("funnels"), v.literal("affiliates"), v.literal("dataCoverage"), v.literal("vitals"), v.literal("siteMap"), v.literal("localDays"), v.literal("configure"));
147
+ export const federatedAnalyticsPermissionValidator = v.union(v.literal(FEDERATED_ANALYTICS_READ_PERMISSION), v.literal(FEDERATED_ANALYTICS_CONFIGURE_PERMISSION), v.literal(FEDERATED_ANALYTICS_PUBLIC_PERMISSION));
79
148
  export const federatedAnalyticsManifestValidator = v.object({
80
149
  protocol: v.literal(FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.protocol),
81
150
  protocolVersion: v.literal(FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.protocolVersion),
@@ -96,6 +165,20 @@ export const federatedAnalyticsManifestValidator = v.object({
96
165
  dataCoverage: v.literal("dataCoverage"),
97
166
  vitalsReport: v.literal("vitalsReport"),
98
167
  siteMap: v.literal("siteMap"),
168
+ siteSettings: v.literal("siteSettings"),
169
+ updateSite: v.literal("updateSite"),
170
+ listGoals: v.literal("listGoals"),
171
+ upsertGoal: v.literal("upsertGoal"),
172
+ removeGoal: v.literal("removeGoal"),
173
+ listFunnels: v.literal("listFunnels"),
174
+ upsertFunnel: v.literal("upsertFunnel"),
175
+ removeFunnel: v.literal("removeFunnel"),
176
+ listAffiliates: v.literal("listAffiliates"),
177
+ upsertAffiliate: v.literal("upsertAffiliate"),
178
+ removeAffiliate: v.literal("removeAffiliate"),
179
+ retentionStatus: v.literal("retentionStatus"),
180
+ setRetentionPolicy: v.literal("setRetentionPolicy"),
181
+ disableRetentionPolicy: v.literal("disableRetentionPolicy"),
99
182
  }),
100
183
  capabilities: v.array(federatedAnalyticsCapabilityValidator),
101
184
  limits: v.object({
@@ -110,14 +193,53 @@ export const federatedAnalyticsConnectionStatusValidator = v.object({
110
193
  status: v.literal("connected"),
111
194
  protocolVersion: v.literal(1),
112
195
  capabilities: v.array(federatedAnalyticsCapabilityValidator),
196
+ permissions: v.array(federatedAnalyticsPermissionValidator),
113
197
  siteCount: v.number(),
114
198
  });
199
+ /**
200
+ * The permissions a request may act with: those the token claims that the
201
+ * host's grant also lists. Reading needs no listing — a grant is a read grant
202
+ * by definition — so a token claiming `analytics:read` always reads, and the
203
+ * configure scope rides on it. A public token claims `analytics:public`
204
+ * instead of reading, and holds it only when the grant lists it.
205
+ */
206
+ export function effectiveFederatedPermissions(claimed, connection) {
207
+ const granted = new Set(connection.permissions ?? []);
208
+ const reads = claimed.includes(FEDERATED_ANALYTICS_READ_PERMISSION);
209
+ return FEDERATED_ANALYTICS_PERMISSIONS.filter((permission) => permission === FEDERATED_ANALYTICS_READ_PERMISSION
210
+ ? reads
211
+ : permission === FEDERATED_ANALYTICS_CONFIGURE_PERMISSION
212
+ ? reads && claimed.includes(permission) && granted.has(permission)
213
+ : claimed.includes(permission) && granted.has(permission));
214
+ }
215
+ // The permissions form a ladder: a public token sits below a reader, and the
216
+ // configure scope above it. An operation names the lowest rung it accepts.
217
+ const PERMISSION_RANK = {
218
+ [FEDERATED_ANALYTICS_PUBLIC_PERMISSION]: 0,
219
+ [FEDERATED_ANALYTICS_READ_PERMISSION]: 1,
220
+ [FEDERATED_ANALYTICS_CONFIGURE_PERMISSION]: 2,
221
+ };
222
+ /**
223
+ * Whether `effective` permissions reach an operation that needs `required`:
224
+ * `analytics:public` names an operation a public token may run, and a reader
225
+ * or a configurer reaches it too; `analytics:read` needs a reader.
226
+ */
227
+ export function federatedPermissionSatisfies(effective, required) {
228
+ const level = effective.reduce((highest, permission) => Math.max(highest, PERMISSION_RANK[permission]), -1);
229
+ return level >= PERMISSION_RANK[required];
230
+ }
231
+ /** A public link's token: it holds the public permission and cannot read. */
232
+ export function isPublicFederatedAccess(effective) {
233
+ return (effective.includes(FEDERATED_ANALYTICS_PUBLIC_PERMISSION) &&
234
+ !effective.includes(FEDERATED_ANALYTICS_READ_PERMISSION));
235
+ }
115
236
  export const federatedSiteSummaryValidator = v.object({
116
237
  siteId: v.string(),
117
238
  name: v.string(),
118
239
  currency: v.string(),
119
240
  timezone: v.union(v.string(), v.null()),
120
241
  cookieless: v.boolean(),
242
+ localDays: v.union(v.object({ timezone: v.string(), since: v.number() }), v.null()),
121
243
  });
122
244
  export function createFederatedAnalyticsManifest() {
123
245
  return {
@@ -134,7 +256,7 @@ export function createFederatedAnalyticsConnectionAuthorizer(options) {
134
256
  if (typeof options.resolveConnection !== "function") {
135
257
  throw new Error("Federated analytics connection resolver is required");
136
258
  }
137
- return async (ctx, requestedSiteIds) => {
259
+ return async (ctx, requestedSiteIds, requiredPermission = FEDERATED_ANALYTICS_READ_PERMISSION) => {
138
260
  const identity = await ctx.auth.getUserIdentity();
139
261
  if (!identity) {
140
262
  fail(FEDERATED_ANALYTICS_ERROR_CODES.UNAUTHENTICATED, "Federated analytics authentication is required");
@@ -145,10 +267,16 @@ export function createFederatedAnalyticsConnectionAuthorizer(options) {
145
267
  const connectionId = identity[FEDERATED_ANALYTICS_CLAIMS.connectionId];
146
268
  const organizationId = identity[FEDERATED_ANALYTICS_CLAIMS.organizationId];
147
269
  const permissions = identity[FEDERATED_ANALYTICS_CLAIMS.permissions];
270
+ const claimedSiteIds = identity[FEDERATED_ANALYTICS_CLAIMS.siteIds];
148
271
  if (!isBoundedClaim(connectionId) ||
149
272
  !isBoundedClaim(organizationId) ||
150
273
  !isStringArray(permissions, MAX_PERMISSIONS) ||
151
- !permissions.includes(FEDERATED_ANALYTICS_READ_PERMISSION)) {
274
+ !(permissions.includes(FEDERATED_ANALYTICS_READ_PERMISSION) ||
275
+ permissions.includes(FEDERATED_ANALYTICS_PUBLIC_PERMISSION)) ||
276
+ (claimedSiteIds !== undefined &&
277
+ (!isStringArray(claimedSiteIds, MAX_CONNECTION_SITE_IDS) ||
278
+ claimedSiteIds.length === 0 ||
279
+ new Set(claimedSiteIds).size !== claimedSiteIds.length))) {
152
280
  fail(FEDERATED_ANALYTICS_ERROR_CODES.INVALID_CLAIMS, "Federated analytics claims are invalid");
153
281
  }
154
282
  const connection = await options.resolveConnection(ctx, {
@@ -162,9 +290,30 @@ export function createFederatedAnalyticsConnectionAuthorizer(options) {
162
290
  connection.organizationId !== organizationId ||
163
291
  !isStringArray(connection.siteIds, MAX_CONNECTION_SITE_IDS) ||
164
292
  connection.siteIds.length === 0 ||
165
- new Set(connection.siteIds).size !== connection.siteIds.length) {
293
+ new Set(connection.siteIds).size !== connection.siteIds.length ||
294
+ (connection.permissions !== undefined &&
295
+ !isPermissionList(connection.permissions))) {
166
296
  fail(FEDERATED_ANALYTICS_ERROR_CODES.CONNECTION_DENIED, "Federated analytics connection is not active");
167
297
  }
298
+ // The permission is settled before the site scope, so a read-only token
299
+ // probing a configuration function, or a public token probing a journey,
300
+ // learns nothing about which sites the grant covers.
301
+ const effectivePermissions = effectiveFederatedPermissions(permissions, connection);
302
+ if (!federatedPermissionSatisfies(effectivePermissions, requiredPermission)) {
303
+ if (requiredPermission === FEDERATED_ANALYTICS_CONFIGURE_PERMISSION) {
304
+ fail(FEDERATED_ANALYTICS_ERROR_CODES.CONFIGURE_FORBIDDEN, "Federated analytics configuration is not permitted");
305
+ }
306
+ fail(FEDERATED_ANALYTICS_ERROR_CODES.PUBLIC_FORBIDDEN, "Federated analytics public access is not permitted");
307
+ }
308
+ // A site-id claim narrows the grant to the sites it names; one the grant
309
+ // no longer covers is simply outside the scope, and a scope left empty is
310
+ // denied whole.
311
+ const siteIds = claimedSiteIds === undefined
312
+ ? [...connection.siteIds]
313
+ : connection.siteIds.filter((siteId) => claimedSiteIds.includes(siteId));
314
+ if (siteIds.length === 0) {
315
+ fail(FEDERATED_ANALYTICS_ERROR_CODES.SITE_DENIED, "Federated analytics site is not authorized");
316
+ }
168
317
  if (requestedSiteIds !== undefined) {
169
318
  if (requestedSiteIds.length === 0 ||
170
319
  requestedSiteIds.length > MAX_REPORT_SITES ||
@@ -172,12 +321,12 @@ export function createFederatedAnalyticsConnectionAuthorizer(options) {
172
321
  requestedSiteIds.some((siteId) => !isBoundedClaim(siteId))) {
173
322
  fail(FEDERATED_ANALYTICS_ERROR_CODES.INVALID_SCOPE, "Federated analytics site scope is invalid");
174
323
  }
175
- const allowedSiteIds = new Set(connection.siteIds);
324
+ const allowedSiteIds = new Set(siteIds);
176
325
  if (requestedSiteIds.some((siteId) => !allowedSiteIds.has(siteId))) {
177
326
  fail(FEDERATED_ANALYTICS_ERROR_CODES.SITE_DENIED, "Federated analytics site is not authorized");
178
327
  }
179
328
  }
180
- return connection;
329
+ return { ...connection, siteIds, effectivePermissions };
181
330
  };
182
331
  }
183
332
  function isBoundedClaim(value) {
@@ -190,6 +339,11 @@ function isStringArray(value, maximumLength) {
190
339
  value.length <= maximumLength &&
191
340
  value.every(isBoundedClaim));
192
341
  }
342
+ function isPermissionList(value) {
343
+ return (Array.isArray(value) &&
344
+ value.length <= FEDERATED_ANALYTICS_PERMISSIONS.length &&
345
+ value.every((entry) => FEDERATED_ANALYTICS_PERMISSIONS.includes(entry)));
346
+ }
193
347
  function fail(code, message) {
194
348
  throw new ConvexError({ code, message });
195
349
  }
@@ -1 +1 @@
1
- {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/client/federation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAGnC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAC;IACtD,YAAY,EAAE,sBAAsB;IACpC,cAAc,EAAE,wBAAwB;IACxC,WAAW,EAAE,oBAAoB;CACzB,CAAC,CAAC;AAEZ,MAAM,CAAC,MAAM,mCAAmC,GAAG,gBAAgB,CAAC;AAEpE,MAAM,CAAC,MAAM,+BAA+B,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3D,eAAe,EAAE,4BAA4B;IAC7C,eAAe,EAAE,4BAA4B;IAC7C,cAAc,EAAE,2BAA2B;IAC3C,iBAAiB,EAAE,8BAA8B;IACjD,aAAa,EAAE,0BAA0B;IACzC,WAAW,EAAE,wBAAwB;CAC7B,CAAC,CAAC;AAEZ,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;AACjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,MAAM,CAAC,MAAM,CAAC;IAClE,QAAQ,EAAE,UAAU;IACpB,gBAAgB,EAAE,kBAAkB;IACpC,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,UAAU;IACpB,YAAY,EAAE,cAAc;IAC5B,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;IAClC,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;IACpC,YAAY,EAAE,cAAc;CACpB,CAAC,CAAC;AACZ,MAAM,CAAC,MAAM,yCAAyC,GAAG,MAAM,CAAC,MAAM,CAAC;IACrE,eAAe;IACf,UAAU;IACV,cAAc;IACd,UAAU;IACV,gBAAgB;IAChB,aAAa;IACb,gBAAgB;IAChB,OAAO;IACP,SAAS;IACT,YAAY;IACZ,cAAc;CACN,CAAC,CAAC;AACZ,MAAM,kCAAkC,GAAG,MAAM,CAAC,MAAM,CAAC;IACvD,GAAG,sCAAsC;IACzC,YAAY,EAAE,cAAc;IAC5B,OAAO,EAAE,SAAS;CACV,CAAC,CAAC;AACZ,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAAC;IACrD,GAAG,yCAAyC;IAC5C,QAAQ;IACR,SAAS;CACD,CAAC,CAAC;AACZ,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,kBAAkB,EAAE,gBAAgB;IACpC,qBAAqB,EAAE,uBAAuB;IAC9C,kBAAkB,EAAE,qBAAqB;IACzC,eAAe,EAAE,iBAAiB;IAClC,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC,CAAC;AAEZ,MAAM,CAAC,MAAM,sCAAsC,GAAG,MAAM,CAAC,MAAM,CAAC;IAClE,QAAQ,EAAE,wBAAwB;IAClC,eAAe,EAAE,CAAC;IAClB,UAAU,EAAE,kBAAkB;IAC9B,SAAS,EAAE,kCAAkC;IAC7C,YAAY,EAAE,gCAAgC;IAC9C,MAAM,EAAE,0BAA0B;CAC1B,CAAC,CAAC;AAEZ,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,eAAe,GAAG,EAAE,CAAC;AAmD3B,MAAM,qCAAqC,GAAG,CAAC,CAAC,KAAK,CACnD,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,EAC1B,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EACrB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EACrB,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAC3B,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EACxB,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAC3B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAClB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EACzB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1D,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,QAAQ,CAAC;IACpE,eAAe,EAAE,CAAC,CAAC,OAAO,CACxB,sCAAsC,CAAC,eAAe,CACvD;IACD,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC,UAAU,CAAC;IACxE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;QAClB,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC/B,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC/C,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACjC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC/B,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QACvC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QACvC,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC3C,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC;QAC7C,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;QAC3C,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QACrC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QACzC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC/C,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QACvC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QACvC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;KAC9B,CAAC;IACF,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC;IAC5D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE;QAC9B,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE;QACjC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE;QAC9B,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;QAC3B,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;KAC7B,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2CAA2C,GAAG,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC9B,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC;IAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IACpD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;CACxB,CAAC,CAAC;AAEH,MAAM,UAAU,gCAAgC;IAC9C,OAAO;QACL,GAAG,sCAAsC;QACzC,SAAS,EAAE,EAAE,GAAG,sCAAsC,CAAC,SAAS,EAAE;QAClE,YAAY,EAAE,CAAC,GAAG,sCAAsC,CAAC,YAAY,CAAC;QACtE,MAAM,EAAE,EAAE,GAAG,sCAAsC,CAAC,MAAM,EAAE;KAC7D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4CAA4C,CAC1D,OAA4C;IAE5C,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,KAAK,EACV,GAAkC,EAClC,gBAAoC,EACG,EAAE;QACzC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CACF,+BAA+B,CAAC,eAAe,EAC/C,gDAAgD,CACjD,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CACF,+BAA+B,CAAC,eAAe,EAC/C,2CAA2C,CAC5C,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,0BAA0B,CAAC,YAAY,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,QAAQ,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,QAAQ,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;QACrE,IACE,CAAC,cAAc,CAAC,YAAY,CAAC;YAC7B,CAAC,cAAc,CAAC,cAAc,CAAC;YAC/B,CAAC,aAAa,CAAC,WAAW,EAAE,eAAe,CAAC;YAC5C,CAAC,WAAW,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAC1D,CAAC;YACD,IAAI,CACF,+BAA+B,CAAC,cAAc,EAC9C,wCAAwC,CACzC,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE;YACtD,YAAY;YACZ,cAAc;YACd,QAAQ;SACT,CAAC,CAAC;QACH,IACE,CAAC,UAAU;YACX,UAAU,CAAC,SAAS,KAAK,SAAS;YAClC,UAAU,CAAC,YAAY,KAAK,YAAY;YACxC,UAAU,CAAC,cAAc,KAAK,cAAc;YAC5C,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,EAAE,uBAAuB,CAAC;YAC3D,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,OAAO,CAAC,MAAM,EAC9D,CAAC;YACD,IAAI,CACF,+BAA+B,CAAC,iBAAiB,EACjD,8CAA8C,CAC/C,CAAC;QACJ,CAAC;QAED,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,IACE,gBAAgB,CAAC,MAAM,KAAK,CAAC;gBAC7B,gBAAgB,CAAC,MAAM,GAAG,gBAAgB;gBAC1C,IAAI,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,MAAM;gBAC1D,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAC1D,CAAC;gBACD,IAAI,CACF,+BAA+B,CAAC,aAAa,EAC7C,2CAA2C,CAC5C,CAAC;YACJ,CAAC;YAED,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBACnE,IAAI,CACF,+BAA+B,CAAC,WAAW,EAC3C,4CAA4C,CAC7C,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,KAAK,CAAC,MAAM,IAAI,gBAAgB,CACjC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CACpB,KAAc,EACd,aAAqB;IAErB,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,KAAK,CAAC,MAAM,IAAI,aAAa;QAC7B,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAAiC,EAAE,OAAe;IAC9D,MAAM,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/client/federation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The heat of a live visitor: how close they look to converting, read from
3
+ * the facts a live row carries. The dashboard's Ao vivo view uses these
4
+ * rules; a host may apply the same ones to its own signals.
5
+ */
6
+ export type HeatSignal = "converted" | "funnel" | "intentPage" | "returning" | "campaign" | "affiliate" | "depth" | "dwell";
7
+ export type HeatLevel = "hot" | "warm" | "cold";
8
+ export interface HeatInput {
9
+ /** The route the visitor is on now. */
10
+ path: string;
11
+ pageviews: number;
12
+ /** How long the session has been open. */
13
+ durationMs: number;
14
+ /** The visitor had a history before this session; unknown on older rows. */
15
+ returning?: boolean;
16
+ campaign?: string;
17
+ affiliate?: string;
18
+ conversions?: number;
19
+ /** The furthest funnel step reached, out of that funnel's steps. */
20
+ funnel?: {
21
+ step: number;
22
+ steps: number;
23
+ };
24
+ /** Routes that mean intent on this site: goal pages and funnel step pages. */
25
+ intentPaths?: readonly string[];
26
+ }
27
+ export interface VisitorHeat {
28
+ /** 0 to 100. */
29
+ score: number;
30
+ level: HeatLevel;
31
+ /** The signals that contributed, strongest first. */
32
+ signals: HeatSignal[];
33
+ }
34
+ export declare const HEAT_HOT_SCORE = 55;
35
+ export declare const HEAT_WARM_SCORE = 30;
36
+ export declare function visitorHeat(input: HeatInput): VisitorHeat;
37
+ //# sourceMappingURL=heat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heat.d.ts","sourceRoot":"","sources":["../../src/client/heat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAClB,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,UAAU,GACV,WAAW,GACX,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,SAAS;IACxB,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,qDAAqD;IACrD,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,eAAe,KAAK,CAAC;AAKlC,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAgCzD"}
@@ -0,0 +1,43 @@
1
+ export const HEAT_HOT_SCORE = 55;
2
+ export const HEAT_WARM_SCORE = 30;
3
+ const DEPTH_PAGEVIEWS = { some: 3, many: 6 };
4
+ const DWELL_MS = { some: 2 * 60_000, long: 5 * 60_000 };
5
+ export function visitorHeat(input) {
6
+ const parts = [];
7
+ // A conversion is proof, not a hint: it makes the visitor hot on its own.
8
+ if ((input.conversions ?? 0) > 0)
9
+ parts.push(["converted", HEAT_HOT_SCORE]);
10
+ if (input.funnel && input.funnel.steps > 0 && input.funnel.step > 0) {
11
+ const fraction = Math.min(1, input.funnel.step / input.funnel.steps);
12
+ parts.push(["funnel", Math.round(35 * fraction)]);
13
+ }
14
+ if (input.intentPaths?.includes(input.path))
15
+ parts.push(["intentPage", 20]);
16
+ if (input.returning)
17
+ parts.push(["returning", 15]);
18
+ if (input.campaign)
19
+ parts.push(["campaign", 10]);
20
+ if (input.affiliate)
21
+ parts.push(["affiliate", 10]);
22
+ if (input.pageviews >= DEPTH_PAGEVIEWS.many)
23
+ parts.push(["depth", 12]);
24
+ else if (input.pageviews >= DEPTH_PAGEVIEWS.some)
25
+ parts.push(["depth", 8]);
26
+ if (input.durationMs >= DWELL_MS.long)
27
+ parts.push(["dwell", 12]);
28
+ else if (input.durationMs >= DWELL_MS.some)
29
+ parts.push(["dwell", 8]);
30
+ // A stable sort keeps the order above between equal contributions.
31
+ const ranked = parts.sort((left, right) => right[1] - left[1]);
32
+ const score = Math.min(100, ranked.reduce((sum, [, points]) => sum + points, 0));
33
+ return {
34
+ score,
35
+ level: score >= HEAT_HOT_SCORE
36
+ ? "hot"
37
+ : score >= HEAT_WARM_SCORE
38
+ ? "warm"
39
+ : "cold",
40
+ signals: ranked.map(([signal]) => signal),
41
+ };
42
+ }
43
+ //# sourceMappingURL=heat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heat.js","sourceRoot":"","sources":["../../src/client/heat.ts"],"names":[],"mappings":"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"}