@customerio/cdp-analytics-browser 0.0.1
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/LICENSE.MD +22 -0
- package/README.md +21 -0
- package/dist/cjs/browser/browser-umd.js +20 -0
- package/dist/cjs/browser/browser-umd.js.map +1 -0
- package/dist/cjs/browser/index.js +310 -0
- package/dist/cjs/browser/index.js.map +1 -0
- package/dist/cjs/browser/standalone-analytics.js +60 -0
- package/dist/cjs/browser/standalone-analytics.js.map +1 -0
- package/dist/cjs/browser/standalone.js +83 -0
- package/dist/cjs/browser/standalone.js.map +1 -0
- package/dist/cjs/core/analytics/index.js +544 -0
- package/dist/cjs/core/analytics/index.js.map +1 -0
- package/dist/cjs/core/analytics/interfaces.js +3 -0
- package/dist/cjs/core/analytics/interfaces.js.map +1 -0
- package/dist/cjs/core/arguments-resolver/index.js +106 -0
- package/dist/cjs/core/arguments-resolver/index.js.map +1 -0
- package/dist/cjs/core/auto-track.js +108 -0
- package/dist/cjs/core/auto-track.js.map +1 -0
- package/dist/cjs/core/buffer/index.js +237 -0
- package/dist/cjs/core/buffer/index.js.map +1 -0
- package/dist/cjs/core/buffer/snippet.js +30 -0
- package/dist/cjs/core/buffer/snippet.js.map +1 -0
- package/dist/cjs/core/callback/index.js +7 -0
- package/dist/cjs/core/callback/index.js.map +1 -0
- package/dist/cjs/core/connection/index.js +16 -0
- package/dist/cjs/core/connection/index.js.map +1 -0
- package/dist/cjs/core/context/index.js +19 -0
- package/dist/cjs/core/context/index.js.map +1 -0
- package/dist/cjs/core/environment/index.js +12 -0
- package/dist/cjs/core/environment/index.js.map +1 -0
- package/dist/cjs/core/events/index.js +134 -0
- package/dist/cjs/core/events/index.js.map +1 -0
- package/dist/cjs/core/events/interfaces.js +3 -0
- package/dist/cjs/core/events/interfaces.js.map +1 -0
- package/dist/cjs/core/inspector/index.js +14 -0
- package/dist/cjs/core/inspector/index.js.map +1 -0
- package/dist/cjs/core/plugin/index.js +3 -0
- package/dist/cjs/core/plugin/index.js.map +1 -0
- package/dist/cjs/core/query-string/gracefulDecodeURIComponent.js +20 -0
- package/dist/cjs/core/query-string/gracefulDecodeURIComponent.js.map +1 -0
- package/dist/cjs/core/query-string/index.js +48 -0
- package/dist/cjs/core/query-string/index.js.map +1 -0
- package/dist/cjs/core/query-string/pickPrefix.js +20 -0
- package/dist/cjs/core/query-string/pickPrefix.js.map +1 -0
- package/dist/cjs/core/queue/event-queue.js +15 -0
- package/dist/cjs/core/queue/event-queue.js.map +1 -0
- package/dist/cjs/core/stats/index.js +23 -0
- package/dist/cjs/core/stats/index.js.map +1 -0
- package/dist/cjs/core/stats/remote-metrics.js +107 -0
- package/dist/cjs/core/stats/remote-metrics.js.map +1 -0
- package/dist/cjs/core/user/index.js +422 -0
- package/dist/cjs/core/user/index.js.map +1 -0
- package/dist/cjs/core/user/tld.js +64 -0
- package/dist/cjs/core/user/tld.js.map +1 -0
- package/dist/cjs/generated/version.js +6 -0
- package/dist/cjs/generated/version.js.map +1 -0
- package/dist/cjs/index.js +11 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/bind-all.js +17 -0
- package/dist/cjs/lib/bind-all.js.map +1 -0
- package/dist/cjs/lib/browser-polyfill.js +22 -0
- package/dist/cjs/lib/browser-polyfill.js.map +1 -0
- package/dist/cjs/lib/create-deferred.js +21 -0
- package/dist/cjs/lib/create-deferred.js.map +1 -0
- package/dist/cjs/lib/csp-detection.js +33 -0
- package/dist/cjs/lib/csp-detection.js.map +1 -0
- package/dist/cjs/lib/embedded-write-key.js +22 -0
- package/dist/cjs/lib/embedded-write-key.js.map +1 -0
- package/dist/cjs/lib/fetch.js +19 -0
- package/dist/cjs/lib/fetch.js.map +1 -0
- package/dist/cjs/lib/get-global.js +21 -0
- package/dist/cjs/lib/get-global.js.map +1 -0
- package/dist/cjs/lib/get-process-env.js +15 -0
- package/dist/cjs/lib/get-process-env.js.map +1 -0
- package/dist/cjs/lib/group-by.js +28 -0
- package/dist/cjs/lib/group-by.js.map +1 -0
- package/dist/cjs/lib/is-plan-event-enabled.js +20 -0
- package/dist/cjs/lib/is-plan-event-enabled.js.map +1 -0
- package/dist/cjs/lib/is-thenable.js +15 -0
- package/dist/cjs/lib/is-thenable.js.map +1 -0
- package/dist/cjs/lib/load-script.js +56 -0
- package/dist/cjs/lib/load-script.js.map +1 -0
- package/dist/cjs/lib/merged-options.js +31 -0
- package/dist/cjs/lib/merged-options.js.map +1 -0
- package/dist/cjs/lib/on-page-leave.js +35 -0
- package/dist/cjs/lib/on-page-leave.js.map +1 -0
- package/dist/cjs/lib/p-while.js +25 -0
- package/dist/cjs/lib/p-while.js.map +1 -0
- package/dist/cjs/lib/parse-cdn.js +79 -0
- package/dist/cjs/lib/parse-cdn.js.map +1 -0
- package/dist/cjs/lib/priority-queue/backoff.js +10 -0
- package/dist/cjs/lib/priority-queue/backoff.js.map +1 -0
- package/dist/cjs/lib/priority-queue/index.js +7 -0
- package/dist/cjs/lib/priority-queue/index.js.map +1 -0
- package/dist/cjs/lib/priority-queue/persisted.js +108 -0
- package/dist/cjs/lib/priority-queue/persisted.js.map +1 -0
- package/dist/cjs/lib/sleep.js +10 -0
- package/dist/cjs/lib/sleep.js.map +1 -0
- package/dist/cjs/lib/to-facade.js +32 -0
- package/dist/cjs/lib/to-facade.js.map +1 -0
- package/dist/cjs/node/index.js +43 -0
- package/dist/cjs/node/index.js.map +1 -0
- package/dist/cjs/node/node.browser.js +13 -0
- package/dist/cjs/node/node.browser.js.map +1 -0
- package/dist/cjs/plugins/ajs-destination/index.js +345 -0
- package/dist/cjs/plugins/ajs-destination/index.js.map +1 -0
- package/dist/cjs/plugins/ajs-destination/loader.js +110 -0
- package/dist/cjs/plugins/ajs-destination/loader.js.map +1 -0
- package/dist/cjs/plugins/ajs-destination/types.js +3 -0
- package/dist/cjs/plugins/ajs-destination/types.js.map +1 -0
- package/dist/cjs/plugins/ajs-destination/utils.js +23 -0
- package/dist/cjs/plugins/ajs-destination/utils.js.map +1 -0
- package/dist/cjs/plugins/analytics-node/index.js +65 -0
- package/dist/cjs/plugins/analytics-node/index.js.map +1 -0
- package/dist/cjs/plugins/customerio/batched-dispatcher.js +102 -0
- package/dist/cjs/plugins/customerio/batched-dispatcher.js.map +1 -0
- package/dist/cjs/plugins/customerio/fetch-dispatcher.js +18 -0
- package/dist/cjs/plugins/customerio/fetch-dispatcher.js.map +1 -0
- package/dist/cjs/plugins/customerio/index.js +97 -0
- package/dist/cjs/plugins/customerio/index.js.map +1 -0
- package/dist/cjs/plugins/customerio/normalize.js +176 -0
- package/dist/cjs/plugins/customerio/normalize.js.map +1 -0
- package/dist/cjs/plugins/customerio/schedule-flush.js +76 -0
- package/dist/cjs/plugins/customerio/schedule-flush.js.map +1 -0
- package/dist/cjs/plugins/legacy-video-plugins/index.js +25 -0
- package/dist/cjs/plugins/legacy-video-plugins/index.js.map +1 -0
- package/dist/cjs/plugins/middleware/index.js +124 -0
- package/dist/cjs/plugins/middleware/index.js.map +1 -0
- package/dist/cjs/plugins/page-enrichment/index.js +98 -0
- package/dist/cjs/plugins/page-enrichment/index.js.map +1 -0
- package/dist/cjs/plugins/remote-loader/index.js +211 -0
- package/dist/cjs/plugins/remote-loader/index.js.map +1 -0
- package/dist/cjs/plugins/remote-middleware/index.js +70 -0
- package/dist/cjs/plugins/remote-middleware/index.js.map +1 -0
- package/dist/cjs/plugins/routing-middleware/index.js +26 -0
- package/dist/cjs/plugins/routing-middleware/index.js.map +1 -0
- package/dist/cjs/plugins/schema-filter/index.js +67 -0
- package/dist/cjs/plugins/schema-filter/index.js.map +1 -0
- package/dist/cjs/plugins/validation/index.js +70 -0
- package/dist/cjs/plugins/validation/index.js.map +1 -0
- package/dist/pkg/browser/browser-umd.js +17 -0
- package/dist/pkg/browser/browser-umd.js.map +1 -0
- package/dist/pkg/browser/index.js +306 -0
- package/dist/pkg/browser/index.js.map +1 -0
- package/dist/pkg/browser/standalone-analytics.js +56 -0
- package/dist/pkg/browser/standalone-analytics.js.map +1 -0
- package/dist/pkg/browser/standalone.js +81 -0
- package/dist/pkg/browser/standalone.js.map +1 -0
- package/dist/pkg/core/analytics/index.js +541 -0
- package/dist/pkg/core/analytics/index.js.map +1 -0
- package/dist/pkg/core/analytics/interfaces.js +2 -0
- package/dist/pkg/core/analytics/interfaces.js.map +1 -0
- package/dist/pkg/core/arguments-resolver/index.js +99 -0
- package/dist/pkg/core/arguments-resolver/index.js.map +1 -0
- package/dist/pkg/core/auto-track.js +103 -0
- package/dist/pkg/core/auto-track.js.map +1 -0
- package/dist/pkg/core/buffer/index.js +231 -0
- package/dist/pkg/core/buffer/index.js.map +1 -0
- package/dist/pkg/core/buffer/snippet.js +25 -0
- package/dist/pkg/core/buffer/snippet.js.map +1 -0
- package/dist/pkg/core/callback/index.js +2 -0
- package/dist/pkg/core/callback/index.js.map +1 -0
- package/dist/pkg/core/connection/index.js +11 -0
- package/dist/pkg/core/connection/index.js.map +1 -0
- package/dist/pkg/core/context/index.js +16 -0
- package/dist/pkg/core/context/index.js.map +1 -0
- package/dist/pkg/core/environment/index.js +7 -0
- package/dist/pkg/core/environment/index.js.map +1 -0
- package/dist/pkg/core/events/index.js +131 -0
- package/dist/pkg/core/events/index.js.map +1 -0
- package/dist/pkg/core/events/interfaces.js +2 -0
- package/dist/pkg/core/events/interfaces.js.map +1 -0
- package/dist/pkg/core/inspector/index.js +10 -0
- package/dist/pkg/core/inspector/index.js.map +1 -0
- package/dist/pkg/core/plugin/index.js +2 -0
- package/dist/pkg/core/plugin/index.js.map +1 -0
- package/dist/pkg/core/query-string/gracefulDecodeURIComponent.js +16 -0
- package/dist/pkg/core/query-string/gracefulDecodeURIComponent.js.map +1 -0
- package/dist/pkg/core/query-string/index.js +44 -0
- package/dist/pkg/core/query-string/index.js.map +1 -0
- package/dist/pkg/core/query-string/pickPrefix.js +16 -0
- package/dist/pkg/core/query-string/pickPrefix.js.map +1 -0
- package/dist/pkg/core/queue/event-queue.js +12 -0
- package/dist/pkg/core/queue/event-queue.js.map +1 -0
- package/dist/pkg/core/stats/index.js +20 -0
- package/dist/pkg/core/stats/index.js.map +1 -0
- package/dist/pkg/core/stats/remote-metrics.js +104 -0
- package/dist/pkg/core/stats/remote-metrics.js.map +1 -0
- package/dist/pkg/core/user/index.js +418 -0
- package/dist/pkg/core/user/index.js.map +1 -0
- package/dist/pkg/core/user/tld.js +59 -0
- package/dist/pkg/core/user/tld.js.map +1 -0
- package/dist/pkg/generated/version.js +3 -0
- package/dist/pkg/generated/version.js.map +1 -0
- package/dist/pkg/index.js +8 -0
- package/dist/pkg/index.js.map +1 -0
- package/dist/pkg/lib/bind-all.js +14 -0
- package/dist/pkg/lib/bind-all.js.map +1 -0
- package/dist/pkg/lib/browser-polyfill.js +18 -0
- package/dist/pkg/lib/browser-polyfill.js.map +1 -0
- package/dist/pkg/lib/create-deferred.js +17 -0
- package/dist/pkg/lib/create-deferred.js.map +1 -0
- package/dist/pkg/lib/csp-detection.js +29 -0
- package/dist/pkg/lib/csp-detection.js.map +1 -0
- package/dist/pkg/lib/embedded-write-key.js +18 -0
- package/dist/pkg/lib/embedded-write-key.js.map +1 -0
- package/dist/pkg/lib/fetch.js +14 -0
- package/dist/pkg/lib/fetch.js.map +1 -0
- package/dist/pkg/lib/get-global.js +17 -0
- package/dist/pkg/lib/get-global.js.map +1 -0
- package/dist/pkg/lib/get-process-env.js +11 -0
- package/dist/pkg/lib/get-process-env.js.map +1 -0
- package/dist/pkg/lib/group-by.js +24 -0
- package/dist/pkg/lib/group-by.js.map +1 -0
- package/dist/pkg/lib/is-plan-event-enabled.js +16 -0
- package/dist/pkg/lib/is-plan-event-enabled.js.map +1 -0
- package/dist/pkg/lib/is-thenable.js +11 -0
- package/dist/pkg/lib/is-thenable.js.map +1 -0
- package/dist/pkg/lib/load-script.js +51 -0
- package/dist/pkg/lib/load-script.js.map +1 -0
- package/dist/pkg/lib/merged-options.js +27 -0
- package/dist/pkg/lib/merged-options.js.map +1 -0
- package/dist/pkg/lib/on-page-leave.js +31 -0
- package/dist/pkg/lib/on-page-leave.js.map +1 -0
- package/dist/pkg/lib/p-while.js +21 -0
- package/dist/pkg/lib/p-while.js.map +1 -0
- package/dist/pkg/lib/parse-cdn.js +72 -0
- package/dist/pkg/lib/parse-cdn.js.map +1 -0
- package/dist/pkg/lib/priority-queue/backoff.js +6 -0
- package/dist/pkg/lib/priority-queue/backoff.js.map +1 -0
- package/dist/pkg/lib/priority-queue/index.js +3 -0
- package/dist/pkg/lib/priority-queue/index.js.map +1 -0
- package/dist/pkg/lib/priority-queue/persisted.js +105 -0
- package/dist/pkg/lib/priority-queue/persisted.js.map +1 -0
- package/dist/pkg/lib/sleep.js +6 -0
- package/dist/pkg/lib/sleep.js.map +1 -0
- package/dist/pkg/lib/to-facade.js +28 -0
- package/dist/pkg/lib/to-facade.js.map +1 -0
- package/dist/pkg/node/index.js +40 -0
- package/dist/pkg/node/index.js.map +1 -0
- package/dist/pkg/node/node.browser.js +10 -0
- package/dist/pkg/node/node.browser.js.map +1 -0
- package/dist/pkg/plugins/ajs-destination/index.js +341 -0
- package/dist/pkg/plugins/ajs-destination/index.js.map +1 -0
- package/dist/pkg/plugins/ajs-destination/loader.js +102 -0
- package/dist/pkg/plugins/ajs-destination/loader.js.map +1 -0
- package/dist/pkg/plugins/ajs-destination/types.js +2 -0
- package/dist/pkg/plugins/ajs-destination/types.js.map +1 -0
- package/dist/pkg/plugins/ajs-destination/utils.js +18 -0
- package/dist/pkg/plugins/ajs-destination/utils.js.map +1 -0
- package/dist/pkg/plugins/analytics-node/index.js +60 -0
- package/dist/pkg/plugins/analytics-node/index.js.map +1 -0
- package/dist/pkg/plugins/customerio/batched-dispatcher.js +99 -0
- package/dist/pkg/plugins/customerio/batched-dispatcher.js.map +1 -0
- package/dist/pkg/plugins/customerio/fetch-dispatcher.js +15 -0
- package/dist/pkg/plugins/customerio/fetch-dispatcher.js.map +1 -0
- package/dist/pkg/plugins/customerio/index.js +93 -0
- package/dist/pkg/plugins/customerio/index.js.map +1 -0
- package/dist/pkg/plugins/customerio/normalize.js +168 -0
- package/dist/pkg/plugins/customerio/normalize.js.map +1 -0
- package/dist/pkg/plugins/customerio/schedule-flush.js +72 -0
- package/dist/pkg/plugins/customerio/schedule-flush.js.map +1 -0
- package/dist/pkg/plugins/legacy-video-plugins/index.js +25 -0
- package/dist/pkg/plugins/legacy-video-plugins/index.js.map +1 -0
- package/dist/pkg/plugins/middleware/index.js +119 -0
- package/dist/pkg/plugins/middleware/index.js.map +1 -0
- package/dist/pkg/plugins/page-enrichment/index.js +93 -0
- package/dist/pkg/plugins/page-enrichment/index.js.map +1 -0
- package/dist/pkg/plugins/remote-loader/index.js +207 -0
- package/dist/pkg/plugins/remote-loader/index.js.map +1 -0
- package/dist/pkg/plugins/remote-middleware/index.js +66 -0
- package/dist/pkg/plugins/remote-middleware/index.js.map +1 -0
- package/dist/pkg/plugins/routing-middleware/index.js +21 -0
- package/dist/pkg/plugins/routing-middleware/index.js.map +1 -0
- package/dist/pkg/plugins/schema-filter/index.js +63 -0
- package/dist/pkg/plugins/schema-filter/index.js.map +1 -0
- package/dist/pkg/plugins/validation/index.js +63 -0
- package/dist/pkg/plugins/validation/index.js.map +1 -0
- package/dist/types/browser/browser-umd.d.ts +2 -0
- package/dist/types/browser/browser-umd.d.ts.map +1 -0
- package/dist/types/browser/index.d.ts +86 -0
- package/dist/types/browser/index.d.ts.map +1 -0
- package/dist/types/browser/standalone-analytics.d.ts +16 -0
- package/dist/types/browser/standalone-analytics.d.ts.map +1 -0
- package/dist/types/browser/standalone.d.ts +2 -0
- package/dist/types/browser/standalone.d.ts.map +1 -0
- package/dist/types/core/analytics/index.d.ts +116 -0
- package/dist/types/core/analytics/index.d.ts.map +1 -0
- package/dist/types/core/analytics/interfaces.d.ts +77 -0
- package/dist/types/core/analytics/interfaces.d.ts.map +1 -0
- package/dist/types/core/arguments-resolver/index.d.ts +34 -0
- package/dist/types/core/arguments-resolver/index.d.ts.map +1 -0
- package/dist/types/core/auto-track.d.ts +10 -0
- package/dist/types/core/auto-track.d.ts.map +1 -0
- package/dist/types/core/buffer/index.d.ts +86 -0
- package/dist/types/core/buffer/index.d.ts.map +1 -0
- package/dist/types/core/buffer/snippet.d.ts +10 -0
- package/dist/types/core/buffer/snippet.d.ts.map +1 -0
- package/dist/types/core/callback/index.d.ts +2 -0
- package/dist/types/core/callback/index.d.ts.map +1 -0
- package/dist/types/core/connection/index.d.ts +3 -0
- package/dist/types/core/connection/index.d.ts.map +1 -0
- package/dist/types/core/context/index.d.ts +9 -0
- package/dist/types/core/context/index.d.ts.map +1 -0
- package/dist/types/core/environment/index.d.ts +3 -0
- package/dist/types/core/environment/index.d.ts.map +1 -0
- package/dist/types/core/events/index.d.ts +21 -0
- package/dist/types/core/events/index.d.ts.map +1 -0
- package/dist/types/core/events/interfaces.d.ts +9 -0
- package/dist/types/core/events/interfaces.d.ts.map +1 -0
- package/dist/types/core/inspector/index.d.ts +3 -0
- package/dist/types/core/inspector/index.d.ts.map +1 -0
- package/dist/types/core/plugin/index.d.ts +11 -0
- package/dist/types/core/plugin/index.d.ts.map +1 -0
- package/dist/types/core/query-string/gracefulDecodeURIComponent.d.ts +9 -0
- package/dist/types/core/query-string/gracefulDecodeURIComponent.d.ts.map +1 -0
- package/dist/types/core/query-string/index.d.ts +7 -0
- package/dist/types/core/query-string/index.d.ts.map +1 -0
- package/dist/types/core/query-string/pickPrefix.d.ts +9 -0
- package/dist/types/core/query-string/pickPrefix.d.ts.map +1 -0
- package/dist/types/core/queue/event-queue.d.ts +8 -0
- package/dist/types/core/queue/event-queue.d.ts.map +1 -0
- package/dist/types/core/stats/index.d.ts +7 -0
- package/dist/types/core/stats/index.d.ts.map +1 -0
- package/dist/types/core/stats/remote-metrics.d.ts +29 -0
- package/dist/types/core/stats/remote-metrics.d.ts.map +1 -0
- package/dist/types/core/user/index.d.ts +128 -0
- package/dist/types/core/user/index.d.ts.map +1 -0
- package/dist/types/core/user/tld.d.ts +2 -0
- package/dist/types/core/user/tld.d.ts.map +1 -0
- package/dist/types/generated/version.d.ts +2 -0
- package/dist/types/generated/version.d.ts.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lib/bind-all.d.ts +4 -0
- package/dist/types/lib/bind-all.d.ts.map +1 -0
- package/dist/types/lib/browser-polyfill.d.ts +2 -0
- package/dist/types/lib/browser-polyfill.d.ts.map +1 -0
- package/dist/types/lib/create-deferred.d.ts +9 -0
- package/dist/types/lib/create-deferred.d.ts.map +1 -0
- package/dist/types/lib/csp-detection.d.ts +4 -0
- package/dist/types/lib/csp-detection.d.ts.map +1 -0
- package/dist/types/lib/embedded-write-key.d.ts +7 -0
- package/dist/types/lib/embedded-write-key.d.ts.map +1 -0
- package/dist/types/lib/fetch.d.ts +5 -0
- package/dist/types/lib/fetch.d.ts.map +1 -0
- package/dist/types/lib/get-global.d.ts +2 -0
- package/dist/types/lib/get-global.d.ts.map +1 -0
- package/dist/types/lib/get-process-env.d.ts +8 -0
- package/dist/types/lib/get-process-env.d.ts.map +1 -0
- package/dist/types/lib/group-by.d.ts +4 -0
- package/dist/types/lib/group-by.d.ts.map +1 -0
- package/dist/types/lib/is-plan-event-enabled.d.ts +9 -0
- package/dist/types/lib/is-plan-event-enabled.d.ts.map +1 -0
- package/dist/types/lib/is-thenable.d.ts +6 -0
- package/dist/types/lib/is-thenable.d.ts.map +1 -0
- package/dist/types/lib/load-script.d.ts +3 -0
- package/dist/types/lib/load-script.d.ts.map +1 -0
- package/dist/types/lib/merged-options.d.ts +13 -0
- package/dist/types/lib/merged-options.d.ts.map +1 -0
- package/dist/types/lib/on-page-leave.d.ts +11 -0
- package/dist/types/lib/on-page-leave.d.ts.map +1 -0
- package/dist/types/lib/p-while.d.ts +2 -0
- package/dist/types/lib/p-while.d.ts.map +1 -0
- package/dist/types/lib/parse-cdn.d.ts +10 -0
- package/dist/types/lib/parse-cdn.d.ts.map +1 -0
- package/dist/types/lib/priority-queue/backoff.d.ts +13 -0
- package/dist/types/lib/priority-queue/backoff.d.ts.map +1 -0
- package/dist/types/lib/priority-queue/index.d.ts +3 -0
- package/dist/types/lib/priority-queue/index.d.ts.map +1 -0
- package/dist/types/lib/priority-queue/persisted.d.ts +6 -0
- package/dist/types/lib/priority-queue/persisted.d.ts.map +1 -0
- package/dist/types/lib/sleep.d.ts +2 -0
- package/dist/types/lib/sleep.d.ts.map +1 -0
- package/dist/types/lib/to-facade.d.ts +7 -0
- package/dist/types/lib/to-facade.d.ts.map +1 -0
- package/dist/types/node/index.d.ts +8 -0
- package/dist/types/node/index.d.ts.map +1 -0
- package/dist/types/node/node.browser.d.ts +4 -0
- package/dist/types/node/node.browser.d.ts.map +1 -0
- package/dist/types/plugins/ajs-destination/index.d.ts +42 -0
- package/dist/types/plugins/ajs-destination/index.d.ts.map +1 -0
- package/dist/types/plugins/ajs-destination/loader.d.ts +12 -0
- package/dist/types/plugins/ajs-destination/loader.d.ts.map +1 -0
- package/dist/types/plugins/ajs-destination/types.d.ts +36 -0
- package/dist/types/plugins/ajs-destination/types.d.ts.map +1 -0
- package/dist/types/plugins/ajs-destination/utils.d.ts +5 -0
- package/dist/types/plugins/ajs-destination/utils.d.ts.map +1 -0
- package/dist/types/plugins/analytics-node/index.d.ts +12 -0
- package/dist/types/plugins/analytics-node/index.d.ts.map +1 -0
- package/dist/types/plugins/customerio/batched-dispatcher.d.ts +8 -0
- package/dist/types/plugins/customerio/batched-dispatcher.d.ts.map +1 -0
- package/dist/types/plugins/customerio/fetch-dispatcher.d.ts +8 -0
- package/dist/types/plugins/customerio/fetch-dispatcher.d.ts.map +1 -0
- package/dist/types/plugins/customerio/index.d.ts +26 -0
- package/dist/types/plugins/customerio/index.d.ts.map +1 -0
- package/dist/types/plugins/customerio/normalize.d.ts +12 -0
- package/dist/types/plugins/customerio/normalize.d.ts.map +1 -0
- package/dist/types/plugins/customerio/schedule-flush.d.ts +5 -0
- package/dist/types/plugins/customerio/schedule-flush.d.ts.map +1 -0
- package/dist/types/plugins/legacy-video-plugins/index.d.ts +3 -0
- package/dist/types/plugins/legacy-video-plugins/index.d.ts.map +1 -0
- package/dist/types/plugins/middleware/index.d.ts +18 -0
- package/dist/types/plugins/middleware/index.d.ts.map +1 -0
- package/dist/types/plugins/page-enrichment/index.d.ts +21 -0
- package/dist/types/plugins/page-enrichment/index.d.ts.map +1 -0
- package/dist/types/plugins/remote-loader/index.d.ts +43 -0
- package/dist/types/plugins/remote-loader/index.d.ts.map +1 -0
- package/dist/types/plugins/remote-middleware/index.d.ts +5 -0
- package/dist/types/plugins/remote-middleware/index.d.ts.map +1 -0
- package/dist/types/plugins/routing-middleware/index.d.ts +13 -0
- package/dist/types/plugins/routing-middleware/index.d.ts.map +1 -0
- package/dist/types/plugins/schema-filter/index.d.ts +5 -0
- package/dist/types/plugins/schema-filter/index.d.ts.map +1 -0
- package/dist/types/plugins/validation/index.d.ts +7 -0
- package/dist/types/plugins/validation/index.d.ts.map +1 -0
- package/dist/umd/799.bundle.f804d7b881cf284fbd56.js +1 -0
- package/dist/umd/799.bundle.f804d7b881cf284fbd56.js.gz +0 -0
- package/dist/umd/870.bundle.e0b7bfa4797bb87217c9.js +1 -0
- package/dist/umd/870.bundle.e0b7bfa4797bb87217c9.js.gz +0 -0
- package/dist/umd/ajs-destination.bundle.847bf422720e5616c9d5.js +1 -0
- package/dist/umd/ajs-destination.bundle.847bf422720e5616c9d5.js.gz +0 -0
- package/dist/umd/auto-track.bundle.758629f7a47544af2d44.js +1 -0
- package/dist/umd/auto-track.bundle.758629f7a47544af2d44.js.gz +0 -0
- package/dist/umd/index.js +1 -0
- package/dist/umd/index.js.gz +0 -0
- package/dist/umd/legacyVideos.bundle.d7ac356ab28fab36e111.js +1 -0
- package/dist/umd/legacyVideos.bundle.d7ac356ab28fab36e111.js.gz +0 -0
- package/dist/umd/queryString.bundle.913501e40ce64ef92884.js +1 -0
- package/dist/umd/queryString.bundle.913501e40ce64ef92884.js.gz +0 -0
- package/dist/umd/remoteMiddleware.bundle.3bc569811c4c2c93d90c.js +1 -0
- package/dist/umd/remoteMiddleware.bundle.3bc569811c4c2c93d90c.js.gz +0 -0
- package/dist/umd/schemaFilter.bundle.bb8180ae95843c8f138e.js +1 -0
- package/dist/umd/schemaFilter.bundle.bb8180ae95843c8f138e.js.gz +0 -0
- package/dist/umd/standalone.js +1 -0
- package/dist/umd/standalone.js.gz +0 -0
- package/dist/umd/tsub-middleware.bundle.af0f402084ddd2b605cc.js +1 -0
- package/dist/umd/tsub-middleware.bundle.af0f402084ddd2b605cc.js.gz +0 -0
- package/package.json +103 -0
- package/src/browser/browser-umd.ts +19 -0
- package/src/browser/index.ts +397 -0
- package/src/browser/standalone-analytics.ts +74 -0
- package/src/browser/standalone.ts +78 -0
- package/src/core/analytics/index.ts +567 -0
- package/src/core/analytics/interfaces.ts +100 -0
- package/src/core/arguments-resolver/index.ts +166 -0
- package/src/core/auto-track.ts +152 -0
- package/src/core/buffer/index.ts +289 -0
- package/src/core/buffer/snippet.ts +43 -0
- package/src/core/callback/index.ts +1 -0
- package/src/core/connection/index.ts +13 -0
- package/src/core/context/index.ts +21 -0
- package/src/core/environment/index.ts +7 -0
- package/src/core/events/index.ts +254 -0
- package/src/core/events/interfaces.ts +36 -0
- package/src/core/inspector/index.ts +14 -0
- package/src/core/plugin/index.ts +12 -0
- package/src/core/query-string/gracefulDecodeURIComponent.ts +16 -0
- package/src/core/query-string/index.ts +64 -0
- package/src/core/query-string/pickPrefix.ts +20 -0
- package/src/core/queue/event-queue.ts +11 -0
- package/src/core/stats/index.ts +15 -0
- package/src/core/stats/remote-metrics.ts +137 -0
- package/src/core/user/index.ts +534 -0
- package/src/core/user/tld.ts +65 -0
- package/src/generated/version.ts +2 -0
- package/src/index.ts +10 -0
- package/src/lib/bind-all.ts +19 -0
- package/src/lib/browser-polyfill.ts +23 -0
- package/src/lib/create-deferred.ts +16 -0
- package/src/lib/csp-detection.ts +26 -0
- package/src/lib/embedded-write-key.ts +24 -0
- package/src/lib/fetch.ts +10 -0
- package/src/lib/get-global.ts +16 -0
- package/src/lib/get-process-env.ts +11 -0
- package/src/lib/group-by.ts +30 -0
- package/src/lib/is-plan-event-enabled.ts +20 -0
- package/src/lib/is-thenable.ts +9 -0
- package/src/lib/load-script.ts +66 -0
- package/src/lib/merged-options.ts +46 -0
- package/src/lib/on-page-leave.ts +29 -0
- package/src/lib/p-while.ts +12 -0
- package/src/lib/parse-cdn.ts +85 -0
- package/src/lib/priority-queue/backoff.ts +24 -0
- package/src/lib/priority-queue/index.ts +6 -0
- package/src/lib/priority-queue/persisted.ts +127 -0
- package/src/lib/sleep.ts +4 -0
- package/src/lib/to-facade.ts +53 -0
- package/src/node/index.ts +36 -0
- package/src/node/node.browser.ts +7 -0
- package/src/plugins/ajs-destination/index.ts +388 -0
- package/src/plugins/ajs-destination/loader.ts +127 -0
- package/src/plugins/ajs-destination/types.ts +44 -0
- package/src/plugins/ajs-destination/utils.ts +34 -0
- package/src/plugins/analytics-node/index.ts +64 -0
- package/src/plugins/customerio/batched-dispatcher.ts +115 -0
- package/src/plugins/customerio/fetch-dispatcher.ts +24 -0
- package/src/plugins/customerio/index.ts +142 -0
- package/src/plugins/customerio/normalize.ts +223 -0
- package/src/plugins/customerio/schedule-flush.ts +58 -0
- package/src/plugins/legacy-video-plugins/index.ts +16 -0
- package/src/plugins/middleware/index.ts +131 -0
- package/src/plugins/page-enrichment/index.ts +127 -0
- package/src/plugins/remote-loader/index.ts +240 -0
- package/src/plugins/remote-middleware/index.ts +44 -0
- package/src/plugins/routing-middleware/index.ts +37 -0
- package/src/plugins/schema-filter/index.ts +90 -0
- package/src/plugins/validation/index.ts +80 -0
- package/src/test-helpers/browser-storage.ts +72 -0
- package/src/test-helpers/factories.ts +18 -0
- package/src/test-helpers/fetch-parse.ts +8 -0
- package/src/test-helpers/fixtures/cdn-settings.ts +299 -0
- package/src/test-helpers/fixtures/classic-destination.ts +25 -0
- package/src/test-helpers/fixtures/create-fetch-method.ts +24 -0
- package/src/test-helpers/test-writekeys.ts +5 -0
- package/src/test-helpers/type-assertions.ts +11 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface Window {
|
|
3
|
+
analyticsWriteKey?: string
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// This variable is used as an optional fallback for when customers
|
|
8
|
+
// host or proxy their own analytics.js.
|
|
9
|
+
try {
|
|
10
|
+
window.analyticsWriteKey = '__WRITE_KEY__'
|
|
11
|
+
} catch (_) {
|
|
12
|
+
// @ eslint-disable-next-line
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function embeddedWriteKey(): string | undefined {
|
|
16
|
+
if (window.analyticsWriteKey === undefined) {
|
|
17
|
+
return undefined
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// this is done so that we don't accidentally override every reference to __write_key__
|
|
21
|
+
return window.analyticsWriteKey !== ['__', 'WRITE', '_', 'KEY', '__'].join('')
|
|
22
|
+
? window.analyticsWriteKey
|
|
23
|
+
: undefined
|
|
24
|
+
}
|
package/src/lib/fetch.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import unfetch from 'unfetch'
|
|
2
|
+
import { getGlobal } from './get-global'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Wrapper around native `fetch` containing `unfetch` fallback.
|
|
6
|
+
*/
|
|
7
|
+
export const fetch: typeof global.fetch = (...args) => {
|
|
8
|
+
const global = getGlobal()
|
|
9
|
+
return ((global && global.fetch) || unfetch)(...args)
|
|
10
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// This an imperfect polyfill for globalThis
|
|
2
|
+
export const getGlobal = () => {
|
|
3
|
+
if (typeof globalThis !== 'undefined') {
|
|
4
|
+
return globalThis
|
|
5
|
+
}
|
|
6
|
+
if (typeof self !== 'undefined') {
|
|
7
|
+
return self
|
|
8
|
+
}
|
|
9
|
+
if (typeof window !== 'undefined') {
|
|
10
|
+
return window
|
|
11
|
+
}
|
|
12
|
+
if (typeof global !== 'undefined') {
|
|
13
|
+
return global
|
|
14
|
+
}
|
|
15
|
+
return null
|
|
16
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns `process.env` if it is available in the environment.
|
|
3
|
+
* Always returns an object make it similarly easy to use as `process.env`.
|
|
4
|
+
*/
|
|
5
|
+
export function getProcessEnv(): { [key: string]: string | undefined } {
|
|
6
|
+
if (typeof process === 'undefined' || !process.env) {
|
|
7
|
+
return {}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return process.env
|
|
11
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
type Grouper<T> = (obj: T) => string | number
|
|
2
|
+
|
|
3
|
+
export function groupBy<T>(
|
|
4
|
+
collection: T[],
|
|
5
|
+
grouper: keyof T | Grouper<T>
|
|
6
|
+
): Record<string, T[]> {
|
|
7
|
+
const results: Record<string, T[]> = {}
|
|
8
|
+
|
|
9
|
+
collection.forEach((item) => {
|
|
10
|
+
let key: string | number | undefined = undefined
|
|
11
|
+
|
|
12
|
+
if (typeof grouper === 'string') {
|
|
13
|
+
const suggestedKey = item[grouper]
|
|
14
|
+
key =
|
|
15
|
+
typeof suggestedKey !== 'string'
|
|
16
|
+
? JSON.stringify(suggestedKey)
|
|
17
|
+
: suggestedKey
|
|
18
|
+
} else if (grouper instanceof Function) {
|
|
19
|
+
key = grouper(item)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (key === undefined) {
|
|
23
|
+
return
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
results[key] = [...(results[key] ?? []), item]
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
return results
|
|
30
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PlanEvent, TrackPlan } from '../core/events/interfaces'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Determines whether a track event is allowed to be sent based on the
|
|
5
|
+
* user's tracking plan.
|
|
6
|
+
* If the user does not have a tracking plan or the event is allowed based
|
|
7
|
+
* on the tracking plan configuration, returns true.
|
|
8
|
+
*/
|
|
9
|
+
export function isPlanEventEnabled(
|
|
10
|
+
plan: TrackPlan | undefined,
|
|
11
|
+
planEvent: PlanEvent | undefined
|
|
12
|
+
): boolean {
|
|
13
|
+
// Always prioritize the event's `enabled` status
|
|
14
|
+
if (typeof planEvent?.enabled === 'boolean') {
|
|
15
|
+
return planEvent.enabled
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Assume absence of a tracking plan means events are enabled
|
|
19
|
+
return plan?.__default?.enabled ?? true
|
|
20
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
function findScript(src: string): HTMLScriptElement | undefined {
|
|
2
|
+
const scripts = Array.prototype.slice.call(
|
|
3
|
+
window.document.querySelectorAll('script')
|
|
4
|
+
)
|
|
5
|
+
return scripts.find((s) => s.src === src)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function loadScript(
|
|
9
|
+
src: string,
|
|
10
|
+
attributes?: Record<string, string>
|
|
11
|
+
): Promise<HTMLScriptElement> {
|
|
12
|
+
const found = findScript(src)
|
|
13
|
+
|
|
14
|
+
if (found !== undefined) {
|
|
15
|
+
const status = found?.getAttribute('status')
|
|
16
|
+
|
|
17
|
+
if (status === 'loaded') {
|
|
18
|
+
return Promise.resolve(found)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (status === 'loading') {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
found.addEventListener('load', () => resolve(found))
|
|
24
|
+
found.addEventListener('error', (err) => reject(err))
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
const script = window.document.createElement('script')
|
|
31
|
+
|
|
32
|
+
script.type = 'text/javascript'
|
|
33
|
+
script.src = src
|
|
34
|
+
script.async = true
|
|
35
|
+
|
|
36
|
+
script.setAttribute('status', 'loading')
|
|
37
|
+
for (const [k, v] of Object.entries(attributes ?? {})) {
|
|
38
|
+
script.setAttribute(k, v)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
script.onload = (): void => {
|
|
42
|
+
script.onerror = script.onload = null
|
|
43
|
+
script.setAttribute('status', 'loaded')
|
|
44
|
+
resolve(script)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
script.onerror = (): void => {
|
|
48
|
+
script.onerror = script.onload = null
|
|
49
|
+
script.setAttribute('status', 'error')
|
|
50
|
+
reject(new Error(`Failed to load ${src}`))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const tag = window.document.getElementsByTagName('script')[0]
|
|
54
|
+
tag.parentElement?.insertBefore(script, tag)
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function unloadScript(src: string): Promise<void> {
|
|
59
|
+
const found = findScript(src)
|
|
60
|
+
|
|
61
|
+
if (found !== undefined) {
|
|
62
|
+
found.remove()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return Promise.resolve()
|
|
66
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { JSONObject, Options } from '../core/events/interfaces'
|
|
2
|
+
import { LegacySettings } from '../browser'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Merge legacy settings and initialized Integration option overrides.
|
|
6
|
+
*
|
|
7
|
+
* This will merge any options that were passed from initialization into
|
|
8
|
+
* overrides for settings that are returned by the CDN.
|
|
9
|
+
*
|
|
10
|
+
* i.e. this allows for passing options directly into destinations from
|
|
11
|
+
* the Analytics constructor.
|
|
12
|
+
*/
|
|
13
|
+
export function mergedOptions(
|
|
14
|
+
settings: LegacySettings,
|
|
15
|
+
options: Options
|
|
16
|
+
): Record<string, JSONObject> {
|
|
17
|
+
const optionOverrides = Object.entries(options.integrations ?? {}).reduce(
|
|
18
|
+
(overrides, [integration, options]) => {
|
|
19
|
+
if (typeof options === 'object') {
|
|
20
|
+
return {
|
|
21
|
+
...overrides,
|
|
22
|
+
[integration]: options,
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
...overrides,
|
|
28
|
+
[integration]: {},
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{} as Record<string, JSONObject>
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
return Object.entries(settings.integrations).reduce(
|
|
35
|
+
(integrationSettings, [integration, settings]) => {
|
|
36
|
+
return {
|
|
37
|
+
...integrationSettings,
|
|
38
|
+
[integration]: {
|
|
39
|
+
...settings,
|
|
40
|
+
...optionOverrides[integration],
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
{} as Record<string, JSONObject>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register event listener on document that fires when:
|
|
3
|
+
* * tab change or tab close (in mobile or desktop)
|
|
4
|
+
* * click back / forward button
|
|
5
|
+
* * click any link or perform any other navigation action
|
|
6
|
+
* * soft refresh / hard refresh
|
|
7
|
+
*
|
|
8
|
+
* adapted from https://stackoverflow.com/questions/3239834/window-onbeforeunload-not-working-on-the-ipad/52864508#52864508,
|
|
9
|
+
*/
|
|
10
|
+
export const onPageLeave = (cb: (...args: unknown[]) => void) => {
|
|
11
|
+
let unloaded = false // prevents double firing if both are supported
|
|
12
|
+
|
|
13
|
+
window.addEventListener('pagehide', () => {
|
|
14
|
+
if (unloaded) return
|
|
15
|
+
unloaded = true
|
|
16
|
+
cb()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
// using document instead of window because of bug affecting browsers before safari 14 (detail in footnotes https://caniuse.com/?search=visibilitychange)
|
|
20
|
+
document.addEventListener('visibilitychange', () => {
|
|
21
|
+
if (document.visibilityState == 'hidden') {
|
|
22
|
+
if (unloaded) return
|
|
23
|
+
unloaded = true
|
|
24
|
+
cb()
|
|
25
|
+
} else {
|
|
26
|
+
unloaded = false
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const pWhile = async <T>(
|
|
2
|
+
condition: (value: T | undefined) => boolean,
|
|
3
|
+
action: () => T | PromiseLike<T>
|
|
4
|
+
): Promise<void> => {
|
|
5
|
+
const loop = async (actionResult: T | undefined): Promise<void> => {
|
|
6
|
+
if (condition(actionResult)) {
|
|
7
|
+
return loop(await action())
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return loop(undefined)
|
|
12
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { embeddedWriteKey } from './embedded-write-key'
|
|
2
|
+
|
|
3
|
+
const analyticsScriptRegex =
|
|
4
|
+
/(https:\/\/.*)\/analytics\.js\/v1\/(?:.*?)\/(?:platform|analytics.*)?/
|
|
5
|
+
const getCDNUrlFromScriptTag = (): string | undefined => {
|
|
6
|
+
let cdn: string | undefined
|
|
7
|
+
const scripts = Array.prototype.slice.call(
|
|
8
|
+
document.querySelectorAll('script')
|
|
9
|
+
)
|
|
10
|
+
scripts.forEach((s) => {
|
|
11
|
+
const src = s.getAttribute('src') ?? ''
|
|
12
|
+
const result = analyticsScriptRegex.exec(src)
|
|
13
|
+
|
|
14
|
+
if (result && result[1]) {
|
|
15
|
+
cdn = result[1]
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
return cdn
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
let _globalCDN: string | undefined // set globalCDN as in-memory singleton
|
|
22
|
+
const getGlobalCDNUrl = (): string | undefined => {
|
|
23
|
+
const result = _globalCDN ?? window.analytics?._cdn
|
|
24
|
+
return result
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const setGlobalCDNUrl = (cdn: string) => {
|
|
28
|
+
if (window.analytics) {
|
|
29
|
+
window.analytics._cdn = cdn
|
|
30
|
+
}
|
|
31
|
+
_globalCDN = cdn
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const getCDN = (): string => {
|
|
35
|
+
const globalCdnUrl = getGlobalCDNUrl()
|
|
36
|
+
|
|
37
|
+
if (globalCdnUrl) return globalCdnUrl
|
|
38
|
+
|
|
39
|
+
const cdnFromScriptTag = getCDNUrlFromScriptTag()
|
|
40
|
+
|
|
41
|
+
if (cdnFromScriptTag) {
|
|
42
|
+
return cdnFromScriptTag
|
|
43
|
+
} else {
|
|
44
|
+
// it's possible that the CDN is not found in the page because:
|
|
45
|
+
// - the script is loaded through a proxy
|
|
46
|
+
// - the script is removed after execution
|
|
47
|
+
// in this case, we fall back to the default CDN
|
|
48
|
+
return `https://cdp.customer.io`
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const getNextIntegrationsURL = () => {
|
|
53
|
+
const cdn = getCDN()
|
|
54
|
+
return `${cdn}/v1/analytics-js/actions`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Replaces the CDN URL in the script tag with the one from Analytics.js 1.0
|
|
59
|
+
*
|
|
60
|
+
* @returns the path to Analytics JS 1.0
|
|
61
|
+
**/
|
|
62
|
+
export function getLegacyAJSPath(): string {
|
|
63
|
+
const writeKey = embeddedWriteKey() ?? window.analytics._writeKey
|
|
64
|
+
|
|
65
|
+
const scripts = Array.prototype.slice.call(
|
|
66
|
+
document.querySelectorAll('script')
|
|
67
|
+
)
|
|
68
|
+
let path: string | undefined = undefined
|
|
69
|
+
|
|
70
|
+
for (const s of scripts) {
|
|
71
|
+
const src = s.getAttribute('src') ?? ''
|
|
72
|
+
const result = analyticsScriptRegex.exec(src)
|
|
73
|
+
|
|
74
|
+
if (result && result[1]) {
|
|
75
|
+
path = src
|
|
76
|
+
break
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (path) {
|
|
81
|
+
return path.replace('analytics.min.js', 'analytics.classic.js')
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return `https://cdp.customer.io/analytics.js/v1/${writeKey}/analytics.classic.js`
|
|
85
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type BackoffParams = {
|
|
2
|
+
/** The number of milliseconds before starting the first retry. Default is 500 */
|
|
3
|
+
minTimeout?: number
|
|
4
|
+
|
|
5
|
+
/** The maximum number of milliseconds between two retries. Default is Infinity */
|
|
6
|
+
maxTimeout?: number
|
|
7
|
+
|
|
8
|
+
/** The exponential factor to use. Default is 2. */
|
|
9
|
+
factor?: number
|
|
10
|
+
|
|
11
|
+
/** The current attempt */
|
|
12
|
+
attempt: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function backoff(params: BackoffParams): number {
|
|
16
|
+
const random = Math.random() + 1
|
|
17
|
+
const {
|
|
18
|
+
minTimeout = 500,
|
|
19
|
+
factor = 2,
|
|
20
|
+
attempt,
|
|
21
|
+
maxTimeout = Infinity,
|
|
22
|
+
} = params
|
|
23
|
+
return Math.min(random * minTimeout * Math.pow(factor, attempt), maxTimeout)
|
|
24
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { PriorityQueue } from '.'
|
|
2
|
+
import { Context, SerializedContext } from '../../core/context'
|
|
3
|
+
import { isBrowser } from '../../core/environment'
|
|
4
|
+
|
|
5
|
+
let loc:
|
|
6
|
+
| Storage
|
|
7
|
+
| { getItem: () => void; setItem: () => void; removeItem: () => void } = {
|
|
8
|
+
getItem() {},
|
|
9
|
+
setItem() {},
|
|
10
|
+
removeItem() {},
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
loc = isBrowser() && window.localStorage ? window.localStorage : loc
|
|
15
|
+
} catch (err) {
|
|
16
|
+
console.warn('Unable to access localStorage', err)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function persisted(key: string): Context[] {
|
|
20
|
+
const items = loc.getItem(key)
|
|
21
|
+
return (items ? JSON.parse(items) : []).map(
|
|
22
|
+
(p: SerializedContext) => new Context(p.event, p.id)
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function persistItems(key: string, items: Context[]): void {
|
|
27
|
+
const existing = persisted(key)
|
|
28
|
+
const all = [...items, ...existing]
|
|
29
|
+
|
|
30
|
+
const merged = all.reduce((acc, item) => {
|
|
31
|
+
return {
|
|
32
|
+
...acc,
|
|
33
|
+
[item.id]: item,
|
|
34
|
+
}
|
|
35
|
+
}, {} as Record<string, Context>)
|
|
36
|
+
|
|
37
|
+
loc.setItem(key, JSON.stringify(Object.values(merged)))
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function seen(key: string): Record<string, number> {
|
|
41
|
+
const stored = loc.getItem(key)
|
|
42
|
+
return stored ? JSON.parse(stored) : {}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function persistSeen(key: string, memory: Record<string, number>): void {
|
|
46
|
+
const stored = seen(key)
|
|
47
|
+
|
|
48
|
+
loc.setItem(
|
|
49
|
+
key,
|
|
50
|
+
JSON.stringify({
|
|
51
|
+
...stored,
|
|
52
|
+
...memory,
|
|
53
|
+
})
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function remove(key: string): void {
|
|
58
|
+
loc.removeItem(key)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const now = (): number => new Date().getTime()
|
|
62
|
+
|
|
63
|
+
function mutex(key: string, onUnlock: Function, attempt = 0): void {
|
|
64
|
+
const lockTimeout = 50
|
|
65
|
+
const lockKey = `persisted-queue:v1:${key}:lock`
|
|
66
|
+
|
|
67
|
+
const expired = (lock: number): boolean => new Date().getTime() > lock
|
|
68
|
+
const rawLock = loc.getItem(lockKey)
|
|
69
|
+
const lock = rawLock ? (JSON.parse(rawLock) as number) : null
|
|
70
|
+
|
|
71
|
+
const allowed = lock === null || expired(lock)
|
|
72
|
+
if (allowed) {
|
|
73
|
+
loc.setItem(lockKey, JSON.stringify(now() + lockTimeout))
|
|
74
|
+
onUnlock()
|
|
75
|
+
loc.removeItem(lockKey)
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!allowed && attempt < 3) {
|
|
80
|
+
setTimeout(() => {
|
|
81
|
+
mutex(key, onUnlock, attempt + 1)
|
|
82
|
+
}, lockTimeout)
|
|
83
|
+
} else {
|
|
84
|
+
console.error('Unable to retrieve lock')
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export class PersistedPriorityQueue extends PriorityQueue<Context> {
|
|
89
|
+
constructor(maxAttempts: number, key: string) {
|
|
90
|
+
super(maxAttempts, [])
|
|
91
|
+
|
|
92
|
+
const itemsKey = `persisted-queue:v1:${key}:items`
|
|
93
|
+
const seenKey = `persisted-queue:v1:${key}:seen`
|
|
94
|
+
|
|
95
|
+
let saved: Context[] = []
|
|
96
|
+
let lastSeen: Record<string, number> = {}
|
|
97
|
+
|
|
98
|
+
mutex(key, () => {
|
|
99
|
+
try {
|
|
100
|
+
saved = persisted(itemsKey)
|
|
101
|
+
lastSeen = seen(seenKey)
|
|
102
|
+
remove(itemsKey)
|
|
103
|
+
remove(seenKey)
|
|
104
|
+
|
|
105
|
+
this.queue = [...saved, ...this.queue]
|
|
106
|
+
this.seen = { ...lastSeen, ...this.seen }
|
|
107
|
+
} catch (err) {
|
|
108
|
+
console.error(err)
|
|
109
|
+
}
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
window.addEventListener('pagehide', () => {
|
|
113
|
+
// we deliberately want to use the less powerful 'pagehide' API to only persist on events where the analytics instance gets destroyed, and not on tab away.
|
|
114
|
+
if (this.todo > 0) {
|
|
115
|
+
const items = [...this.queue, ...this.future]
|
|
116
|
+
try {
|
|
117
|
+
mutex(key, () => {
|
|
118
|
+
persistItems(itemsKey, items)
|
|
119
|
+
persistSeen(seenKey, this.seen)
|
|
120
|
+
})
|
|
121
|
+
} catch (err) {
|
|
122
|
+
console.error(err)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
})
|
|
126
|
+
}
|
|
127
|
+
}
|
package/src/lib/sleep.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Alias,
|
|
3
|
+
Facade,
|
|
4
|
+
Group,
|
|
5
|
+
Identify,
|
|
6
|
+
Options,
|
|
7
|
+
Page,
|
|
8
|
+
Screen,
|
|
9
|
+
Track,
|
|
10
|
+
} from '@segment/facade'
|
|
11
|
+
import { CustomerioEvent } from '../core/events'
|
|
12
|
+
|
|
13
|
+
export type CustomerioFacade = Facade<CustomerioEvent> & {
|
|
14
|
+
obj: CustomerioEvent
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function toFacade(
|
|
18
|
+
evt: CustomerioEvent,
|
|
19
|
+
options?: Options
|
|
20
|
+
): CustomerioFacade {
|
|
21
|
+
let fcd = new Facade(evt, options)
|
|
22
|
+
|
|
23
|
+
if (evt.type === 'track') {
|
|
24
|
+
fcd = new Track(evt, options)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (evt.type === 'identify') {
|
|
28
|
+
fcd = new Identify(evt, options)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (evt.type === 'page') {
|
|
32
|
+
fcd = new Page(evt, options)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (evt.type === 'alias') {
|
|
36
|
+
fcd = new Alias(evt, options)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (evt.type === 'group') {
|
|
40
|
+
fcd = new Group(evt, options)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (evt.type === 'screen') {
|
|
44
|
+
fcd = new Screen(evt, options)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
Object.defineProperty(fcd, 'obj', {
|
|
48
|
+
value: evt,
|
|
49
|
+
writable: true,
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
return fcd as CustomerioFacade
|
|
53
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Analytics } from '../core/analytics'
|
|
2
|
+
import { Context } from '../core/context'
|
|
3
|
+
import { validation } from '../plugins/validation'
|
|
4
|
+
import { analyticsNode } from '../plugins/analytics-node'
|
|
5
|
+
import { Plugin } from '../core/plugin'
|
|
6
|
+
import { EventQueue } from '../core/queue/event-queue'
|
|
7
|
+
import { PriorityQueue } from '../lib/priority-queue'
|
|
8
|
+
|
|
9
|
+
export class AnalyticsNode {
|
|
10
|
+
static async load(settings: {
|
|
11
|
+
writeKey: string
|
|
12
|
+
}): Promise<[Analytics, Context]> {
|
|
13
|
+
const cookieOptions = {
|
|
14
|
+
persist: false,
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const queue = new EventQueue(new PriorityQueue(3, []))
|
|
18
|
+
const options = { user: cookieOptions, group: cookieOptions }
|
|
19
|
+
const analytics = new Analytics(settings, options, queue)
|
|
20
|
+
|
|
21
|
+
const nodeSettings = {
|
|
22
|
+
writeKey: settings.writeKey,
|
|
23
|
+
name: 'analytics-node-next',
|
|
24
|
+
type: 'after' as Plugin['type'],
|
|
25
|
+
version: 'latest',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const ctx = await analytics.register(
|
|
29
|
+
validation,
|
|
30
|
+
analyticsNode(nodeSettings)
|
|
31
|
+
)
|
|
32
|
+
analytics.emit('initialize', settings, cookieOptions ?? {})
|
|
33
|
+
|
|
34
|
+
return [analytics, ctx]
|
|
35
|
+
}
|
|
36
|
+
}
|