@amplifyup/sdk 0.1.25 → 0.1.26

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/index.d.mts CHANGED
@@ -109,14 +109,10 @@ declare function normalizeRoute(route: string): string;
109
109
  */
110
110
  declare const SESSION_IDLE_GAP_MS: number;
111
111
  /**
112
- * Time-on-page emit strategy (cumulative visible seconds).
113
- * Early milestones, then sparse checkpoints — not a fixed heartbeat.
114
- * Abandoned-but-visible tabs freeze after DWELL_ACTIVITY_IDLE_MS.
112
+ * Time on Page: one event per page visit, sent when the visit ends
113
+ * (SPA navigation, tab close, or 30-minute idle resume). Switching tabs
114
+ * pauses the clock; abandoned-but-visible tabs freeze after this idle gap.
115
115
  */
116
- declare const DWELL_MILESTONES_SEC: readonly [15, 30, 60, 120, 300];
117
- /** After the last milestone, emit at most once per this many seconds. */
118
- declare const DWELL_CHECKPOINT_SEC: number;
119
- /** Stop accruing dwell while visible but without user activity. */
120
116
  declare const DWELL_ACTIVITY_IDLE_MS: number;
121
117
  interface EventTrackingConfig {
122
118
  eventName: string;
@@ -205,14 +201,14 @@ declare class AmplifyUpSDK {
205
201
  private currentPath;
206
202
  /**
207
203
  * Automatic page-level Scroll Depth + Time on Page.
208
- * Dwell uses milestones / sparse checkpoints (not a fixed 15s heartbeat),
209
- * freezes while the tab is visible but the user is idle, and always flushes
210
- * on hide / unload / SPA route change.
204
+ * Time on Page fires once per visit when the visit ends (route change,
205
+ * tab close, or 30-minute idle resume). Hidden tabs pause the clock;
206
+ * visible-but-idle tabs freeze after DWELL_ACTIVITY_IDLE_MS.
211
207
  */
212
208
  private setupPageEngagement;
213
209
  /** Flush dwell then reset — used on SPA route changes. */
214
210
  private resetEngagementForNewPage;
215
- /** Reset dwell/scroll state without emitting (idle resume already flushed on hide). */
211
+ /** Reset dwell/scroll state without emitting (idle resume already flushed). */
216
212
  private resetEngagementQuiet;
217
213
  /**
218
214
  * SPA / soft navigation: fire a page view and reset engagement.
@@ -517,4 +513,4 @@ declare const verifyAWSConnection: () => {
517
513
 
518
514
  declare const _default: AmplifyUpSDK;
519
515
 
520
- export { AmplifyContentMeta, AmplifyUpConfig, AmplifyUpSDK, AmplifyUpTarget, CDPAdapter, ContentSource, DWELL_ACTIVITY_IDLE_MS, DWELL_CHECKPOINT_SEC, DWELL_MILESTONES_SEC, EdgeResolveError, EventProperties, EventTrackingConfig$1 as EventTrackingConfig, type FetchContentOptions, type FetchContentResult, IdentifyInput, IdentifyTraits, PageConfig, ProfileFieldsInput, SESSION_IDLE_GAP_MS, buildLayoutProviderUrl, buildPageRenderUrl, cleanupEventTracking, _default as default, fetchContent, fetchEdgeResolve, fetchPageConfig, getDiagnostics, getInstanceId, getOrchestratorUrl, getSDK, getStatus, getTarget, getTrackingId, getUserId, identify, init, mapResolvedToPageConfig, normalizeRoute, page, refreshEventTracking, reset, routeChange, setProfileFields, setupComponentViewTracking, setupEventTracking, testTracking, track, trackClick, trackContentEngagement, trackContentView, trackFormFieldInteraction, trackFormSubmit, verifyAWSConnection };
516
+ export { AmplifyContentMeta, AmplifyUpConfig, AmplifyUpSDK, AmplifyUpTarget, CDPAdapter, ContentSource, DWELL_ACTIVITY_IDLE_MS, EdgeResolveError, EventProperties, EventTrackingConfig$1 as EventTrackingConfig, type FetchContentOptions, type FetchContentResult, IdentifyInput, IdentifyTraits, PageConfig, ProfileFieldsInput, SESSION_IDLE_GAP_MS, buildLayoutProviderUrl, buildPageRenderUrl, cleanupEventTracking, _default as default, fetchContent, fetchEdgeResolve, fetchPageConfig, getDiagnostics, getInstanceId, getOrchestratorUrl, getSDK, getStatus, getTarget, getTrackingId, getUserId, identify, init, mapResolvedToPageConfig, normalizeRoute, page, refreshEventTracking, reset, routeChange, setProfileFields, setupComponentViewTracking, setupEventTracking, testTracking, track, trackClick, trackContentEngagement, trackContentView, trackFormFieldInteraction, trackFormSubmit, verifyAWSConnection };
package/dist/index.d.ts CHANGED
@@ -109,14 +109,10 @@ declare function normalizeRoute(route: string): string;
109
109
  */
110
110
  declare const SESSION_IDLE_GAP_MS: number;
111
111
  /**
112
- * Time-on-page emit strategy (cumulative visible seconds).
113
- * Early milestones, then sparse checkpoints — not a fixed heartbeat.
114
- * Abandoned-but-visible tabs freeze after DWELL_ACTIVITY_IDLE_MS.
112
+ * Time on Page: one event per page visit, sent when the visit ends
113
+ * (SPA navigation, tab close, or 30-minute idle resume). Switching tabs
114
+ * pauses the clock; abandoned-but-visible tabs freeze after this idle gap.
115
115
  */
116
- declare const DWELL_MILESTONES_SEC: readonly [15, 30, 60, 120, 300];
117
- /** After the last milestone, emit at most once per this many seconds. */
118
- declare const DWELL_CHECKPOINT_SEC: number;
119
- /** Stop accruing dwell while visible but without user activity. */
120
116
  declare const DWELL_ACTIVITY_IDLE_MS: number;
121
117
  interface EventTrackingConfig {
122
118
  eventName: string;
@@ -205,14 +201,14 @@ declare class AmplifyUpSDK {
205
201
  private currentPath;
206
202
  /**
207
203
  * Automatic page-level Scroll Depth + Time on Page.
208
- * Dwell uses milestones / sparse checkpoints (not a fixed 15s heartbeat),
209
- * freezes while the tab is visible but the user is idle, and always flushes
210
- * on hide / unload / SPA route change.
204
+ * Time on Page fires once per visit when the visit ends (route change,
205
+ * tab close, or 30-minute idle resume). Hidden tabs pause the clock;
206
+ * visible-but-idle tabs freeze after DWELL_ACTIVITY_IDLE_MS.
211
207
  */
212
208
  private setupPageEngagement;
213
209
  /** Flush dwell then reset — used on SPA route changes. */
214
210
  private resetEngagementForNewPage;
215
- /** Reset dwell/scroll state without emitting (idle resume already flushed on hide). */
211
+ /** Reset dwell/scroll state without emitting (idle resume already flushed). */
216
212
  private resetEngagementQuiet;
217
213
  /**
218
214
  * SPA / soft navigation: fire a page view and reset engagement.
@@ -517,4 +513,4 @@ declare const verifyAWSConnection: () => {
517
513
 
518
514
  declare const _default: AmplifyUpSDK;
519
515
 
520
- export { AmplifyContentMeta, AmplifyUpConfig, AmplifyUpSDK, AmplifyUpTarget, CDPAdapter, ContentSource, DWELL_ACTIVITY_IDLE_MS, DWELL_CHECKPOINT_SEC, DWELL_MILESTONES_SEC, EdgeResolveError, EventProperties, EventTrackingConfig$1 as EventTrackingConfig, type FetchContentOptions, type FetchContentResult, IdentifyInput, IdentifyTraits, PageConfig, ProfileFieldsInput, SESSION_IDLE_GAP_MS, buildLayoutProviderUrl, buildPageRenderUrl, cleanupEventTracking, _default as default, fetchContent, fetchEdgeResolve, fetchPageConfig, getDiagnostics, getInstanceId, getOrchestratorUrl, getSDK, getStatus, getTarget, getTrackingId, getUserId, identify, init, mapResolvedToPageConfig, normalizeRoute, page, refreshEventTracking, reset, routeChange, setProfileFields, setupComponentViewTracking, setupEventTracking, testTracking, track, trackClick, trackContentEngagement, trackContentView, trackFormFieldInteraction, trackFormSubmit, verifyAWSConnection };
516
+ export { AmplifyContentMeta, AmplifyUpConfig, AmplifyUpSDK, AmplifyUpTarget, CDPAdapter, ContentSource, DWELL_ACTIVITY_IDLE_MS, EdgeResolveError, EventProperties, EventTrackingConfig$1 as EventTrackingConfig, type FetchContentOptions, type FetchContentResult, IdentifyInput, IdentifyTraits, PageConfig, ProfileFieldsInput, SESSION_IDLE_GAP_MS, buildLayoutProviderUrl, buildPageRenderUrl, cleanupEventTracking, _default as default, fetchContent, fetchEdgeResolve, fetchPageConfig, getDiagnostics, getInstanceId, getOrchestratorUrl, getSDK, getStatus, getTarget, getTrackingId, getUserId, identify, init, mapResolvedToPageConfig, normalizeRoute, page, refreshEventTracking, reset, routeChange, setProfileFields, setupComponentViewTracking, setupEventTracking, testTracking, track, trackClick, trackContentEngagement, trackContentView, trackFormFieldInteraction, trackFormSubmit, verifyAWSConnection };
package/dist/index.js CHANGED
@@ -51,7 +51,10 @@ var AWSAdapter = class {
51
51
  headers: {
52
52
  "Content-Type": "application/json"
53
53
  },
54
- body: JSON.stringify(eventData)
54
+ body: JSON.stringify(eventData),
55
+ // Keep the request alive through tab close so the single Time on Page
56
+ // flush on pagehide is not cancelled with the document.
57
+ keepalive: true
55
58
  });
56
59
  if (!response.ok) {
57
60
  if (this.config.debug) {
@@ -510,8 +513,6 @@ async function fetchContent(options) {
510
513
 
511
514
  // src/index.ts
512
515
  var SESSION_IDLE_GAP_MS = 30 * 60 * 1e3;
513
- var DWELL_MILESTONES_SEC = [15, 30, 60, 120, 300];
514
- var DWELL_CHECKPOINT_SEC = 15 * 60;
515
516
  var DWELL_ACTIVITY_IDLE_MS = 2 * 60 * 1e3;
516
517
  var DWELL_POLL_MS = 5e3;
517
518
  function readPreviewQueryOverrides() {
@@ -582,7 +583,8 @@ var AmplifyUpSDK = class {
582
583
  reached: /* @__PURE__ */ new Set(),
583
584
  visibleMs: 0,
584
585
  visibleSince: null,
585
- lastDwellSecondsSent: 0,
586
+ /** True after Time on Page has been sent for the current visit. */
587
+ dwellEmitted: false,
586
588
  /** When the tab last became hidden — used for idle-resume re-page. */
587
589
  hiddenAt: null,
588
590
  /** Last user interaction — freezes dwell when stale while visible. */
@@ -811,9 +813,9 @@ var AmplifyUpSDK = class {
811
813
  }
812
814
  /**
813
815
  * Automatic page-level Scroll Depth + Time on Page.
814
- * Dwell uses milestones / sparse checkpoints (not a fixed 15s heartbeat),
815
- * freezes while the tab is visible but the user is idle, and always flushes
816
- * on hide / unload / SPA route change.
816
+ * Time on Page fires once per visit when the visit ends (route change,
817
+ * tab close, or 30-minute idle resume). Hidden tabs pause the clock;
818
+ * visible-but-idle tabs freeze after DWELL_ACTIVITY_IDLE_MS.
817
819
  */
818
820
  setupPageEngagement() {
819
821
  if (typeof window === "undefined" || typeof document === "undefined") return;
@@ -824,7 +826,7 @@ var AmplifyUpSDK = class {
824
826
  state.reached = /* @__PURE__ */ new Set();
825
827
  state.visibleMs = 0;
826
828
  state.visibleSince = document.visibilityState === "visible" ? Date.now() : null;
827
- state.lastDwellSecondsSent = 0;
829
+ state.dwellEmitted = false;
828
830
  state.hiddenAt = document.visibilityState === "hidden" ? Date.now() : null;
829
831
  state.lastActivityAt = Date.now();
830
832
  state.activityIdle = false;
@@ -886,48 +888,34 @@ var AmplifyUpSDK = class {
886
888
  }
887
889
  }
888
890
  };
889
- const nextEmitTarget = (lastSent) => {
890
- for (const m of DWELL_MILESTONES_SEC) {
891
- if (m > lastSent) return { seconds: m, reason: "milestone" };
892
- }
893
- const nextCheckpoint = Math.floor(lastSent / DWELL_CHECKPOINT_SEC) * DWELL_CHECKPOINT_SEC + DWELL_CHECKPOINT_SEC;
894
- const target = nextCheckpoint > lastSent ? nextCheckpoint : lastSent + DWELL_CHECKPOINT_SEC;
895
- return { seconds: target, reason: "checkpoint" };
896
- };
897
- const emitDwell = (reason, force = false) => {
891
+ const emitDwell = (reason) => {
898
892
  if (this.isPreviewMode()) return;
893
+ if (state.dwellEmitted) return;
899
894
  if (!state.activityIdle) {
900
895
  accumulateVisible();
901
896
  }
902
897
  const seconds = Math.floor(state.visibleMs / 1e3);
903
898
  if (seconds <= 0) return;
904
- if (seconds <= state.lastDwellSecondsSent) return;
905
- if (!force) {
906
- const target = nextEmitTarget(state.lastDwellSecondsSent);
907
- if (!target || seconds < target.seconds) return;
908
- reason = target.reason;
909
- }
910
- state.lastDwellSecondsSent = seconds;
899
+ state.dwellEmitted = true;
911
900
  this.track("Time on Page", {
912
901
  seconds,
913
902
  path: this.lastTrackedPath || path(),
914
903
  reason
915
904
  });
916
905
  };
917
- const evaluateDwell = () => {
906
+ const evaluateIdle = () => {
918
907
  if (document.visibilityState !== "visible") return;
919
908
  if (Date.now() - state.lastActivityAt >= DWELL_ACTIVITY_IDLE_MS) {
920
909
  freezeActivityIdle();
921
- return;
922
910
  }
923
- emitDwell("milestone", false);
924
911
  };
925
- this._emitPageDwell = (force) => emitDwell("route", force !== false);
912
+ this._emitPageDwell = () => emitDwell("route");
926
913
  const onVisibility = () => {
927
914
  if (document.visibilityState === "visible") {
928
915
  const idleMs = state.hiddenAt != null ? Date.now() - state.hiddenAt : 0;
929
916
  state.hiddenAt = null;
930
917
  if (idleMs >= SESSION_IDLE_GAP_MS) {
918
+ emitDwell("idle-resume");
931
919
  this.resetEngagementQuiet();
932
920
  const resumePath = path();
933
921
  this.page(resumePath, { resumed: true });
@@ -944,14 +932,14 @@ var AmplifyUpSDK = class {
944
932
  state.visibleSince = Date.now();
945
933
  state.activityIdle = false;
946
934
  } else {
947
- emitDwell("hidden", true);
935
+ accumulateVisible();
948
936
  state.hiddenAt = Date.now();
949
937
  state.visibleSince = null;
950
938
  state.activityIdle = false;
951
939
  }
952
940
  };
953
941
  const onPageHide = () => {
954
- emitDwell("unload", true);
942
+ emitDwell("unload");
955
943
  if (state.hiddenAt == null) {
956
944
  state.hiddenAt = Date.now();
957
945
  }
@@ -972,10 +960,10 @@ var AmplifyUpSDK = class {
972
960
  window.addEventListener(evt, onActivity, { passive: true });
973
961
  }
974
962
  checkScroll();
975
- const heartbeat = setInterval(() => {
976
- evaluateDwell();
963
+ const idlePoll = setInterval(() => {
964
+ evaluateIdle();
977
965
  }, DWELL_POLL_MS);
978
- this.trackingIntervals.push(heartbeat);
966
+ this.trackingIntervals.push(idlePoll);
979
967
  const previousCleanup = this.trackingCleanup;
980
968
  this.trackingCleanup = () => {
981
969
  window.removeEventListener("scroll", onScroll);
@@ -1003,12 +991,12 @@ var AmplifyUpSDK = class {
1003
991
  emit?.(true);
1004
992
  this.resetEngagementQuiet();
1005
993
  }
1006
- /** Reset dwell/scroll state without emitting (idle resume already flushed on hide). */
994
+ /** Reset dwell/scroll state without emitting (idle resume already flushed). */
1007
995
  resetEngagementQuiet() {
1008
996
  const state = this.pageEngagementState;
1009
997
  state.reached = /* @__PURE__ */ new Set();
1010
998
  state.visibleMs = 0;
1011
- state.lastDwellSecondsSent = 0;
999
+ state.dwellEmitted = false;
1012
1000
  state.hiddenAt = null;
1013
1001
  state.lastActivityAt = Date.now();
1014
1002
  state.activityIdle = false;
@@ -2763,8 +2751,6 @@ var index_default = getSDK();
2763
2751
 
2764
2752
  exports.AmplifyUpSDK = AmplifyUpSDK;
2765
2753
  exports.DWELL_ACTIVITY_IDLE_MS = DWELL_ACTIVITY_IDLE_MS;
2766
- exports.DWELL_CHECKPOINT_SEC = DWELL_CHECKPOINT_SEC;
2767
- exports.DWELL_MILESTONES_SEC = DWELL_MILESTONES_SEC;
2768
2754
  exports.EdgeResolveError = EdgeResolveError;
2769
2755
  exports.SESSION_IDLE_GAP_MS = SESSION_IDLE_GAP_MS;
2770
2756
  exports.buildLayoutProviderUrl = buildLayoutProviderUrl;