fg-tracker-browser 0.13.0 → 0.14.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/CHANGELOG.md +14 -0
- package/README.md +24 -3
- package/dist/analytics.d.ts +57 -2
- package/dist/analytics.js +142 -4
- package/dist/analytics.js.map +1 -1
- package/dist/events.d.ts +69 -0
- package/dist/events.js +513 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +115 -19
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +88 -2
- package/package.json +2 -2
package/dist/events.js
ADDED
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import { DEFAULT_SCRUB_FIELDS, scrubText, shouldScrub } from './scrub.js';
|
|
2
|
+
/**
|
|
3
|
+
* Eventos de navegação e engajamento (docs/trafego-eventos.md). Seletivos e limitados: nada de texto
|
|
4
|
+
* do DOM, teclas, valores de formulário, URLs completas ou atributos arbitrários. Tudo passa pela
|
|
5
|
+
* analytics (consentimento, Do Not Track, ids e fila) e nunca vira pageview.
|
|
6
|
+
*/
|
|
7
|
+
/** Nomes reservados aos automáticos (a API recusa os demais tipos com eles). */
|
|
8
|
+
export const AUTO_EVENT_NAMES = ['page_engagement', 'scroll', 'navigation', 'outbound_click', 'file_download', 'form_start', 'form_submit'];
|
|
9
|
+
const RESERVED = new Set(AUTO_EVENT_NAMES);
|
|
10
|
+
export const EVENT_NAME_PATTERN = /^[a-z][a-z0-9_]{0,63}$/;
|
|
11
|
+
const PROP_KEY_PATTERN = /^[a-z][a-z0-9_]{0,39}$/;
|
|
12
|
+
const FORM_ID_PATTERN = /^[a-z0-9][a-z0-9_.:-]{0,63}$/i;
|
|
13
|
+
const CURRENCY_PATTERN = /^[A-Z]{3}$/;
|
|
14
|
+
export const MAX_EVENT_PROPS = 10;
|
|
15
|
+
const MAX_ACTION_PROPS = 5;
|
|
16
|
+
const MAX_PROP_STRING = 100;
|
|
17
|
+
const MAX_PROPS_BYTES = 1024;
|
|
18
|
+
const MAX_EVENT_VALUE = 1e12;
|
|
19
|
+
/** Sem interação por mais que isto, o tempo deixa de contar como ativo. */
|
|
20
|
+
export const ENGAGEMENT_IDLE_MS = 30000;
|
|
21
|
+
/** Relatório de engajamento só sai com ao menos isto acumulado (o resto espera o próximo). */
|
|
22
|
+
export const MIN_ENGAGEMENT_REPORT_MS = 1000;
|
|
23
|
+
const MAX_ENGAGEMENT_MS = 4 * 60 * 60 * 1000;
|
|
24
|
+
export const SCROLL_MILESTONES = [25, 50, 75, 90];
|
|
25
|
+
const SCROLL_THROTTLE_MS = 200;
|
|
26
|
+
const POINTER_THROTTLE_MS = 1000;
|
|
27
|
+
/** Por visualização. */
|
|
28
|
+
export const MAX_LINK_EVENTS_PER_VIEW = 20;
|
|
29
|
+
export const MAX_ACTIONS_PER_VIEW = 30;
|
|
30
|
+
const MAX_FORM_EVENTS_PER_VIEW = 10;
|
|
31
|
+
const MAX_ENGAGEMENT_REPORTS_PER_VIEW = 50;
|
|
32
|
+
/** Por documento: eventos automáticos e ações por minuto, chamadas a `track`/`conversion` por minuto e nomes distintos. */
|
|
33
|
+
export const MAX_AUTO_EVENTS_PER_MINUTE = 120;
|
|
34
|
+
export const MAX_CUSTOM_EVENTS_PER_MINUTE = 100;
|
|
35
|
+
export const MAX_EVENT_NAMES = 50;
|
|
36
|
+
/** Mesmo evento (nome + atributos) repetido dentro disto é o mesmo gesto (clique duplo). */
|
|
37
|
+
const REPEAT_WINDOW_MS = 1000;
|
|
38
|
+
export const DEFAULT_DOWNLOAD_EXTENSIONS = [
|
|
39
|
+
'7z', 'apk', 'avi', 'csv', 'dmg', 'doc', 'docx', 'epub', 'exe', 'gz', 'iso', 'json', 'key', 'mov', 'mp3', 'mp4', 'msi', 'odp', 'ods', 'odt',
|
|
40
|
+
'pdf', 'pkg', 'ppt', 'pptx', 'rar', 'rtf', 'tar', 'tgz', 'txt', 'wav', 'xls', 'xlsx', 'xml', 'zip',
|
|
41
|
+
];
|
|
42
|
+
/** Chaves de atributo que sugerem dado pessoal ou segredo: o par é descartado. */
|
|
43
|
+
const PERSONAL_KEY = /(?:^|_)(?:pass|password|passwd|senha|secret|token|auth|authorization|cookie|session|cpf|cnpj|rg|ssn|card|cartao|cvv|iban|email|mail|phone|telefone|celular|whatsapp|address|endereco|cep|zip|birth|nascimento|ip|nome|sobrenome|first_name|last_name|full_name|user_name|username)(?:_|$)/;
|
|
44
|
+
/** `events: true` liga tudo; objeto liga o que não vier `false`; ausente/`false` desliga. */
|
|
45
|
+
export function resolveEventsOptions(input) {
|
|
46
|
+
if (!input)
|
|
47
|
+
return null;
|
|
48
|
+
const options = input === true ? {} : input;
|
|
49
|
+
const downloads = options.downloads === false
|
|
50
|
+
? null
|
|
51
|
+
: new Set(((typeof options.downloads === 'object' && Array.isArray(options.downloads.extensions)) ? options.downloads.extensions : DEFAULT_DOWNLOAD_EXTENSIONS)
|
|
52
|
+
.map((ext) => String(ext).replace(/^\./, '').toLowerCase()).filter((ext) => /^[a-z0-9]{1,10}$/.test(ext)));
|
|
53
|
+
return {
|
|
54
|
+
engagement: options.engagement !== false,
|
|
55
|
+
scroll: options.scroll !== false,
|
|
56
|
+
navigation: options.navigation !== false,
|
|
57
|
+
outboundLinks: options.outboundLinks !== false,
|
|
58
|
+
downloads,
|
|
59
|
+
actions: options.actions !== false,
|
|
60
|
+
forms: options.forms !== false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const SCRUB = { fields: DEFAULT_SCRUB_FIELDS };
|
|
64
|
+
/**
|
|
65
|
+
* Valores que parecem dado pessoal ou credencial, além da limpeza do SDK (a mesma lista da API): e-mail,
|
|
66
|
+
* JWT, `Bearer`/`Basic`, sequência longa de dígitos (telefone, CPF ou cartão sem formatação) e URL com query.
|
|
67
|
+
*/
|
|
68
|
+
const SENSITIVE_VALUE = [
|
|
69
|
+
/[^\s@]+@[^\s@]+\.[^\s@]+/,
|
|
70
|
+
/\beyJ[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}/,
|
|
71
|
+
/\b(bearer|basic)\s+[A-Za-z0-9._~+/=-]{8,}/i,
|
|
72
|
+
/\d[\d .-]{9,}\d/,
|
|
73
|
+
/\bhttps?:\/\/[^\s]*\?/i,
|
|
74
|
+
];
|
|
75
|
+
/** Atributo aceito: texto curto sem dado sensível (senão `[Filtered]`), número finito ou booleano. */
|
|
76
|
+
function propValue(value) {
|
|
77
|
+
if (typeof value === 'boolean')
|
|
78
|
+
return value;
|
|
79
|
+
if (typeof value === 'number')
|
|
80
|
+
return Number.isFinite(value) && Math.abs(value) <= MAX_EVENT_VALUE ? value : undefined;
|
|
81
|
+
if (typeof value !== 'string')
|
|
82
|
+
return undefined;
|
|
83
|
+
const trimmed = value.trim().slice(0, MAX_PROP_STRING);
|
|
84
|
+
if (!trimmed)
|
|
85
|
+
return undefined;
|
|
86
|
+
return scrubText(trimmed, SCRUB) === trimmed && !trimmed.includes('@') && !SENSITIVE_VALUE.some((pattern) => pattern.test(trimmed)) ? trimmed : '[Filtered]';
|
|
87
|
+
}
|
|
88
|
+
/** Atributos limpos antes da fila: chaves `snake_case` seguras, valores curtos, até `max` e 1 KiB. */
|
|
89
|
+
export function cleanEventProps(input, max = MAX_EVENT_PROPS) {
|
|
90
|
+
const out = {};
|
|
91
|
+
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
92
|
+
return out;
|
|
93
|
+
let bytes = 2;
|
|
94
|
+
let count = 0;
|
|
95
|
+
let entries;
|
|
96
|
+
try {
|
|
97
|
+
entries = Object.entries(input);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return out;
|
|
101
|
+
}
|
|
102
|
+
for (const [key, raw] of entries) {
|
|
103
|
+
if (count >= max)
|
|
104
|
+
break;
|
|
105
|
+
if (!PROP_KEY_PATTERN.test(key) || PERSONAL_KEY.test(key) || shouldScrub(key, DEFAULT_SCRUB_FIELDS))
|
|
106
|
+
continue;
|
|
107
|
+
const value = propValue(raw);
|
|
108
|
+
if (value === undefined)
|
|
109
|
+
continue;
|
|
110
|
+
const entry = JSON.stringify(key).length + JSON.stringify(value).length + 2;
|
|
111
|
+
if (bytes + entry > MAX_PROPS_BYTES)
|
|
112
|
+
break;
|
|
113
|
+
out[key] = value;
|
|
114
|
+
bytes += entry;
|
|
115
|
+
count += 1;
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
/** Nome próprio válido: `snake_case` e fora dos reservados. */
|
|
120
|
+
export function isCustomEventName(name) {
|
|
121
|
+
return typeof name === 'string' && EVENT_NAME_PATTERN.test(name) && !RESERVED.has(name);
|
|
122
|
+
}
|
|
123
|
+
/** 32 hex estáveis para `name` + `id` (FNV-1a de 4 sementes): o mesmo gesto, o mesmo `event_id`. */
|
|
124
|
+
export function stableEventId(name, id) {
|
|
125
|
+
const input = `${name}\u0000${id}`;
|
|
126
|
+
let out = '';
|
|
127
|
+
for (const seed of [0x811c9dc5, 0x01000193, 0x9e3779b9, 0x85ebca6b]) {
|
|
128
|
+
let hash = seed >>> 0;
|
|
129
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
130
|
+
hash ^= input.charCodeAt(i);
|
|
131
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
132
|
+
}
|
|
133
|
+
out += hash.toString(16).padStart(8, '0');
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
function createLimiter() {
|
|
138
|
+
const windows = { auto: { start: 0, count: 0 }, custom: { start: 0, count: 0 } };
|
|
139
|
+
const names = new Set();
|
|
140
|
+
return {
|
|
141
|
+
take(bucket, name) {
|
|
142
|
+
const now = Date.now();
|
|
143
|
+
const window = windows[bucket];
|
|
144
|
+
if (now - window.start >= 60000 || now < window.start) {
|
|
145
|
+
window.start = now;
|
|
146
|
+
window.count = 0;
|
|
147
|
+
}
|
|
148
|
+
const max = bucket === 'auto' ? MAX_AUTO_EVENTS_PER_MINUTE : MAX_CUSTOM_EVENTS_PER_MINUTE;
|
|
149
|
+
if (window.count >= max)
|
|
150
|
+
return false;
|
|
151
|
+
if (bucket === 'custom' || !RESERVED.has(name)) {
|
|
152
|
+
if (!names.has(name) && names.size >= MAX_EVENT_NAMES)
|
|
153
|
+
return false;
|
|
154
|
+
names.add(name);
|
|
155
|
+
}
|
|
156
|
+
window.count += 1;
|
|
157
|
+
return true;
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Coletor dos eventos da visualização atual. Listeners passivos, delegados no documento, que só leem
|
|
163
|
+
* o instante, o alvo do clique e atributos `data-fg-*` declarados; sem timers.
|
|
164
|
+
*/
|
|
165
|
+
export function createEventCollector(env, options) {
|
|
166
|
+
const { analytics, config, log } = options;
|
|
167
|
+
const win = env.window;
|
|
168
|
+
const doc = env.document ?? win?.document;
|
|
169
|
+
const perf = win?.performance;
|
|
170
|
+
const clock = () => (perf && typeof perf.now === 'function' ? perf.now() : Date.now());
|
|
171
|
+
const limiter = createLimiter();
|
|
172
|
+
const cleanups = [];
|
|
173
|
+
const listen = (target, type, handler, capture = true) => {
|
|
174
|
+
if (!target || typeof target.addEventListener !== 'function')
|
|
175
|
+
return;
|
|
176
|
+
const opts = { capture, passive: true };
|
|
177
|
+
target.addEventListener(type, handler, opts);
|
|
178
|
+
cleanups.push(() => target.removeEventListener(type, handler, opts));
|
|
179
|
+
};
|
|
180
|
+
/* ------------------------------------------------------- estado por visualização */
|
|
181
|
+
let reachedScroll = new Set();
|
|
182
|
+
let perViewCounts = new Map();
|
|
183
|
+
let lastSignature = '';
|
|
184
|
+
let lastSignatureAt = 0;
|
|
185
|
+
// Engajamento: segmento ativo [activeSince, lastActivity + idle]; `engaged` acumulado sem reportar.
|
|
186
|
+
let engaged = 0;
|
|
187
|
+
let activeSince = null;
|
|
188
|
+
let lastActivity = 0;
|
|
189
|
+
let reports = 0;
|
|
190
|
+
let engagementView = null;
|
|
191
|
+
const foreground = () => {
|
|
192
|
+
if (!doc || doc.visibilityState === 'hidden')
|
|
193
|
+
return false;
|
|
194
|
+
try {
|
|
195
|
+
return typeof doc.hasFocus === 'function' ? doc.hasFocus() : true;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
const perView = (key, max) => {
|
|
202
|
+
const used = perViewCounts.get(key) ?? 0;
|
|
203
|
+
if (used >= max)
|
|
204
|
+
return false;
|
|
205
|
+
perViewCounts.set(key, used + 1);
|
|
206
|
+
return true;
|
|
207
|
+
};
|
|
208
|
+
/** `cap`: teto por visualização (a vaga só é usada quando o evento sai). */
|
|
209
|
+
const emit = (kind, name, extra = {}, cap) => {
|
|
210
|
+
if (analytics.consent === 'denied')
|
|
211
|
+
return false;
|
|
212
|
+
// A visualização antes do estado por visualização: uma troca (rota nova sem pageview) zera os limites antes.
|
|
213
|
+
const target = extra.view ?? analytics.ensureView();
|
|
214
|
+
if (!target)
|
|
215
|
+
return false;
|
|
216
|
+
const signature = `${kind}|${name}|${JSON.stringify(extra.props ?? {})}|${extra.value ?? ''}`;
|
|
217
|
+
const now = Date.now();
|
|
218
|
+
// Gestos repetidos (clique duplo) contam uma vez; chamadas da aplicação não são filtradas aqui.
|
|
219
|
+
if ((kind === 'auto' && name !== 'page_engagement') || kind === 'action') {
|
|
220
|
+
if (signature === lastSignature && now - lastSignatureAt < REPEAT_WINDOW_MS && now >= lastSignatureAt)
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
if (cap && (perViewCounts.get(cap[0]) ?? 0) >= cap[1])
|
|
224
|
+
return false;
|
|
225
|
+
if (!limiter.take(kind === 'auto' || kind === 'action' ? 'auto' : 'custom', name)) {
|
|
226
|
+
log('evento descartado: limite por minuto ou de nomes', name);
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
lastSignature = signature;
|
|
230
|
+
lastSignatureAt = now;
|
|
231
|
+
if (cap)
|
|
232
|
+
perView(cap[0], cap[1]);
|
|
233
|
+
try {
|
|
234
|
+
return analytics.event({ kind, name, ...extra, view: target });
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
log('evento descartado', name, err);
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
/* ------------------------------------------------------------------ engajamento */
|
|
242
|
+
const settle = (at) => {
|
|
243
|
+
if (activeSince === null)
|
|
244
|
+
return;
|
|
245
|
+
const end = Math.min(at, lastActivity + ENGAGEMENT_IDLE_MS);
|
|
246
|
+
engaged += Math.max(0, end - activeSince);
|
|
247
|
+
activeSince = null;
|
|
248
|
+
};
|
|
249
|
+
const activity = (at = clock()) => {
|
|
250
|
+
if (!config?.engagement || analytics.consent === 'denied' || !foreground())
|
|
251
|
+
return;
|
|
252
|
+
const current = analytics.ensureView();
|
|
253
|
+
if (!current)
|
|
254
|
+
return;
|
|
255
|
+
engagementView ?? (engagementView = current);
|
|
256
|
+
if (activeSince !== null && at - lastActivity > ENGAGEMENT_IDLE_MS)
|
|
257
|
+
settle(at);
|
|
258
|
+
if (activeSince === null)
|
|
259
|
+
activeSince = at;
|
|
260
|
+
lastActivity = at;
|
|
261
|
+
};
|
|
262
|
+
const report = (at) => {
|
|
263
|
+
settle(at);
|
|
264
|
+
const target = engagementView;
|
|
265
|
+
if (!config?.engagement || !target || engaged < MIN_ENGAGEMENT_REPORT_MS)
|
|
266
|
+
return;
|
|
267
|
+
if (reports >= MAX_ENGAGEMENT_REPORTS_PER_VIEW) {
|
|
268
|
+
engaged = 0;
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const value = Math.round(Math.min(engaged, MAX_ENGAGEMENT_MS));
|
|
272
|
+
if (emit('auto', 'page_engagement', { value, view: target }))
|
|
273
|
+
reports += 1;
|
|
274
|
+
engaged = 0;
|
|
275
|
+
};
|
|
276
|
+
/* ---------------------------------------------------------------------- rolagem */
|
|
277
|
+
let lastScrollCheck = 0;
|
|
278
|
+
let trailingScroll = null;
|
|
279
|
+
const checkScroll = () => {
|
|
280
|
+
if (!config?.scroll || !win || !doc || analytics.consent === 'denied')
|
|
281
|
+
return;
|
|
282
|
+
if (!analytics.ensureView())
|
|
283
|
+
return;
|
|
284
|
+
const root = (doc.scrollingElement ?? doc.documentElement);
|
|
285
|
+
const viewport = win.innerHeight;
|
|
286
|
+
const total = root?.scrollHeight ?? 0;
|
|
287
|
+
if (!viewport || total <= viewport + 1)
|
|
288
|
+
return;
|
|
289
|
+
const top = win.scrollY ?? win.pageYOffset ?? root?.scrollTop ?? 0;
|
|
290
|
+
const depth = Math.min(100, ((top + viewport) / total) * 100);
|
|
291
|
+
for (const milestone of SCROLL_MILESTONES) {
|
|
292
|
+
if (depth + 0.5 < milestone || reachedScroll.has(milestone))
|
|
293
|
+
continue;
|
|
294
|
+
reachedScroll.add(milestone);
|
|
295
|
+
emit('auto', 'scroll', { value: milestone });
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
/* ---------------------------------------------------------------------- cliques */
|
|
299
|
+
const location = () => env.location ?? win?.location;
|
|
300
|
+
const sameSite = (hostname) => {
|
|
301
|
+
const current = location()?.hostname ?? '';
|
|
302
|
+
if (hostname === current)
|
|
303
|
+
return true;
|
|
304
|
+
const shared = options.cookieDomain?.replace(/^\./, '').toLowerCase();
|
|
305
|
+
return !!shared && (hostname === shared || hostname.endsWith(`.${shared}`));
|
|
306
|
+
};
|
|
307
|
+
const onLink = (anchor) => {
|
|
308
|
+
const raw = anchor.getAttribute('href');
|
|
309
|
+
if (!raw)
|
|
310
|
+
return;
|
|
311
|
+
let url;
|
|
312
|
+
try {
|
|
313
|
+
url = new URL(raw, location()?.href);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
319
|
+
return;
|
|
320
|
+
const hostname = url.hostname.toLowerCase();
|
|
321
|
+
const external = !sameSite(hostname);
|
|
322
|
+
const file = url.pathname.split('/').pop() ?? '';
|
|
323
|
+
const dot = file.lastIndexOf('.');
|
|
324
|
+
const ext = dot > 0 ? file.slice(dot + 1).toLowerCase() : '';
|
|
325
|
+
const downloads = config?.downloads;
|
|
326
|
+
if (downloads && (downloads.has(ext) || anchor.hasAttribute('download'))) {
|
|
327
|
+
emit('auto', 'file_download', { props: { extension: /^[a-z0-9]{1,10}$/.test(ext) ? ext : 'unknown', ...(external ? { host: hostname } : {}) } }, ['file_download', MAX_LINK_EVENTS_PER_VIEW]);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (config?.outboundLinks && external)
|
|
331
|
+
emit('auto', 'outbound_click', { props: { host: hostname } }, ['outbound_click', MAX_LINK_EVENTS_PER_VIEW]);
|
|
332
|
+
};
|
|
333
|
+
const onAction = (element) => {
|
|
334
|
+
const name = element.getAttribute('data-fg-event')?.trim();
|
|
335
|
+
if (!isCustomEventName(name)) {
|
|
336
|
+
log('data-fg-event inválido ou reservado', name);
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const declared = {};
|
|
340
|
+
for (const attribute of Array.from(element.attributes ?? [])) {
|
|
341
|
+
if (!attribute.name.startsWith('data-fg-prop-'))
|
|
342
|
+
continue;
|
|
343
|
+
declared[attribute.name.slice('data-fg-prop-'.length).replace(/-/g, '_')] = attribute.value;
|
|
344
|
+
}
|
|
345
|
+
emit('action', name, { props: cleanEventProps(declared, MAX_ACTION_PROPS) }, ['action', MAX_ACTIONS_PER_VIEW]);
|
|
346
|
+
};
|
|
347
|
+
const onClick = (event) => {
|
|
348
|
+
const mouse = event;
|
|
349
|
+
if (event.type === 'auxclick' && mouse.button !== 1)
|
|
350
|
+
return;
|
|
351
|
+
activity();
|
|
352
|
+
const target = event.target;
|
|
353
|
+
if (!target || typeof target.closest !== 'function')
|
|
354
|
+
return;
|
|
355
|
+
try {
|
|
356
|
+
if (config?.actions) {
|
|
357
|
+
const element = target.closest('[data-fg-event]');
|
|
358
|
+
if (element)
|
|
359
|
+
onAction(element);
|
|
360
|
+
}
|
|
361
|
+
if (config?.outboundLinks || config?.downloads) {
|
|
362
|
+
const anchor = target.closest('a[href]');
|
|
363
|
+
if (anchor)
|
|
364
|
+
onLink(anchor);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
log('clique não registrado', err);
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
/* ------------------------------------------------------------------ formulários */
|
|
372
|
+
const formId = (target) => {
|
|
373
|
+
const element = target;
|
|
374
|
+
const form = element && typeof element.closest === 'function' ? element.closest('form[data-fg-form]') : null;
|
|
375
|
+
const id = form?.getAttribute('data-fg-form')?.trim() ?? '';
|
|
376
|
+
return FORM_ID_PATTERN.test(id) ? id : null;
|
|
377
|
+
};
|
|
378
|
+
const started = new Set();
|
|
379
|
+
const onInput = (event) => {
|
|
380
|
+
const id = formId(event.target);
|
|
381
|
+
if (!id || started.has(id))
|
|
382
|
+
return;
|
|
383
|
+
started.add(id);
|
|
384
|
+
emit('auto', 'form_start', { props: { form: id } }, ['form_start', MAX_FORM_EVENTS_PER_VIEW]);
|
|
385
|
+
};
|
|
386
|
+
const onSubmit = (event) => {
|
|
387
|
+
const id = formId(event.target);
|
|
388
|
+
if (id)
|
|
389
|
+
emit('auto', 'form_submit', { props: { form: id } }, ['form_submit', MAX_FORM_EVENTS_PER_VIEW]);
|
|
390
|
+
};
|
|
391
|
+
/* -------------------------------------------------------------------- listeners */
|
|
392
|
+
if (win && doc && config) {
|
|
393
|
+
if (config.engagement) {
|
|
394
|
+
const onActivity = () => activity();
|
|
395
|
+
for (const type of ['pointerdown', 'keydown', 'wheel', 'touchstart'])
|
|
396
|
+
listen(doc, type, onActivity);
|
|
397
|
+
let lastPointer = 0;
|
|
398
|
+
listen(doc, 'pointermove', () => {
|
|
399
|
+
const at = clock();
|
|
400
|
+
if (at - lastPointer < POINTER_THROTTLE_MS)
|
|
401
|
+
return;
|
|
402
|
+
lastPointer = at;
|
|
403
|
+
activity(at);
|
|
404
|
+
});
|
|
405
|
+
listen(win, 'focus', onActivity, false);
|
|
406
|
+
listen(win, 'blur', () => settle(clock()), false);
|
|
407
|
+
listen(doc, 'visibilitychange', () => {
|
|
408
|
+
if (doc.visibilityState === 'visible')
|
|
409
|
+
activity();
|
|
410
|
+
}, false);
|
|
411
|
+
}
|
|
412
|
+
if (config.engagement || config.scroll) {
|
|
413
|
+
listen(win, 'scroll', () => {
|
|
414
|
+
const at = clock();
|
|
415
|
+
activity(at);
|
|
416
|
+
if (at - lastScrollCheck < SCROLL_THROTTLE_MS) {
|
|
417
|
+
// Um único passe atrasado: a posição final de uma rolagem rápida (End, flick) também conta.
|
|
418
|
+
trailingScroll ?? (trailingScroll = setTimeout(() => {
|
|
419
|
+
trailingScroll = null;
|
|
420
|
+
lastScrollCheck = clock();
|
|
421
|
+
checkScroll();
|
|
422
|
+
}, SCROLL_THROTTLE_MS));
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
lastScrollCheck = at;
|
|
426
|
+
checkScroll();
|
|
427
|
+
}, false);
|
|
428
|
+
cleanups.push(() => {
|
|
429
|
+
if (trailingScroll)
|
|
430
|
+
clearTimeout(trailingScroll);
|
|
431
|
+
trailingScroll = null;
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
if (config.actions || config.outboundLinks || config.downloads) {
|
|
435
|
+
listen(doc, 'click', onClick);
|
|
436
|
+
listen(doc, 'auxclick', onClick);
|
|
437
|
+
}
|
|
438
|
+
if (config.forms) {
|
|
439
|
+
listen(doc, 'input', onInput);
|
|
440
|
+
listen(doc, 'change', onInput);
|
|
441
|
+
listen(doc, 'submit', onSubmit);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return {
|
|
445
|
+
onViewChange(previous, next) {
|
|
446
|
+
const at = clock();
|
|
447
|
+
if (previous)
|
|
448
|
+
report(at);
|
|
449
|
+
engagementView = next;
|
|
450
|
+
engaged = 0;
|
|
451
|
+
activeSince = null;
|
|
452
|
+
reports = 0;
|
|
453
|
+
reachedScroll = new Set();
|
|
454
|
+
perViewCounts = new Map();
|
|
455
|
+
started.clear();
|
|
456
|
+
if (!next)
|
|
457
|
+
return;
|
|
458
|
+
if (config?.navigation && previous && !previous.implicit && !next.implicit) {
|
|
459
|
+
emit('auto', 'navigation', { props: { type: 'soft', from: previous.route }, view: next });
|
|
460
|
+
}
|
|
461
|
+
// Quem navega acabou de interagir: a visualização nova começa ativa.
|
|
462
|
+
activity(at);
|
|
463
|
+
},
|
|
464
|
+
onHidden() {
|
|
465
|
+
checkScroll();
|
|
466
|
+
report(clock());
|
|
467
|
+
},
|
|
468
|
+
onPageHide() {
|
|
469
|
+
report(clock());
|
|
470
|
+
},
|
|
471
|
+
onRestore() {
|
|
472
|
+
const view = analytics.view;
|
|
473
|
+
if (config?.navigation && view && !view.implicit)
|
|
474
|
+
emit('auto', 'navigation', { props: { type: 'restore' }, view });
|
|
475
|
+
activity();
|
|
476
|
+
},
|
|
477
|
+
track(kind, name, props, trackOptions) {
|
|
478
|
+
if (!isCustomEventName(name)) {
|
|
479
|
+
log(`${kind}: nome inválido ou reservado`, name);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
let value;
|
|
483
|
+
let currency;
|
|
484
|
+
let eventId;
|
|
485
|
+
try {
|
|
486
|
+
const rawValue = trackOptions?.value;
|
|
487
|
+
if (rawValue !== undefined && rawValue !== null) {
|
|
488
|
+
if (typeof rawValue !== 'number' || !Number.isFinite(rawValue) || Math.abs(rawValue) > MAX_EVENT_VALUE) {
|
|
489
|
+
log(`${kind}: value inválido`, name);
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
value = rawValue;
|
|
493
|
+
}
|
|
494
|
+
const rawCurrency = trackOptions?.currency;
|
|
495
|
+
if (kind === 'conversion' && value !== undefined && typeof rawCurrency === 'string' && CURRENCY_PATTERN.test(rawCurrency.toUpperCase()))
|
|
496
|
+
currency = rawCurrency.toUpperCase();
|
|
497
|
+
const rawId = trackOptions?.id;
|
|
498
|
+
if (typeof rawId === 'string' && rawId.length > 0 && rawId.length <= 200)
|
|
499
|
+
eventId = stableEventId(name, rawId);
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
emit(kind, name, { value, currency, props: cleanEventProps(props), eventId });
|
|
505
|
+
},
|
|
506
|
+
close() {
|
|
507
|
+
report(clock());
|
|
508
|
+
for (const cleanup of cleanups.splice(0))
|
|
509
|
+
cleanup();
|
|
510
|
+
},
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { BrowserEnv, BrowserEvent, BrowserOptions, BrowserTracker } from './types.js';
|
|
2
|
-
export type { AnalyticsEvent, Breadcrumb, CaptureOptions, BreadcrumbType, BrowserEnv, BrowserEvent, BrowserOptions, BrowserTracker, BrowserUser, Consent, IdentifyEvent, PageviewEvent, WebVitalsEvent, WebVitalsNavigationType, WebVitalsOptions, } from './types.js';
|
|
2
|
+
export type { AnalyticsEvent, Breadcrumb, CaptureOptions, BreadcrumbType, BrowserEnv, BrowserEvent, BrowserOptions, BrowserTracker, BrowserUser, Consent, ConversionOptions, EventProps, EventPropValue, EventsOptions, IdentifyEvent, PageviewEvent, TrackOptions, TrafficEvent, TrafficEventKind, WebVitalsEvent, WebVitalsNavigationType, WebVitalsOptions, } from './types.js';
|
|
3
3
|
/** Header da chave do projeto enviado pelo SDK (a API aceita também o legado `x-stread-track-key`). */
|
|
4
4
|
export declare const API_KEY_HEADER = "x-fg-tracker-key";
|
|
5
5
|
export { doNotTrackEnabled, pageUrl, referrerOrigin, screenBucket, utmParams, SESSION_COOKIE, VISITOR_COOKIE } from './analytics.js';
|
|
6
6
|
export { MAX_REPORTS_PER_VIEW, MAX_VIEWS_PER_DOCUMENT, SOFT_VIEW_GRACE_MS, WEB_VITALS_THRESHOLDS } from './vitals.js';
|
|
7
7
|
export { createErrorBoundaryHandler, type ErrorBoundaryInfo } from './react.js';
|
|
8
|
+
export { AUTO_EVENT_NAMES, DEFAULT_DOWNLOAD_EXTENSIONS, ENGAGEMENT_IDLE_MS, MAX_AUTO_EVENTS_PER_MINUTE, MAX_CUSTOM_EVENTS_PER_MINUTE, MAX_EVENT_NAMES, MAX_EVENT_PROPS, SCROLL_MILESTONES, } from './events.js';
|
|
8
9
|
/**
|
|
9
10
|
* `fetch` com `keepalive` e `sendBeacon` têm ~64 KiB em voo, somados: acima disso o navegador
|
|
10
11
|
* recusa antes de chegar à API (sem 413). Lotes e o flush do `pagehide` cabem neste orçamento.
|