@tracelog/lib 2.6.0 → 2.6.1-rc.92.4
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/dist/browser/tracelog.esm.js +155 -103
- package/dist/browser/tracelog.esm.js.map +1 -1
- package/dist/browser/tracelog.js +1 -1
- package/dist/browser/tracelog.js.map +1 -1
- package/dist/public-api.cjs +2 -2
- package/dist/public-api.cjs.map +1 -1
- package/dist/public-api.d.mts +8 -0
- package/dist/public-api.d.ts +8 -0
- package/dist/public-api.js +2 -2
- package/dist/public-api.js.map +1 -1
- package/package.json +1 -1
|
@@ -80,7 +80,7 @@ const m = {
|
|
|
80
80
|
/<embed\b[^>]*>/gi,
|
|
81
81
|
/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi
|
|
82
82
|
], y = "tlog", G = `${y}:qa_mode`, Oe = `${y}:uid`, Je = "tlog_mode", Pe = "qa", De = "qa_off", It = (s) => s ? `${y}:${s}:queue` : `${y}:queue`, wt = (s) => s ? `${y}:${s}:session` : `${y}:session`, yt = (s) => s ? `${y}:${s}:broadcast` : `${y}:broadcast`, Ve = (s, e) => `${y}:${s}:session_counts:${e}`, ke = 10080 * 60 * 1e3, Ue = `${y}:session_counts_last_cleanup`, He = 3600 * 1e3;
|
|
83
|
-
var $ = /* @__PURE__ */ ((s) => (s.Localhost = "localhost:8080", s.Fail = "localhost:9999", s))($ || {}),
|
|
83
|
+
var $ = /* @__PURE__ */ ((s) => (s.Localhost = "localhost:8080", s.Fail = "localhost:9999", s))($ || {}), L = /* @__PURE__ */ ((s) => (s.Mobile = "mobile", s.Tablet = "tablet", s.Desktop = "desktop", s.Unknown = "unknown", s))(L || {}), me = /* @__PURE__ */ ((s) => (s.EVENT = "event", s.QUEUE = "queue", s))(me || {});
|
|
84
84
|
class N extends Error {
|
|
85
85
|
constructor(e, t) {
|
|
86
86
|
super(e), this.statusCode = t, this.name = "PermanentError", Error.captureStackTrace && Error.captureStackTrace(this, N);
|
|
@@ -123,7 +123,7 @@ class hs extends Q {
|
|
|
123
123
|
super(e, "INITIALIZATION_TIMEOUT", r), this.timeoutMs = t;
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
-
const Ze = "background: #ff9800; color: white; font-weight: bold; padding: 2px 8px; border-radius: 3px;", et = "background: #9e9e9e; color: white; font-weight: bold; padding: 2px 8px; border-radius: 3px;",
|
|
126
|
+
const Ze = "background: #ff9800; color: white; font-weight: bold; padding: 2px 8px; border-radius: 3px;", et = "background: #9e9e9e; color: white; font-weight: bold; padding: 2px 8px; border-radius: 3px;", At = "background: #d32f2f; color: white; font-weight: bold; padding: 2px 8px; border-radius: 3px;", Lt = (s, e) => {
|
|
127
127
|
if (e) {
|
|
128
128
|
if (e instanceof Error) {
|
|
129
129
|
const t = e.message.replace(/\s+at\s+.*$/gm, "").replace(/\s*\([^()]+:\d+:\d+\)/g, "");
|
|
@@ -151,12 +151,12 @@ const Ze = "background: #ff9800; color: white; font-weight: bold; padding: 2px 8
|
|
|
151
151
|
return !1;
|
|
152
152
|
}
|
|
153
153
|
}, l = (s, e, t) => {
|
|
154
|
-
const { error: r, data: n, showToClient: i = !1, style: o, visibility: a } = t ?? {}, c = r ?
|
|
154
|
+
const { error: r, data: n, showToClient: i = !1, style: o, visibility: a } = t ?? {}, c = r ? Lt(e, r) : `[TraceLog] ${e}`, u = s === "error" ? "error" : s === "warn" ? "warn" : "log";
|
|
155
155
|
if (!Ct(a, i))
|
|
156
156
|
return;
|
|
157
|
-
const
|
|
158
|
-
Nt(u, c,
|
|
159
|
-
}, Ct = (s, e) => s === "critical" ? !0 : s === "qa" || e ? Mt() : !1, Rt = (s, e) => e !== void 0 && e !== "" ? e : s === "critical" ?
|
|
157
|
+
const E = Rt(a, o), p = n !== void 0 ? ge(n) : void 0;
|
|
158
|
+
Nt(u, c, E, p);
|
|
159
|
+
}, Ct = (s, e) => s === "critical" ? !0 : s === "qa" || e ? Mt() : !1, Rt = (s, e) => e !== void 0 && e !== "" ? e : s === "critical" ? At : "", Nt = (s, e, t, r) => {
|
|
160
160
|
const n = t !== void 0 && t !== "", i = n ? `%c${e}` : e;
|
|
161
161
|
r !== void 0 ? n ? console[s](i, t, r) : console[s](i, r) : n ? console[s](i, t) : console[s](i);
|
|
162
162
|
}, ge = (s) => {
|
|
@@ -204,13 +204,13 @@ const Ot = () => {
|
|
|
204
204
|
const s = navigator;
|
|
205
205
|
if (s.userAgentData != null && typeof s.userAgentData.mobile == "boolean") {
|
|
206
206
|
const c = s.userAgentData.platform;
|
|
207
|
-
return c != null && c !== "" && /ipad|tablet/i.test(c) ?
|
|
207
|
+
return c != null && c !== "" && /ipad|tablet/i.test(c) ? L.Tablet : s.userAgentData.mobile ? L.Mobile : L.Desktop;
|
|
208
208
|
}
|
|
209
209
|
Ot();
|
|
210
210
|
const e = window.innerWidth, t = Ee?.matches ?? !1, r = tt?.matches ?? !1, n = "ontouchstart" in window || navigator.maxTouchPoints > 0, i = navigator.userAgent.toLowerCase(), o = /mobile|android|iphone|ipod|blackberry|iemobile|opera mini/.test(i), a = /tablet|ipad|android(?!.*mobile)/.test(i);
|
|
211
|
-
return e <= 767 || o && n ?
|
|
211
|
+
return e <= 767 || o && n ? L.Mobile : e >= 768 && e <= 1024 || a || t && r && n ? L.Tablet : L.Desktop;
|
|
212
212
|
} catch (s) {
|
|
213
|
-
return l("debug", "Device detection failed, defaulting to desktop", { error: s }),
|
|
213
|
+
return l("debug", "Device detection failed, defaulting to desktop", { error: s }), L.Desktop;
|
|
214
214
|
}
|
|
215
215
|
}, kt = () => {
|
|
216
216
|
try {
|
|
@@ -222,7 +222,7 @@ const Ot = () => {
|
|
|
222
222
|
};
|
|
223
223
|
} catch (s) {
|
|
224
224
|
return l("debug", "Device info detection failed, using defaults", { error: s }), {
|
|
225
|
-
type:
|
|
225
|
+
type: L.Desktop,
|
|
226
226
|
os: se,
|
|
227
227
|
browser: se
|
|
228
228
|
};
|
|
@@ -290,7 +290,7 @@ const Ot = () => {
|
|
|
290
290
|
default:
|
|
291
291
|
return We;
|
|
292
292
|
}
|
|
293
|
-
}, Bt = 1e3, Wt = 50, Gt = "2.
|
|
293
|
+
}, Bt = 1e3, Wt = 50, Gt = "2.6.1", Xt = Gt, nt = () => typeof window < "u" && typeof sessionStorage < "u", Qt = () => {
|
|
294
294
|
try {
|
|
295
295
|
const s = new URLSearchParams(window.location.search);
|
|
296
296
|
s.delete(Je);
|
|
@@ -959,6 +959,15 @@ class ze extends w {
|
|
|
959
959
|
lastMetadataTimestamp = 0;
|
|
960
960
|
fetchCredentials;
|
|
961
961
|
pendingControllers = /* @__PURE__ */ new Set();
|
|
962
|
+
/**
|
|
963
|
+
* Counts consecutive fetch() rejections where no HTTP response was received
|
|
964
|
+
* (DNS failure, connection refused, etc.). Resets on success.
|
|
965
|
+
* When this reaches MAX_CONSECUTIVE_NETWORK_FAILURES the circuit opens and
|
|
966
|
+
* further send attempts are skipped until CIRCUIT_BREAKER_COOLDOWN_MS elapses,
|
|
967
|
+
* at which point a single probe request is allowed (half-open state).
|
|
968
|
+
*/
|
|
969
|
+
consecutiveNetworkFailures = 0;
|
|
970
|
+
circuitOpenedAt = 0;
|
|
962
971
|
/**
|
|
963
972
|
* Creates a SenderManager instance.
|
|
964
973
|
*
|
|
@@ -1181,8 +1190,16 @@ class ze extends w {
|
|
|
1181
1190
|
this.clearPersistedEvents();
|
|
1182
1191
|
return;
|
|
1183
1192
|
}
|
|
1184
|
-
const r =
|
|
1185
|
-
|
|
1193
|
+
const r = t.recoveryFailures, n = typeof r == "number" && Number.isFinite(r) && r >= 0 ? r : 0;
|
|
1194
|
+
if (n >= 3) {
|
|
1195
|
+
l(
|
|
1196
|
+
"debug",
|
|
1197
|
+
`Discarding persisted events after ${n} failed recovery attempts${this.integrationId ? ` [${this.integrationId}]` : ""}`
|
|
1198
|
+
), this.clearPersistedEvents(), e?.onFailure?.();
|
|
1199
|
+
return;
|
|
1200
|
+
}
|
|
1201
|
+
const i = this.createRecoveryBody(t);
|
|
1202
|
+
await this.send(i) ? (this.clearPersistedEvents(), e?.onSuccess?.(t.events.length, t.events, i)) : (this.persistEventsWithFailureCount(i, n + 1, !0), e?.onFailure?.());
|
|
1186
1203
|
} catch (t) {
|
|
1187
1204
|
if (t instanceof N) {
|
|
1188
1205
|
this.logPermanentError("Permanent error during recovery, clearing persisted events", t), this.clearPersistedEvents(), e?.onFailure?.();
|
|
@@ -1367,40 +1384,53 @@ class ze extends w {
|
|
|
1367
1384
|
return l("debug", `Success mode: simulating successful send${this.integrationId ? ` [${this.integrationId}]` : ""}`, {
|
|
1368
1385
|
data: { events: r.events.length }
|
|
1369
1386
|
}), !0;
|
|
1387
|
+
if (this.consecutiveNetworkFailures >= 3) {
|
|
1388
|
+
const c = Date.now() - this.circuitOpenedAt;
|
|
1389
|
+
if (c < 12e4)
|
|
1390
|
+
return l("debug", `Network circuit open, skipping send${this.integrationId ? ` [${this.integrationId}]` : ""}`, {
|
|
1391
|
+
data: {
|
|
1392
|
+
consecutiveNetworkFailures: this.consecutiveNetworkFailures,
|
|
1393
|
+
cooldownRemainingMs: 12e4 - c
|
|
1394
|
+
}
|
|
1395
|
+
}), !1;
|
|
1396
|
+
}
|
|
1370
1397
|
const { url: n, payload: i } = this.prepareRequest(r);
|
|
1371
|
-
let o = !0;
|
|
1372
|
-
for (let
|
|
1398
|
+
let o = !0, a = !1;
|
|
1399
|
+
for (let c = 1; c <= 3; c++)
|
|
1373
1400
|
try {
|
|
1374
|
-
return (await this.sendWithTimeout(n, i)).ok ? (
|
|
1401
|
+
return (await this.sendWithTimeout(n, i)).ok ? (c > 1 && l(
|
|
1375
1402
|
"info",
|
|
1376
|
-
`Send succeeded after ${
|
|
1403
|
+
`Send succeeded after ${c - 1} retry attempt(s)${this.integrationId ? ` [${this.integrationId}]` : ""}`,
|
|
1377
1404
|
{
|
|
1378
|
-
data: { events: r.events.length, attempt:
|
|
1405
|
+
data: { events: r.events.length, attempt: c }
|
|
1379
1406
|
}
|
|
1380
|
-
), !0) : !1;
|
|
1381
|
-
} catch (
|
|
1382
|
-
const
|
|
1383
|
-
if (
|
|
1384
|
-
throw
|
|
1385
|
-
if (
|
|
1386
|
-
|
|
1387
|
-
`Send attempt ${
|
|
1407
|
+
), this.consecutiveNetworkFailures = 0, this.circuitOpenedAt = 0, !0) : !1;
|
|
1408
|
+
} catch (u) {
|
|
1409
|
+
const g = c === 3;
|
|
1410
|
+
if (u instanceof N)
|
|
1411
|
+
throw this.consecutiveNetworkFailures = 0, this.circuitOpenedAt = 0, u;
|
|
1412
|
+
if (u instanceof O || (o = !1), u instanceof TypeError || (a = !0), l(
|
|
1413
|
+
g ? "error" : "warn",
|
|
1414
|
+
`Send attempt ${c} failed${this.integrationId ? ` [${this.integrationId}]` : ""}${g ? " (all retries exhausted)" : ", will retry"}`,
|
|
1388
1415
|
{
|
|
1389
|
-
error:
|
|
1416
|
+
error: u,
|
|
1390
1417
|
data: {
|
|
1391
1418
|
events: e.events.length,
|
|
1392
1419
|
url: n.replace(/\/\/[^/]+/, "//[DOMAIN]"),
|
|
1393
|
-
attempt:
|
|
1420
|
+
attempt: c,
|
|
1394
1421
|
maxAttempts: 3
|
|
1395
1422
|
}
|
|
1396
1423
|
}
|
|
1397
|
-
), !
|
|
1398
|
-
await this.backoffDelay(
|
|
1424
|
+
), !g) {
|
|
1425
|
+
await this.backoffDelay(c);
|
|
1399
1426
|
continue;
|
|
1400
1427
|
}
|
|
1401
1428
|
if (o)
|
|
1402
1429
|
throw new O("All retry attempts timed out (server likely received the request)");
|
|
1403
|
-
return
|
|
1430
|
+
return a ? (this.consecutiveNetworkFailures = 0, this.circuitOpenedAt = 0) : (this.consecutiveNetworkFailures = Math.min(
|
|
1431
|
+
this.consecutiveNetworkFailures + 1,
|
|
1432
|
+
3
|
|
1433
|
+
), this.consecutiveNetworkFailures >= 3 && (this.circuitOpenedAt = Date.now())), !1;
|
|
1404
1434
|
}
|
|
1405
1435
|
return !1;
|
|
1406
1436
|
}
|
|
@@ -1589,8 +1619,8 @@ class ze extends w {
|
|
|
1589
1619
|
* @private
|
|
1590
1620
|
*/
|
|
1591
1621
|
createRecoveryBody(e) {
|
|
1592
|
-
const { timestamp: t,
|
|
1593
|
-
return
|
|
1622
|
+
const { timestamp: t, recoveryFailures: r, ...n } = e;
|
|
1623
|
+
return n;
|
|
1594
1624
|
}
|
|
1595
1625
|
/**
|
|
1596
1626
|
* Persists failed events to localStorage for next-page-load recovery.
|
|
@@ -1610,26 +1640,44 @@ class ze extends w {
|
|
|
1610
1640
|
* @private
|
|
1611
1641
|
*/
|
|
1612
1642
|
persistEvents(e) {
|
|
1643
|
+
return this.persistEventsWithFailureCount(e, 0);
|
|
1644
|
+
}
|
|
1645
|
+
/**
|
|
1646
|
+
* Persists failed events to localStorage, recording how many consecutive
|
|
1647
|
+
* cross-session recovery attempts have already been made for this batch.
|
|
1648
|
+
*
|
|
1649
|
+
* When `recoveryFailures` reaches MAX_RECOVERY_FAILURES on the next page load,
|
|
1650
|
+
* the batch is discarded rather than retried, preventing an infinite persistence
|
|
1651
|
+
* loop caused by a permanently unreachable backend URL.
|
|
1652
|
+
*
|
|
1653
|
+
* @param body - EventsQueue to persist
|
|
1654
|
+
* @param recoveryFailures - Number of failed recovery attempts already made
|
|
1655
|
+
* @param skipThrottle - Bypass the multi-tab throttle (used during recovery re-persistence)
|
|
1656
|
+
* @returns `true` on successful persistence or throttled write, `false` on error
|
|
1657
|
+
* @private
|
|
1658
|
+
*/
|
|
1659
|
+
persistEventsWithFailureCount(e, t, r = !1) {
|
|
1613
1660
|
try {
|
|
1614
|
-
const
|
|
1615
|
-
if (
|
|
1616
|
-
const
|
|
1617
|
-
if (
|
|
1661
|
+
const n = this.getPersistedData();
|
|
1662
|
+
if (!r && n && n.timestamp) {
|
|
1663
|
+
const a = Date.now() - n.timestamp;
|
|
1664
|
+
if (a < 1e3)
|
|
1618
1665
|
return l(
|
|
1619
1666
|
"debug",
|
|
1620
1667
|
`Skipping persistence, another tab recently persisted events${this.integrationId ? ` [${this.integrationId}]` : ""}`,
|
|
1621
1668
|
{
|
|
1622
|
-
data: { timeSinceExisting:
|
|
1669
|
+
data: { timeSinceExisting: a }
|
|
1623
1670
|
}
|
|
1624
1671
|
), !0;
|
|
1625
1672
|
}
|
|
1626
|
-
const
|
|
1673
|
+
const i = {
|
|
1627
1674
|
...e,
|
|
1628
|
-
timestamp: Date.now()
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1675
|
+
timestamp: Date.now(),
|
|
1676
|
+
...t > 0 && { recoveryFailures: t }
|
|
1677
|
+
}, o = this.getQueueStorageKey();
|
|
1678
|
+
return this.storeManager.setItem(o, JSON.stringify(i)), !!this.storeManager.getItem(o);
|
|
1679
|
+
} catch (n) {
|
|
1680
|
+
return l("debug", `Failed to persist events${this.integrationId ? ` [${this.integrationId}]` : ""}`, { error: n }), !1;
|
|
1633
1681
|
}
|
|
1634
1682
|
}
|
|
1635
1683
|
clearPersistedEvents() {
|
|
@@ -1973,7 +2021,7 @@ class fr extends w {
|
|
|
1973
2021
|
web_vitals: a,
|
|
1974
2022
|
error_data: c,
|
|
1975
2023
|
viewport_data: u,
|
|
1976
|
-
page_view:
|
|
2024
|
+
page_view: g
|
|
1977
2025
|
}) {
|
|
1978
2026
|
if (!e) {
|
|
1979
2027
|
l("error", "Event type is required - event will be ignored");
|
|
@@ -1985,8 +2033,8 @@ class fr extends w {
|
|
|
1985
2033
|
});
|
|
1986
2034
|
return;
|
|
1987
2035
|
}
|
|
1988
|
-
const
|
|
1989
|
-
if (!
|
|
2036
|
+
const E = this.get("sessionId");
|
|
2037
|
+
if (!E) {
|
|
1990
2038
|
this.pendingEventsBuffer.length >= 100 && (this.pendingEventsBuffer.shift(), l("debug", "Pending events buffer full - dropping oldest event", {
|
|
1991
2039
|
data: { maxBufferSize: 100 }
|
|
1992
2040
|
})), this.pendingEventsBuffer.push({
|
|
@@ -1999,35 +2047,35 @@ class fr extends w {
|
|
|
1999
2047
|
web_vitals: a,
|
|
2000
2048
|
error_data: c,
|
|
2001
2049
|
viewport_data: u,
|
|
2002
|
-
page_view:
|
|
2050
|
+
page_view: g
|
|
2003
2051
|
});
|
|
2004
2052
|
return;
|
|
2005
2053
|
}
|
|
2006
|
-
this.lastSessionId !==
|
|
2054
|
+
this.lastSessionId !== E && (this.lastSessionId = E, this.sessionEventCounts = this.loadSessionCounts(E));
|
|
2007
2055
|
const p = e === d.SESSION_START;
|
|
2008
2056
|
if (p && l("debug", "Processing SESSION_START event", {
|
|
2009
|
-
data: { sessionId:
|
|
2057
|
+
data: { sessionId: E }
|
|
2010
2058
|
}), !p && !this.checkRateLimit())
|
|
2011
2059
|
return;
|
|
2012
|
-
const
|
|
2060
|
+
const S = e;
|
|
2013
2061
|
if (!p) {
|
|
2014
2062
|
if (this.sessionEventCounts.total >= 1e3) {
|
|
2015
2063
|
l("warn", "Session event limit reached", {
|
|
2016
2064
|
data: {
|
|
2017
|
-
type:
|
|
2065
|
+
type: S,
|
|
2018
2066
|
total: this.sessionEventCounts.total,
|
|
2019
2067
|
limit: 1e3
|
|
2020
2068
|
}
|
|
2021
2069
|
});
|
|
2022
2070
|
return;
|
|
2023
2071
|
}
|
|
2024
|
-
const T = this.getTypeLimitForEvent(
|
|
2072
|
+
const T = this.getTypeLimitForEvent(S);
|
|
2025
2073
|
if (T) {
|
|
2026
|
-
const le = this.sessionEventCounts[
|
|
2074
|
+
const le = this.sessionEventCounts[S];
|
|
2027
2075
|
if (le !== void 0 && le >= T) {
|
|
2028
2076
|
l("warn", "Session event type limit reached", {
|
|
2029
2077
|
data: {
|
|
2030
|
-
type:
|
|
2078
|
+
type: S,
|
|
2031
2079
|
count: le,
|
|
2032
2080
|
limit: T
|
|
2033
2081
|
}
|
|
@@ -2036,13 +2084,13 @@ class fr extends w {
|
|
|
2036
2084
|
}
|
|
2037
2085
|
}
|
|
2038
2086
|
}
|
|
2039
|
-
if (
|
|
2087
|
+
if (S === d.CUSTOM && o?.name) {
|
|
2040
2088
|
const T = this.get("config")?.maxSameEventPerMinute ?? 60;
|
|
2041
2089
|
if (!this.checkPerEventRateLimit(o.name, T))
|
|
2042
2090
|
return;
|
|
2043
2091
|
}
|
|
2044
|
-
const Ne =
|
|
2045
|
-
type:
|
|
2092
|
+
const Ne = S === d.SESSION_START, K = t || this.get("pageUrl"), F = this.buildEventPayload({
|
|
2093
|
+
type: S,
|
|
2046
2094
|
page_url: K,
|
|
2047
2095
|
from_page_url: r,
|
|
2048
2096
|
scroll_data: n,
|
|
@@ -2051,7 +2099,7 @@ class fr extends w {
|
|
|
2051
2099
|
web_vitals: a,
|
|
2052
2100
|
error_data: c,
|
|
2053
2101
|
viewport_data: u,
|
|
2054
|
-
page_view:
|
|
2102
|
+
page_view: g
|
|
2055
2103
|
});
|
|
2056
2104
|
if (F && !(!p && !this.shouldSample())) {
|
|
2057
2105
|
if (Ne) {
|
|
@@ -2070,7 +2118,7 @@ class fr extends w {
|
|
|
2070
2118
|
}
|
|
2071
2119
|
if (!this.isDuplicateEvent(F)) {
|
|
2072
2120
|
if (this.get("mode") === re.QA) {
|
|
2073
|
-
if (
|
|
2121
|
+
if (S === d.CUSTOM && o) {
|
|
2074
2122
|
l("info", `Custom Event: ${o.name}`, {
|
|
2075
2123
|
visibility: "qa",
|
|
2076
2124
|
data: {
|
|
@@ -2080,7 +2128,7 @@ class fr extends w {
|
|
|
2080
2128
|
}), this.emitEvent(F);
|
|
2081
2129
|
return;
|
|
2082
2130
|
}
|
|
2083
|
-
if (
|
|
2131
|
+
if (S === d.VIEWPORT_VISIBLE && u) {
|
|
2084
2132
|
const T = u.name || u.id || u.selector;
|
|
2085
2133
|
l("info", `Viewport Visible: ${T}`, {
|
|
2086
2134
|
visibility: "qa",
|
|
@@ -2096,7 +2144,7 @@ class fr extends w {
|
|
|
2096
2144
|
}
|
|
2097
2145
|
}
|
|
2098
2146
|
if (this.addToQueue(F), !p) {
|
|
2099
|
-
this.sessionEventCounts.total++, this.sessionEventCounts[
|
|
2147
|
+
this.sessionEventCounts.total++, this.sessionEventCounts[S] !== void 0 && this.sessionEventCounts[S]++;
|
|
2100
2148
|
const T = this.get("sessionId");
|
|
2101
2149
|
T && this.saveSessionCountsDebounced && this.saveSessionCountsDebounced(T);
|
|
2102
2150
|
}
|
|
@@ -2463,9 +2511,9 @@ class fr extends w {
|
|
|
2463
2511
|
...e.page_view && { page_view: e.page_view },
|
|
2464
2512
|
...o && { utm: o }
|
|
2465
2513
|
};
|
|
2466
|
-
const c = this.get("collectApiUrls"), u = !!c?.custom,
|
|
2467
|
-
if (
|
|
2468
|
-
const K = at(a,
|
|
2514
|
+
const c = this.get("collectApiUrls"), u = !!c?.custom, g = !!c?.saas, E = u || g, p = u && g, S = this.transformers.beforeSend;
|
|
2515
|
+
if (S && (!E || u && !p)) {
|
|
2516
|
+
const K = at(a, S, "EventManager");
|
|
2469
2517
|
if (K === null)
|
|
2470
2518
|
return null;
|
|
2471
2519
|
a = K;
|
|
@@ -2495,11 +2543,15 @@ class fr extends w {
|
|
|
2495
2543
|
const r = Math.round((e.click_data.x || 0) / 10) * 10, n = Math.round((e.click_data.y || 0) / 10) * 10;
|
|
2496
2544
|
t += `_click_${r}_${n}`;
|
|
2497
2545
|
}
|
|
2498
|
-
return e.scroll_data && (t += `_scroll_${e.scroll_data.depth}_${e.scroll_data.direction}`), e.custom_event && (t += `_custom_${e.custom_event.name}`), e.web_vitals && (t += `_vitals_${e.web_vitals.type}`), e.error_data && (t += `_error_${e.error_data.type}_${e.error_data.message}`), t;
|
|
2546
|
+
return e.scroll_data && (t += `_scroll_${e.scroll_data.depth}_${e.scroll_data.direction}`), e.custom_event && (t += `_custom_${e.custom_event.name}`, e.custom_event.metadata && (t += `_${this.stableStringify(e.custom_event.metadata)}`)), e.web_vitals && (t += `_vitals_${e.web_vitals.type}`), e.error_data && (t += `_error_${e.error_data.type}_${e.error_data.message}`), t;
|
|
2499
2547
|
}
|
|
2500
2548
|
createEventSignature(e) {
|
|
2501
2549
|
return this.createEventFingerprint(e);
|
|
2502
2550
|
}
|
|
2551
|
+
/** Deterministic JSON string with sorted keys to ensure consistent fingerprints regardless of property insertion order */
|
|
2552
|
+
stableStringify(e) {
|
|
2553
|
+
return JSON.stringify(e, (t, r) => r && typeof r == "object" && !Array.isArray(r) ? Object.keys(r).sort().reduce((n, i) => (n[i] = r[i], n), {}) : r);
|
|
2554
|
+
}
|
|
2503
2555
|
addToQueue(e) {
|
|
2504
2556
|
if (this.emitEvent(e), this.eventsQueue.push(e), this.eventsQueue.length > 100) {
|
|
2505
2557
|
const t = this.eventsQueue.findIndex((n) => n.type !== d.SESSION_START), r = t >= 0 ? this.eventsQueue.splice(t, 1)[0] : this.eventsQueue.shift();
|
|
@@ -3320,14 +3372,14 @@ class Tr extends w {
|
|
|
3320
3372
|
return;
|
|
3321
3373
|
const o = this.findTrackingElement(n), a = this.getRelevantClickElement(n), c = this.calculateClickCoordinates(t, n);
|
|
3322
3374
|
if (o) {
|
|
3323
|
-
const
|
|
3324
|
-
if (
|
|
3325
|
-
const
|
|
3375
|
+
const g = this.extractTrackingData(o);
|
|
3376
|
+
if (g) {
|
|
3377
|
+
const E = this.createCustomEventData(g);
|
|
3326
3378
|
this.eventManager.track({
|
|
3327
3379
|
type: d.CUSTOM,
|
|
3328
3380
|
custom_event: {
|
|
3329
|
-
name:
|
|
3330
|
-
...
|
|
3381
|
+
name: E.name,
|
|
3382
|
+
...E.value && { metadata: { value: E.value } }
|
|
3331
3383
|
}
|
|
3332
3384
|
});
|
|
3333
3385
|
}
|
|
@@ -3665,8 +3717,8 @@ class vr extends w {
|
|
|
3665
3717
|
this.get("suppressNextScroll") || (a.firstScrollEventTime === null && (a.firstScrollEventTime = Date.now()), this.clearContainerTimer(a), a.debounceTimer = window.setTimeout(() => {
|
|
3666
3718
|
const u = this.calculateScrollData(a);
|
|
3667
3719
|
if (u) {
|
|
3668
|
-
const
|
|
3669
|
-
this.processScrollEvent(a, u,
|
|
3720
|
+
const g = Date.now();
|
|
3721
|
+
this.processScrollEvent(a, u, g);
|
|
3670
3722
|
}
|
|
3671
3723
|
a.debounceTimer = null;
|
|
3672
3724
|
}, 250));
|
|
@@ -3726,14 +3778,14 @@ class vr extends w {
|
|
|
3726
3778
|
const { element: t, lastScrollPos: r, lastEventTime: n } = e, i = this.getScrollTop(t), o = Date.now(), a = Math.abs(i - r);
|
|
3727
3779
|
if (a < 10 || t === window && !this.isWindowScrollable())
|
|
3728
3780
|
return null;
|
|
3729
|
-
const c = this.getViewportHeight(t), u = this.getScrollHeight(t),
|
|
3781
|
+
const c = this.getViewportHeight(t), u = this.getScrollHeight(t), g = this.getScrollDirection(i, r), E = this.calculateScrollDepth(i, u, c);
|
|
3730
3782
|
let p;
|
|
3731
3783
|
n > 0 ? p = o - n : e.firstScrollEventTime !== null ? p = o - e.firstScrollEventTime : p = 250;
|
|
3732
|
-
const
|
|
3733
|
-
return
|
|
3734
|
-
depth:
|
|
3735
|
-
direction:
|
|
3736
|
-
velocity:
|
|
3784
|
+
const S = Math.round(a / p * 1e3);
|
|
3785
|
+
return E > e.maxDepthReached && (e.maxDepthReached = E), e.lastScrollPos = i, {
|
|
3786
|
+
depth: E,
|
|
3787
|
+
direction: g,
|
|
3788
|
+
velocity: S,
|
|
3737
3789
|
max_depth_reached: e.maxDepthReached
|
|
3738
3790
|
};
|
|
3739
3791
|
}
|
|
@@ -4808,7 +4860,7 @@ class br extends w {
|
|
|
4808
4860
|
}
|
|
4809
4861
|
const V = [], M = [];
|
|
4810
4862
|
let D = null, h = null, R = !1, v = !1, P = null;
|
|
4811
|
-
const
|
|
4863
|
+
const Ar = async (s) => typeof window > "u" || typeof document > "u" ? { sessionId: "" } : (v = !1, window.__traceLogDisabled === !0 ? { sessionId: "" } : h ? { sessionId: h.getSessionId() ?? "" } : (R && P || (R = !0, P = (async () => {
|
|
4812
4864
|
try {
|
|
4813
4865
|
const e = ir(s ?? {}), t = new br();
|
|
4814
4866
|
try {
|
|
@@ -4836,7 +4888,7 @@ const Lr = async (s) => typeof window > "u" || typeof document > "u" ? { session
|
|
|
4836
4888
|
} finally {
|
|
4837
4889
|
R = !1, P = null;
|
|
4838
4890
|
}
|
|
4839
|
-
})()), P)),
|
|
4891
|
+
})()), P)), Lr = (s, e) => {
|
|
4840
4892
|
if (!(typeof window > "u" || typeof document > "u")) {
|
|
4841
4893
|
if (!h)
|
|
4842
4894
|
throw new Error("[TraceLog] TraceLog not initialized. Please call init() first.");
|
|
@@ -4943,8 +4995,8 @@ const Nr = (s) => {
|
|
|
4943
4995
|
h.mergeGlobalMetadata(s);
|
|
4944
4996
|
}
|
|
4945
4997
|
}, ms = {
|
|
4946
|
-
init:
|
|
4947
|
-
event:
|
|
4998
|
+
init: Ar,
|
|
4999
|
+
event: Lr,
|
|
4948
5000
|
on: Mr,
|
|
4949
5001
|
off: Cr,
|
|
4950
5002
|
setTransformer: Rr,
|
|
@@ -5043,8 +5095,8 @@ var _e, C, X, ct, ne, ut = -1, k = function(s) {
|
|
|
5043
5095
|
var t, r = _("CLS", 0), n = 0, i = [], o = function(c) {
|
|
5044
5096
|
c.forEach((function(u) {
|
|
5045
5097
|
if (!u.hadRecentInput) {
|
|
5046
|
-
var
|
|
5047
|
-
n && u.startTime -
|
|
5098
|
+
var g = i[0], E = i[i.length - 1];
|
|
5099
|
+
n && u.startTime - E.startTime < 1e3 && u.startTime - g.startTime < 5e3 ? (n += u.value, i.push(u)) : (n = u.value, i = [u]);
|
|
5048
5100
|
}
|
|
5049
5101
|
})), n > r.value && (r.value = n, r.entries = i, t());
|
|
5050
5102
|
}, a = x("layout-shift", o);
|
|
@@ -5064,23 +5116,23 @@ var _e, C, X, ct, ne, ut = -1, k = function(s) {
|
|
|
5064
5116
|
return _e ? ht : performance.interactionCount || 0;
|
|
5065
5117
|
}, Wr = function() {
|
|
5066
5118
|
"interactionCount" in performance || _e || (_e = x("event", Br, { type: "event", buffered: !0, durationThreshold: 0 }));
|
|
5067
|
-
},
|
|
5068
|
-
var s = Math.min(
|
|
5069
|
-
return
|
|
5119
|
+
}, A = [], te = /* @__PURE__ */ new Map(), mt = 0, Gr = function() {
|
|
5120
|
+
var s = Math.min(A.length - 1, Math.floor((ft() - mt) / 50));
|
|
5121
|
+
return A[s];
|
|
5070
5122
|
}, Xr = [], Qr = function(s) {
|
|
5071
5123
|
if (Xr.forEach((function(n) {
|
|
5072
5124
|
return n(s);
|
|
5073
5125
|
})), s.interactionId || s.entryType === "first-input") {
|
|
5074
|
-
var e =
|
|
5075
|
-
if (t ||
|
|
5126
|
+
var e = A[A.length - 1], t = te.get(s.interactionId);
|
|
5127
|
+
if (t || A.length < 10 || s.duration > e.latency) {
|
|
5076
5128
|
if (t) s.duration > t.latency ? (t.entries = [s], t.latency = s.duration) : s.duration === t.latency && s.startTime === t.entries[0].startTime && t.entries.push(s);
|
|
5077
5129
|
else {
|
|
5078
5130
|
var r = { id: s.interactionId, latency: s.duration, entries: [s] };
|
|
5079
|
-
te.set(r.id, r),
|
|
5131
|
+
te.set(r.id, r), A.push(r);
|
|
5080
5132
|
}
|
|
5081
|
-
|
|
5133
|
+
A.sort((function(n, i) {
|
|
5082
5134
|
return i.latency - n.latency;
|
|
5083
|
-
})),
|
|
5135
|
+
})), A.length > 10 && A.splice(10).forEach((function(n) {
|
|
5084
5136
|
return te.delete(n.id);
|
|
5085
5137
|
}));
|
|
5086
5138
|
}
|
|
@@ -5102,7 +5154,7 @@ var _e, C, X, ct, ne, ut = -1, k = function(s) {
|
|
|
5102
5154
|
r = I(s, n, ye, e.reportAllChanges), o && (o.observe({ type: "first-input", buffered: !0 }), j((function() {
|
|
5103
5155
|
i(o.takeRecords()), r(!0);
|
|
5104
5156
|
})), k((function() {
|
|
5105
|
-
mt = ft(),
|
|
5157
|
+
mt = ft(), A.length = 0, te.clear(), n = _("INP"), r = I(s, n, ye, e.reportAllChanges);
|
|
5106
5158
|
})));
|
|
5107
5159
|
})));
|
|
5108
5160
|
}, be = [2500, 4e3], fe = {}, zr = function(s, e) {
|
|
@@ -5128,7 +5180,7 @@ var _e, C, X, ct, ne, ut = -1, k = function(s) {
|
|
|
5128
5180
|
}));
|
|
5129
5181
|
}
|
|
5130
5182
|
}));
|
|
5131
|
-
},
|
|
5183
|
+
}, Ae = [800, 1800], Kr = function s(e) {
|
|
5132
5184
|
document.prerendering ? z((function() {
|
|
5133
5185
|
return s(e);
|
|
5134
5186
|
})) : document.readyState !== "complete" ? addEventListener("load", (function() {
|
|
@@ -5136,11 +5188,11 @@ var _e, C, X, ct, ne, ut = -1, k = function(s) {
|
|
|
5136
5188
|
}), !0) : setTimeout(e, 0);
|
|
5137
5189
|
}, Yr = function(s, e) {
|
|
5138
5190
|
e = e || {};
|
|
5139
|
-
var t = _("TTFB"), r = I(s, t,
|
|
5191
|
+
var t = _("TTFB"), r = I(s, t, Ae, e.reportAllChanges);
|
|
5140
5192
|
Kr((function() {
|
|
5141
5193
|
var n = Me();
|
|
5142
5194
|
n && (t.value = Math.max(n.responseStart - oe(), 0), t.entries = [n], r(!0), k((function() {
|
|
5143
|
-
t = _("TTFB", 0), (r = I(s, t,
|
|
5195
|
+
t = _("TTFB", 0), (r = I(s, t, Ae, e.reportAllChanges))(!0);
|
|
5144
5196
|
})));
|
|
5145
5197
|
}));
|
|
5146
5198
|
}, W = { passive: !0, capture: !0 }, qr = /* @__PURE__ */ new Date(), qe = function(s, e) {
|
|
@@ -5170,18 +5222,18 @@ var _e, C, X, ct, ne, ut = -1, k = function(s) {
|
|
|
5170
5222
|
["mousedown", "keydown", "touchstart", "pointerdown"].forEach((function(e) {
|
|
5171
5223
|
return s(e, Jr, W);
|
|
5172
5224
|
}));
|
|
5173
|
-
},
|
|
5225
|
+
}, Le = [100, 300], Zr = function(s, e) {
|
|
5174
5226
|
e = e || {}, z((function() {
|
|
5175
5227
|
var t, r = Re(), n = _("FID"), i = function(c) {
|
|
5176
5228
|
c.startTime < r.firstHiddenTime && (n.value = c.processingStart - c.startTime, n.entries.push(c), t(!0));
|
|
5177
5229
|
}, o = function(c) {
|
|
5178
5230
|
c.forEach(i);
|
|
5179
5231
|
}, a = x("first-input", o);
|
|
5180
|
-
t = I(s, n,
|
|
5232
|
+
t = I(s, n, Le, e.reportAllChanges), a && (j(ae((function() {
|
|
5181
5233
|
o(a.takeRecords()), a.disconnect();
|
|
5182
5234
|
}))), k((function() {
|
|
5183
5235
|
var c;
|
|
5184
|
-
n = _("FID"), t = I(s, n,
|
|
5236
|
+
n = _("FID"), t = I(s, n, Le, e.reportAllChanges), ne = [], X = -1, C = null, St(addEventListener), c = i, ne.push(c), Et();
|
|
5185
5237
|
})));
|
|
5186
5238
|
}));
|
|
5187
5239
|
};
|
|
@@ -5189,10 +5241,10 @@ const es = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
5189
5241
|
__proto__: null,
|
|
5190
5242
|
CLSThresholds: we,
|
|
5191
5243
|
FCPThresholds: Ie,
|
|
5192
|
-
FIDThresholds:
|
|
5244
|
+
FIDThresholds: Le,
|
|
5193
5245
|
INPThresholds: ye,
|
|
5194
5246
|
LCPThresholds: be,
|
|
5195
|
-
TTFBThresholds:
|
|
5247
|
+
TTFBThresholds: Ae,
|
|
5196
5248
|
onCLS: $r,
|
|
5197
5249
|
onFCP: dt,
|
|
5198
5250
|
onFID: Zr,
|
|
@@ -5204,7 +5256,7 @@ export {
|
|
|
5204
5256
|
f as AppConfigValidationError,
|
|
5205
5257
|
ts as DEFAULT_SESSION_TIMEOUT,
|
|
5206
5258
|
Se as DEFAULT_WEB_VITALS_MODE,
|
|
5207
|
-
|
|
5259
|
+
L as DeviceType,
|
|
5208
5260
|
me as EmitterEvent,
|
|
5209
5261
|
B as ErrorType,
|
|
5210
5262
|
d as EventType,
|