@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.
- package/README.md +248 -58
- package/agent/integration.md +223 -65
- package/agent/manifest.json +34 -13
- package/agent/manifest.schema.json +53 -11
- package/dist/client/federation.d.ts +215 -14
- package/dist/client/federation.d.ts.map +1 -1
- package/dist/client/federation.js +233 -9
- package/dist/client/federation.js.map +1 -1
- package/dist/client/heat.d.ts +37 -0
- package/dist/client/heat.d.ts.map +1 -0
- package/dist/client/heat.js +43 -0
- package/dist/client/heat.js.map +1 -0
- package/dist/client/index.d.ts +443 -98
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +214 -21
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +6 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +50 -13
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/constants.d.ts +3 -0
- package/dist/component/constants.d.ts.map +1 -1
- package/dist/component/constants.js +6 -0
- package/dist/component/constants.js.map +1 -1
- package/dist/component/coverage.d.ts +9 -0
- package/dist/component/coverage.d.ts.map +1 -1
- package/dist/component/coverage.js +36 -6
- package/dist/component/coverage.js.map +1 -1
- package/dist/component/geo.d.ts +2 -0
- package/dist/component/geo.d.ts.map +1 -1
- package/dist/component/geo.js +56 -19
- package/dist/component/geo.js.map +1 -1
- package/dist/component/http.d.ts.map +1 -1
- package/dist/component/http.js +48 -27
- package/dist/component/http.js.map +1 -1
- package/dist/component/ingest.d.ts.map +1 -1
- package/dist/component/ingest.js +223 -304
- package/dist/component/ingest.js.map +1 -1
- package/dist/component/localTime.d.ts +25 -0
- package/dist/component/localTime.d.ts.map +1 -0
- package/dist/component/localTime.js +126 -0
- package/dist/component/localTime.js.map +1 -0
- package/dist/component/reports.d.ts +44 -13
- package/dist/component/reports.d.ts.map +1 -1
- package/dist/component/reports.js +193 -38
- package/dist/component/reports.js.map +1 -1
- package/dist/component/retention.js +26 -8
- package/dist/component/retention.js.map +1 -1
- package/dist/component/rollupStore.d.ts +320 -0
- package/dist/component/rollupStore.d.ts.map +1 -0
- package/dist/component/rollupStore.js +596 -0
- package/dist/component/rollupStore.js.map +1 -0
- package/dist/component/rollups.d.ts +20 -0
- package/dist/component/rollups.d.ts.map +1 -0
- package/dist/component/rollups.js +73 -0
- package/dist/component/rollups.js.map +1 -0
- package/dist/component/sanitize.d.ts +5 -0
- package/dist/component/sanitize.d.ts.map +1 -1
- package/dist/component/sanitize.js +15 -0
- package/dist/component/sanitize.js.map +1 -1
- package/dist/component/schema.d.ts +345 -11
- package/dist/component/schema.js +25 -0
- package/dist/component/schema.js.map +1 -1
- package/dist/component/sites.d.ts +12 -0
- package/dist/component/sites.d.ts.map +1 -1
- package/dist/component/sites.js +30 -0
- package/dist/component/sites.js.map +1 -1
- package/dist/component/validators.d.ts +34 -13
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +23 -2
- package/dist/component/validators.js.map +1 -1
- package/dist/tracker/generated.d.ts +3 -0
- package/dist/tracker/generated.d.ts.map +1 -1
- package/dist/tracker/generated.js +3 -0
- package/dist/tracker/generated.js.map +1 -1
- package/docs/federation-setup.md +165 -27
- package/docs/federation.md +170 -31
- package/docs/upgrading.md +181 -21
- package/llms.txt +8 -6
- package/package.json +2 -1
- package/src/component/_generated/api.ts +6 -0
- package/src/component/_generated/component.ts +47 -12
- package/src/component/constants.ts +6 -0
- package/src/component/coverage.ts +46 -6
- package/src/component/geo.ts +82 -28
- package/src/component/http.ts +61 -26
- package/src/component/ingest.ts +327 -439
- package/src/component/localTime.ts +167 -0
- package/src/component/reports.ts +261 -39
- package/src/component/retention.ts +25 -7
- package/src/component/rollupStore.ts +799 -0
- package/src/component/rollups.ts +82 -0
- package/src/component/sanitize.ts +14 -0
- package/src/component/schema.ts +35 -0
- package/src/component/sites.ts +32 -0
- package/src/component/validators.ts +27 -1
- 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: {
|
|
126
|
-
|
|
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(
|
|
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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"}
|