@schibsted/pulse-sdk 8.0.0-rc.12 → 8.0.0-rc.14

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 (62) hide show
  1. package/dist/cjs/Tracker.js +31 -1
  2. package/dist/cjs/leaveTrackingTpaas/index.js +18 -6
  3. package/dist/cjs/tpaas-builders/builders/device.js +1 -1
  4. package/dist/cjs/tpaas-builders/builders/trackerBuilder.js +2 -1
  5. package/dist/cjs/tpaas-builders/builders.js +10 -6
  6. package/dist/cjs/tpaas-schemas/constants.js +68 -51
  7. package/dist/cjs/version.js +1 -1
  8. package/dist/ejs/Tracker.js +32 -2
  9. package/dist/ejs/leaveTrackingTpaas/index.js +18 -6
  10. package/dist/ejs/tpaas-builders/builders/device.js +1 -1
  11. package/dist/ejs/tpaas-builders/builders/trackerBuilder.js +2 -1
  12. package/dist/ejs/tpaas-builders/builders.js +10 -7
  13. package/dist/ejs/tpaas-schemas/constants.js +66 -49
  14. package/dist/ejs/version.js +1 -1
  15. package/dist/types/Tracker.d.ts +14 -1
  16. package/dist/types/builders/consents.d.ts +2 -2
  17. package/dist/types/builders/device-node.d.ts +2 -2
  18. package/dist/types/builders/events-anonymous-node.d.ts +4 -4
  19. package/dist/types/builders/events-node.d.ts +5 -5
  20. package/dist/types/builders/objects/objects-anonymous-node.d.ts +1 -1
  21. package/dist/types/builders/objects/objects-node.d.ts +1 -1
  22. package/dist/types/builders/origin-node.d.ts +1 -1
  23. package/dist/types/cis-sync/storage/pulseStorage.d.ts +8 -4
  24. package/dist/types/config.d.ts +1 -1
  25. package/dist/types/tpaas-builders/builders/device.d.ts +1 -1
  26. package/dist/types/tpaas-builders/builders/experiments.d.ts +1 -1
  27. package/dist/types/tpaas-builders/builders/navigationType.d.ts +2 -2
  28. package/dist/types/tpaas-builders/builders/pageviewId.d.ts +1 -1
  29. package/dist/types/tpaas-builders/builders/trackerBuilder.d.ts +1 -1
  30. package/dist/types/tpaas-builders/builders/user.d.ts +1 -1
  31. package/dist/types/tpaas-builders/builders.d.ts +41 -39
  32. package/dist/types/tpaas-builders/index.d.ts +1 -1
  33. package/dist/types/tpaas-builders/types.d.ts +2 -0
  34. package/dist/types/tpaas-schemas/constants.d.ts +182 -174
  35. package/dist/types/tpaas-schemas/types/ITpaasEvent.d.ts +2 -0
  36. package/dist/types/tpaas-schemas/types/schemas/IEngagementAudio.d.ts +0 -6
  37. package/dist/types/tpaas-schemas/types/schemas/IEngagementTeaser.d.ts +9 -0
  38. package/dist/types/tpaas-schemas/types/schemas/IEngagementTvModule.d.ts +130 -0
  39. package/dist/types/tpaas-schemas/types/schemas/IEngagementUIElement.d.ts +4 -0
  40. package/dist/types/tpaas-schemas/types/schemas/IEngagementVideo.d.ts +1 -7
  41. package/dist/types/tpaas-schemas/types/schemas/IImpressionForm.d.ts +2 -2
  42. package/dist/types/tpaas-schemas/types/schemas/IImpressionTeaser.d.ts +9 -0
  43. package/dist/types/tpaas-schemas/types/schemas/ILeaveArticle.d.ts +1 -1
  44. package/dist/types/tpaas-schemas/types/schemas/ILeaveAudioPage.d.ts +1 -1
  45. package/dist/types/tpaas-schemas/types/schemas/ILeaveFrontpage.d.ts +1 -1
  46. package/dist/types/tpaas-schemas/types/schemas/ILeaveLockedArticle.d.ts +1 -1
  47. package/dist/types/tpaas-schemas/types/schemas/ILeaveVideoPage.d.ts +1 -1
  48. package/dist/types/tpaas-schemas/types/schemas/IViewArticle.d.ts +1 -1
  49. package/dist/types/tpaas-schemas/types/schemas/IViewAudioPage.d.ts +1 -1
  50. package/dist/types/tpaas-schemas/types/schemas/IViewFrontpage.d.ts +1 -1
  51. package/dist/types/tpaas-schemas/types/schemas/IViewLockedArticle.d.ts +1 -1
  52. package/dist/types/tpaas-schemas/types/schemas/IViewVideoPage.d.ts +1 -1
  53. package/dist/types/tpaas-schemas/types/schemas/index.d.ts +1 -0
  54. package/dist/types/tpaas-schemas/types/templates/IDevice.d.ts +1 -1
  55. package/dist/types/tpaas-schemas/types/templates/IProvider.d.ts +1 -1
  56. package/dist/types/tpaas-schemas/types/templates/ISports.d.ts +40 -31
  57. package/dist/types/tpaas-schemas/types/templates/ITracker.d.ts +4 -0
  58. package/dist/types/tpaas-schemas/types.d.ts +3 -3
  59. package/dist/types/tracker-proxy/consts.d.ts +2 -2
  60. package/dist/types/version.d.ts +1 -1
  61. package/dist/types/wrapper/types/event.d.ts +1 -1
  62. package/package.json +8 -7
