@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.
- package/README.md +274 -75
- 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 +196 -11
- package/dist/client/federation.d.ts.map +1 -1
- package/dist/client/federation.js +160 -6
- 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 +448 -105
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +207 -17
- 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 +53 -16
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/constants.d.ts +5 -1
- package/dist/component/constants.d.ts.map +1 -1
- package/dist/component/constants.js +8 -1
- 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/eventStore.d.ts +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 +49 -27
- package/dist/component/http.js.map +1 -1
- package/dist/component/ingest.d.ts +1 -1
- package/dist/component/ingest.d.ts.map +1 -1
- package/dist/component/ingest.js +252 -305
- 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 +46 -15
- 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 +349 -15
- 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 +41 -20
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +24 -3
- package/dist/component/validators.js.map +1 -1
- package/dist/tracker/generated.d.ts +7 -4
- package/dist/tracker/generated.d.ts.map +1 -1
- package/dist/tracker/generated.js +7 -4
- package/dist/tracker/generated.js.map +1 -1
- package/dist/tracker/tracker.d.ts +1 -1
- package/dist/tracker/tracker.d.ts.map +1 -1
- package/dist/tracker/tracker.js +24 -2
- package/dist/tracker/tracker.js.map +1 -1
- package/dist/tracker.min.js +1 -1
- package/docs/federation-setup.md +104 -27
- package/docs/federation.md +168 -31
- package/docs/upgrading.md +191 -16
- package/llms.txt +9 -7
- package/package.json +2 -1
- package/src/component/_generated/api.ts +6 -0
- package/src/component/_generated/component.ts +50 -12
- package/src/component/constants.ts +8 -1
- package/src/component/coverage.ts +46 -6
- package/src/component/geo.ts +82 -28
- package/src/component/http.ts +62 -26
- package/src/component/ingest.ts +378 -440
- 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 +28 -1
- 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(
|
|
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":"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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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"}
|