@lib-acr/browser 0.0.0-stage → 0.0.1

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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +113 -2
  3. package/dist/cjs/browser-acr.js +600 -0
  4. package/dist/cjs/browser-acr.js.map +1 -0
  5. package/dist/cjs/captured.js +19 -0
  6. package/dist/cjs/captured.js.map +1 -0
  7. package/dist/cjs/control/command-runner.js +289 -0
  8. package/dist/cjs/control/command-runner.js.map +1 -0
  9. package/dist/cjs/control/ui.js +277 -0
  10. package/dist/cjs/control/ui.js.map +1 -0
  11. package/dist/cjs/device.js +54 -0
  12. package/dist/cjs/device.js.map +1 -0
  13. package/dist/cjs/fetch-tracker.js +63 -0
  14. package/dist/cjs/fetch-tracker.js.map +1 -0
  15. package/dist/cjs/identity.js +120 -0
  16. package/dist/cjs/identity.js.map +1 -0
  17. package/dist/cjs/index.js +73 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/sdk-info.js +6 -0
  20. package/dist/cjs/sdk-info.js.map +1 -0
  21. package/dist/cjs/url.js +31 -0
  22. package/dist/cjs/url.js.map +1 -0
  23. package/dist/cjs/web-vitals.js +160 -0
  24. package/dist/cjs/web-vitals.js.map +1 -0
  25. package/dist/esm/browser-acr.js +595 -0
  26. package/dist/esm/browser-acr.js.map +1 -0
  27. package/dist/esm/captured.js +15 -0
  28. package/dist/esm/captured.js.map +1 -0
  29. package/dist/esm/control/command-runner.js +284 -0
  30. package/dist/esm/control/command-runner.js.map +1 -0
  31. package/dist/esm/control/ui.js +272 -0
  32. package/dist/esm/control/ui.js.map +1 -0
  33. package/dist/esm/device.js +50 -0
  34. package/dist/esm/device.js.map +1 -0
  35. package/dist/esm/fetch-tracker.js +60 -0
  36. package/dist/esm/fetch-tracker.js.map +1 -0
  37. package/dist/esm/identity.js +112 -0
  38. package/dist/esm/identity.js.map +1 -0
  39. package/dist/esm/index.js +13 -0
  40. package/dist/esm/index.js.map +1 -0
  41. package/dist/esm/package.json +3 -0
  42. package/dist/esm/sdk-info.js +3 -0
  43. package/dist/esm/sdk-info.js.map +1 -0
  44. package/dist/esm/url.js +27 -0
  45. package/dist/esm/url.js.map +1 -0
  46. package/dist/esm/web-vitals.js +156 -0
  47. package/dist/esm/web-vitals.js.map +1 -0
  48. package/dist/types/browser-acr.d.ts +142 -0
  49. package/dist/types/captured.d.ts +4 -0
  50. package/dist/types/control/command-runner.d.ts +57 -0
  51. package/dist/types/control/ui.d.ts +50 -0
  52. package/dist/types/device.d.ts +24 -0
  53. package/dist/types/fetch-tracker.d.ts +15 -0
  54. package/dist/types/identity.d.ts +48 -0
  55. package/dist/types/index.d.ts +17 -0
  56. package/dist/types/sdk-info.d.ts +4 -0
  57. package/dist/types/url.d.ts +10 -0
  58. package/dist/types/web-vitals.d.ts +50 -0
  59. package/package.json +40 -4
