@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.
- package/dist/cjs/Tracker.js +201 -209
- package/dist/cjs/Tracker.test-d.js +2 -2
- package/dist/cjs/builders/actor.js +3 -3
- package/dist/cjs/builders/consents.js +2 -2
- package/dist/cjs/builders/events-anonymous-node.js +1 -1
- package/dist/cjs/builders/events-node.js +3 -3
- package/dist/cjs/builders/experiments.js +1 -0
- package/dist/cjs/builders/tracker-node.js +2 -5
- package/dist/cjs/identity/actor.js +18 -6
- package/dist/cjs/identity/cis.js +4 -6
- package/dist/cjs/leaveTrackingTpaas/constants.js +2 -7
- package/dist/cjs/leaveTrackingTpaas/index.js +52 -40
- package/dist/cjs/tracker-proxy/consts.js +12 -6
- package/dist/cjs/tracker-proxy/proxy-provider.js +6 -0
- package/dist/cjs/version.js +5 -0
- package/dist/cjs/visibility-observer/index.js +9 -7
- package/dist/cjs/wrapper/types/event.js +5 -0
- package/dist/ejs/Tracker.js +203 -211
- package/dist/ejs/Tracker.test-d.js +2 -2
- package/dist/ejs/builders/actor.js +2 -2
- package/dist/ejs/builders/consents.js +2 -2
- package/dist/ejs/builders/events-anonymous-node.js +1 -1
- package/dist/ejs/builders/events-node.js +3 -3
- package/dist/ejs/builders/experiments.js +1 -1
- package/dist/ejs/builders/tracker-node.js +2 -2
- package/dist/ejs/identity/actor.js +19 -7
- package/dist/ejs/identity/cis.js +4 -3
- package/dist/ejs/leaveTrackingTpaas/constants.js +1 -5
- package/dist/ejs/leaveTrackingTpaas/index.js +53 -41
- package/dist/ejs/tracker-proxy/consts.js +12 -6
- package/dist/ejs/tracker-proxy/proxy-provider.js +6 -0
- package/dist/ejs/version.js +2 -0
- package/dist/ejs/visibility-observer/index.js +9 -7
- package/dist/ejs/wrapper/types/event.js +4 -1
- package/dist/types/Tracker.d.ts +92 -87
- package/dist/types/builders/actor.d.ts +3 -2
- package/dist/types/builders/consents.d.ts +2 -2
- package/dist/types/builders/experiments.d.ts +1 -0
- package/dist/types/builders/index.d.ts +1 -1
- package/dist/types/identity/actor.d.ts +2 -2
- package/dist/types/identity/cis.d.ts +1 -1
- package/dist/types/index.d.ts +1 -2
- package/dist/types/leaveTrackingTpaas/constants.d.ts +1 -5
- package/dist/types/leaveTrackingTpaas/index.d.ts +6 -6
- package/dist/types/leaveTrackingTpaas/types.d.ts +1 -9
- package/dist/types/tracker-proxy/consts.d.ts +1 -1
- package/dist/types/types.d.ts +19 -13
- package/dist/types/version.d.ts +1 -0
- package/dist/types/visibility-observer/index.d.ts +6 -1
- package/dist/types/wrapper/engagement/ui-element/types.d.ts +1 -0
- package/dist/types/wrapper/types/event.d.ts +3 -1
- package/dist/types/wrapper/view/ui-element/types.d.ts +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.d.ts +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.js +17 -3
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.js.map +1 -1
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.d.ts +4 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.js +15 -5
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.js.map +1 -1
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.d.ts +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.js +5 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.js.map +1 -1
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.d.ts +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.js +16 -2
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.js.map +1 -1
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.d.ts +4 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.js +12 -3
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.js.map +1 -1
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.d.ts +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.js +5 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.js.map +1 -1
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/cis-browser.d.ts +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/storage/pulseStorage.d.ts +4 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/storage/storage.d.ts +1 -0
- package/node_modules/@schibsted/pulse-utils/package.json +1 -1
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/catalogVersion.js +9 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/device.js +8 -2
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/provider.js +3 -1
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/session.js +19 -6
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders.js +75 -76
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/guards.js +7 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/index.js +3 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/catalogVersion.js +6 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/device.js +8 -2
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/provider.js +3 -1
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/session.js +19 -6
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders.js +74 -71
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/guards.js +4 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/index.js +1 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/index.d.ts +1730 -1127
- package/node_modules/@schibsted/tpaas-event-builder/package.json +3 -2
- package/node_modules/@schibsted/tpaas-schemas/dist/cjs/constants.js +136 -103
- package/node_modules/@schibsted/tpaas-schemas/dist/cjs/index.js +1 -0
- package/node_modules/@schibsted/tpaas-schemas/dist/cjs/types.js +2 -0
- package/node_modules/@schibsted/tpaas-schemas/dist/ejs/constants.js +134 -101
- package/node_modules/@schibsted/tpaas-schemas/dist/ejs/index.js +1 -0
- package/node_modules/@schibsted/tpaas-schemas/dist/ejs/types.js +1 -0
- package/node_modules/@schibsted/tpaas-schemas/dist/index.d.ts +1940 -1266
- package/node_modules/@schibsted/tpaas-schemas/package.json +1 -1
- package/package.json +7 -6
- package/dist/cjs/version.json +0 -1
- package/dist/ejs/version.json +0 -1
package/dist/ejs/Tracker.js
CHANGED
|
@@ -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,
|
|
4
|
-
import { LeaveArticle, LeaveAudioPage, LeaveError, LeaveFrontpage, LeaveLandingpage, LeaveListing, LeaveLockedArticle, LeaveLockedAudioPage, LeaveLockedVideoPage, LeavePage, LeaveVideoPage, LeaveWeather, ViewArticle, ViewError, ViewFrontpage, ViewListing, ViewLockedArticle,
|
|
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
|
|
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
|
-
|
|
136
|
-
|
|
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:
|
|
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.
|
|
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
|
-
|
|
156
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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.
|
|
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.
|
|
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,
|
|
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
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
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
|
-
|
|
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
|
|
783
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
870
|
+
this.setCurrentPage(input.object.objectId, ViewSportsPage.object.objectType);
|
|
807
871
|
const dependencies = await this.prepareTpaasEvent();
|
|
808
|
-
const event =
|
|
809
|
-
|
|
810
|
-
|
|
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
|
|
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 =
|
|
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
|
|
905
|
+
async trackImpressionWidget(input) {
|
|
826
906
|
const dependencies = await this.prepareTpaasEvent();
|
|
827
|
-
const event =
|
|
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
|
|
843
|
-
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
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
|
|
961
|
-
|
|
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
|
-
|
|
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
|
|
1036
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
1066
|
-
|
|
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
|
-
|
|
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
|
|
1096
|
-
|
|
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
|
-
|
|
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
|
|
1126
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
1168
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
1209
|
-
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
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,
|
|
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
|
|
1323
|
-
|
|
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
|
-
|
|
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
|
|
1417
|
+
async trackLeaveLockedVideoPage(input) {
|
|
1426
1418
|
const dependencies = await this.prepareTpaasEvent();
|
|
1427
|
-
const event =
|
|
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
|
|
1426
|
+
async trackLeavePage(input) {
|
|
1435
1427
|
const dependencies = await this.prepareTpaasEvent();
|
|
1436
|
-
const event =
|
|
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
|
|
1435
|
+
async trackLeaveSportsPage(input) {
|
|
1444
1436
|
const dependencies = await this.prepareTpaasEvent();
|
|
1445
|
-
const event =
|
|
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)
|