@iann29/rastro 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +146 -24
  2. package/agent/integration.md +66 -29
  3. package/agent/manifest.json +19 -8
  4. package/agent/manifest.schema.json +28 -9
  5. package/dist/client/federation.d.ts +38 -8
  6. package/dist/client/federation.d.ts.map +1 -1
  7. package/dist/client/federation.js +18 -1
  8. package/dist/client/federation.js.map +1 -1
  9. package/dist/client/identity.d.ts +11 -0
  10. package/dist/client/identity.d.ts.map +1 -0
  11. package/dist/client/identity.js +123 -0
  12. package/dist/client/identity.js.map +1 -0
  13. package/dist/client/index.d.ts +501 -11
  14. package/dist/client/index.d.ts.map +1 -1
  15. package/dist/client/index.js +220 -4
  16. package/dist/client/index.js.map +1 -1
  17. package/dist/component/_generated/api.d.ts +8 -0
  18. package/dist/component/_generated/api.d.ts.map +1 -1
  19. package/dist/component/_generated/api.js.map +1 -1
  20. package/dist/component/_generated/component.d.ts +158 -1
  21. package/dist/component/_generated/component.d.ts.map +1 -1
  22. package/dist/component/constants.d.ts +2 -0
  23. package/dist/component/constants.d.ts.map +1 -1
  24. package/dist/component/constants.js +7 -0
  25. package/dist/component/constants.js.map +1 -1
  26. package/dist/component/coverage.d.ts +1 -0
  27. package/dist/component/coverage.d.ts.map +1 -1
  28. package/dist/component/coverage.js +6 -1
  29. package/dist/component/coverage.js.map +1 -1
  30. package/dist/component/eventStore.d.ts +2 -0
  31. package/dist/component/eventStore.d.ts.map +1 -1
  32. package/dist/component/http.d.ts.map +1 -1
  33. package/dist/component/http.js +51 -1
  34. package/dist/component/http.js.map +1 -1
  35. package/dist/component/ingest.d.ts +2 -0
  36. package/dist/component/ingest.d.ts.map +1 -1
  37. package/dist/component/ingest.js +72 -22
  38. package/dist/component/ingest.js.map +1 -1
  39. package/dist/component/origin.d.ts +70 -0
  40. package/dist/component/origin.d.ts.map +1 -0
  41. package/dist/component/origin.js +230 -0
  42. package/dist/component/origin.js.map +1 -0
  43. package/dist/component/people.d.ts +79 -0
  44. package/dist/component/people.d.ts.map +1 -0
  45. package/dist/component/people.js +249 -0
  46. package/dist/component/people.js.map +1 -0
  47. package/dist/component/platforms.d.ts +33 -0
  48. package/dist/component/platforms.d.ts.map +1 -0
  49. package/dist/component/platforms.js +328 -0
  50. package/dist/component/platforms.js.map +1 -0
  51. package/dist/component/reports.d.ts +35 -74
  52. package/dist/component/reports.d.ts.map +1 -1
  53. package/dist/component/reports.js +59 -14
  54. package/dist/component/reports.js.map +1 -1
  55. package/dist/component/sanitize.d.ts +5 -0
  56. package/dist/component/sanitize.d.ts.map +1 -1
  57. package/dist/component/sanitize.js +33 -1
  58. package/dist/component/sanitize.js.map +1 -1
  59. package/dist/component/schema.d.ts +101 -7
  60. package/dist/component/schema.js +45 -1
  61. package/dist/component/schema.js.map +1 -1
  62. package/dist/component/trackedLinks.d.ts +91 -0
  63. package/dist/component/trackedLinks.d.ts.map +1 -0
  64. package/dist/component/trackedLinks.js +314 -0
  65. package/dist/component/trackedLinks.js.map +1 -0
  66. package/dist/component/useragent.d.ts +6 -0
  67. package/dist/component/useragent.d.ts.map +1 -1
  68. package/dist/component/useragent.js +9 -0
  69. package/dist/component/useragent.js.map +1 -1
  70. package/dist/component/validators.d.ts +101 -11
  71. package/dist/component/validators.d.ts.map +1 -1
  72. package/dist/component/validators.js +62 -1
  73. package/dist/component/validators.js.map +1 -1
  74. package/dist/component/visitors.d.ts +38 -2
  75. package/dist/component/visitors.d.ts.map +1 -1
  76. package/dist/component/visitors.js +162 -42
  77. package/dist/component/visitors.js.map +1 -1
  78. package/dist/react/index.d.ts +9 -5
  79. package/dist/react/index.d.ts.map +1 -1
  80. package/dist/react/index.js +36 -5
  81. package/dist/react/index.js.map +1 -1
  82. package/dist/tracker/generated.d.ts +6 -6
  83. package/dist/tracker/generated.d.ts.map +1 -1
  84. package/dist/tracker/generated.js +6 -6
  85. package/dist/tracker/generated.js.map +1 -1
  86. package/dist/tracker/tracker.d.ts +3 -1
  87. package/dist/tracker/tracker.d.ts.map +1 -1
  88. package/dist/tracker/tracker.js +56 -5
  89. package/dist/tracker/tracker.js.map +1 -1
  90. package/dist/tracker.min.js +1 -1
  91. package/docs/federation.md +24 -0
  92. package/docs/identity.md +307 -0
  93. package/docs/upgrading.md +190 -19
  94. package/llms.txt +11 -2
  95. package/package.json +5 -3
  96. package/src/component/_generated/api.ts +8 -0
  97. package/src/component/_generated/component.ts +251 -1
  98. package/src/component/constants.ts +7 -0
  99. package/src/component/coverage.ts +7 -1
  100. package/src/component/http.ts +56 -1
  101. package/src/component/ingest.ts +100 -28
  102. package/src/component/origin.ts +273 -0
  103. package/src/component/people.ts +321 -0
  104. package/src/component/platforms.ts +359 -0
  105. package/src/component/reports.ts +84 -13
  106. package/src/component/sanitize.ts +39 -1
  107. package/src/component/schema.ts +53 -0
  108. package/src/component/trackedLinks.ts +384 -0
  109. package/src/component/useragent.ts +11 -0
  110. package/src/component/validators.ts +120 -0
  111. package/src/component/visitors.ts +232 -55
  112. 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 { mutation } from "./_generated/server.js";
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
- const site = await ctx.db.get("sites", args.siteId);
21
- if (!site)
79
+ if (!(await ctx.db.get("sites", args.siteId)))
22
80
  fail("NOT_FOUND", "site not found");
