@tracelog/lib 2.2.1 → 2.3.0-rc.83.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.
@@ -1,6 +1,6 @@
1
- const Hr = 9e5;
2
- const Fr = 120, $r = 8192, Br = 10, Wr = 10, Gr = 20;
3
- const Xr = 1e3, Qr = 500, jr = 100;
1
+ const Fr = 9e5;
2
+ const $r = 120, Br = 8192, Wr = 10, Gr = 10, Xr = 20;
3
+ const Qr = 1e3, jr = 500, zr = 100;
4
4
  const w = "data-tlog", at = [
5
5
  "button",
6
6
  "a",
@@ -78,15 +78,15 @@ const m = {
78
78
  /<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,
79
79
  /<embed\b[^>]*>/gi,
80
80
  /<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi
81
- ], I = "tlog", H = `${I}:qa_mode`, ye = `${I}:uid`, We = "tlog_mode", be = "qa", Le = "qa_off", dt = (s) => s ? `${I}:${s}:queue` : `${I}:queue`, ht = (s) => s ? `${I}:${s}:session` : `${I}:session`, ft = (s) => s ? `${I}:${s}:broadcast` : `${I}:broadcast`, Ae = (s, e) => `${I}:${s}:session_counts:${e}`, Me = 10080 * 60 * 1e3, Ce = `${I}:session_counts_last_cleanup`, Re = 3600 * 1e3;
81
+ ], _ = "tlog", x = `${_}:qa_mode`, ye = `${_}:uid`, We = "tlog_mode", be = "qa", Le = "qa_off", dt = (s) => s ? `${_}:${s}:queue` : `${_}:queue`, ht = (s) => s ? `${_}:${s}:session` : `${_}:session`, ft = (s) => s ? `${_}:${s}:broadcast` : `${_}:broadcast`, Ae = (s, e) => `${_}:${s}:session_counts:${e}`, Me = 10080 * 60 * 1e3, Ce = `${_}:session_counts_last_cleanup`, Re = 3600 * 1e3;
82
82
  var U = /* @__PURE__ */ ((s) => (s.Localhost = "localhost:8080", s.Fail = "localhost:9999", s))(U || {}), A = /* @__PURE__ */ ((s) => (s.Mobile = "mobile", s.Tablet = "tablet", s.Desktop = "desktop", s.Unknown = "unknown", s))(A || {}), ae = /* @__PURE__ */ ((s) => (s.EVENT = "event", s.QUEUE = "queue", s))(ae || {});
83
83
  class O extends Error {
84
84
  constructor(e, t) {
85
85
  super(e), this.statusCode = t, this.name = "PermanentError", Error.captureStackTrace && Error.captureStackTrace(this, O);
86
86
  }
87
87
  }
88
- var d = /* @__PURE__ */ ((s) => (s.PAGE_VIEW = "page_view", s.CLICK = "click", s.SCROLL = "scroll", s.SESSION_START = "session_start", s.CUSTOM = "custom", s.WEB_VITALS = "web_vitals", s.ERROR = "error", s.VIEWPORT_VISIBLE = "viewport_visible", s))(d || {}), Q = /* @__PURE__ */ ((s) => (s.UP = "up", s.DOWN = "down", s))(Q || {}), x = /* @__PURE__ */ ((s) => (s.JS_ERROR = "js_error", s.PROMISE_REJECTION = "promise_rejection", s))(x || {}), K = /* @__PURE__ */ ((s) => (s.QA = "qa", s))(K || {});
89
- const zr = (s) => s.type === d.SCROLL && "scroll_data" in s && s.scroll_data.is_primary === !0, Kr = (s) => s.type === d.SCROLL && "scroll_data" in s && s.scroll_data.is_primary === !1;
88
+ var d = /* @__PURE__ */ ((s) => (s.PAGE_VIEW = "page_view", s.CLICK = "click", s.SCROLL = "scroll", s.SESSION_START = "session_start", s.CUSTOM = "custom", s.WEB_VITALS = "web_vitals", s.ERROR = "error", s.VIEWPORT_VISIBLE = "viewport_visible", s))(d || {}), Q = /* @__PURE__ */ ((s) => (s.UP = "up", s.DOWN = "down", s))(Q || {}), H = /* @__PURE__ */ ((s) => (s.JS_ERROR = "js_error", s.PROMISE_REJECTION = "promise_rejection", s))(H || {}), K = /* @__PURE__ */ ((s) => (s.QA = "qa", s))(K || {});
89
+ const Kr = (s) => s.type === d.SCROLL && "scroll_data" in s && s.scroll_data.is_primary === !0, Yr = (s) => s.type === d.SCROLL && "scroll_data" in s && s.scroll_data.is_primary === !1;
90
90
  class F extends Error {
91
91
  constructor(e, t, r) {
92
92
  super(e), this.errorCode = t, this.layer = r, this.name = this.constructor.name, Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);
@@ -112,7 +112,7 @@ class V extends F {
112
112
  super(e, "INTEGRATION_INVALID", t);
113
113
  }
114
114
  }
