@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.
- package/dist/cjs/EventBus/EventBus.js +146 -0
- package/dist/cjs/Tracker.js +2499 -0
- package/dist/cjs/Tracker.test-d.js +76 -0
- package/dist/cjs/app-integration.js +40 -0
- package/dist/cjs/builders/actor.js +60 -0
- package/dist/cjs/builders/consent-manager.js +134 -0
- package/dist/cjs/builders/consents.js +149 -0
- package/dist/cjs/builders/device-browser.js +89 -0
- package/dist/cjs/builders/device-node.js +63 -0
- package/dist/cjs/builders/device.js +23 -0
- package/dist/cjs/builders/events-anonymous-browser.js +6 -0
- package/dist/cjs/builders/events-anonymous-node.js +88 -0
- package/dist/cjs/builders/events-anonymous.js +17 -0
- package/dist/cjs/builders/events-browser.js +8 -0
- package/dist/cjs/builders/events-node.js +127 -0
- package/dist/cjs/builders/events.js +17 -0
- package/dist/cjs/builders/experimentMetadata.js +25 -0
- package/dist/cjs/builders/experiments.js +32 -0
- package/dist/cjs/builders/index.js +52 -0
- package/dist/cjs/builders/location.js +38 -0
- package/dist/cjs/builders/objects/objects-anonymous-browser.js +36 -0
- package/dist/cjs/builders/objects/objects-anonymous-node.js +95 -0
- package/dist/cjs/builders/objects/objects-anonymous.js +23 -0
- package/dist/cjs/builders/objects/objects-browser.js +36 -0
- package/dist/cjs/builders/objects/objects-node.js +126 -0
- package/dist/cjs/builders/objects/objects.js +23 -0
- package/dist/cjs/builders/objects/utils.js +23 -0
- package/dist/cjs/builders/origin-browser.js +28 -0
- package/dist/cjs/builders/origin-node.js +29 -0
- package/dist/cjs/builders/origin.js +23 -0
- package/dist/cjs/builders/provider.js +24 -0
- package/dist/cjs/builders/session-browser.js +97 -0
- package/dist/cjs/builders/session-node.js +9 -0
- package/dist/cjs/builders/session.js +23 -0
- package/dist/cjs/builders/tracker-browser.js +34 -0
- package/dist/cjs/builders/tracker-node.js +22 -0
- package/dist/cjs/builders/trackerBuilder.js +23 -0
- package/dist/cjs/config-browser.js +26 -0
- package/dist/cjs/config.js +9 -0
- package/dist/cjs/createPulseTracker.js +50 -0
- package/dist/cjs/defer.js +20 -0
- package/dist/cjs/getPulseTracker.js +74 -0
- package/dist/cjs/identity/actor.js +60 -0
- package/dist/cjs/identity/advertising.js +62 -0
- package/dist/cjs/identity/cis.js +66 -0
- package/dist/cjs/identity/device.js +20 -0
- package/dist/cjs/identity/index.js +20 -0
- package/dist/cjs/index.js +57 -0
- package/dist/cjs/leaveTracking/constants.js +26 -0
- package/dist/cjs/leaveTracking/index.js +368 -0
- package/dist/cjs/leaveTracking/types.js +19 -0
- package/dist/cjs/leaveTrackingTpaas/constants.js +18 -0
- package/dist/cjs/leaveTrackingTpaas/index.js +341 -0
- package/dist/cjs/leaveTrackingTpaas/types.js +19 -0
- package/dist/cjs/network-browser.js +35 -0
- package/dist/cjs/network.js +15 -0
- package/dist/cjs/remoteConfig/index.js +124 -0
- package/dist/cjs/tracker-proxy/consts.js +72 -0
- package/dist/cjs/tracker-proxy/proxy-provider.js +68 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/version.json +1 -0
- package/dist/cjs/visibility-observer/index.js +101 -0
- package/dist/cjs/warnOnce.js +11 -0
- package/dist/cjs/wrapper/engagement/ui-element/event-builder.js +21 -0
- package/dist/cjs/wrapper/engagement/ui-element/types.js +2 -0
- package/dist/cjs/wrapper/types/base-event.js +2 -0
- package/dist/cjs/wrapper/types/engagement-event.js +2 -0
- package/dist/cjs/wrapper/types/event.js +2 -0
- package/dist/cjs/wrapper/types/index.js +19 -0
- package/dist/cjs/wrapper/types/utils.js +2 -0
- package/dist/cjs/wrapper/utils/get-navigation-type.js +32 -0
- package/dist/cjs/wrapper/utils/page-from-page-view.js +9 -0
- package/dist/cjs/wrapper/view/article/event-builder.js +19 -0
- package/dist/cjs/wrapper/view/article/types.js +2 -0
- package/dist/cjs/wrapper/view/frontpage/event-builder.js +16 -0
- package/dist/cjs/wrapper/view/frontpage/types.js +2 -0
- package/dist/cjs/wrapper/view/listing/event-builder.js +14 -0
- package/dist/cjs/wrapper/view/listing/types.js +2 -0
- package/dist/cjs/wrapper/view/loginposter/event-builder.js +11 -0
- package/dist/cjs/wrapper/view/loginposter/types.js +2 -0
- package/dist/cjs/wrapper/view/page/event-builder.js +18 -0
- package/dist/cjs/wrapper/view/page/types.js +2 -0
- package/dist/cjs/wrapper/view/salesposter/event-builder.js +18 -0
- package/dist/cjs/wrapper/view/salesposter/types.js +2 -0
- package/dist/cjs/wrapper/view/ui-element/event-builder.js +15 -0
- package/dist/cjs/wrapper/view/ui-element/types.js +2 -0
- package/dist/ejs/EventBus/EventBus.js +140 -0
- package/dist/ejs/Tracker.js +2455 -0
- package/dist/ejs/Tracker.test-d.js +71 -0
- package/dist/ejs/app-integration.js +33 -0
- package/dist/ejs/builders/actor.js +53 -0
- package/dist/ejs/builders/consent-manager.js +125 -0
- package/dist/ejs/builders/consents.js +138 -0
- package/dist/ejs/builders/device-browser.js +69 -0
- package/dist/ejs/builders/device-node.js +57 -0
- package/dist/ejs/builders/device.js +2 -0
- package/dist/ejs/builders/events-anonymous-browser.js +1 -0
- package/dist/ejs/builders/events-anonymous-node.js +48 -0
- package/dist/ejs/builders/events-anonymous.js +1 -0
- package/dist/ejs/builders/events-browser.js +1 -0
- package/dist/ejs/builders/events-node.js +84 -0
- package/dist/ejs/builders/events.js +1 -0
- package/dist/ejs/builders/experimentMetadata.js +21 -0
- package/dist/ejs/builders/experiments.js +27 -0
- package/dist/ejs/builders/index.js +12 -0
- package/dist/ejs/builders/location.js +34 -0
- package/dist/ejs/builders/objects/objects-anonymous-browser.js +14 -0
- package/dist/ejs/builders/objects/objects-anonymous-node.js +90 -0
- package/dist/ejs/builders/objects/objects-anonymous.js +2 -0
- package/dist/ejs/builders/objects/objects-browser.js +14 -0
- package/dist/ejs/builders/objects/objects-node.js +121 -0
- package/dist/ejs/builders/objects/objects.js +2 -0
- package/dist/ejs/builders/objects/utils.js +20 -0
- package/dist/ejs/builders/origin-browser.js +6 -0
- package/dist/ejs/builders/origin-node.js +24 -0
- package/dist/ejs/builders/origin.js +2 -0
- package/dist/ejs/builders/provider.js +18 -0
- package/dist/ejs/builders/session-browser.js +90 -0
- package/dist/ejs/builders/session-node.js +4 -0
- package/dist/ejs/builders/session.js +2 -0
- package/dist/ejs/builders/tracker-browser.js +13 -0
- package/dist/ejs/builders/tracker-node.js +14 -0
- package/dist/ejs/builders/trackerBuilder.js +2 -0
- package/dist/ejs/config-browser.js +23 -0
- package/dist/ejs/config.js +6 -0
- package/dist/ejs/createPulseTracker.js +44 -0
- package/dist/ejs/defer.js +17 -0
- package/dist/ejs/getPulseTracker.js +71 -0
- package/dist/ejs/identity/actor.js +51 -0
- package/dist/ejs/identity/advertising.js +57 -0
- package/dist/ejs/identity/cis.js +58 -0
- package/dist/ejs/identity/device.js +17 -0
- package/dist/ejs/identity/index.js +4 -0
- package/dist/ejs/index.js +9 -0
- package/dist/ejs/leaveTracking/constants.js +19 -0
- package/dist/ejs/leaveTracking/index.js +319 -0
- package/dist/ejs/leaveTracking/types.js +16 -0
- package/dist/ejs/leaveTrackingTpaas/constants.js +13 -0
- package/dist/ejs/leaveTrackingTpaas/index.js +291 -0
- package/dist/ejs/leaveTrackingTpaas/types.js +16 -0
- package/dist/ejs/network-browser.js +32 -0
- package/dist/ejs/network.js +12 -0
- package/dist/ejs/remoteConfig/index.js +111 -0
- package/dist/ejs/tracker-proxy/consts.js +68 -0
- package/dist/ejs/tracker-proxy/proxy-provider.js +62 -0
- package/dist/ejs/types.js +1 -0
- package/dist/ejs/version.json +1 -0
- package/dist/ejs/visibility-observer/index.js +97 -0
- package/dist/ejs/warnOnce.js +9 -0
- package/dist/ejs/wrapper/engagement/ui-element/event-builder.js +17 -0
- package/dist/ejs/wrapper/engagement/ui-element/types.js +1 -0
- package/dist/ejs/wrapper/types/base-event.js +1 -0
- package/dist/ejs/wrapper/types/engagement-event.js +1 -0
- package/dist/ejs/wrapper/types/event.js +1 -0
- package/dist/ejs/wrapper/types/index.js +3 -0
- package/dist/ejs/wrapper/types/utils.js +1 -0
- package/dist/ejs/wrapper/utils/get-navigation-type.js +29 -0
- package/dist/ejs/wrapper/utils/page-from-page-view.js +6 -0
- package/dist/ejs/wrapper/view/article/event-builder.js +15 -0
- package/dist/ejs/wrapper/view/article/types.js +1 -0
- package/dist/ejs/wrapper/view/frontpage/event-builder.js +12 -0
- package/dist/ejs/wrapper/view/frontpage/types.js +1 -0
- package/dist/ejs/wrapper/view/listing/event-builder.js +10 -0
- package/dist/ejs/wrapper/view/listing/types.js +1 -0
- package/dist/ejs/wrapper/view/loginposter/event-builder.js +7 -0
- package/dist/ejs/wrapper/view/loginposter/types.js +1 -0
- package/dist/ejs/wrapper/view/page/event-builder.js +14 -0
- package/dist/ejs/wrapper/view/page/types.js +1 -0
- package/dist/ejs/wrapper/view/salesposter/event-builder.js +14 -0
- package/dist/ejs/wrapper/view/salesposter/types.js +1 -0
- package/dist/ejs/wrapper/view/ui-element/event-builder.js +11 -0
- package/dist/ejs/wrapper/view/ui-element/types.js +1 -0
- package/dist/types/EventBus/EventBus.d.ts +106 -0
- package/dist/types/Tracker.d.ts +1418 -0
- package/dist/types/Tracker.test-d.d.ts +1 -0
- package/dist/types/app-integration.d.ts +10 -0
- package/dist/types/builders/actor.d.ts +39 -0
- package/dist/types/builders/consent-manager.d.ts +49 -0
- package/dist/types/builders/consents.d.ts +107 -0
- package/dist/types/builders/device-browser.d.ts +6 -0
- package/dist/types/builders/device-node.d.ts +65 -0
- package/dist/types/builders/device.d.ts +2 -0
- package/dist/types/builders/events-anonymous-browser.d.ts +1 -0
- package/dist/types/builders/events-anonymous-node.d.ts +82 -0
- package/dist/types/builders/events-anonymous.d.ts +1 -0
- package/dist/types/builders/events-browser.d.ts +1 -0
- package/dist/types/builders/events-node.d.ts +130 -0
- package/dist/types/builders/events.d.ts +1 -0
- package/dist/types/builders/experimentMetadata.d.ts +25 -0
- package/dist/types/builders/experiments.d.ts +24 -0
- package/dist/types/builders/index.d.ts +23 -0
- package/dist/types/builders/location.d.ts +34 -0
- package/dist/types/builders/objects/objects-anonymous-browser.d.ts +11 -0
- package/dist/types/builders/objects/objects-anonymous-node.d.ts +52 -0
- package/dist/types/builders/objects/objects-anonymous.d.ts +2 -0
- package/dist/types/builders/objects/objects-browser.d.ts +11 -0
- package/dist/types/builders/objects/objects-node.d.ts +60 -0
- package/dist/types/builders/objects/objects.d.ts +2 -0
- package/dist/types/builders/objects/utils.d.ts +1 -0
- package/dist/types/builders/origin-browser.d.ts +5 -0
- package/dist/types/builders/origin-node.d.ts +18 -0
- package/dist/types/builders/origin.d.ts +2 -0
- package/dist/types/builders/provider.d.ts +14 -0
- package/dist/types/builders/session-browser.d.ts +20 -0
- package/dist/types/builders/session-node.d.ts +3 -0
- package/dist/types/builders/session.d.ts +2 -0
- package/dist/types/builders/tracker-browser.d.ts +2 -0
- package/dist/types/builders/tracker-node.d.ts +14 -0
- package/dist/types/builders/trackerBuilder.d.ts +2 -0
- package/dist/types/config-browser.d.ts +23 -0
- package/dist/types/config.d.ts +6 -0
- package/dist/types/createPulseTracker.d.ts +21 -0
- package/dist/types/defer.d.ts +28 -0
- package/dist/types/getPulseTracker.d.ts +59 -0
- package/dist/types/identity/actor.d.ts +28 -0
- package/dist/types/identity/advertising.d.ts +30 -0
- package/dist/types/identity/cis.d.ts +21 -0
- package/dist/types/identity/device.d.ts +12 -0
- package/dist/types/identity/index.d.ts +4 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/leaveTracking/constants.d.ts +26 -0
- package/dist/types/leaveTracking/index.d.ts +23 -0
- package/dist/types/leaveTracking/types.d.ts +78 -0
- package/dist/types/leaveTrackingTpaas/constants.d.ts +13 -0
- package/dist/types/leaveTrackingTpaas/index.d.ts +28 -0
- package/dist/types/leaveTrackingTpaas/types.d.ts +45 -0
- package/dist/types/network-browser.d.ts +5 -0
- package/dist/types/network.d.ts +4 -0
- package/dist/types/remoteConfig/index.d.ts +32 -0
- package/dist/types/tracker-proxy/consts.d.ts +45 -0
- package/dist/types/tracker-proxy/proxy-provider.d.ts +2 -0
- package/dist/types/types.d.ts +93 -0
- package/dist/types/visibility-observer/index.d.ts +38 -0
- package/dist/types/warnOnce.d.ts +2 -0
- package/dist/types/wrapper/engagement/ui-element/event-builder.d.ts +3 -0
- package/dist/types/wrapper/engagement/ui-element/types.d.ts +29 -0
- package/dist/types/wrapper/types/base-event.d.ts +74 -0
- package/dist/types/wrapper/types/engagement-event.d.ts +5 -0
- package/dist/types/wrapper/types/event.d.ts +41 -0
- package/dist/types/wrapper/types/index.d.ts +3 -0
- package/dist/types/wrapper/types/utils.d.ts +5 -0
- package/dist/types/wrapper/utils/get-navigation-type.d.ts +3 -0
- package/dist/types/wrapper/utils/page-from-page-view.d.ts +3 -0
- package/dist/types/wrapper/view/article/event-builder.d.ts +2 -0
- package/dist/types/wrapper/view/article/types.d.ts +27 -0
- package/dist/types/wrapper/view/frontpage/event-builder.d.ts +2 -0
- package/dist/types/wrapper/view/frontpage/types.d.ts +18 -0
- package/dist/types/wrapper/view/listing/event-builder.d.ts +2 -0
- package/dist/types/wrapper/view/listing/types.d.ts +27 -0
- package/dist/types/wrapper/view/loginposter/event-builder.d.ts +2 -0
- package/dist/types/wrapper/view/loginposter/types.d.ts +14 -0
- package/dist/types/wrapper/view/page/event-builder.d.ts +2 -0
- package/dist/types/wrapper/view/page/types.d.ts +16 -0
- package/dist/types/wrapper/view/salesposter/event-builder.d.ts +2 -0
- package/dist/types/wrapper/view/salesposter/types.d.ts +15 -0
- package/dist/types/wrapper/view/ui-element/event-builder.d.ts +3 -0
- package/dist/types/wrapper/view/ui-element/types.d.ts +28 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.d.ts +26 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.js +273 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis-browser.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis.d.ts +10 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis.js +7 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/cis.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/eventEmitter.d.ts +14 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/eventEmitter.js +39 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/eventEmitter.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/index.d.ts +4 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/index.js +12 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/index.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/pulse-cookie.d.ts +55 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/pulse-cookie.js +276 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/pulse-cookie.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.d.ts +36 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.js +87 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/pulseStorage.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.d.ts +6 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.js +21 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/storage/storage.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/types.d.ts +24 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/types.js +3 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/cjs/types.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.d.ts +26 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.js +203 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis-browser.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis.d.ts +10 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis.js +4 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/cis.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/eventEmitter.d.ts +14 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/eventEmitter.js +35 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/eventEmitter.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/index.d.ts +4 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/index.js +3 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/index.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/pulse-cookie.d.ts +55 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/pulse-cookie.js +254 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/pulse-cookie.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.d.ts +36 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.js +50 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/pulseStorage.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.d.ts +6 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.js +17 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/storage/storage.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/types.d.ts +24 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/types.js +2 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/ejs/types.js.map +1 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/cis-browser.d.ts +26 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/cis.d.ts +10 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/eventEmitter.d.ts +14 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/index.d.ts +4 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/pulse-cookie.d.ts +55 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/storage/pulseStorage.d.ts +36 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/storage/storage.d.ts +6 -0
- package/node_modules/@schibsted/pulse-cis-sync/dist/types/types.d.ts +24 -0
- package/node_modules/@schibsted/pulse-cis-sync/package.json +44 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/cookie-config.js +10 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/cookie.js +86 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/events.js +109 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/get.js +18 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/getRootDomain.js +54 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/index.js +38 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/merge.js +38 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/objects.js +34 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/omit.js +9 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/randomString.js +18 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/throttle.js +34 -0
- package/node_modules/@schibsted/pulse-utils/dist/cjs/webApi.js +21 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/cookie-config.js +7 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/cookie.js +81 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/events.js +103 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/get.js +15 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/getRootDomain.js +49 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/index.js +11 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/merge.js +35 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/objects.js +26 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/omit.js +6 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/randomString.js +15 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/throttle.js +31 -0
- package/node_modules/@schibsted/pulse-utils/dist/ejs/webApi.js +17 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/cookie-config.d.ts +7 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/cookie.d.ts +23 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/events.d.ts +17 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/get.d.ts +1 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/getRootDomain.d.ts +13 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/index.d.ts +11 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/merge.d.ts +4 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/objects.d.ts +6 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/omit.d.ts +3 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/randomString.d.ts +1 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/throttle.d.ts +3 -0
- package/node_modules/@schibsted/pulse-utils/dist/types/webApi.d.ts +10 -0
- package/node_modules/@schibsted/pulse-utils/package.json +36 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/anonymous.js +8 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/baseEvent.js +9 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/consents.js +15 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/device.js +211 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/experiments.js +11 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/navigationType.js +52 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/pageInfo.js +24 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/pageviewId.js +11 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/provider.js +12 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/referrer.js +19 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/session.js +114 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/time.js +15 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/trackerBuilder.js +15 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/user.js +26 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders/utm.js +35 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/builders.js +264 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/index.js +17 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/cjs/types.js +2 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/anonymous.js +5 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/baseEvent.js +6 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/consents.js +12 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/device.js +174 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/experiments.js +7 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/navigationType.js +48 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/pageInfo.js +20 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/pageviewId.js +7 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/provider.js +9 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/referrer.js +15 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/session.js +108 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/time.js +11 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/trackerBuilder.js +11 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/user.js +22 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders/utm.js +31 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/builders.js +209 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/index.js +1 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/ejs/types.js +1 -0
- package/node_modules/@schibsted/tpaas-event-builder/dist/index.d.ts +5171 -0
- package/node_modules/@schibsted/tpaas-event-builder/package.json +40 -0
- package/node_modules/@schibsted/tpaas-schemas/dist/cjs/constants.js +62 -1
- package/node_modules/@schibsted/tpaas-schemas/dist/ejs/constants.js +61 -0
- package/node_modules/@schibsted/tpaas-schemas/dist/index.d.ts +128 -0
- package/package.json +58 -13
- package/CHANGELOG.md +0 -1035
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -47
- 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
|
+
}
|