@schibsted/pulse-sdk 8.0.0-rc.4 → 8.0.0-rc.6

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 (35) hide show
  1. package/dist/cjs/Tracker.js +75 -188
  2. package/dist/cjs/builders/actor.js +3 -3
  3. package/dist/cjs/identity/actor.js +18 -6
  4. package/dist/cjs/leaveTrackingTpaas/constants.js +2 -7
  5. package/dist/cjs/leaveTrackingTpaas/index.js +52 -40
  6. package/dist/cjs/tracker-proxy/consts.js +2 -7
  7. package/dist/cjs/version.js +1 -1
  8. package/dist/ejs/Tracker.js +77 -190
  9. package/dist/ejs/builders/actor.js +2 -2
  10. package/dist/ejs/identity/actor.js +19 -7
  11. package/dist/ejs/leaveTrackingTpaas/constants.js +1 -5
  12. package/dist/ejs/leaveTrackingTpaas/index.js +53 -41
  13. package/dist/ejs/tracker-proxy/consts.js +2 -7
  14. package/dist/ejs/version.js +1 -1
  15. package/dist/types/Tracker.d.ts +18 -56
  16. package/dist/types/builders/actor.d.ts +3 -2
  17. package/dist/types/identity/actor.d.ts +2 -2
  18. package/dist/types/identity/cis.d.ts +1 -1
  19. package/dist/types/index.d.ts +1 -1
  20. package/dist/types/leaveTrackingTpaas/constants.d.ts +1 -5
  21. package/dist/types/leaveTrackingTpaas/index.d.ts +6 -6
  22. package/dist/types/leaveTrackingTpaas/types.d.ts +1 -9
  23. package/dist/types/tracker-proxy/consts.d.ts +1 -1
  24. package/dist/types/types.d.ts +19 -13
  25. package/dist/types/version.d.ts +1 -1
  26. package/node_modules/@schibsted/pulse-utils/package.json +1 -1
  27. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/catalogVersion.js +9 -0
  28. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders.js +63 -78
  29. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/catalogVersion.js +6 -0
  30. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders.js +64 -72
  31. package/node_modules/@schibsted/tpaas-event-builder/dist/index.d.ts +607 -1018
  32. package/node_modules/@schibsted/tpaas-schemas/dist/cjs/constants.js +67 -109
  33. package/node_modules/@schibsted/tpaas-schemas/dist/ejs/constants.js +65 -107
  34. package/node_modules/@schibsted/tpaas-schemas/dist/index.d.ts +722 -1215
  35. package/package.json +2 -2
@@ -56,19 +56,42 @@ let updateViewedContentListeners = [];
56
56
  let activityListeners = [];
57
57
  let resizeObserver = null;
58
58
  let throttledUpdateFn = (0, pulse_utils_1.throttle)(() => undefined, 0);
59
- let startTime = 0;
60
- let activityDuration = (0, constants_1.DEFAULT_ACTIVITY_DURATION)();
59
+ let durationStartTime = 0;
60
+ let activityStartTime = 0;
61
61
  let currentLeaveEvent = (0, constants_1.DEFAULT_PAGE_LEAVE_EVENT)();
62
62
  let additionalHeightBuilder;
63
+ /**
64
+ * Resolves a DOM element from either a CSS selector string or an Element instance.
65
+ */
66
+ function resolveDomElement(element) {
67
+ try {
68
+ return typeof element === 'string' ? document.querySelector(element) : element || null;
69
+ }
70
+ catch (e) {
71
+ logger.error('Error while resolving DOM element', e);
72
+ return null;
73
+ }
74
+ }
63
75
  /*
64
76
  Add leave tracking
65
77
  */
