@newrelic/browser-agent 0.1.230 → 1.232.0
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/README.md +27 -3
- package/dist/cjs/common/browser-version/ios-version.js +4 -3
- package/dist/cjs/common/config/state/configurable.js +27 -21
- package/dist/cjs/common/config/state/info.js +1 -1
- package/dist/cjs/common/config/state/init.js +9 -1
- package/dist/cjs/common/config/state/loader-config.js +1 -1
- package/dist/cjs/common/config/state/runtime.js +26 -28
- package/dist/cjs/common/constants/env.cdn.js +29 -0
- package/dist/cjs/common/constants/env.js +32 -0
- package/dist/cjs/common/constants/env.npm.js +30 -0
- package/dist/cjs/common/context/shared-context.js +2 -1
- package/dist/cjs/common/event-emitter/contextual-ee.test.js +282 -0
- package/dist/cjs/common/event-emitter/handle.test.js +58 -0
- package/dist/cjs/common/event-emitter/register-handler.test.js +55 -0
- package/dist/cjs/common/event-listener/event-listener-opts.js +4 -2
- package/dist/cjs/common/harvest/harvest-scheduler.js +14 -11
- package/dist/cjs/common/harvest/harvest.js +5 -3
- package/dist/cjs/common/ids/id.js +14 -6
- package/dist/cjs/common/ids/id.test.js +85 -0
- package/dist/cjs/common/ids/unique-id.js +75 -51
- package/dist/cjs/common/ids/unique-id.test.js +49 -0
- package/dist/cjs/common/session/constants.js +12 -0
- package/dist/cjs/common/session/session-entity.js +278 -0
- package/dist/cjs/common/session/session-entity.test.js +436 -0
- package/dist/cjs/common/storage/first-party-cookies.js +35 -0
- package/dist/cjs/common/storage/local-memory.js +35 -0
- package/dist/cjs/common/storage/local-memory.test.js +20 -0
- package/dist/cjs/common/storage/local-storage.js +33 -0
- package/dist/cjs/common/storage/local-storage.test.js +14 -0
- package/dist/cjs/common/timer/interaction-timer.js +78 -0
- package/dist/cjs/common/timer/interaction-timer.test.js +216 -0
- package/dist/cjs/common/timer/timer.js +32 -0
- package/dist/cjs/common/timer/timer.test.js +105 -0
- package/dist/cjs/common/timing/nav-timing.js +51 -30
- package/dist/cjs/common/timing/nav-timing.test.js +192 -0
- package/dist/cjs/common/unload/eol.js +2 -2
- package/dist/cjs/common/url/clean-url.test.js +9 -0
- package/dist/cjs/common/url/encode.test.js +74 -0
- package/dist/cjs/common/url/location.js +4 -0
- package/dist/cjs/common/url/location.test.js +13 -0
- package/dist/cjs/common/url/parse-url.test.js +111 -0
- package/dist/cjs/common/url/protocol.js +2 -12
- package/dist/cjs/common/url/protocol.test.js +16 -0
- package/dist/cjs/common/util/console.js +1 -1
- package/dist/cjs/common/util/data-size.js +6 -0
- package/dist/cjs/common/util/data-size.test.js +47 -0
- package/dist/cjs/common/util/invoke.js +73 -0
- package/dist/cjs/common/util/invoke.test.js +49 -0
- package/dist/cjs/common/util/map-own.test.js +3 -3
- package/dist/cjs/common/util/obfuscate.js +1 -5
- package/dist/cjs/common/window/page-visibility.js +5 -2
- package/dist/cjs/common/wrap/index.js +0 -7
- package/dist/cjs/common/wrap/wrap-events.js +6 -9
- package/dist/cjs/common/wrap/wrap-fetch.js +6 -6
- package/dist/cjs/common/wrap/wrap-history.js +7 -6
- package/dist/cjs/common/wrap/wrap-jsonp.js +7 -6
- package/dist/cjs/common/wrap/wrap-mutation.js +7 -6
- package/dist/cjs/common/wrap/wrap-promise.js +7 -6
- package/dist/cjs/common/wrap/wrap-promise.test.js +119 -0
- package/dist/cjs/common/wrap/wrap-raf.js +6 -6
- package/dist/cjs/common/wrap/wrap-timer.js +7 -7
- package/dist/cjs/common/wrap/wrap-xhr.js +5 -6
- package/dist/cjs/features/ajax/aggregate/index.js +3 -3
- package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.test.js +5 -5
- package/dist/cjs/features/jserrors/aggregate/format-stack-trace.test.js +1 -1
- package/dist/cjs/features/jserrors/aggregate/index.js +6 -6
- package/dist/cjs/features/jserrors/instrument/index.js +2 -2
- package/dist/cjs/features/metrics/aggregate/index.js +19 -9
- package/dist/cjs/features/metrics/instrument/index.js +0 -25
- package/dist/cjs/features/metrics/instrument/workers-helper.js +5 -5
- package/dist/cjs/features/page_action/aggregate/index.js +3 -3
- package/dist/cjs/features/page_view_event/aggregate/index.js +23 -9
- package/dist/cjs/features/page_view_timing/aggregate/index.js +40 -30
- package/dist/cjs/features/session_trace/aggregate/index.js +18 -15
- package/dist/cjs/features/spa/aggregate/index.js +6 -5
- package/dist/cjs/features/utils/agent-session.js +73 -0
- package/dist/cjs/features/utils/feature-base.js +1 -1
- package/dist/cjs/features/utils/instrument-base.js +12 -3
- package/dist/cjs/features/utils/lazy-loader.js +2 -2
- package/dist/cjs/loaders/agent.js +2 -2
- package/dist/cjs/loaders/api/api.js +9 -9
- package/dist/cjs/loaders/api/apiAsync.js +3 -2
- package/dist/cjs/loaders/configure/configure.js +0 -6
- package/dist/cjs/loaders/features/enabled-features.js +1 -1
- package/dist/cjs/loaders/micro-agent.js +2 -1
- package/dist/esm/common/browser-version/ios-version.js +4 -3
- package/dist/esm/common/config/state/configurable.js +26 -20
- package/dist/esm/common/config/state/info.js +1 -1
- package/dist/esm/common/config/state/init.js +9 -1
- package/dist/esm/common/config/state/loader-config.js +1 -1
- package/dist/esm/common/config/state/runtime.js +26 -28
- package/dist/esm/common/constants/env.cdn.js +20 -0
- package/dist/esm/common/constants/env.js +23 -0
- package/dist/esm/common/constants/env.npm.js +21 -0
- package/dist/esm/common/context/shared-context.js +2 -1
- package/dist/esm/common/event-emitter/contextual-ee.test.js +278 -0
- package/dist/esm/common/event-emitter/handle.test.js +54 -0
- package/dist/esm/common/event-emitter/register-handler.test.js +51 -0
- package/dist/esm/common/event-listener/event-listener-opts.js +4 -2
- package/dist/esm/common/harvest/harvest-scheduler.js +14 -11
- package/dist/esm/common/harvest/harvest.js +4 -2
- package/dist/esm/common/ids/id.js +16 -6
- package/dist/esm/common/ids/id.test.js +81 -0
- package/dist/esm/common/ids/unique-id.js +75 -51
- package/dist/esm/common/ids/unique-id.test.js +44 -0
- package/dist/esm/common/session/constants.js +3 -0
- package/dist/esm/common/session/session-entity.js +271 -0
- package/dist/esm/common/session/session-entity.test.js +434 -0
- package/dist/esm/common/storage/first-party-cookies.js +28 -0
- package/dist/esm/common/storage/local-memory.js +28 -0
- package/dist/esm/common/storage/local-memory.test.js +18 -0
- package/dist/esm/common/storage/local-storage.js +26 -0
- package/dist/esm/common/storage/local-storage.test.js +12 -0
- package/dist/esm/common/timer/interaction-timer.js +71 -0
- package/dist/esm/common/timer/interaction-timer.test.js +214 -0
- package/dist/esm/common/timer/timer.js +25 -0
- package/dist/esm/common/timer/timer.test.js +103 -0
- package/dist/esm/common/timing/nav-timing.js +51 -29
- package/dist/esm/common/timing/nav-timing.test.js +190 -0
- package/dist/esm/common/unload/eol.js +1 -1
- package/dist/esm/common/url/clean-url.test.js +7 -0
- package/dist/esm/common/url/encode.test.js +70 -0
- package/dist/esm/common/url/location.js +4 -0
- package/dist/esm/common/url/location.test.js +11 -0
- package/dist/esm/common/url/parse-url.test.js +107 -0
- package/dist/esm/common/url/protocol.js +3 -12
- package/dist/esm/common/url/protocol.test.js +14 -0
- package/dist/esm/common/util/console.js +1 -1
- package/dist/esm/common/util/data-size.js +7 -0
- package/dist/esm/common/util/data-size.test.js +45 -0
- package/dist/esm/common/util/invoke.js +66 -0
- package/dist/esm/common/util/invoke.test.js +47 -0
- package/dist/esm/common/util/map-own.test.js +3 -3
- package/dist/esm/common/util/obfuscate.js +2 -6
- package/dist/esm/common/window/page-visibility.js +5 -2
- package/dist/esm/common/wrap/index.js +1 -2
- package/dist/esm/common/wrap/wrap-events.js +6 -9
- package/dist/esm/common/wrap/wrap-fetch.js +6 -6
- package/dist/esm/common/wrap/wrap-history.js +7 -6
- package/dist/esm/common/wrap/wrap-jsonp.js +7 -6
- package/dist/esm/common/wrap/wrap-mutation.js +7 -6
- package/dist/esm/common/wrap/wrap-promise.js +7 -6
- package/dist/esm/common/wrap/wrap-promise.test.js +115 -0
- package/dist/esm/common/wrap/wrap-raf.js +6 -6
- package/dist/esm/common/wrap/wrap-timer.js +7 -7
- package/dist/esm/common/wrap/wrap-xhr.js +5 -6
- package/dist/esm/features/ajax/aggregate/index.js +3 -3
- package/dist/esm/features/jserrors/aggregate/compute-stack-trace.test.js +5 -5
- package/dist/esm/features/jserrors/aggregate/format-stack-trace.test.js +1 -1
- package/dist/esm/features/jserrors/aggregate/index.js +6 -6
- package/dist/esm/features/jserrors/instrument/index.js +2 -2
- package/dist/esm/features/metrics/aggregate/index.js +21 -11
- package/dist/esm/features/metrics/instrument/index.js +0 -25
- package/dist/esm/features/metrics/instrument/workers-helper.js +5 -5
- package/dist/esm/features/page_action/aggregate/index.js +3 -3
- package/dist/esm/features/page_view_event/aggregate/index.js +23 -9
- package/dist/esm/features/page_view_timing/aggregate/index.js +40 -30
- package/dist/esm/features/session_trace/aggregate/index.js +18 -15
- package/dist/esm/features/spa/aggregate/index.js +6 -5
- package/dist/esm/features/utils/agent-session.js +67 -0
- package/dist/esm/features/utils/feature-base.js +1 -1
- package/dist/esm/features/utils/instrument-base.js +7 -2
- package/dist/esm/features/utils/lazy-loader.js +2 -2
- package/dist/esm/loaders/agent.js +2 -2
- package/dist/esm/loaders/api/api.js +6 -9
- package/dist/esm/loaders/api/apiAsync.js +2 -1
- package/dist/esm/loaders/configure/configure.js +2 -8
- package/dist/esm/loaders/features/enabled-features.js +1 -1
- package/dist/types/common/config/state/configurable.d.ts.map +1 -1
- package/dist/types/common/config/state/init.d.ts.map +1 -1
- package/dist/types/common/config/state/runtime.d.ts.map +1 -1
- package/dist/types/common/constants/env.cdn.d.ts +18 -0
- package/dist/types/common/constants/env.cdn.d.ts.map +1 -0
- package/dist/types/common/constants/env.d.ts +13 -0
- package/dist/types/common/constants/env.d.ts.map +1 -0
- package/dist/types/common/constants/env.npm.d.ts +19 -0
- package/dist/types/common/constants/env.npm.d.ts.map +1 -0
- package/dist/types/common/context/shared-context.d.ts.map +1 -1
- package/dist/types/common/event-listener/event-listener-opts.d.ts +2 -2
- package/dist/types/common/event-listener/event-listener-opts.d.ts.map +1 -1
- package/dist/types/common/harvest/harvest-scheduler.d.ts +1 -0
- package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
- package/dist/types/common/harvest/harvest.d.ts.map +1 -1
- package/dist/types/common/ids/id.d.ts +11 -1
- package/dist/types/common/ids/id.d.ts.map +1 -1
- package/dist/types/common/ids/unique-id.d.ts +24 -1
- package/dist/types/common/ids/unique-id.d.ts.map +1 -1
- package/dist/types/common/session/constants.d.ts +4 -0
- package/dist/types/common/session/constants.d.ts.map +1 -0
- package/dist/types/common/session/session-entity.d.ts +72 -0
- package/dist/types/common/session/session-entity.d.ts.map +1 -0
- package/dist/types/common/storage/first-party-cookies.d.ts +8 -0
- package/dist/types/common/storage/first-party-cookies.d.ts.map +1 -0
- package/dist/types/common/storage/local-memory.d.ts +8 -0
- package/dist/types/common/storage/local-memory.d.ts.map +1 -0
- package/dist/types/common/storage/local-storage.d.ts +6 -0
- package/dist/types/common/storage/local-storage.d.ts.map +1 -0
- package/dist/types/common/timer/interaction-timer.d.ts +11 -0
- package/dist/types/common/timer/interaction-timer.d.ts.map +1 -0
- package/dist/types/common/timer/timer.d.ts +12 -0
- package/dist/types/common/timer/timer.d.ts.map +1 -0
- package/dist/types/common/timing/nav-timing.d.ts +1 -2
- package/dist/types/common/timing/nav-timing.d.ts.map +1 -1
- package/dist/types/common/unload/eol.d.ts.map +1 -1
- package/dist/types/common/url/location.d.ts +4 -0
- package/dist/types/common/url/location.d.ts.map +1 -1
- package/dist/types/common/url/parse-url.d.ts.map +1 -1
- package/dist/types/common/url/protocol.d.ts +1 -6
- package/dist/types/common/url/protocol.d.ts.map +1 -1
- package/dist/types/common/util/data-size.d.ts +7 -1
- package/dist/types/common/util/data-size.d.ts.map +1 -1
- package/dist/types/common/util/global-scope.d.ts.map +1 -1
- package/dist/types/common/util/invoke.d.ts +35 -0
- package/dist/types/common/util/invoke.d.ts.map +1 -0
- package/dist/types/common/util/obfuscate.d.ts.map +1 -1
- package/dist/types/common/window/page-visibility.d.ts +1 -1
- package/dist/types/common/window/page-visibility.d.ts.map +1 -1
- package/dist/types/common/wrap/index.d.ts +1 -2
- package/dist/types/common/wrap/index.d.ts.map +1 -1
- package/dist/types/common/wrap/wrap-fetch.d.ts.map +1 -1
- package/dist/types/common/wrap/wrap-history.d.ts.map +1 -1
- package/dist/types/common/wrap/wrap-jsonp.d.ts.map +1 -1
- package/dist/types/common/wrap/wrap-mutation.d.ts.map +1 -1
- package/dist/types/common/wrap/wrap-promise.d.ts.map +1 -1
- package/dist/types/common/wrap/wrap-raf.d.ts.map +1 -1
- package/dist/types/common/wrap/wrap-timer.d.ts.map +1 -1
- package/dist/types/common/wrap/wrap-xhr.d.ts.map +1 -1
- package/dist/types/features/ajax/aggregate/index.d.ts +2 -2
- package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/jserrors/aggregate/index.d.ts +2 -2
- package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -1
- package/dist/types/features/metrics/aggregate/index.d.ts +2 -2
- package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/metrics/instrument/index.d.ts +0 -1
- package/dist/types/features/metrics/instrument/index.d.ts.map +1 -1
- package/dist/types/features/metrics/instrument/workers-helper.d.ts.map +1 -1
- package/dist/types/features/page_action/aggregate/index.d.ts +2 -2
- package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_event/aggregate/index.d.ts +2 -2
- package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/page_view_timing/aggregate/index.d.ts +3 -4
- package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_trace/aggregate/index.d.ts +3 -3
- package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
- package/dist/types/features/spa/aggregate/index.d.ts +2 -2
- package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/spa/instrument/index.d.ts.map +1 -1
- package/dist/types/features/utils/agent-session.d.ts +2 -0
- package/dist/types/features/utils/agent-session.d.ts.map +1 -0
- package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
- package/dist/types/features/utils/lazy-loader.d.ts +2 -2
- package/dist/types/features/utils/lazy-loader.d.ts.map +1 -1
- package/dist/types/loaders/api/api.d.ts.map +1 -1
- package/dist/types/loaders/api/apiAsync.d.ts.map +1 -1
- package/dist/types/loaders/configure/configure.d.ts.map +1 -1
- package/package.json +12 -32
- package/src/common/browser-version/ios-version.js +4 -3
- package/src/common/config/state/configurable.js +26 -19
- package/src/common/config/state/init.js +7 -0
- package/src/common/config/state/runtime.js +7 -10
- package/src/common/constants/env.cdn.js +20 -0
- package/src/common/constants/env.js +23 -0
- package/src/common/constants/env.npm.js +21 -0
- package/src/common/context/shared-context.js +2 -1
- package/src/common/event-emitter/contextual-ee.test.js +310 -0
- package/src/common/event-emitter/handle.test.js +56 -0
- package/src/common/event-emitter/register-handler.test.js +61 -0
- package/src/common/event-listener/event-listener-opts.js +4 -4
- package/src/common/harvest/harvest-scheduler.js +12 -8
- package/src/common/harvest/harvest.js +5 -3
- package/src/common/ids/id.js +15 -6
- package/src/common/ids/id.test.js +92 -0
- package/src/common/ids/unique-id.js +77 -54
- package/src/common/ids/unique-id.test.js +58 -0
- package/src/common/session/constants.js +3 -0
- package/src/common/session/session-entity.js +271 -0
- package/src/common/session/session-entity.test.js +317 -0
- package/src/common/storage/first-party-cookies.js +31 -0
- package/src/common/storage/local-memory.js +30 -0
- package/src/common/storage/local-memory.test.js +19 -0
- package/src/common/storage/local-storage.js +28 -0
- package/src/common/storage/local-storage.test.js +17 -0
- package/src/common/timer/interaction-timer.js +75 -0
- package/src/common/timer/interaction-timer.test.js +167 -0
- package/src/common/timer/timer.js +31 -0
- package/src/common/timer/timer.test.js +100 -0
- package/src/common/timing/nav-timing.js +50 -30
- package/src/common/timing/nav-timing.test.js +161 -0
- package/src/common/unload/eol.js +2 -3
- package/src/common/url/clean-url.test.js +25 -0
- package/src/common/url/encode.test.js +80 -0
- package/src/common/url/location.js +4 -0
- package/src/common/url/location.test.js +15 -0
- package/src/common/url/parse-url.js +1 -2
- package/src/common/url/parse-url.test.js +110 -0
- package/src/common/url/protocol.js +3 -13
- package/src/common/url/protocol.test.js +18 -0
- package/src/common/util/data-size.js +6 -0
- package/src/common/util/data-size.test.js +50 -0
- package/src/common/util/global-scope.js +1 -2
- package/src/common/util/invoke.js +55 -0
- package/src/common/util/invoke.test.js +65 -0
- package/src/common/util/obfuscate.js +2 -6
- package/src/common/window/page-visibility.js +3 -3
- package/src/common/wrap/index.js +1 -2
- package/src/common/wrap/wrap-events.js +5 -5
- package/src/common/wrap/wrap-fetch.js +4 -3
- package/src/common/wrap/wrap-history.js +6 -3
- package/src/common/wrap/wrap-jsonp.js +5 -3
- package/src/common/wrap/wrap-mutation.js +6 -3
- package/src/common/wrap/wrap-promise.js +7 -6
- package/src/common/wrap/wrap-promise.test.js +140 -0
- package/src/common/wrap/wrap-raf.js +5 -3
- package/src/common/wrap/wrap-timer.js +6 -4
- package/src/common/wrap/wrap-xhr.js +4 -3
- package/src/features/ajax/aggregate/index.js +2 -2
- package/src/features/ajax/instrument/index.js +1 -1
- package/src/features/jserrors/aggregate/index.js +3 -3
- package/src/features/jserrors/instrument/index.js +4 -2
- package/src/features/metrics/aggregate/index.js +21 -7
- package/src/features/metrics/instrument/index.js +0 -30
- package/src/features/metrics/instrument/workers-helper.js +9 -6
- package/src/features/page_action/aggregate/index.js +2 -2
- package/src/features/page_view_event/aggregate/index.js +21 -9
- package/src/features/page_view_timing/aggregate/index.js +40 -29
- package/src/features/page_view_timing/long-tasks.js +10 -10
- package/src/features/session_trace/aggregate/index.js +17 -14
- package/src/features/session_trace/instrument/index.js +3 -2
- package/src/features/spa/aggregate/index.js +5 -5
- package/src/features/spa/instrument/index.js +4 -2
- package/src/features/utils/agent-session.js +68 -0
- package/src/features/utils/feature-base.js +1 -1
- package/src/features/utils/instrument-base.js +5 -2
- package/src/features/utils/lazy-loader.js +1 -1
- package/src/loaders/agent.js +1 -1
- package/src/loaders/api/api.js +3 -6
- package/src/loaders/api/apiAsync.js +2 -1
- package/src/loaders/configure/configure.js +2 -7
- package/dist/cjs/common/constants/environment-variables.js +0 -20
- package/dist/cjs/common/util/single.js +0 -23
- package/dist/cjs/common/window/session-storage.js +0 -87
- package/dist/cjs/common/wrap/wrap-console.js +0 -54
- package/dist/cjs/features/utils/aggregate-base.js +0 -13
- package/dist/esm/common/constants/environment-variables.js +0 -11
- package/dist/esm/common/util/single.js +0 -16
- package/dist/esm/common/window/session-storage.js +0 -77
- package/dist/esm/common/wrap/wrap-console.js +0 -46
- package/dist/esm/features/utils/aggregate-base.js +0 -6
- package/dist/types/common/constants/environment-variables.d.ts +0 -4
- package/dist/types/common/constants/environment-variables.d.ts.map +0 -1
- package/dist/types/common/util/single.d.ts +0 -2
- package/dist/types/common/util/single.d.ts.map +0 -1
- package/dist/types/common/window/session-storage.d.ts +0 -18
- package/dist/types/common/window/session-storage.d.ts.map +0 -1
- package/dist/types/common/wrap/wrap-console.d.ts +0 -16
- package/dist/types/common/wrap/wrap-console.d.ts.map +0 -1
- package/dist/types/features/utils/aggregate-base.d.ts +0 -4
- package/dist/types/features/utils/aggregate-base.d.ts.map +0 -1
- package/src/common/constants/environment-variables.js +0 -11
- package/src/common/util/single.js +0 -18
- package/src/common/window/session-storage.js +0 -75
- package/src/common/wrap/wrap-console.js +0 -47
- package/src/features/utils/aggregate-base.js +0 -7
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { faker } from '@faker-js/faker';
|
|
2
|
+
let mockNREUM;
|
|
3
|
+
let runtime;
|
|
4
|
+
beforeEach(() => {
|
|
5
|
+
mockNREUM = {};
|
|
6
|
+
runtime = {};
|
|
7
|
+
jest.doMock('../window/nreum', () => ({
|
|
8
|
+
__esModule: true,
|
|
9
|
+
gosNREUM: jest.fn(() => mockNREUM)
|
|
10
|
+
}));
|
|
11
|
+
jest.doMock('../config/config', () => ({
|
|
12
|
+
__esModule: true,
|
|
13
|
+
getRuntime: jest.fn(() => runtime)
|
|
14
|
+
}));
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
jest.resetModules();
|
|
18
|
+
jest.resetAllMocks();
|
|
19
|
+
});
|
|
20
|
+
describe('global event-emitter', () => {
|
|
21
|
+
test('it returns the event-emitter defined on window.NREUM', async () => {
|
|
22
|
+
const mockEE = {};
|
|
23
|
+
mockNREUM.ee = mockEE;
|
|
24
|
+
const {
|
|
25
|
+
ee
|
|
26
|
+
} = await import('./contextual-ee');
|
|
27
|
+
expect(ee).toEqual(mockEE);
|
|
28
|
+
});
|
|
29
|
+
test('it sets the global event-emitter on window.NREUM', async () => {
|
|
30
|
+
const {
|
|
31
|
+
ee
|
|
32
|
+
} = await import('./contextual-ee');
|
|
33
|
+
expect(ee).toEqual(mockNREUM.ee);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('scoping event-emitter', () => {
|
|
37
|
+
test('it creates a new child event-emitter', async () => {
|
|
38
|
+
const {
|
|
39
|
+
ee
|
|
40
|
+
} = await import('./contextual-ee');
|
|
41
|
+
const childName = faker.datatype.uuid();
|
|
42
|
+
const result = ee.get(childName);
|
|
43
|
+
expect(result).not.toEqual(mockNREUM.ee);
|
|
44
|
+
expect(result).toEqual(ee.get(childName)); // Should always return the same event-emitter
|
|
45
|
+
expect(result.debugId).toEqual(childName);
|
|
46
|
+
});
|
|
47
|
+
test('it creates a child event-emitter with an isolated backlog', async () => {
|
|
48
|
+
const childName = faker.random.alphaNumeric(16);
|
|
49
|
+
jest.doMock('../config/config', () => ({
|
|
50
|
+
__esModule: true,
|
|
51
|
+
getRuntime: jest.fn(id => {
|
|
52
|
+
if (id === childName) {
|
|
53
|
+
return {
|
|
54
|
+
isolatedBacklog: true
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return runtime;
|
|
58
|
+
})
|
|
59
|
+
}));
|
|
60
|
+
const {
|
|
61
|
+
ee
|
|
62
|
+
} = await import('./contextual-ee');
|
|
63
|
+
const result = ee.get(childName);
|
|
64
|
+
expect(ee.backlog).not.toBe(result.backlog);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('event-emitter context', () => {
|
|
68
|
+
test('it returns a new context', async () => {
|
|
69
|
+
const {
|
|
70
|
+
ee
|
|
71
|
+
} = await import('./contextual-ee');
|
|
72
|
+
const result = ee.context();
|
|
73
|
+
expect(result).toEqual({});
|
|
74
|
+
});
|
|
75
|
+
test('it returns the same context', async () => {
|
|
76
|
+
const {
|
|
77
|
+
ee
|
|
78
|
+
} = await import('./contextual-ee');
|
|
79
|
+
const result = ee.context();
|
|
80
|
+
expect(result).toEqual(ee.context(result));
|
|
81
|
+
});
|
|
82
|
+
test('it adds the context to the provided object', async () => {
|
|
83
|
+
const {
|
|
84
|
+
ee
|
|
85
|
+
} = await import('./contextual-ee');
|
|
86
|
+
const obj = {};
|
|
87
|
+
const result = ee.context(obj);
|
|
88
|
+
expect(result).toEqual(obj['nr@context']);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('event-emitter buffer', () => {
|
|
92
|
+
it('it should create a new buffer for the given group', async () => {
|
|
93
|
+
const {
|
|
94
|
+
ee
|
|
95
|
+
} = await import('./contextual-ee');
|
|
96
|
+
const eventType = faker.datatype.uuid();
|
|
97
|
+
const group = faker.datatype.uuid();
|
|
98
|
+
ee.buffer([eventType], group);
|
|
99
|
+
expect(ee.backlog).toEqual(expect.objectContaining({
|
|
100
|
+
[group]: []
|
|
101
|
+
}));
|
|
102
|
+
expect(ee.isBuffering(eventType)).toEqual(true);
|
|
103
|
+
});
|
|
104
|
+
it('it should default group to "feature"', async () => {
|
|
105
|
+
const {
|
|
106
|
+
ee
|
|
107
|
+
} = await import('./contextual-ee');
|
|
108
|
+
const eventType = faker.datatype.uuid();
|
|
109
|
+
ee.buffer([eventType]);
|
|
110
|
+
expect(ee.backlog).toEqual(expect.objectContaining({
|
|
111
|
+
feature: []
|
|
112
|
+
}));
|
|
113
|
+
expect(ee.isBuffering(eventType)).toEqual(true);
|
|
114
|
+
});
|
|
115
|
+
it('it should not create buffer if event-emitter is aborted', async () => {
|
|
116
|
+
const {
|
|
117
|
+
ee
|
|
118
|
+
} = await import('./contextual-ee');
|
|
119
|
+
const eventType = faker.datatype.uuid();
|
|
120
|
+
const group = faker.datatype.uuid();
|
|
121
|
+
ee.backlog = {
|
|
122
|
+
api: ['foo', 'bar', 'baz']
|
|
123
|
+
};
|
|
124
|
+
ee.abort();
|
|
125
|
+
ee.buffer([eventType], group);
|
|
126
|
+
expect(ee.backlog).toEqual({});
|
|
127
|
+
expect(ee.isBuffering(eventType)).toEqual(false);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('event-emitter abort', () => {
|
|
131
|
+
test('it aborts if there is an API backlog', async () => {
|
|
132
|
+
const {
|
|
133
|
+
ee
|
|
134
|
+
} = await import('./contextual-ee');
|
|
135
|
+
ee.backlog = {
|
|
136
|
+
api: ['foo', 'bar', 'baz']
|
|
137
|
+
};
|
|
138
|
+
ee.abort();
|
|
139
|
+
expect(ee.aborted).toEqual(true);
|
|
140
|
+
expect(ee.backlog).toEqual({});
|
|
141
|
+
});
|
|
142
|
+
test('it aborts if there is a feature backlog', async () => {
|
|
143
|
+
const {
|
|
144
|
+
ee
|
|
145
|
+
} = await import('./contextual-ee');
|
|
146
|
+
ee.backlog = {
|
|
147
|
+
feature: ['foo', 'bar', 'baz']
|
|
148
|
+
};
|
|
149
|
+
ee.abort();
|
|
150
|
+
expect(ee.aborted).toEqual(true);
|
|
151
|
+
expect(ee.backlog).toEqual({});
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('event-emitter emit', () => {
|
|
155
|
+
it('should execute the listener', async () => {
|
|
156
|
+
const {
|
|
157
|
+
ee
|
|
158
|
+
} = await import('./contextual-ee');
|
|
159
|
+
const mockListener = jest.fn();
|
|
160
|
+
const eventType = faker.datatype.uuid();
|
|
161
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
162
|
+
ee.on(eventType, mockListener);
|
|
163
|
+
ee.emit(eventType, eventArgs);
|
|
164
|
+
expect(mockListener).toHaveBeenCalledWith(eventArgs[0], eventArgs[1], eventArgs[2]);
|
|
165
|
+
});
|
|
166
|
+
it('should not execute the listener after removal', async () => {
|
|
167
|
+
const {
|
|
168
|
+
ee
|
|
169
|
+
} = await import('./contextual-ee');
|
|
170
|
+
const mockListener = jest.fn();
|
|
171
|
+
const eventType = faker.datatype.uuid();
|
|
172
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
173
|
+
ee.on(eventType, mockListener);
|
|
174
|
+
ee.emit(eventType, eventArgs);
|
|
175
|
+
ee.removeEventListener(eventType, mockListener);
|
|
176
|
+
ee.emit(eventType, eventArgs);
|
|
177
|
+
expect(mockListener).toHaveBeenCalledTimes(1);
|
|
178
|
+
});
|
|
179
|
+
it('should return early if global event-emitter is aborted', async () => {
|
|
180
|
+
const {
|
|
181
|
+
ee
|
|
182
|
+
} = await import('./contextual-ee');
|
|
183
|
+
const mockListener = jest.fn();
|
|
184
|
+
const eventType = faker.datatype.uuid();
|
|
185
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
186
|
+
ee.backlog = {
|
|
187
|
+
api: ['foo', 'bar', 'baz']
|
|
188
|
+
};
|
|
189
|
+
ee.abort();
|
|
190
|
+
ee.on(eventType, mockListener);
|
|
191
|
+
ee.emit(eventType, eventArgs);
|
|
192
|
+
expect(mockListener).toHaveBeenCalledTimes(0);
|
|
193
|
+
});
|
|
194
|
+
it('should still emit if global event-emitter is aborted but force flag is true', async () => {
|
|
195
|
+
const {
|
|
196
|
+
ee
|
|
197
|
+
} = await import('./contextual-ee');
|
|
198
|
+
const scopeEE = ee.get(faker.datatype.uuid());
|
|
199
|
+
const mockScopeListener = jest.fn();
|
|
200
|
+
const eventType = faker.datatype.uuid();
|
|
201
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
202
|
+
ee.backlog = {
|
|
203
|
+
api: ['foo', 'bar', 'baz']
|
|
204
|
+
};
|
|
205
|
+
ee.abort();
|
|
206
|
+
scopeEE.on(eventType, mockScopeListener);
|
|
207
|
+
scopeEE.emit(eventType, eventArgs, {}, true);
|
|
208
|
+
expect(mockScopeListener).toHaveBeenCalledTimes(1);
|
|
209
|
+
});
|
|
210
|
+
it('should bubble the event if bubble flag is true', async () => {
|
|
211
|
+
const {
|
|
212
|
+
ee
|
|
213
|
+
} = await import('./contextual-ee');
|
|
214
|
+
const scopeEE = ee.get(faker.datatype.uuid());
|
|
215
|
+
const mockListener = jest.fn();
|
|
216
|
+
const mockScopeListener = jest.fn();
|
|
217
|
+
const eventType = faker.datatype.uuid();
|
|
218
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
219
|
+
ee.on(eventType, mockListener);
|
|
220
|
+
scopeEE.on(eventType, mockScopeListener);
|
|
221
|
+
scopeEE.emit(eventType, eventArgs, {}, false, true);
|
|
222
|
+
expect(mockScopeListener).toHaveBeenCalledTimes(1);
|
|
223
|
+
expect(mockListener).toHaveBeenCalledTimes(1);
|
|
224
|
+
});
|
|
225
|
+
it('should not bubble the event if bubble flag is false', async () => {
|
|
226
|
+
const {
|
|
227
|
+
ee
|
|
228
|
+
} = await import('./contextual-ee');
|
|
229
|
+
const scopeEE = ee.get(faker.datatype.uuid());
|
|
230
|
+
const mockListener = jest.fn();
|
|
231
|
+
const mockScopeListener = jest.fn();
|
|
232
|
+
const eventType = faker.datatype.uuid();
|
|
233
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
234
|
+
ee.on(eventType, mockListener);
|
|
235
|
+
scopeEE.on(eventType, mockScopeListener);
|
|
236
|
+
scopeEE.emit(eventType, eventArgs, {}, false, false);
|
|
237
|
+
expect(mockScopeListener).toHaveBeenCalledTimes(1);
|
|
238
|
+
expect(mockListener).not.toHaveBeenCalled();
|
|
239
|
+
});
|
|
240
|
+
it('should buffer the event on the scoped event-emitter', async () => {
|
|
241
|
+
const {
|
|
242
|
+
ee
|
|
243
|
+
} = await import('./contextual-ee');
|
|
244
|
+
const scopeEE = ee.get(faker.datatype.uuid());
|
|
245
|
+
const mockListener = jest.fn();
|
|
246
|
+
const mockScopeListener = jest.fn();
|
|
247
|
+
const eventType = faker.datatype.uuid();
|
|
248
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
249
|
+
ee.on(eventType, mockListener);
|
|
250
|
+
ee.buffer([eventType]);
|
|
251
|
+
scopeEE.on(eventType, mockScopeListener);
|
|
252
|
+
scopeEE.buffer([eventType]);
|
|
253
|
+
scopeEE.emit(eventType, eventArgs, {}, false, false);
|
|
254
|
+
expect(mockScopeListener).toHaveBeenCalledTimes(1);
|
|
255
|
+
expect(mockListener).not.toHaveBeenCalled();
|
|
256
|
+
expect(scopeEE.backlog.feature).toEqual(expect.arrayContaining([expect.arrayContaining([scopeEE, eventType, eventArgs, {}])]));
|
|
257
|
+
expect(ee.backlog.feature).toEqual(scopeEE.backlog.feature);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
describe('getOrSetContext', () => {
|
|
261
|
+
test('it returns a new context', async () => {
|
|
262
|
+
const {
|
|
263
|
+
getOrSetContext
|
|
264
|
+
} = await import('./contextual-ee');
|
|
265
|
+
const obj = {};
|
|
266
|
+
const result = getOrSetContext(obj);
|
|
267
|
+
expect(result).toEqual({});
|
|
268
|
+
expect(result).toEqual(obj['nr@context']);
|
|
269
|
+
});
|
|
270
|
+
test('it returns the same context', async () => {
|
|
271
|
+
const {
|
|
272
|
+
getOrSetContext
|
|
273
|
+
} = await import('./contextual-ee');
|
|
274
|
+
const obj = {};
|
|
275
|
+
const result = getOrSetContext(obj);
|
|
276
|
+
expect(getOrSetContext(obj)).toEqual(result);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { faker } from '@faker-js/faker';
|
|
2
|
+
jest.mock('./contextual-ee', () => ({
|
|
3
|
+
__esModule: true,
|
|
4
|
+
ee: {
|
|
5
|
+
buffer: jest.fn(),
|
|
6
|
+
emit: jest.fn(),
|
|
7
|
+
get: jest.fn(() => ({
|
|
8
|
+
buffer: jest.fn(),
|
|
9
|
+
emit: jest.fn()
|
|
10
|
+
}))
|
|
11
|
+
}
|
|
12
|
+
}));
|
|
13
|
+
afterEach(() => {
|
|
14
|
+
jest.resetModules();
|
|
15
|
+
jest.resetAllMocks();
|
|
16
|
+
});
|
|
17
|
+
test('it should create and use a default event-emitter', async () => {
|
|
18
|
+
const {
|
|
19
|
+
ee
|
|
20
|
+
} = await import('./contextual-ee');
|
|
21
|
+
const {
|
|
22
|
+
handle
|
|
23
|
+
} = await import('./handle');
|
|
24
|
+
const handleEE = jest.mocked(ee.get).mock.results[0].value;
|
|
25
|
+
const eventType = faker.datatype.uuid();
|
|
26
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
27
|
+
const eventContext = {};
|
|
28
|
+
const eventGroup = faker.datatype.uuid();
|
|
29
|
+
handle(eventType, eventArgs, eventContext, eventGroup);
|
|
30
|
+
expect(handleEE.buffer).toHaveBeenCalledWith([eventType], eventGroup);
|
|
31
|
+
expect(handleEE.emit).toHaveBeenCalledWith(eventType, eventArgs, eventContext);
|
|
32
|
+
});
|
|
33
|
+
test('it should use the provided scoped event-emitter', async () => {
|
|
34
|
+
const {
|
|
35
|
+
ee
|
|
36
|
+
} = await import('./contextual-ee');
|
|
37
|
+
const {
|
|
38
|
+
handle
|
|
39
|
+
} = await import('./handle');
|
|
40
|
+
const scopedEE = {
|
|
41
|
+
buffer: jest.fn(),
|
|
42
|
+
emit: jest.fn()
|
|
43
|
+
};
|
|
44
|
+
const handleEE = jest.mocked(ee.get).mock.results[0].value;
|
|
45
|
+
const eventType = faker.datatype.uuid();
|
|
46
|
+
const eventArgs = ['a', 'b', 'c'];
|
|
47
|
+
const eventContext = {};
|
|
48
|
+
const eventGroup = faker.datatype.uuid();
|
|
49
|
+
handle(eventType, eventArgs, eventContext, eventGroup, scopedEE);
|
|
50
|
+
expect(handleEE.buffer).not.toHaveBeenCalled();
|
|
51
|
+
expect(handleEE.emit).not.toHaveBeenCalled();
|
|
52
|
+
expect(scopedEE.buffer).toHaveBeenCalledWith([eventType], eventGroup);
|
|
53
|
+
expect(scopedEE.emit).toHaveBeenCalledWith(eventType, eventArgs, eventContext);
|
|
54
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { faker } from '@faker-js/faker';
|
|
2
|
+
jest.mock('./handle', () => ({
|
|
3
|
+
__esModule: true,
|
|
4
|
+
handleEE: {}
|
|
5
|
+
}));
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
jest.resetModules();
|
|
8
|
+
jest.resetAllMocks();
|
|
9
|
+
});
|
|
10
|
+
test('should default group to "feature"', async () => {
|
|
11
|
+
const {
|
|
12
|
+
handleEE
|
|
13
|
+
} = await import('./handle');
|
|
14
|
+
const {
|
|
15
|
+
registerHandler
|
|
16
|
+
} = await import('./register-handler');
|
|
17
|
+
const eventType = faker.datatype.uuid();
|
|
18
|
+
const eventHandler = jest.fn();
|
|
19
|
+
registerHandler(eventType, eventHandler);
|
|
20
|
+
expect(registerHandler.handlers.feature).toEqual(expect.objectContaining({
|
|
21
|
+
[eventType]: [expect.arrayContaining([handleEE, eventHandler])]
|
|
22
|
+
}));
|
|
23
|
+
});
|
|
24
|
+
test('should use the provided group', async () => {
|
|
25
|
+
const {
|
|
26
|
+
handleEE
|
|
27
|
+
} = await import('./handle');
|
|
28
|
+
const {
|
|
29
|
+
registerHandler
|
|
30
|
+
} = await import('./register-handler');
|
|
31
|
+
const eventType = faker.datatype.uuid();
|
|
32
|
+
const eventGroup = faker.datatype.uuid();
|
|
33
|
+
const eventHandler = jest.fn();
|
|
34
|
+
registerHandler(eventType, eventHandler, eventGroup);
|
|
35
|
+
expect(registerHandler.handlers[eventGroup]).toEqual(expect.objectContaining({
|
|
36
|
+
[eventType]: [expect.arrayContaining([handleEE, eventHandler])]
|
|
37
|
+
}));
|
|
38
|
+
});
|
|
39
|
+
test('should use the provided event-emitter', async () => {
|
|
40
|
+
const {
|
|
41
|
+
registerHandler
|
|
42
|
+
} = await import('./register-handler');
|
|
43
|
+
const scopedEE = {};
|
|
44
|
+
const eventType = faker.datatype.uuid();
|
|
45
|
+
const eventGroup = faker.datatype.uuid();
|
|
46
|
+
const eventHandler = jest.fn();
|
|
47
|
+
registerHandler(eventType, eventHandler, eventGroup, scopedEE);
|
|
48
|
+
expect(registerHandler.handlers[eventGroup]).toEqual(expect.objectContaining({
|
|
49
|
+
[eventType]: [expect.arrayContaining([scopedEE, eventHandler])]
|
|
50
|
+
}));
|
|
51
|
+
});
|
|
@@ -32,10 +32,12 @@ export function eventListenerOpts(useCapture, abortSignal) {
|
|
|
32
32
|
/** Do not use this within the worker context. */
|
|
33
33
|
export function windowAddEventListener(event, listener) {
|
|
34
34
|
let capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
35
|
-
|
|
35
|
+
let abortSignal = arguments.length > 3 ? arguments[3] : undefined;
|
|
36
|
+
window.addEventListener(event, listener, eventListenerOpts(capture, abortSignal));
|
|
36
37
|
}
|
|
37
38
|
/** Do not use this within the worker context. */
|
|
38
39
|
export function documentAddEventListener(event, listener) {
|
|
39
40
|
let capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
40
|
-
|
|
41
|
+
let abortSignal = arguments.length > 3 ? arguments[3] : undefined;
|
|
42
|
+
document.addEventListener(event, listener, eventListenerOpts(capture, abortSignal));
|
|
41
43
|
}
|
|
@@ -22,17 +22,21 @@ export class HarvestScheduler extends SharedContext {
|
|
|
22
22
|
this.aborted = false; // this controls the per-interval and final harvests for the scheduler (currently per feature specific!)
|
|
23
23
|
|
|
24
24
|
this.harvest = new Harvest(this.sharedContext);
|
|
25
|
-
subscribeToEOL(() => {
|
|
26
|
-
if (this.aborted) return;
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
this.runHarvest({
|
|
31
|
-
unload: true
|
|
32
|
-
});
|
|
33
|
-
}, getConfigurationValue(this.sharedContext.agentIdentifier, 'allow_bfcache')); // TO DO: remove feature flag after rls stable
|
|
34
|
-
}
|
|
26
|
+
// unload if EOL mechanism fires
|
|
27
|
+
subscribeToEOL(this.unload.bind(this), getConfigurationValue(this.sharedContext.agentIdentifier, 'allow_bfcache')); // TO DO: remove feature flag after rls stable
|
|
35
28
|
|
|
29
|
+
// unload if session resets
|
|
30
|
+
this.sharedContext?.ee.on('session-reset', this.unload.bind(this));
|
|
31
|
+
}
|
|
32
|
+
unload() {
|
|
33
|
+
if (this.aborted) return;
|
|
34
|
+
// If opts.onUnload is defined, these are special actions to execute before attempting to send the final payload.
|
|
35
|
+
if (this.opts.onUnload) this.opts.onUnload();
|
|
36
|
+
this.runHarvest({
|
|
37
|
+
unload: true
|
|
38
|
+
});
|
|
39
|
+
}
|
|
36
40
|
startTimer(interval, initialDelay) {
|
|
37
41
|
this.interval = interval;
|
|
38
42
|
this.started = true;
|
|
@@ -75,8 +79,7 @@ export class HarvestScheduler extends SharedContext {
|
|
|
75
79
|
}
|
|
76
80
|
}
|
|
77
81
|
} else {
|
|
78
|
-
|
|
79
|
-
this.harvest.sendX(this.endpoint, opts, runAfterSending);
|
|
82
|
+
this.harvest.sendX(this.endpoint, opts, onHarvestFinished);
|
|
80
83
|
}
|
|
81
84
|
if (this.started) {
|
|
82
85
|
this.scheduleHarvest();
|
|
@@ -15,7 +15,7 @@ import { eventListenerOpts } from '../event-listener/event-listener-opts';
|
|
|
15
15
|
import { Obfuscator } from '../util/obfuscate';
|
|
16
16
|
import { applyFnToProps } from '../util/traverse';
|
|
17
17
|
import { SharedContext } from '../context/shared-context';
|
|
18
|
-
import { VERSION } from
|
|
18
|
+
import { VERSION } from "../constants/env.npm";
|
|
19
19
|
import { isBrowserScope, isWorkerScope } from '../util/global-scope';
|
|
20
20
|
const haveSendBeacon = !!navigator.sendBeacon; // only the web window obj has sendBeacon at this time, so 'false' for other envs
|
|
21
21
|
|
|
@@ -120,6 +120,8 @@ export class Harvest extends SharedContext {
|
|
|
120
120
|
|
|
121
121
|
// Get bytes harvested per endpoint as a supportability metric. See metrics aggregator (on unload).
|
|
122
122
|
agentRuntime.bytesSent[endpoint] = (agentRuntime.bytesSent[endpoint] || 0) + body?.length || 0;
|
|
123
|
+
// Get query bytes harvested per endpoint as a supportability metric. See metrics aggregator (on unload).
|
|
124
|
+
agentRuntime.queryBytesSent[endpoint] = (agentRuntime.queryBytesSent[endpoint] || 0) + fullUrl.split('?').slice(-1)[0]?.length || 0;
|
|
123
125
|
|
|
124
126
|
/* Since workers don't support sendBeacon right now, or Image(), they can only use XHR method.
|
|
125
127
|
Because they still do permit synch XHR, the idea is that at final harvest time (worker is closing),
|
|
@@ -160,7 +162,7 @@ export class Harvest extends SharedContext {
|
|
|
160
162
|
var ref = this.obfuscator.shouldObfuscate() ? this.obfuscator.obfuscateString(location) : location;
|
|
161
163
|
return ['?a=' + info.applicationID, encodeParam('sa', info.sa ? '' + info.sa : ''), encodeParam('v', VERSION), transactionNameParam(info), encodeParam('ct', runtime.customTransaction), '&rst=' + now(), '&ck=0',
|
|
162
164
|
// ck param DEPRECATED - still expected by backend
|
|
163
|
-
'&s=' + (runtime.
|
|
165
|
+
'&s=' + (runtime.session?.value || '0'),
|
|
164
166
|
// the 0 id encaps all untrackable and default traffic
|
|
165
167
|
encodeParam('ref', ref), encodeParam('ptid', runtime.ptid ? '' + runtime.ptid : '')].join('');
|
|
166
168
|
}
|
|
@@ -3,16 +3,26 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
// Start assigning ids at 1 so 0 can always be used for WindowOrWorkerGlobalScope, without
|
|
7
|
-
// actually setting it (which would create a global variable).
|
|
8
6
|
import { getOrSet } from '../util/get-or-set';
|
|
9
7
|
import { globalScope } from '../util/global-scope';
|
|
10
|
-
var index = 1;
|
|
11
|
-
var prop = 'nr@id';
|
|
12
8
|
|
|
13
|
-
//
|
|
9
|
+
// Start assigning ids at 1 so 0 can always be used for Window or WorkerGlobalScope, without
|
|
10
|
+
// actually setting it (which would create a global variable).
|
|
11
|
+
let index = 1;
|
|
12
|
+
const prop = 'nr@id';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Tags a specified object with an identifier if it does not already
|
|
16
|
+
* have one. If the object is the global scope, zero will be returned
|
|
17
|
+
* and the object will not be modified. If the object already contains
|
|
18
|
+
* an identifier, it will be returned without modification. If the passed
|
|
19
|
+
* value is not an object, function, or array, -1 will be returned without
|
|
20
|
+
* modifying the passed value.
|
|
21
|
+
* @param {object|function|array} obj Object to be tagged with an identifier
|
|
22
|
+
* @returns {number} Identifier of the given object
|
|
23
|
+
*/
|
|
14
24
|
export function id(obj) {
|
|
15
|
-
|
|
25
|
+
const type = typeof obj;
|
|
16
26
|
// We can only tag objects, functions, and arrays with ids.
|
|
17
27
|
// For all primitive values we instead return -1.
|
|
18
28
|
if (!obj || !(type === 'object' || type === 'function')) return -1;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
let idFn;
|
|
2
|
+
beforeEach(async () => {
|
|
3
|
+
idFn = (await import('./id')).id;
|
|
4
|
+
});
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
jest.resetModules();
|
|
7
|
+
jest.clearAllMocks();
|
|
8
|
+
});
|
|
9
|
+
test.each([{
|
|
10
|
+
input: undefined,
|
|
11
|
+
expected: -1,
|
|
12
|
+
title: 'id of undefined is -1'
|
|
13
|
+
}, {
|
|
14
|
+
input: null,
|
|
15
|
+
expected: -1,
|
|
16
|
+
title: 'id of null is -1'
|
|
17
|
+
}, {
|
|
18
|
+
input: 2,
|
|
19
|
+
expected: -1,
|
|
20
|
+
title: 'id of number is -1'
|
|
21
|
+
}, {
|
|
22
|
+
input: 'foo',
|
|
23
|
+
expected: -1,
|
|
24
|
+
title: 'id of string is -1'
|
|
25
|
+
}])('$title', _ref => {
|
|
26
|
+
let {
|
|
27
|
+
input,
|
|
28
|
+
expected
|
|
29
|
+
} = _ref;
|
|
30
|
+
const result = idFn(input);
|
|
31
|
+
expect(typeof result).toEqual('number');
|
|
32
|
+
expect(result).toEqual(expected);
|
|
33
|
+
});
|
|
34
|
+
test('id values increment sequentially', () => {
|
|
35
|
+
const inputA = {};
|
|
36
|
+
const inputB = {};
|
|
37
|
+
const resultA = idFn(inputA);
|
|
38
|
+
const resultB = idFn(inputB);
|
|
39
|
+
expect(resultA - resultB).toEqual(-1);
|
|
40
|
+
});
|
|
41
|
+
test('id is correctly assigned to function type', () => {
|
|
42
|
+
const input = jest.fn();
|
|
43
|
+
const result = idFn(input);
|
|
44
|
+
expect(result).toEqual(1);
|
|
45
|
+
expect(input['nr@id']).toEqual(1);
|
|
46
|
+
});
|
|
47
|
+
test('id is correctly assigned to object type', () => {
|
|
48
|
+
const input = {};
|
|
49
|
+
const result = idFn(input);
|
|
50
|
+
expect(result).toEqual(1);
|
|
51
|
+
expect(input['nr@id']).toEqual(1);
|
|
52
|
+
});
|
|
53
|
+
test('id is the same when called twice on the same input', () => {
|
|
54
|
+
const input = {};
|
|
55
|
+
const result1 = idFn(input);
|
|
56
|
+
const result2 = idFn(input);
|
|
57
|
+
expect(result1).toEqual(1);
|
|
58
|
+
expect(result2).toEqual(1);
|
|
59
|
+
expect(input['nr@id']).toEqual(1);
|
|
60
|
+
});
|
|
61
|
+
test('id is zero on global scope', async () => {
|
|
62
|
+
const result = idFn(global);
|
|
63
|
+
expect(result).toEqual(0);
|
|
64
|
+
});
|
|
65
|
+
test('id on prototype is correctly inherited', () => {
|
|
66
|
+
const fn = jest.fn();
|
|
67
|
+
const a = {};
|
|
68
|
+
idFn(a);
|
|
69
|
+
fn.prototype = a;
|
|
70
|
+
const b = new fn();
|
|
71
|
+
expect(b['nr@id']).toEqual(a['nr@id']);
|
|
72
|
+
});
|
|
73
|
+
test('id on prototype is different from instance', () => {
|
|
74
|
+
const fn = jest.fn();
|
|
75
|
+
const a = {};
|
|
76
|
+
idFn(a);
|
|
77
|
+
fn.prototype = a;
|
|
78
|
+
const b = new fn();
|
|
79
|
+
const result = idFn(b);
|
|
80
|
+
expect(b['nr@id']).toEqual(result);
|
|
81
|
+
});
|