@@ -0,0 +1,595 @@
1
+ import { AcrClient } from '@lib-acr/core';
2
+ import { wasCaptured } from './captured.js';
3
+ import { CommandRunner } from './control/command-runner.js';
4
+ import { ControlUI, resolveUiOptions } from './control/ui.js';
5
+ import { wrapFetch } from './fetch-tracker.js';
6
+ import { getDeviceInfo } from './device.js';
7
+ import { ensureFirstSeen, getOrCreateAnonymousId, resetAnonymousId, SessionTracker } from './identity.js';
8
+ import { SDK_INFO } from './sdk-info.js';
9
+ import { normalizePath } from './url.js';
10
+ import { VitalsCollector } from './web-vitals.js';
11
+ export const BROWSER_SDK = SDK_INFO;
12
+ const OPT_OUT_KEY = 'acr.optOut';
13
+ /** localStorage key holding telemetry that was still unsent when the page was hidden. */
14
+ export const QUEUE_KEY = 'acr.queue';
15
+ const MAX_PERSISTED_ITEMS = 200;
16
+ const MAX_PERSISTED_CHARS = 50000;
17
+ const KINDS = new Set(['events', 'logs', 'errors', 'heartbeat']);
18
+ const ACTIVE_EVENT = 'acr.active';
19
+ /** localStorage: ids of announcements the visitor dismissed (last 50). */
20
+ export const DISMISSED_KEY = 'acr.dismissed';
21
+ /** sessionStorage: the minimumVersion a `force` release already reloaded this tab for. */
22
+ export const FORCE_RELOAD_KEY = 'acr.forceReload';
23
+ const MAX_DISMISSED = 50;
24
+ /** Visibility and online events re-poll the control snapshot at most this often. */
25
+ const CONTROL_REFRESH_THROTTLE_MS = 5000;
26
+ function localStore() {
27
+ try {
28
+ return typeof window !== 'undefined' && window.localStorage ? window.localStorage : null;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ function sessionStore() {
35
+ try {
36
+ return typeof window !== 'undefined' && window.sessionStorage ? window.sessionStorage : null;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ function webStorage(kind) {
43
+ try {
44
+ return typeof window !== 'undefined' && window[kind] ? window[kind] : null;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ function readList(store, key) {
51
+ try {
52
+ const raw = store?.getItem(key);
53
+ const parsed = raw ? JSON.parse(raw) : [];
54
+ return Array.isArray(parsed) ? parsed.filter((v) => typeof v === 'string') : [];
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ }
60
+ function isDoNotTrack() {
61
+ if (typeof navigator === 'undefined')
62
+ return false;
63
+ const nav = navigator;
64
+ const win = typeof window !== 'undefined' ? window : undefined;
65
+ return nav.doNotTrack === '1' || win?.doNotTrack === '1' || nav.msDoNotTrack === '1';
66
+ }
67
+ function isOptedOut() {
68
+ try {
69
+ return localStore()?.getItem(OPT_OUT_KEY) === '1';
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ function removeKey(key) {
76
+ try {
77
+ const store = localStore();
78
+ if (store?.removeItem)
79
+ store.removeItem(key);
80
+ else
81
+ store?.setItem(key, '[]');
82
+ }
83
+ catch {
84
+ /* storage blocked: nothing was persisted either */
85
+ }
86
+ }
87
+ /**
88
+ * Throws when browser options carry a secret. BrowserACR calls it in its constructor; framework wrappers can call it
89
+ * where no client is created (for example during server-side rendering) so the mistake still surfaces.
90
+ */
91
+ export function assertPublishableOptions(options) {
92
+ const raw = (options ?? {});
93
+ if (raw.apiSecret !== undefined || raw.secretKey !== undefined) {
94
+ throw new Error('[acr] The browser SDK does not accept a secret key. Use the publishable key only.');
95
+ }
96
+ }
97
+ /**
98
+ * Browser client. It takes a publishable key only: a secret key is rejected in the constructor, so it can never be
99
+ * bundled into a page. Call start() to install automatic collection and stop() to remove it.
100
+ */
101
+ export class BrowserACR extends AcrClient {
102
+ /** `sdk` lets framework wrappers (React, Angular) report their own package name and version. */
103
+ constructor(options, sdk = BROWSER_SDK) {
104
+ assertPublishableOptions(options);
105
+ const activePingMinutes = options.activePingMinutes ?? 5;
106
+ if (!Number.isFinite(activePingMinutes) || activePingMinutes < 0 || activePingMinutes > 1440) {
107
+ throw new Error('[acr] activePingMinutes must be between 0 and 1440');
108
+ }
109
+ const respectDnt = options.respectDoNotTrack ?? true;
110
+ const blocked = (respectDnt && isDoNotTrack()) || isOptedOut();
111
+ super({
112
+ keepalive: true,
113
+ maxBodyBytes: 60000,
114
+ isOnline: () => typeof navigator === 'undefined' || navigator.onLine !== false,
115
+ ...options,
116
+ minLogLevel: options.minLogLevel ?? 'warn',
117
+ enabled: (options.enabled ?? true) && !blocked,
118
+ }, sdk,
119
+ // Polling starts in start(), so nothing runs on the server or before the app opts in to collection.
120
+ { deferControl: true });
121
+ this.started = false;
122
+ this.lastPath = null;
123
+ this.teardowns = [];
124
+ this.vitals = new VitalsCollector();
125
+ this.anonymousMemory = {};
126
+ this.vitalsReported = false;
127
+ /** Session id last applied to the client context. */
128
+ this.currentSessionId = null;
129
+ /** True while the SDK records something that is not user activity (session_start, active pings). */
130
+ this.passive = false;
131
+ this.firstSeenMemory = {};
132
+ this.dismissedMemory = new Set();
133
+ /** Snapshot revision whose commands and release check were last handled. */
134
+ this.handledRevision = null;
135
+ this.ui = null;
136
+ this.uiOptions = resolveUiOptions(options.ui);
137
+ this.runner = new CommandRunner({
138
+ localStorage: () => webStorage('localStorage'),
139
+ sessionStorage: () => webStorage('sessionStorage'),
140
+ firstSeen: () => ensureFirstSeen(localStore(), this.firstSeenMemory),
141
+ track: (name, attributes) => this.recordPassively(() => this.trackEvent(name, attributes)),
142
+ flush: () => this.flush(),
143
+ reload: () => this.reloadPage(),
144
+ promptReload: () => this.setReloadRequested(true),
145
+ });
146
+ this.opts = {
147
+ trackErrors: options.trackErrors ?? true,
148
+ trackPageViews: options.trackPageViews ?? true,
149
+ trackFetch: options.trackFetch ?? true,
150
+ trackWebVitals: options.trackWebVitals ?? true,
151
+ persistQueue: options.persistQueue ?? true,
152
+ };
153
+ this.endpointPrefix = options.endpoint.replace(/\/+$/, '');
154
+ this.respectDnt = respectDnt;
155
+ this.activePingMs = activePingMinutes * 60000;
156
+ this.sessions = new SessionTracker(sessionStore(), (options.sessionTimeoutMinutes ?? 30) * 60000);
157
+ }
158
+ /**
159
+ * Installs listeners and hooks, sends telemetry persisted by an earlier page, then records the first page view.
160
+ * Calling it again does nothing.
161
+ */
162
+ start() {
163
+ if (this.started || typeof window === 'undefined')
164
+ return;
165
+ this.started = true;
166
+ this.setAnonymousId(getOrCreateAnonymousId(localStore(), this.anonymousMemory));
167
+ ensureFirstSeen(localStore(), this.firstSeenMemory);
168
+ this.refreshSession();
169
+ this.replayPersistedQueue();
170
+ if (this.opts.trackErrors)
171
+ this.hookErrors();
172
+ if (this.opts.trackPageViews)
173
+ this.hookNavigation();
174
+ if (this.opts.trackFetch && typeof window.fetch === 'function')
175
+ this.hookFetch();
176
+ if (this.opts.trackWebVitals)
177
+ this.hookVitals();
178
+ this.hookLifecycle();
179
+ if (this.activePingMs > 0)
180
+ this.hookActivePing();
181
+ this.hookControl();
182
+ }
183
+ /** Removes everything start() installed. Telemetry already buffered is still sent on the next flush. */
184
+ stop() {
185
+ for (const teardown of this.teardowns.splice(0))
186
+ teardown();
187
+ this.vitals.stop();
188
+ this.started = false;
189
+ }
190
+ /** Current web vitals, for example to display them in a UI. */
191
+ getVitals() {
192
+ return this.vitals.snapshot();
193
+ }
194
+ /** Listens for vitals updates. Returns an unsubscribe function. */
195
+ onVitals(listener) {
196
+ return this.vitals.subscribe(listener);
197
+ }
198
+ /**
199
+ * Records a page view. Query strings and fragments are dropped; repeated paths are ignored. Pass a path when the
200
+ * router state differs from window.location (for example with an in-memory router).
201
+ */
202
+ trackPageView(pathOverride) {
203
+ if (typeof window === 'undefined')
204
+ return;
205
+ const path = normalizePath(pathOverride ?? window.location.pathname);
206
+ if (path === this.lastPath)
207
+ return;
208
+ this.lastPath = path;
209
+ this.trackEvent('page_view', {
210
+ path,
211
+ title: typeof document !== 'undefined' ? document.title.slice(0, 200) : undefined,
212
+ referrer: referrerPath(typeof document !== 'undefined' ? document.referrer : ''),
213
+ });
214
+ }
215
+ /** Stops collection, discards unsent telemetry (in memory and persisted) and remembers the choice on this browser. */
216
+ optOut() {
217
+ try {
218
+ localStore()?.setItem(OPT_OUT_KEY, '1');
219
+ }
220
+ catch {
221
+ /* the in-memory switch still applies */
222
+ }
223
+ this.setEnabled(false);
224
+ this.clearQueue();
225
+ removeKey(QUEUE_KEY);
226
+ }
227
+ /** Resumes collection after optOut(). Do Not Track still wins when respected. */
228
+ optIn() {
229
+ try {
230
+ localStore()?.setItem(OPT_OUT_KEY, '0');
231
+ }
232
+ catch {
233
+ /* ignore */
234
+ }
235
+ this.setEnabled(!(this.respectDnt && isDoNotTrack()));
236
+ }
237
+ /**
238
+ * Forgets the current visitor, for example on logout: clears the user id, replaces the anonymous id (stored in
239
+ * localStorage `acr.anonymousId`) and starts a new session, which sends its own `session_start`.
240
+ */
241
+ reset() {
242
+ this.identify(null);
243
+ this.setAnonymousId(resetAnonymousId(localStore(), this.anonymousMemory));
244
+ const session = this.sessions.reset();
245
+ this.currentSessionId = session.id;
246
+ this.setSession(session.id);
247
+ if (this.started)
248
+ this.emitSessionStart();
249
+ }
250
+ /**
251
+ * Hides an announcement for this visitor. Remembered per announcement id in localStorage `acr.dismissed`. Only
252
+ * dismissible announcements can be dismissed.
253
+ */
254
+ dismissAnnouncement(id) {
255
+ const announcement = this.getControlState().announcement;
256
+ if (announcement && announcement.id === id && !announcement.dismissible)
257
+ return;
258
+ this.dismissedMemory.add(id);
259
+ try {
260
+ const store = localStore();
261
+ const ids = readList(store, DISMISSED_KEY).filter((v) => v !== id);
262
+ ids.push(id);
263
+ store?.setItem(DISMISSED_KEY, JSON.stringify(ids.slice(-MAX_DISMISSED)));
264
+ }
265
+ catch {
266
+ /* remembered for this page only */
267
+ }
268
+ this.controlChanged();
269
+ }
270
+ /** Reloads the page. Used by `reload` commands, forced releases and the built-in prompt. */
271
+ reloadPage() {
272
+ if (typeof window !== 'undefined')
273
+ window.location.reload();
274
+ }
275
+ isAnnouncementDismissed(id) {
276
+ return this.dismissedMemory.has(id) || readList(localStore(), DISMISSED_KEY).includes(id);
277
+ }
278
+ /** Every event, log and error counts as activity: it keeps the session alive or rolls it over after a timeout. */
279
+ onTrack() {
280
+ if (!this.started || this.passive)
281
+ return;
282
+ this.refreshSession();
283
+ }
284
+ refreshSession() {
285
+ const session = this.sessions.touch();
286
+ if (session.id === this.currentSessionId)
287
+ return;
288
+ this.currentSessionId = session.id;
289
+ this.setSession(session.id);
290
+ if (session.isNew)
291
+ this.emitSessionStart();
292
+ }
293
+ emitSessionStart() {
294
+ this.recordPassively(() => this.trackEvent('session_start', { ...getDeviceInfo() }));
295
+ }
296
+ recordPassively(record) {
297
+ const previous = this.passive;
298
+ this.passive = true;
299
+ try {
300
+ record();
301
+ }
302
+ finally {
303
+ this.passive = previous;
304
+ }
305
+ }
306
+ hookErrors() {
307
+ const onError = (ev) => {
308
+ const crossOrigin = ev.error === null || ev.error === undefined;
309
+ if (!crossOrigin && wasCaptured(ev.error))
310
+ return;
311
+ this.captureError(crossOrigin ? new Error(ev.message || 'Script error') : ev.error, {
312
+ handled: false,
313
+ source: 'frontend',
314
+ route: currentPath(),
315
+ attributes: {
316
+ kind: 'window_error',
317
+ file: fileOf(ev.filename),
318
+ line: ev.lineno || undefined,
319
+ column: ev.colno || undefined,
320
+ crossOrigin,
321
+ },
322
+ });
323
+ };
324
+ const onRejection = (ev) => {
325
+ // A failed fetch the app did not catch was already reported by the fetch tracker.
326
+ if (wasCaptured(ev.reason))
327
+ return;
328
+ this.captureError(ev.reason, {
329
+ handled: false,
330
+ source: 'frontend',
331
+ route: currentPath(),
332
+ attributes: { kind: 'unhandled_rejection' },
333
+ });
334
+ };
335
+ window.addEventListener('error', onError);
336
+ window.addEventListener('unhandledrejection', onRejection);
337
+ this.teardowns.push(() => {
338
+ window.removeEventListener('error', onError);
339
+ window.removeEventListener('unhandledrejection', onRejection);
340
+ });
341
+ }
342
+ hookNavigation() {
343
+ const history = window.history;
344
+ const originalPush = history.pushState;
345
+ const originalReplace = history.replaceState;
346
+ const onNavigate = () => this.trackPageView();
347
+ history.pushState = function (...args) {
348
+ const result = originalPush.apply(this, args);
349
+ onNavigate();
350
+ return result;
351
+ };
352
+ history.replaceState = function (...args) {
353
+ const result = originalReplace.apply(this, args);
354
+ onNavigate();
355
+ return result;
356
+ };
357
+ window.addEventListener('popstate', onNavigate);
358
+ this.teardowns.push(() => {
359
+ history.pushState = originalPush;
360
+ history.replaceState = originalReplace;
361
+ window.removeEventListener('popstate', onNavigate);
362
+ });
363
+ this.trackPageView();
364
+ }
365
+ hookFetch() {
366
+ const original = window.fetch.bind(window);
367
+ const tracked = wrapFetch(original, this, {
368
+ ignoreUrlPrefixes: [this.endpointPrefix],
369
+ base: window.location.href,
370
+ });
371
+ window.fetch = tracked;
372
+ this.teardowns.push(() => {
373
+ window.fetch = original;
374
+ });
375
+ }
376
+ hookVitals() {
377
+ this.vitalsReported = false;
378
+ this.vitals.start();
379
+ }
380
+ /** Sends web vitals once per page, when the page is first hidden. */
381
+ reportVitals() {
382
+ if (!this.opts.trackWebVitals || this.vitalsReported)
383
+ return;
384
+ const snap = this.vitals.snapshot();
385
+ if (snap.lcp === null && snap.fcp === null && snap.ttfb === null)
386
+ return;
387
+ this.vitalsReported = true;
388
+ this.trackEvent('web_vitals', { ...snap, path: currentPath() });
389
+ }
390
+ hookLifecycle() {
391
+ const onOnline = () => void this.flush();
392
+ const onPageHide = () => this.onHidden();
393
+ const onVisibility = () => {
394
+ if (document.visibilityState === 'hidden')
395
+ this.onHidden();
396
+ };
397
+ window.addEventListener('online', onOnline);
398
+ window.addEventListener('pagehide', onPageHide);
399
+ document.addEventListener('visibilitychange', onVisibility);
400
+ this.teardowns.push(() => {
401
+ window.removeEventListener('online', onOnline);
402
+ window.removeEventListener('pagehide', onPageHide);
403
+ document.removeEventListener('visibilitychange', onVisibility);
404
+ });
405
+ }
406
+ /**
407
+ * The page may be about to go away. Every kind is sent at once with keepalive requests (sendBeacon cannot carry the
408
+ * key header). A bounded copy of what is still undelivered is kept in localStorage first; if the page survives, the
409
+ * copy is updated once the requests finish. Replayed items keep their ids, so the API drops any duplicates.
410
+ */
411
+ onHidden() {
412
+ this.reportVitals();
413
+ this.persistPending();
414
+ void this.sendAllNow().then(() => this.persistPending(), () => undefined);
415
+ }
416
+ hookControl() {
417
+ const { maintenance, announcement, release } = this.uiOptions;
418
+ const ui = maintenance || announcement || release
419
+ ? new ControlUI(this.uiOptions, {
420
+ dismissAnnouncement: (id) => this.dismissAnnouncement(id),
421
+ reload: () => this.reloadPage(),
422
+ refresh: () => void this.refreshControl(),
423
+ })
424
+ : null;
425
+ this.ui = ui;
426
+ const off = this.onControlChange((state) => this.handleControlState(state));
427
+ const refreshSoon = () => {
428
+ if (Date.now() - this.lastControlAttemptAt() < CONTROL_REFRESH_THROTTLE_MS)
429
+ return;
430
+ void this.refreshControl();
431
+ };
432
+ const onVisible = () => {
433
+ if (document.visibilityState === 'visible')
434
+ refreshSoon();
435
+ };
436
+ window.addEventListener('online', refreshSoon);
437
+ document.addEventListener('visibilitychange', onVisible);
438
+ this.teardowns.push(() => {
439
+ off();
440
+ this.stopControl();
441
+ window.removeEventListener('online', refreshSoon);
442
+ document.removeEventListener('visibilitychange', onVisible);
443
+ ui?.destroy();
444
+ if (this.ui === ui)
445
+ this.ui = null;
446
+ });
447
+ // After stop() and start() the snapshot is still known: show it right away.
448
+ const current = this.getControlState();
449
+ if (current.ready || current.reloadRequested)
450
+ this.handleControlState(current);
451
+ this.startControl();
452
+ }
453
+ handleControlState(state) {
454
+ const snapshot = state.snapshot;
455
+ if (snapshot && snapshot.revision !== this.handledRevision) {
456
+ this.handledRevision = snapshot.revision;
457
+ if (snapshot.commands.length > 0)
458
+ void this.runner.run(snapshot.commands);
459
+ this.forceReloadIfRequired(state);
460
+ }
461
+ try {
462
+ this.ui?.render(state);
463
+ }
464
+ catch {
465
+ /* the UI must never break the host page */
466
+ }
467
+ }
468
+ /**
469
+ * `release.mode = force` and `appVersion` below `minimumVersion`: reload once per tab and minimum version. If the
470
+ * page is still outdated after that reload (for example a stale CDN copy), the prompt is shown instead of looping.
471
+ */
472
+ forceReloadIfRequired(state) {
473
+ const release = state.release;
474
+ if (!release || release.mode !== 'force' || !release.belowMinimum)
475
+ return;
476
+ const marker = `${release.minimumVersion}`;
477
+ try {
478
+ const store = webStorage('sessionStorage');
479
+ if (!store || store.getItem(FORCE_RELOAD_KEY) === marker)
480
+ return;
481
+ store.setItem(FORCE_RELOAD_KEY, marker);
482
+ if (store.getItem(FORCE_RELOAD_KEY) !== marker)
483
+ return;
484
+ }
485
+ catch {
486
+ return; // without a guard a reload could loop
487
+ }
488
+ this.reloadPage();
489
+ }
490
+ hookActivePing() {
491
+ const timer = setInterval(() => {
492
+ if (typeof document !== 'undefined' && document.visibilityState !== 'visible')
493
+ return;
494
+ this.recordPassively(() => this.trackEvent(ACTIVE_EVENT, { path: currentPath() }));
495
+ }, this.activePingMs);
496
+ this.teardowns.push(() => clearInterval(timer));
497
+ }
498
+ persistPending() {
499
+ if (!this.opts.persistQueue || !this.isEnabled)
500
+ return;
501
+ const items = boundedCopy(this.pendingItems());
502
+ if (items.length === 0) {
503
+ removeKey(QUEUE_KEY);
504
+ return;
505
+ }
506
+ try {
507
+ localStore()?.setItem(QUEUE_KEY, JSON.stringify(items));
508
+ }
509
+ catch {
510
+ /* quota exceeded or storage blocked: the in-flight requests are the only copy */
511
+ }
512
+ }
513
+ replayPersistedQueue() {
514
+ let raw;
515
+ try {
516
+ raw = localStore()?.getItem(QUEUE_KEY);
517
+ }
518
+ catch {
519
+ return;
520
+ }
521
+ if (raw === null || raw === undefined)
522
+ return;
523
+ removeKey(QUEUE_KEY);
524
+ if (!this.opts.persistQueue || !this.isEnabled)
525
+ return;
526
+ const items = parsePersisted(raw);
527
+ if (items.length > 0)
528
+ this.restoreItems(items);
529
+ }
530
+ }
531
+ /** At most MAX_PERSISTED_ITEMS items and about MAX_PERSISTED_CHARS characters of JSON. Errors are kept first. */
532
+ function boundedCopy(items) {
533
+ const ordered = [...items.filter((i) => i.kind === 'errors'), ...items.filter((i) => i.kind !== 'errors')];
534
+ const out = [];
535
+ let chars = 2;
536
+ for (const item of ordered) {
537
+ if (out.length >= MAX_PERSISTED_ITEMS)
538
+ break;
539
+ const size = JSON.stringify(item).length + 1;
540
+ if (chars + size > MAX_PERSISTED_CHARS)
541
+ continue;
542
+ out.push(item);
543
+ chars += size;
544
+ }
545
+ return out;
546
+ }
547
+ function parsePersisted(raw) {
548
+ let parsed;
549
+ try {
550
+ parsed = JSON.parse(raw);
551
+ }
552
+ catch {
553
+ return [];
554
+ }
555
+ if (!Array.isArray(parsed))
556
+ return [];
557
+ const items = [];
558
+ for (const entry of parsed) {
559
+ const candidate = entry;
560
+ if (!candidate || typeof candidate.kind !== 'string' || !KINDS.has(candidate.kind))
561
+ continue;
562
+ if (!candidate.body || typeof candidate.body !== 'object' || Array.isArray(candidate.body))
563
+ continue;
564
+ items.push({ kind: candidate.kind, body: candidate.body });
565
+ if (items.length >= MAX_PERSISTED_ITEMS)
566
+ break;
567
+ }
568
+ return items;
569
+ }
570
+ function currentPath() {
571
+ return typeof window !== 'undefined' ? normalizePath(window.location.pathname) : undefined;
572
+ }
573
+ function fileOf(filename) {
574
+ if (!filename)
575
+ return undefined;
576
+ try {
577
+ const url = new URL(filename);
578
+ return normalizePath(url.pathname);
579
+ }
580
+ catch {
581
+ return filename.slice(0, 255);
582
+ }
583
+ }
584
+ function referrerPath(referrer) {
585
+ if (!referrer)
586
+ return undefined;
587
+ try {
588
+ const url = new URL(referrer);
589
+ return `${url.host}${normalizePath(url.pathname)}`;
590
+ }
591
+ catch {
592
+ return undefined;
593
+ }
594
+ }
595
+ //# sourceMappingURL=browser-acr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-acr.js","sourceRoot":"","sources":["../../src/browser-acr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Errors the SDK has already reported. A failed fetch is captured by the fetch tracker and then, when the app does not
3
+ * catch it, arrives again as an unhandled rejection; this set keeps it from being reported twice.
4
+ */
5
+ const captured = new WeakSet();
6
+ /** Records that `error` was reported. Primitives cannot be tracked and are ignored. */
7
+ export function markCaptured(error) {
8
+ if (typeof error === 'object' && error !== null)
9
+ captured.add(error);
10
+ }
11
+ /** True when `error` was already reported through markCaptured(). */
12
+ export function wasCaptured(error) {
13
+ return typeof error === 'object' && error !== null && captured.has(error);
14
+ }
15
+ //# sourceMappingURL=captured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captured.js","sourceRoot":"","sources":["../../src/captured.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAU,CAAC;AAEvC,uFAAuF;AACvF,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC5E,CAAC"}