@iann29/rastro 0.1.0-alpha.9 → 0.2.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 (98) hide show
  1. package/README.md +248 -58
  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 +215 -14
  6. package/dist/client/federation.d.ts.map +1 -1
  7. package/dist/client/federation.js +233 -9
  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 +443 -98
  14. package/dist/client/index.d.ts.map +1 -1
  15. package/dist/client/index.js +214 -21
  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 +50 -13
  21. package/dist/component/_generated/component.d.ts.map +1 -1
  22. package/dist/component/constants.d.ts +3 -0
  23. package/dist/component/constants.d.ts.map +1 -1
  24. package/dist/component/constants.js +6 -0
  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/geo.d.ts +2 -0
  31. package/dist/component/geo.d.ts.map +1 -1
  32. package/dist/component/geo.js +56 -19
  33. package/dist/component/geo.js.map +1 -1
  34. package/dist/component/http.d.ts.map +1 -1
  35. package/dist/component/http.js +48 -27
  36. package/dist/component/http.js.map +1 -1
  37. package/dist/component/ingest.d.ts.map +1 -1
  38. package/dist/component/ingest.js +223 -304
  39. package/dist/component/ingest.js.map +1 -1
  40. package/dist/component/localTime.d.ts +25 -0
  41. package/dist/component/localTime.d.ts.map +1 -0
  42. package/dist/component/localTime.js +126 -0
  43. package/dist/component/localTime.js.map +1 -0
  44. package/dist/component/reports.d.ts +44 -13
  45. package/dist/component/reports.d.ts.map +1 -1
  46. package/dist/component/reports.js +193 -38
  47. package/dist/component/reports.js.map +1 -1
  48. package/dist/component/retention.js +26 -8
  49. package/dist/component/retention.js.map +1 -1
  50. package/dist/component/rollupStore.d.ts +320 -0
  51. package/dist/component/rollupStore.d.ts.map +1 -0
  52. package/dist/component/rollupStore.js +596 -0
  53. package/dist/component/rollupStore.js.map +1 -0
  54. package/dist/component/rollups.d.ts +20 -0
  55. package/dist/component/rollups.d.ts.map +1 -0
  56. package/dist/component/rollups.js +73 -0
  57. package/dist/component/rollups.js.map +1 -0
  58. package/dist/component/sanitize.d.ts +5 -0
  59. package/dist/component/sanitize.d.ts.map +1 -1
  60. package/dist/component/sanitize.js +15 -0
  61. package/dist/component/sanitize.js.map +1 -1
  62. package/dist/component/schema.d.ts +345 -11
  63. package/dist/component/schema.js +25 -0
  64. package/dist/component/schema.js.map +1 -1
  65. package/dist/component/sites.d.ts +12 -0
  66. package/dist/component/sites.d.ts.map +1 -1
  67. package/dist/component/sites.js +30 -0
  68. package/dist/component/sites.js.map +1 -1
  69. package/dist/component/validators.d.ts +34 -13
  70. package/dist/component/validators.d.ts.map +1 -1
  71. package/dist/component/validators.js +23 -2
  72. package/dist/component/validators.js.map +1 -1
  73. package/dist/tracker/generated.d.ts +3 -0
  74. package/dist/tracker/generated.d.ts.map +1 -1
  75. package/dist/tracker/generated.js +3 -0
  76. package/dist/tracker/generated.js.map +1 -1
  77. package/docs/federation-setup.md +165 -27
  78. package/docs/federation.md +170 -31
  79. package/docs/upgrading.md +181 -21
  80. package/llms.txt +8 -6
  81. package/package.json +2 -1
  82. package/src/component/_generated/api.ts +6 -0
  83. package/src/component/_generated/component.ts +47 -12
  84. package/src/component/constants.ts +6 -0
  85. package/src/component/coverage.ts +46 -6
  86. package/src/component/geo.ts +82 -28
  87. package/src/component/http.ts +61 -26
  88. package/src/component/ingest.ts +327 -439
  89. package/src/component/localTime.ts +167 -0
  90. package/src/component/reports.ts +261 -39
  91. package/src/component/retention.ts +25 -7
  92. package/src/component/rollupStore.ts +799 -0
  93. package/src/component/rollups.ts +82 -0
  94. package/src/component/sanitize.ts +14 -0
  95. package/src/component/schema.ts +35 -0
  96. package/src/component/sites.ts +32 -0
  97. package/src/component/validators.ts +27 -1
  98. package/src/tracker/generated.ts +12 -0