66
78
  function addTpaasLeaveTracking({ objectElement, pageElement, schema, objectResizable, heightBuilder, trackMethod, }) {
67
79
  function _addLeaveTracking() {
80
+ const objectDomElement = resolveDomElement(objectElement);
81
+ if (objectDomElement == null) {
82
+ logger.error('Could not find object element for leave tracking');
83
+ return;
84
+ }
85
+ let pageDomElement = resolveDomElement(pageElement);
86
+ if (pageDomElement == null) {
87
+ logger.warn('Could not find page element for leave tracking, defaulting to document.body');
88
+ pageDomElement = document.body;
89
+ }
68
90
  additionalHeightBuilder = heightBuilder;
69
91
  addTpaasLeaveListeners();
70
- addUpdateEventListeners(objectElement, pageElement || document.body, objectResizable);
71
- startTime = resetTime();
92
+ addUpdateEventListeners(objectDomElement, pageDomElement, objectResizable);
93
+ activityStartTime = resetTime();
94
+ durationStartTime = resetTime();
72
95
  currentLeaveSchema = schema;
73
96
  currentTrackMethod = trackMethod;
74
97
  logger.debug('addLeaveTracking:after:state', currentLeaveEvent);
@@ -160,12 +183,8 @@ function removeUpdateEventListeners() {
160
183
  */
161
184
  const resetEventDefaults = () => {
162
185
  currentLeaveEvent = (0, constants_1.DEFAULT_PAGE_LEAVE_EVENT)();
163
- startTime = resetTime();
164
- activityDuration = resetActivityDuration();
165
- };
166
- const resetActivityDuration = () => {
167
- clearInterval(activityDuration.interval);
168
- return (0, constants_1.DEFAULT_ACTIVITY_DURATION)();
186
+ durationStartTime = resetTime();
187
+ activityStartTime = resetTime();
169
188
  };
170
189
  const resetTpaasViewedContent = () => {
171
190
  currentLeaveEvent = (0, constants_1.DEFAULT_PAGE_LEAVE_EVENT)();
@@ -174,34 +193,41 @@ exports.resetTpaasViewedContent = resetTpaasViewedContent;
174
193
  const resetTime = () => Date.now();
175
194
  /*
176
195
  Send a Leave event only if Page Leave tracking is active in the SDK
177
- The event that is ultimately sent is a merge between the default event
178
- saved in this file and the event supplied by the brand, with preference going
179
- to the brand event. After the event has been sent, leave page tracking is removed
196
+ The event that is ultimately sent is the View event saved in the currentTrackMethod callback.
197
+ After the event has been sent, leave page tracking is removed
180
198
  and must be explicitly re-added if needed.
181
199
  */
182
- function trackTpaasActiveLeave() {
200
+ async function trackTpaasActiveLeave() {
183
201
  if (leaveTpaasTrackingIsActive()) {
184
- trackTpaasLeave();
202
+ await trackTpaasLeave();
185
203
  }
186
204
  }
187
205
  /*
188
206
  Send a Leave event regardless of whether Page Leave tracking is active in the SDK
189
- The event that is ultimately sent is a merge between the default event
190
- saved in this file and the event supplied by the brand, with preference going
191
- to the brand event. After the event has been sent, leave page tracking is removed
207
+ The event that is ultimately sent is the View event saved in the currentTrackMethod callback.
208
+ After the event has been sent, leave page tracking is removed
192
209
  and must be explicitly re-added if needed.
193
210
  */
194
- function trackTpaasLeave() {
211
+ async function trackTpaasLeave() {
195
212
  const leave = getTpaasLeaveObject();
196
- currentTrackMethod(leave);
213
+ // Capture currentTrackMethod and remove tracking synchronously before awaiting.
214
+ // If removal happened after the await, a new trackView* call arriving during the async
215
+ // gap would see tracking still active with the same schema and silently discard its
216
+ // new callback (e.g. a fresh leaveAudioBuilder), causing the next leave event to
217
+ // never fire or to use the wrong builder.
218
+ const trackMethod = currentTrackMethod;
197
219
  removeTpaasLeaveTracking();
220
+ await trackMethod(leave);
198
221
  }
199
222
  function getTpaasLeaveObject() {
200
223
  const endTime = Date.now();
201
- const duration = endTime - startTime;
224
+ // TPaaS leave event requires duration/activity to be at least 1ms, otherwise the event is rejected
225
+ // also, in practice, it's almost impossible to have an activity or duration of 0ms
226
+ const durationMs = Math.max(endTime - durationStartTime, 1);
227
+ const activityDurationMs = Math.max(Math.min(endTime - activityStartTime, constants_1.ACTIVITY_DURATION_LIMIT_MS), 1);
202
228
  const leave = {
203
- durationMs: duration,
204
- activityDurationMs: activityDuration.value,
229
+ durationMs,
230
+ activityDurationMs,
205
231
  ...currentLeaveEvent,
206
232
  };
207
233
  logger.debug('trackTpaasLeave: event', leave);
@@ -276,18 +302,10 @@ exports.calculateScrollPosition = calculateScrollPosition;
276
302
  'mousedown', 'mousemove', 'keydown', 'scroll' and/or 'touchstart' browser events.
277
303
  */
278
304
  function addUpdateActivityDurationListeners() {
279
- if (activityDuration.interval !== undefined) {
280
- // If the interval is already set, do not set it again
305
+ // if there are already listeners for activity, do not add more
306
+ if (activityListeners.length > 0) {
281
307
  return;
282
308
  }
283
- const interval = 1000;
284
- const activityTimeout = 30 * 1000;
285
- activityDuration.interval = window.setInterval(() => {
286
- activityDuration.timeSinceLastActivity += interval;
287
- if (activityDuration.timeSinceLastActivity < activityTimeout) {
288
- activityDuration.value += interval;
289
- }
290
- }, interval);
291
309
  const activityEvents = [
292
310
  types_1.BrowserEvents.SCROLL,
293
311
  types_1.BrowserEvents.MOUSEDOWN,
@@ -296,15 +314,9 @@ function addUpdateActivityDurationListeners() {
296
314
  types_1.BrowserEvents.TOUCHSTART,
297
315
  ];
298
316
  activityListeners = addEventListeners(activityEvents, () => {
299
- activityDuration = resetLastActivity(activityDuration);
317
+ activityStartTime = resetTime();
300
318
  }, { passive: true });
301
319
  }
302
- function resetLastActivity(activityDuration) {
303
- return {
304
- ...activityDuration,
305
- timeSinceLastActivity: 0,
306
- };
307
- }
308
320
  /*
309
321
  Add listeners to a set of browser events.
310
322
  */
@@ -22,7 +22,6 @@ exports.TPAAS_ALLOWED_METHODS = [
22
22
  'trackEngagementVideoAd',
23
23
  'trackEngagementWidget',
24
24
  'trackCompletedHealthAction',
25
- 'trackImpressionAdSlot',
26
25
  'trackImpressionForm',
27
26
  'trackImpressionHealthUIElement',
28
27
  'trackImpressionOffer',
@@ -37,15 +36,13 @@ exports.TPAAS_ALLOWED_METHODS = [
37
36
  'trackLeaveLandingpage',
38
37
  'trackLeaveListing',
39
38
  'trackLeaveLockedArticle',
40
- 'trackLeaveLockedAudio',
41
39
  'trackLeaveLockedAudioPage',
42
- 'trackLeaveLockedVideo',
43
40
  'trackLeaveLockedVideoPage',
44
41
  'trackLeavePage',
42
+ 'trackLeaveSportsPage',
45
43
  'trackLeaveVideoPage',
46
44
  'trackLeaveWeather',
47
45
  'trackViewArticle',
48
- 'trackViewAudio',
49
46
  'trackViewAudioPage',
50
47
  'trackViewError',
51
48
  'trackViewFrontpage',
@@ -53,13 +50,11 @@ exports.TPAAS_ALLOWED_METHODS = [
53
50
  'trackViewLandingpage',
54
51
  'trackViewListing',
55
52
  'trackViewLockedArticle',
56
- 'trackViewLockedAudio',
57
53
  'trackViewLockedAudioPage',
58
- 'trackViewLockedVideo',
59
54
  'trackViewLockedVideoPage',
60
55
  'trackViewPage',
56
+ 'trackViewSportsPage',
61
57
  'trackViewTitle',
62
- 'trackViewVideo',
63
58
  'trackViewVideoPage',
64
59
  'trackViewWeather',
65
60
  // these are not TPaaS methods,
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SDK_VERSION = void 0;
4
4
  // This file is auto-generated by bin/generate-version.js. Do not edit manually.
5
- exports.SDK_VERSION = '8.0.0-rc.4';
5
+ exports.SDK_VERSION = '8.0.0-rc.6';