@tracelog/lib 2.1.0 → 2.1.1-rc.75.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.
@@ -688,6 +688,8 @@ interface State {
688
688
  hasStartSession: boolean;
689
689
  suppressNextScroll: boolean;
690
690
  scrollEventCount?: number;
691
+ sessionReferrer?: string;
692
+ sessionUtm?: UTM;
691
693
  }
692
694
 
693
695
  /**
@@ -688,6 +688,8 @@ interface State {
688
688
  hasStartSession: boolean;
689
689
  suppressNextScroll: boolean;
690
690
  scrollEventCount?: number;
691
+ sessionReferrer?: string;
692
+ sessionUtm?: UTM;
691
693
  }
692
694
 
693
695
  /**
@@ -718,7 +718,7 @@ var init_performance_constants = __esm({
718
718
  var version;
719
719
  var init_package = __esm({
720
720
  "package.json"() {
721
- version = "2.0.3";
721
+ version = "2.1.1";
722
722
  }
723
723
  });
724
724
 
@@ -827,6 +827,61 @@ var init_mode_utils = __esm({
827
827
  }
828
828
  });
829
829
 
830
+ // src/utils/browser/referrer.utils.ts
831
+ var COMPOUND_TLDS, getRootDomain, isSameDomain, getExternalReferrer;
832
+ var init_referrer_utils = __esm({
833
+ "src/utils/browser/referrer.utils.ts"() {
834
+ init_logging_utils();
835
+ COMPOUND_TLDS = [
836
+ "co.uk",
837
+ "org.uk",
838
+ "com.au",
839
+ "net.au",
840
+ "com.br",
841
+ "co.nz",
842
+ "co.jp",
843
+ "com.mx",
844
+ "co.in",
845
+ "com.cn",
846
+ "co.za"
847
+ ];
848
+ getRootDomain = (hostname) => {
849
+ const parts = hostname.toLowerCase().split(".");
850
+ if (parts.length <= 2) {
851
+ return hostname.toLowerCase();
852
+ }
853
+ const lastTwo = parts.slice(-2).join(".");
854
+ if (COMPOUND_TLDS.includes(lastTwo)) {
855
+ return parts.slice(-3).join(".");
856
+ }
857
+ return parts.slice(-2).join(".");
858
+ };
859
+ isSameDomain = (hostname1, hostname2) => {
860
+ if (hostname1 === hostname2) {
861
+ return true;
862
+ }
863
+ return getRootDomain(hostname1) === getRootDomain(hostname2);
864
+ };
865
+ getExternalReferrer = () => {
866
+ const referrer = document.referrer;
867
+ if (!referrer) {
868
+ return "Direct";
869
+ }
870
+ try {
871
+ const referrerHostname = new URL(referrer).hostname.toLowerCase();
872
+ const currentHostname = window.location.hostname.toLowerCase();
873
+ if (isSameDomain(referrerHostname, currentHostname)) {
874
+ return "Direct";
875
+ }
876
+ return referrer;
877
+ } catch (error) {
878
+ log("debug", "Failed to parse referrer URL, using raw value", { error, data: { referrer } });
879
+ return referrer;
880
+ }
881
+ };
882
+ }
883
+ });
884
+
830
885
  // src/utils/browser/utm-params.utils.ts
831
886
  var getUTMParameters;
832
887
  var init_utm_params_utils = __esm({
@@ -853,6 +908,7 @@ var init_browser = __esm({
853
908
  "src/utils/browser/index.ts"() {
854
909
  init_device_detector_utils();
855
910
  init_mode_utils();
911
+ init_referrer_utils();
856
912
  init_utm_params_utils();
857
913
  }
858
914
  });
@@ -3504,7 +3560,6 @@ var init_event_manager = __esm({
3504
3560
  return queue;
3505
3561
  }
3506
3562
  buildEventPayload(data) {
3507
- const isSessionStart = data.type === "session_start" /* SESSION_START */;
3508
3563
  const currentPageUrl = data.page_url ?? this.get("pageUrl");
3509
3564
  const timestamp = this.timeManager.now();
3510
3565
  const validation = this.timeManager.validateTimestamp(timestamp);
@@ -3513,12 +3568,14 @@ var init_event_manager = __esm({
3513
3568
  data: { type: data.type, error: validation.error }
3514
3569
  });
3515
3570
  }
