@schibsted/pulse-sdk 8.0.0-rc.0 → 8.0.0-rc.10

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.
Files changed (101) hide show
  1. package/dist/cjs/Tracker.js +201 -209
  2. package/dist/cjs/Tracker.test-d.js +2 -2
  3. package/dist/cjs/builders/actor.js +3 -3
  4. package/dist/cjs/builders/consents.js +2 -2
  5. package/dist/cjs/builders/events-anonymous-node.js +1 -1
  6. package/dist/cjs/builders/events-node.js +3 -3
  7. package/dist/cjs/builders/experiments.js +1 -0
  8. package/dist/cjs/builders/tracker-node.js +2 -5
  9. package/dist/cjs/identity/actor.js +18 -6
  10. package/dist/cjs/identity/cis.js +4 -6
  11. package/dist/cjs/leaveTrackingTpaas/constants.js +2 -7
  12. package/dist/cjs/leaveTrackingTpaas/index.js +52 -40
  13. package/dist/cjs/tracker-proxy/consts.js +12 -6
  14. package/dist/cjs/tracker-proxy/proxy-provider.js +6 -0
  15. package/dist/cjs/version.js +5 -0
  16. package/dist/cjs/visibility-observer/index.js +9 -7
  17. package/dist/cjs/wrapper/types/event.js +5 -0
  18. package/dist/ejs/Tracker.js +203 -211
  19. package/dist/ejs/Tracker.test-d.js +2 -2
  20. package/dist/ejs/builders/actor.js +2 -2
  21. package/dist/ejs/builders/consents.js +2 -2
  22. package/dist/ejs/builders/events-anonymous-node.js +1 -1
  23. package/dist/ejs/builders/events-node.js +3 -3
  24. package/dist/ejs/builders/experiments.js +1 -1
  25. package/dist/ejs/builders/tracker-node.js +2 -2
  26. package/dist/ejs/identity/actor.js +19 -7
  27. package/dist/ejs/identity/cis.js +4 -3
  28. package/dist/ejs/leaveTrackingTpaas/constants.js +1 -5
  29. package/dist/ejs/leaveTrackingTpaas/index.js +53 -41
  30. package/dist/ejs/tracker-proxy/consts.js +12 -6
  31. package/dist/ejs/tracker-proxy/proxy-provider.js +6 -0
  32. package/dist/ejs/version.js +2 -0
  33. package/dist/ejs/visibility-observer/index.js +9 -7
  34. package/dist/ejs/wrapper/types/event.js +4 -1
  35. package/dist/types/Tracker.d.ts +92 -87
  36. package/dist/types/builders/actor.d.ts +3 -2
  37. package/dist/types/builders/consents.d.ts +2 -2
  38. package/dist/types/builders/experiments.d.ts +1 -0
  39. package/dist/types/builders/index.d.ts +1 -1
  40. package/dist/types/identity/actor.d.ts +2 -2
  41. package/dist/types/identity/cis.d.ts +1 -1
  42. package/dist/types/index.d.ts +1 -2
  43. package/dist/types/leaveTrackingTpaas/constants.d.ts +1 -5
  44. package/dist/types/leaveTrackingTpaas/index.d.ts +6 -6
  45. package/dist/types/leaveTrackingTpaas/types.d.ts +1 -9
  46. package/dist/types/tracker-proxy/consts.d.ts +1 -1
  47. package/dist/types/types.d.ts +19 -13
  48. package/dist/types/version.d.ts +1 -0
  49. package/dist/types/visibility-observer/index.d.ts +6 -1
  50. package/dist/types/wrapper/engagement/ui-element/types.d.ts +1 -0
  51. package/dist/types/wrapper/types/event.d.ts +3 -1
  52. package/dist/types/wrapper/view/ui-element/types.d.ts +1 -0
  53. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.d.ts +1 -0
  54. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.js +17 -3
  55. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.js.map +1 -1
  56. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.d.ts +4 -0
  57. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.js +15 -5
  58. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.js.map +1 -1
  59. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.d.ts +1 -0
  60. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.js +5 -0
  61. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.js.map +1 -1
  62. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.d.ts +1 -0
  63. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.js +16 -2
  64. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.js.map +1 -1
  65. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.d.ts +4 -0
  66. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.js +12 -3
  67. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.js.map +1 -1
  68. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.d.ts +1 -0
  69. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.js +5 -0
  70. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.js.map +1 -1
  71. package/node_modules/@schibsted/pulse-cis-sync/dist/types/cis-browser.d.ts +1 -0
  72. package/node_modules/@schibsted/pulse-cis-sync/dist/types/storage/pulseStorage.d.ts +4 -0
  73. package/node_modules/@schibsted/pulse-cis-sync/dist/types/storage/storage.d.ts +1 -0
  74. package/node_modules/@schibsted/pulse-utils/package.json +1 -1
  75. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/catalogVersion.js +9 -0
  76. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/device.js +8 -2
  77. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/provider.js +3 -1
  78. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/session.js +19 -6
  79. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders.js +75 -76
  80. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/guards.js +7 -0
  81. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/index.js +3 -0
  82. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/catalogVersion.js +6 -0
  83. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/device.js +8 -2
  84. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/provider.js +3 -1
  85. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/session.js +19 -6
  86. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders.js +74 -71
  87. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/guards.js +4 -0
  88. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/index.js +1 -0
  89. package/node_modules/@schibsted/tpaas-event-builder/dist/index.d.ts +1730 -1127
  90. package/node_modules/@schibsted/tpaas-event-builder/package.json +3 -2
  91. package/node_modules/@schibsted/tpaas-schemas/dist/cjs/constants.js +136 -103
  92. package/node_modules/@schibsted/tpaas-schemas/dist/cjs/index.js +1 -0
  93. package/node_modules/@schibsted/tpaas-schemas/dist/cjs/types.js +2 -0
  94. package/node_modules/@schibsted/tpaas-schemas/dist/ejs/constants.js +134 -101
  95. package/node_modules/@schibsted/tpaas-schemas/dist/ejs/index.js +1 -0
  96. package/node_modules/@schibsted/tpaas-schemas/dist/ejs/types.js +1 -0
  97. package/node_modules/@schibsted/tpaas-schemas/dist/index.d.ts +1940 -1266
  98. package/node_modules/@schibsted/tpaas-schemas/package.json +1 -1
  99. package/package.json +7 -6
  100. package/dist/cjs/version.json +0 -1
  101. package/dist/ejs/version.json +0 -1
