@lib-acr/browser 0.0.0-stage → 0.0.2
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/LICENSE +21 -0
- package/README.md +113 -2
- package/dist/cjs/browser-acr.js +600 -0
- package/dist/cjs/browser-acr.js.map +1 -0
- package/dist/cjs/captured.js +19 -0
- package/dist/cjs/captured.js.map +1 -0
- package/dist/cjs/control/command-runner.js +289 -0
- package/dist/cjs/control/command-runner.js.map +1 -0
- package/dist/cjs/control/ui.js +277 -0
- package/dist/cjs/control/ui.js.map +1 -0
- package/dist/cjs/device.js +54 -0
- package/dist/cjs/device.js.map +1 -0
- package/dist/cjs/fetch-tracker.js +63 -0
- package/dist/cjs/fetch-tracker.js.map +1 -0
- package/dist/cjs/identity.js +120 -0
- package/dist/cjs/identity.js.map +1 -0
- package/dist/cjs/index.js +73 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/sdk-info.js +6 -0
- package/dist/cjs/sdk-info.js.map +1 -0
- package/dist/cjs/url.js +31 -0
- package/dist/cjs/url.js.map +1 -0
- package/dist/cjs/web-vitals.js +160 -0
- package/dist/cjs/web-vitals.js.map +1 -0
- package/dist/esm/browser-acr.js +595 -0
- package/dist/esm/browser-acr.js.map +1 -0
- package/dist/esm/captured.js +15 -0
- package/dist/esm/captured.js.map +1 -0
- package/dist/esm/control/command-runner.js +284 -0
- package/dist/esm/control/command-runner.js.map +1 -0
- package/dist/esm/control/ui.js +272 -0
- package/dist/esm/control/ui.js.map +1 -0
- package/dist/esm/device.js +50 -0
- package/dist/esm/device.js.map +1 -0
- package/dist/esm/fetch-tracker.js +60 -0
- package/dist/esm/fetch-tracker.js.map +1 -0
- package/dist/esm/identity.js +112 -0
- package/dist/esm/identity.js.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/sdk-info.js +3 -0
- package/dist/esm/sdk-info.js.map +1 -0
- package/dist/esm/url.js +27 -0
- package/dist/esm/url.js.map +1 -0
- package/dist/esm/web-vitals.js +156 -0
- package/dist/esm/web-vitals.js.map +1 -0
- package/dist/types/browser-acr.d.ts +142 -0
- package/dist/types/captured.d.ts +4 -0
- package/dist/types/control/command-runner.d.ts +57 -0
- package/dist/types/control/ui.d.ts +50 -0
- package/dist/types/device.d.ts +24 -0
- package/dist/types/fetch-tracker.d.ts +15 -0
- package/dist/types/identity.d.ts +48 -0
- package/dist/types/index.d.ts +17 -0
- package/dist/types/sdk-info.d.ts +4 -0
- package/dist/types/url.d.ts +10 -0
- package/dist/types/web-vitals.d.ts +50 -0
- package/package.json +40 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../../src/device.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wrapFetch = wrapFetch;
|
|
4
|
+
const captured_js_1 = require("./captured.js");
|
|
5
|
+
const url_js_1 = require("./url.js");
|
|
6
|
+
function methodOf(input, init) {
|
|
7
|
+
const method = init?.method ?? (typeof input === 'object' && 'method' in input ? input.method : 'GET');
|
|
8
|
+
return (method || 'GET').toUpperCase();
|
|
9
|
+
}
|
|
10
|
+
function urlOf(input) {
|
|
11
|
+
if (typeof input === 'string')
|
|
12
|
+
return input;
|
|
13
|
+
if (input instanceof URL)
|
|
14
|
+
return input.toString();
|
|
15
|
+
return input.url;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Wraps fetch to record duration and outcome per request. Request and response bodies and headers are never read.
|
|
19
|
+
* URLs are reduced to origin and a normalized path. Network failures are also reported as frontend errors, and then
|
|
20
|
+
* rethrown so the application behaves as before. A rethrown failure is marked as captured, so it is not reported a
|
|
21
|
+
* second time as an unhandled rejection.
|
|
22
|
+
*/
|
|
23
|
+
function wrapFetch(original, client, options) {
|
|
24
|
+
return async function acrTrackedFetch(input, init) {
|
|
25
|
+
const url = urlOf(input);
|
|
26
|
+
if (options.ignoreUrlPrefixes.some((prefix) => url.startsWith(prefix)))
|
|
27
|
+
return original(input, init);
|
|
28
|
+
const method = methodOf(input, init);
|
|
29
|
+
const described = (0, url_js_1.describeUrl)(url, options.base);
|
|
30
|
+
const started = typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
31
|
+
const elapsed = () => Math.round(((typeof performance !== 'undefined' ? performance.now() : Date.now()) - started) * 100) / 100;
|
|
32
|
+
try {
|
|
33
|
+
const response = await original(input, init);
|
|
34
|
+
client.trackEvent('api_request', {
|
|
35
|
+
method,
|
|
36
|
+
host: described?.host,
|
|
37
|
+
path: described?.path,
|
|
38
|
+
status: response.status,
|
|
39
|
+
ok: response.ok,
|
|
40
|
+
durationMs: elapsed(),
|
|
41
|
+
});
|
|
42
|
+
return response;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
client.trackEvent('api_request', {
|
|
46
|
+
method,
|
|
47
|
+
host: described?.host,
|
|
48
|
+
path: described?.path,
|
|
49
|
+
status: 0,
|
|
50
|
+
ok: false,
|
|
51
|
+
durationMs: elapsed(),
|
|
52
|
+
});
|
|
53
|
+
client.captureError(err, {
|
|
54
|
+
handled: false,
|
|
55
|
+
source: 'frontend',
|
|
56
|
+
attributes: { kind: 'network', method, host: described?.host ?? 'unknown', path: described?.path ?? '/' },
|
|
57
|
+
});
|
|
58
|
+
(0, captured_js_1.markCaptured)(err);
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=fetch-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-tracker.js","sourceRoot":"","sources":["../../src/fetch-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionTracker = exports.FIRST_SEEN_KEY = exports.SESSION_KEY = exports.ANONYMOUS_KEY = void 0;
|
|
4
|
+
exports.randomId = randomId;
|
|
5
|
+
exports.getOrCreateAnonymousId = getOrCreateAnonymousId;
|
|
6
|
+
exports.ensureFirstSeen = ensureFirstSeen;
|
|
7
|
+
exports.resetAnonymousId = resetAnonymousId;
|
|
8
|
+
exports.ANONYMOUS_KEY = 'acr.anonymousId';
|
|
9
|
+
exports.SESSION_KEY = 'acr.session';
|
|
10
|
+
/** ISO time this browser first ran the SDK. Commands issued before it are skipped (nothing stale to clear). */
|
|
11
|
+
exports.FIRST_SEEN_KEY = 'acr.firstSeen';
|
|
12
|
+
function randomId() {
|
|
13
|
+
const c = globalThis.crypto;
|
|
14
|
+
if (c && typeof c.randomUUID === 'function')
|
|
15
|
+
return c.randomUUID();
|
|
16
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;
|
|
17
|
+
}
|
|
18
|
+
/** Stable id for one browser profile. Kept in localStorage when available, in memory otherwise. */
|
|
19
|
+
function getOrCreateAnonymousId(store, memory) {
|
|
20
|
+
try {
|
|
21
|
+
const existing = store?.getItem(exports.ANONYMOUS_KEY);
|
|
22
|
+
if (existing)
|
|
23
|
+
return existing;
|
|
24
|
+
const id = randomId();
|
|
25
|
+
store?.setItem(exports.ANONYMOUS_KEY, id);
|
|
26
|
+
return id;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
memory.id ?? (memory.id = randomId());
|
|
30
|
+
return memory.id;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Returns `acr.firstSeen`, writing the current time when it is missing (a new visitor, or a visitor whose anonymous id
|
|
35
|
+
* predates this key). It is never changed afterwards, not even by reset(). With storage blocked the value lives in
|
|
36
|
+
* memory for this page only.
|
|
37
|
+
*/
|
|
38
|
+
function ensureFirstSeen(store, memory, now = () => Date.now()) {
|
|
39
|
+
try {
|
|
40
|
+
const existing = store?.getItem(exports.FIRST_SEEN_KEY);
|
|
41
|
+
if (existing && !Number.isNaN(Date.parse(existing)))
|
|
42
|
+
return existing;
|
|
43
|
+
const value = new Date(now()).toISOString();
|
|
44
|
+
store?.setItem(exports.FIRST_SEEN_KEY, value);
|
|
45
|
+
if (store && store.getItem(exports.FIRST_SEEN_KEY) !== value)
|
|
46
|
+
throw new Error('not persisted');
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
memory.firstSeen ?? (memory.firstSeen = new Date(now()).toISOString());
|
|
51
|
+
return memory.firstSeen;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Replaces the anonymous id with a new one (for example on logout) and returns it. */
|
|
55
|
+
function resetAnonymousId(store, memory) {
|
|
56
|
+
const id = randomId();
|
|
57
|
+
memory.id = id;
|
|
58
|
+
try {
|
|
59
|
+
store?.setItem(exports.ANONYMOUS_KEY, id);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* the memory copy is used while storage is blocked */
|
|
63
|
+
}
|
|
64
|
+
return id;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Browser session: a new id after `timeoutMs` without activity, or when the tab is new. The state lives in
|
|
68
|
+
* sessionStorage, so it survives reloads of the same tab but not a new tab.
|
|
69
|
+
*/
|
|
70
|
+
class SessionTracker {
|
|
71
|
+
constructor(store, timeoutMs, now = () => Date.now()) {
|
|
72
|
+
this.store = store;
|
|
73
|
+
this.timeoutMs = timeoutMs;
|
|
74
|
+
this.now = now;
|
|
75
|
+
this.memory = null;
|
|
76
|
+
}
|
|
77
|
+
/** Returns the current session and marks it active. */
|
|
78
|
+
touch() {
|
|
79
|
+
const current = this.read();
|
|
80
|
+
const t = this.now();
|
|
81
|
+
if (current && t - current.last <= this.timeoutMs) {
|
|
82
|
+
this.write({ id: current.id, last: t });
|
|
83
|
+
return { id: current.id, isNew: false };
|
|
84
|
+
}
|
|
85
|
+
const fresh = { id: randomId(), last: t };
|
|
86
|
+
this.write(fresh);
|
|
87
|
+
return { id: fresh.id, isNew: true };
|
|
88
|
+
}
|
|
89
|
+
/** Ends the current session and starts a new one now. */
|
|
90
|
+
reset() {
|
|
91
|
+
const fresh = { id: randomId(), last: this.now() };
|
|
92
|
+
this.write(fresh);
|
|
93
|
+
return { id: fresh.id, isNew: true };
|
|
94
|
+
}
|
|
95
|
+
read() {
|
|
96
|
+
try {
|
|
97
|
+
const raw = this.store?.getItem(exports.SESSION_KEY);
|
|
98
|
+
if (raw) {
|
|
99
|
+
const parsed = JSON.parse(raw);
|
|
100
|
+
if (typeof parsed.id === 'string' && typeof parsed.last === 'number')
|
|
101
|
+
return { id: parsed.id, last: parsed.last };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
/* fall through to memory */
|
|
106
|
+
}
|
|
107
|
+
return this.memory;
|
|
108
|
+
}
|
|
109
|
+
write(state) {
|
|
110
|
+
this.memory = state;
|
|
111
|
+
try {
|
|
112
|
+
this.store?.setItem(exports.SESSION_KEY, JSON.stringify(state));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* memory copy is enough */
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.SessionTracker = SessionTracker;
|
|
120
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.planCommands = exports.parseTraceparent = exports.parseSnapshot = exports.parseSemver = exports.isSensitiveKey = exports.inRollout = exports.generateTraceId = exports.generateSpanId = exports.generateId = exports.formatTraceparent = exports.fnv1a32 = exports.evaluateFlag = exports.describeError = exports.compareSemver = exports.clearCacheParams = exports.EMPTY_CONTROL_STATE = exports.SCHEMA_VERSION = exports.REDACTED_EMAIL = exports.REDACTED = exports.CORE_SDK = exports.AcrError = exports.wasCaptured = exports.markCaptured = exports.wrapFetch = exports.VitalsCollector = exports.resolveUiOptions = exports.UI_HOST_TAG = exports.ControlUI = exports.RESERVED_PREFIX = exports.RELOAD_GUARD_KEY = exports.COMMAND_APPLIED_EVENT = exports.COMMANDS_KEY = exports.clearCaches = exports.CommandRunner = exports.resetAnonymousId = exports.getOrCreateAnonymousId = exports.ensureFirstSeen = exports.SessionTracker = exports.FIRST_SEEN_KEY = exports.ANONYMOUS_KEY = exports.parseUserAgent = exports.getDeviceInfo = exports.describeUrl = exports.normalizePath = exports.assertPublishableOptions = exports.QUEUE_KEY = exports.FORCE_RELOAD_KEY = exports.DISMISSED_KEY = exports.BROWSER_SDK = exports.BrowserACR = void 0;
|
|
4
|
+
exports.typedFlagValue = exports.sessionSampled = exports.rolloutBucket = exports.reloadParams = exports.redactString = exports.redactAttributes = void 0;
|
|
5
|
+
var browser_acr_js_1 = require("./browser-acr.js");
|
|
6
|
+
Object.defineProperty(exports, "BrowserACR", { enumerable: true, get: function () { return browser_acr_js_1.BrowserACR; } });
|
|
7
|
+
Object.defineProperty(exports, "BROWSER_SDK", { enumerable: true, get: function () { return browser_acr_js_1.BROWSER_SDK; } });
|
|
8
|
+
Object.defineProperty(exports, "DISMISSED_KEY", { enumerable: true, get: function () { return browser_acr_js_1.DISMISSED_KEY; } });
|
|
9
|
+
Object.defineProperty(exports, "FORCE_RELOAD_KEY", { enumerable: true, get: function () { return browser_acr_js_1.FORCE_RELOAD_KEY; } });
|
|
10
|
+
Object.defineProperty(exports, "QUEUE_KEY", { enumerable: true, get: function () { return browser_acr_js_1.QUEUE_KEY; } });
|
|
11
|
+
Object.defineProperty(exports, "assertPublishableOptions", { enumerable: true, get: function () { return browser_acr_js_1.assertPublishableOptions; } });
|
|
12
|
+
var url_js_1 = require("./url.js");
|
|
13
|
+
Object.defineProperty(exports, "normalizePath", { enumerable: true, get: function () { return url_js_1.normalizePath; } });
|
|
14
|
+
Object.defineProperty(exports, "describeUrl", { enumerable: true, get: function () { return url_js_1.describeUrl; } });
|
|
15
|
+
var device_js_1 = require("./device.js");
|
|
16
|
+
Object.defineProperty(exports, "getDeviceInfo", { enumerable: true, get: function () { return device_js_1.getDeviceInfo; } });
|
|
17
|
+
Object.defineProperty(exports, "parseUserAgent", { enumerable: true, get: function () { return device_js_1.parseUserAgent; } });
|
|
18
|
+
var identity_js_1 = require("./identity.js");
|
|
19
|
+
Object.defineProperty(exports, "ANONYMOUS_KEY", { enumerable: true, get: function () { return identity_js_1.ANONYMOUS_KEY; } });
|
|
20
|
+
Object.defineProperty(exports, "FIRST_SEEN_KEY", { enumerable: true, get: function () { return identity_js_1.FIRST_SEEN_KEY; } });
|
|
21
|
+
Object.defineProperty(exports, "SessionTracker", { enumerable: true, get: function () { return identity_js_1.SessionTracker; } });
|
|
22
|
+
Object.defineProperty(exports, "ensureFirstSeen", { enumerable: true, get: function () { return identity_js_1.ensureFirstSeen; } });
|
|
23
|
+
Object.defineProperty(exports, "getOrCreateAnonymousId", { enumerable: true, get: function () { return identity_js_1.getOrCreateAnonymousId; } });
|
|
24
|
+
Object.defineProperty(exports, "resetAnonymousId", { enumerable: true, get: function () { return identity_js_1.resetAnonymousId; } });
|
|
25
|
+
var command_runner_js_1 = require("./control/command-runner.js");
|
|
26
|
+
Object.defineProperty(exports, "CommandRunner", { enumerable: true, get: function () { return command_runner_js_1.CommandRunner; } });
|
|
27
|
+
Object.defineProperty(exports, "clearCaches", { enumerable: true, get: function () { return command_runner_js_1.clearCaches; } });
|
|
28
|
+
Object.defineProperty(exports, "COMMANDS_KEY", { enumerable: true, get: function () { return command_runner_js_1.COMMANDS_KEY; } });
|
|
29
|
+
Object.defineProperty(exports, "COMMAND_APPLIED_EVENT", { enumerable: true, get: function () { return command_runner_js_1.COMMAND_APPLIED_EVENT; } });
|
|
30
|
+
Object.defineProperty(exports, "RELOAD_GUARD_KEY", { enumerable: true, get: function () { return command_runner_js_1.RELOAD_GUARD_KEY; } });
|
|
31
|
+
Object.defineProperty(exports, "RESERVED_PREFIX", { enumerable: true, get: function () { return command_runner_js_1.RESERVED_PREFIX; } });
|
|
32
|
+
var ui_js_1 = require("./control/ui.js");
|
|
33
|
+
Object.defineProperty(exports, "ControlUI", { enumerable: true, get: function () { return ui_js_1.ControlUI; } });
|
|
34
|
+
Object.defineProperty(exports, "UI_HOST_TAG", { enumerable: true, get: function () { return ui_js_1.UI_HOST_TAG; } });
|
|
35
|
+
Object.defineProperty(exports, "resolveUiOptions", { enumerable: true, get: function () { return ui_js_1.resolveUiOptions; } });
|
|
36
|
+
var web_vitals_js_1 = require("./web-vitals.js");
|
|
37
|
+
Object.defineProperty(exports, "VitalsCollector", { enumerable: true, get: function () { return web_vitals_js_1.VitalsCollector; } });
|
|
38
|
+
var fetch_tracker_js_1 = require("./fetch-tracker.js");
|
|
39
|
+
Object.defineProperty(exports, "wrapFetch", { enumerable: true, get: function () { return fetch_tracker_js_1.wrapFetch; } });
|
|
40
|
+
var captured_js_1 = require("./captured.js");
|
|
41
|
+
Object.defineProperty(exports, "markCaptured", { enumerable: true, get: function () { return captured_js_1.markCaptured; } });
|
|
42
|
+
Object.defineProperty(exports, "wasCaptured", { enumerable: true, get: function () { return captured_js_1.wasCaptured; } });
|
|
43
|
+
// Shared helpers and types from @lib-acr/core. The core client, transport and config resolver are deliberately not
|
|
44
|
+
// re-exported: AcrClient accepts a secret key, and a browser entry point must not offer a way to bundle one.
|
|
45
|
+
var core_1 = require("@lib-acr/core");
|
|
46
|
+
Object.defineProperty(exports, "AcrError", { enumerable: true, get: function () { return core_1.AcrError; } });
|
|
47
|
+
Object.defineProperty(exports, "CORE_SDK", { enumerable: true, get: function () { return core_1.CORE_SDK; } });
|
|
48
|
+
Object.defineProperty(exports, "REDACTED", { enumerable: true, get: function () { return core_1.REDACTED; } });
|
|
49
|
+
Object.defineProperty(exports, "REDACTED_EMAIL", { enumerable: true, get: function () { return core_1.REDACTED_EMAIL; } });
|
|
50
|
+
Object.defineProperty(exports, "SCHEMA_VERSION", { enumerable: true, get: function () { return core_1.SCHEMA_VERSION; } });
|
|
51
|
+
Object.defineProperty(exports, "EMPTY_CONTROL_STATE", { enumerable: true, get: function () { return core_1.EMPTY_CONTROL_STATE; } });
|
|
52
|
+
Object.defineProperty(exports, "clearCacheParams", { enumerable: true, get: function () { return core_1.clearCacheParams; } });
|
|
53
|
+
Object.defineProperty(exports, "compareSemver", { enumerable: true, get: function () { return core_1.compareSemver; } });
|
|
54
|
+
Object.defineProperty(exports, "describeError", { enumerable: true, get: function () { return core_1.describeError; } });
|
|
55
|
+
Object.defineProperty(exports, "evaluateFlag", { enumerable: true, get: function () { return core_1.evaluateFlag; } });
|
|
56
|
+
Object.defineProperty(exports, "fnv1a32", { enumerable: true, get: function () { return core_1.fnv1a32; } });
|
|
57
|
+
Object.defineProperty(exports, "formatTraceparent", { enumerable: true, get: function () { return core_1.formatTraceparent; } });
|
|
58
|
+
Object.defineProperty(exports, "generateId", { enumerable: true, get: function () { return core_1.generateId; } });
|
|
59
|
+
Object.defineProperty(exports, "generateSpanId", { enumerable: true, get: function () { return core_1.generateSpanId; } });
|
|
60
|
+
Object.defineProperty(exports, "generateTraceId", { enumerable: true, get: function () { return core_1.generateTraceId; } });
|
|
61
|
+
Object.defineProperty(exports, "inRollout", { enumerable: true, get: function () { return core_1.inRollout; } });
|
|
62
|
+
Object.defineProperty(exports, "isSensitiveKey", { enumerable: true, get: function () { return core_1.isSensitiveKey; } });
|
|
63
|
+
Object.defineProperty(exports, "parseSemver", { enumerable: true, get: function () { return core_1.parseSemver; } });
|
|
64
|
+
Object.defineProperty(exports, "parseSnapshot", { enumerable: true, get: function () { return core_1.parseSnapshot; } });
|
|
65
|
+
Object.defineProperty(exports, "parseTraceparent", { enumerable: true, get: function () { return core_1.parseTraceparent; } });
|
|
66
|
+
Object.defineProperty(exports, "planCommands", { enumerable: true, get: function () { return core_1.planCommands; } });
|
|
67
|
+
Object.defineProperty(exports, "redactAttributes", { enumerable: true, get: function () { return core_1.redactAttributes; } });
|
|
68
|
+
Object.defineProperty(exports, "redactString", { enumerable: true, get: function () { return core_1.redactString; } });
|
|
69
|
+
Object.defineProperty(exports, "reloadParams", { enumerable: true, get: function () { return core_1.reloadParams; } });
|
|
70
|
+
Object.defineProperty(exports, "rolloutBucket", { enumerable: true, get: function () { return core_1.rolloutBucket; } });
|
|
71
|
+
Object.defineProperty(exports, "sessionSampled", { enumerable: true, get: function () { return core_1.sessionSampled; } });
|
|
72
|
+
Object.defineProperty(exports, "typedFlagValue", { enumerable: true, get: function () { return core_1.typedFlagValue; } });
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;AAAA,mDAAiI;AAAxH,4GAAA,UAAU,OAAA;AAAE,6GAAA,WAAW,OAAA;AAAE,+GAAA,aAAa,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AAAE,2GAAA,SAAS,OAAA;AAAE,0HAAA,wBAAwB,OAAA;AAEtG,mCAAsD;AAA7C,uGAAA,aAAa,OAAA;AAAE,qGAAA,WAAW,OAAA;AACnC,yCAA4D;AAAnD,0GAAA,aAAa,OAAA;AAAE,2GAAA,cAAc,OAAA;AAEtC,6CAAyI;AAAhI,4GAAA,aAAa,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,6GAAA,cAAc,OAAA;AAAE,8GAAA,eAAe,OAAA;AAAE,qHAAA,sBAAsB,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AACjH,iEAAiJ;AAAxI,kHAAA,aAAa,OAAA;AAAE,gHAAA,WAAW,OAAA;AAAE,iHAAA,YAAY,OAAA;AAAE,0HAAA,qBAAqB,OAAA;AAAE,qHAAA,gBAAgB,OAAA;AAAE,oHAAA,eAAe,OAAA;AAE3G,yCAA2E;AAAlE,kGAAA,SAAS,OAAA;AAAE,oGAAA,WAAW,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAGjD,iDAAkD;AAAzC,gHAAA,eAAe,OAAA;AAExB,uDAA+C;AAAtC,6GAAA,SAAS,OAAA;AAClB,6CAA0D;AAAjD,2GAAA,YAAY,OAAA;AAAE,0GAAA,WAAW,OAAA;AAElC,mHAAmH;AACnH,6GAA6G;AAC7G,sCA4BuB;AA3BrB,gGAAA,QAAQ,OAAA;AACR,gGAAA,QAAQ,OAAA;AACR,gGAAA,QAAQ,OAAA;AACR,sGAAA,cAAc,OAAA;AACd,sGAAA,cAAc,OAAA;AACd,2GAAA,mBAAmB,OAAA;AACnB,wGAAA,gBAAgB,OAAA;AAChB,qGAAA,aAAa,OAAA;AACb,qGAAA,aAAa,OAAA;AACb,oGAAA,YAAY,OAAA;AACZ,+FAAA,OAAO,OAAA;AACP,yGAAA,iBAAiB,OAAA;AACjB,kGAAA,UAAU,OAAA;AACV,sGAAA,cAAc,OAAA;AACd,uGAAA,eAAe,OAAA;AACf,iGAAA,SAAS,OAAA;AACT,sGAAA,cAAc,OAAA;AACd,mGAAA,WAAW,OAAA;AACX,qGAAA,aAAa,OAAA;AACb,wGAAA,gBAAgB,OAAA;AAChB,oGAAA,YAAY,OAAA;AACZ,wGAAA,gBAAgB,OAAA;AAChB,oGAAA,YAAY,OAAA;AACZ,oGAAA,YAAY,OAAA;AACZ,qGAAA,aAAa,OAAA;AACb,sGAAA,cAAc,OAAA;AACd,sGAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SDK_INFO = void 0;
|
|
4
|
+
// Generated by scripts/sync-sdk-info.mjs from package.json. Do not edit by hand.
|
|
5
|
+
exports.SDK_INFO = { name: '@lib-acr/browser', version: '0.0.2' };
|
|
6
|
+
//# sourceMappingURL=sdk-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk-info.js","sourceRoot":"","sources":["../../src/sdk-info.ts"],"names":[],"mappings":";;;AAAA,iFAAiF;AACpE,QAAA,QAAQ,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAW,CAAC"}
|
package/dist/cjs/url.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizePath = normalizePath;
|
|
4
|
+
exports.describeUrl = describeUrl;
|
|
5
|
+
const UUID_SEGMENT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
6
|
+
const NUMERIC_SEGMENT = /^\d+$/;
|
|
7
|
+
const LONG_HEX_SEGMENT = /^[0-9a-f]{16,}$/i;
|
|
8
|
+
/**
|
|
9
|
+
* Path for telemetry: no query string, no fragment, and ids replaced with :id so that /orders/42 and /orders/43 group
|
|
10
|
+
* together. Query strings often carry tokens or personal data, so they are never sent.
|
|
11
|
+
*/
|
|
12
|
+
function normalizePath(pathname) {
|
|
13
|
+
const path = (pathname || '/').split(/[?#]/)[0] || '/';
|
|
14
|
+
const segments = path.split('/').map((segment) => {
|
|
15
|
+
if (UUID_SEGMENT.test(segment) || NUMERIC_SEGMENT.test(segment) || LONG_HEX_SEGMENT.test(segment))
|
|
16
|
+
return ':id';
|
|
17
|
+
return segment;
|
|
18
|
+
});
|
|
19
|
+
return segments.join('/').slice(0, 512) || '/';
|
|
20
|
+
}
|
|
21
|
+
/** Absolute URL to origin + normalized path, for api_request events. */
|
|
22
|
+
function describeUrl(input, base) {
|
|
23
|
+
try {
|
|
24
|
+
const url = new URL(input, base);
|
|
25
|
+
return { host: url.host, path: normalizePath(url.pathname) };
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/url.ts"],"names":[],"mappings":";;AAQA,sCAOC;AAGD,kCAOC;AAzBD,MAAM,YAAY,GAAG,iEAAiE,CAAC;AACvF,MAAM,eAAe,GAAG,OAAO,CAAC;AAChC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAE5C;;;GAGG;AACH,SAAgB,aAAa,CAAC,QAAgB;IAC5C,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC/C,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAChH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC;AACjD,CAAC;AAED,wEAAwE;AACxE,SAAgB,WAAW,CAAC,KAAa,EAAE,IAAY;IACrD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VitalsCollector = void 0;
|
|
4
|
+
const EMPTY = { fcp: null, lcp: null, cls: null, ttfb: null, inpMaxMs: null, pageLoadMs: null };
|
|
5
|
+
/**
|
|
6
|
+
* Collects Core Web Vitals with PerformanceObserver. It degrades silently where an entry type is unsupported, which is
|
|
7
|
+
* the case in older browsers and in jsdom.
|
|
8
|
+
*/
|
|
9
|
+
class VitalsCollector {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.state = { ...EMPTY };
|
|
12
|
+
/** Stable reference, replaced only when a value changes, so useSyncExternalStore does not loop. */
|
|
13
|
+
this.current = { ...EMPTY };
|
|
14
|
+
this.observers = [];
|
|
15
|
+
this.listeners = new Set();
|
|
16
|
+
this.clsWindow = { value: 0, start: 0, last: 0 };
|
|
17
|
+
this.clsMax = 0;
|
|
18
|
+
this.loadListener = null;
|
|
19
|
+
this.loadTimer = null;
|
|
20
|
+
}
|
|
21
|
+
start() {
|
|
22
|
+
this.observeEntries();
|
|
23
|
+
this.readNavigation();
|
|
24
|
+
this.watchLoad();
|
|
25
|
+
}
|
|
26
|
+
stop() {
|
|
27
|
+
for (const o of this.observers)
|
|
28
|
+
o.disconnect();
|
|
29
|
+
this.observers = [];
|
|
30
|
+
if (this.loadListener && typeof window !== 'undefined')
|
|
31
|
+
window.removeEventListener('load', this.loadListener);
|
|
32
|
+
this.loadListener = null;
|
|
33
|
+
if (this.loadTimer)
|
|
34
|
+
clearTimeout(this.loadTimer);
|
|
35
|
+
this.loadTimer = null;
|
|
36
|
+
}
|
|
37
|
+
snapshot() {
|
|
38
|
+
return this.current;
|
|
39
|
+
}
|
|
40
|
+
subscribe(listener) {
|
|
41
|
+
this.listeners.add(listener);
|
|
42
|
+
return () => this.listeners.delete(listener);
|
|
43
|
+
}
|
|
44
|
+
observeEntries() {
|
|
45
|
+
if (typeof PerformanceObserver === 'undefined')
|
|
46
|
+
return;
|
|
47
|
+
this.observe('paint', (entries) => {
|
|
48
|
+
const fcp = entries.find((e) => e.name === 'first-contentful-paint');
|
|
49
|
+
if (fcp)
|
|
50
|
+
this.update({ fcp: round(fcp.startTime) });
|
|
51
|
+
});
|
|
52
|
+
this.observe('largest-contentful-paint', (entries) => {
|
|
53
|
+
const last = entries[entries.length - 1];
|
|
54
|
+
if (last)
|
|
55
|
+
this.update({ lcp: round(last.startTime) });
|
|
56
|
+
});
|
|
57
|
+
this.observe('layout-shift', (entries) => {
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (entry.hadRecentInput)
|
|
60
|
+
continue;
|
|
61
|
+
this.addLayoutShift(entry.startTime, entry.value);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
this.observe('event', (entries) => {
|
|
65
|
+
for (const entry of entries) {
|
|
66
|
+
if (!entry.interactionId)
|
|
67
|
+
continue;
|
|
68
|
+
this.update({ inpMaxMs: Math.max(this.state.inpMaxMs ?? 0, round(entry.duration)) });
|
|
69
|
+
}
|
|
70
|
+
}, { durationThreshold: 40 });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* `loadEventEnd` is only known once the load event has finished. When start() runs earlier (the usual case for an
|
|
74
|
+
* SDK loaded in the page head), read the navigation entry again just after `load`.
|
|
75
|
+
*/
|
|
76
|
+
watchLoad() {
|
|
77
|
+
if (this.state.pageLoadMs !== null || typeof window === 'undefined' || typeof document === 'undefined')
|
|
78
|
+
return;
|
|
79
|
+
const readSoon = () => {
|
|
80
|
+
this.loadTimer = setTimeout(() => {
|
|
81
|
+
this.loadTimer = null;
|
|
82
|
+
this.readNavigation();
|
|
83
|
+
}, 0);
|
|
84
|
+
};
|
|
85
|
+
if (document.readyState === 'complete') {
|
|
86
|
+
readSoon();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
const onLoad = () => {
|
|
90
|
+
this.loadListener = null;
|
|
91
|
+
readSoon();
|
|
92
|
+
};
|
|
93
|
+
this.loadListener = onLoad;
|
|
94
|
+
window.addEventListener('load', onLoad, { once: true });
|
|
95
|
+
}
|
|
96
|
+
observe(type, handle, options = {}) {
|
|
97
|
+
try {
|
|
98
|
+
const observer = new PerformanceObserver((list) => handle(list.getEntries()));
|
|
99
|
+
observer.observe({ type, buffered: true, ...options });
|
|
100
|
+
this.observers.push(observer);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
/* entry type not supported here */
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Session windows: a window ends after 1 s of quiet or 5 s in total; CLS is the largest window. */
|
|
107
|
+
addLayoutShift(time, value) {
|
|
108
|
+
const w = this.clsWindow;
|
|
109
|
+
if (w.value === 0 || time - w.last > 1000 || time - w.start > 5000) {
|
|
110
|
+
this.clsWindow = { value, start: time, last: time };
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.clsWindow = { value: w.value + value, start: w.start, last: time };
|
|
114
|
+
}
|
|
115
|
+
this.clsMax = Math.max(this.clsMax, this.clsWindow.value);
|
|
116
|
+
this.publish();
|
|
117
|
+
}
|
|
118
|
+
readNavigation() {
|
|
119
|
+
if (typeof performance === 'undefined' || typeof performance.getEntriesByType !== 'function')
|
|
120
|
+
return;
|
|
121
|
+
let nav;
|
|
122
|
+
try {
|
|
123
|
+
nav = performance.getEntriesByType('navigation')[0];
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (!nav)
|
|
129
|
+
return;
|
|
130
|
+
this.update({
|
|
131
|
+
ttfb: round(nav.responseStart),
|
|
132
|
+
pageLoadMs: nav.loadEventEnd > 0 ? round(nav.loadEventEnd) : this.state.pageLoadMs,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
update(patch) {
|
|
136
|
+
this.state = { ...this.state, ...patch };
|
|
137
|
+
this.publish();
|
|
138
|
+
}
|
|
139
|
+
publish() {
|
|
140
|
+
const next = { ...this.state, cls: this.clsMax > 0 ? round(this.clsMax, 4) : this.state.cls };
|
|
141
|
+
const changed = Object.keys(next).some((k) => next[k] !== this.current[k]);
|
|
142
|
+
if (!changed)
|
|
143
|
+
return;
|
|
144
|
+
this.current = next;
|
|
145
|
+
for (const listener of [...this.listeners]) {
|
|
146
|
+
try {
|
|
147
|
+
listener(this.current);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
/* a faulty listener must not stop collection */
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.VitalsCollector = VitalsCollector;
|
|
156
|
+
function round(value, digits = 2) {
|
|
157
|
+
const f = 10 ** digits;
|
|
158
|
+
return Math.round(value * f) / f;
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=web-vitals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-vitals.js","sourceRoot":"","sources":["../../src/web-vitals.ts"],"names":[],"mappings":"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"}
|