@schibsted/pulse-sdk 8.0.0-alpha.16 → 8.0.0-alpha.18

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 (398) hide show
  1. package/dist/cjs/EventBus/EventBus.js +146 -0
  2. package/dist/cjs/Tracker.js +2499 -0
  3. package/dist/cjs/Tracker.test-d.js +76 -0
  4. package/dist/cjs/app-integration.js +40 -0
  5. package/dist/cjs/builders/actor.js +60 -0
  6. package/dist/cjs/builders/consent-manager.js +134 -0
  7. package/dist/cjs/builders/consents.js +149 -0
  8. package/dist/cjs/builders/device-browser.js +89 -0
  9. package/dist/cjs/builders/device-node.js +63 -0
  10. package/dist/cjs/builders/device.js +23 -0
  11. package/dist/cjs/builders/events-anonymous-browser.js +6 -0
  12. package/dist/cjs/builders/events-anonymous-node.js +88 -0
  13. package/dist/cjs/builders/events-anonymous.js +17 -0
  14. package/dist/cjs/builders/events-browser.js +8 -0
  15. package/dist/cjs/builders/events-node.js +127 -0
  16. package/dist/cjs/builders/events.js +17 -0
  17. package/dist/cjs/builders/experimentMetadata.js +25 -0
  18. package/dist/cjs/builders/experiments.js +32 -0
  19. package/dist/cjs/builders/index.js +52 -0
  20. package/dist/cjs/builders/location.js +38 -0
  21. package/dist/cjs/builders/objects/objects-anonymous-browser.js +36 -0
  22. package/dist/cjs/builders/objects/objects-anonymous-node.js +95 -0
  23. package/dist/cjs/builders/objects/objects-anonymous.js +23 -0
  24. package/dist/cjs/builders/objects/objects-browser.js +36 -0
  25. package/dist/cjs/builders/objects/objects-node.js +126 -0
  26. package/dist/cjs/builders/objects/objects.js +23 -0
  27. package/dist/cjs/builders/objects/utils.js +23 -0
  28. package/dist/cjs/builders/origin-browser.js +28 -0
  29. package/dist/cjs/builders/origin-node.js +29 -0
  30. package/dist/cjs/builders/origin.js +23 -0
  31. package/dist/cjs/builders/provider.js +24 -0
  32. package/dist/cjs/builders/session-browser.js +97 -0
  33. package/dist/cjs/builders/session-node.js +9 -0
  34. package/dist/cjs/builders/session.js +23 -0
  35. package/dist/cjs/builders/tracker-browser.js +34 -0
  36. package/dist/cjs/builders/tracker-node.js +22 -0
  37. package/dist/cjs/builders/trackerBuilder.js +23 -0
  38. package/dist/cjs/config-browser.js +26 -0
  39. package/dist/cjs/config.js +9 -0
  40. package/dist/cjs/createPulseTracker.js +50 -0
  41. package/dist/cjs/defer.js +20 -0
  42. package/dist/cjs/getPulseTracker.js +74 -0
  43. package/dist/cjs/identity/actor.js +60 -0
  44. package/dist/cjs/identity/advertising.js +62 -0
  45. package/dist/cjs/identity/cis.js +66 -0
  46. package/dist/cjs/identity/device.js +20 -0
  47. package/dist/cjs/identity/index.js +20 -0
  48. package/dist/cjs/index.js +57 -0
  49. package/dist/cjs/leaveTracking/constants.js +26 -0
  50. package/dist/cjs/leaveTracking/index.js +368 -0
  51. package/dist/cjs/leaveTracking/types.js +19 -0
  52. package/dist/cjs/leaveTrackingTpaas/constants.js +18 -0
  53. package/dist/cjs/leaveTrackingTpaas/index.js +341 -0
  54. package/dist/cjs/leaveTrackingTpaas/types.js +19 -0
  55. package/dist/cjs/network-browser.js +35 -0
  56. package/dist/cjs/network.js +15 -0
  57. package/dist/cjs/remoteConfig/index.js +124 -0
  58. package/dist/cjs/tracker-proxy/consts.js +72 -0
  59. package/dist/cjs/tracker-proxy/proxy-provider.js +68 -0
  60. package/dist/cjs/types.js +2 -0
  61. package/dist/cjs/version.json +1 -0
  62. package/dist/cjs/visibility-observer/index.js +101 -0
  63. package/dist/cjs/warnOnce.js +11 -0
  64. package/dist/cjs/wrapper/engagement/ui-element/event-builder.js +21 -0
  65. package/dist/cjs/wrapper/engagement/ui-element/types.js +2 -0
  66. package/dist/cjs/wrapper/types/base-event.js +2 -0
  67. package/dist/cjs/wrapper/types/engagement-event.js +2 -0
  68. package/dist/cjs/wrapper/types/event.js +2 -0
  69. package/dist/cjs/wrapper/types/index.js +19 -0
  70. package/dist/cjs/wrapper/types/utils.js +2 -0
  71. package/dist/cjs/wrapper/utils/get-navigation-type.js +32 -0
  72. package/dist/cjs/wrapper/utils/page-from-page-view.js +9 -0
  73. package/dist/cjs/wrapper/view/article/event-builder.js +19 -0
  74. package/dist/cjs/wrapper/view/article/types.js +2 -0
  75. package/dist/cjs/wrapper/view/frontpage/event-builder.js +16 -0
  76. package/dist/cjs/wrapper/view/frontpage/types.js +2 -0
  77. package/dist/cjs/wrapper/view/listing/event-builder.js +14 -0
  78. package/dist/cjs/wrapper/view/listing/types.js +2 -0
  79. package/dist/cjs/wrapper/view/loginposter/event-builder.js +11 -0
  80. package/dist/cjs/wrapper/view/loginposter/types.js +2 -0
  81. package/dist/cjs/wrapper/view/page/event-builder.js +18 -0
  82. package/dist/cjs/wrapper/view/page/types.js +2 -0
  83. package/dist/cjs/wrapper/view/salesposter/event-builder.js +18 -0
  84. package/dist/cjs/wrapper/view/salesposter/types.js +2 -0
  85. package/dist/cjs/wrapper/view/ui-element/event-builder.js +15 -0
  86. package/dist/cjs/wrapper/view/ui-element/types.js +2 -0
  87. package/dist/ejs/EventBus/EventBus.js +140 -0
  88. package/dist/ejs/Tracker.js +2455 -0
  89. package/dist/ejs/Tracker.test-d.js +71 -0
  90. package/dist/ejs/app-integration.js +33 -0
  91. package/dist/ejs/builders/actor.js +53 -0
  92. package/dist/ejs/builders/consent-manager.js +125 -0
  93. package/dist/ejs/builders/consents.js +138 -0
  94. package/dist/ejs/builders/device-browser.js +69 -0
  95. package/dist/ejs/builders/device-node.js +57 -0
  96. package/dist/ejs/builders/device.js +2 -0
  97. package/dist/ejs/builders/events-anonymous-browser.js +1 -0
  98. package/dist/ejs/builders/events-anonymous-node.js +48 -0
  99. package/dist/ejs/builders/events-anonymous.js +1 -0
  100. package/dist/ejs/builders/events-browser.js +1 -0
  101. package/dist/ejs/builders/events-node.js +84 -0
  102. package/dist/ejs/builders/events.js +1 -0
  103. package/dist/ejs/builders/experimentMetadata.js +21 -0
  104. package/dist/ejs/builders/experiments.js +27 -0
  105. package/dist/ejs/builders/index.js +12 -0
  106. package/dist/ejs/builders/location.js +34 -0
  107. package/dist/ejs/builders/objects/objects-anonymous-browser.js +14 -0
  108. package/dist/ejs/builders/objects/objects-anonymous-node.js +90 -0
  109. package/dist/ejs/builders/objects/objects-anonymous.js +2 -0
  110. package/dist/ejs/builders/objects/objects-browser.js +14 -0
  111. package/dist/ejs/builders/objects/objects-node.js +121 -0
  112. package/dist/ejs/builders/objects/objects.js +2 -0
  113. package/dist/ejs/builders/objects/utils.js +20 -0
  114. package/dist/ejs/builders/origin-browser.js +6 -0
  115. package/dist/ejs/builders/origin-node.js +24 -0
  116. package/dist/ejs/builders/origin.js +2 -0
  117. package/dist/ejs/builders/provider.js +18 -0
  118. package/dist/ejs/builders/session-browser.js +90 -0
  119. package/dist/ejs/builders/session-node.js +4 -0
  120. package/dist/ejs/builders/session.js +2 -0
  121. package/dist/ejs/builders/tracker-browser.js +13 -0
  122. package/dist/ejs/builders/tracker-node.js +14 -0
  123. package/dist/ejs/builders/trackerBuilder.js +2 -0
  124. package/dist/ejs/config-browser.js +23 -0
  125. package/dist/ejs/config.js +6 -0
  126. package/dist/ejs/createPulseTracker.js +44 -0
  127. package/dist/ejs/defer.js +17 -0
  128. package/dist/ejs/getPulseTracker.js +71 -0
  129. package/dist/ejs/identity/actor.js +51 -0
  130. package/dist/ejs/identity/advertising.js +57 -0
  131. package/dist/ejs/identity/cis.js +58 -0
  132. package/dist/ejs/identity/device.js +17 -0
  133. package/dist/ejs/identity/index.js +4 -0
  134. package/dist/ejs/index.js +9 -0
  135. package/dist/ejs/leaveTracking/constants.js +19 -0
  136. package/dist/ejs/leaveTracking/index.js +319 -0
  137. package/dist/ejs/leaveTracking/types.js +16 -0
  138. package/dist/ejs/leaveTrackingTpaas/constants.js +13 -0
  139. package/dist/ejs/leaveTrackingTpaas/index.js +291 -0
  140. package/dist/ejs/leaveTrackingTpaas/types.js +16 -0
  141. package/dist/ejs/network-browser.js +32 -0
  142. package/dist/ejs/network.js +12 -0
  143. package/dist/ejs/remoteConfig/index.js +111 -0
  144. package/dist/ejs/tracker-proxy/consts.js +68 -0
  145. package/dist/ejs/tracker-proxy/proxy-provider.js +62 -0
  146. package/dist/ejs/types.js +1 -0
  147. package/dist/ejs/version.json +1 -0
  148. package/dist/ejs/visibility-observer/index.js +97 -0
  149. package/dist/ejs/warnOnce.js +9 -0
  150. package/dist/ejs/wrapper/engagement/ui-element/event-builder.js +17 -0
  151. package/dist/ejs/wrapper/engagement/ui-element/types.js +1 -0
  152. package/dist/ejs/wrapper/types/base-event.js +1 -0
  153. package/dist/ejs/wrapper/types/engagement-event.js +1 -0
  154. package/dist/ejs/wrapper/types/event.js +1 -0
  155. package/dist/ejs/wrapper/types/index.js +3 -0
  156. package/dist/ejs/wrapper/types/utils.js +1 -0
  157. package/dist/ejs/wrapper/utils/get-navigation-type.js +29 -0
  158. package/dist/ejs/wrapper/utils/page-from-page-view.js +6 -0
  159. package/dist/ejs/wrapper/view/article/event-builder.js +15 -0
  160. package/dist/ejs/wrapper/view/article/types.js +1 -0
  161. package/dist/ejs/wrapper/view/frontpage/event-builder.js +12 -0
  162. package/dist/ejs/wrapper/view/frontpage/types.js +1 -0
  163. package/dist/ejs/wrapper/view/listing/event-builder.js +10 -0
  164. package/dist/ejs/wrapper/view/listing/types.js +1 -0
  165. package/dist/ejs/wrapper/view/loginposter/event-builder.js +7 -0
  166. package/dist/ejs/wrapper/view/loginposter/types.js +1 -0
  167. package/dist/ejs/wrapper/view/page/event-builder.js +14 -0
  168. package/dist/ejs/wrapper/view/page/types.js +1 -0
  169. package/dist/ejs/wrapper/view/salesposter/event-builder.js +14 -0
  170. package/dist/ejs/wrapper/view/salesposter/types.js +1 -0
  171. package/dist/ejs/wrapper/view/ui-element/event-builder.js +11 -0
  172. package/dist/ejs/wrapper/view/ui-element/types.js +1 -0
  173. package/dist/types/EventBus/EventBus.d.ts +106 -0
  174. package/dist/types/Tracker.d.ts +1418 -0
  175. package/dist/types/Tracker.test-d.d.ts +1 -0
  176. package/dist/types/app-integration.d.ts +10 -0
  177. package/dist/types/builders/actor.d.ts +39 -0
  178. package/dist/types/builders/consent-manager.d.ts +49 -0
  179. package/dist/types/builders/consents.d.ts +107 -0
  180. package/dist/types/builders/device-browser.d.ts +6 -0
  181. package/dist/types/builders/device-node.d.ts +65 -0
  182. package/dist/types/builders/device.d.ts +2 -0
  183. package/dist/types/builders/events-anonymous-browser.d.ts +1 -0
  184. package/dist/types/builders/events-anonymous-node.d.ts +82 -0
  185. package/dist/types/builders/events-anonymous.d.ts +1 -0
  186. package/dist/types/builders/events-browser.d.ts +1 -0
  187. package/dist/types/builders/events-node.d.ts +130 -0
  188. package/dist/types/builders/events.d.ts +1 -0
  189. package/dist/types/builders/experimentMetadata.d.ts +25 -0
  190. package/dist/types/builders/experiments.d.ts +24 -0
  191. package/dist/types/builders/index.d.ts +23 -0
  192. package/dist/types/builders/location.d.ts +34 -0
  193. package/dist/types/builders/objects/objects-anonymous-browser.d.ts +11 -0
  194. package/dist/types/builders/objects/objects-anonymous-node.d.ts +52 -0
  195. package/dist/types/builders/objects/objects-anonymous.d.ts +2 -0
  196. package/dist/types/builders/objects/objects-browser.d.ts +11 -0
  197. package/dist/types/builders/objects/objects-node.d.ts +60 -0
  198. package/dist/types/builders/objects/objects.d.ts +2 -0
  199. package/dist/types/builders/objects/utils.d.ts +1 -0
  200. package/dist/types/builders/origin-browser.d.ts +5 -0
  201. package/dist/types/builders/origin-node.d.ts +18 -0
  202. package/dist/types/builders/origin.d.ts +2 -0
  203. package/dist/types/builders/provider.d.ts +14 -0
  204. package/dist/types/builders/session-browser.d.ts +20 -0
  205. package/dist/types/builders/session-node.d.ts +3 -0
  206. package/dist/types/builders/session.d.ts +2 -0
  207. package/dist/types/builders/tracker-browser.d.ts +2 -0
  208. package/dist/types/builders/tracker-node.d.ts +14 -0
  209. package/dist/types/builders/trackerBuilder.d.ts +2 -0
  210. package/dist/types/config-browser.d.ts +23 -0
  211. package/dist/types/config.d.ts +6 -0
  212. package/dist/types/createPulseTracker.d.ts +21 -0
  213. package/dist/types/defer.d.ts +28 -0
  214. package/dist/types/getPulseTracker.d.ts +59 -0
  215. package/dist/types/identity/actor.d.ts +28 -0
  216. package/dist/types/identity/advertising.d.ts +30 -0
  217. package/dist/types/identity/cis.d.ts +21 -0
  218. package/dist/types/identity/device.d.ts +12 -0
  219. package/dist/types/identity/index.d.ts +4 -0
  220. package/dist/types/index.d.ts +31 -0
  221. package/dist/types/leaveTracking/constants.d.ts +26 -0
  222. package/dist/types/leaveTracking/index.d.ts +23 -0
  223. package/dist/types/leaveTracking/types.d.ts +78 -0
  224. package/dist/types/leaveTrackingTpaas/constants.d.ts +13 -0
  225. package/dist/types/leaveTrackingTpaas/index.d.ts +28 -0
  226. package/dist/types/leaveTrackingTpaas/types.d.ts +45 -0
  227. package/dist/types/network-browser.d.ts +5 -0
  228. package/dist/types/network.d.ts +4 -0
  229. package/dist/types/remoteConfig/index.d.ts +32 -0
  230. package/dist/types/tracker-proxy/consts.d.ts +45 -0
  231. package/dist/types/tracker-proxy/proxy-provider.d.ts +2 -0
  232. package/dist/types/types.d.ts +93 -0
  233. package/dist/types/visibility-observer/index.d.ts +38 -0
  234. package/dist/types/warnOnce.d.ts +2 -0
  235. package/dist/types/wrapper/engagement/ui-element/event-builder.d.ts +3 -0
  236. package/dist/types/wrapper/engagement/ui-element/types.d.ts +29 -0
  237. package/dist/types/wrapper/types/base-event.d.ts +74 -0
  238. package/dist/types/wrapper/types/engagement-event.d.ts +5 -0
  239. package/dist/types/wrapper/types/event.d.ts +41 -0
  240. package/dist/types/wrapper/types/index.d.ts +3 -0
  241. package/dist/types/wrapper/types/utils.d.ts +5 -0
  242. package/dist/types/wrapper/utils/get-navigation-type.d.ts +3 -0
  243. package/dist/types/wrapper/utils/page-from-page-view.d.ts +3 -0
  244. package/dist/types/wrapper/view/article/event-builder.d.ts +2 -0
  245. package/dist/types/wrapper/view/article/types.d.ts +27 -0
  246. package/dist/types/wrapper/view/frontpage/event-builder.d.ts +2 -0
  247. package/dist/types/wrapper/view/frontpage/types.d.ts +18 -0
  248. package/dist/types/wrapper/view/listing/event-builder.d.ts +2 -0
  249. package/dist/types/wrapper/view/listing/types.d.ts +27 -0
  250. package/dist/types/wrapper/view/loginposter/event-builder.d.ts +2 -0
  251. package/dist/types/wrapper/view/loginposter/types.d.ts +14 -0
  252. package/dist/types/wrapper/view/page/event-builder.d.ts +2 -0
  253. package/dist/types/wrapper/view/page/types.d.ts +16 -0
  254. package/dist/types/wrapper/view/salesposter/event-builder.d.ts +2 -0
  255. package/dist/types/wrapper/view/salesposter/types.d.ts +15 -0
  256. package/dist/types/wrapper/view/ui-element/event-builder.d.ts +3 -0
  257. package/dist/types/wrapper/view/ui-element/types.d.ts +28 -0
  258. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.d.ts +26 -0
  259. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.js +273 -0
  260. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.js.map +1 -0
  261. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis.d.ts +10 -0
  262. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis.js +7 -0
  263. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis.js.map +1 -0
  264. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/eventEmitter.d.ts +14 -0
  265. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/eventEmitter.js +39 -0
  266. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/eventEmitter.js.map +1 -0
  267. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/index.d.ts +4 -0
  268. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/index.js +12 -0
  269. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/index.js.map +1 -0
  270. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/pulse-cookie.d.ts +55 -0
  271. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/pulse-cookie.js +276 -0
  272. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/pulse-cookie.js.map +1 -0
  273. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.d.ts +36 -0
  274. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.js +87 -0
  275. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.js.map +1 -0
  276. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.d.ts +6 -0
  277. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.js +21 -0
  278. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.js.map +1 -0
  279. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/types.d.ts +24 -0
  280. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/types.js +3 -0
  281. package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/types.js.map +1 -0
  282. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.d.ts +26 -0
  283. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.js +203 -0
  284. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.js.map +1 -0
  285. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis.d.ts +10 -0
  286. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis.js +4 -0
  287. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis.js.map +1 -0
  288. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/eventEmitter.d.ts +14 -0
  289. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/eventEmitter.js +35 -0
  290. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/eventEmitter.js.map +1 -0
  291. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/index.d.ts +4 -0
  292. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/index.js +3 -0
  293. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/index.js.map +1 -0
  294. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/pulse-cookie.d.ts +55 -0
  295. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/pulse-cookie.js +254 -0
  296. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/pulse-cookie.js.map +1 -0
  297. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.d.ts +36 -0
  298. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.js +50 -0
  299. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.js.map +1 -0
  300. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.d.ts +6 -0
  301. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.js +17 -0
  302. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.js.map +1 -0
  303. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/types.d.ts +24 -0
  304. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/types.js +2 -0
  305. package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/types.js.map +1 -0
  306. package/node_modules/@schibsted/pulse-cis-sync/dist/types/cis-browser.d.ts +26 -0
  307. package/node_modules/@schibsted/pulse-cis-sync/dist/types/cis.d.ts +10 -0
  308. package/node_modules/@schibsted/pulse-cis-sync/dist/types/eventEmitter.d.ts +14 -0
  309. package/node_modules/@schibsted/pulse-cis-sync/dist/types/index.d.ts +4 -0
  310. package/node_modules/@schibsted/pulse-cis-sync/dist/types/pulse-cookie.d.ts +55 -0
  311. package/node_modules/@schibsted/pulse-cis-sync/dist/types/storage/pulseStorage.d.ts +36 -0
  312. package/node_modules/@schibsted/pulse-cis-sync/dist/types/storage/storage.d.ts +6 -0
  313. package/node_modules/@schibsted/pulse-cis-sync/dist/types/types.d.ts +24 -0
  314. package/node_modules/@schibsted/pulse-cis-sync/package.json +44 -0
  315. package/node_modules/@schibsted/pulse-utils/dist/cjs/cookie-config.js +10 -0
  316. package/node_modules/@schibsted/pulse-utils/dist/cjs/cookie.js +86 -0
  317. package/node_modules/@schibsted/pulse-utils/dist/cjs/events.js +109 -0
  318. package/node_modules/@schibsted/pulse-utils/dist/cjs/get.js +18 -0
  319. package/node_modules/@schibsted/pulse-utils/dist/cjs/getRootDomain.js +54 -0
  320. package/node_modules/@schibsted/pulse-utils/dist/cjs/index.js +38 -0
  321. package/node_modules/@schibsted/pulse-utils/dist/cjs/merge.js +38 -0
  322. package/node_modules/@schibsted/pulse-utils/dist/cjs/objects.js +34 -0
  323. package/node_modules/@schibsted/pulse-utils/dist/cjs/omit.js +9 -0
  324. package/node_modules/@schibsted/pulse-utils/dist/cjs/randomString.js +18 -0
  325. package/node_modules/@schibsted/pulse-utils/dist/cjs/throttle.js +34 -0
  326. package/node_modules/@schibsted/pulse-utils/dist/cjs/webApi.js +21 -0
  327. package/node_modules/@schibsted/pulse-utils/dist/ejs/cookie-config.js +7 -0
  328. package/node_modules/@schibsted/pulse-utils/dist/ejs/cookie.js +81 -0
  329. package/node_modules/@schibsted/pulse-utils/dist/ejs/events.js +103 -0
  330. package/node_modules/@schibsted/pulse-utils/dist/ejs/get.js +15 -0
  331. package/node_modules/@schibsted/pulse-utils/dist/ejs/getRootDomain.js +49 -0
  332. package/node_modules/@schibsted/pulse-utils/dist/ejs/index.js +11 -0
  333. package/node_modules/@schibsted/pulse-utils/dist/ejs/merge.js +35 -0
  334. package/node_modules/@schibsted/pulse-utils/dist/ejs/objects.js +26 -0
  335. package/node_modules/@schibsted/pulse-utils/dist/ejs/omit.js +6 -0
  336. package/node_modules/@schibsted/pulse-utils/dist/ejs/randomString.js +15 -0
  337. package/node_modules/@schibsted/pulse-utils/dist/ejs/throttle.js +31 -0
  338. package/node_modules/@schibsted/pulse-utils/dist/ejs/webApi.js +17 -0
  339. package/node_modules/@schibsted/pulse-utils/dist/types/cookie-config.d.ts +7 -0
  340. package/node_modules/@schibsted/pulse-utils/dist/types/cookie.d.ts +23 -0
  341. package/node_modules/@schibsted/pulse-utils/dist/types/events.d.ts +17 -0
  342. package/node_modules/@schibsted/pulse-utils/dist/types/get.d.ts +1 -0
  343. package/node_modules/@schibsted/pulse-utils/dist/types/getRootDomain.d.ts +13 -0
  344. package/node_modules/@schibsted/pulse-utils/dist/types/index.d.ts +11 -0
  345. package/node_modules/@schibsted/pulse-utils/dist/types/merge.d.ts +4 -0
  346. package/node_modules/@schibsted/pulse-utils/dist/types/objects.d.ts +6 -0
  347. package/node_modules/@schibsted/pulse-utils/dist/types/omit.d.ts +3 -0
  348. package/node_modules/@schibsted/pulse-utils/dist/types/randomString.d.ts +1 -0
  349. package/node_modules/@schibsted/pulse-utils/dist/types/throttle.d.ts +3 -0
  350. package/node_modules/@schibsted/pulse-utils/dist/types/webApi.d.ts +10 -0
  351. package/node_modules/@schibsted/pulse-utils/package.json +36 -0
  352. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/anonymous.js +8 -0
  353. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/baseEvent.js +9 -0
  354. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/consents.js +15 -0
  355. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/device.js +211 -0
  356. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/experiments.js +11 -0
  357. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/navigationType.js +52 -0
  358. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/pageInfo.js +24 -0
  359. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/pageviewId.js +11 -0
  360. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/provider.js +12 -0
  361. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/referrer.js +19 -0
  362. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/session.js +114 -0
  363. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/time.js +15 -0
  364. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/trackerBuilder.js +15 -0
  365. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/user.js +26 -0
  366. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/utm.js +35 -0
  367. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders.js +264 -0
  368. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/index.js +17 -0
  369. package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/types.js +2 -0
  370. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/anonymous.js +5 -0
  371. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/baseEvent.js +6 -0
  372. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/consents.js +12 -0
  373. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/device.js +174 -0
  374. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/experiments.js +7 -0
  375. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/navigationType.js +48 -0
  376. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/pageInfo.js +20 -0
  377. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/pageviewId.js +7 -0
  378. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/provider.js +9 -0
  379. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/referrer.js +15 -0
  380. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/session.js +108 -0
  381. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/time.js +11 -0
  382. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/trackerBuilder.js +11 -0
  383. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/user.js +22 -0
  384. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/utm.js +31 -0
  385. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders.js +209 -0
  386. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/index.js +1 -0
  387. package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/types.js +1 -0
  388. package/node_modules/@schibsted/tpaas-event-builder/dist/index.d.ts +5171 -0
  389. package/node_modules/@schibsted/tpaas-event-builder/package.json +40 -0
  390. package/node_modules/@schibsted/tpaas-schemas/dist/cjs/constants.js +62 -1
  391. package/node_modules/@schibsted/tpaas-schemas/dist/ejs/constants.js +61 -0
  392. package/node_modules/@schibsted/tpaas-schemas/dist/index.d.ts +128 -0
  393. package/package.json +58 -13
  394. package/CHANGELOG.md +0 -1035
  395. package/dist/index.d.ts +0 -13
  396. package/dist/index.d.ts.map +0 -1
  397. package/dist/index.js +0 -47
  398. package/dist/index.js.map +0 -1