@@ -1,7 +1,7 @@
1
1
  import { parsePulseCookies } from '@schibsted/pulse-cis-sync';
2
2
  import { evaluateAndFlatten, isBrowser, isFunction, isPromise, isString, pulseMerge, throttle, } from '@schibsted/pulse-utils';
3
- import { buildAnonymousViewUIElementEvent, buildCompletedHealthActionEvent, buildEngagementAudioEvent, buildEngagementFormEvent, buildEngagementHealthUIElementEvent, buildEngagementOfferEvent, buildEngagementTeaserEvent, buildEngagementUIElementEvent, buildEngagementVideoAdEvent, buildEngagementVideoEvent, buildEngagementWidgetEvent, buildImpressionAdSlotEvent, buildImpressionFormEvent, buildImpressionHealthUIElementEvent, buildImpressionOfferEvent, buildImpressionPlayerEvent, buildImpressionTeaserEvent, buildImpressionUIElementEvent, buildImpressionWidgetEvent, buildLeaveArticleEvent, buildLeaveAudioPageEvent, buildLeaveErrorEvent, buildLeaveFrontpageEvent, buildLeaveLandingpageEvent, buildLeaveListingEvent, buildLeaveLockedArticleEvent, buildLeaveLockedAudioEvent, buildLeaveLockedAudioPageEvent, buildLeaveLockedVideoEvent, buildLeaveLockedVideoPageEvent, buildLeavePageEvent, buildLeaveVideoPageEvent, buildLeaveWeatherEvent, buildViewArticleEvent, buildViewAudioEvent, buildViewAudioPageEvent, buildViewErrorEvent, buildViewFrontpageEvent, buildViewHealthPageEvent, buildViewLandingpageEvent, buildViewListingEvent, buildViewLockedArticleEvent, buildViewLockedAudioEvent, buildViewLockedAudioPageEvent, buildViewLockedVideoEvent, buildViewLockedVideoPageEvent, buildViewPageEvent, buildViewTitleEvent, buildViewVideoEvent, buildViewVideoPageEvent, buildViewWeatherEvent, getCommonBuildersOutput, } from '@schibsted/tpaas-event-builder';
4
- import { LeaveArticle, LeaveAudioPage, LeaveError, LeaveFrontpage, LeaveLandingpage, LeaveListing, LeaveLockedArticle, LeaveLockedAudioPage, LeaveLockedVideoPage, LeavePage, LeaveVideoPage, LeaveWeather, ViewArticle, ViewError, ViewFrontpage, ViewListing, ViewLockedArticle, ViewLockedVideo, ViewPage, ViewTitle, } from '@schibsted/tpaas-schemas';
3
+ import { buildAnonymousViewUIElementEvent, buildCompletedHealthActionEvent, buildEngagementAudioEvent, buildEngagementFormEvent, buildEngagementHealthUIElementEvent, buildEngagementOfferEvent, buildEngagementTeaserEvent, buildEngagementUIElementEvent, buildEngagementVideoAdEvent, buildEngagementVideoEvent, buildEngagementWidgetEvent, buildImpressionAdSlotEvent, buildImpressionFormEvent, buildImpressionHealthUIElementEvent, buildImpressionOfferEvent, buildImpressionPlayerEvent, buildImpressionTeaserEvent, buildImpressionUIElementEvent, buildImpressionWidgetEvent, buildLeaveArticleEvent, buildLeaveAudioPageEvent, buildLeaveErrorEvent, buildLeaveFrontpageEvent, buildLeaveLandingpageEvent, buildLeaveListingEvent, buildLeaveLockedArticleEvent, buildLeaveLockedAudioPageEvent, buildLeaveLockedVideoPageEvent, buildLeavePageEvent, buildLeaveSportsPageEvent, buildLeaveVideoPageEvent, buildLeaveWeatherEvent, buildViewArticleEvent, buildViewAudioPageEvent, buildViewErrorEvent, buildViewFrontpageEvent, buildViewHealthPageEvent, buildViewLandingpageEvent, buildViewListingEvent, buildViewLockedArticleEvent, buildViewLockedAudioPageEvent, buildViewLockedVideoPageEvent, buildViewPageEvent, buildViewSportsPageEvent, buildViewTitleEvent, buildViewVideoPageEvent, buildViewWeatherEvent, isPageType, } from '@schibsted/tpaas-event-builder';
4
+ import { LeaveArticle, LeaveAudioPage, LeaveError, LeaveFrontpage, LeaveLandingpage, LeaveListing, LeaveLockedArticle, LeaveLockedAudioPage, LeaveLockedVideoPage, LeavePage, LeaveSportsPage, LeaveVideoPage, LeaveWeather, ViewArticle, ViewAudioPage, ViewError, ViewFrontpage, ViewHealthPage, ViewLandingpage, ViewListing, ViewLockedArticle, ViewLockedAudioPage, ViewLockedVideoPage, ViewPage, ViewSportsPage, ViewTitle, ViewVideoPage, ViewWeather, } from '@schibsted/tpaas-schemas';
5
5
  import logger from 'loglevel';
6
6
  import { v4 } from 'uuid';
7
7
  import { getDefaultAltHandler, getDefaultNativeJwe } from './app-integration';
@@ -10,6 +10,7 @@ import { getConsentsWaitForAnalytics, getFallbackConsents } from './builders/con
10
10
  import { applyAdvertisingConsent, applyAdvertisingConsentSync, } from './builders/consents';
11
11
  import { engagementEvent, identityEvent, routableEvent, trackerEvent } from './builders/events';
12
12
  import { anonymousEngagementEvent, anonymousTrackerEvent } from './builders/events-anonymous-node';
13
+ import { generateExperimentSDRN } from './builders/experiments';
13
14
  import { readSession } from './builders/session-browser';
14
15
  import { baseConfig as defaultConfig } from './config';
15
16
  import { CISEndpoints, collectorEndpoints, remoteConfig } from './config-browser';