115
- class Yr extends F {
115
+ class qr extends F {
116
116
  constructor(e, t, r = "runtime") {
117
117
  super(e, "INITIALIZATION_TIMEOUT", r), this.timeoutMs = t;
118
118
  }
@@ -140,7 +140,7 @@ const Ge = "background: #ff9800; color: white; font-weight: bold; padding: 2px 8
140
140
  if (typeof window > "u" || typeof sessionStorage > "u")
141
141
  return !1;
142
142
  try {
143
- return sessionStorage.getItem(H) === "true";
143
+ return sessionStorage.getItem(x) === "true";
144
144
  } catch {
145
145
  return !1;
146
146
  }
@@ -168,9 +168,9 @@ const Ge = "background: #ff9800; color: white; font-weight: bold; padding: 2px 8
168
168
  return e;
169
169
  };
170
170
  let ce, Qe;
171
- const _t = () => {
171
+ const It = () => {
172
172
  typeof window < "u" && !ce && (ce = window.matchMedia("(pointer: coarse)"), Qe = window.matchMedia("(hover: none)"));
173
- }, Y = "Unknown", It = (s) => {
173
+ }, Y = "Unknown", _t = (s) => {
174
174
  const e = s.userAgentData?.platform;
175
175
  if (e != null && e !== "") {
176
176
  if (/windows/i.test(e)) return "Windows";
@@ -200,7 +200,7 @@ const _t = () => {
200
200
  const c = s.userAgentData.platform;
201
201
  return c != null && c !== "" && /ipad|tablet/i.test(c) ? A.Tablet : s.userAgentData.mobile ? A.Mobile : A.Desktop;
202
202
  }
203
- _t();
203
+ It();
204
204
  const e = window.innerWidth, t = ce?.matches ?? !1, r = Qe?.matches ?? !1, n = "ontouchstart" in window || navigator.maxTouchPoints > 0, i = navigator.userAgent.toLowerCase(), o = /mobile|android|iphone|ipod|blackberry|iemobile|opera mini/.test(i), l = /tablet|ipad|android(?!.*mobile)/.test(i);
205
205
  return e <= 767 || o && n ? A.Mobile : e >= 768 && e <= 1024 || l || t && r && n ? A.Tablet : A.Desktop;
206
206
  } catch (s) {
@@ -211,7 +211,7 @@ const _t = () => {
211
211
  const s = navigator;
212
212
  return {
213
213
  type: yt(),
214
- os: It(s),
214
+ os: _t(s),
215
215
  browser: wt(s)
216
216
  };
217
217
  } catch (s) {
@@ -236,7 +236,7 @@ const _t = () => {
236
236
  /Bearer\s+[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)?(?:\.[A-Za-z0-9_-]+)?/gi,
237
237
  // Passwords in connection strings (protocol://user:password@host)
238
238
  /:\/\/[^:/]+:([^@]+)@/gi
239
- ], Oe = 500, Pe = 5e3, j = 50, Lt = j * 2, ze = 1, At = 1e3, Mt = 10, De = 5e3, Ct = 6e4, qr = {
239
+ ], Oe = 500, Pe = 5e3, j = 50, Lt = j * 2, ze = 1, At = 1e3, Mt = 10, De = 5e3, Ct = 6e4, Jr = {
240
240
  LCP: 2500,
241
241
  // Good: ≤ 2.5s
242
242
  FCP: 1800,
@@ -284,7 +284,7 @@ const _t = () => {
284
284
  default:
285
285
  return ke;
286
286
  }
287
- }, Nt = 1e3, Ot = 50, Pt = "2.2.0", Dt = Pt, Ke = () => typeof window < "u" && typeof sessionStorage < "u", kt = () => {
287
+ }, Nt = 1e3, Ot = 50, Pt = "2.3.0", Dt = Pt, Ke = () => typeof window < "u" && typeof sessionStorage < "u", kt = () => {
288
288
  try {
289
289
  const s = new URLSearchParams(window.location.search);
290
290
  s.delete(We);
@@ -296,12 +296,12 @@ const _t = () => {
296
296
  if (!Ke())
297
297
  return !1;
298
298
  try {
299
- const e = new URLSearchParams(window.location.search).get(We), t = sessionStorage.getItem(H);
299
+ const e = new URLSearchParams(window.location.search).get(We), t = sessionStorage.getItem(x);
300
300
  let r = null;
301
- return e === be ? (r = !0, sessionStorage.setItem(H, "true"), a("info", "QA Mode ACTIVE", {
301
+ return e === be ? (r = !0, sessionStorage.setItem(x, "true"), a("info", "QA Mode ACTIVE", {
302
302
  visibility: "qa",
303
303
  style: Ge
304
- })) : e === Le && (r = !1, sessionStorage.setItem(H, "false"), a("info", "QA Mode DISABLED", {
304
+ })) : e === Le && (r = !1, sessionStorage.setItem(x, "false"), a("info", "QA Mode DISABLED", {
305
305
  visibility: "qa",
306
306
  style: Xe
307
307
  })), (e === be || e === Le) && kt(), r ?? t === "true";
@@ -311,14 +311,14 @@ const _t = () => {
311
311
  }, Ut = (s) => {
312
312
  if (Ke())
313
313
  try {
314
- sessionStorage.setItem(H, s ? "true" : "false"), a("info", s ? "QA Mode ACTIVE" : "QA Mode DISABLED", {
314
+ sessionStorage.setItem(x, s ? "true" : "false"), a("info", s ? "QA Mode ACTIVE" : "QA Mode DISABLED", {
315
315
  visibility: "qa",
316
316
  style: s ? Ge : Xe
317
317
  });
318
318
  } catch {
319
319
  a("debug", "Cannot set QA mode: sessionStorage unavailable");
320
320
  }
321
- }, xt = [
321
+ }, Ht = [
322
322
  "co.uk",
323
323
  "org.uk",
324
324
  "com.au",
@@ -335,14 +335,14 @@ const _t = () => {
335
335
  if (e.length <= 2)
336
336
  return s.toLowerCase();
337
337
  const t = e.slice(-2).join(".");
338
- return xt.includes(t) ? e.slice(-3).join(".") : e.slice(-2).join(".");
339
- }, Ht = (s, e) => s === e ? !0 : Ue(s) === Ue(e), re = () => {
338
+ return Ht.includes(t) ? e.slice(-3).join(".") : e.slice(-2).join(".");
339
+ }, xt = (s, e) => s === e ? !0 : Ue(s) === Ue(e), re = () => {
340
340
  const s = document.referrer;
341
341
  if (!s)
342
342
  return "Direct";
343
343
  try {
344
344
  const e = new URL(s).hostname.toLowerCase(), t = window.location.hostname.toLowerCase();
345
- return Ht(e, t) ? "Direct" : s;
345
+ return xt(e, t) ? "Direct" : s;
346
346
  } catch (e) {
347
347
  return a("debug", "Failed to parse referrer URL, using raw value", { error: e, data: { referrer: s } }), s;
348
348
  }
@@ -428,7 +428,7 @@ const $t = () => {
428
428
  } catch (t) {
429
429
  return a("warn", "URL normalization failed, returning original", { error: t, data: { urlLength: s?.length } }), s;
430
430
  }
431
- }, xe = (s) => {
431
+ }, He = (s) => {
432
432
  if (!s || typeof s != "string" || s.trim().length === 0)
433
433
  return "";
434
434
  let e = s;
@@ -443,12 +443,12 @@ const $t = () => {
443
443
  patternMatches: t,
444
444
  valueLength: s.length
445
445
  }
446
- }), e = e.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#x27;").replaceAll("/", "&#x2F;"), e.trim();
446
+ }), e.trim();
447
447
  }, he = (s, e = 0) => {
448
448
  if (s == null)
449
449
  return null;
450
450
  if (typeof s == "string")
451
- return xe(s);
451
+ return He(s);
452
452
  if (typeof s == "number")
453
453
  return !Number.isFinite(s) || s < -Number.MAX_SAFE_INTEGER || s > Number.MAX_SAFE_INTEGER ? 0 : s;
454
454
  if (typeof s == "boolean")
@@ -460,7 +460,7 @@ const $t = () => {
460
460
  if (typeof s == "object") {
461
461
  const t = {}, n = Object.entries(s).slice(0, 20);
462
462
  for (const [i, o] of n) {
463
- const l = xe(i);
463
+ const l = He(i);
464
464
  if (l) {
465
465
  const c = he(o, e + 1);
466
466
  c !== null && (t[l] = c);
@@ -640,7 +640,7 @@ const $t = () => {
640
640
  } : ["constructor", "prototype", "__proto__", "eval", "function", "var", "let", "const"].includes(s.toLowerCase()) ? {
641
641
  valid: !1,
642
642
  error: "Event name cannot be a reserved word"
643
- } : { valid: !0 }, He = (s, e, t) => {
643
+ } : { valid: !0 }, xe = (s, e, t) => {
644
644
  const r = Gt(e), n = t && t === "customEvent" ? `${t} "${s}" metadata error` : `${s} metadata error`;
645
645
  if (!Kt(r))
646
646
  return {
@@ -700,7 +700,7 @@ const $t = () => {
700
700
  valid: !1,
701
701
  error: `${n}: array item at index ${i} must be an object.`
702
702
  };
703
- const l = He(s, o, t);
703
+ const l = xe(s, o, t);
704
704
  if (!l.valid)
705
705
  return {
706
706
  valid: !1,
@@ -713,7 +713,7 @@ const $t = () => {
713
713
  sanitizedMetadata: r
714
714
  };
715
715
  }
716
- return He(s, e, t);
716
+ return xe(s, e, t);
717
717
  }, qt = (s, e) => {
718
718
  const t = Yt(s);
719
719
  if (!t.valid)
@@ -878,7 +878,7 @@ function Ze(s, e, t) {
878
878
  }
879
879
  }
880
880
  const ne = {};
881
- class _ {
881
+ class I {
882
882
  /**
883
883
  * Retrieves a value from global state.
884
884
  *
@@ -936,7 +936,7 @@ class _ {
936
936
  return { ...ne };
937
937
  }
938
938
  }
939
- class Fe extends _ {
939
+ class Fe extends I {
940
940
  storeManager;
941
941
  integrationId;
942
942
  apiUrl;
@@ -1622,7 +1622,7 @@ class Fe extends _ {
1622
1622
  }), this.lastPermanentErrorLog = { statusCode: t.statusCode, timestamp: r });
1623
1623
  }
1624
1624
  }
1625
- class er extends _ {
1625
+ class er extends I {
1626
1626
  bootTime;
1627
1627
  bootTimestamp;
1628
1628
  hasPerformanceNow;
@@ -1771,7 +1771,7 @@ class er extends _ {
1771
1771
  };
1772
1772
  }
1773
1773
  }
1774
- class tr extends _ {
1774
+ class tr extends I {
1775
1775
  dataSenders;
1776
1776
  emitter;
1777
1777
  transformers;
@@ -1781,6 +1781,7 @@ class tr extends _ {
1781
1781
  eventsQueue = [];
1782
1782
  pendingEventsBuffer = [];
1783
1783
  sendIntervalId = null;
1784
+ sendInProgress = !1;
1784
1785
  rateLimitCounter = 0;
1785
1786
  rateLimitWindowStart = 0;
1786
1787
  lastSessionId = null;
@@ -2338,32 +2339,37 @@ class tr extends _ {
2338
2339
  }
2339
2340
  }
2340
2341
  async sendEventsQueue() {
2341
- if (!this.get("sessionId") || this.eventsQueue.length === 0)
2342
- return;
2343
- const e = this.buildEventsPayload();
2344
- if (this.dataSenders.length === 0) {
2345
- this.emitEventsQueue(e);
2346
- return;
2347
- }
2348
- const t = [...this.eventsQueue], r = t.map((l) => l.id), n = this.dataSenders.map(
2349
- async (l) => l.sendEventsQueue(e, {
2350
- onSuccess: () => {
2351
- },
2352
- onFailure: () => {
2342
+ if (!(!this.get("sessionId") || this.eventsQueue.length === 0 || this.sendInProgress)) {
2343
+ this.sendInProgress = !0;
2344
+ try {
2345
+ const e = this.buildEventsPayload();
2346
+ if (this.dataSenders.length === 0) {
2347
+ this.emitEventsQueue(e);
2348
+ return;
2353
2349
  }
2354
- })
2355
- ), i = await Promise.allSettled(n);
2356
- if (i.some((l) => this.isSuccessfulResult(l))) {
2357
- this.removeProcessedEvents(r), this.emitEventsQueue(e);
2358
- const l = i.filter((c) => !this.isSuccessfulResult(c)).length;
2359
- l > 0 && a("debug", "Periodic send completed with some failures, removed from queue and persisted per-integration", {
2360
- data: { eventCount: t.length, failedCount: l }
2361
- });
2362
- } else
2363
- a("debug", "Periodic send complete failure, events kept in queue for retry", {
2364
- data: { eventCount: t.length }
2365
- });
2366
- this.eventsQueue.length === 0 && this.clearSendInterval();
2350
+ const t = [...this.eventsQueue], r = t.map((l) => l.id), n = this.dataSenders.map(
2351
+ async (l) => l.sendEventsQueue(e, {
2352
+ onSuccess: () => {
2353
+ },
2354
+ onFailure: () => {
2355
+ }
2356
+ })
2357
+ ), i = await Promise.allSettled(n);
2358
+ if (i.some((l) => this.isSuccessfulResult(l))) {
2359
+ this.removeProcessedEvents(r), this.emitEventsQueue(e);
2360
+ const l = i.filter((c) => !this.isSuccessfulResult(c)).length;
2361
+ l > 0 && a("debug", "Periodic send completed with some failures, removed from queue and persisted per-integration", {
2362
+ data: { eventCount: t.length, failedCount: l }
2363
+ });
2364
+ } else
2365
+ a("debug", "Periodic send complete failure, events kept in queue for retry", {
2366
+ data: { eventCount: t.length }
2367
+ });
2368
+ this.eventsQueue.length === 0 && this.clearSendInterval();
2369
+ } finally {
2370
+ this.sendInProgress = !1;
2371
+ }
2372
+ }
2367
2373
  }
2368
2374
  buildEventsPayload() {
2369
2375
  const e = /* @__PURE__ */ new Map(), t = [];
@@ -2636,7 +2642,7 @@ class tr extends _ {
2636
2642
  return;
2637
2643
  }
2638
2644
  }
2639
- const t = this.get("userId") || "anonymous", r = `${I}:${t}:session_counts:`, n = [];
2645
+ const t = this.get("userId") || "anonymous", r = `${_}:${t}:session_counts:`, n = [];
2640
2646
  for (let i = 0; i < localStorage.length; i++) {
2641
2647
  const o = localStorage.key(i);
2642
2648
  if (o?.startsWith(r))
@@ -2727,7 +2733,7 @@ class rr {
2727
2733
  }
2728
2734
  }
2729
2735
  const sr = /^\d{13}-[a-z0-9]{9}$/;
2730
- class nr extends _ {
2736
+ class nr extends I {
2731
2737
  storageManager;
2732
2738
  eventManager;
2733
2739
  projectId;
@@ -3047,7 +3053,7 @@ class nr extends _ {
3047
3053
  this.clearSessionTimeout(), this.cleanupActivityListeners(), this.cleanupCrossTabSync(), this.cleanupLifecycleListeners(), this.isTracking = !1, this.needsRenewal = !1, this.set("hasStartSession", !1);
3048
3054
  }
3049
3055
  }
3050
- class ir extends _ {
3056
+ class ir extends I {
3051
3057
  eventManager;
3052
3058
  storageManager;
3053
3059
  sessionManager = null;
@@ -3135,7 +3141,7 @@ class ir extends _ {
3135
3141
  this.destroyed || (this.sessionManager && (this.sessionManager.destroy(), this.sessionManager = null), this.destroyed = !0);
3136
3142
  }
3137
3143
  }
3138
- class or extends _ {
3144
+ class or extends I {
3139
3145
  eventManager;
3140
3146
  onTrack;
3141
3147
  originalPushState;
@@ -3211,7 +3217,7 @@ class or extends _ {
3211
3217
  };
3212
3218
  }
3213
3219
  }
3214
- class ar extends _ {
3220
+ class ar extends I {
3215
3221
  eventManager;
3216
3222
  lastClickTimes = /* @__PURE__ */ new Map();
3217
3223
  clickHandler;
@@ -3468,7 +3474,7 @@ class ar extends _ {
3468
3474
  };
3469
3475
  }
3470
3476
  }
3471
- class lr extends _ {
3477
+ class lr extends I {
3472
3478
  eventManager;
3473
3479
  containers = [];
3474
3480
  limitWarningLogged = !1;
@@ -3696,7 +3702,7 @@ class lr extends _ {
3696
3702
  e.isPrimary = t;
3697
3703
  }
3698
3704
  }
3699
- class cr extends _ {
3705
+ class cr extends I {
3700
3706
  eventManager;
3701
3707
  trackedElements = /* @__PURE__ */ new Map();
3702
3708
  observer = null;
@@ -4140,7 +4146,7 @@ class ur {
4140
4146
  this.fallbackSessionStorage.delete(e);
4141
4147
  }
4142
4148
  }
4143
- class dr extends _ {
4149
+ class dr extends I {
4144
4150
  eventManager;
4145
4151
  reportedByNav = /* @__PURE__ */ new Map();
4146
4152
  navigationHistory = [];
@@ -4373,7 +4379,7 @@ class dr extends _ {
4373
4379
  return !(typeof r == "number" && t <= r);
4374
4380
  }
4375
4381
  }
4376
- class hr extends _ {
4382
+ class hr extends I {
4377
4383
  eventManager;
4378
4384
  recentErrors = /* @__PURE__ */ new Map();
4379
4385
  errorBurstCounter = 0;
@@ -4423,10 +4429,10 @@ class hr extends _ {
4423
4429
  if (!this.shouldSample())
4424
4430
  return;
4425
4431
  const t = this.sanitize(e.message || "Unknown error");
4426
- this.shouldSuppressError(x.JS_ERROR, t) || this.eventManager.track({
4432
+ this.shouldSuppressError(H.JS_ERROR, t) || this.eventManager.track({
4427
4433
  type: d.ERROR,
4428
4434
  error_data: {
4429
- type: x.JS_ERROR,
4435
+ type: H.JS_ERROR,
4430
4436
  message: t,
4431
4437
  ...e.filename && { filename: e.filename },
4432
4438
  ...e.lineno && { line: e.lineno },
@@ -4438,10 +4444,10 @@ class hr extends _ {
4438
4444
  if (!this.shouldSample())
4439
4445
  return;
4440
4446
  const t = this.extractRejectionMessage(e.reason), r = this.sanitize(t);
4441
- this.shouldSuppressError(x.PROMISE_REJECTION, r) || this.eventManager.track({
4447
+ this.shouldSuppressError(H.PROMISE_REJECTION, r) || this.eventManager.track({
4442
4448
  type: d.ERROR,
4443
4449
  error_data: {
4444
- type: x.PROMISE_REJECTION,
4450
+ type: H.PROMISE_REJECTION,
4445
4451
  message: r
4446
4452
  }
4447
4453
  });
@@ -4484,7 +4490,7 @@ class hr extends _ {
4484
4490
  }
4485
4491
  }
4486
4492
  }
4487
- class fr extends _ {
4493
+ class fr extends I {
4488
4494
  isInitialized = !1;
4489
4495
  suppressNextScrollTimer = null;
4490
4496
  emitter = new Jt();
@@ -4503,25 +4509,25 @@ class fr extends _ {
4503
4509
  * @internal Called from api.init()
4504
4510
  */
4505
4511
  async init(e = {}) {
4506
- if (!this.isInitialized) {
4507
- this.managers.storage = new ur();
4508
- try {
4509
- this.setupState(e);
4510
- const t = e.integrations?.custom?.headers ?? {};
4511
- this.managers.event = new tr(
4512
- this.managers.storage,
4513
- this.emitter,
4514
- this.transformers,
4515
- t,
4516
- this.customHeadersProvider
4517
- ), this.initializeHandlers(), await this.managers.event.recoverPersistedEvents().catch((r) => {
4518
- a("warn", "Failed to recover persisted events", { error: r });
4519
- }), this.isInitialized = !0;
4520
- } catch (t) {
4521
- this.destroy(!0);
4522
- const r = t instanceof Error ? t.message : String(t);
4523
- throw new Error(`[TraceLog] TraceLog initialization failed: ${r}`);
4524
- }
4512
+ if (this.isInitialized)
4513
+ return { sessionId: this.get("sessionId") ?? "" };
4514
+ this.managers.storage = new ur();
4515
+ try {
4516
+ this.setupState(e);
4517
+ const t = e.integrations?.custom?.headers ?? {};
4518
+ return this.managers.event = new tr(
4519
+ this.managers.storage,
4520
+ this.emitter,
4521
+ this.transformers,
4522
+ t,
4523
+ this.customHeadersProvider
4524
+ ), this.initializeHandlers(), await this.managers.event.recoverPersistedEvents().catch((r) => {
4525
+ a("warn", "Failed to recover persisted events", { error: r });
4526
+ }), this.isInitialized = !0, { sessionId: this.get("sessionId") ?? "" };
4527
+ } catch (t) {
4528
+ this.destroy(!0);
4529
+ const r = t instanceof Error ? t.message : String(t);
4530
+ throw new Error(`[TraceLog] TraceLog initialization failed: ${r}`);
4525
4531
  }
4526
4532
  }
4527
4533
  /**
@@ -4643,6 +4649,15 @@ class fr extends _ {
4643
4649
  getEventManager() {
4644
4650
  return this.managers.event;
4645
4651
  }
4652
+ /**
4653
+ * Returns the current session ID.
4654
+ *
4655
+ * @returns The session ID string, or null if not yet initialized
4656
+ * @internal Used by api.getSessionId()
4657
+ */
4658
+ getSessionId() {
4659
+ return this.get("sessionId");
4660
+ }
4646
4661
  /**
4647
4662
  * Validates metadata object structure and values.
4648
4663
  *
@@ -4718,35 +4733,41 @@ class fr extends _ {
4718
4733
  const N = [], M = [];
4719
4734
  let R = null, h = null, C = !1, v = !1;
4720
4735
  const mr = async (s) => {
4721
- if (!(typeof window > "u" || typeof document > "u") && (v = !1, window.__traceLogDisabled !== !0 && !h && !C)) {
4722
- C = !0;
4736
+ if (typeof window > "u" || typeof document > "u")
4737
+ return { sessionId: "" };
4738
+ if (v = !1, window.__traceLogDisabled === !0)
4739
+ return { sessionId: "" };
4740
+ if (h)
4741
+ return { sessionId: h.getSessionId() ?? "" };
4742
+ if (C)
4743
+ return { sessionId: "" };
4744
+ C = !0;
4745
+ try {
4746
+ const e = zt(s ?? {}), t = new fr();
4723
4747
  try {
4724
- const e = zt(s ?? {}), t = new fr();
4748
+ N.forEach(({ event: o, callback: l }) => {
4749
+ t.on(o, l);
4750
+ }), N.length = 0, M.forEach(({ hook: o, fn: l }) => {
4751
+ o === "beforeSend" ? t.setTransformer("beforeSend", l) : t.setTransformer("beforeBatch", l);
4752
+ }), M.length = 0, R && (t.setCustomHeaders(R), R = null);
4753
+ const r = t.init(e), n = new Promise((o, l) => {
4754
+ setTimeout(() => {
4755
+ l(new Error("[TraceLog] Initialization timeout after 10000ms"));
4756
+ }, 1e4);
4757
+ }), i = await Promise.race([r, n]);
4758
+ return h = t, i;
4759
+ } catch (r) {
4725
4760
  try {
4726
- N.forEach(({ event: i, callback: o }) => {
4727
- t.on(i, o);
4728
- }), N.length = 0, M.forEach(({ hook: i, fn: o }) => {
4729
- i === "beforeSend" ? t.setTransformer("beforeSend", o) : t.setTransformer("beforeBatch", o);
4730
- }), M.length = 0, R && (t.setCustomHeaders(R), R = null);
4731
- const r = t.init(e), n = new Promise((i, o) => {
4732
- setTimeout(() => {
4733
- o(new Error("[TraceLog] Initialization timeout after 10000ms"));
4734
- }, 1e4);
4735
- });
4736
- await Promise.race([r, n]), h = t;
4737
- } catch (r) {
4738
- try {
4739
- t.destroy(!0);
4740
- } catch (n) {
4741
- a("error", "Failed to cleanup partially initialized app", { error: n });
4742
- }
4743
- throw r;
4761
+ t.destroy(!0);
4762
+ } catch (n) {
4763
+ a("error", "Failed to cleanup partially initialized app", { error: n });
4744
4764
  }
4745
- } catch (e) {
4746
- throw h = null, e;
4747
- } finally {
4748
- C = !1;
4765
+ throw r;
4749
4766
  }
4767
+ } catch (e) {
4768
+ throw h = null, e;
4769
+ } finally {
4770
+ C = !1;
4750
4771
  }
4751
4772
  }, gr = (s, e) => {
4752
4773
  if (!(typeof window > "u" || typeof document > "u")) {
@@ -4811,7 +4832,7 @@ const Tr = (s) => {
4811
4832
  throw new Error("[TraceLog] Cannot set custom headers while TraceLog is being destroyed");
4812
4833
  h.setCustomHeaders(s);
4813
4834
  }
4814
- }, _r = () => {
4835
+ }, Ir = () => {
4815
4836
  if (!(typeof window > "u" || typeof document > "u")) {
4816
4837
  if (!h) {
4817
4838
  R = null;
@@ -4821,7 +4842,7 @@ const Tr = (s) => {
4821
4842
  throw new Error("[TraceLog] Cannot remove custom headers while TraceLog is being destroyed");
4822
4843
  h.removeCustomHeaders();
4823
4844
  }
4824
- }, Ir = () => typeof window > "u" || typeof document > "u" ? !1 : h !== null, wr = () => {
4845
+ }, _r = () => typeof window > "u" || typeof document > "u" ? !1 : h !== null, wr = () => typeof window > "u" || typeof document > "u" || !h ? null : h.getSessionId(), yr = () => {
4825
4846
  if (!(typeof window > "u" || typeof document > "u")) {
4826
4847
  if (v)
4827
4848
  throw new Error("[TraceLog] Destroy operation already in progress");
@@ -4836,9 +4857,9 @@ const Tr = (s) => {
4836
4857
  h = null, C = !1, N.length = 0, M.length = 0, R = null, v = !1, a("warn", "Error during destroy, forced cleanup completed", { error: s });
4837
4858
  }
4838
4859
  }
4839
- }, yr = (s) => {
4840
- typeof window > "u" || typeof document > "u" || Ut(s);
4841
4860
  }, br = (s) => {
4861
+ typeof window > "u" || typeof document > "u" || Ut(s);
4862
+ }, Lr = (s) => {
4842
4863
  if (!(typeof window > "u" || typeof document > "u")) {
4843
4864
  if (!h)
4844
4865
  throw new Error("[TraceLog] TraceLog not initialized. Please call init() first.");
@@ -4846,7 +4867,7 @@ const Tr = (s) => {
4846
4867
  throw new Error("[TraceLog] Cannot update metadata while TraceLog is being destroyed");
4847
4868
  h.updateGlobalMetadata(s);
4848
4869
  }
4849
- }, Lr = (s) => {
4870
+ }, Ar = (s) => {
4850
4871
  if (!(typeof window > "u" || typeof document > "u")) {
4851
4872
  if (!h)
4852
4873
  throw new Error("[TraceLog] TraceLog not initialized. Please call init() first.");
@@ -4854,7 +4875,7 @@ const Tr = (s) => {
4854
4875
  throw new Error("[TraceLog] Cannot update metadata while TraceLog is being destroyed");
4855
4876
  h.mergeGlobalMetadata(s);
4856
4877
  }
4857
- }, Jr = {
4878
+ }, Zr = {
4858
4879
  init: mr,
4859
4880
  event: gr,
4860
4881
  on: Er,
@@ -4862,12 +4883,13 @@ const Tr = (s) => {
4862
4883
  setTransformer: pr,
4863
4884
  removeTransformer: Tr,
4864
4885
  setCustomHeaders: vr,
4865
- removeCustomHeaders: _r,
4866
- isInitialized: Ir,
4867
- destroy: wr,
4868
- setQaMode: yr,
4869
- updateGlobalMetadata: br,
4870
- mergeGlobalMetadata: Lr
4886
+ removeCustomHeaders: Ir,
4887
+ isInitialized: _r,
4888
+ getSessionId: wr,
4889
+ destroy: yr,
4890
+ setQaMode: br,
4891
+ updateGlobalMetadata: Lr,
4892
+ mergeGlobalMetadata: Ar
4871
4893
  };
4872
4894
  var me, et = -1, D = function(s) {
4873
4895
  addEventListener("pageshow", (function(e) {
@@ -4901,7 +4923,7 @@ var me, et = -1, D = function(s) {
4901
4923
  return l > c[1] ? "poor" : l > c[0] ? "needs-improvement" : "good";
4902
4924
  })(e.value, t), s(e));
4903
4925
  };
4904
- }, _e = function(s) {
4926
+ }, Ie = function(s) {
4905
4927
  requestAnimationFrame((function() {
4906
4928
  return requestAnimationFrame((function() {
4907
4929
  return s();
@@ -4911,7 +4933,7 @@ var me, et = -1, D = function(s) {
4911
4933
  document.addEventListener("visibilitychange", (function() {
4912
4934
  document.visibilityState === "hidden" && s();
4913
4935
  }));
4914
- }, Ie = function(s) {
4936
+ }, _e = function(s) {
4915
4937
  var e = !1;
4916
4938
  return function() {
4917
4939
  e || (s(), e = !0);
@@ -4919,10 +4941,10 @@ var me, et = -1, D = function(s) {
4919
4941
  }, P = -1, $e = function() {
4920
4942
  return document.visibilityState !== "hidden" || document.prerendering ? 1 / 0 : 0;
4921
4943
  }, q = function(s) {
4922
- document.visibilityState === "hidden" && P > -1 && (P = s.type === "visibilitychange" ? s.timeStamp : 0, Ar());
4944
+ document.visibilityState === "hidden" && P > -1 && (P = s.type === "visibilitychange" ? s.timeStamp : 0, Mr());
4923
4945
  }, Be = function() {
4924
4946
  addEventListener("visibilitychange", q, !0), addEventListener("prerenderingchange", q, !0);
4925
- }, Ar = function() {
4947
+ }, Mr = function() {
4926
4948
  removeEventListener("visibilitychange", q, !0), removeEventListener("prerenderingchange", q, !0);
4927
4949
  }, tt = function() {
4928
4950
  return P < 0 && (P = $e(), Be(), D((function() {
@@ -4944,13 +4966,13 @@ var me, et = -1, D = function(s) {
4944
4966
  }));
4945
4967
  }));
4946
4968
  i && (t = L(s, n, ge, e.reportAllChanges), D((function(o) {
4947
- n = b("FCP"), t = L(s, n, ge, e.reportAllChanges), _e((function() {
4969
+ n = b("FCP"), t = L(s, n, ge, e.reportAllChanges), Ie((function() {
4948
4970
  n.value = performance.now() - o.timeStamp, t(!0);
4949
4971
  }));
4950
4972
  })));
4951
4973
  }));
4952
- }, Ee = [0.1, 0.25], Mr = function(s, e) {
4953
- e = e || {}, rt(Ie((function() {
4974
+ }, Ee = [0.1, 0.25], Cr = function(s, e) {
4975
+ e = e || {}, rt(_e((function() {
4954
4976
  var t, r = b("CLS", 0), n = 0, i = [], o = function(c) {
4955
4977
  c.forEach((function(u) {
4956
4978
  if (!u.hadRecentInput) {
@@ -4962,24 +4984,24 @@ var me, et = -1, D = function(s) {
4962
4984
  l && (t = L(s, r, Ee, e.reportAllChanges), Z((function() {
4963
4985
  o(l.takeRecords()), t(!0);
4964
4986
  })), D((function() {
4965
- n = 0, r = b("CLS", 0), t = L(s, r, Ee, e.reportAllChanges), _e((function() {
4987
+ n = 0, r = b("CLS", 0), t = L(s, r, Ee, e.reportAllChanges), Ie((function() {
4966
4988
  return t();
4967
4989
  }));
4968
4990
  })), setTimeout(t, 0));
4969
4991
  })));
4970
- }, st = 0, ie = 1 / 0, X = 0, Cr = function(s) {
4992
+ }, st = 0, ie = 1 / 0, X = 0, Rr = function(s) {
4971
4993
  s.forEach((function(e) {
4972
4994
  e.interactionId && (ie = Math.min(ie, e.interactionId), X = Math.max(X, e.interactionId), st = X ? (X - ie) / 7 + 1 : 0);
4973
4995
  }));
4974
4996
  }, nt = function() {
4975
4997
  return me ? st : performance.interactionCount || 0;
4976
- }, Rr = function() {
4977
- "interactionCount" in performance || me || (me = $("event", Cr, { type: "event", buffered: !0, durationThreshold: 0 }));
4978
- }, y = [], z = /* @__PURE__ */ new Map(), it = 0, Nr = function() {
4998
+ }, Nr = function() {
4999
+ "interactionCount" in performance || me || (me = $("event", Rr, { type: "event", buffered: !0, durationThreshold: 0 }));
5000
+ }, y = [], z = /* @__PURE__ */ new Map(), it = 0, Or = function() {
4979
5001
  var s = Math.min(y.length - 1, Math.floor((nt() - it) / 50));
4980
5002
  return y[s];
4981
- }, Or = [], Pr = function(s) {
4982
- if (Or.forEach((function(n) {
5003
+ }, Pr = [], Dr = function(s) {
5004
+ if (Pr.forEach((function(n) {
4983
5005
  return n(s);
4984
5006
  })), s.interactionId || s.entryType === "first-input") {
4985
5007
  var e = y[y.length - 1], t = z.get(s.interactionId);
@@ -4998,15 +5020,15 @@ var me, et = -1, D = function(s) {
4998
5020
  }
4999
5021
  }, ot = function(s) {
5000
5022
  var e = self.requestIdleCallback || self.setTimeout, t = -1;
5001
- return s = Ie(s), document.visibilityState === "hidden" ? s() : (t = e(s), Z(s)), t;
5002
- }, Se = [200, 500], Dr = function(s, e) {
5023
+ return s = _e(s), document.visibilityState === "hidden" ? s() : (t = e(s), Z(s)), t;
5024
+ }, Se = [200, 500], kr = function(s, e) {
5003
5025
  "PerformanceEventTiming" in self && "interactionId" in PerformanceEventTiming.prototype && (e = e || {}, ee((function() {
5004
5026
  var t;
5005
- Rr();
5027
+ Nr();
5006
5028
  var r, n = b("INP"), i = function(l) {
5007
5029
  ot((function() {
5008
- l.forEach(Pr);
5009
- var c = Nr();
5030
+ l.forEach(Dr);
5031
+ var c = Or();
5010
5032
  c && c.latency !== n.value && (n.value = c.latency, n.entries = c.entries, r());
5011
5033
  }));
5012
5034
  }, o = $("event", i, { durationThreshold: (t = e.durationThreshold) !== null && t !== void 0 ? t : 40 });
@@ -5016,7 +5038,7 @@ var me, et = -1, D = function(s) {
5016
5038
  it = nt(), y.length = 0, z.clear(), n = b("INP"), r = L(s, n, Se, e.reportAllChanges);
5017
5039
  })));
5018
5040
  })));
5019
- }, pe = [2500, 4e3], oe = {}, kr = function(s, e) {
5041
+ }, pe = [2500, 4e3], oe = {}, Vr = function(s, e) {
5020
5042
  e = e || {}, ee((function() {
5021
5043
  var t, r = tt(), n = b("LCP"), i = function(c) {
5022
5044
  e.reportAllChanges || (c = c.slice(-1)), c.forEach((function(u) {
@@ -5025,7 +5047,7 @@ var me, et = -1, D = function(s) {
5025
5047
  }, o = $("largest-contentful-paint", i);
5026
5048
  if (o) {
5027
5049
  t = L(s, n, pe, e.reportAllChanges);
5028
- var l = Ie((function() {
5050
+ var l = _e((function() {
5029
5051
  oe[n.id] || (i(o.takeRecords()), o.disconnect(), oe[n.id] = !0, t(!0));
5030
5052
  }));
5031
5053
  ["keydown", "click"].forEach((function(c) {
@@ -5033,22 +5055,22 @@ var me, et = -1, D = function(s) {
5033
5055
  return ot(l);
5034
5056
  }), { once: !0, capture: !0 });
5035
5057
  })), Z(l), D((function(c) {
5036
- n = b("LCP"), t = L(s, n, pe, e.reportAllChanges), _e((function() {
5058
+ n = b("LCP"), t = L(s, n, pe, e.reportAllChanges), Ie((function() {
5037
5059
  n.value = performance.now() - c.timeStamp, oe[n.id] = !0, t(!0);
5038
5060
  }));
5039
5061
  }));
5040
5062
  }
5041
5063
  }));
5042
- }, Te = [800, 1800], Vr = function s(e) {
5064
+ }, Te = [800, 1800], Ur = function s(e) {
5043
5065
  document.prerendering ? ee((function() {
5044
5066
  return s(e);
5045
5067
  })) : document.readyState !== "complete" ? addEventListener("load", (function() {
5046
5068
  return s(e);
5047
5069
  }), !0) : setTimeout(e, 0);
5048
- }, Ur = function(s, e) {
5070
+ }, Hr = function(s, e) {
5049
5071
  e = e || {};
5050
5072
  var t = b("TTFB"), r = L(s, t, Te, e.reportAllChanges);
5051
- Vr((function() {
5073
+ Ur((function() {
5052
5074
  var n = ve();
5053
5075
  n && (t.value = Math.max(n.responseStart - J(), 0), t.entries = [n], r(!0), D((function() {
5054
5076
  t = b("TTFB", 0), (r = L(s, t, Te, e.reportAllChanges))(!0);
@@ -5062,30 +5084,30 @@ const xr = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5062
5084
  INPThresholds: Se,
5063
5085
  LCPThresholds: pe,
5064
5086
  TTFBThresholds: Te,
5065
- onCLS: Mr,
5087
+ onCLS: Cr,
5066
5088
  onFCP: rt,
5067
- onINP: Dr,
5068
- onLCP: kr,
5069
- onTTFB: Ur
5089
+ onINP: kr,
5090
+ onLCP: Vr,
5091
+ onTTFB: Hr
5070
5092
  }, Symbol.toStringTag, { value: "Module" }));
5071
5093
  export {
5072
5094
  f as AppConfigValidationError,
5073
- Hr as DEFAULT_SESSION_TIMEOUT,
5095
+ Fr as DEFAULT_SESSION_TIMEOUT,
5074
5096
  ue as DEFAULT_WEB_VITALS_MODE,
5075
5097
  A as DeviceType,
5076
5098
  ae as EmitterEvent,
5077
- x as ErrorType,
5099
+ H as ErrorType,
5078
5100
  d as EventType,
5079
- Yr as InitializationTimeoutError,
5101
+ qr as InitializationTimeoutError,
5080
5102
  V as IntegrationValidationError,
5081
- jr as MAX_ARRAY_LENGTH,
5082
- Wr as MAX_CUSTOM_EVENT_ARRAY_SIZE,
5083
- Br as MAX_CUSTOM_EVENT_KEYS,
5084
- Fr as MAX_CUSTOM_EVENT_NAME_LENGTH,
5085
- $r as MAX_CUSTOM_EVENT_STRING_SIZE,
5086
- Gr as MAX_NESTED_OBJECT_KEYS,
5087
- Xr as MAX_STRING_LENGTH,
5088
- Qr as MAX_STRING_LENGTH_IN_ARRAY,
5103
+ zr as MAX_ARRAY_LENGTH,
5104
+ Gr as MAX_CUSTOM_EVENT_ARRAY_SIZE,
5105
+ Wr as MAX_CUSTOM_EVENT_KEYS,
5106
+ $r as MAX_CUSTOM_EVENT_NAME_LENGTH,
5107
+ Br as MAX_CUSTOM_EVENT_STRING_SIZE,
5108
+ Xr as MAX_NESTED_OBJECT_KEYS,
5109
+ Qr as MAX_STRING_LENGTH,
5110
+ jr as MAX_STRING_LENGTH_IN_ARRAY,
5089
5111
  K as Mode,
5090
5112
  je as PII_PATTERNS,
5091
5113
  O as PermanentError,
@@ -5094,11 +5116,11 @@ export {
5094
5116
  mt as SessionTimeoutValidationError,
5095
5117
  U as SpecialApiUrl,
5096
5118
  F as TraceLogValidationError,
5097
- qr as WEB_VITALS_GOOD_THRESHOLDS,
5119
+ Jr as WEB_VITALS_GOOD_THRESHOLDS,
5098
5120
  ke as WEB_VITALS_NEEDS_IMPROVEMENT_THRESHOLDS,
5099
5121
  Rt as WEB_VITALS_POOR_THRESHOLDS,
5100
5122
  Ve as getWebVitalsThresholds,
5101
- zr as isPrimaryScrollEvent,
5102
- Kr as isSecondaryScrollEvent,
5103
- Jr as tracelog
5123
+ Kr as isPrimaryScrollEvent,
5124
+ Yr as isSecondaryScrollEvent,
5125
+ Zr as tracelog
5104
5126
  };