@iann29/rastro 0.5.0 → 0.7.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 +53 -9
- package/agent/integration.md +48 -19
- package/agent/manifest.json +13 -7
- package/agent/manifest.schema.json +18 -8
- package/dist/client/federation.d.ts +18 -8
- package/dist/client/federation.d.ts.map +1 -1
- package/dist/client/federation.js +7 -1
- package/dist/client/federation.js.map +1 -1
- package/dist/client/identity.d.ts +11 -0
- package/dist/client/identity.d.ts.map +1 -0
- package/dist/client/identity.js +123 -0
- package/dist/client/identity.js.map +1 -0
- package/dist/client/index.d.ts +257 -7
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +110 -4
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +2 -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 +92 -0
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/ingest.d.ts.map +1 -1
- package/dist/component/ingest.js +37 -24
- package/dist/component/ingest.js.map +1 -1
- package/dist/component/people.d.ts +79 -0
- package/dist/component/people.d.ts.map +1 -0
- package/dist/component/people.js +249 -0
- package/dist/component/people.js.map +1 -0
- package/dist/component/reports.d.ts +13 -4
- package/dist/component/reports.d.ts.map +1 -1
- package/dist/component/reports.js +25 -10
- package/dist/component/reports.js.map +1 -1
- package/dist/component/sanitize.d.ts +3 -1
- package/dist/component/sanitize.d.ts.map +1 -1
- package/dist/component/sanitize.js +30 -1
- package/dist/component/sanitize.js.map +1 -1
- package/dist/component/schema.d.ts +42 -1
- package/dist/component/schema.js +30 -1
- package/dist/component/schema.js.map +1 -1
- package/dist/component/sites.d.ts +4 -0
- package/dist/component/sites.d.ts.map +1 -1
- package/dist/component/sites.js +13 -2
- package/dist/component/sites.js.map +1 -1
- package/dist/component/validators.d.ts +53 -1
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +28 -0
- package/dist/component/validators.js.map +1 -1
- package/dist/component/visitors.d.ts +38 -2
- package/dist/component/visitors.d.ts.map +1 -1
- package/dist/component/visitors.js +162 -42
- package/dist/component/visitors.js.map +1 -1
- package/dist/react/index.d.ts +9 -5
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +36 -5
- package/dist/react/index.js.map +1 -1
- package/dist/tracker/generated.d.ts +6 -6
- package/dist/tracker/generated.d.ts.map +1 -1
- package/dist/tracker/generated.js +6 -6
- package/dist/tracker/generated.js.map +1 -1
- package/dist/tracker/tracker.d.ts +2 -1
- package/dist/tracker/tracker.d.ts.map +1 -1
- package/dist/tracker/tracker.js +41 -2
- package/dist/tracker/tracker.js.map +1 -1
- package/dist/tracker.min.js +1 -1
- package/docs/federation.md +24 -0
- package/docs/identity.md +307 -0
- package/docs/upgrading.md +85 -20
- package/llms.txt +6 -2
- package/package.json +5 -3
- package/src/component/_generated/api.ts +2 -0
- package/src/component/_generated/component.ts +104 -0
- package/src/component/ingest.ts +54 -30
- package/src/component/people.ts +321 -0
- package/src/component/reports.ts +34 -9
- package/src/component/sanitize.ts +46 -1
- package/src/component/schema.ts +35 -0
- package/src/component/sites.ts +14 -1
- package/src/component/validators.ts +50 -0
- package/src/component/visitors.ts +232 -55
- package/src/tracker/generated.ts +6 -6
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { v } from "convex/values";
|
|
2
2
|
import { MAX_VISITOR_ALIASES } from "./constants.js";
|
|
3
3
|
import { fail } from "./errors.js";
|
|
4
|
-
import { sanitizeOpaqueId } from "./sanitize.js";
|
|
5
|
-
import {
|
|
4
|
+
import { cleanString, sanitizeOpaqueId } from "./sanitize.js";
|
|
5
|
+
import { mergePersonAttributes, profileSearchFields, publicPerson, syncPersonAttributes, } from "./people.js";
|
|
6
|
+
import { mutation, query, } from "./_generated/server.js";
|
|
7
|
+
import { identifyVisitorFields, visitorProfileValidator, } from "./validators.js";
|
|
6
8
|
/**
|
|
7
9
|
* Folds an anonymous visitor id into the pseudonymous identity the host
|
|
8
10
|
* supplies after signup or sign-in. Links are one level deep: an alias can
|
|
@@ -16,57 +18,175 @@ export const link = mutation({
|
|
|
16
18
|
previousVisitorId: v.string(),
|
|
17
19
|
},
|
|
18
20
|
returns: v.object({ linked: v.boolean(), aliasCount: v.number() }),
|
|
21
|
+
handler: linkVisitor,
|
|
22
|
+
});
|
|
23
|
+
async function linkVisitor(ctx, args) {
|
|
24
|
+
const site = await ctx.db.get("sites", args.siteId);
|
|
25
|
+
if (!site)
|
|
26
|
+
fail("NOT_FOUND", "site not found");
|
|
27
|
+
let visitorId;
|
|
28
|
+
let previousVisitorId;
|
|
29
|
+
try {
|
|
30
|
+
visitorId = sanitizeOpaqueId(args.visitorId, "visitorId");
|
|
31
|
+
previousVisitorId = sanitizeOpaqueId(args.previousVisitorId, "previousVisitorId");
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
fail("INVALID_ARGUMENT", error instanceof Error ? error.message : "invalid visitor id");
|
|
35
|
+
}
|
|
36
|
+
if (visitorId === previousVisitorId) {
|
|
37
|
+
fail("INVALID_ARGUMENT", "previousVisitorId must differ from visitorId");
|
|
38
|
+
}
|
|
39
|
+
if (await findAlias(ctx, args.siteId, visitorId)) {
|
|
40
|
+
fail("CONFLICT", "visitorId is already linked to another visitor");
|
|
41
|
+
}
|
|
42
|
+
const previousOwnsAliases = await ctx.db
|
|
43
|
+
.query("visitorAliases")
|
|
44
|
+
.withIndex("by_siteId_and_visitorId", (range) => range.eq("siteId", args.siteId).eq("visitorId", previousVisitorId))
|
|
45
|
+
.first();
|
|
46
|
+
const previousProfile = await profileById(ctx, args.siteId, previousVisitorId);
|
|
47
|
+
if (previousOwnsAliases || previousProfile) {
|
|
48
|
+
fail("CONFLICT", "previousVisitorId already owns linked visitors");
|
|
49
|
+
}
|
|
50
|
+
const aliases = await ctx.db
|
|
51
|
+
.query("visitorAliases")
|
|
52
|
+
.withIndex("by_siteId_and_visitorId", (range) => range.eq("siteId", args.siteId).eq("visitorId", visitorId))
|
|
53
|
+
.take(MAX_VISITOR_ALIASES);
|
|
54
|
+
const existing = await findAlias(ctx, args.siteId, previousVisitorId);
|
|
55
|
+
if (existing) {
|
|
56
|
+
if (existing.visitorId !== visitorId) {
|
|
57
|
+
fail("CONFLICT", "previousVisitorId is already linked to a different visitor");
|
|
58
|
+
}
|
|
59
|
+
return { linked: false, aliasCount: aliases.length };
|
|
60
|
+
}
|
|
61
|
+
if (aliases.length >= MAX_VISITOR_ALIASES) {
|
|
62
|
+
fail("LIMIT_EXCEEDED", `a visitor can hold at most ${MAX_VISITOR_ALIASES} aliases`, {
|
|
63
|
+
limit: MAX_VISITOR_ALIASES,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
await ctx.db.insert("visitorAliases", {
|
|
67
|
+
siteId: args.siteId,
|
|
68
|
+
visitorId,
|
|
69
|
+
previousVisitorId,
|
|
70
|
+
linkedAt: Date.now(),
|
|
71
|
+
});
|
|
72
|
+
return { linked: true, aliasCount: aliases.length + 1 };
|
|
73
|
+
}
|
|
74
|
+
/** Upsert a person and link the pre-login visit in the same transaction. */
|
|
75
|
+
export const identify = mutation({
|
|
76
|
+
args: { siteId: v.id("sites"), ...identifyVisitorFields },
|
|
77
|
+
returns: visitorProfileValidator,
|
|
19
78
|
handler: async (ctx, args) => {
|
|
20
|
-
|
|
21
|
-
if (!site)
|
|
79
|
+
if (!(await ctx.db.get("sites", args.siteId)))
|
|
22
80
|
fail("NOT_FOUND", "site not found");
|
|
23
|
-
|
|
24
|
-
let previousVisitorId;
|
|
25
|
-
try {
|
|
26
|
-
visitorId = sanitizeOpaqueId(args.visitorId, "visitorId");
|
|
27
|
-
previousVisitorId = sanitizeOpaqueId(args.previousVisitorId, "previousVisitorId");
|
|
28
|
-
}
|
|
29
|
-
catch (error) {
|
|
30
|
-
fail("INVALID_ARGUMENT", error instanceof Error ? error.message : "invalid visitor id");
|
|
31
|
-
}
|
|
32
|
-
if (visitorId === previousVisitorId) {
|
|
33
|
-
fail("INVALID_ARGUMENT", "previousVisitorId must differ from visitorId");
|
|
34
|
-
}
|
|
81
|
+
const visitorId = validatedVisitorId(args.visitorId);
|
|
35
82
|
if (await findAlias(ctx, args.siteId, visitorId)) {
|
|
36
83
|
fail("CONFLICT", "visitorId is already linked to another visitor");
|
|
37
84
|
}
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
85
|
+
const existing = await profileById(ctx, args.siteId, visitorId);
|
|
86
|
+
const field = (value, previous, name, max) => {
|
|
87
|
+
if (value === undefined)
|
|
88
|
+
return previous;
|
|
89
|
+
if (value === null)
|
|
90
|
+
return undefined;
|
|
91
|
+
if (value.length > max)
|
|
92
|
+
fail("INVALID_ARGUMENT", `${name} exceeds ${max} characters`);
|
|
93
|
+
const cleaned = cleanString(value, max);
|
|
94
|
+
if (!cleaned)
|
|
95
|
+
fail("INVALID_ARGUMENT", `${name} must not be empty; use null to remove it`);
|
|
96
|
+
return cleaned;
|
|
97
|
+
};
|
|
98
|
+
const name = field(args.name, existing?.name, "name", 160);
|
|
99
|
+
const email = field(args.email, existing?.email, "email", 320);
|
|
100
|
+
const attributes = mergePersonAttributes(existing?.attributes, args.attributes);
|
|
101
|
+
const attributesChanged = JSON.stringify(existing?.attributes ?? {}) !== JSON.stringify(attributes);
|
|
102
|
+
if (email !== undefined && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/u.test(email)) {
|
|
103
|
+
fail("INVALID_ARGUMENT", "email must be an email address");
|
|
44
104
|
}
|
|
45
|
-
|
|
46
|
-
.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
105
|
+
if (args.previousVisitorId !== undefined) {
|
|
106
|
+
const previousVisitorId = validatedVisitorId(args.previousVisitorId);
|
|
107
|
+
if (previousVisitorId !== visitorId) {
|
|
108
|
+
await linkVisitor(ctx, {
|
|
109
|
+
siteId: args.siteId,
|
|
110
|
+
visitorId,
|
|
111
|
+
previousVisitorId,
|
|
112
|
+
});
|
|
53
113
|
}
|
|
54
|
-
return { linked: false, aliasCount: aliases.length };
|
|
55
|
-
}
|
|
56
|
-
if (aliases.length >= MAX_VISITOR_ALIASES) {
|
|
57
|
-
fail("LIMIT_EXCEEDED", `a visitor can hold at most ${MAX_VISITOR_ALIASES} aliases`, {
|
|
58
|
-
limit: MAX_VISITOR_ALIASES,
|
|
59
|
-
});
|
|
60
114
|
}
|
|
61
|
-
|
|
62
|
-
|
|
115
|
+
const now = Date.now();
|
|
116
|
+
const changed = !existing ||
|
|
117
|
+
existing.name !== name ||
|
|
118
|
+
existing.email !== email ||
|
|
119
|
+
attributesChanged;
|
|
120
|
+
const profile = {
|
|
63
121
|
visitorId,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
122
|
+
...(name === undefined ? {} : { name }),
|
|
123
|
+
...(email === undefined ? {} : { email }),
|
|
124
|
+
...(Object.keys(attributes).length ? { attributes } : {}),
|
|
125
|
+
identifiedAt: existing?.identifiedAt ?? now,
|
|
126
|
+
updatedAt: changed ? now : existing.updatedAt,
|
|
127
|
+
};
|
|
128
|
+
if (!existing)
|
|
129
|
+
await ctx.db.insert("visitorProfiles", {
|
|
130
|
+
siteId: args.siteId,
|
|
131
|
+
...profile,
|
|
132
|
+
...profileSearchFields(name, email),
|
|
133
|
+
});
|
|
134
|
+
else if (changed || existing.searchName === undefined)
|
|
135
|
+
await ctx.db.patch("visitorProfiles", existing._id, {
|
|
136
|
+
name,
|
|
137
|
+
email,
|
|
138
|
+
attributes: Object.keys(attributes).length ? attributes : undefined,
|
|
139
|
+
...profileSearchFields(name, email),
|
|
140
|
+
updatedAt: profile.updatedAt,
|
|
141
|
+
});
|
|
142
|
+
if (attributesChanged)
|
|
143
|
+
await syncPersonAttributes(ctx, args.siteId, visitorId, attributes);
|
|
144
|
+
return profile;
|
|
68
145
|
},
|
|
69
146
|
});
|
|
147
|
+
export const getProfile = query({
|
|
148
|
+
args: { siteId: v.id("sites"), visitorId: v.string() },
|
|
149
|
+
returns: v.union(visitorProfileValidator, v.null()),
|
|
150
|
+
handler: (ctx, args) => readVisitorProfile(ctx, args.siteId, validatedVisitorId(args.visitorId)),
|
|
151
|
+
});
|
|
152
|
+
function validatedVisitorId(value) {
|
|
153
|
+
try {
|
|
154
|
+
if (value.length > 128)
|
|
155
|
+
throw new Error("visitorId exceeds 128 characters");
|
|
156
|
+
return sanitizeOpaqueId(value, "visitorId");
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
fail("INVALID_ARGUMENT", error instanceof Error ? error.message : "invalid visitorId");
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function profileById(ctx, siteId, visitorId) {
|
|
163
|
+
return ctx.db
|
|
164
|
+
.query("visitorProfiles")
|
|
165
|
+
.withIndex("by_siteId_and_visitorId", (q) => q.eq("siteId", siteId).eq("visitorId", visitorId))
|
|
166
|
+
.unique();
|
|
167
|
+
}
|
|
168
|
+
export async function readVisitorProfile(ctx, siteId, visitorId) {
|
|
169
|
+
const alias = await findAlias(ctx, siteId, visitorId);
|
|
170
|
+
const row = await profileById(ctx, siteId, alias?.visitorId ?? visitorId);
|
|
171
|
+
if (!row)
|
|
172
|
+
return null;
|
|
173
|
+
const { _id, _creationTime, siteId: _siteId, ...profile } = publicPerson(row);
|
|
174
|
+
return profile;
|
|
175
|
+
}
|
|
176
|
+
/** Enrich a bounded report page; repeated sessions share one indexed lookup. */
|
|
177
|
+
export async function withVisitorProfiles(ctx, rows) {
|
|
178
|
+
const profiles = new Map();
|
|
179
|
+
return Promise.all(rows.map(async (row) => {
|
|
180
|
+
const key = JSON.stringify([row.siteId, row.visitorId]);
|
|
181
|
+
let pending = profiles.get(key);
|
|
182
|
+
if (!pending) {
|
|
183
|
+
pending = readVisitorProfile(ctx, row.siteId, row.visitorId);
|
|
184
|
+
profiles.set(key, pending);
|
|
185
|
+
}
|
|
186
|
+
const profile = await pending;
|
|
187
|
+
return profile ? { ...row, profile } : row;
|
|
188
|
+
}));
|
|
189
|
+
}
|
|
70
190
|
/** The identity a visitor id resolves to, followed by every alias it owns. */
|
|
71
191
|
export async function resolveVisitorIdentities(ctx, siteId, visitorId) {
|
|
72
192
|
const alias = await findAlias(ctx, siteId, visitorId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitors.js","sourceRoot":"","sources":["../../src/component/visitors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"visitors.js","sourceRoot":"","sources":["../../src/component/visitors.ts"],"names":[],"mappings":"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"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -12,28 +12,32 @@ export interface RastroScriptProps {
|
|
|
12
12
|
export interface RastroContext {
|
|
13
13
|
sessionId: string;
|
|
14
14
|
visitorId: string;
|
|
15
|
+
identified: boolean;
|
|
15
16
|
}
|
|
16
17
|
export interface RastroBrowserApi {
|
|
17
18
|
context: () => RastroContext | null;
|
|
18
19
|
track: (name: string, properties?: RastroProperties) => boolean;
|
|
20
|
+
/** Apply the visitorId returned by your backend's identifyVisitor call. */
|
|
21
|
+
identify: (visitorId: string) => boolean;
|
|
22
|
+
/** Call on logout before another account can identify this browser. */
|
|
23
|
+
reset: () => boolean;
|
|
19
24
|
}
|
|
20
|
-
type RastroCommand = (command: "event" | "context", value?: string, properties?: RastroProperties) => RastroContext | void;
|
|
25
|
+
type RastroCommand = (command: "event" | "context" | "identify" | "reset", value?: string, properties?: RastroProperties) => RastroContext | void;
|
|
21
26
|
declare global {
|
|
22
27
|
interface Window {
|
|
23
28
|
rastro?: RastroCommand;
|
|
24
29
|
}
|
|
25
30
|
}
|
|
26
|
-
/** Renders the
|
|
31
|
+
/** Renders the tracker and synchronizes sign-in/out without reloading the page. */
|
|
27
32
|
export declare function RastroScript({ siteId, src, endpoint, visitorId, nonce, onLoad, onError, }: RastroScriptProps): import("react").DetailedReactHTMLElement<{
|
|
28
33
|
defer: boolean;
|
|
29
34
|
src: string;
|
|
30
35
|
nonce: string | undefined;
|
|
31
|
-
|
|
32
|
-
onError: (() => void) | undefined;
|
|
36
|
+
ref: (element: HTMLScriptElement | null) => void;
|
|
33
37
|
"data-site": string;
|
|
34
38
|
"data-endpoint": string | undefined;
|
|
35
39
|
"data-visitor": string | undefined;
|
|
36
|
-
},
|
|
40
|
+
}, HTMLScriptElement>;
|
|
37
41
|
/** Stable browser helpers. `false` means the deferred tracker is not ready yet. */
|
|
38
42
|
export declare function useRastro(): RastroBrowserApi;
|
|
39
43
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IACpC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC;IAChE,2EAA2E;IAC3E,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,uEAAuE;IACvE,KAAK,EAAE,MAAM,OAAO,CAAC;CACtB;AAED,KAAK,aAAa,GAAG,CACnB,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,EACnD,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,gBAAgB,KAC1B,aAAa,GAAG,IAAI,CAAC;AAE1B,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,MAAM,CAAC,EAAE,aAAa,CAAC;KACxB;CACF;AAED,mFAAmF;AACnF,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,GAAG,EACH,QAAQ,EACR,SAAS,EACT,KAAK,EACL,MAAM,EACN,OAAO,GACR,EAAE,iBAAiB;;;;mBAYD,iBAAiB,GAAG,IAAI;;;;sBAY1C;AAED,mFAAmF;AACnF,wBAAgB,SAAS,IAAI,gBAAgB,CAgC5C"}
|
package/dist/react/index.js
CHANGED
|
@@ -1,13 +1,30 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { createElement, useCallback, useMemo } from "react";
|
|
3
|
-
/** Renders the
|
|
2
|
+
import { createElement, useCallback, useEffect, useMemo, useRef } from "react";
|
|
3
|
+
/** Renders the tracker and synchronizes sign-in/out without reloading the page. */
|
|
4
4
|
export function RastroScript({ siteId, src, endpoint, visitorId, nonce, onLoad, onError, }) {
|
|
5
|
+
const previous = useRef(visitorId);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (visitorId)
|
|
8
|
+
window.rastro?.("identify", visitorId);
|
|
9
|
+
else if (previous.current)
|
|
10
|
+
window.rastro?.("reset");
|
|
11
|
+
previous.current = visitorId;
|
|
12
|
+
}, [visitorId]);
|
|
5
13
|
return createElement("script", {
|
|
6
14
|
defer: true,
|
|
7
15
|
src,
|
|
8
16
|
nonce,
|
|
9
|
-
|
|
10
|
-
|
|
17
|
+
// React does not attach load/error listeners to ordinary script nodes.
|
|
18
|
+
ref: (element) => {
|
|
19
|
+
if (!element)
|
|
20
|
+
return;
|
|
21
|
+
element.onload = () => {
|
|
22
|
+
if (previous.current)
|
|
23
|
+
window.rastro?.("identify", previous.current);
|
|
24
|
+
onLoad?.();
|
|
25
|
+
};
|
|
26
|
+
element.onerror = () => onError?.();
|
|
27
|
+
},
|
|
11
28
|
"data-site": siteId,
|
|
12
29
|
"data-endpoint": endpoint,
|
|
13
30
|
"data-visitor": visitorId,
|
|
@@ -26,6 +43,20 @@ export function useRastro() {
|
|
|
26
43
|
return null;
|
|
27
44
|
return window.rastro("context");
|
|
28
45
|
}, []);
|
|
29
|
-
|
|
46
|
+
const identify = useCallback((visitorId) => {
|
|
47
|
+
if (typeof window === "undefined" ||
|
|
48
|
+
!window.rastro ||
|
|
49
|
+
!/^[A-Za-z0-9][A-Za-z0-9_.:-]{0,127}$/.test(visitorId))
|
|
50
|
+
return false;
|
|
51
|
+
window.rastro("identify", visitorId);
|
|
52
|
+
return true;
|
|
53
|
+
}, []);
|
|
54
|
+
const reset = useCallback(() => {
|
|
55
|
+
if (typeof window === "undefined" || !window.rastro)
|
|
56
|
+
return false;
|
|
57
|
+
window.rastro("reset");
|
|
58
|
+
return true;
|
|
59
|
+
}, []);
|
|
60
|
+
return useMemo(() => ({ context, track, identify, reset }), [context, track, identify, reset]);
|
|
30
61
|
}
|
|
31
62
|
//# sourceMappingURL=index.js.map
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export declare const RASTRO_VERSION = "0.
|
|
2
|
-
export declare const TRACKER_SOURCE = "(()=>{const t=document.currentScript,e=t?.dataset.site,i=t?.dataset.endpoint||t?.src&&new URL(\"events\",t.src).href;if(!e||!i)return;const n=()=>crypto.randomUUID?.()||Math.random()+\"\",
|
|
3
|
-
export declare const TRACKER_GZIP_BASE64 = "
|
|
4
|
-
export declare const TRACKER_RAW_BYTES =
|
|
5
|
-
export declare const TRACKER_GZIP_BYTES =
|
|
6
|
-
export declare const TRACKER_HASH = "
|
|
1
|
+
export declare const RASTRO_VERSION = "0.7.0";
|
|
2
|
+
export declare const TRACKER_SOURCE = "(()=>{const t=document.currentScript,e=t?.dataset.site,i=t?.dataset.endpoint||t?.src&&new URL(\"events\",t.src).href;if(!e||!i)return;const n=()=>crypto.randomUUID?.()||Math.random()+\"\",r=new URLSearchParams(location.search),s=r.get(\"ref\")?.slice(0,64);let o;for(const t of[\"source\",\"medium\",\"campaign\",\"term\",\"content\"]){const e=r.get(\"utm_\"+t)?.slice(0,64);e&&((o??={})[\"utm_\"+t]=e)}const a=\"gclid gbraid wbraid msclkid ttclid twclid li_fat_id ScCid rdt_cid dclid epik srsltid mc_cid mc_eid _hsenc igsh igshid fbclid\".split(\" \").filter(t=>r.has(t)).slice(0,8);let c,d,l,h,f=t.dataset.visitor||\"\",p=Boolean(f);try{f||=localStorage._rv||=n()}catch{}try{d=sessionStorage,l=d._r,c=d._ri==f&&d._rt,h=s||d._a,h&&(d._a=h),o||=d._u&&JSON.parse(d._u),o&&(d._u=JSON.stringify(o))}catch{h=s}let v,g=0;const u=[];let m=document.referrer.split(\"/\",3).join(\"/\")||void 0;const _=t=>{const n=u.splice(0,50);if(!n.length)return;const r=()=>new Blob([JSON.stringify({siteId:e,events:n,sentAt:Date.now()})]);let s=r();for(;s.size>64e3&&n.length>1;)u.unshift(n.pop()),s=r();t&&navigator.sendBeacon(i,s)||fetch(i,{method:\"POST\",body:s,keepalive:1}).catch(()=>{}),u.length&&_(t)},y=(t,e,i)=>{const r=Date.now(),s=r-c;c=r,s<18e5||(l=n(),\"pageview\"!=t&&(S=\"\",w()));try{d._r=l,d._ri=f,d._rt=r}catch{}u.push({eventId:`${l}.${r.toString(36)}.${g}`,sessionId:l,visitorId:f||l,type:t,name:e,path:location.pathname.slice(0,256),referrer:m,timestamp:r,sequence:g++,affiliateSlug:h,...i}),clearTimeout(v),v=setTimeout(_,1200)};let S;const w=()=>{const t=location.pathname;t!=S&&(S=t,y(\"pageview\",void 0,{properties:o,clid:a.length?a:void 0}))};window.rastro=(e,i,r)=>{if(\"context\"==e)return{sessionId:l,visitorId:f||l,identified:p};if(\"identify\"==e||\"reset\"==e){if(\"identify\"==e&&(!i||i.length>128||!/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(i)))return;if(\"identify\"==e&&i==f)return;_();const r=\"reset\"==e||p;if(p=\"identify\"==e,f=\"identify\"==e?i:n(),t.dataset.visitor=\"identify\"==e?f:\"\",r){h=void 0,o=void 0,m=void 0,a.length=0;try{\"reset\"==e&&(localStorage._rv=f),d._a=\"\",d._u=\"\"}catch{}}c=0,g=0,S=\"\",w()}\"event\"==e&&y(\"custom\",`${i||\"event\"}`.slice(0,80),r&&JSON.stringify(r).length>2e4?void 0:{properties:r})},document.addEventListener(\"click\",t=>{const e=t.target?.closest(\"a,button,[data-rastro-event]\");if(!e)return;const i=e.dataset.rastroEvent,n=e.href,r=n&&new URL(n),s=/^https?:$/.test(r?.protocol),o=s&&r.origin!=location.origin;y(i?\"custom\":o?\"outbound\":\"click\",i,{target:(e.dataset.rastroLabel||e.innerText||e.tagName).slice(0,64),href:s?((o?r.origin:\"\")+r.pathname).slice(0,256):void 0})},1);for(const t of[\"pushState\",\"replaceState\"]){const e=history[t];history[t]=(...t)=>{e.apply(history,t),w()}}addEventListener(\"popstate\",w);let b=0;const I=()=>{y(\"heartbeat\"),_()},L=()=>{b&&(clearInterval(b),b=0,y(\"leave\"),_(1))},E=()=>{document.hidden?L():b||(I(),b=setInterval(I,2e4))};addEventListener(\"pagehide\",L),addEventListener(\"pageshow\",E),document.addEventListener(\"visibilitychange\",E),b=setInterval(I,2e4),w(),E()})();";
|
|
3
|
+
export declare const TRACKER_GZIP_BASE64 = "H4sIAAAAAAACA31W23LbOBL9FRmVYgHrNiI7l8pSi6gmO3nwludSq+RlXR4FIpsiNhTAAZrSaET++xRIUYrt1LyQALqBbjTOOQDnQr0/ZM4GmpDKXdZs0JLMGu/R0iLzpiZARXOZa9IBSQZDCObbEbR57YyltqW5DD5LEou7yef/3nGGW7QUGFAcF7L0WMxMwS+wbS+M8EiNt7MhulUxlczva3LSa5u7zefPtz/OJRdt+5Om8jjIxSVj4NUxxgK1z8pftdebwCuXaTLOytCPCgjKyzUSZx4LJuYyVCZDPoW3r8WsQpq4WeE8P25/4op7FlzjM2TANpibZsOAZXpTa7O2DBih70ecJbTEHsSxcjiGaWizZJf0JBImCeduPleHTtyPPg8KRTdM14qts8rkk/XKa5NPdsNvE7Lqq8knRL2Rdv2vMstC09Lkk0X2b5NPfE7LzOSTvLdibb5Ogg8VxQWy3rLJlmjyybIMaLOJWYey/5h8UqziJCZDXRnibMKELExF6Dmp916WOnAS4rSXd0PRMsihghIKRScMbE0w5HzbMga1+uBchdryQszI7w9F26p4NNWCnNdrlEu/bVtluegyTVl56KJXrgKGYJw9ekGlcrn0kPU/o1SRJLFFUKrQtrlcaiiThMeGKgW4to2eTZL8Z/HLz7LWPmA0NgLc4Nao3hLIG7s2xZ47MWZQqtDFvW1hraZHRDbq/qHf8OZMDI8Feo9+LNlLBq+E/L8zNrZF226dySfjCktFJ3ZZ1fST+kq+mYqeB1ZWaNdUPqaC76kQAf6hcit+/yTrQ6TgbZ4iDPRKLQS09AOlP2pCad2Oi048DIcVlOeiR/ksyGD+xPdvX+OrJBkjv7+eiUY2NpSmIG5l7WoueuJwMaMksXpr1pqclwFt/gF15iw3EETbFkhZyQ0cNkily1P26y+LTwxWLt+nAb4i1royW0yvOyH7KvNebDoBzTF4kiw5iQ72ihMgmLMWeXXeS0zmKptlykP41/U7fNO2vIroAVbrNW4N7tiFoiThC8UY7LgQA+4iWlQFA3yK/k/Kj5hrZN2Ekh/6It7m6ZcXh6qTLw5eklv0xeav3oo4su6+wBGbt3lawRHst3latG0FtK8xJbB6gylCralMT0IUe9Fw4tDNm7cCRhSlGyCzwUB6U6ceAv7eoM0wXV9egi4KUxlNuKiadVqClNJ0ArIKtf9kNuga4lsBWxWQxv4Srm+mU9H1J784ommnHmn8s9RmdKEWffEI9vxcUhigDIfauxo9GQypgygYqT6e31yng1MnRDfbGZu7nfQ6kHeKIxjwMbIp+CCZfxBTCo9YP/xNRU2OlkxhME/rLhKFHUf2cYG2ZR4DDosdnlqThF+YtjUnfN+8a9uLl7/d/3D1P3315/Tqnw/n5lKmVw//ePFSEgbiRoiRiM9XjQI0WpdcnKh6zqVt6zivVo9mQvG4PzdphO4z6XziVaTxlhOHUh2PwY2NzdgYT0FNe7SfE0kS/lRuVSGgF0rGoFdCxkYedJmaRtWDkT3dcG0PK+05y5pAbsPgy4uDadujsftyvhamAvxRdc8q5cV4Ajf4ej6knH6LJd+JDk7CqvP8Y1z4zgRCi56zrDLZVwZnBUVFkrRfI81lVrkQj4xpWDVEzsJ9rOfVAL6rPscHNogsPlZXo/BU+8G9DwxWYf9AiW+L8xPGRvl5+VtJVId5OiLFz2XtHbnMVQKcCknipfNmbezFmWDDwGzPzXysYermzDW0co3NWTpu0cBh2FfKn6Z2p1dYtS1KYy36T/gHxQ7p9c96g+LbVwbE3NMwjy+NMZmUMXHpT0wXj1ToRN0OrsWzd1DUxgVpik8hj3WlMxy63zx6ShPI+f09PczOTcWllBR5j1LXdbXnRxuQ6NHVPT/q2tVhiLUbbq3V6RK+HdRrz1mJ2tMKNTEBSy46uBtMqyThvSreWkK/1RVfCVipaRSzCvUWe/9rITr4OMw4ga40eY52fsdFumpbfsvjxIB0WukWbvB11Lbv5KzXWJocGdwJ+L45lG7H4KP4O5RH9q9MZWifldqusff/XhKxdvAx3uxczP4CGKXLCLcLAAA=";
|
|
4
|
+
export declare const TRACKER_RAW_BYTES = 2999;
|
|
5
|
+
export declare const TRACKER_GZIP_BYTES = 1565;
|
|
6
|
+
export declare const TRACKER_HASH = "6246dc584683303a";
|
|
7
7
|
export declare const VITALS_SOURCE = "(()=>{const t=document.currentScript,e=t?.dataset.site,n=t?.dataset.endpoint||t?.src&&new URL(\"events\",t.src).href;if(!e||!n)return;const r=()=>crypto.randomUUID?.()||Math.random()+\"\";let s=t.dataset.visitor||\"\";try{s||=localStorage._rv||=r()}catch{}const o=Date.now();let a;try{a=sessionStorage._ri===s&&o-sessionStorage._rt<18e5&&sessionStorage._r||r(),sessionStorage._r=a,sessionStorage._ri=s,sessionStorage._rt=o}catch{a=r()}const i=s||a,c=location.pathname.slice(0,256),d={},h=[],l=(t,e,n)=>{try{const r=new PerformanceObserver(t=>e(t.getEntries()));r.observe({type:t,buffered:1,...n}),h.push({observer:r,handler:e})}catch{}},f=performance.getEntriesByType?.(\"navigation\")[0];f&&f.responseStart>0&&(d.TTFB=f.responseStart),l(\"paint\",t=>{for(const e of t)\"first-contentful-paint\"===e.name&&(d.FCP=e.startTime)}),l(\"largest-contentful-paint\",t=>{const e=t[t.length-1];e&&(d.LCP=e.startTime)});let m=0,u=0,v=0;l(\"layout-shift\",t=>{for(const e of t)e.hadRecentInput||(m&&e.startTime-v<1e3&&e.startTime-u<5e3?m+=e.value:(m=e.value,u=e.startTime),v=e.startTime,d.CLS=Math.max(d.CLS||0,1e3*m))});const g=[],p=new Set,S=t=>{for(const e of t)e.interactionId&&(p.add(e.interactionId),g.push(e.duration));if(!g.length)return;g.sort((t,e)=>e-t),g.length=Math.min(g.length,10);const e=performance.interactionCount||p.size;d.INP=g[Math.min(g.length-1,Math.floor(e/50))]};l(\"event\",S,{durationThreshold:40}),l(\"first-input\",S);let y=0;const b=()=>{if(y)return;for(const{observer:t,handler:e}of h)e(t.takeRecords()),t.disconnect();const t=Date.now(),r=Object.keys(d).map((e,n)=>({eventId:`${a}.${t.toString(36)}.v${n}`,sessionId:a,visitorId:i,type:\"vital\",name:e,value:Math.round(d[e]),path:c,timestamp:t,sequence:n}));if(!r.length)return;y=1;const s=new Blob([JSON.stringify({siteId:e,events:r,sentAt:t})]),o=navigator.sendBeacon?.bind(navigator);o&&o(n,s)||fetch(n,{method:\"POST\",body:s,keepalive:1}).catch(()=>{})};document.addEventListener(\"visibilitychange\",()=>{\"hidden\"===document.visibilityState&&b()}),addEventListener(\"pagehide\",b)})();";
|
|
8
8
|
export declare const VITALS_GZIP_BASE64 = "H4sIAAAAAAACA3VVbW/bNhD+K6lQCORKc/ayFINcJlj6AnjImqBOPwXBSosniatEauTJnSbpvw+i7MSJ22/SkXf33N1zDwmh4rxLrfF4gkLZtKnAIE8b58DgOnW6RgYCL7iSKD0g9xqBmUMLGFVbbbDv8YJ7l8axgW8nnz9dkQi2YNBHDEc75YWDbKkz8gL6/oWhDrBxZjlld2KEkrq2RsudNMpWnz+v3l1wQvv+T4nFzkjoqyhaloAnXuADhq32Gq3r+yhaoms73/eitKks12idzIH/5bZ9LxyhQyoxLbphymrFO4nAjf1GaAgqg7sUHrzX1jy6ayGEj2M7OzrBN4vf4CyOjw763hHKjsxCsu9E98dGFHaHVk7IA2QtfN9Llob6UFvDa4mFkRVwX+oUyJz9cvaaMiW6gRXi7p6VgiADZsZRj9XtGz6O6QZcZl0lTQrXGw9uC46gOAeCPAd8b9Bp8IRSunTcThdIh20NCbJNk2XgQCULxjk3A2UFrxtfkG530yWOFdKoElwCw0PrB5aJ+jHvQaLL9rat4YKTyMitzkN5Eb2b3y+zOM64A19b42GN0uH5PI6J4re3Hy7FsyPKShLVUhuMGIrzLrOOTEXDic1OkEaZdh5nqTUIBrOmnE23hRDAx1aG0B/e3gjgfox4qyugQ4hbSpfD95xDql0agXfISzA5FrPF/XKKd3UUL1CuEnPWiDnbivkyxG9tgzNf6OxH8IEXUn2CFAyuTN1g35Mqjg9Cz7ZvFnD61NS8OYPTi+qVAL6VZQMJqfafrHmCi20Pf5nib6/WIqxgJf8l4bfv52wBpz9VdKxiApePXKsDq9aAbC1+gF0bBCfTcbYrFcek5lIp8sxOWT5xCbhqXCACpUE78l1f9/KRc28dkpHiVJzDDEfX6coOtDZkb2GL+R4uPOHgQfK3thnFrOZe/wdLxVcfb0R+dxRqtmDBlpXWOgI/n80pvR/GCQbVi9iadXvot4UDX9hSJb/OJxZNBNTj9CK2nojQivkO2yaIYacz0u7LfGjk43LhwXLZ7KSg49ai/AqfILVOjWvLkCvtU2sMpEj2peOB6jEnrjd/Q4r8K7SeKMorWRMyyQXpQi0rlXx52cmBv+yQo12j0yYnp6/pwLcvOzN82WvXSiWS7bR4pRLNglJEW42yjNi4WAmwiX2TpNvGKKLu4J6yUcWSlKGuwKOs6gSZh38aMCkkZtgN3z0bfisWu5p8IN5laTfk7o/19UfuA0qdtaQb36yVSoBN71HimAeDv2OCA72nzIqd2ljHPRh1CTK15oJvtFHk4YgubRxbYpinfZ8BpgUxrKsAC6uS6OZ6fRuxjVVt4tlXgFqWegvJYqA8qB4JAx3osHx4ZKVS70c8V9ojGHAkGju30aXGNi2kySFiwSsqtFJgRnV6cH68ukaJEMcbMurTccxa5lBoBRHb0IESuvwfweV+3/MHAAA=";
|
|
9
9
|
export declare const VITALS_RAW_BYTES = 2035;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated.d.ts","sourceRoot":"","sources":["../../src/tracker/generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"generated.d.ts","sourceRoot":"","sources":["../../src/tracker/generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,cAAc,giGAAgiG,CAAC;AAC5jG,eAAO,MAAM,mBAAmB,6iEAA6iE,CAAC;AAC9kE,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,kBAAkB,OAAO,CAAC;AACvC,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAC/C,eAAO,MAAM,aAAa,shEAAshE,CAAC;AACjjE,eAAO,MAAM,kBAAkB,67CAA67C,CAAC;AAC79C,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AACtC,eAAO,MAAM,WAAW,qBAAqB,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// Generated by scripts/build-tracker.mjs. Do not edit.
|
|
2
|
-
export const RASTRO_VERSION = "0.
|
|
3
|
-
export const TRACKER_SOURCE = "(()=>{const t=document.currentScript,e=t?.dataset.site,i=t?.dataset.endpoint||t?.src&&new URL(\"events\",t.src).href;if(!e||!i)return;const n=()=>crypto.randomUUID?.()||Math.random()+\"\",
|
|
4
|
-
export const TRACKER_GZIP_BASE64 = "
|
|
5
|
-
export const TRACKER_RAW_BYTES =
|
|
6
|
-
export const TRACKER_GZIP_BYTES =
|
|
7
|
-
export const TRACKER_HASH = "
|
|
2
|
+
export const RASTRO_VERSION = "0.7.0";
|
|
3
|
+
export const TRACKER_SOURCE = "(()=>{const t=document.currentScript,e=t?.dataset.site,i=t?.dataset.endpoint||t?.src&&new URL(\"events\",t.src).href;if(!e||!i)return;const n=()=>crypto.randomUUID?.()||Math.random()+\"\",r=new URLSearchParams(location.search),s=r.get(\"ref\")?.slice(0,64);let o;for(const t of[\"source\",\"medium\",\"campaign\",\"term\",\"content\"]){const e=r.get(\"utm_\"+t)?.slice(0,64);e&&((o??={})[\"utm_\"+t]=e)}const a=\"gclid gbraid wbraid msclkid ttclid twclid li_fat_id ScCid rdt_cid dclid epik srsltid mc_cid mc_eid _hsenc igsh igshid fbclid\".split(\" \").filter(t=>r.has(t)).slice(0,8);let c,d,l,h,f=t.dataset.visitor||\"\",p=Boolean(f);try{f||=localStorage._rv||=n()}catch{}try{d=sessionStorage,l=d._r,c=d._ri==f&&d._rt,h=s||d._a,h&&(d._a=h),o||=d._u&&JSON.parse(d._u),o&&(d._u=JSON.stringify(o))}catch{h=s}let v,g=0;const u=[];let m=document.referrer.split(\"/\",3).join(\"/\")||void 0;const _=t=>{const n=u.splice(0,50);if(!n.length)return;const r=()=>new Blob([JSON.stringify({siteId:e,events:n,sentAt:Date.now()})]);let s=r();for(;s.size>64e3&&n.length>1;)u.unshift(n.pop()),s=r();t&&navigator.sendBeacon(i,s)||fetch(i,{method:\"POST\",body:s,keepalive:1}).catch(()=>{}),u.length&&_(t)},y=(t,e,i)=>{const r=Date.now(),s=r-c;c=r,s<18e5||(l=n(),\"pageview\"!=t&&(S=\"\",w()));try{d._r=l,d._ri=f,d._rt=r}catch{}u.push({eventId:`${l}.${r.toString(36)}.${g}`,sessionId:l,visitorId:f||l,type:t,name:e,path:location.pathname.slice(0,256),referrer:m,timestamp:r,sequence:g++,affiliateSlug:h,...i}),clearTimeout(v),v=setTimeout(_,1200)};let S;const w=()=>{const t=location.pathname;t!=S&&(S=t,y(\"pageview\",void 0,{properties:o,clid:a.length?a:void 0}))};window.rastro=(e,i,r)=>{if(\"context\"==e)return{sessionId:l,visitorId:f||l,identified:p};if(\"identify\"==e||\"reset\"==e){if(\"identify\"==e&&(!i||i.length>128||!/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(i)))return;if(\"identify\"==e&&i==f)return;_();const r=\"reset\"==e||p;if(p=\"identify\"==e,f=\"identify\"==e?i:n(),t.dataset.visitor=\"identify\"==e?f:\"\",r){h=void 0,o=void 0,m=void 0,a.length=0;try{\"reset\"==e&&(localStorage._rv=f),d._a=\"\",d._u=\"\"}catch{}}c=0,g=0,S=\"\",w()}\"event\"==e&&y(\"custom\",`${i||\"event\"}`.slice(0,80),r&&JSON.stringify(r).length>2e4?void 0:{properties:r})},document.addEventListener(\"click\",t=>{const e=t.target?.closest(\"a,button,[data-rastro-event]\");if(!e)return;const i=e.dataset.rastroEvent,n=e.href,r=n&&new URL(n),s=/^https?:$/.test(r?.protocol),o=s&&r.origin!=location.origin;y(i?\"custom\":o?\"outbound\":\"click\",i,{target:(e.dataset.rastroLabel||e.innerText||e.tagName).slice(0,64),href:s?((o?r.origin:\"\")+r.pathname).slice(0,256):void 0})},1);for(const t of[\"pushState\",\"replaceState\"]){const e=history[t];history[t]=(...t)=>{e.apply(history,t),w()}}addEventListener(\"popstate\",w);let b=0;const I=()=>{y(\"heartbeat\"),_()},L=()=>{b&&(clearInterval(b),b=0,y(\"leave\"),_(1))},E=()=>{document.hidden?L():b||(I(),b=setInterval(I,2e4))};addEventListener(\"pagehide\",L),addEventListener(\"pageshow\",E),document.addEventListener(\"visibilitychange\",E),b=setInterval(I,2e4),w(),E()})();";
|
|
4
|
+
export const TRACKER_GZIP_BASE64 = "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";
|
|
5
|
+
export const TRACKER_RAW_BYTES = 2999;
|
|
6
|
+
export const TRACKER_GZIP_BYTES = 1565;
|
|
7
|
+
export const TRACKER_HASH = "6246dc584683303a";
|
|
8
8
|
export const VITALS_SOURCE = "(()=>{const t=document.currentScript,e=t?.dataset.site,n=t?.dataset.endpoint||t?.src&&new URL(\"events\",t.src).href;if(!e||!n)return;const r=()=>crypto.randomUUID?.()||Math.random()+\"\";let s=t.dataset.visitor||\"\";try{s||=localStorage._rv||=r()}catch{}const o=Date.now();let a;try{a=sessionStorage._ri===s&&o-sessionStorage._rt<18e5&&sessionStorage._r||r(),sessionStorage._r=a,sessionStorage._ri=s,sessionStorage._rt=o}catch{a=r()}const i=s||a,c=location.pathname.slice(0,256),d={},h=[],l=(t,e,n)=>{try{const r=new PerformanceObserver(t=>e(t.getEntries()));r.observe({type:t,buffered:1,...n}),h.push({observer:r,handler:e})}catch{}},f=performance.getEntriesByType?.(\"navigation\")[0];f&&f.responseStart>0&&(d.TTFB=f.responseStart),l(\"paint\",t=>{for(const e of t)\"first-contentful-paint\"===e.name&&(d.FCP=e.startTime)}),l(\"largest-contentful-paint\",t=>{const e=t[t.length-1];e&&(d.LCP=e.startTime)});let m=0,u=0,v=0;l(\"layout-shift\",t=>{for(const e of t)e.hadRecentInput||(m&&e.startTime-v<1e3&&e.startTime-u<5e3?m+=e.value:(m=e.value,u=e.startTime),v=e.startTime,d.CLS=Math.max(d.CLS||0,1e3*m))});const g=[],p=new Set,S=t=>{for(const e of t)e.interactionId&&(p.add(e.interactionId),g.push(e.duration));if(!g.length)return;g.sort((t,e)=>e-t),g.length=Math.min(g.length,10);const e=performance.interactionCount||p.size;d.INP=g[Math.min(g.length-1,Math.floor(e/50))]};l(\"event\",S,{durationThreshold:40}),l(\"first-input\",S);let y=0;const b=()=>{if(y)return;for(const{observer:t,handler:e}of h)e(t.takeRecords()),t.disconnect();const t=Date.now(),r=Object.keys(d).map((e,n)=>({eventId:`${a}.${t.toString(36)}.v${n}`,sessionId:a,visitorId:i,type:\"vital\",name:e,value:Math.round(d[e]),path:c,timestamp:t,sequence:n}));if(!r.length)return;y=1;const s=new Blob([JSON.stringify({siteId:e,events:r,sentAt:t})]),o=navigator.sendBeacon?.bind(navigator);o&&o(n,s)||fetch(n,{method:\"POST\",body:s,keepalive:1}).catch(()=>{})};document.addEventListener(\"visibilitychange\",()=>{\"hidden\"===document.visibilityState&&b()}),addEventListener(\"pagehide\",b)})();";
|
|
9
9
|
export const VITALS_GZIP_BASE64 = "H4sIAAAAAAACA3VVbW/bNhD+K6lQCORKc/ayFINcJlj6AnjImqBOPwXBSosniatEauTJnSbpvw+i7MSJ22/SkXf33N1zDwmh4rxLrfF4gkLZtKnAIE8b58DgOnW6RgYCL7iSKD0g9xqBmUMLGFVbbbDv8YJ7l8axgW8nnz9dkQi2YNBHDEc75YWDbKkz8gL6/oWhDrBxZjlld2KEkrq2RsudNMpWnz+v3l1wQvv+T4nFzkjoqyhaloAnXuADhq32Gq3r+yhaoms73/eitKks12idzIH/5bZ9LxyhQyoxLbphymrFO4nAjf1GaAgqg7sUHrzX1jy6ayGEj2M7OzrBN4vf4CyOjw763hHKjsxCsu9E98dGFHaHVk7IA2QtfN9Llob6UFvDa4mFkRVwX+oUyJz9cvaaMiW6gRXi7p6VgiADZsZRj9XtGz6O6QZcZl0lTQrXGw9uC46gOAeCPAd8b9Bp8IRSunTcThdIh20NCbJNk2XgQCULxjk3A2UFrxtfkG530yWOFdKoElwCw0PrB5aJ+jHvQaLL9rat4YKTyMitzkN5Eb2b3y+zOM64A19b42GN0uH5PI6J4re3Hy7FsyPKShLVUhuMGIrzLrOOTEXDic1OkEaZdh5nqTUIBrOmnE23hRDAx1aG0B/e3gjgfox4qyugQ4hbSpfD95xDql0agXfISzA5FrPF/XKKd3UUL1CuEnPWiDnbivkyxG9tgzNf6OxH8IEXUn2CFAyuTN1g35Mqjg9Cz7ZvFnD61NS8OYPTi+qVAL6VZQMJqfafrHmCi20Pf5nib6/WIqxgJf8l4bfv52wBpz9VdKxiApePXKsDq9aAbC1+gF0bBCfTcbYrFcek5lIp8sxOWT5xCbhqXCACpUE78l1f9/KRc28dkpHiVJzDDEfX6coOtDZkb2GL+R4uPOHgQfK3thnFrOZe/wdLxVcfb0R+dxRqtmDBlpXWOgI/n80pvR/GCQbVi9iadXvot4UDX9hSJb/OJxZNBNTj9CK2nojQivkO2yaIYacz0u7LfGjk43LhwXLZ7KSg49ai/AqfILVOjWvLkCvtU2sMpEj2peOB6jEnrjd/Q4r8K7SeKMorWRMyyQXpQi0rlXx52cmBv+yQo12j0yYnp6/pwLcvOzN82WvXSiWS7bR4pRLNglJEW42yjNi4WAmwiX2TpNvGKKLu4J6yUcWSlKGuwKOs6gSZh38aMCkkZtgN3z0bfisWu5p8IN5laTfk7o/19UfuA0qdtaQb36yVSoBN71HimAeDv2OCA72nzIqd2ljHPRh1CTK15oJvtFHk4YgubRxbYpinfZ8BpgUxrKsAC6uS6OZ6fRuxjVVt4tlXgFqWegvJYqA8qB4JAx3osHx4ZKVS70c8V9ojGHAkGju30aXGNi2kySFiwSsqtFJgRnV6cH68ukaJEMcbMurTccxa5lBoBRHb0IESuvwfweV+3/MHAAA=";
|
|
10
10
|
export const VITALS_RAW_BYTES = 2035;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/tracker/generated.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG,
|
|
1
|
+
{"version":3,"file":"generated.js","sourceRoot":"","sources":["../../src/tracker/generated.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG,6hGAA6hG,CAAC;AAC5jG,MAAM,CAAC,MAAM,mBAAmB,GAAG,0iEAA0iE,CAAC;AAC9kE,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AACvC,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,mhEAAmhE,CAAC;AACjjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,07CAA07C,CAAC;AAC79C,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC"}
|
|
@@ -20,8 +20,9 @@ interface RastroEvent {
|
|
|
20
20
|
interface RastroContext {
|
|
21
21
|
sessionId: string;
|
|
22
22
|
visitorId: string;
|
|
23
|
+
identified: boolean;
|
|
23
24
|
}
|
|
24
|
-
type RastroCommand = (command: "event" | "context", value?: string, properties?: RastroProperties) => RastroContext | void;
|
|
25
|
+
type RastroCommand = (command: "event" | "context" | "identify" | "reset", value?: string, properties?: RastroProperties) => RastroContext | void;
|
|
25
26
|
interface RastroWindow extends Window {
|
|
26
27
|
rastro?: RastroCommand;
|
|
27
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/tracker/tracker.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACvD,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACvD,KAAK,eAAe,GAChB,UAAU,GACV,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,UAAU,GACV,OAAO,CAAC;AAEZ,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/tracker/tracker.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACvD,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACvD,KAAK,eAAe,GAChB,UAAU,GACV,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,UAAU,GACV,OAAO,CAAC;AAEZ,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,KAAK,aAAa,GAAG,CACnB,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,EACnD,KAAK,CAAC,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,gBAAgB,KAC1B,aAAa,GAAG,IAAI,CAAC;AAE1B,UAAU,YAAa,SAAQ,MAAM;IACnC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB"}
|
package/dist/tracker/tracker.js
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
// localStorage), and, when storage is blocked, the per-tab session id —
|
|
29
29
|
// which the server then counts through its salted daily hash.
|
|
30
30
|
let identity = script.dataset.visitor || "";
|
|
31
|
+
let identified = Boolean(identity);
|
|
31
32
|
try {
|
|
32
33
|
identity ||= localStorage._rv ||= createId();
|
|
33
34
|
}
|
|
@@ -62,7 +63,7 @@
|
|
|
62
63
|
// Scheme and host, never the path or query. Not `new URL().origin`: that is
|
|
63
64
|
// the literal "null" for an app link, which would lose the package that
|
|
64
65
|
// names the app — `android-app://com.instagram.android` survives this.
|
|
65
|
-
|
|
66
|
+
let referrer = document.referrer.split("/", 3).join("/") || undefined;
|
|
66
67
|
const flush = (beacon) => {
|
|
67
68
|
const events = queue.splice(0, 50);
|
|
68
69
|
if (!events.length)
|
|
@@ -133,7 +134,45 @@
|
|
|
133
134
|
};
|
|
134
135
|
window.rastro = (command, value, properties) => {
|
|
135
136
|
if (command == "context") {
|
|
136
|
-
return {
|
|
137
|
+
return {
|
|
138
|
+
sessionId,
|
|
139
|
+
visitorId: identity || sessionId,
|
|
140
|
+
identified,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (command == "identify" || command == "reset") {
|
|
144
|
+
if (command == "identify" &&
|
|
145
|
+
(!value ||
|
|
146
|
+
value.length > 128 ||
|
|
147
|
+
!/^[A-Za-z0-9][A-Za-z0-9_.:-]*$/.test(value)))
|
|
148
|
+
return;
|
|
149
|
+
if (command == "identify" && value == identity)
|
|
150
|
+
return;
|
|
151
|
+
flush();
|
|
152
|
+
const clearAttribution = command == "reset" || identified;
|
|
153
|
+
identified = command == "identify";
|
|
154
|
+
identity = command == "identify" ? value : createId();
|
|
155
|
+
script.dataset.visitor = command == "identify" ? identity : "";
|
|
156
|
+
if (clearAttribution) {
|
|
157
|
+
// A shared browser's next person starts with a fresh visitor and campaign.
|
|
158
|
+
affiliate = undefined;
|
|
159
|
+
utm = undefined;
|
|
160
|
+
referrer = undefined;
|
|
161
|
+
clid.length = 0;
|
|
162
|
+
try {
|
|
163
|
+
if (command == "reset")
|
|
164
|
+
localStorage._rv = identity;
|
|
165
|
+
store._a = "";
|
|
166
|
+
store._u = "";
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
/* Storage can be blocked. */
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
last = 0;
|
|
173
|
+
sequence = 0;
|
|
174
|
+
lastPath = "";
|
|
175
|
+
pageview();
|
|
137
176
|
}
|
|
138
177
|
if (command == "event") {
|
|
139
178
|
emit("custom", `${value || "event"}`.slice(0, 80), properties && JSON.stringify(properties).length > 20_000
|