3571
+ const sessionReferrer = this.get("sessionReferrer");
3572
+ const sessionUtm = this.get("sessionUtm");
3516
3573
  let payload = {
3517
3574
  id: generateEventId(),
3518
3575
  type: data.type,
3519
3576
  page_url: currentPageUrl,
3520
3577
  timestamp,
3521
- ...isSessionStart && { referrer: document.referrer || "Direct" },
3578
+ ...sessionReferrer && { referrer: sessionReferrer },
3522
3579
  ...data.from_page_url && { from_page_url: data.from_page_url },
3523
3580
  ...data.scroll_data && { scroll_data: data.scroll_data },
3524
3581
  ...data.click_data && { click_data: data.click_data },
@@ -3527,7 +3584,7 @@ var init_event_manager = __esm({
3527
3584
  ...data.error_data && { error_data: data.error_data },
3528
3585
  ...data.viewport_data && { viewport_data: data.viewport_data },
3529
3586
  ...data.page_view && { page_view: data.page_view },
3530
- ...isSessionStart && getUTMParameters() && { utm: getUTMParameters() }
3587
+ ...sessionUtm && { utm: sessionUtm }
3531
3588
  };
3532
3589
  const collectApiUrls = this.get("collectApiUrls");
3533
3590
  const hasCustomBackend = Boolean(collectApiUrls?.custom);
@@ -4056,10 +4113,12 @@ var init_session_manager = __esm({
4056
4113
  }
4057
4114
  return storedSession.id;
4058
4115
  }
4059
- persistSession(sessionId, lastActivity = Date.now()) {
4116
+ persistSession(sessionId, lastActivity = Date.now(), referrer, utm) {
4060
4117
  this.saveStoredSession({
4061
4118
  id: sessionId,
4062
- lastActivity
4119
+ lastActivity,
4120
+ ...referrer && { referrer },
4121
+ ...utm && { utm }
4063
4122
  });
4064
4123
  }
4065
4124
  clearStoredSession() {
@@ -4151,17 +4210,31 @@ var init_session_manager = __esm({
4151
4210
  }
4152
4211
  const recoveredSessionId = this.recoverSession();
4153
4212
  const sessionId = recoveredSessionId ?? this.generateSessionId();
4213
+ let sessionReferrer;
4214
+ let sessionUtm;
4215
+ if (recoveredSessionId) {
4216
+ const storedSession = this.loadStoredSession();
4217
+ sessionReferrer = storedSession?.referrer ?? getExternalReferrer();
4218
+ sessionUtm = storedSession?.utm ?? getUTMParameters();
4219
+ } else {
4220
+ sessionReferrer = getExternalReferrer();
4221
+ sessionUtm = getUTMParameters();
4222
+ }
4154
4223
  log("debug", "Session tracking initialized", {
4155
4224
  data: {
4156
4225
  sessionId,
4157
4226
  wasRecovered: !!recoveredSessionId,
4158
- willEmitSessionStart: true
4227
+ willEmitSessionStart: true,
4228
+ sessionReferrer,
4229
+ hasUtm: !!sessionUtm
4159
4230
  }
4160
4231
  });
4161
4232
  this.isTracking = true;
4162
4233
  try {
4163
4234
  this.set("sessionId", sessionId);
4164
- this.persistSession(sessionId);
4235
+ this.set("sessionReferrer", sessionReferrer);
4236
+ this.set("sessionUtm", sessionUtm);
4237
+ this.persistSession(sessionId, Date.now(), sessionReferrer, sessionUtm);
4165
4238
  this.initCrossTabSync();
4166
4239
  this.shareSession(sessionId);
4167
4240
  log("debug", "Emitting SESSION_START event", {
@@ -4197,7 +4270,7 @@ var init_session_manager = __esm({
4197
4270
  this.setupSessionTimeout();
4198
4271
  const sessionId = this.get("sessionId");
4199
4272
  if (sessionId) {
4200
- this.persistSession(sessionId);
4273
+ this.persistSession(sessionId, Date.now(), this.get("sessionReferrer"), this.get("sessionUtm"));
4201
4274
  }
4202
4275
  }
4203
4276
  clearSessionTimeout() {
@@ -4252,6 +4325,8 @@ var init_session_manager = __esm({
4252
4325
  this.clearStoredSession();
4253
4326
  this.set("sessionId", null);
4254
4327
  this.set("hasStartSession", false);
4328
+ this.set("sessionReferrer", void 0);
4329
+ this.set("sessionUtm", void 0);
4255
4330
  this.isTracking = false;
4256
4331
  }
4257
4332
  /**