@@ -4,8 +4,35 @@ 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
+ version: "rastro_connection_version",
8
+ transferTo: "rastro_transfer_to",
9
+ /**
10
+ * Optional: the sites the token may read, a subset of the grant. A public
11
+ * link's token carries the sites the link was created for.
12
+ */
13
+ siteIds: "rastro_site_ids",
7
14
  });
8
15
  export const FEDERATED_ANALYTICS_READ_PERMISSION = "analytics:read";
16
+ /**
17
+ * The opt-in write scope. A token carries it only for organization owners and
18
+ * admins, and a host honors it only when its local grant lists it too: both
19
+ * sides must agree before any configuration function runs.
20
+ */
21
+ export const FEDERATED_ANALYTICS_CONFIGURE_PERMISSION = "analytics:configure";
22
+ /**
23
+ * The permission a public link's token carries instead of `analytics:read`.
24
+ * It reaches only the overview, the live visitors, the site summaries, the
25
+ * coverage and the connection status — never sessions, journeys, conversions
26
+ * or the configure scope — and a host honors it only when its local grant lists
27
+ * it, so a customer decides twice before a dashboard goes public. A host from
28
+ * before this permission rejects the token whole, which is the safe failure.
29
+ */
30
+ export const FEDERATED_ANALYTICS_PUBLIC_PERMISSION = "analytics:public";
31
+ export const FEDERATED_ANALYTICS_PERMISSIONS = Object.freeze([
32
+ FEDERATED_ANALYTICS_READ_PERMISSION,
33
+ FEDERATED_ANALYTICS_CONFIGURE_PERMISSION,
34
+ FEDERATED_ANALYTICS_PUBLIC_PERMISSION,
35
+ ]);
9
36
  export const FEDERATED_ANALYTICS_ERROR_CODES = Object.freeze({
10
37
  UNAUTHENTICATED: "FEDERATION_UNAUTHENTICATED",
11
38
  ISSUER_MISMATCH: "FEDERATION_ISSUER_MISMATCH",
@@ -13,6 +40,8 @@ export const FEDERATED_ANALYTICS_ERROR_CODES = Object.freeze({
13
40
  CONNECTION_DENIED: "FEDERATION_CONNECTION_DENIED",
14
41
  INVALID_SCOPE: "FEDERATION_INVALID_SCOPE",
15
42
  SITE_DENIED: "FEDERATION_SITE_DENIED",
43
+ CONFIGURE_FORBIDDEN: "FEDERATION_CONFIGURE_FORBIDDEN",
44
+ PUBLIC_FORBIDDEN: "FEDERATION_PUBLIC_FORBIDDEN",
16
45
  });
17
46
  const MAX_CONNECTION_SITE_IDS = MAX_REPORT_SITES;
18
47
  /**
@@ -48,15 +77,56 @@ export const FEDERATED_ANALYTICS_REQUIRED_CAPABILITIES = Object.freeze([
48
77
  "affiliates",
49
78
  "dataCoverage",
50
79
  ]);
80
+ /**
81
+ * The optional configuration surface behind the `configure` capability. Every
82
+ * function here requires the configure permission on the token and on the
83
+ * host's grant; a host that keeps its grants read-only never runs them.
84
+ */
85
+ export const FEDERATED_ANALYTICS_CONFIGURE_FUNCTIONS = Object.freeze({
86
+ siteSettings: "siteSettings",
87
+ updateSite: "updateSite",
88
+ listGoals: "listGoals",
89
+ upsertGoal: "upsertGoal",
90
+ removeGoal: "removeGoal",
91
+ listFunnels: "listFunnels",
92
+ upsertFunnel: "upsertFunnel",
93
+ removeFunnel: "removeFunnel",
94
+ listAffiliates: "listAffiliates",
95
+ upsertAffiliate: "upsertAffiliate",
96
+ removeAffiliate: "removeAffiliate",
97
+ retentionStatus: "retentionStatus",
98
+ setRetentionPolicy: "setRetentionPolicy",
99
+ disableRetentionPolicy: "disableRetentionPolicy",
100
+ });
101
+ /**
102
+ * The functions a public token may run: the aggregate overview (redacted of
103
+ * revenue, conversions, goals, campaigns and custom events), the live visitors
104
+ * (with the visitor identity replaced by the session id), the redacted site
105
+ * summaries, the coverage and the connection status. Everything else on the
106
+ * surface needs a reader's token.
107
+ */
108
+ export const FEDERATED_ANALYTICS_PUBLIC_FUNCTIONS = Object.freeze({
109
+ manifest: "manifest",
110
+ connectionStatus: "connectionStatus",
111
+ listSites: "listSites",
112
+ overview: "overview",
113
+ liveVisitors: "liveVisitors",
114
+ dataCoverage: "dataCoverage",
115
+ });
51
116
  const FEDERATED_ANALYTICS_FUNCTION_NAMES = Object.freeze({
52
117
  ...FEDERATED_ANALYTICS_REQUIRED_FUNCTIONS,
53
118
  vitalsReport: "vitalsReport",
54
119
  siteMap: "siteMap",
120
+ ...FEDERATED_ANALYTICS_CONFIGURE_FUNCTIONS,
55
121
  });
56
122
  const FEDERATED_ANALYTICS_CAPABILITIES = Object.freeze([
57
123
  ...FEDERATED_ANALYTICS_REQUIRED_CAPABILITIES,
58
124
  "vitals",
59
125
  "siteMap",
126
+ // The daily overview answers whole calendar days in the site's timezone
127
+ // from its own buckets (alpha.11); dashboards must not require it.
128
+ "localDays",
129
+ "configure",
60
130
  ]);
61
131
  const FEDERATED_ANALYTICS_LIMITS = Object.freeze({
62
132
  maxSitesPerRequest: MAX_REPORT_SITES,
@@ -75,7 +145,8 @@ export const FEDERATED_ANALYTICS_CONNECTOR_MANIFEST = Object.freeze({
75
145
  });
76
146
  const MAX_CLAIM_LENGTH = 128;
77
147
  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"));
148
+ 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"), v.literal("transfer"));
149
+ export const federatedAnalyticsPermissionValidator = v.union(v.literal(FEDERATED_ANALYTICS_READ_PERMISSION), v.literal(FEDERATED_ANALYTICS_CONFIGURE_PERMISSION), v.literal(FEDERATED_ANALYTICS_PUBLIC_PERMISSION));
79
150
  export const federatedAnalyticsManifestValidator = v.object({
80
151
  protocol: v.literal(FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.protocol),
81
152
  protocolVersion: v.literal(FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.protocolVersion),
@@ -96,6 +167,21 @@ export const federatedAnalyticsManifestValidator = v.object({
96
167
  dataCoverage: v.literal("dataCoverage"),
97
168
  vitalsReport: v.literal("vitalsReport"),
98
169
  siteMap: v.literal("siteMap"),
170
+ siteSettings: v.literal("siteSettings"),
171
+ updateSite: v.literal("updateSite"),
172
+ listGoals: v.literal("listGoals"),
173
+ upsertGoal: v.literal("upsertGoal"),
174
+ removeGoal: v.literal("removeGoal"),
175
+ listFunnels: v.literal("listFunnels"),
176
+ upsertFunnel: v.literal("upsertFunnel"),
177
+ removeFunnel: v.literal("removeFunnel"),
178
+ listAffiliates: v.literal("listAffiliates"),
179
+ upsertAffiliate: v.literal("upsertAffiliate"),
180
+ removeAffiliate: v.literal("removeAffiliate"),
181
+ retentionStatus: v.literal("retentionStatus"),
182
+ setRetentionPolicy: v.literal("setRetentionPolicy"),
183
+ disableRetentionPolicy: v.literal("disableRetentionPolicy"),
184
+ transferConnection: v.optional(v.literal("transferConnection")),
99
185
  }),
100
186
  capabilities: v.array(federatedAnalyticsCapabilityValidator),
101
187
  limits: v.object({
@@ -110,20 +196,67 @@ export const federatedAnalyticsConnectionStatusValidator = v.object({
110
196
  status: v.literal("connected"),
111
197
  protocolVersion: v.literal(1),
112
198
  capabilities: v.array(federatedAnalyticsCapabilityValidator),
199
+ permissions: v.array(federatedAnalyticsPermissionValidator),
113
200
  siteCount: v.number(),
114
201
  });
202
+ /**
203
+ * The permissions a request may act with: those the token claims that the
204
+ * host's grant also lists. Reading needs no listing — a grant is a read grant
205
+ * by definition — so a token claiming `analytics:read` always reads, and the
206
+ * configure scope rides on it. A public token claims `analytics:public`
207
+ * instead of reading, and holds it only when the grant lists it.
208
+ */
209
+ export function effectiveFederatedPermissions(claimed, connection) {
210
+ const granted = new Set(connection.permissions ?? []);
211
+ const reads = claimed.includes(FEDERATED_ANALYTICS_READ_PERMISSION);
212
+ return FEDERATED_ANALYTICS_PERMISSIONS.filter((permission) => permission === FEDERATED_ANALYTICS_READ_PERMISSION
213
+ ? reads
214
+ : permission === FEDERATED_ANALYTICS_CONFIGURE_PERMISSION
215
+ ? reads && claimed.includes(permission) && granted.has(permission)
216
+ : claimed.includes(permission) && granted.has(permission));
217
+ }
218
+ // The permissions form a ladder: a public token sits below a reader, and the
219
+ // configure scope above it. An operation names the lowest rung it accepts.
220
+ const PERMISSION_RANK = {
221
+ [FEDERATED_ANALYTICS_PUBLIC_PERMISSION]: 0,
222
+ [FEDERATED_ANALYTICS_READ_PERMISSION]: 1,
223
+ [FEDERATED_ANALYTICS_CONFIGURE_PERMISSION]: 2,
224
+ };
225
+ /**
226
+ * Whether `effective` permissions reach an operation that needs `required`:
227
+ * `analytics:public` names an operation a public token may run, and a reader
228
+ * or a configurer reaches it too; `analytics:read` needs a reader.
229
+ */
230
+ export function federatedPermissionSatisfies(effective, required) {
231
+ const level = effective.reduce((highest, permission) => Math.max(highest, PERMISSION_RANK[permission]), -1);
232
+ return level >= PERMISSION_RANK[required];
233
+ }
234
+ /** A public link's token: it holds the public permission and cannot read. */
235
+ export function isPublicFederatedAccess(effective) {
236
+ return (effective.includes(FEDERATED_ANALYTICS_PUBLIC_PERMISSION) &&
237
+ !effective.includes(FEDERATED_ANALYTICS_READ_PERMISSION));
238
+ }
115
239
  export const federatedSiteSummaryValidator = v.object({
116
240
  siteId: v.string(),
117
241
  name: v.string(),
118
242
  currency: v.string(),
119
243
  timezone: v.union(v.string(), v.null()),
120
244
  cookieless: v.boolean(),
245
+ localDays: v.union(v.object({ timezone: v.string(), since: v.number() }), v.null()),
121
246
  });
122
- export function createFederatedAnalyticsManifest() {
247
+ export function createFederatedAnalyticsManifest(transfer = false) {
123
248
  return {
124
249
  ...FEDERATED_ANALYTICS_CONNECTOR_MANIFEST,
125
- functions: { ...FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.functions },
126
- capabilities: [...FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.capabilities],
250
+ functions: {
251
+ ...FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.functions,
252
+ ...(transfer
253
+ ? { transferConnection: "transferConnection" }
254
+ : {}),
255
+ },
256
+ capabilities: [
257
+ ...FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.capabilities,
258
+ ...(transfer ? ["transfer"] : []),
259
+ ],
127
260
  limits: { ...FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.limits },
128
261
  };
129
262
  }
@@ -134,7 +267,7 @@ export function createFederatedAnalyticsConnectionAuthorizer(options) {
134
267
  if (typeof options.resolveConnection !== "function") {
135
268
  throw new Error("Federated analytics connection resolver is required");
136
269
  }
137
- return async (ctx, requestedSiteIds) => {
270
+ return async (ctx, requestedSiteIds, requiredPermission = FEDERATED_ANALYTICS_READ_PERMISSION) => {
138
271
  const identity = await ctx.auth.getUserIdentity();
139
272
  if (!identity) {
140
273
  fail(FEDERATED_ANALYTICS_ERROR_CODES.UNAUTHENTICATED, "Federated analytics authentication is required");
@@ -145,10 +278,19 @@ export function createFederatedAnalyticsConnectionAuthorizer(options) {
145
278
  const connectionId = identity[FEDERATED_ANALYTICS_CLAIMS.connectionId];
146
279
  const organizationId = identity[FEDERATED_ANALYTICS_CLAIMS.organizationId];
147
280
  const permissions = identity[FEDERATED_ANALYTICS_CLAIMS.permissions];
281
+ const claimedSiteIds = identity[FEDERATED_ANALYTICS_CLAIMS.siteIds];
282
+ const version = identity[FEDERATED_ANALYTICS_CLAIMS.version] ?? 0;
148
283
  if (!isBoundedClaim(connectionId) ||
149
284
  !isBoundedClaim(organizationId) ||
285
+ !Number.isSafeInteger(version) ||
286
+ version < 0 ||
150
287
  !isStringArray(permissions, MAX_PERMISSIONS) ||
151
- !permissions.includes(FEDERATED_ANALYTICS_READ_PERMISSION)) {
288
+ !(permissions.includes(FEDERATED_ANALYTICS_READ_PERMISSION) ||
289
+ permissions.includes(FEDERATED_ANALYTICS_PUBLIC_PERMISSION)) ||
290
+ (claimedSiteIds !== undefined &&
291
+ (!isStringArray(claimedSiteIds, MAX_CONNECTION_SITE_IDS) ||
292
+ claimedSiteIds.length === 0 ||
293
+ new Set(claimedSiteIds).size !== claimedSiteIds.length))) {
152
294
  fail(FEDERATED_ANALYTICS_ERROR_CODES.INVALID_CLAIMS, "Federated analytics claims are invalid");
153
295
  }
154
296
  const connection = await options.resolveConnection(ctx, {
@@ -160,11 +302,33 @@ export function createFederatedAnalyticsConnectionAuthorizer(options) {
160
302
  connection.revokedAt !== undefined ||
161
303
  connection.connectionId !== connectionId ||
162
304
  connection.organizationId !== organizationId ||
305
+ (connection.version ?? 0) !== version ||
163
306
  !isStringArray(connection.siteIds, MAX_CONNECTION_SITE_IDS) ||
164
307
  connection.siteIds.length === 0 ||
165
- new Set(connection.siteIds).size !== connection.siteIds.length) {
308
+ new Set(connection.siteIds).size !== connection.siteIds.length ||
309
+ (connection.permissions !== undefined &&
310
+ !isPermissionList(connection.permissions))) {
166
311
  fail(FEDERATED_ANALYTICS_ERROR_CODES.CONNECTION_DENIED, "Federated analytics connection is not active");
167
312
  }
313
+ // The permission is settled before the site scope, so a read-only token
314
+ // probing a configuration function, or a public token probing a journey,
315
+ // learns nothing about which sites the grant covers.
316
+ const effectivePermissions = effectiveFederatedPermissions(permissions, connection);
317
+ if (!federatedPermissionSatisfies(effectivePermissions, requiredPermission)) {
318
+ if (requiredPermission === FEDERATED_ANALYTICS_CONFIGURE_PERMISSION) {
319
+ fail(FEDERATED_ANALYTICS_ERROR_CODES.CONFIGURE_FORBIDDEN, "Federated analytics configuration is not permitted");
320
+ }
321
+ fail(FEDERATED_ANALYTICS_ERROR_CODES.PUBLIC_FORBIDDEN, "Federated analytics public access is not permitted");
322
+ }
323
+ // A site-id claim narrows the grant to the sites it names; one the grant
324
+ // no longer covers is simply outside the scope, and a scope left empty is
325
+ // denied whole.
326
+ const siteIds = claimedSiteIds === undefined
327
+ ? [...connection.siteIds]
328
+ : connection.siteIds.filter((siteId) => claimedSiteIds.includes(siteId));
329
+ if (siteIds.length === 0) {
330
+ fail(FEDERATED_ANALYTICS_ERROR_CODES.SITE_DENIED, "Federated analytics site is not authorized");
331
+ }
168
332
  if (requestedSiteIds !== undefined) {
169
333
  if (requestedSiteIds.length === 0 ||
170
334
  requestedSiteIds.length > MAX_REPORT_SITES ||
@@ -172,14 +336,69 @@ export function createFederatedAnalyticsConnectionAuthorizer(options) {
172
336
  requestedSiteIds.some((siteId) => !isBoundedClaim(siteId))) {
173
337
  fail(FEDERATED_ANALYTICS_ERROR_CODES.INVALID_SCOPE, "Federated analytics site scope is invalid");
174
338
  }
175
- const allowedSiteIds = new Set(connection.siteIds);
339
+ const allowedSiteIds = new Set(siteIds);
176
340
  if (requestedSiteIds.some((siteId) => !allowedSiteIds.has(siteId))) {
177
341
  fail(FEDERATED_ANALYTICS_ERROR_CODES.SITE_DENIED, "Federated analytics site is not authorized");
178
342
  }
179
343
  }
180
- return connection;
344
+ return { ...connection, siteIds, effectivePermissions };
181
345
  };
182
346
  }
347
+ /** Only a server-issued, destination-bound intent may change a local grant. */
348
+ export async function transferFederatedAnalyticsConnection(ctx, options) {
349
+ const identity = await ctx.auth.getUserIdentity();
350
+ const connectionId = identity?.[FEDERATED_ANALYTICS_CLAIMS.connectionId];
351
+ const source = identity?.[FEDERATED_ANALYTICS_CLAIMS.organizationId];
352
+ const target = identity?.[FEDERATED_ANALYTICS_CLAIMS.transferTo];
353
+ const version = identity?.[FEDERATED_ANALYTICS_CLAIMS.version];
354
+ const permissions = identity?.[FEDERATED_ANALYTICS_CLAIMS.permissions];
355
+ if (!options.transferConnection ||
356
+ !identity ||
357
+ identity.issuer !== options.issuer ||
358
+ !isBoundedClaim(connectionId) ||
359
+ !isBoundedClaim(source) ||
360
+ !isBoundedClaim(target) ||
361
+ source === target ||
362
+ typeof version !== "number" ||
363
+ !Number.isSafeInteger(version) ||
364
+ version < 0 ||
365
+ !Number.isSafeInteger(version + 1) ||
366
+ identity[FEDERATED_ANALYTICS_CLAIMS.siteIds] !== undefined ||
367
+ !isStringArray(permissions, MAX_PERMISSIONS) ||
368
+ !permissions.includes(FEDERATED_ANALYTICS_READ_PERMISSION) ||
369
+ !permissions.includes(FEDERATED_ANALYTICS_CONFIGURE_PERMISSION)) {
370
+ fail(FEDERATED_ANALYTICS_ERROR_CODES.CONNECTION_DENIED, "Invalid transfer authorization");
371
+ }
372
+ // A lost response can be retried with the same signed intent. Checking the
373
+ // generation prevents an old intent from replaying after a later transfer.
374
+ const transferred = await options.resolveConnection(ctx, {
375
+ connectionId,
376
+ organizationId: target,
377
+ identity,
378
+ });
379
+ if (transferred?.connectionId === connectionId &&
380
+ transferred.organizationId === target &&
381
+ transferred.version === version + 1 &&
382
+ transferred.revokedAt === undefined)
383
+ return null;
384
+ await createFederatedAnalyticsConnectionAuthorizer(options)(ctx, undefined, FEDERATED_ANALYTICS_CONFIGURE_PERMISSION);
385
+ await options.transferConnection(ctx, {
386
+ connectionId,
387
+ organizationId: target,
388
+ version: version + 1,
389
+ });
390
+ const updated = await options.resolveConnection(ctx, {
391
+ connectionId,
392
+ organizationId: target,
393
+ identity,
394
+ });
395
+ if (updated?.connectionId !== connectionId ||
396
+ updated.organizationId !== target ||
397
+ updated.version !== version + 1) {
398
+ fail(FEDERATED_ANALYTICS_ERROR_CODES.CONNECTION_DENIED, "Transfer callback must persist organization and version");
399
+ }
400
+ return null;
401
+ }
183
402
  function isBoundedClaim(value) {
184
403
  return (typeof value === "string" &&
185
404
  value.length > 0 &&
@@ -190,6 +409,11 @@ function isStringArray(value, maximumLength) {
190
409
  value.length <= maximumLength &&
191
410
  value.every(isBoundedClaim));
192
411
  }
412
+ function isPermissionList(value) {
413
+ return (Array.isArray(value) &&
414
+ value.length <= FEDERATED_ANALYTICS_PERMISSIONS.length &&
415
+ value.every((entry) => FEDERATED_ANALYTICS_PERMISSIONS.includes(entry)));
416
+ }
193
417
  function fail(code, message) {
194
418
  throw new ConvexError({ code, message });
195
419
  }
@@ -1 +1 @@
1
- {"version":3,"file":"federation.js","sourceRoot":"","sources":["../../src/client/federation.ts"],"names":[],"mappings":"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"}
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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"}