@@ -114,6 +114,17 @@ const anonymousEvents = {
114
114
  function getAnonymousEventBuilder(name) {
115
115
  return name in anonymousEvents ? anonymousEvents[name] : anonymousEvents.trackerEvent;
116
116
  }
117
+ // This looks overkill, but a mapping feels safer than doing string operations (capitalize) with javascript
118
+ const mapDeployStageToTpaasStage = (deployStage) => {
119
+ switch (deployStage) {
120
+ case 'dev':
121
+ return 'Dev';
122
+ case 'pre':
123
+ return 'Pre';
124
+ case 'pro':
125
+ return 'Pro';
126
+ }
127
+ };
117
128
  /**
118
129
  * Determines if the SDK is running in a Hybrid (WebView) environment.
119
130
  *
@@ -291,6 +302,8 @@ class Tracker {
291
302
  tpaasCollectorBaseUrl: config_browser_1.collectorEndpoints[deployStageTpaas],
292
303
  trackerId: (0, uuid_1.v4)(),
293
304
  vendors: config?.vendors?.length ? [] : ['xandr'],
305
+ useBeacon: true,
306
+ useBeaconWhenAvailable: true,
294
307
  }, config);
295
308
  // Move to default config?
296
309
  this.builders = (0, utils_1.pulseMerge)({}, builders, {
@@ -522,6 +535,7 @@ class Tracker {
522
535
  providerGroup: this.state.provider?.group,
523
536
  component: this.state.component,
524
537
  componentVersion: this.state.componentVersion,
538
+ routingStage: mapDeployStageToTpaasStage(this.state.deployStageTpaas),
525
539
  experiments,
526
540
  currentPageReferrer,
527
541
  };
@@ -606,6 +620,7 @@ class Tracker {
606
620
  component: this.state.component,
607
621
  componentVersion: this.state.componentVersion,
608
622
  pageviewId: this.state.pageViewId,
623
+ routingStage: mapDeployStageToTpaasStage(this.state.deployStageTpaas),
609
624
  currentPage,
610
625
  currentPageReferrer,
611
626
  experiments,
@@ -1556,6 +1571,15 @@ class Tracker {
1556
1571
  const event = (0, tpaas_builders_1.buildEngagementTeaserEvent)(input, dependencies);
1557
1572
  return this.sendTpaasEvent(event);
1558
1573
  }
1574
+ /**
1575
+ * @param input
1576
+ * @category TPaaS Tracking
1577
+ */
1578
+ async trackEngagementTvModule(input) {
1579
+ const dependencies = await this.prepareTpaasEvent();
1580
+ const event = (0, tpaas_builders_1.buildEngagementTvModuleEvent)(input, dependencies);
1581
+ return this.sendTpaasEvent(event);
1582
+ }
1559
1583
  /**
1560
1584
  * @param input
1561
1585
  * @category TPaaS Tracking
@@ -2330,12 +2354,18 @@ class Tracker {
2330
2354
  async prepareQueuesAndSend(eventQueue, retryEventQueue) {
2331
2355
  const promisesToBeSent = eventQueue.splice(0);
2332
2356
  const eventsToBeSent = promisesToBeSent.map((p) => p.inputValue);
2333
- const eventsToRetry = retryEventQueue;
2357
+ const eventsToRetry = retryEventQueue.splice(0);
2334
2358
  eventQueue.length = 0;
2335
2359
  retryEventQueue.length = 0;
2336
2360
  const evaluatedEvents = await Promise.all(eventsToBeSent);
2337
2361
  const url = this._getCollectorPath();
2338
2362
  const data = [...evaluatedEvents, ...eventsToRetry];
2363
+ // in some cases, _sendImmediately executes an asynchronous operation (cisSync) after checking for empty array
2364
+ // due to that, it's still possible for this function to be called with an empty array, so we need to check for that again before sending
2365
+ // in order to avoid making an empty request to collector
2366
+ if (data.length === 0) {
2367
+ return [];
2368
+ }
2339
2369
  // biome-ignore lint/suspicious/noExplicitAny: -
2340
2370
  async function onFailedSend(response) {
2341
2371
  // We retry an event once, but discard already retried events
@@ -57,7 +57,8 @@ let activityListeners = [];
57
57
  let resizeObserver = null;
58
58
  let throttledUpdateFn = (0, utils_1.throttle)(() => undefined, 0);
59
59
  let durationStartTime = 0;
60
- let activityStartTime = 0;
60
+ let previousActivityTime = 0;
61
+ let activityDurationMs = 0;
61
62
  let currentLeaveEvent = (0, constants_1.DEFAULT_PAGE_LEAVE_EVENT)();
62
63
  let additionalHeightBuilder;
63
64
  /**
@@ -90,8 +91,9 @@ function addTpaasLeaveTracking({ objectElement, pageElement, schema, objectResiz
90
91
  additionalHeightBuilder = heightBuilder;
91
92
  addTpaasLeaveListeners();
92
93
  addUpdateEventListeners(objectDomElement, pageDomElement, objectResizable);
93
- activityStartTime = resetTime();
94
+ previousActivityTime = resetTime();
94
95
  durationStartTime = resetTime();
96
+ activityDurationMs = 0;
95
97
  currentLeaveSchema = schema;
96
98
  currentTrackMethod = trackMethod;
97
99
  logger.debug('addLeaveTracking:after:state', currentLeaveEvent);
@@ -184,7 +186,8 @@ function removeUpdateEventListeners() {
184
186
  const resetEventDefaults = () => {
185
187
  currentLeaveEvent = (0, constants_1.DEFAULT_PAGE_LEAVE_EVENT)();
186
188
  durationStartTime = resetTime();
187
- activityStartTime = resetTime();
189
+ previousActivityTime = resetTime();
190
+ activityDurationMs = 0;
188
191
  };
189
192
  const resetTpaasViewedContent = () => {
190
193
  currentLeaveEvent = (0, constants_1.DEFAULT_PAGE_LEAVE_EVENT)();
@@ -223,11 +226,13 @@ function getTpaasLeaveObject() {
223
226
  const endTime = Date.now();
224
227
  // TPaaS leave event requires duration/activity to be at least 1ms, otherwise the event is rejected
225
228
  // also, in practice, it's almost impossible to have an activity or duration of 0ms
229
+ // We don't call increaseActivityDuration here because it's possible to call getTpaasLeaveObject multiple times
230
+ // without any activity events in between, which would incorrectly increase the activity duration.
226
231
  const durationMs = Math.max(endTime - durationStartTime, 1);
227
- const activityDurationMs = Math.max(Math.min(endTime - activityStartTime, constants_1.ACTIVITY_DURATION_LIMIT_MS), 1);
232
+ const lastActivityDuration = calculateActivityGap(endTime);
228
233
  const leave = {
229
234
  durationMs,
230
- activityDurationMs,
235
+ activityDurationMs: Math.max(activityDurationMs + lastActivityDuration, 1),
231
236
  ...currentLeaveEvent,
232
237
  };
233
238
  logger.debug('trackTpaasLeave: event', leave);
@@ -314,9 +319,16 @@ function addUpdateActivityDurationListeners() {
314
319
  types_1.BrowserEvents.TOUCHSTART,
315
320
  ];
316
321
  activityListeners = addEventListeners(activityEvents, () => {
317
- activityStartTime = resetTime();
322
+ increaseActivityDuration(Date.now());
318
323
  }, { passive: true });
319
324
  }
325
+ function calculateActivityGap(activityEndTime) {
326
+ return Math.min(activityEndTime - previousActivityTime, constants_1.ACTIVITY_DURATION_LIMIT_MS);
327
+ }
328
+ function increaseActivityDuration(activityEndTime) {
329
+ activityDurationMs += calculateActivityGap(activityEndTime);
330
+ previousActivityTime = resetTime();
331
+ }
320
332
  /*
321
333
  Add listeners to a set of browser events.
322
334
  */
@@ -139,7 +139,7 @@ function getOperatingSystem(uaParser) {
139
139
  if (osName.includes('windows')) {
140
140
  return 'Windows';
141
141
  }
142
- if (osName.includes('macos')) {
142
+ if (osName.includes('macos') || osName.includes('mac os')) {
143
143
  return 'Mac';
144
144
  }
145
145
  if (osName.includes('android')) {
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.builder = void 0;
4
- const builder = (autoTrackerVersion, isHybrid, version) => {
4
+ const builder = ({ autoTrackerVersion, isHybrid, routingStage, version, }) => {
5
5
  return {
6
6
  tracker: {
7
7
  autoTrackerVersion,
8
8
  isAutoTracker: !!autoTrackerVersion,
9
9
  isHybrid,
10
+ routingStage,
10
11
  trackerType: 'JS',
11
12
  version,
12
13
  },
@@ -33,6 +33,7 @@ exports.buildEngagementAudioEvent = buildEngagementAudioEvent;
33
33
  exports.buildEngagementFormEvent = buildEngagementFormEvent;
34
34
  exports.buildEngagementOfferEvent = buildEngagementOfferEvent;
35
35
  exports.buildEngagementTeaserEvent = buildEngagementTeaserEvent;
36
+ exports.buildEngagementTvModuleEvent = buildEngagementTvModuleEvent;
36
37
  exports.buildEngagementUIElementEvent = buildEngagementUIElementEvent;
37
38
  exports.buildEngagementVideoEvent = buildEngagementVideoEvent;
38
39
  exports.buildEngagementVideoAdEvent = buildEngagementVideoAdEvent;
@@ -73,9 +74,9 @@ const utm_1 = require("./builders/utm");
73
74
  * @private
74
75
  */
75
76
  const getCommonBuildersOutput = (createdAt, dependencies, input) => {
76
- const { autoTrackerVersion, isHybrid, version, environmentId, jwe, user, consents, providerId, providerName, providerGroup, component, componentVersion, pageviewId, currentPage, currentPageReferrer, } = dependencies;
77
+ const { autoTrackerVersion, isHybrid, version, environmentId, jwe, user, consents, providerId, providerName, providerGroup, component, componentVersion, pageviewId, currentPage, currentPageReferrer, routingStage, } = dependencies;
77
78
  const { experiments } = input;
78
- return (0, ts_deepmerge_1.merge)((0, trackerBuilder_1.builder)(autoTrackerVersion, isHybrid, version), (0, time_1.builder)(createdAt), (0, session_1.builder)(createdAt), (0, device_1.builder)(environmentId, jwe), (0, user_1.builder)(user), (0, baseEvent_1.builder)(), (0, consents_1.builder)(consents), (0, provider_1.builder)(providerId, component, componentVersion, providerName, providerGroup), (0, pageInfo_1.builder)(currentPage), (0, pageviewId_1.builder)(pageviewId), (0, utm_1.builder)(), (0, referrer_1.builder)(currentPageReferrer), (0, catalogVersion_1.builder)(), (0, experiments_1.builder)(dependencies.experiments, experiments));
79
+ return (0, ts_deepmerge_1.merge)((0, trackerBuilder_1.builder)({ autoTrackerVersion, isHybrid, version, routingStage }), (0, time_1.builder)(createdAt), (0, session_1.builder)(createdAt), (0, device_1.builder)(environmentId, jwe), (0, user_1.builder)(user), (0, baseEvent_1.builder)(), (0, consents_1.builder)(consents), (0, provider_1.builder)(providerId, component, componentVersion, providerName, providerGroup), (0, pageInfo_1.builder)(currentPage), (0, pageviewId_1.builder)(pageviewId), (0, utm_1.builder)(), (0, referrer_1.builder)(currentPageReferrer), (0, catalogVersion_1.builder)(), (0, experiments_1.builder)(dependencies.experiments, experiments));
79
80
  };
80
81
  exports.getCommonBuildersOutput = getCommonBuildersOutput;
81
82
  // there's a bug in the ts-deepmerge library that doesn't properly resolve merging optionals with required properties
@@ -107,8 +108,8 @@ const normalizePageInput = (input) => {
107
108
  // #region AnonymousView Event Builders
108
109
  function buildAnonymousViewUIElementEvent(input, dependencies) {
109
110
  const createdAt = new Date();
110
- const { autoTrackerVersion, isHybrid, version, pageviewId, providerId, providerName, providerGroup, component, componentVersion, currentPageReferrer, } = dependencies;
111
- return (0, ts_deepmerge_1.merge)(tpaas_schemas_1.AnonymousViewUIElement, (0, baseEvent_1.builder)(), (0, trackerBuilder_1.builder)(autoTrackerVersion, isHybrid, version), (0, time_1.builder)(createdAt), (0, pageviewId_1.builder)(pageviewId), (0, utm_1.builder)(), (0, anonymous_1.builder)(), (0, provider_1.builder)(providerId, component, componentVersion, providerName, providerGroup), (0, referrer_1.builder)(currentPageReferrer), (0, experiments_1.builder)(dependencies.experiments, input.experiments), (0, catalogVersion_1.builder)(), normalizePageInput(input));
111
+ const { autoTrackerVersion, isHybrid, version, pageviewId, providerId, providerName, providerGroup, component, componentVersion, currentPageReferrer, routingStage, } = dependencies;
112
+ return (0, ts_deepmerge_1.merge)(tpaas_schemas_1.AnonymousViewUIElement, (0, baseEvent_1.builder)(), (0, trackerBuilder_1.builder)({ autoTrackerVersion, isHybrid, version, routingStage }), (0, time_1.builder)(createdAt), (0, pageviewId_1.builder)(pageviewId), (0, utm_1.builder)(), (0, anonymous_1.builder)(), (0, provider_1.builder)(providerId, component, componentVersion, providerName, providerGroup), (0, referrer_1.builder)(currentPageReferrer), (0, experiments_1.builder)(dependencies.experiments, input.experiments), (0, catalogVersion_1.builder)(), normalizePageInput(input));
112
113
  }
113
114
  // #endregion
114
115
  // #region View Event Builders
@@ -194,8 +195,8 @@ function buildLeaveVideoPageEvent(input, dependencies) {
194
195
  }
195
196
  function buildLeaveWeatherEvent(input, dependencies) {
196
197
  const createdAt = new Date();
197
- const { autoTrackerVersion, isHybrid, version, providerId, providerName, providerGroup, component, componentVersion, user, experiments, } = dependencies;
198
- return (0, ts_deepmerge_1.merge)(normalizePageInput(input), tpaas_schemas_1.LeaveWeather, (0, time_1.builder)(createdAt), (0, trackerBuilder_1.builder)(autoTrackerVersion, isHybrid, version), (0, baseEvent_1.builder)(), (0, provider_1.builder)(providerId, component, componentVersion, providerName, providerGroup), (0, user_1.builder)(user), (0, experiments_1.builder)(experiments, input.experiments), (0, consents_1.builder)(dependencies.consents), (0, device_1.builder)(dependencies.environmentId, dependencies.jwe), (0, catalogVersion_1.builder)(), (0, navigationType_1.builder)(input.page?.navigationType), (0, pageviewId_1.builder)(dependencies.pageviewId), (0, pageInfo_1.builder)(dependencies.currentPage), (0, referrer_1.builder)(dependencies.currentPageReferrer));
198
+ const { autoTrackerVersion, isHybrid, version, providerId, providerName, providerGroup, component, componentVersion, user, experiments, routingStage, } = dependencies;
199
+ return (0, ts_deepmerge_1.merge)(normalizePageInput(input), tpaas_schemas_1.LeaveWeather, (0, time_1.builder)(createdAt), (0, trackerBuilder_1.builder)({ autoTrackerVersion, isHybrid, version, routingStage }), (0, baseEvent_1.builder)(), (0, provider_1.builder)(providerId, component, componentVersion, providerName, providerGroup), (0, user_1.builder)(user), (0, experiments_1.builder)(experiments, input.experiments), (0, consents_1.builder)(dependencies.consents), (0, device_1.builder)(dependencies.environmentId, dependencies.jwe), (0, catalogVersion_1.builder)(), (0, navigationType_1.builder)(input.page?.navigationType), (0, pageviewId_1.builder)(dependencies.pageviewId), (0, pageInfo_1.builder)(dependencies.currentPage), (0, referrer_1.builder)(dependencies.currentPageReferrer));
199
200
  }
200
201
  // #endregion
201
202
  // #region Engagement Event Builders
@@ -211,6 +212,9 @@ function buildEngagementOfferEvent(input, dependencies) {
211
212
  function buildEngagementTeaserEvent(input, dependencies) {
212
213
  return (0, ts_deepmerge_1.merge)(tpaas_schemas_1.EngagementTeaser, (0, exports.getCommonBuildersOutput)(new Date(), dependencies, input), normalizePageInput(input));
213
214
  }
215
+ function buildEngagementTvModuleEvent(input, dependencies) {
216
+ return (0, ts_deepmerge_1.merge)(tpaas_schemas_1.EngagementTvModule, (0, exports.getCommonBuildersOutput)(new Date(), dependencies, input), normalizePageInput(input));
217
+ }
214
218
  function buildEngagementUIElementEvent(input, dependencies) {
215
219
  return (0, ts_deepmerge_1.merge)(tpaas_schemas_1.EngagementUIElement, (0, exports.getCommonBuildersOutput)(new Date(), dependencies, input), normalizePageInput(input));
216
220
  }