@@ -0,0 +1,319 @@
1
+ import { isBrowser, isFunction, pulseMerge, throttle } from '@schibsted/pulse-utils';
2
+ import * as logger from 'loglevel';
3
+ import { BookmarkKeys } from '../Tracker';
4
+ import { DEFAULT_ACTIVITY_DURATION, DEFAULT_LEAVE_EVENT_BUILDER, DEFAULT_PAGE_LEAVE_EVENT, DEFAULT_VIEWED_CONTENT, } from './constants';
5
+ import { BrowserEvents } from './types';
6
+ let pageLeaveListeners = [];
7
+ let updateViewedContentListeners = [];
8
+ let activityListeners = [];
9
+ let resizeObserver = null;
10
+ let throttledUpdateFn = throttle(() => undefined, 0);
11
+ let startTime = 0;
12
+ let activityDuration = DEFAULT_ACTIVITY_DURATION();
13
+ let currentPageLeaveEvent = DEFAULT_PAGE_LEAVE_EVENT();
14
+ let originalUseBeacon;
15
+ let currentLeaveEventBuilder = DEFAULT_LEAVE_EVENT_BUILDER();
16
+ let additionalHeightBuilder;
17
+ /*
18
+ Add page leave tracking
19
+ */
20
+ export function addPageLeaveTracking(tracker, objectElement, pageElement, eventBuilder, options = {}) {
21
+ additionalHeightBuilder = options.additionalHeightBuilder;
22
+ if (!leaveTrackingIsActive()) {
23
+ originalUseBeacon = tracker.state.useBeacon;
24
+ tracker.state.useBeacon = true;
25
+ currentLeaveEventBuilder = eventBuilder || DEFAULT_LEAVE_EVENT_BUILDER();
26
+ addPageLeaveListeners(tracker);
27
+ addUpdateEventListeners(objectElement, pageElement, options.objectResizable);
28
+ startTime = resetTime();
29
+ logger.debug('addPageLeaveTracking:after:state', currentPageLeaveEvent);
30
+ }
31
+ else {
32
+ logger.warn('addPageLeaveTracking was called while leave-tracking was already active. Consider using updatePageLeaveTracking with resetProperties=false if you want to update the page/object element!');
33
+ }
34
+ }
35
+ export function leaveTrackingIsActive() {
36
+ return !(pageLeaveListeners.length === 0 &&
37
+ updateViewedContentListeners.length === 0 &&
38
+ activityListeners.length === 0);
39
+ }
40
+ /*
41
+ Remove page leave tracking
42
+ */
43
+ export function removePageLeaveTracking(tracker) {
44
+ tracker.state.useBeacon = originalUseBeacon;
45
+ removePageLeaveListeners();
46
+ removeUpdateEventListeners();
47
+ resetEventDefaults();
48
+ currentLeaveEventBuilder = DEFAULT_LEAVE_EVENT_BUILDER();
49
+ logger.debug('removePageLeaveTracking:after:state', currentLeaveEventBuilder());
50
+ }
51
+ /**
52
+ * Update page leave tracking
53
+ * @param objectElement new object element to track
54
+ * @param pageElement new page element to track
55
+ * @param resetProperties if ALL engagement properties should be reset (duration, scroll etc.)
56
+ */
57
+ export function updatePageLeaveTracking(objectElement, pageElement, resetProperties) {
58
+ if (updateViewedContentListeners.length > 0) {
59
+ removeUpdateEventListeners();
60
+ if (resetProperties) {
61
+ resetEventDefaults();
62
+ }
63
+ addUpdateEventListeners(objectElement, pageElement);
64
+ }
65
+ }
66
+ /*
67
+ Add event listeners to the relevant browser events
68
+ When the browser event triggers, we want to send the Leave event
69
+ with the event supplied by the user and the name of the triggered browser event
70
+ */
71
+ function addPageLeaveListeners(tracker) {
72
+ const beforeUnloadListener = addEventListeners([BrowserEvents.BEFORE_UNLOAD], () => trackPageLeave(tracker, currentLeaveEventBuilder(), BrowserEvents.BEFORE_UNLOAD), { capture: true });
73
+ const pageHideListener = addEventListeners([BrowserEvents.PAGE_HIDE], () => trackPageLeave(tracker, currentLeaveEventBuilder(), BrowserEvents.PAGE_HIDE), { capture: true });
74
+ const popStateListener = addEventListeners([BrowserEvents.POP_STATE], () => trackPageLeave(tracker, currentLeaveEventBuilder(), BrowserEvents.POP_STATE), { capture: true });
75
+ const visibilityChangeListener = addEventListeners([BrowserEvents.VISIBILITY_CHANGE], () => {
76
+ if (document.visibilityState === 'hidden') {
77
+ trackPageLeave(tracker, currentLeaveEventBuilder(), BrowserEvents.VISIBILITY_CHANGE);
78
+ }
79
+ }, { capture: true });
80
+ pageLeaveListeners.push(...beforeUnloadListener);
81
+ pageLeaveListeners.push(...pageHideListener);
82
+ pageLeaveListeners.push(...popStateListener);
83
+ pageLeaveListeners.push(...visibilityChangeListener);
84
+ }
85
+ /*
86
+ Remove all Leave event listeners
87
+ */
88
+ function removePageLeaveListeners() {
89
+ pageLeaveListeners = removeEventListeners(pageLeaveListeners, { capture: true });
90
+ }
91
+ function removeResizeObserver() {
92
+ if (resizeObserver) {
93
+ resizeObserver.disconnect();
94
+ resizeObserver = null;
95
+ }
96
+ }
97
+ /*
98
+ Add handlers to update the default event.
99
+ The fields that are included can be found here: https://pages.github.schibsted.io/mpt-data/pulse-standard/#leave-article
100
+ */
101
+ function addUpdateEventListeners(objectElement, pageElement, objectResizable = false) {
102
+ addUpdateViewedContentListeners(objectElement, pageElement, objectResizable);
103
+ addUpdateActivityDurationListeners();
104
+ }
105
+ /*
106
+ Remove all handlers for tracking viewed content and durations
107
+ */
108
+ function removeUpdateEventListeners() {
109
+ updateViewedContentListeners = removeEventListeners(updateViewedContentListeners);
110
+ activityListeners = removeEventListeners(activityListeners);
111
+ removeResizeObserver();
112
+ }
113
+ /*
114
+ Reset the default leave tracking state.
115
+ */
116
+ const resetEventDefaults = () => {
117
+ currentPageLeaveEvent = DEFAULT_PAGE_LEAVE_EVENT();
118
+ startTime = resetTime();
119
+ activityDuration = resetActivityDuration();
120
+ };
121
+ const resetActivityDuration = () => {
122
+ clearInterval(activityDuration.interval);
123
+ return DEFAULT_ACTIVITY_DURATION();
124
+ };
125
+ export const resetViewedContent = () => {
126
+ currentPageLeaveEvent.engagement = Object.assign({}, currentPageLeaveEvent.engagement, DEFAULT_VIEWED_CONTENT());
127
+ };
128
+ const resetTime = () => Date.now();
129
+ /*
130
+ Update the default Leave event with an event supplied by the brand
131
+ */
132
+ export function updatePageLeaveEvent(leaveEvent) {
133
+ pulseMerge(currentPageLeaveEvent, leaveEvent);
134
+ }
135
+ /*
136
+ Send a Leave event only if Page Leave tracking is active in the SDK
137
+ The event that is ultimately sent is a merge between the default event
138
+ saved in this file and the event supplied by the brand, with preference going
139
+ to the brand event. After the event has been sent, leave page tracking is removed
140
+ and must be explicitly re-added if needed.
141
+ */
142
+ export function trackActivePageLeave(tracker, providedEvent, eventName) {
143
+ if (leaveTrackingIsActive()) {
144
+ trackPageLeave(tracker, providedEvent, eventName);
145
+ }
146
+ }
147
+ /*
148
+ Send a Leave event regardless of whether Page Leave tracking is active in the SDK
149
+ The event that is ultimately sent is a merge between the default event
150
+ saved in this file and the event supplied by the brand, with preference going
151
+ to the brand event. After the event has been sent, leave page tracking is removed
152
+ and must be explicitly re-added if needed.
153
+ */
154
+ export async function trackPageLeave(tracker, providedEvent, eventName) {
155
+ const endTime = Date.now();
156
+ const duration = endTime - startTime;
157
+ const leaveEvent = providedEvent || currentLeaveEventBuilder();
158
+ const mergedEvent = pulseMerge({
159
+ ...currentPageLeaveEvent,
160
+ engagement: {
161
+ duration,
162
+ activityDuration: activityDuration.value,
163
+ ...currentPageLeaveEvent.engagement,
164
+ },
165
+ object: {
166
+ ...(eventName && {
167
+ 'spt:custom': {
168
+ 'spt:eventName': eventName,
169
+ },
170
+ }),
171
+ },
172
+ }, leaveEvent);
173
+ logger.debug('trackPageLeave: event', mergedEvent);
174
+ tracker.track('trackerEvent', mergedEvent, { applyBookmarkKey: BookmarkKeys.PAGE_VIEW });
175
+ removePageLeaveTracking(tracker);
176
+ }
177
+ /*
178
+ Add listeners to update the viewed content fields in the default event
179
+ We listen to 'scroll' and 'resize' browser events
180
+ */
181
+ function addUpdateViewedContentListeners(objectElement, pageElement, objectResizable) {
182
+ updateViewedContent(objectElement, pageElement);
183
+ throttledUpdateFn = throttle(() => updateViewedContent(objectElement, pageElement), 500);
184
+ updateViewedContentListeners = addEventListeners([BrowserEvents.SCROLL, BrowserEvents.RESIZE], throttledUpdateFn);
185
+ if (objectResizable) {
186
+ if (!resizeObserver) {
187
+ resizeObserver = new ResizeObserver(() => {
188
+ resetViewedContent();
189
+ throttledUpdateFn();
190
+ });
191
+ }
192
+ resizeObserver.observe(objectElement);
193
+ }
194
+ }
195
+ /*
196
+ Update the viewed content fields that are used in the default event.
197
+ The includes fields are:
198
+ {pageScrollPosition} The absolute scroll position on the page in pixels.
199
+ {maxPageScrollPosition} The maximum scroll position the user has been on in pixels.
200
+ {objectViewPercentage} The relative scroll position of the supplied DOM element in pixels.
201
+ {maxObjectViewPercentage} The maximum relative scroll position of the supplied DOM element in pixels.
202
+ {pageViewPercentage} The relative scroll position of the user in %.
203
+ {maxPageViewPercentage} The maximum relative scroll position the user has seen in %.
204
+ */
205
+ export function updateViewedContent(objectElement, pageElement) {
206
+ const { totalHeight: additionalTotalHeight, viewedHeight: additionalViewedHeight } = isFunction(additionalHeightBuilder)
207
+ ? additionalHeightBuilder()
208
+ : { totalHeight: 0, viewedHeight: 0 };
209
+ const objectScrolledPixels = calculateScrolledPixels(objectElement) + additionalViewedHeight;
210
+ const pageScrolledPixels = calculateScrolledPixels(pageElement) + additionalViewedHeight;
211
+ const pageScrollPosition = calculateScrollPosition(pageElement) + additionalViewedHeight;
212
+ const maxPageScrollPosition = Math.max(pageScrollPosition, Number(currentPageLeaveEvent.engagement.maxPageScrollPosition));
213
+ const objectViewPercentage = calculateViewPercentage(objectScrolledPixels, objectElement.scrollHeight + additionalTotalHeight);
214
+ const maxObjectViewPercentage = Math.max(objectViewPercentage, Number(currentPageLeaveEvent.engagement.maxObjectViewPercentage));
215
+ const pageViewPercentage = calculateViewPercentage(pageScrolledPixels, pageElement.scrollHeight + additionalTotalHeight);
216
+ const maxPageViewPercentage = Math.max(pageViewPercentage, Number(currentPageLeaveEvent.engagement.maxPageViewPercentage));
217
+ logger.debug('updateViewedContent:before:engagement', { ...currentPageLeaveEvent.engagement });
218
+ pulseMerge(currentPageLeaveEvent.engagement, {
219
+ pageScrollPosition,
220
+ maxPageScrollPosition,
221
+ objectViewPercentage,
222
+ maxObjectViewPercentage,
223
+ pageViewPercentage,
224
+ maxPageViewPercentage,
225
+ });
226
+ logger.debug('updateViewedContent:after:engagement', { ...currentPageLeaveEvent.engagement });
227
+ }
228
+ export const calculateScrolledPixels = (element) => {
229
+ const rect = element.getBoundingClientRect();
230
+ const scrolledPixels = isBrowser ? element.scrollHeight - rect.bottom + window.innerHeight : 0;
231
+ if (scrolledPixels <= 0) {
232
+ return 0;
233
+ }
234
+ return Math.min(scrolledPixels, element.scrollHeight);
235
+ };
236
+ export const calculateScrollPosition = (element) => Math.abs(Math.min(element.getBoundingClientRect().top, 0));
237
+ /*
238
+ Track the user's activity duration on the page.
239
+ The activity duration is the active time the user spends on the page.
240
+ Active means less than 30 seconds since the user triggered one of the
241
+ 'mousedown', 'mousemove', 'keydown', 'scroll' and/or 'touchstart' browser events.
242
+ */
243
+ function addUpdateActivityDurationListeners() {
244
+ if (activityDuration.interval !== undefined) {
245
+ // If the interval is already set, do not set it again
246
+ return;
247
+ }
248
+ const interval = 1000;
249
+ const activityTimeout = 30 * 1000;
250
+ activityDuration.interval = window.setInterval(() => {
251
+ activityDuration.timeSinceLastActivity += interval;
252
+ if (activityDuration.timeSinceLastActivity < activityTimeout) {
253
+ activityDuration.value += interval;
254
+ }
255
+ }, interval);
256
+ const activityEvents = [
257
+ BrowserEvents.SCROLL,
258
+ BrowserEvents.MOUSEDOWN,
259
+ BrowserEvents.MOUSEMOVE,
260
+ BrowserEvents.KEYDOWN,
261
+ BrowserEvents.TOUCHSTART,
262
+ ];
263
+ const passiveSupported = isPassiveSupported();
264
+ activityListeners = addEventListeners(activityEvents, () => {
265
+ activityDuration = resetLastActivity(activityDuration);
266
+ }, passiveSupported ? { passive: true } : false);
267
+ }
268
+ function resetLastActivity(activityDuration) {
269
+ return {
270
+ ...activityDuration,
271
+ timeSinceLastActivity: 0,
272
+ };
273
+ }
274
+ /*
275
+ Add listeners to a set of browser events.
276
+ */
277
+ export function addEventListeners(events, handler, options) {
278
+ return events.map((eventName) => {
279
+ if (isBrowser) {
280
+ window.addEventListener(eventName, handler, options);
281
+ }
282
+ return [eventName, handler];
283
+ });
284
+ }
285
+ /*
286
+ Remove a set of listeners for browser events.
287
+ */
288
+ export function removeEventListeners(eventListeners, options = {}) {
289
+ for (const [eventName, listener] of eventListeners) {
290
+ if (isBrowser) {
291
+ window.removeEventListener(eventName, listener, options);
292
+ }
293
+ }
294
+ throttledUpdateFn.cancel();
295
+ return [];
296
+ }
297
+ const calculateViewPercentage = (scrolledPixels, scrollHeight) => Math.round((100 * scrolledPixels) / scrollHeight);
298
+ // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#safely_detecting_option_support
299
+ const isPassiveSupported = () => {
300
+ let passiveSupported;
301
+ if (passiveSupported !== undefined) {
302
+ return passiveSupported;
303
+ }
304
+ try {
305
+ const options = {
306
+ get passive() {
307
+ passiveSupported = true;
308
+ return false;
309
+ },
310
+ };
311
+ const noop = () => { };
312
+ window.addEventListener('test', noop, options);
313
+ window.removeEventListener('test', noop);
314
+ }
315
+ catch (_err) {
316
+ passiveSupported = false;
317
+ }
318
+ return passiveSupported;
319
+ };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Currently supported browser events
3
+ */
4
+ export var BrowserEvents;
5
+ (function (BrowserEvents) {
6
+ BrowserEvents["BEFORE_UNLOAD"] = "beforeunload";
7
+ BrowserEvents["PAGE_HIDE"] = "pagehide";
8
+ BrowserEvents["POP_STATE"] = "popstate";
9
+ BrowserEvents["VISIBILITY_CHANGE"] = "visibilitychange";
10
+ BrowserEvents["SCROLL"] = "scroll";
11
+ BrowserEvents["RESIZE"] = "resize";
12
+ BrowserEvents["MOUSEDOWN"] = "mousedown";
13
+ BrowserEvents["MOUSEMOVE"] = "mousemove";
14
+ BrowserEvents["KEYDOWN"] = "keydown";
15
+ BrowserEvents["TOUCHSTART"] = "touchstart";
16
+ })(BrowserEvents || (BrowserEvents = {}));
@@ -0,0 +1,13 @@
1
+ export const DEFAULT_ACTIVITY_DURATION = () => ({
2
+ value: 0,
3
+ interval: undefined,
4
+ timeSinceLastActivity: 0,
5
+ });
6
+ export const DEFAULT_PAGE_LEAVE_EVENT = () => ({
7
+ objectViewPercentage: 0,
8
+ maxObjectViewPercentage: 0,
9
+ pageViewPercentage: 0,
10
+ maxPageViewPercentage: 0,
11
+ pageScrollPosition: 0,
12
+ maxPageScrollPosition: 0,
13
+ });
@@ -0,0 +1,291 @@
1
+ import { isBrowser, isFunction, throttle } from '@schibsted/pulse-utils';
2
+ import * as logger from 'loglevel';
3
+ import { DEFAULT_ACTIVITY_DURATION, DEFAULT_PAGE_LEAVE_EVENT } from './constants';
4
+ import { BrowserEvents } from './types';
5
+ let currentLeaveSchema;
6
+ let currentTrackMethod;
7
+ let leaveListeners = [];
8
+ let updateViewedContentListeners = [];
9
+ let activityListeners = [];
10
+ let resizeObserver = null;
11
+ let throttledUpdateFn = throttle(() => undefined, 0);
12
+ let startTime = 0;
13
+ let activityDuration = DEFAULT_ACTIVITY_DURATION();
14
+ let currentLeaveEvent = DEFAULT_PAGE_LEAVE_EVENT();
15
+ let additionalHeightBuilder;
16
+ /*
17
+ Add leave tracking
18
+ */
19
+ export function addTpaasLeaveTracking({ objectElement, pageElement, schema, objectResizable, heightBuilder, trackMethod, }) {
20
+ function _addLeaveTracking() {
21
+ additionalHeightBuilder = heightBuilder;
22
+ addTpaasLeaveListeners();
23
+ addUpdateEventListeners(objectElement, pageElement || document.body, objectResizable);
24
+ startTime = resetTime();
25
+ currentLeaveSchema = schema;
26
+ currentTrackMethod = trackMethod;
27
+ logger.debug('addLeaveTracking:after:state', currentLeaveEvent);
28
+ }
29
+ if (!leaveTpaasTrackingIsActive()) {
30
+ // if leave tracking is not active, just start it
31
+ _addLeaveTracking();
32
+ }
33
+ else if (leaveTpaasTrackingIsActive() && currentLeaveSchema !== schema) {
34
+ // if leave tracking is active, but the schema has changed, reset and start it
35
+ removeTpaasLeaveTracking();
36
+ _addLeaveTracking();
37
+ }
38
+ else {
39
+ logger.warn(`addLeaveTracking was called while leave-tracking was already active for ${currentLeaveSchema}. Consider using updateLeaveTracking with resetProperties=false if you want to update the page/object element!`);
40
+ }
41
+ }
42
+ export function leaveTpaasTrackingIsActive() {
43
+ return !(leaveListeners.length === 0 && updateViewedContentListeners.length === 0 && activityListeners.length === 0);
44
+ }
45
+ /*
46
+ Remove page leave tracking
47
+ */
48
+ export function removeTpaasLeaveTracking() {
49
+ removeLeaveListeners();
50
+ removeUpdateEventListeners();
51
+ resetEventDefaults();
52
+ }
53
+ /**
54
+ * Update leave tracking
55
+ * @param objectElement new object element to track
56
+ * @param pageElement new page element to track
57
+ * @param resetProperties if ALL engagement properties should be reset (duration, scroll etc.)
58
+ */
59
+ export function updateTpaasLeaveTracking(objectElement, pageElement, resetProperties) {
60
+ if (updateViewedContentListeners.length > 0) {
61
+ removeUpdateEventListeners();
62
+ if (resetProperties) {
63
+ resetEventDefaults();
64
+ }
65
+ addUpdateEventListeners(objectElement, pageElement);
66
+ }
67
+ }
68
+ /*
69
+ Add event listeners to the relevant browser events
70
+ When the browser event triggers, we want to send the Leave event
71
+ with the event supplied by the user and the name of the triggered browser event
72
+ */
73
+ function addTpaasLeaveListeners() {
74
+ const listeners = addEventListeners([BrowserEvents.BEFORE_UNLOAD, BrowserEvents.PAGE_HIDE, BrowserEvents.POP_STATE], () => trackTpaasLeave(), { capture: true });
75
+ const visibilityChangeListener = addEventListeners([BrowserEvents.VISIBILITY_CHANGE], () => {
76
+ if (document.visibilityState === 'hidden') {
77
+ trackTpaasLeave();
78
+ }
79
+ }, { capture: true });
80
+ leaveListeners.push(...listeners);
81
+ leaveListeners.push(...visibilityChangeListener);
82
+ }
83
+ /*
84
+ Remove all Leave event listeners
85
+ */
86
+ function removeLeaveListeners() {
87
+ leaveListeners = removeEventListeners(leaveListeners, { capture: true });
88
+ }
89
+ function removeResizeObserver() {
90
+ if (resizeObserver) {
91
+ resizeObserver.disconnect();
92
+ resizeObserver = null;
93
+ }
94
+ }
95
+ /*
96
+ Add handlers to update the default event.
97
+ The fields that are included can be found here: https://pages.github.schibsted.io/mpt-data/pulse-standard/#leave-article
98
+ */
99
+ function addUpdateEventListeners(objectElement, pageElement, objectResizable = false) {
100
+ addUpdateViewedContentListeners(objectElement, pageElement, objectResizable);
101
+ addUpdateActivityDurationListeners();
102
+ }
103
+ /*
104
+ Remove all handlers for tracking viewed content and durations
105
+ */
106
+ function removeUpdateEventListeners() {
107
+ updateViewedContentListeners = removeEventListeners(updateViewedContentListeners);
108
+ activityListeners = removeEventListeners(activityListeners);
109
+ removeResizeObserver();
110
+ }
111
+ /*
112
+ Reset the default leave tracking state.
113
+ */
114
+ const resetEventDefaults = () => {
115
+ currentLeaveEvent = DEFAULT_PAGE_LEAVE_EVENT();
116
+ startTime = resetTime();
117
+ activityDuration = resetActivityDuration();
118
+ };
119
+ const resetActivityDuration = () => {
120
+ clearInterval(activityDuration.interval);
121
+ return DEFAULT_ACTIVITY_DURATION();
122
+ };
123
+ export const resetTpaasViewedContent = () => {
124
+ currentLeaveEvent = DEFAULT_PAGE_LEAVE_EVENT();
125
+ };
126
+ const resetTime = () => Date.now();
127
+ /*
128
+ Send a Leave event only if Page Leave tracking is active in the SDK
129
+ The event that is ultimately sent is a merge between the default event
130
+ saved in this file and the event supplied by the brand, with preference going
131
+ to the brand event. After the event has been sent, leave page tracking is removed
132
+ and must be explicitly re-added if needed.
133
+ */
134
+ export function trackTpaasActiveLeave() {
135
+ if (leaveTpaasTrackingIsActive()) {
136
+ trackTpaasLeave();
137
+ }
138
+ }
139
+ /*
140
+ Send a Leave event regardless of whether Page Leave tracking is active in the SDK
141
+ The event that is ultimately sent is a merge between the default event
142
+ saved in this file and the event supplied by the brand, with preference going
143
+ to the brand event. After the event has been sent, leave page tracking is removed
144
+ and must be explicitly re-added if needed.
145
+ */
146
+ export function trackTpaasLeave() {
147
+ const leave = getTpaasLeaveObject();
148
+ currentTrackMethod(leave);
149
+ removeTpaasLeaveTracking();
150
+ }
151
+ export function getTpaasLeaveObject() {
152
+ const endTime = Date.now();
153
+ const duration = endTime - startTime;
154
+ const leave = {
155
+ durationMs: duration,
156
+ activityDurationMs: activityDuration.value,
157
+ ...currentLeaveEvent,
158
+ };
159
+ logger.debug('trackTpaasLeave: event', leave);
160
+ return leave;
161
+ }
162
+ /*
163
+ Add listeners to update the viewed content fields in the default event
164
+ We listen to 'scroll' and 'resize' browser events
165
+ */
166
+ function addUpdateViewedContentListeners(objectElement, pageElement, objectResizable) {
167
+ updateTpaasViewedContent(objectElement, pageElement);
168
+ throttledUpdateFn = throttle(() => updateTpaasViewedContent(objectElement, pageElement), 500);
169
+ updateViewedContentListeners = addEventListeners([BrowserEvents.SCROLL, BrowserEvents.RESIZE], throttledUpdateFn);
170
+ if (objectResizable) {
171
+ if (!resizeObserver) {
172
+ resizeObserver = new ResizeObserver(() => {
173
+ resetTpaasViewedContent();
174
+ throttledUpdateFn();
175
+ });
176
+ }
177
+ resizeObserver.observe(objectElement);
178
+ }
179
+ }
180
+ /*
181
+ Update the viewed content fields that are used in the default event.
182
+ The includes fields are:
183
+ {pageScrollPosition} The absolute scroll position on the page in pixels.
184
+ {maxPageScrollPosition} The maximum scroll position the user has been on in pixels.
185
+ {objectViewPercentage} The relative scroll position of the supplied DOM element in pixels.
186
+ {maxObjectViewPercentage} The maximum relative scroll position of the supplied DOM element in pixels.
187
+ {pageViewPercentage} The relative scroll position of the user in %.
188
+ {maxPageViewPercentage} The maximum relative scroll position the user has seen in %.
189
+ */
190
+ export function updateTpaasViewedContent(objectElement, pageElement) {
191
+ const { totalHeight: additionalTotalHeight, viewedHeight: additionalViewedHeight } = isFunction(additionalHeightBuilder)
192
+ ? additionalHeightBuilder()
193
+ : { totalHeight: 0, viewedHeight: 0 };
194
+ const objectScrolledPixels = calculateScrolledPixels(objectElement) + additionalViewedHeight;
195
+ const pageScrolledPixels = calculateScrolledPixels(pageElement) + additionalViewedHeight;
196
+ const pageScrollPosition = calculateScrollPosition(pageElement) + additionalViewedHeight;
197
+ const maxPageScrollPosition = Math.max(pageScrollPosition, Number(currentLeaveEvent.maxPageScrollPosition));
198
+ const objectViewPercentage = calculateViewPercentage(objectScrolledPixels, objectElement.scrollHeight + additionalTotalHeight);
199
+ const maxObjectViewPercentage = Math.max(objectViewPercentage, Number(currentLeaveEvent.maxObjectViewPercentage));
200
+ const pageViewPercentage = calculateViewPercentage(pageScrolledPixels, pageElement.scrollHeight + additionalTotalHeight);
201
+ const maxPageViewPercentage = Math.max(pageViewPercentage, Number(currentLeaveEvent.maxPageViewPercentage));
202
+ logger.debug('updateViewedContent:before:engagement', { ...currentLeaveEvent });
203
+ currentLeaveEvent = {
204
+ pageScrollPosition,
205
+ maxPageScrollPosition,
206
+ objectViewPercentage,
207
+ maxObjectViewPercentage,
208
+ pageViewPercentage,
209
+ maxPageViewPercentage,
210
+ };
211
+ logger.debug('updateViewedContent:after:engagement', { ...currentLeaveEvent });
212
+ }
213
+ export const calculateScrolledPixels = (element) => {
214
+ const rect = element.getBoundingClientRect();
215
+ const scrolledPixels = isBrowser ? element.scrollHeight - rect.bottom + window.innerHeight : 0;
216
+ if (scrolledPixels <= 0) {
217
+ return 0;
218
+ }
219
+ return Math.min(scrolledPixels, element.scrollHeight);
220
+ };
221
+ export const calculateScrollPosition = (element) => Math.abs(Math.min(element.getBoundingClientRect().top, 0));
222
+ /*
223
+ Track the user's activity duration on the page.
224
+ The activity duration is the active time the user spends on the page.
225
+ Active means less than 30 seconds since the user triggered one of the
226
+ 'mousedown', 'mousemove', 'keydown', 'scroll' and/or 'touchstart' browser events.
227
+ */
228
+ function addUpdateActivityDurationListeners() {
229
+ if (activityDuration.interval !== undefined) {
230
+ // If the interval is already set, do not set it again
231
+ return;
232
+ }
233
+ const interval = 1000;
234
+ const activityTimeout = 30 * 1000;
235
+ activityDuration.interval = window.setInterval(() => {
236
+ activityDuration.timeSinceLastActivity += interval;
237
+ if (activityDuration.timeSinceLastActivity < activityTimeout) {
238
+ activityDuration.value += interval;
239
+ }
240
+ }, interval);
241
+ const activityEvents = [
242
+ BrowserEvents.SCROLL,
243
+ BrowserEvents.MOUSEDOWN,
244
+ BrowserEvents.MOUSEMOVE,
245
+ BrowserEvents.KEYDOWN,
246
+ BrowserEvents.TOUCHSTART,
247
+ ];
248
+ activityListeners = addEventListeners(activityEvents, () => {
249
+ activityDuration = resetLastActivity(activityDuration);
250
+ }, { passive: true });
251
+ }
252
+ function resetLastActivity(activityDuration) {
253
+ return {
254
+ ...activityDuration,
255
+ timeSinceLastActivity: 0,
256
+ };
257
+ }
258
+ /*
259
+ Add listeners to a set of browser events.
260
+ */
261
+ export function addEventListeners(events, handler, options) {
262
+ return events.map((eventName) => {
263
+ if (isBrowser) {
264
+ window.addEventListener(eventName, handler, options);
265
+ }
266
+ return [eventName, handler];
267
+ });
268
+ }
269
+ /*
270
+ Remove a set of listeners for browser events.
271
+ */
272
+ export function removeEventListeners(eventListeners, options = {}) {
273
+ for (const [eventName, listener] of eventListeners) {
274
+ if (isBrowser) {
275
+ window.removeEventListener(eventName, listener, options);
276
+ }
277
+ }
278
+ throttledUpdateFn.cancel();
279
+ return [];
280
+ }
281
+ /**
282
+ * Calculates the fraction of an element that has been scrolled into view,
283
+ * rounded to 2 decimal places and clamped to the [0, 1] range.
284
+ */
285
+ const calculateViewPercentage = (scrolledPixels, scrollHeight) => Math.min(1, Math.max(0, Math.round((scrolledPixels / scrollHeight) * 100) / 100));
286
+ export function shouldEnableLeaveTracking(leaveOptions) {
287
+ if (leaveOptions === false) {
288
+ return false;
289
+ }
290
+ return true;
291
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @typedef BrowserEvents
3
+ */
4
+ export var BrowserEvents;
5
+ (function (BrowserEvents) {
6
+ BrowserEvents["BEFORE_UNLOAD"] = "beforeunload";
7
+ BrowserEvents["PAGE_HIDE"] = "pagehide";
8
+ BrowserEvents["POP_STATE"] = "popstate";
9
+ BrowserEvents["VISIBILITY_CHANGE"] = "visibilitychange";
10
+ BrowserEvents["SCROLL"] = "scroll";
11
+ BrowserEvents["RESIZE"] = "resize";
12
+ BrowserEvents["MOUSEDOWN"] = "mousedown";
13
+ BrowserEvents["MOUSEMOVE"] = "mousemove";
14
+ BrowserEvents["KEYDOWN"] = "keydown";
15
+ BrowserEvents["TOUCHSTART"] = "touchstart";
16
+ })(BrowserEvents || (BrowserEvents = {}));
@@ -0,0 +1,32 @@
1
+ import { isBrowser } from '@schibsted/pulse-utils';
2
+ const supportsBeacon = () => isBrowser && Boolean(window.navigator.sendBeacon);
3
+ export default function send(url, data, sdkConfig) {
4
+ // if there is as large number of events, only send 10 in each request
5
+ const eventChunks = Array.isArray(data)
6
+ ? data.reduce((acc, event) => {
7
+ if (acc[0].length >= 10) {
8
+ // biome-ignore lint/style/noParameterAssign: -
9
+ acc = [[event]].concat(acc);
10
+ }
11
+ else {
12
+ acc[0].push(event);
13
+ }
14
+ return acc;
15
+ }, [[]])
16
+ : [[data]];
17
+ if (isBrowser && supportsBeacon() && (sdkConfig.useBeaconWhenAvailable || sdkConfig.useBeacon)) {
18
+ const result = eventChunks.reduce((previousStatus, eventChunk) => previousStatus && window.navigator.sendBeacon(url, JSON.stringify(eventChunk)), true);
19
+ if (result) {
20
+ return Promise.resolve(true);
21
+ }
22
+ return Promise.reject(false);
23
+ }
24
+ const requests = eventChunks.map((eventChunk) => fetch(url, {
25
+ headers: new Headers({
26
+ 'Content-Type': 'application/x-www-form-urlencoded',
27
+ }),
28
+ method: 'POST',
29
+ body: JSON.stringify(eventChunk),
30
+ }));
31
+ return Promise.all(requests);
32
+ }