@@ -21,10 +22,11 @@ import { addTpaasLeaveTracking, getTpaasLeaveObject, leaveTpaasTrackingIsActive,
21
22
  import send from './network';
22
23
  import * as config from './remoteConfig';
23
24
  import { startProxyProviderListener } from './tracker-proxy/proxy-provider';
24
- import version from './version.json';
25
+ import { SDK_VERSION } from './version';
25
26
  import { VisibilityObserver } from './visibility-observer';
26
27
  import warnOnce from './warnOnce';
27
28
  import { buildClickUIElementEvent } from './wrapper/engagement/ui-element/event-builder';
29
+ import { isLegacyPageType } from './wrapper/types';
28
30
  import { pageFromPageView } from './wrapper/utils/page-from-page-view';
29
31
  import { buildLegacyViewArticleEvent } from './wrapper/view/article/event-builder';
30
32
  import { buildLegacyViewFrontpageEvent } from './wrapper/view/frontpage/event-builder';
@@ -114,6 +116,27 @@ export function unsubscribe(eventName, callback) {
114
116
  * @class Tracker
115
117
  */
116
118
  export default class Tracker {
119
+ async getCurrentTpaasPage() {
120
+ const { id, type, url } = await this.currentPage;
121
+ return {
122
+ // remove the SDRN prefix, it's not expected for TPaaS
123
+ pageId: id.startsWith('sdrn:') ? id.split(':').slice(-1)[0] : id,
124
+ // make sure the pageType is valid for TPaaS
125
+ pageType: isPageType(type) ? type : 'Page',
126
+ url,
127
+ };
128
+ }
129
+ async getCurrentLegacyPage() {
130
+ const { id, type, url } = await this.currentPage;
131
+ // make sure the pageType is valid for legacy events
132
+ const validatedType = isLegacyPageType(type) ? type : 'Page';
133
+ return {
134
+ // add the SDRN prefix if it's not there, legacy events expect the full SDRN format
135
+ id: id.startsWith('sdrn:') ? id : `sdrn:${this.state.providerId}:${validatedType.toLowerCase()}:${id}`,
136
+ type: validatedType,
137
+ url,
138
+ };
139
+ }
117
140
  /**
118
141
  * > [!WARNING]
119
142
  * >
@@ -132,19 +155,30 @@ export default class Tracker {
132
155
  // the tracking of the same element with both old and new events at the same time
133
156
  this.legacyVisibilityObservers = new Map();
134
157
  this.visibilityObservers = new Map();
135
- this.legacyCurrentPage = {
136
- id: 'undefined-id',
158
+ /**
159
+ * @private
160
+ *
161
+ * This is used as the source of truth for the current page's information, which is updated based on the View Page-level event
162
+ * As a single source of truth for the current page, this needs to be compatible between legacy and TPaaS events, hence the need for a custom data type.
163
+ * Legacy events can provide an id with SDRN, while TPaaS events don't need it
164
+ */
165
+ this.currentPage = {
166
+ id: 'unknown',
137
167
  type: 'Page',
138
- url: typeof window !== 'undefined' ? window.location.href : '',
168
+ url: isBrowser ? window.location.href : undefined,
139
169
  };
140
- this.currentPage = undefined;
141
170
  /**
142
171
  * Promise that resolves when a session ID becomes available
143
172
  * @private
144
173
  */
145
174
  this.sessionIdPromise = null;
175
+ /**
176
+ * A simple flag used to prevent duplicate listeners being registered
177
+ * if `exposeToProxyClients` or `startProxyProviderListener` is called more than once.
178
+ */
179
+ this.hasProxyListener = false;
146
180
  this.setPageDefaults = (pageViewEvent) => {
147
- this.legacyCurrentPage = pageFromPageView(pageViewEvent);
181
+ this.currentPage = pageFromPageView(pageViewEvent);
148
182
  if (pageViewEvent.origin) {
149
183
  const pageDefaults = { origin: pageViewEvent.origin };
150
184
  this.update(pageDefaults, true);
@@ -152,8 +186,8 @@ export default class Tracker {
152
186
  };
153
187
  this.setCurrentPage = (id, type) => {
154
188
  this.currentPage = {
155
- pageId: id,
156
- pageType: type,
189
+ id: id || 'unknown',
190
+ type: type || 'Page',
157
191
  url: isBrowser ? window.location.href : undefined,
158
192
  };
159
193
  };
@@ -162,6 +196,9 @@ export default class Tracker {
162
196
  if (!providerId || !(typeof providerId === 'string')) {
163
197
  throw new Error('Required parameter `providerId` missing');
164
198
  }
199
+ if (config?.componentVersion !== undefined && config?.component === undefined) {
200
+ throw new Error('`componentVersion` cannot be provided without `component`');
201
+ }
165
202
  let includeAdvertising;
166
203
  if (isBrowser && config?.autoCreateConsents) {
167
204
  config.consents = getConsentsWaitForAnalytics((consents) => {
@@ -205,9 +242,11 @@ export default class Tracker {
205
242
  this.builders = pulseMerge({}, builders, {
206
243
  provider: {
207
244
  id: providerId,
245
+ ...(config?.component !== undefined && { component: config.component }),
246
+ ...(config?.componentVersion !== undefined && { componentVersion: config.componentVersion }),
208
247
  },
209
248
  tracker: {
210
- version: version.SDK_VERSION,
249
+ version: SDK_VERSION,
211
250
  },
212
251
  });
213
252
  this.bookmark = new Map();
@@ -321,6 +360,11 @@ export default class Tracker {
321
360
  return queuedEvent.then((result) => result);
322
361
  });
323
362
  };
363
+ /*
364
+ * Casting `input` as `Partial<Builders>` to formalise the intention of processing the event input in relation to the properties in
365
+ * the Builders type. It would justify changing the public api for `.track`, but as this deals with legacy code, we
366
+ * keep it internal, so dependencies from now on can count on objects being a Partial<Builder>
367
+ */
324
368
  return this.syncRemoteResources(input, currentBuilders).then(_track, _track);
325
369
  }
326
370
  /**
@@ -390,6 +434,11 @@ export default class Tracker {
390
434
  return {
391
435
  name: exp.name || exp.id,
392
436
  variant: exp.variant || '',
437
+ // nobody should be sending experiment id with an sdrn format, but in case they do
438
+ // we want to be able to handle it and not generate an invalid sdrn by adding another layer to it
439
+ experimentSdrn: exp.id.startsWith('sdrn:') ? exp.id : generateExperimentSDRN(exp.id, exp.platform),
440
+ platform: exp.platform || '',
441
+ testId: exp.custom?.testId,
393
442
  };
394
443
  });
395
444
  }
@@ -407,15 +456,16 @@ export default class Tracker {
407
456
  }
408
457
  return {
409
458
  autoTrackerVersion: this.builders.tracker?.autoTrackerVersion,
410
- version: version.SDK_VERSION,
459
+ version: SDK_VERSION,
411
460
  isHybrid: !!this.state.isHybrid,
412
461
  pageviewId: this.state.pageViewId,
413
462
  providerId: this.state.providerId,
463
+ component: this.state.component,
464
+ componentVersion: this.state.componentVersion,
414
465
  experiments: await this.adaptExperiments(this.builders.experiments),
415
466
  };
416
467
  }
417
468
  /**
418
- *
419
469
  * @private
420
470
  * @category TPaaS Tracking
421
471
  */
@@ -475,42 +525,29 @@ export default class Tracker {
475
525
  source: source || 'unknown',
476
526
  };
477
527
  }
478
- const [actor, consents, experiments] = await Promise.all([
528
+ const [actor, consents, experiments, currentPage] = await Promise.all([
479
529
  this.getActor(),
480
530
  this.getConsents(),
481
531
  this.adaptExperiments(this.builders.experiments),
532
+ this.getCurrentTpaasPage(),
482
533
  ]);
483
534
  const { environmentId, jwe } = parsePulseCookies();
484
535
  return {
485
536
  autoTrackerVersion: this.builders.tracker?.autoTrackerVersion,
486
- version: version.SDK_VERSION,
537
+ version: SDK_VERSION,
487
538
  isHybrid: !!this.state.isHybrid,
488
539
  user: adaptActorToNewFormat(actor),
489
540
  consents: adaptConsentsToNewFormat(consents),
490
541
  providerId: this.state.providerId,
542
+ component: this.state.component,
543
+ componentVersion: this.state.componentVersion,
491
544
  pageviewId: this.state.pageViewId,
492
- currentPage: this.currentPage,
545
+ currentPage,
493
546
  experiments,
494
547
  environmentId,
495
548
  jwe,
496
549
  };
497
550
  }
498
- /**
499
- * Generate a generic TPaaS event with common builders output
500
- * The method should be used for experiments, not for real production work.
501
- * It doesn't have any real TPaaS schema associated with it.
502
- * The method doesn't queue or send the event, it just returns the merged object.
503
- * The method can be removed at any time in the future, so use it with caution.
504
- *
505
- * @param input - The input object to merge with the common builders output
506
- * @returns A promise that resolves to the merged object
507
- * @private
508
- * @category TPaaS Tracking
509
- */
510
- async generateGenericTpaasEvent(input) {
511
- const dependencies = await this.prepareTpaasEvent();
512
- return pulseMerge({}, input, getCommonBuildersOutput(new Date(), dependencies));
513
- }
514
551
  /**
515
552
  * This method extends the list of base experiments that will be automatically included in every event sent by the tracker.
516
553
  *
@@ -532,6 +569,9 @@ export default class Tracker {
532
569
  * @category Tracking
533
570
  */
534
571
  addExperiments(experiments) {
572
+ if (experiments.some((experiment) => experiment.id.startsWith('sdrn:'))) {
573
+ logger.warn('Pulse - addExperiments received an experiment id starting with "sdrn:"; pass the raw experiment id instead. The SDK will generate the sdrn automatically.');
574
+ }
535
575
  this.update({ experiments }, true);
536
576
  }
537
577
  /**
@@ -566,7 +606,7 @@ export default class Tracker {
566
606
  const viewUIElementInputProperties = buildEventFromElement(element);
567
607
  this.trackLegacyViewUIElement(viewUIElementInputProperties);
568
608
  }));
569
- this.legacyVisibilityObservers.get(selector)?.observe(selector);
609
+ this.legacyVisibilityObservers.get(selector)?.observe(selector, {});
570
610
  }
571
611
  /**
572
612
  * The `addUIElementVisibilityTracking` function provides an interface for sending tracking events when specific UI elements become visible within the viewport.
@@ -598,7 +638,38 @@ export default class Tracker {
598
638
  const eventInput = buildEventFromElement(element);
599
639
  this.trackImpressionUIElement(eventInput);
600
640
  }));
601
- this.visibilityObservers.get(selector)?.observe(selector);
641
+ this.visibilityObservers.get(selector)?.observe(selector, {});
642
+ }
643
+ /**
644
+ * The `addElementVisibilityObserver` function provides an interface for executing arbitrary code when specific DOM Elements become visible within the viewport.
645
+ * It is built on the `VisibilityObserver` class, which efficiently detects visibility changes in DOM elements.
646
+ * When an element becomes at least 2/3 visible, a callback is triggered, with the Element that invoked the callback call as argument.
647
+ * It leverages the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) for viewport tracking
648
+ * and the [Mutation Observer API](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) to monitor lazy-loaded elements.
649
+ *
650
+ * Example usage:
651
+ *
652
+ * ```ts
653
+ * tracker.addElementVisibilityObserver('[data-pulse-entity-id]', (element) => {
654
+ * const eventInput = parseElementIntoEventInput(element); // user-defined function
655
+ * tracker.trackImpressionTeaser(eventInput); // can be anything actually, not necessarily a Teaser tracking call
656
+ * });
657
+ * ```
658
+ * @param selector
659
+ * @param callback
660
+ * @param options {ObserverOptions}
661
+ * @param options.threshold - A number between 0 and 1 indicating how much of the element should be visible to trigger
662
+ * the callback. Default is 0.67 (2/3 of the element).
663
+ */
664
+ addElementVisibilityObserver(selector, callback, options = {}) {
665
+ if (this.visibilityObservers.has(selector)) {
666
+ console.warn(`Cannot add UI Element visibility tracking for selector "${selector}" as it is already being tracked.`);
667
+ return;
668
+ }
669
+ this.visibilityObservers.set(selector, new VisibilityObserver((element) => {
670
+ callback(element);
671
+ }));
672
+ this.visibilityObservers.get(selector)?.observe(selector, options);
602
673
  }
603
674
  /**
604
675
  * The old trackViewArticle method from the Media Wrapper.
@@ -692,7 +763,7 @@ export default class Tracker {
692
763
  * @category Legacy Tracking
693
764
  */
694
765
  trackLegacyViewUIElement(inputProperties, trackOptions) {
695
- const viewUIElementEventData = buildLegacyViewUIElementEvent(inputProperties, this.legacyCurrentPage);
766
+ const viewUIElementEventData = buildLegacyViewUIElementEvent(inputProperties, this.getCurrentLegacyPage());
696
767
  return this.track('trackerEvent', viewUIElementEventData, trackOptions);
697
768
  }
698
769
  /**
@@ -703,7 +774,7 @@ export default class Tracker {
703
774
  * @category Legacy Tracking
704
775
  */
705
776
  trackLegacyClickUIElement(inputProperties, trackOptions) {
706
- const clickUIElementEventData = buildClickUIElementEvent(inputProperties, this.legacyCurrentPage);
777
+ const clickUIElementEventData = buildClickUIElementEvent(inputProperties, this.getCurrentLegacyPage());
707
778
  return this.track('trackerEvent', clickUIElementEventData, trackOptions);
708
779
  }
709
780
  /**
@@ -730,19 +801,18 @@ export default class Tracker {
730
801
  }
731
802
  async trackViewHealthPage(input, options) {
732
803
  this.newPageView(); // Reset the page view ID if it is not set, to ensure a new page view is tracked
733
- this.setCurrentPage(input.object.objectId, 'Page'); // ViewHealthPage.object.objectType is HealthPage, which is not allowed as a pageType
804
+ this.setCurrentPage(input.object.objectId, ViewHealthPage.object.objectType);
734
805
  const dependencies = await this.prepareTpaasEvent();
735
806
  const event = buildViewHealthPageEvent(input, dependencies);
736
807
  const result = this.sendTpaasEvent(event);
737
808
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
738
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
739
- // HealthView Page is a bit special, in the sense that in doesn't have a dedicated Leave event.
740
- // Instead, we need to reuse the generic Leave Page event, but adapt the input accordingly.
741
- // This means omitting some fields from HealthView Page that are not part of Leave Page schema.
742
- const { experiments, metrics, object, ...restInput } = input;
743
- const { category, custom, intent, name, tags, ...restObject } = input.object;
744
- const leavePageCallback = (leave) => {
745
- this.trackLeavePage({
809
+ const leavePageCallback = async (leave) => {
810
+ // HealthView Page is a bit special, in the sense that in doesn't have a dedicated Leave event.
811
+ // Instead, we need to reuse the generic Leave Page event, but adapt the input accordingly.
812
+ // This means omitting some fields from HealthView Page that are not part of Leave Page schema.
813
+ const { experiments, metrics, object, origin, ...restInput } = input;
814
+ const { category, custom, intent, name, tags, ...restObject } = input.object;
815
+ await this.trackLeavePage({
746
816
  leave,
747
817
  ...restInput,
748
818
  object: {
@@ -752,10 +822,7 @@ export default class Tracker {
752
822
  });
753
823
  };
754
824
  addTpaasLeaveTracking({
755
- objectElement,
756
- pageElement,
757
- objectResizable,
758
- heightBuilder,
825
+ ...options.leaveTracking,
759
826
  schema: LeavePage.object.objectType,
760
827
  trackMethod: leavePageCallback,
761
828
  });
@@ -779,18 +846,14 @@ export default class Tracker {
779
846
  const event = buildViewPageEvent(input, dependencies);
780
847
  const result = this.sendTpaasEvent(event);
781
848
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
782
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
783
- const leavePageCallback = (leave) => {
784
- this.trackLeavePage({
849
+ const leavePageCallback = async (leave) => {
850
+ await this.trackLeavePage({
785
851
  leave,
786
852
  ...input,
787
853
  });
788
854
  };
789
855
  addTpaasLeaveTracking({
790
- objectElement,
791
- pageElement,
792
- objectResizable,
793
- heightBuilder,
856
+ ...options.leaveTracking,
794
857
  schema: LeavePage.object.objectType,
795
858
  trackMethod: leavePageCallback,
796
859
  });
@@ -799,32 +862,49 @@ export default class Tracker {
799
862
  }
800
863
  /**
801
864
  * @param input
865
+ * @param options
802
866
  * @category TPaaS Tracking
803
867
  */
804
- async trackViewTitle(input) {
868
+ async trackViewSportsPage(input, options) {
805
869
  this.newPageView(); // Reset the page view ID if it is not set, to ensure a new page view is tracked
806
- this.setCurrentPage(input.object.objectId, ViewTitle.object.objectType);
870
+ this.setCurrentPage(input.object.objectId, ViewSportsPage.object.objectType);
807
871
  const dependencies = await this.prepareTpaasEvent();
808
- const event = buildViewTitleEvent(input, dependencies);
809
- return this.sendTpaasEvent(event);
810
- // there's no Leave Title event
872
+ const event = buildViewSportsPageEvent(input, dependencies);
873
+ const result = this.sendTpaasEvent(event);
874
+ if (shouldEnableLeaveTracking(options.leaveTracking)) {
875
+ const leaveSportsPageCallback = async (leave) => {
876
+ await this.trackLeaveSportsPage({
877
+ leave,
878
+ ...input,
879
+ });
880
+ };
881
+ addTpaasLeaveTracking({
882
+ ...options.leaveTracking,
883
+ schema: LeaveSportsPage.object.objectType,
884
+ trackMethod: leaveSportsPageCallback,
885
+ });
886
+ }
887
+ return result;
811
888
  }
812
889
  /**
813
890
  * @param input
814
891
  * @category TPaaS Tracking
815
892
  */
816
- async trackImpressionWidget(input) {
893
+ async trackViewTitle(input) {
894
+ this.newPageView(); // Reset the page view ID if it is not set, to ensure a new page view is tracked
895
+ this.setCurrentPage(input.object.objectId, ViewTitle.object.objectType);
817
896
  const dependencies = await this.prepareTpaasEvent();
818
- const event = buildImpressionWidgetEvent(input, dependencies);
897
+ const event = buildViewTitleEvent(input, dependencies);
819
898
  return this.sendTpaasEvent(event);
899
+ // there's no Leave Title event
820
900
  }
821
901
  /**
822
902
  * @param input
823
903
  * @category TPaaS Tracking
824
904
  */
825
- async trackImpressionAdSlot(input) {
905
+ async trackImpressionWidget(input) {
826
906
  const dependencies = await this.prepareTpaasEvent();
827
- const event = buildImpressionAdSlotEvent(input, dependencies);
907
+ const event = buildImpressionWidgetEvent(input, dependencies);
828
908
  return this.sendTpaasEvent(event);
829
909
  }
830
910
  /**
@@ -839,36 +919,20 @@ export default class Tracker {
839
919
  const event = buildViewArticleEvent(input, dependencies);
840
920
  const result = this.sendTpaasEvent(event);
841
921
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
842
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
843
- const leaveArticleCallback = (leave) => {
844
- this.trackLeaveArticle({
922
+ const leaveArticleCallback = async (leave) => {
923
+ await this.trackLeaveArticle({
845
924
  leave,
846
925
  ...input,
847
926
  });
848
927
  };
849
928
  addTpaasLeaveTracking({
850
- objectElement,
851
- pageElement,
852
- heightBuilder,
853
- objectResizable,
929
+ ...options.leaveTracking,
854
930
  schema: LeaveArticle.object.objectType,
855
931
  trackMethod: leaveArticleCallback,
856
932
  });
857
933
  }
858
934
  return result;
859
935
  }
860
- /**
861
- * @param input
862
- * @param options
863
- * @category TPaaS Tracking
864
- */
865
- async trackViewAudio(input) {
866
- // despite the View event type, this is not a page view event, but rather a media object view event
867
- // so we shouldn't reset the page view ID here or enable leave tracking
868
- const dependencies = await this.prepareTpaasEvent();
869
- const event = buildViewAudioEvent(input, dependencies);
870
- return this.sendTpaasEvent(event);
871
- }
872
936
  /**
873
937
  * Tracks a View AudioPage event and automatically fires a Leave AudioPage event when the user
874
938
  * navigates away.
@@ -911,20 +975,20 @@ export default class Tracker {
911
975
  */
912
976
  async trackViewAudioPage(input, options) {
913
977
  this.newPageView();
914
- this.setCurrentPage(input.object.objectId, 'Audio'); // ViewAudioPage.object.objectType is AudioPage, which is not allowed as a pageType
978
+ this.setCurrentPage(input.object.objectId, ViewAudioPage.object.objectType);
915
979
  const dependencies = await this.prepareTpaasEvent();
916
980
  const event = buildViewAudioPageEvent(input, dependencies);
917
981
  const result = this.sendTpaasEvent(event);
918
982
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
919
- const { objectElement, pageElement, heightBuilder, objectResizable, leaveAudioBuilder } = options.leaveTracking;
920
- const leaveAudioPageCallback = (leave) => {
983
+ const { leaveAudioBuilder, ...restLeaveTrackingOptions } = options.leaveTracking;
984
+ const leaveAudioPageCallback = async (leave) => {
921
985
  const leaveAudioInput = leaveAudioBuilder?.() ?? {
922
986
  audioCompleted: 0,
923
987
  audioStarted: 0,
924
988
  maxPlaylistPosition: 0,
925
989
  playlistPositionPercentage: 0,
926
990
  };
927
- this.trackLeaveAudioPage({
991
+ await this.trackLeaveAudioPage({
928
992
  leave,
929
993
  leaveAudio: {
930
994
  ...leaveAudioInput,
@@ -935,10 +999,7 @@ export default class Tracker {
935
999
  });
936
1000
  };
937
1001
  addTpaasLeaveTracking({
938
- objectElement,
939
- pageElement,
940
- heightBuilder,
941
- objectResizable,
1002
+ ...restLeaveTrackingOptions,
942
1003
  schema: LeaveAudioPage.object.objectType,
943
1004
  trackMethod: leaveAudioPageCallback,
944
1005
  });
@@ -957,24 +1018,29 @@ export default class Tracker {
957
1018
  const event = buildViewErrorEvent(input, dependencies);
958
1019
  const result = this.sendTpaasEvent(event);
959
1020
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
960
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
961
- const leaveErrorCallback = (leave) => {
962
- this.trackLeaveError({
1021
+ const leaveErrorCallback = async (leave) => {
1022
+ await this.trackLeaveError({
963
1023
  leave,
964
1024
  ...input,
965
1025
  });
966
1026
  };
967
1027
  addTpaasLeaveTracking({
968
- objectElement,
969
- pageElement,
970
- heightBuilder,
971
- objectResizable,
1028
+ ...options.leaveTracking,
972
1029
  schema: LeaveError.object.objectType,
973
1030
  trackMethod: leaveErrorCallback,
974
1031
  });
975
1032
  }
976
1033
  return result;
977
1034
  }
1035
+ /**
1036
+ * @param input
1037
+ * @category TPaaS Tracking
1038
+ */
1039
+ async trackImpressionAdSlot(input) {
1040
+ const dependencies = await this.prepareTpaasEvent();
1041
+ const event = buildImpressionAdSlotEvent(input, dependencies);
1042
+ return this.sendTpaasEvent(event);
1043
+ }
978
1044
  /**
979
1045
  * @param input
980
1046
  * @category TPaaS Tracking
@@ -1032,18 +1098,14 @@ export default class Tracker {
1032
1098
  const event = buildViewFrontpageEvent(input, dependencies);
1033
1099
  const result = this.sendTpaasEvent(event);
1034
1100
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
1035
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1036
- const leaveFrontpageCallback = (leave) => {
1037
- this.trackLeaveFrontpage({
1101
+ const leaveFrontpageCallback = async (leave) => {
1102
+ await this.trackLeaveFrontpage({
1038
1103
  leave,
1039
1104
  ...input,
1040
1105
  });
1041
1106
  };
1042
1107
  addTpaasLeaveTracking({
1043
- objectElement,
1044
- pageElement,
1045
- objectResizable,
1046
- heightBuilder,
1108
+ ...options.leaveTracking,
1047
1109
  schema: LeaveFrontpage.object.objectType,
1048
1110
  trackMethod: leaveFrontpageCallback,
1049
1111
  });
@@ -1057,23 +1119,19 @@ export default class Tracker {
1057
1119
  */
1058
1120
  async trackViewLandingpage(input, options) {
1059
1121
  this.newPageView(); // Reset the page view ID if it is not set, to ensure a new page view is tracked
1060
- this.setCurrentPage(input.object.objectId, 'LandingPage' /* TODO: ViewLandingpage.object.type once the schema is fixed */);
1122
+ this.setCurrentPage(input.object.objectId, ViewLandingpage.object.objectType);
1061
1123
  const dependencies = await this.prepareTpaasEvent();
1062
1124
  const event = buildViewLandingpageEvent(input, dependencies);
1063
1125
  const result = this.sendTpaasEvent(event);
1064
1126
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
1065
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1066
- const leaveLandingpageCallback = (leave) => {
1067
- this.trackLeaveLandingpage({
1127
+ const leaveLandingpageCallback = async (leave) => {
1128
+ await this.trackLeaveLandingpage({
1068
1129
  leave,
1069
1130
  ...input,
1070
1131
  });
1071
1132
  };
1072
1133
  addTpaasLeaveTracking({
1073
- objectElement,
1074
- pageElement,
1075
- heightBuilder,
1076
- objectResizable,
1134
+ ...options.leaveTracking,
1077
1135
  schema: LeaveLandingpage.object.objectType,
1078
1136
  trackMethod: leaveLandingpageCallback,
1079
1137
  });
@@ -1092,18 +1150,14 @@ export default class Tracker {
1092
1150
  const event = buildViewListingEvent(input, dependencies);
1093
1151
  const result = this.sendTpaasEvent(event);
1094
1152
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
1095
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1096
- const leaveListingCallback = (leave) => {
1097
- this.trackLeaveListing({
1153
+ const leaveListingCallback = async (leave) => {
1154
+ await this.trackLeaveListing({
1098
1155
  leave,
1099
1156
  ...input,
1100
1157
  });
1101
1158
  };
1102
1159
  addTpaasLeaveTracking({
1103
- objectElement,
1104
- pageElement,
1105
- heightBuilder,
1106
- objectResizable,
1160
+ ...options.leaveTracking,
1107
1161
  schema: LeaveListing.object.objectType,
1108
1162
  trackMethod: leaveListingCallback,
1109
1163
  });
@@ -1122,36 +1176,20 @@ export default class Tracker {
1122
1176
  const event = buildViewLockedArticleEvent(input, dependencies);
1123
1177
  const result = this.sendTpaasEvent(event);
1124
1178
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
1125
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1126
- const leaveLockedArticleCallback = (leave) => {
1127
- this.trackLeaveLockedArticle({
1179
+ const leaveLockedArticleCallback = async (leave) => {
1180
+ await this.trackLeaveLockedArticle({
1128
1181
  leave,
1129
1182
  ...input,
1130
1183
  });
1131
1184
  };
1132
1185
  addTpaasLeaveTracking({
1133
- objectElement,
1134
- pageElement,
1135
- objectResizable,
1136
- heightBuilder,
1186
+ ...options.leaveTracking,
1137
1187
  schema: LeaveLockedArticle.object.objectType,
1138
1188
  trackMethod: leaveLockedArticleCallback,
1139
1189
  });
1140
1190
  }
1141
1191
  return result;
1142
1192
  }
1143
- /**
1144
- * @param input
1145
- * @param options
1146
- * @category TPaaS Tracking
1147
- */
1148
- async trackViewLockedAudio(input) {
1149
- // despite the View event type, this is not a page view event, but rather a media object view event
1150
- // so we shouldn't reset the page view ID here or enable leave tracking
1151
- const dependencies = await this.prepareTpaasEvent();
1152
- const event = buildViewLockedAudioEvent(input, dependencies);
1153
- return this.sendTpaasEvent(event);
1154
- }
1155
1193
  /**
1156
1194
  * @param input
1157
1195
  * @param options
@@ -1159,40 +1197,25 @@ export default class Tracker {
1159
1197
  */
1160
1198
  async trackViewLockedAudioPage(input, options) {
1161
1199
  this.newPageView();
1162
- this.setCurrentPage(input.object.objectId, 'Audio'); // ViewLockedAudioPage.object.objectType is AudioPage, which is not allowed as a pageType
1200
+ this.setCurrentPage(input.object.objectId, ViewLockedAudioPage.object.objectType);
1163
1201
  const dependencies = await this.prepareTpaasEvent();
1164
1202
  const event = buildViewLockedAudioPageEvent(input, dependencies);
1165
1203
  const result = this.sendTpaasEvent(event);
1166
1204
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
1167
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1168
- const leaveLockedAudioPageCallback = (leave) => {
1169
- this.trackLeaveLockedAudioPage({
1205
+ const leaveLockedAudioPageCallback = async (leave) => {
1206
+ await this.trackLeaveLockedAudioPage({
1170
1207
  leave,
1171
1208
  ...input,
1172
1209
  });
1173
1210
  };
1174
1211
  addTpaasLeaveTracking({
1175
- objectElement,
1176
- pageElement,
1177
- heightBuilder,
1178
- objectResizable,
1212
+ ...options.leaveTracking,
1179
1213
  schema: LeaveLockedAudioPage.object.objectType,
1180
1214
  trackMethod: leaveLockedAudioPageCallback,
1181
1215
  });
1182
1216
  }
1183
1217
  return result;
1184
1218
  }
1185
- /**
1186
- * @param input
1187
- * @category TPaaS Tracking
1188
- */
1189
- async trackViewLockedVideo(input) {
1190
- // despite the name, this is not a page-level event. trackViewLockedVideoPage is a page-level event
1191
- // as such, we don't support (yet) automatic leave event enabling
1192
- const dependencies = await this.prepareTpaasEvent();
1193
- const event = buildViewLockedVideoEvent(input, dependencies);
1194
- return this.sendTpaasEvent(event);
1195
- }
1196
1219
  /**
1197
1220
  * @param input
1198
1221
  * @param options
@@ -1200,40 +1223,25 @@ export default class Tracker {
1200
1223
  */
1201
1224
  async trackViewLockedVideoPage(input, options) {
1202
1225
  this.newPageView(); // Reset the page view ID if it is not set, to ensure a new page view is tracked
1203
- this.setCurrentPage(input.object.objectId, ViewLockedVideo.object.objectType);
1226
+ this.setCurrentPage(input.object.objectId, ViewLockedVideoPage.object.objectType);
1204
1227
  const dependencies = await this.prepareTpaasEvent();
1205
1228
  const event = buildViewLockedVideoPageEvent(input, dependencies);
1206
1229
  const result = this.sendTpaasEvent(event);
1207
1230
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
1208
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1209
- const leaveLockedVideoPageCallback = (leave) => {
1210
- this.trackLeaveLockedVideoPage({
1231
+ const leaveLockedVideoPageCallback = async (leave) => {
1232
+ await this.trackLeaveLockedVideoPage({
1211
1233
  leave,
1212
1234
  ...input,
1213
1235
  });
1214
1236
  };
1215
1237
  addTpaasLeaveTracking({
1216
- objectElement,
1217
- pageElement,
1218
- heightBuilder,
1219
- objectResizable,
1238
+ ...options.leaveTracking,
1220
1239
  schema: LeaveLockedVideoPage.object.objectType,
1221
1240
  trackMethod: leaveLockedVideoPageCallback,
1222
1241
  });
1223
1242
  }
1224
1243
  return result;
1225
1244
  }
1226
- /**
1227
- * @param input
1228
- * @category TPaaS Tracking
1229
- */
1230
- async trackViewVideo(input) {
1231
- // despite the View event type, this is not a page view event, but rather a media object view event
1232
- // so we shouldn't reset the page view ID here or enable leave tracking
1233
- const dependencies = await this.prepareTpaasEvent();
1234
- const event = buildViewVideoEvent(input, dependencies);
1235
- return this.sendTpaasEvent(event);
1236
- }
1237
1245
  /**
1238
1246
  * Tracks a View VideoPage event and automatically fires a Leave VideoPage event when the user
1239
1247
  * navigates away.
@@ -1278,15 +1286,15 @@ export default class Tracker {
1278
1286
  */
1279
1287
  async trackViewVideoPage(input, options) {
1280
1288
  this.newPageView(); // Reset the page view ID if it is not set, to ensure a new page view is tracked
1281
- this.setCurrentPage(input.object.objectId, 'Video'); // ViewVideoPage.object.type is VideoPage, which is not allowed as a pageType
1289
+ this.setCurrentPage(input.object.objectId, ViewVideoPage.object.objectType);
1282
1290
  const dependencies = await this.prepareTpaasEvent();
1283
1291
  const event = buildViewVideoPageEvent(input, dependencies);
1284
1292
  const result = this.sendTpaasEvent(event);
1285
1293
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
1286
- const { objectElement, pageElement, heightBuilder, objectResizable, leaveStoriesBuilder } = options.leaveTracking;
1287
- const leaveVideoCallback = (leave) => {
1294
+ const { leaveStoriesBuilder, ...restLeaveTrackingOptions } = options.leaveTracking;
1295
+ const leaveVideoCallback = async (leave) => {
1288
1296
  const leaveStoriesInput = leaveStoriesBuilder?.();
1289
- this.trackLeaveVideoPage({
1297
+ await this.trackLeaveVideoPage({
1290
1298
  leave,
1291
1299
  leaveStories: leaveStoriesInput && {
1292
1300
  ...leaveStoriesInput,
@@ -1297,10 +1305,7 @@ export default class Tracker {
1297
1305
  });
1298
1306
  };
1299
1307
  addTpaasLeaveTracking({
1300
- objectElement,
1301
- pageElement,
1302
- heightBuilder,
1303
- objectResizable,
1308
+ ...restLeaveTrackingOptions,
1304
1309
  schema: LeaveVideoPage.object.objectType,
1305
1310
  trackMethod: leaveVideoCallback,
1306
1311
  });
@@ -1314,23 +1319,19 @@ export default class Tracker {
1314
1319
  */
1315
1320
  async trackViewWeather(input, options) {
1316
1321
  this.newPageView(); // Reset the page view ID if it is not set, to ensure a new page view is tracked
1317
- this.setCurrentPage(input.object.objectId, 'Page' /* TODO: ViewWeather.object.type once the schema is fixed */);
1322
+ this.setCurrentPage(input.object.objectId, ViewWeather.object.objectType);
1318
1323
  const dependencies = await this.prepareTpaasEvent();
1319
1324
  const event = buildViewWeatherEvent(input, dependencies);
1320
1325
  const result = this.sendTpaasEvent(event);
1321
1326
  if (shouldEnableLeaveTracking(options.leaveTracking)) {
1322
- const { objectElement, pageElement, heightBuilder, objectResizable } = options.leaveTracking;
1323
- const leaveWeatherCallback = (leave) => {
1324
- this.trackLeaveWeather({
1327
+ const leaveWeatherCallback = async (leave) => {
1328
+ await this.trackLeaveWeather({
1325
1329
  leave,
1326
1330
  ...input,
1327
1331
  });
1328
1332
  };
1329
1333
  addTpaasLeaveTracking({
1330
- objectElement,
1331
- pageElement,
1332
- heightBuilder,
1333
- objectResizable,
1334
+ ...options.leaveTracking,
1334
1335
  schema: LeaveWeather.object.objectType,
1335
1336
  trackMethod: leaveWeatherCallback,
1336
1337
  });
@@ -1400,15 +1401,6 @@ export default class Tracker {
1400
1401
  const event = buildLeaveLockedArticleEvent(input, dependencies);
1401
1402
  return this.sendTpaasEvent(event);
1402
1403
  }
1403
- /**
1404
- * @param input
1405
- * @category TPaaS Tracking
1406
- */
1407
- async trackLeaveLockedAudio(input) {
1408
- const dependencies = await this.prepareTpaasEvent();
1409
- const event = buildLeaveLockedAudioEvent(input, dependencies);
1410
- return this.sendTpaasEvent(event);
1411
- }
1412
1404
  /**
1413
1405
  * @param input
1414
1406
  * @category TPaaS Tracking
@@ -1422,27 +1414,27 @@ export default class Tracker {
1422
1414
  * @param input
1423
1415
  * @category TPaaS Tracking
1424
1416
  */
1425
- async trackLeaveLockedVideo(input) {
1417
+ async trackLeaveLockedVideoPage(input) {
1426
1418
  const dependencies = await this.prepareTpaasEvent();
1427
- const event = buildLeaveLockedVideoEvent(input, dependencies);
1419
+ const event = buildLeaveLockedVideoPageEvent(input, dependencies);
1428
1420
  return this.sendTpaasEvent(event);
1429
1421
  }
1430
1422
  /**
1431
1423
  * @param input
1432
1424
  * @category TPaaS Tracking
1433
1425
  */
1434
- async trackLeaveLockedVideoPage(input) {
1426
+ async trackLeavePage(input) {
1435
1427
  const dependencies = await this.prepareTpaasEvent();
1436
- const event = buildLeaveLockedVideoPageEvent(input, dependencies);
1428
+ const event = buildLeavePageEvent(input, dependencies);
1437
1429
  return this.sendTpaasEvent(event);
1438
1430
  }
1439
1431
  /**
1440
1432
  * @param input
1441
1433
  * @category TPaaS Tracking
1442
1434
  */
1443
- async trackLeavePage(input) {
1435
+ async trackLeaveSportsPage(input) {
1444
1436
  const dependencies = await this.prepareTpaasEvent();
1445
- const event = buildLeavePageEvent(input, dependencies);
1437
+ const event = buildLeaveSportsPageEvent(input, dependencies);
1446
1438
  return this.sendTpaasEvent(event);
1447
1439
  }
1448
1440
  /**
@@ -2178,8 +2170,8 @@ export default class Tracker {
2178
2170
  * with the added guarantee that a second Leave event will not be triggered if one already has been sent.
2179
2171
  * @category TPaaS Leave Tracking
2180
2172
  */
2181
- trackTpaasActiveLeave() {
2182
- trackTpaasActiveLeave();
2173
+ async trackTpaasActiveLeave() {
2174
+ await trackTpaasActiveLeave();
2183
2175
  }
2184
2176
  /**
2185
2177
  * Check if leave tracking is enabled (if an event will be sent when the user leaves the page)