@newrelic/browser-agent 1.258.2 → 1.260.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/CHANGELOG.md +20 -0
- package/dist/cjs/cdn/polyfills.js +3 -1
- package/dist/cjs/common/constants/env.cdn.js +1 -1
- package/dist/cjs/common/constants/env.npm.js +1 -1
- package/dist/cjs/common/drain/drain.js +1 -1
- package/dist/cjs/common/harvest/harvest-scheduler.js +4 -2
- package/dist/cjs/common/session/session-entity.js +8 -1
- package/dist/cjs/common/timing/time-keeper.js +9 -30
- package/dist/cjs/features/ajax/constants.js +3 -2
- package/dist/cjs/features/jserrors/instrument/index.js +3 -4
- package/dist/cjs/features/metrics/aggregate/index.js +0 -8
- package/dist/cjs/features/page_view_event/aggregate/index.js +8 -6
- package/dist/cjs/features/session_replay/aggregate/index.js +31 -36
- package/dist/cjs/features/session_replay/constants.js +5 -2
- package/dist/cjs/features/session_replay/instrument/index.js +53 -13
- package/dist/cjs/features/session_replay/shared/recorder.js +8 -1
- package/dist/cjs/features/session_replay/shared/utils.js +3 -5
- package/dist/cjs/features/session_trace/aggregate/index.js +181 -527
- package/dist/cjs/features/session_trace/aggregate/trace/node.js +19 -0
- package/dist/cjs/features/session_trace/aggregate/trace/storage.js +289 -0
- package/dist/cjs/features/session_trace/constants.js +3 -2
- package/dist/cjs/features/session_trace/instrument/index.js +7 -3
- package/dist/cjs/features/utils/aggregate-base.js +1 -0
- package/dist/cjs/features/utils/feature-gates.js +17 -0
- package/dist/cjs/features/utils/instrument-base.js +2 -1
- package/dist/cjs/loaders/agent-base.js +4 -0
- package/dist/cjs/loaders/api/api-methods.js +1 -1
- package/dist/cjs/loaders/api/api.js +2 -2
- package/dist/cjs/loaders/configure/configure.js +1 -0
- package/dist/esm/cdn/polyfills.js +3 -1
- package/dist/esm/common/constants/env.cdn.js +1 -1
- package/dist/esm/common/constants/env.npm.js +1 -1
- package/dist/esm/common/drain/drain.js +1 -1
- package/dist/esm/common/harvest/harvest-scheduler.js +4 -2
- package/dist/esm/common/session/session-entity.js +8 -1
- package/dist/esm/common/timing/time-keeper.js +9 -30
- package/dist/esm/features/ajax/constants.js +2 -1
- package/dist/esm/features/jserrors/instrument/index.js +3 -4
- package/dist/esm/features/metrics/aggregate/index.js +0 -8
- package/dist/esm/features/page_view_event/aggregate/index.js +8 -6
- package/dist/esm/features/session_replay/aggregate/index.js +32 -37
- package/dist/esm/features/session_replay/constants.js +4 -1
- package/dist/esm/features/session_replay/instrument/index.js +54 -14
- package/dist/esm/features/session_replay/shared/recorder.js +8 -1
- package/dist/esm/features/session_replay/shared/utils.js +4 -6
- package/dist/esm/features/session_trace/aggregate/index.js +182 -527
- package/dist/esm/features/session_trace/aggregate/trace/node.js +12 -0
- package/dist/esm/features/session_trace/aggregate/trace/storage.js +282 -0
- package/dist/esm/features/session_trace/constants.js +2 -1
- package/dist/esm/features/session_trace/instrument/index.js +7 -3
- package/dist/esm/features/utils/aggregate-base.js +1 -0
- package/dist/esm/features/utils/feature-gates.js +11 -0
- package/dist/esm/features/utils/instrument-base.js +3 -2
- package/dist/esm/loaders/agent-base.js +4 -0
- package/dist/esm/loaders/api/api-methods.js +1 -1
- package/dist/esm/loaders/api/api.js +2 -2
- package/dist/esm/loaders/configure/configure.js +1 -0
- 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/session/session-entity.d.ts.map +1 -1
- package/dist/types/common/timing/time-keeper.d.ts +2 -0
- package/dist/types/common/timing/time-keeper.d.ts.map +1 -1
- package/dist/types/features/ajax/constants.d.ts +1 -0
- package/dist/types/features/ajax/constants.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.map +1 -1
- package/dist/types/features/page_view_event/aggregate/index.d.ts +2 -0
- package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/aggregate/index.d.ts +1 -1
- package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/constants.d.ts +3 -0
- package/dist/types/features/session_replay/instrument/index.d.ts +0 -1
- package/dist/types/features/session_replay/instrument/index.d.ts.map +1 -1
- package/dist/types/features/session_replay/shared/recorder.d.ts.map +1 -1
- package/dist/types/features/session_replay/shared/utils.d.ts +1 -1
- package/dist/types/features/session_replay/shared/utils.d.ts.map +1 -1
- package/dist/types/features/session_trace/aggregate/index.d.ts +39 -52
- package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
- package/dist/types/features/session_trace/aggregate/trace/node.d.ts +12 -0
- package/dist/types/features/session_trace/aggregate/trace/node.d.ts.map +1 -0
- package/dist/types/features/session_trace/aggregate/trace/storage.d.ts +43 -0
- package/dist/types/features/session_trace/aggregate/trace/storage.d.ts.map +1 -0
- package/dist/types/features/session_trace/constants.d.ts +1 -0
- package/dist/types/features/session_trace/constants.d.ts.map +1 -1
- package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
- package/dist/types/features/utils/aggregate-base.d.ts +1 -0
- package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
- package/dist/types/features/utils/feature-gates.d.ts +2 -0
- package/dist/types/features/utils/feature-gates.d.ts.map +1 -0
- package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
- package/dist/types/loaders/agent-base.d.ts +1 -0
- package/dist/types/loaders/agent-base.d.ts.map +1 -1
- package/dist/types/loaders/configure/configure.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/cdn/polyfills.js +2 -0
- package/src/common/drain/drain.js +1 -1
- package/src/common/harvest/harvest-scheduler.js +4 -2
- package/src/common/session/session-entity.js +3 -1
- package/src/common/timing/time-keeper.js +9 -30
- package/src/features/ajax/constants.js +2 -0
- package/src/features/jserrors/instrument/index.js +3 -4
- package/src/features/metrics/aggregate/index.js +0 -8
- package/src/features/page_view_event/aggregate/index.js +9 -5
- package/src/features/session_replay/aggregate/index.js +30 -39
- package/src/features/session_replay/constants.js +4 -0
- package/src/features/session_replay/instrument/index.js +48 -8
- package/src/features/session_replay/shared/__mocks__/utils.js +0 -1
- package/src/features/session_replay/shared/recorder.js +8 -1
- package/src/features/session_replay/shared/utils.js +4 -7
- package/src/features/session_trace/aggregate/index.js +157 -493
- package/src/features/session_trace/aggregate/trace/node.js +12 -0
- package/src/features/session_trace/aggregate/trace/storage.js +287 -0
- package/src/features/session_trace/constants.js +1 -0
- package/src/features/session_trace/instrument/index.js +7 -2
- package/src/features/utils/__mocks__/feature-gates.js +1 -0
- package/src/features/utils/aggregate-base.js +1 -0
- package/src/features/utils/feature-gates.js +11 -0
- package/src/features/utils/instrument-base.js +3 -2
- package/src/loaders/agent-base.js +4 -0
- package/src/loaders/api/api-methods.js +1 -1
- package/src/loaders/api/api.js +2 -2
- package/src/loaders/configure/configure.js +1 -0
- package/dist/cjs/features/session_replay/shared/replay-mode.js +0 -28
- package/dist/cjs/features/utils/handler-cache.js +0 -70
- package/dist/esm/features/session_replay/shared/replay-mode.js +0 -23
- package/dist/esm/features/utils/handler-cache.js +0 -63
- package/dist/types/features/session_replay/shared/replay-mode.d.ts +0 -9
- package/dist/types/features/session_replay/shared/replay-mode.d.ts.map +0 -1
- package/dist/types/features/utils/handler-cache.d.ts +0 -23
- package/dist/types/features/utils/handler-cache.d.ts.map +0 -1
- package/src/features/session_replay/shared/replay-mode.js +0 -23
- package/src/features/utils/handler-cache.js +0 -65
|
@@ -12,11 +12,13 @@
|
|
|
12
12
|
import { handle } from '../../../common/event-emitter/handle'
|
|
13
13
|
import { DEFAULT_KEY, MODE, PREFIX } from '../../../common/session/constants'
|
|
14
14
|
import { InstrumentBase } from '../../utils/instrument-base'
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { hasReplayPrerequisite, isPreloadAllowed } from '../shared/utils'
|
|
16
|
+
import { FEATURE_NAME, SR_EVENT_EMITTER_TYPES, TRIGGERS } from '../constants'
|
|
17
17
|
|
|
18
18
|
export class Instrument extends InstrumentBase {
|
|
19
19
|
static featureName = FEATURE_NAME
|
|
20
|
+
|
|
21
|
+
#mode
|
|
20
22
|
constructor (agentIdentifier, aggregator, auto = true) {
|
|
21
23
|
super(agentIdentifier, aggregator, FEATURE_NAME, auto)
|
|
22
24
|
let session
|
|
@@ -25,8 +27,13 @@ export class Instrument extends InstrumentBase {
|
|
|
25
27
|
session = JSON.parse(localStorage.getItem(`${PREFIX}_${DEFAULT_KEY}`))
|
|
26
28
|
} catch (err) { }
|
|
27
29
|
|
|
30
|
+
if (hasReplayPrerequisite(agentIdentifier)) {
|
|
31
|
+
this.ee.on('recordReplay', () => this.#apiStartOrRestartReplay())
|
|
32
|
+
}
|
|
33
|
+
|
|
28
34
|
if (this.#canPreloadRecorder(session)) {
|
|
29
|
-
this.#
|
|
35
|
+
this.#mode = session?.sessionReplayMode
|
|
36
|
+
this.#preloadStartRecording()
|
|
30
37
|
} else {
|
|
31
38
|
this.importAggregator()
|
|
32
39
|
}
|
|
@@ -58,11 +65,44 @@ export class Instrument extends InstrumentBase {
|
|
|
58
65
|
}
|
|
59
66
|
}
|
|
60
67
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
68
|
+
#alreadyStarted = false
|
|
69
|
+
/**
|
|
70
|
+
* This func is use for early pre-load recording prior to replay feature (agg) being loaded onto the page. It should only setup once, including if already called and in-progress.
|
|
71
|
+
*/
|
|
72
|
+
async #preloadStartRecording (trigger) {
|
|
73
|
+
if (this.#alreadyStarted) return
|
|
74
|
+
this.#alreadyStarted = true
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
const { Recorder } = (await import(/* webpackChunkName: "recorder" */'../shared/recorder'))
|
|
78
|
+
|
|
79
|
+
// If startReplay() has been used by this point, we must record in full mode regardless of session preload:
|
|
80
|
+
// Note: recorder starts here with w/e the mode is at this time, but this may be changed later (see #apiStartOrRestartReplay else-case)
|
|
81
|
+
this.recorder ??= new Recorder({ mode: this.#mode, agentIdentifier: this.agentIdentifier, trigger, ee: this.ee })
|
|
82
|
+
this.recorder.startRecording()
|
|
83
|
+
this.abortHandler = this.recorder.stopRecording
|
|
84
|
+
} catch (e) {}
|
|
66
85
|
this.importAggregator({ recorder: this.recorder, errorNoticed: this.errorNoticed })
|
|
67
86
|
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Called whenever startReplay API is used. That could occur any time, pre or post load.
|
|
90
|
+
*/
|
|
91
|
+
#apiStartOrRestartReplay () {
|
|
92
|
+
if (this.featAggregate) { // post-load; there's possibly already an ongoing recording
|
|
93
|
+
if (this.featAggregate.mode !== MODE.FULL) this.featAggregate.initializeRecording(MODE.FULL, true)
|
|
94
|
+
} else { // pre-load
|
|
95
|
+
this.#mode = MODE.FULL
|
|
96
|
+
this.#preloadStartRecording(TRIGGERS.API)
|
|
97
|
+
// There's a race here wherein either:
|
|
98
|
+
// a. Recorder has not been initialized, and we've set the enforced mode, so we're good, or;
|
|
99
|
+
// b. Record has been initialized, possibly with the "wrong" mode, so we have to correct that + restart.
|
|
100
|
+
if (this.recorder && this.recorder.parent.mode !== MODE.FULL) {
|
|
101
|
+
this.recorder.parent.mode = MODE.FULL
|
|
102
|
+
this.recorder.stopRecording()
|
|
103
|
+
this.recorder.startRecording()
|
|
104
|
+
this.abortHandler = this.recorder.stopRecording
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
68
108
|
}
|
|
@@ -86,7 +86,14 @@ export class Recorder {
|
|
|
86
86
|
inlineStylesheet: inline_stylesheet,
|
|
87
87
|
inlineImages: inline_images,
|
|
88
88
|
collectFonts: collect_fonts,
|
|
89
|
-
checkoutEveryNms: CHECKOUT_MS[this.parent.mode]
|
|
89
|
+
checkoutEveryNms: CHECKOUT_MS[this.parent.mode],
|
|
90
|
+
/** Emits errors thrown by rrweb directly before bubbling them up to the window */
|
|
91
|
+
errorHandler: (err) => {
|
|
92
|
+
/** capture rrweb errors as "internal" errors only */
|
|
93
|
+
this.parent.ee.emit('internal-error', [err])
|
|
94
|
+
/** returning true informs rrweb to swallow the error instead of throwing it to the window */
|
|
95
|
+
return true
|
|
96
|
+
}
|
|
90
97
|
})
|
|
91
98
|
|
|
92
99
|
this.stopRecording = () => {
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { getConfigurationValue, originals } from '../../../common/config/config'
|
|
2
|
-
import {
|
|
2
|
+
import { canEnableSessionTracking } from '../../utils/feature-gates'
|
|
3
|
+
import { originTime } from '../../../common/constants/runtime'
|
|
3
4
|
|
|
4
|
-
export function
|
|
5
|
-
return isBrowserScope && getConfigurationValue(agentId, 'privacy.cookies_enabled') === true
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function hasReplayPrerequisite (agentId) {
|
|
5
|
+
export function hasReplayPrerequisite (agentId) {
|
|
9
6
|
return !!originals.MO && // Session Replay cannot work without Mutation Observer
|
|
10
|
-
|
|
7
|
+
canEnableSessionTracking(agentId) && // requires session tracking to be running (hence "session" replay...)
|
|
11
8
|
getConfigurationValue(agentId, 'session_trace.enabled') === true // Session Replay as of now is tightly coupled with Session Trace in the UI
|
|
12
9
|
}
|
|
13
10
|
|