23
- let visitorId;
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 previousOwnsAliases = await ctx.db
39
- .query("visitorAliases")
40
- .withIndex("by_siteId_and_visitorId", (range) => range.eq("siteId", args.siteId).eq("visitorId", previousVisitorId))
41
- .first();
42
- if (previousOwnsAliases) {
43
- fail("CONFLICT", "previousVisitorId already owns linked visitors");
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
- const aliases = await ctx.db
46
- .query("visitorAliases")
47
- .withIndex("by_siteId_and_visitorId", (range) => range.eq("siteId", args.siteId).eq("visitorId", visitorId))
48
- .take(MAX_VISITOR_ALIASES);
49
- const existing = await findAlias(ctx, args.siteId, previousVisitorId);
50
- if (existing) {
51
- if (existing.visitorId !== visitorId) {
52
- fail("CONFLICT", "previousVisitorId is already linked to a different visitor");
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
- await ctx.db.insert("visitorAliases", {
62
- siteId: args.siteId,
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
- previousVisitorId,
65
- linkedAt: Date.now(),
66
- });
67
- return { linked: true, aliasCount: aliases.length + 1 };
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":"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"}
1
+ {"version":3,"file":"visitors.js","sourceRoot":"","sources":["../../src/component/visitors.ts"],"names":[],"mappings":"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"}
@@ -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 sub-1KB cookieless tracker with CSP nonce support. */
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
- onLoad: (() => void) | undefined;
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
- }, HTMLElement>;
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;CACnB;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;CACjE;AAED,KAAK,aAAa,GAAG,CACnB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,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,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,GAAG,EACH,QAAQ,EACR,SAAS,EACT,KAAK,EACL,MAAM,EACN,OAAO,GACR,EAAE,iBAAiB;;;;mBAnCH,IAAI;oBACH,IAAI;;;;gBA6CrB;AAED,mFAAmF;AACnF,wBAAgB,SAAS,IAAI,gBAAgB,CAa5C"}
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"}
@@ -1,13 +1,30 @@
1
1
  "use client";
2
- import { createElement, useCallback, useMemo } from "react";
3
- /** Renders the sub-1KB cookieless tracker with CSP nonce support. */
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
- onLoad,
10
- onError,
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
- return useMemo(() => ({ context, track }), [context, track]);
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
@@ -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;AAqC5D,qEAAqE;AACrE,MAAM,UAAU,YAAY,CAAC,EAC3B,MAAM,EACN,GAAG,EACH,QAAQ,EACR,SAAS,EACT,KAAK,EACL,MAAM,EACN,OAAO,GACW;IAClB,OAAO,aAAa,CAAC,QAAQ,EAAE;QAC7B,KAAK,EAAE,IAAI;QACX,GAAG;QACH,KAAK;QACL,MAAM;QACN,OAAO;QACP,WAAW,EAAE,MAAM;QACnB,eAAe,EAAE,QAAQ;QACzB,cAAc,EAAE,SAAS;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,SAAS;IACvB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,IAAY,EAAE,UAA6B,EAAE,EAAE;QACxE,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAkB,CAAC;IACnD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/D,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.4.0";
2
- export declare const TRACKER_SOURCE = "(()=>{const e=document.currentScript,t=e?.dataset.site,n=e?.dataset.endpoint||e?.src&&new URL(\"events\",e.src).href;if(!t||!n)return;const r=()=>crypto.randomUUID?.()||Math.random()+\"\",o=new URLSearchParams(location.search),s=o.get(\"ref\")?.slice(0,64);let a;for(const e of[\"source\",\"medium\",\"campaign\",\"term\",\"content\"]){const t=o.get(\"utm_\"+e)?.slice(0,64);t&&((a??={})[\"utm_\"+e]=t)}let i,c,d,l,h=e.dataset.visitor||\"\";try{h||=localStorage._rv||=r()}catch{}try{c=sessionStorage,d=c._r,i=c._ri==h&&c._rt,l=s||c._a,l&&(c._a=l),a||=c._u&&JSON.parse(c._u),a&&(c._u=JSON.stringify(a))}catch{l=s}let p,u=0;const v=[],g=document.referrer?new URL(document.referrer).origin:void 0,m=e=>{const r=v.splice(0,50);if(!r.length)return;const o=()=>new Blob([JSON.stringify({siteId:t,events:r,sentAt:Date.now()})]);let s=o();for(;s.size>64e3&&r.length>1;)v.unshift(r.pop()),s=o();e&&navigator.sendBeacon(n,s)||fetch(n,{method:\"POST\",body:s,keepalive:1}).catch(()=>{}),v.length&&m(e)},f=(e,t,n)=>{const o=Date.now(),s=o-i;i=o,s<18e5||(d=r(),\"pageview\"!=e&&(y=\"\",_()));try{c._r=d,c._ri=h,c._rt=o}catch{}v.push({eventId:`${d}.${o.toString(36)}.${u}`,sessionId:d,visitorId:h||d,type:e,name:t,path:location.pathname.slice(0,256),referrer:g,timestamp:o,sequence:u++,affiliateSlug:l,...n}),clearTimeout(p),p=setTimeout(m,1200)};let y;const _=()=>{const e=location.pathname;e!=y&&(y=e,f(\"pageview\",void 0,a&&{properties:a}))};window.rastro=(e,t,n)=>{if(\"context\"==e)return{sessionId:d,visitorId:h||d};\"event\"==e&&f(\"custom\",`${t||\"event\"}`.slice(0,80),n&&JSON.stringify(n).length>2e4?void 0:{properties:n})},document.addEventListener(\"click\",e=>{const t=e.target?.closest(\"a,button,[data-rastro-event]\");if(!t)return;const n=t.dataset.rastroEvent,r=t.href,o=r&&new URL(r),s=/^https?:$/.test(o?.protocol),a=s&&o.origin!=location.origin;f(n?\"custom\":a?\"outbound\":\"click\",n,{target:(t.dataset.rastroLabel||t.innerText||t.tagName).slice(0,64),href:s?((a?o.origin:\"\")+o.pathname).slice(0,256):void 0})},1);for(const e of[\"pushState\",\"replaceState\"]){const t=history[e];history[e]=(...e)=>{t.apply(history,e),_()}}addEventListener(\"popstate\",_);let S=0;const w=()=>{f(\"heartbeat\"),m()},I=()=>{S&&(clearInterval(S),S=0,f(\"leave\"),m(1))},L=()=>{document.hidden?I():S||(w(),S=setInterval(w,2e4))};addEventListener(\"pagehide\",I),addEventListener(\"pageshow\",L),document.addEventListener(\"visibilitychange\",L),S=setInterval(w,2e4),_(),L()})();";
3
- export declare const TRACKER_GZIP_BASE64 = "H4sIAAAAAAACA32VUW/bNhDHv0pCBAKJXFmnTYNCHmus6B48ZG0xt09BljDS2SIqkRp5sutZ+u4DJdlOmm5PEnkn3fH4+99xLtS7XeZsoBNUucuaCi3JrPEeLS0yb2oCUjiTuSYdkGQwhGAf76DNa2cstS3OZPBZkljcnHz985ozXKOlwADjvpCFx+XULPkpte2pFR6p8XY6RPcqppL5bU1Oem1zV339Ov8wk1y07R+ainGTi3PGwKkxxgK1z4rP2usq8NJlmoyzMvS7AoJycoXEmcclEzMZSpMhn8DVpZiWSCd6unSej8c/ccsbFlzjM2TAKsxNUzFgma5qbVaWASP0/Y6zhJbYrRgrR/swDVV37Bx/iERJwrmezdSuEzd7n1tFoos5GMgghxIKhYeSrk0w5HzbMjYlv90Vbavi4coFOa9XKO/8um2V56LLNGXFrotemQoYgnF29IJcZfLOg+kfRqkiSeIbQalC22byTkOZJDy+qFKAbtvo2STJ74tPH2WtfcBobATowa1RvSWQN3ZllluuxT6DUoX+ODU0ajLe6Vrd3MLqiJXHJXqPfrYH5JlFSOfNyth07Ux+MoFK4YFPr9Yy1GNd30xET5KXJdoVFU9hcj1MMcr70j3wmx+y3kWI53lKMACaegho6VdKP2hCad2Gi07cDowE5bjoOZkGGcw/+O7qEl8nyT7yu4upWMvGhsIsiXtZu5qLHj0uppgkVq/NSpPzMqDN36POnOUWgmjbJVJWcAu7Cqlweco+f1p8YfDg8m0a4BtirUuzxvSiE7KvMu/l2glYj8GTpOIoOlgqjkBgj2p26niWmMwLMzXKQfjl4i2+aVueR3qA1XqFa4MbdqowSfhWMQZ3XAjRcxdpUTkM+BT9k5TbM7eWdRMKvuuLOM/T+7Nd3smznZPkFn2x+esrEXea7h5GNud5msPI9zxPi7bNgbY1pghWV5gS1JqK9CDluIqGg6JevbkSsOclXQGZCgPpqk4dBPy7QZth2pyfg14uTWk04aJsVmkJUkrbCchK1P6LqdA1xGsBtQpI+3UFF68mE9H1N78dabpTT7rks9SmeKq2ffEQlvxYUhgh1kmyq72r0ZPBkOpOiG66MTZ3G+l1IO8e3Z5Z8qHBfCemFI5c7/67et10aLPRO0ni100gVzG4P9tR247G7v5QwLcTAXbU+FETVux5foWXsyHz9HHathMdHASr8/y3+ONrEwgtes6y0mTfGBz1Sgolab9CmsmsdAEDcabhoSFyFm5ir3sxHP9Fn+MtGyRNT7VsFR364uDeBwavqB8o4JQ/jhwfYX/5V0FUh1l69lJSDOtmsvaOXOZim1MhSdzYaE6P1zlsTJfczvY1TPWMuYYeXGNzlu6PaGE3nCvlP6Z2rR+wbFuSxlr0X/A7xQXp1UddoXg8FSDmnoZZnAz7ZFLGxLk7cCWeMD+2xHgLF+LZ3IpKXJCmOLo81qXOcFg+GlKFCeT89gZvp8dXxaWUGMkjqeu63PLRBihiJ+i651dduzoMse6GHrk4tPzNoJUlZwVqTw+oiQmouOhgPpgWcZREDc4toV/rki8ELNQkSqdEvcbe/0KIDq6HLw7QFSbP0c7mXKSLtuWxsy2ieg9/2sArvIzq+knOeoWFyZHBXMDPzaFwGwbX4v8oj9p7MKWhbVZou8Le/2dJxNrBdZwjXEz/BQqEd9NnCQAA";
4
- export declare const TRACKER_RAW_BYTES = 2407;
5
- export declare const TRACKER_GZIP_BYTES = 1278;
6
- export declare const TRACKER_HASH = "7fccc2fba6e092cb";
1
+ export declare const RASTRO_VERSION = "0.6.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 = "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";
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,86EAA86E,CAAC;AAC18E,eAAO,MAAM,mBAAmB,6qDAA6qD,CAAC;AAC9sD,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
+ {"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.4.0";
3
- export const TRACKER_SOURCE = "(()=>{const e=document.currentScript,t=e?.dataset.site,n=e?.dataset.endpoint||e?.src&&new URL(\"events\",e.src).href;if(!t||!n)return;const r=()=>crypto.randomUUID?.()||Math.random()+\"\",o=new URLSearchParams(location.search),s=o.get(\"ref\")?.slice(0,64);let a;for(const e of[\"source\",\"medium\",\"campaign\",\"term\",\"content\"]){const t=o.get(\"utm_\"+e)?.slice(0,64);t&&((a??={})[\"utm_\"+e]=t)}let i,c,d,l,h=e.dataset.visitor||\"\";try{h||=localStorage._rv||=r()}catch{}try{c=sessionStorage,d=c._r,i=c._ri==h&&c._rt,l=s||c._a,l&&(c._a=l),a||=c._u&&JSON.parse(c._u),a&&(c._u=JSON.stringify(a))}catch{l=s}let p,u=0;const v=[],g=document.referrer?new URL(document.referrer).origin:void 0,m=e=>{const r=v.splice(0,50);if(!r.length)return;const o=()=>new Blob([JSON.stringify({siteId:t,events:r,sentAt:Date.now()})]);let s=o();for(;s.size>64e3&&r.length>1;)v.unshift(r.pop()),s=o();e&&navigator.sendBeacon(n,s)||fetch(n,{method:\"POST\",body:s,keepalive:1}).catch(()=>{}),v.length&&m(e)},f=(e,t,n)=>{const o=Date.now(),s=o-i;i=o,s<18e5||(d=r(),\"pageview\"!=e&&(y=\"\",_()));try{c._r=d,c._ri=h,c._rt=o}catch{}v.push({eventId:`${d}.${o.toString(36)}.${u}`,sessionId:d,visitorId:h||d,type:e,name:t,path:location.pathname.slice(0,256),referrer:g,timestamp:o,sequence:u++,affiliateSlug:l,...n}),clearTimeout(p),p=setTimeout(m,1200)};let y;const _=()=>{const e=location.pathname;e!=y&&(y=e,f(\"pageview\",void 0,a&&{properties:a}))};window.rastro=(e,t,n)=>{if(\"context\"==e)return{sessionId:d,visitorId:h||d};\"event\"==e&&f(\"custom\",`${t||\"event\"}`.slice(0,80),n&&JSON.stringify(n).length>2e4?void 0:{properties:n})},document.addEventListener(\"click\",e=>{const t=e.target?.closest(\"a,button,[data-rastro-event]\");if(!t)return;const n=t.dataset.rastroEvent,r=t.href,o=r&&new URL(r),s=/^https?:$/.test(o?.protocol),a=s&&o.origin!=location.origin;f(n?\"custom\":a?\"outbound\":\"click\",n,{target:(t.dataset.rastroLabel||t.innerText||t.tagName).slice(0,64),href:s?((a?o.origin:\"\")+o.pathname).slice(0,256):void 0})},1);for(const e of[\"pushState\",\"replaceState\"]){const t=history[e];history[e]=(...e)=>{t.apply(history,e),_()}}addEventListener(\"popstate\",_);let S=0;const w=()=>{f(\"heartbeat\"),m()},I=()=>{S&&(clearInterval(S),S=0,f(\"leave\"),m(1))},L=()=>{document.hidden?I():S||(w(),S=setInterval(w,2e4))};addEventListener(\"pagehide\",I),addEventListener(\"pageshow\",L),document.addEventListener(\"visibilitychange\",L),S=setInterval(w,2e4),_(),L()})();";
4
- export const TRACKER_GZIP_BASE64 = "H4sIAAAAAAACA32VUW/bNhDHv0pCBAKJXFmnTYNCHmus6B48ZG0xt09BljDS2SIqkRp5sutZ+u4DJdlOmm5PEnkn3fH4+99xLtS7XeZsoBNUucuaCi3JrPEeLS0yb2oCUjiTuSYdkGQwhGAf76DNa2cstS3OZPBZkljcnHz985ozXKOlwADjvpCFx+XULPkpte2pFR6p8XY6RPcqppL5bU1Oem1zV339Ov8wk1y07R+ainGTi3PGwKkxxgK1z4rP2usq8NJlmoyzMvS7AoJycoXEmcclEzMZSpMhn8DVpZiWSCd6unSej8c/ccsbFlzjM2TAKsxNUzFgma5qbVaWASP0/Y6zhJbYrRgrR/swDVV37Bx/iERJwrmezdSuEzd7n1tFoos5GMgghxIKhYeSrk0w5HzbMjYlv90Vbavi4coFOa9XKO/8um2V56LLNGXFrotemQoYgnF29IJcZfLOg+kfRqkiSeIbQalC22byTkOZJDy+qFKAbtvo2STJ74tPH2WtfcBobATowa1RvSWQN3ZllluuxT6DUoX+ODU0ajLe6Vrd3MLqiJXHJXqPfrYH5JlFSOfNyth07Ux+MoFK4YFPr9Yy1GNd30xET5KXJdoVFU9hcj1MMcr70j3wmx+y3kWI53lKMACaegho6VdKP2hCad2Gi07cDowE5bjoOZkGGcw/+O7qEl8nyT7yu4upWMvGhsIsiXtZu5qLHj0uppgkVq/NSpPzMqDN36POnOUWgmjbJVJWcAu7Cqlweco+f1p8YfDg8m0a4BtirUuzxvSiE7KvMu/l2glYj8GTpOIoOlgqjkBgj2p26niWmMwLMzXKQfjl4i2+aVueR3qA1XqFa4MbdqowSfhWMQZ3XAjRcxdpUTkM+BT9k5TbM7eWdRMKvuuLOM/T+7Nd3smznZPkFn2x+esrEXea7h5GNud5msPI9zxPi7bNgbY1pghWV5gS1JqK9CDluIqGg6JevbkSsOclXQGZCgPpqk4dBPy7QZth2pyfg14uTWk04aJsVmkJUkrbCchK1P6LqdA1xGsBtQpI+3UFF68mE9H1N78dabpTT7rks9SmeKq2ffEQlvxYUhgh1kmyq72r0ZPBkOpOiG66MTZ3G+l1IO8e3Z5Z8qHBfCemFI5c7/67et10aLPRO0ni100gVzG4P9tR247G7v5QwLcTAXbU+FETVux5foWXsyHz9HHathMdHASr8/y3+ONrEwgtes6y0mTfGBz1Sgolab9CmsmsdAEDcabhoSFyFm5ir3sxHP9Fn+MtGyRNT7VsFR364uDeBwavqB8o4JQ/jhwfYX/5V0FUh1l69lJSDOtmsvaOXOZim1MhSdzYaE6P1zlsTJfczvY1TPWMuYYeXGNzlu6PaGE3nCvlP6Z2rR+wbFuSxlr0X/A7xQXp1UddoXg8FSDmnoZZnAz7ZFLGxLk7cCWeMD+2xHgLF+LZ3IpKXJCmOLo81qXOcFg+GlKFCeT89gZvp8dXxaWUGMkjqeu63PLRBihiJ+i651dduzoMse6GHrk4tPzNoJUlZwVqTw+oiQmouOhgPpgWcZREDc4toV/rki8ELNQkSqdEvcbe/0KIDq6HLw7QFSbP0c7mXKSLtuWxsy2ieg9/2sArvIzq+knOeoWFyZHBXMDPzaFwGwbX4v8oj9p7MKWhbVZou8Le/2dJxNrBdZwjXEz/BQqEd9NnCQAA";
5
- export const TRACKER_RAW_BYTES = 2407;
6
- export const TRACKER_GZIP_BYTES = 1278;
7
- export const TRACKER_HASH = "7fccc2fba6e092cb";
2
+ export const RASTRO_VERSION = "0.6.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,26EAA26E,CAAC;AAC18E,MAAM,CAAC,MAAM,mBAAmB,GAAG,0qDAA0qD,CAAC;AAC9sD,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"}
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"}
@@ -12,6 +12,7 @@ interface RastroEvent {
12
12
  timestamp: number;
13
13
  sequence: number;
14
14
  affiliateSlug?: string;
15
+ clid?: string[];
15
16
  target?: string;
16
17
  href?: string;
17
18
  properties?: RastroProperties;
@@ -19,8 +20,9 @@ interface RastroEvent {
19
20
  interface RastroContext {
20
21
  sessionId: string;
21
22
  visitorId: string;
23
+ identified: boolean;
22
24
  }
23
- 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;
24
26
  interface RastroWindow extends Window {
25
27
  rastro?: RastroCommand;
26
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,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;CACnB;AAED,KAAK,aAAa,GAAG,CACnB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,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"}
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"}
@@ -16,11 +16,19 @@
16
16
  if (value)
17
17
  (utm ??= {})["utm_" + key] = value;
18
18
  }
19
+ // Which advertising click IDs the landing carried, by NAME only: the values
20
+ // stay on the page, so no identifier ever leaves it. Same allowlist as the
21
+ // server, which drops anything else and keeps at most eight.
22
+ const clid = "gclid gbraid wbraid msclkid ttclid twclid li_fat_id ScCid rdt_cid dclid epik srsltid mc_cid mc_eid _hsenc igsh igshid fbclid"
23
+ .split(" ")
24
+ .filter((key) => params.has(key))
25
+ .slice(0, 8);
19
26
  // The identity, in order: the host's signed-in id, the persistent
20
27
  // pseudonymous id (one random id per browser and site origin, kept in
21
28
  // localStorage), and, when storage is blocked, the per-tab session id —
22
29
  // which the server then counts through its salted daily hash.
23
30
  let identity = script.dataset.visitor || "";
31
+ let identified = Boolean(identity);
24
32
  try {
25
33
  identity ||= localStorage._rv ||= createId();
26
34
  }
@@ -52,9 +60,10 @@
52
60
  let sequence = 0;
53
61
  let flushTimer;
54
62
  const queue = [];
55
- const referrer = document.referrer
56
- ? new URL(document.referrer).origin
57
- : undefined;
63
+ // Scheme and host, never the path or query. Not `new URL().origin`: that is
64
+ // the literal "null" for an app link, which would lose the package that
65
+ // names the app — `android-app://com.instagram.android` survives this.
66
+ let referrer = document.referrer.split("/", 3).join("/") || undefined;
58
67
  const flush = (beacon) => {
59
68
  const events = queue.splice(0, 50);
60
69
  if (!events.length)
@@ -117,11 +126,53 @@
117
126
  if (path == lastPath)
118
127
  return;
119
128
  lastPath = path;
120
- emit("pageview", undefined, utm && { properties: utm });
129
+ // JSON.stringify drops both keys when there is nothing to send.
130
+ emit("pageview", undefined, {
131
+ properties: utm,
132
+ clid: clid.length ? clid : undefined,
133
+ });
121
134
  };
122
135
  window.rastro = (command, value, properties) => {
123
136
  if (command == "context") {
124
- return { sessionId, visitorId: identity || sessionId };
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();
125
176
  }
126
177
  if (command == "event") {
127
178
  emit("custom", `${value || "event"}`.slice(0, 80), properties && JSON.stringify(properties).length > 20_000