@iann29/rastro 0.1.0-alpha.9 → 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 +246 -57
- 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 +441 -98
- 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 +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 +104 -27
- package/docs/federation.md +168 -31
- package/docs/upgrading.md +158 -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,29 @@ export declare const FEDERATED_ANALYTICS_CLAIMS: Readonly<{
|
|
|
4
4
|
readonly connectionId: "rastro_connection_id";
|
|
5
5
|
readonly organizationId: "rastro_organization_id";
|
|
6
6
|
readonly 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
|
+
readonly siteIds: "rastro_site_ids";
|
|
7
12
|
}>;
|
|
8
13
|
export declare 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 declare 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 declare const FEDERATED_ANALYTICS_PUBLIC_PERMISSION = "analytics:public";
|
|
29
|
+
export declare const FEDERATED_ANALYTICS_PERMISSIONS: readonly ["analytics:read", "analytics:configure", "analytics:public"];
|
|
9
30
|
export declare const FEDERATED_ANALYTICS_ERROR_CODES: Readonly<{
|
|
10
31
|
readonly UNAUTHENTICATED: "FEDERATION_UNAUTHENTICATED";
|
|
11
32
|
readonly ISSUER_MISMATCH: "FEDERATION_ISSUER_MISMATCH";
|
|
@@ -13,6 +34,8 @@ export declare const FEDERATED_ANALYTICS_ERROR_CODES: Readonly<{
|
|
|
13
34
|
readonly CONNECTION_DENIED: "FEDERATION_CONNECTION_DENIED";
|
|
14
35
|
readonly INVALID_SCOPE: "FEDERATION_INVALID_SCOPE";
|
|
15
36
|
readonly SITE_DENIED: "FEDERATION_SITE_DENIED";
|
|
37
|
+
readonly CONFIGURE_FORBIDDEN: "FEDERATION_CONFIGURE_FORBIDDEN";
|
|
38
|
+
readonly PUBLIC_FORBIDDEN: "FEDERATION_PUBLIC_FORBIDDEN";
|
|
16
39
|
}>;
|
|
17
40
|
/**
|
|
18
41
|
* The protocol-v1 baseline every compatible host must serve. Newer hosts may
|
|
@@ -35,6 +58,42 @@ export declare const FEDERATED_ANALYTICS_REQUIRED_FUNCTIONS: Readonly<{
|
|
|
35
58
|
readonly dataCoverage: "dataCoverage";
|
|
36
59
|
}>;
|
|
37
60
|
export declare const FEDERATED_ANALYTICS_REQUIRED_CAPABILITIES: readonly ["siteSummaries", "overview", "liveVisitors", "sessions", "sessionJourney", "conversions", "visitorJourney", "goals", "funnels", "affiliates", "dataCoverage"];
|
|
61
|
+
/**
|
|
62
|
+
* The optional configuration surface behind the `configure` capability. Every
|
|
63
|
+
* function here requires the configure permission on the token and on the
|
|
64
|
+
* host's grant; a host that keeps its grants read-only never runs them.
|
|
65
|
+
*/
|
|
66
|
+
export declare const FEDERATED_ANALYTICS_CONFIGURE_FUNCTIONS: Readonly<{
|
|
67
|
+
readonly siteSettings: "siteSettings";
|
|
68
|
+
readonly updateSite: "updateSite";
|
|
69
|
+
readonly listGoals: "listGoals";
|
|
70
|
+
readonly upsertGoal: "upsertGoal";
|
|
71
|
+
readonly removeGoal: "removeGoal";
|
|
72
|
+
readonly listFunnels: "listFunnels";
|
|
73
|
+
readonly upsertFunnel: "upsertFunnel";
|
|
74
|
+
readonly removeFunnel: "removeFunnel";
|
|
75
|
+
readonly listAffiliates: "listAffiliates";
|
|
76
|
+
readonly upsertAffiliate: "upsertAffiliate";
|
|
77
|
+
readonly removeAffiliate: "removeAffiliate";
|
|
78
|
+
readonly retentionStatus: "retentionStatus";
|
|
79
|
+
readonly setRetentionPolicy: "setRetentionPolicy";
|
|
80
|
+
readonly disableRetentionPolicy: "disableRetentionPolicy";
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* The functions a public token may run: the aggregate overview (redacted of
|
|
84
|
+
* revenue, conversions, goals, campaigns and custom events), the live visitors
|
|
85
|
+
* (with the visitor identity replaced by the session id), the redacted site
|
|
86
|
+
* summaries, the coverage and the connection status. Everything else on the
|
|
87
|
+
* surface needs a reader's token.
|
|
88
|
+
*/
|
|
89
|
+
export declare const FEDERATED_ANALYTICS_PUBLIC_FUNCTIONS: Readonly<{
|
|
90
|
+
readonly manifest: "manifest";
|
|
91
|
+
readonly connectionStatus: "connectionStatus";
|
|
92
|
+
readonly listSites: "listSites";
|
|
93
|
+
readonly overview: "overview";
|
|
94
|
+
readonly liveVisitors: "liveVisitors";
|
|
95
|
+
readonly dataCoverage: "dataCoverage";
|
|
96
|
+
}>;
|
|
38
97
|
export declare const FEDERATED_ANALYTICS_CONNECTOR_MANIFEST: Readonly<{
|
|
39
98
|
readonly protocol: "amage-rastro-analytics";
|
|
40
99
|
readonly protocolVersion: 1;
|
|
@@ -53,10 +112,24 @@ export declare const FEDERATED_ANALYTICS_CONNECTOR_MANIFEST: Readonly<{
|
|
|
53
112
|
readonly funnelsReport: "funnelsReport";
|
|
54
113
|
readonly affiliatesReport: "affiliatesReport";
|
|
55
114
|
readonly dataCoverage: "dataCoverage";
|
|
115
|
+
readonly siteSettings: "siteSettings";
|
|
116
|
+
readonly updateSite: "updateSite";
|
|
117
|
+
readonly listGoals: "listGoals";
|
|
118
|
+
readonly upsertGoal: "upsertGoal";
|
|
119
|
+
readonly removeGoal: "removeGoal";
|
|
120
|
+
readonly listFunnels: "listFunnels";
|
|
121
|
+
readonly upsertFunnel: "upsertFunnel";
|
|
122
|
+
readonly removeFunnel: "removeFunnel";
|
|
123
|
+
readonly listAffiliates: "listAffiliates";
|
|
124
|
+
readonly upsertAffiliate: "upsertAffiliate";
|
|
125
|
+
readonly removeAffiliate: "removeAffiliate";
|
|
126
|
+
readonly retentionStatus: "retentionStatus";
|
|
127
|
+
readonly setRetentionPolicy: "setRetentionPolicy";
|
|
128
|
+
readonly disableRetentionPolicy: "disableRetentionPolicy";
|
|
56
129
|
readonly vitalsReport: "vitalsReport";
|
|
57
130
|
readonly siteMap: "siteMap";
|
|
58
131
|
}>;
|
|
59
|
-
readonly capabilities: readonly ["siteSummaries", "overview", "liveVisitors", "sessions", "sessionJourney", "conversions", "visitorJourney", "goals", "funnels", "affiliates", "dataCoverage", "vitals", "siteMap"];
|
|
132
|
+
readonly capabilities: readonly ["siteSummaries", "overview", "liveVisitors", "sessions", "sessionJourney", "conversions", "visitorJourney", "goals", "funnels", "affiliates", "dataCoverage", "vitals", "siteMap", "localDays", "configure"];
|
|
60
133
|
readonly limits: Readonly<{
|
|
61
134
|
readonly maxSitesPerRequest: 10;
|
|
62
135
|
readonly maxSitesPerConnection: 10;
|
|
@@ -67,11 +140,18 @@ export declare const FEDERATED_ANALYTICS_CONNECTOR_MANIFEST: Readonly<{
|
|
|
67
140
|
}>;
|
|
68
141
|
export type FederatedAnalyticsErrorCode = (typeof FEDERATED_ANALYTICS_ERROR_CODES)[keyof typeof FEDERATED_ANALYTICS_ERROR_CODES];
|
|
69
142
|
export type FederatedAnalyticsCapability = (typeof FEDERATED_ANALYTICS_CONNECTOR_MANIFEST.capabilities)[number];
|
|
143
|
+
export type FederatedAnalyticsPermission = (typeof FEDERATED_ANALYTICS_PERMISSIONS)[number];
|
|
70
144
|
export type FederatedAnalyticsManifest = ReturnType<typeof createFederatedAnalyticsManifest>;
|
|
71
145
|
export interface FederatedAnalyticsConnection {
|
|
72
146
|
connectionId: string;
|
|
73
147
|
organizationId: string;
|
|
74
148
|
siteIds: readonly string[];
|
|
149
|
+
/**
|
|
150
|
+
* What the host lets this connection do. Absent means read only; listing
|
|
151
|
+
* `analytics:configure` lets owners and admins of the dashboard organization
|
|
152
|
+
* manage goals, funnels, affiliates, site settings, and retention.
|
|
153
|
+
*/
|
|
154
|
+
permissions?: readonly FederatedAnalyticsPermission[];
|
|
75
155
|
revokedAt?: number;
|
|
76
156
|
}
|
|
77
157
|
export interface FederatedAnalyticsIdentity {
|
|
@@ -85,34 +165,65 @@ export interface FederatedSiteSummary {
|
|
|
85
165
|
currency: string;
|
|
86
166
|
timezone: string | null;
|
|
87
167
|
cookieless: boolean;
|
|
168
|
+
/**
|
|
169
|
+
* The site's calendar days, when the host keeps them (alpha.11): the
|
|
170
|
+
* timezone its daily overview buckets follow and the instant from which
|
|
171
|
+
* they are complete. `null` for a site without a timezone, or whose zone
|
|
172
|
+
* never leaves UTC. Hosts before alpha.11 omit the field.
|
|
173
|
+
*/
|
|
174
|
+
localDays: {
|
|
175
|
+
timezone: string;
|
|
176
|
+
since: number;
|
|
177
|
+
} | null;
|
|
88
178
|
}
|
|
89
179
|
export interface FederatedAnalyticsConnectionStatus {
|
|
90
180
|
status: "connected";
|
|
91
181
|
protocolVersion: 1;
|
|
92
182
|
capabilities: FederatedAnalyticsCapability[];
|
|
183
|
+
/** The permissions both the token and the host's grant agree on. */
|
|
184
|
+
permissions: FederatedAnalyticsPermission[];
|
|
93
185
|
siteCount: number;
|
|
94
186
|
}
|
|
187
|
+
/** A resolved connection plus the permissions this request may act with. */
|
|
188
|
+
export type AuthorizedFederatedAnalyticsConnection = FederatedAnalyticsConnection & {
|
|
189
|
+
effectivePermissions: FederatedAnalyticsPermission[];
|
|
190
|
+
};
|
|
95
191
|
export type ResolveFederatedAnalyticsConnection = (ctx: AnalyticsAuthorizationContext, identity: FederatedAnalyticsIdentity) => FederatedAnalyticsConnection | null | Promise<FederatedAnalyticsConnection | null>;
|
|
96
192
|
export interface FederatedAnalyticsAuthorizerOptions {
|
|
97
193
|
issuer: string;
|
|
98
194
|
resolveConnection: ResolveFederatedAnalyticsConnection;
|
|
99
195
|
}
|
|
196
|
+
export declare const federatedAnalyticsPermissionValidator: import("convex/values").VUnion<"analytics:configure" | "analytics:public" | "analytics:read", [import("convex/values").VLiteral<"analytics:read", "required">, import("convex/values").VLiteral<"analytics:configure", "required">, import("convex/values").VLiteral<"analytics:public", "required">], "required", never>;
|
|
100
197
|
export declare const federatedAnalyticsManifestValidator: import("convex/values").VObject<{
|
|
101
|
-
capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[];
|
|
198
|
+
capabilities: ("affiliates" | "configure" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "localDays" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[];
|
|
102
199
|
functions: {
|
|
103
200
|
affiliatesReport: "affiliatesReport";
|
|
104
201
|
connectionStatus: "connectionStatus";
|
|
105
202
|
dataCoverage: "dataCoverage";
|
|
203
|
+
disableRetentionPolicy: "disableRetentionPolicy";
|
|
106
204
|
funnelsReport: "funnelsReport";
|
|
107
205
|
goalsReport: "goalsReport";
|
|
206
|
+
listAffiliates: "listAffiliates";
|
|
108
207
|
listConversions: "listConversions";
|
|
208
|
+
listFunnels: "listFunnels";
|
|
209
|
+
listGoals: "listGoals";
|
|
109
210
|
listSessions: "listSessions";
|
|
110
211
|
listSites: "listSites";
|
|
111
212
|
liveVisitors: "liveVisitors";
|
|
112
213
|
manifest: "manifest";
|
|
113
214
|
overview: "overview";
|
|
215
|
+
removeAffiliate: "removeAffiliate";
|
|
216
|
+
removeFunnel: "removeFunnel";
|
|
217
|
+
removeGoal: "removeGoal";
|
|
218
|
+
retentionStatus: "retentionStatus";
|
|
114
219
|
sessionJourney: "sessionJourney";
|
|
220
|
+
setRetentionPolicy: "setRetentionPolicy";
|
|
115
221
|
siteMap: "siteMap";
|
|
222
|
+
siteSettings: "siteSettings";
|
|
223
|
+
updateSite: "updateSite";
|
|
224
|
+
upsertAffiliate: "upsertAffiliate";
|
|
225
|
+
upsertFunnel: "upsertFunnel";
|
|
226
|
+
upsertGoal: "upsertGoal";
|
|
116
227
|
visitorJourney: "visitorJourney";
|
|
117
228
|
vitalsReport: "vitalsReport";
|
|
118
229
|
};
|
|
@@ -134,16 +245,30 @@ export declare const federatedAnalyticsManifestValidator: import("convex/values"
|
|
|
134
245
|
affiliatesReport: "affiliatesReport";
|
|
135
246
|
connectionStatus: "connectionStatus";
|
|
136
247
|
dataCoverage: "dataCoverage";
|
|
248
|
+
disableRetentionPolicy: "disableRetentionPolicy";
|
|
137
249
|
funnelsReport: "funnelsReport";
|
|
138
250
|
goalsReport: "goalsReport";
|
|
251
|
+
listAffiliates: "listAffiliates";
|
|
139
252
|
listConversions: "listConversions";
|
|
253
|
+
listFunnels: "listFunnels";
|
|
254
|
+
listGoals: "listGoals";
|
|
140
255
|
listSessions: "listSessions";
|
|
141
256
|
listSites: "listSites";
|
|
142
257
|
liveVisitors: "liveVisitors";
|
|
143
258
|
manifest: "manifest";
|
|
144
259
|
overview: "overview";
|
|
260
|
+
removeAffiliate: "removeAffiliate";
|
|
261
|
+
removeFunnel: "removeFunnel";
|
|
262
|
+
removeGoal: "removeGoal";
|
|
263
|
+
retentionStatus: "retentionStatus";
|
|
145
264
|
sessionJourney: "sessionJourney";
|
|
265
|
+
setRetentionPolicy: "setRetentionPolicy";
|
|
146
266
|
siteMap: "siteMap";
|
|
267
|
+
siteSettings: "siteSettings";
|
|
268
|
+
updateSite: "updateSite";
|
|
269
|
+
upsertAffiliate: "upsertAffiliate";
|
|
270
|
+
upsertFunnel: "upsertFunnel";
|
|
271
|
+
upsertGoal: "upsertGoal";
|
|
147
272
|
visitorJourney: "visitorJourney";
|
|
148
273
|
vitalsReport: "vitalsReport";
|
|
149
274
|
}, {
|
|
@@ -162,8 +287,22 @@ export declare const federatedAnalyticsManifestValidator: import("convex/values"
|
|
|
162
287
|
dataCoverage: import("convex/values").VLiteral<"dataCoverage", "required">;
|
|
163
288
|
vitalsReport: import("convex/values").VLiteral<"vitalsReport", "required">;
|
|
164
289
|
siteMap: import("convex/values").VLiteral<"siteMap", "required">;
|
|
165
|
-
|
|
166
|
-
|
|
290
|
+
siteSettings: import("convex/values").VLiteral<"siteSettings", "required">;
|
|
291
|
+
updateSite: import("convex/values").VLiteral<"updateSite", "required">;
|
|
292
|
+
listGoals: import("convex/values").VLiteral<"listGoals", "required">;
|
|
293
|
+
upsertGoal: import("convex/values").VLiteral<"upsertGoal", "required">;
|
|
294
|
+
removeGoal: import("convex/values").VLiteral<"removeGoal", "required">;
|
|
295
|
+
listFunnels: import("convex/values").VLiteral<"listFunnels", "required">;
|
|
296
|
+
upsertFunnel: import("convex/values").VLiteral<"upsertFunnel", "required">;
|
|
297
|
+
removeFunnel: import("convex/values").VLiteral<"removeFunnel", "required">;
|
|
298
|
+
listAffiliates: import("convex/values").VLiteral<"listAffiliates", "required">;
|
|
299
|
+
upsertAffiliate: import("convex/values").VLiteral<"upsertAffiliate", "required">;
|
|
300
|
+
removeAffiliate: import("convex/values").VLiteral<"removeAffiliate", "required">;
|
|
301
|
+
retentionStatus: import("convex/values").VLiteral<"retentionStatus", "required">;
|
|
302
|
+
setRetentionPolicy: import("convex/values").VLiteral<"setRetentionPolicy", "required">;
|
|
303
|
+
disableRetentionPolicy: import("convex/values").VLiteral<"disableRetentionPolicy", "required">;
|
|
304
|
+
}, "required", "affiliatesReport" | "connectionStatus" | "dataCoverage" | "disableRetentionPolicy" | "funnelsReport" | "goalsReport" | "listAffiliates" | "listConversions" | "listFunnels" | "listGoals" | "listSessions" | "listSites" | "liveVisitors" | "manifest" | "overview" | "removeAffiliate" | "removeFunnel" | "removeGoal" | "retentionStatus" | "sessionJourney" | "setRetentionPolicy" | "siteMap" | "siteSettings" | "updateSite" | "upsertAffiliate" | "upsertFunnel" | "upsertGoal" | "visitorJourney" | "vitalsReport">;
|
|
305
|
+
capabilities: import("convex/values").VArray<("affiliates" | "configure" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "localDays" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[], import("convex/values").VUnion<"affiliates" | "configure" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "localDays" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals", [import("convex/values").VLiteral<"siteSummaries", "required">, import("convex/values").VLiteral<"overview", "required">, import("convex/values").VLiteral<"liveVisitors", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"sessionJourney", "required">, import("convex/values").VLiteral<"conversions", "required">, import("convex/values").VLiteral<"visitorJourney", "required">, import("convex/values").VLiteral<"goals", "required">, import("convex/values").VLiteral<"funnels", "required">, import("convex/values").VLiteral<"affiliates", "required">, import("convex/values").VLiteral<"dataCoverage", "required">, import("convex/values").VLiteral<"vitals", "required">, import("convex/values").VLiteral<"siteMap", "required">, import("convex/values").VLiteral<"localDays", "required">, import("convex/values").VLiteral<"configure", "required">], "required", never>, "required">;
|
|
167
306
|
limits: import("convex/values").VObject<{
|
|
168
307
|
maxJourneyEvents: number;
|
|
169
308
|
maxLiveVisitors: number;
|
|
@@ -177,21 +316,43 @@ export declare const federatedAnalyticsManifestValidator: import("convex/values"
|
|
|
177
316
|
maxLiveVisitors: import("convex/values").VFloat64<number, "required">;
|
|
178
317
|
maxJourneyEvents: import("convex/values").VFloat64<number, "required">;
|
|
179
318
|
}, "required", "maxJourneyEvents" | "maxLiveVisitors" | "maxReportRangeDays" | "maxSitesPerConnection" | "maxSitesPerRequest">;
|
|
180
|
-
}, "required", "capabilities" | "functions" | "functions.affiliatesReport" | "functions.connectionStatus" | "functions.dataCoverage" | "functions.funnelsReport" | "functions.goalsReport" | "functions.listConversions" | "functions.listSessions" | "functions.listSites" | "functions.liveVisitors" | "functions.manifest" | "functions.overview" | "functions.sessionJourney" | "functions.siteMap" | "functions.visitorJourney" | "functions.vitalsReport" | "limits" | "limits.maxJourneyEvents" | "limits.maxLiveVisitors" | "limits.maxReportRangeDays" | "limits.maxSitesPerConnection" | "limits.maxSitesPerRequest" | "moduleName" | "protocol" | "protocolVersion">;
|
|
319
|
+
}, "required", "capabilities" | "functions" | "functions.affiliatesReport" | "functions.connectionStatus" | "functions.dataCoverage" | "functions.disableRetentionPolicy" | "functions.funnelsReport" | "functions.goalsReport" | "functions.listAffiliates" | "functions.listConversions" | "functions.listFunnels" | "functions.listGoals" | "functions.listSessions" | "functions.listSites" | "functions.liveVisitors" | "functions.manifest" | "functions.overview" | "functions.removeAffiliate" | "functions.removeFunnel" | "functions.removeGoal" | "functions.retentionStatus" | "functions.sessionJourney" | "functions.setRetentionPolicy" | "functions.siteMap" | "functions.siteSettings" | "functions.updateSite" | "functions.upsertAffiliate" | "functions.upsertFunnel" | "functions.upsertGoal" | "functions.visitorJourney" | "functions.vitalsReport" | "limits" | "limits.maxJourneyEvents" | "limits.maxLiveVisitors" | "limits.maxReportRangeDays" | "limits.maxSitesPerConnection" | "limits.maxSitesPerRequest" | "moduleName" | "protocol" | "protocolVersion">;
|
|
181
320
|
export declare const federatedAnalyticsConnectionStatusValidator: import("convex/values").VObject<{
|
|
182
|
-
capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[];
|
|
321
|
+
capabilities: ("affiliates" | "configure" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "localDays" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[];
|
|
322
|
+
permissions: ("analytics:configure" | "analytics:public" | "analytics:read")[];
|
|
183
323
|
protocolVersion: 1;
|
|
184
324
|
siteCount: number;
|
|
185
325
|
status: "connected";
|
|
186
326
|
}, {
|
|
187
327
|
status: import("convex/values").VLiteral<"connected", "required">;
|
|
188
328
|
protocolVersion: import("convex/values").VLiteral<1, "required">;
|
|
189
|
-
capabilities: import("convex/values").VArray<("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[], import("convex/values").VUnion<"affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals", [import("convex/values").VLiteral<"siteSummaries", "required">, import("convex/values").VLiteral<"overview", "required">, import("convex/values").VLiteral<"liveVisitors", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"sessionJourney", "required">, import("convex/values").VLiteral<"conversions", "required">, import("convex/values").VLiteral<"visitorJourney", "required">, import("convex/values").VLiteral<"goals", "required">, import("convex/values").VLiteral<"funnels", "required">, import("convex/values").VLiteral<"affiliates", "required">, import("convex/values").VLiteral<"dataCoverage", "required">, import("convex/values").VLiteral<"vitals", "required">, import("convex/values").VLiteral<"siteMap", "required">], "required", never>, "required">;
|
|
329
|
+
capabilities: import("convex/values").VArray<("affiliates" | "configure" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "localDays" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[], import("convex/values").VUnion<"affiliates" | "configure" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "localDays" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals", [import("convex/values").VLiteral<"siteSummaries", "required">, import("convex/values").VLiteral<"overview", "required">, import("convex/values").VLiteral<"liveVisitors", "required">, import("convex/values").VLiteral<"sessions", "required">, import("convex/values").VLiteral<"sessionJourney", "required">, import("convex/values").VLiteral<"conversions", "required">, import("convex/values").VLiteral<"visitorJourney", "required">, import("convex/values").VLiteral<"goals", "required">, import("convex/values").VLiteral<"funnels", "required">, import("convex/values").VLiteral<"affiliates", "required">, import("convex/values").VLiteral<"dataCoverage", "required">, import("convex/values").VLiteral<"vitals", "required">, import("convex/values").VLiteral<"siteMap", "required">, import("convex/values").VLiteral<"localDays", "required">, import("convex/values").VLiteral<"configure", "required">], "required", never>, "required">;
|
|
330
|
+
permissions: import("convex/values").VArray<("analytics:configure" | "analytics:public" | "analytics:read")[], import("convex/values").VUnion<"analytics:configure" | "analytics:public" | "analytics:read", [import("convex/values").VLiteral<"analytics:read", "required">, import("convex/values").VLiteral<"analytics:configure", "required">, import("convex/values").VLiteral<"analytics:public", "required">], "required", never>, "required">;
|
|
190
331
|
siteCount: import("convex/values").VFloat64<number, "required">;
|
|
191
|
-
}, "required", "capabilities" | "protocolVersion" | "siteCount" | "status">;
|
|
332
|
+
}, "required", "capabilities" | "permissions" | "protocolVersion" | "siteCount" | "status">;
|
|
333
|
+
/**
|
|
334
|
+
* The permissions a request may act with: those the token claims that the
|
|
335
|
+
* host's grant also lists. Reading needs no listing — a grant is a read grant
|
|
336
|
+
* by definition — so a token claiming `analytics:read` always reads, and the
|
|
337
|
+
* configure scope rides on it. A public token claims `analytics:public`
|
|
338
|
+
* instead of reading, and holds it only when the grant lists it.
|
|
339
|
+
*/
|
|
340
|
+
export declare function effectiveFederatedPermissions(claimed: readonly string[], connection: Pick<FederatedAnalyticsConnection, "permissions">): FederatedAnalyticsPermission[];
|
|
341
|
+
/**
|
|
342
|
+
* Whether `effective` permissions reach an operation that needs `required`:
|
|
343
|
+
* `analytics:public` names an operation a public token may run, and a reader
|
|
344
|
+
* or a configurer reaches it too; `analytics:read` needs a reader.
|
|
345
|
+
*/
|
|
346
|
+
export declare function federatedPermissionSatisfies(effective: readonly FederatedAnalyticsPermission[], required: FederatedAnalyticsPermission): boolean;
|
|
347
|
+
/** A public link's token: it holds the public permission and cannot read. */
|
|
348
|
+
export declare function isPublicFederatedAccess(effective: readonly FederatedAnalyticsPermission[]): boolean;
|
|
192
349
|
export declare const federatedSiteSummaryValidator: import("convex/values").VObject<{
|
|
193
350
|
cookieless: boolean;
|
|
194
351
|
currency: string;
|
|
352
|
+
localDays: {
|
|
353
|
+
since: number;
|
|
354
|
+
timezone: string;
|
|
355
|
+
} | null;
|
|
195
356
|
name: string;
|
|
196
357
|
siteId: string;
|
|
197
358
|
timezone: string | null;
|
|
@@ -201,7 +362,17 @@ export declare const federatedSiteSummaryValidator: import("convex/values").VObj
|
|
|
201
362
|
currency: import("convex/values").VString<string, "required">;
|
|
202
363
|
timezone: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
|
|
203
364
|
cookieless: import("convex/values").VBoolean<boolean, "required">;
|
|
204
|
-
|
|
365
|
+
localDays: import("convex/values").VUnion<{
|
|
366
|
+
since: number;
|
|
367
|
+
timezone: string;
|
|
368
|
+
} | null, [import("convex/values").VObject<{
|
|
369
|
+
since: number;
|
|
370
|
+
timezone: string;
|
|
371
|
+
}, {
|
|
372
|
+
timezone: import("convex/values").VString<string, "required">;
|
|
373
|
+
since: import("convex/values").VFloat64<number, "required">;
|
|
374
|
+
}, "required", "since" | "timezone">, import("convex/values").VNull<null, "required">], "required", "since" | "timezone">;
|
|
375
|
+
}, "required", "cookieless" | "currency" | "localDays" | "localDays.since" | "localDays.timezone" | "name" | "siteId" | "timezone">;
|
|
205
376
|
export declare function createFederatedAnalyticsManifest(): {
|
|
206
377
|
protocol: "amage-rastro-analytics";
|
|
207
378
|
protocolVersion: 1;
|
|
@@ -220,10 +391,24 @@ export declare function createFederatedAnalyticsManifest(): {
|
|
|
220
391
|
funnelsReport: "funnelsReport";
|
|
221
392
|
affiliatesReport: "affiliatesReport";
|
|
222
393
|
dataCoverage: "dataCoverage";
|
|
394
|
+
siteSettings: "siteSettings";
|
|
395
|
+
updateSite: "updateSite";
|
|
396
|
+
listGoals: "listGoals";
|
|
397
|
+
upsertGoal: "upsertGoal";
|
|
398
|
+
removeGoal: "removeGoal";
|
|
399
|
+
listFunnels: "listFunnels";
|
|
400
|
+
upsertFunnel: "upsertFunnel";
|
|
401
|
+
removeFunnel: "removeFunnel";
|
|
402
|
+
listAffiliates: "listAffiliates";
|
|
403
|
+
upsertAffiliate: "upsertAffiliate";
|
|
404
|
+
removeAffiliate: "removeAffiliate";
|
|
405
|
+
retentionStatus: "retentionStatus";
|
|
406
|
+
setRetentionPolicy: "setRetentionPolicy";
|
|
407
|
+
disableRetentionPolicy: "disableRetentionPolicy";
|
|
223
408
|
vitalsReport: "vitalsReport";
|
|
224
409
|
siteMap: "siteMap";
|
|
225
410
|
};
|
|
226
|
-
capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[];
|
|
411
|
+
capabilities: ("affiliates" | "configure" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "localDays" | "overview" | "sessionJourney" | "sessions" | "siteMap" | "siteSummaries" | "visitorJourney" | "vitals")[];
|
|
227
412
|
limits: {
|
|
228
413
|
maxSitesPerRequest: 10;
|
|
229
414
|
maxSitesPerConnection: 10;
|
|
@@ -232,5 +417,5 @@ export declare function createFederatedAnalyticsManifest(): {
|
|
|
232
417
|
maxJourneyEvents: 500;
|
|
233
418
|
};
|
|
234
419
|
};
|
|
235
|
-
export declare function createFederatedAnalyticsConnectionAuthorizer(options: FederatedAnalyticsAuthorizerOptions): (ctx: AnalyticsAuthorizationContext, requestedSiteIds?: readonly string[]) => Promise<
|
|
420
|
+
export declare function createFederatedAnalyticsConnectionAuthorizer(options: FederatedAnalyticsAuthorizerOptions): (ctx: AnalyticsAuthorizationContext, requestedSiteIds?: readonly string[], requiredPermission?: FederatedAnalyticsPermission) => Promise<AuthorizedFederatedAnalyticsConnection>;
|
|
236
421
|
//# sourceMappingURL=federation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/client/federation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQlD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEhE,eAAO,MAAM,0BAA0B;2BACvB,sBAAsB;6BACpB,wBAAwB;0BAC3B,oBAAoB;
|
|
1
|
+
{"version":3,"file":"federation.d.ts","sourceRoot":"","sources":["../../src/client/federation.ts"],"names":[],"mappings":"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"}
|