@newrelic/browser-agent 1.310.0 → 1.310.1-rc.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/CHANGELOG.md +7 -0
- package/README.md +1 -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/harvester.js +1 -1
- package/dist/cjs/common/vitals/largest-contentful-paint.js +14 -17
- package/dist/cjs/features/jserrors/aggregate/index.js +1 -1
- package/dist/cjs/features/soft_navigations/aggregate/initial-page-load-interaction.js +5 -5
- package/dist/cjs/features/utils/feature-base.js +1 -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/harvester.js +1 -1
- package/dist/esm/common/vitals/largest-contentful-paint.js +14 -17
- package/dist/esm/features/jserrors/aggregate/index.js +1 -1
- package/dist/esm/features/soft_navigations/aggregate/initial-page-load-interaction.js +5 -5
- package/dist/esm/features/utils/feature-base.js +1 -1
- package/dist/types/features/jserrors/aggregate/index.d.ts +1 -1
- package/dist/types/features/utils/feature-base.d.ts +1 -1
- package/package.json +2 -2
- package/src/common/drain/drain.js +1 -1
- package/src/common/harvest/harvester.js +1 -1
- package/src/common/vitals/largest-contentful-paint.js +13 -14
- package/src/features/jserrors/aggregate/index.js +1 -1
- package/src/features/soft_navigations/aggregate/initial-page-load-interaction.js +5 -5
- package/src/features/utils/feature-base.js +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.310.1](https://github.com/newrelic/newrelic-browser-agent/compare/v1.310.0...v1.310.1) (2026-02-19)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* Enhance LCP entry with fallback attribution values ([#1701](https://github.com/newrelic/newrelic-browser-agent/issues/1701)) ([a212776](https://github.com/newrelic/newrelic-browser-agent/commit/a21277667d7ff05642c9a01ea77a492ecb8c0522))
|
|
12
|
+
|
|
6
13
|
## [1.310.0](https://github.com/newrelic/newrelic-browser-agent/compare/v1.309.0...v1.310.0) (2026-02-17)
|
|
7
14
|
|
|
8
15
|
|
package/README.md
CHANGED
|
@@ -47,7 +47,7 @@ Before instrumenting your app using the NPM package, a Browser App should be con
|
|
|
47
47
|
|
|
48
48
|
For best results, import and instantiate the `BrowserAgent` class as close to the top of the `head` element of your app's HTML output as possible. The specific location and method will vary based on your application's architecture or framework. See [Library Support](#library-support) for more information.
|
|
49
49
|
|
|
50
|
-
Populate the `options` parameter using configuration values found in the
|
|
50
|
+
Populate the `options` parameter using configuration values found in the *Copy/Paste JavaScript* box in your browser app's *Application settings* page in New Relic.
|
|
51
51
|
|
|
52
52
|
```javascript
|
|
53
53
|
import { BrowserAgent } from '@newrelic/browser-agent/loaders/browser-agent'
|
|
@@ -17,7 +17,7 @@ exports.VERSION = exports.RRWEB_VERSION = exports.RRWEB_PACKAGE_NAME = exports.D
|
|
|
17
17
|
/**
|
|
18
18
|
* Exposes the version of the agent
|
|
19
19
|
*/
|
|
20
|
-
const VERSION = exports.VERSION = "1.310.
|
|
20
|
+
const VERSION = exports.VERSION = "1.310.1-rc.1";
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Exposes the build type of the agent
|
|
@@ -17,7 +17,7 @@ exports.VERSION = exports.RRWEB_VERSION = exports.RRWEB_PACKAGE_NAME = exports.D
|
|
|
17
17
|
/**
|
|
18
18
|
* Exposes the version of the agent
|
|
19
19
|
*/
|
|
20
|
-
const VERSION = exports.VERSION = "1.310.
|
|
20
|
+
const VERSION = exports.VERSION = "1.310.1-rc.1";
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Exposes the build type of the agent
|
|
@@ -135,7 +135,7 @@ function drainGroup(agentIdentifier, group, activateGroup = true) {
|
|
|
135
135
|
|
|
136
136
|
/**
|
|
137
137
|
* Processes the specified event using all relevant handler functions associated with a particular feature, based on
|
|
138
|
-
* whether the
|
|
138
|
+
* whether the handler is meant to apply to events of this type. (Event type is a descriptive string set at the
|
|
139
139
|
* time an event is originally created by instrumentation, as with calls to the `handle` method.)
|
|
140
140
|
* @param {*} evt - A single event to be emitted to (processed by) eligible handler functions.
|
|
141
141
|
* @param {*} groupHandlers - A set of handler functions associated with a particular feature's event-group.
|
|
@@ -43,7 +43,7 @@ class Harvester {
|
|
|
43
43
|
this.initializedAggregates.forEach(aggregateInst => this.triggerHarvestFor(aggregateInst, {
|
|
44
44
|
isFinalHarvest: true
|
|
45
45
|
}));
|
|
46
|
-
/* This callback should run in bubble phase, so that
|
|
46
|
+
/* This callback should run in bubble phase, so that CWV api, like "onLCP", is called before the final harvest so that emitted timings are part of last outgoing. */
|
|
47
47
|
}, false);
|
|
48
48
|
}
|
|
49
49
|
startTimer(harvestInterval = this.agentRef.init.harvest.interval) {
|
|
@@ -10,7 +10,7 @@ var _constants = require("./constants");
|
|
|
10
10
|
var _runtime = require("../constants/runtime");
|
|
11
11
|
var _cleanUrl = require("../url/clean-url");
|
|
12
12
|
/**
|
|
13
|
-
* Copyright 2020-
|
|
13
|
+
* Copyright 2020-2026 New Relic, Inc. All rights reserved.
|
|
14
14
|
* SPDX-License-Identifier: Apache-2.0
|
|
15
15
|
*/
|
|
16
16
|
|
|
@@ -22,26 +22,23 @@ if (_runtime.isBrowserScope) {
|
|
|
22
22
|
}) => {
|
|
23
23
|
/* Largest Contentful Paint - As of WV v3, it still imperfectly tries to detect document vis state asap and isn't supposed to report if page starts hidden. */
|
|
24
24
|
if (_runtime.initiallyHidden || largestContentfulPaint.isValid) return;
|
|
25
|
-
let attrs
|
|
25
|
+
let attrs = {
|
|
26
|
+
timeToFirstByte: attribution.timeToFirstByte,
|
|
27
|
+
resourceLoadDelay: attribution.resourceLoadDelay,
|
|
28
|
+
resourceLoadDuration: attribution.resourceLoadDuration,
|
|
29
|
+
resourceLoadTime: attribution.resourceLoadDuration,
|
|
30
|
+
// kept for NR backwards compatibility, deprecated in v3->v4
|
|
31
|
+
elementRenderDelay: attribution.elementRenderDelay
|
|
32
|
+
};
|
|
26
33
|
const lcpEntry = attribution.lcpEntry;
|
|
27
34
|
if (lcpEntry) {
|
|
28
|
-
attrs =
|
|
29
|
-
|
|
30
|
-
eid: lcpEntry.id,
|
|
31
|
-
element: attribution.element,
|
|
32
|
-
timeToFirstByte: attribution.timeToFirstByte,
|
|
33
|
-
resourceLoadDelay: attribution.resourceLoadDelay,
|
|
34
|
-
resourceLoadDuration: attribution.resourceLoadDuration,
|
|
35
|
-
resourceLoadTime: attribution.resourceLoadDuration,
|
|
36
|
-
// kept for NR backwards compatibility, deprecated in v3->v4
|
|
37
|
-
elementRenderDelay: attribution.elementRenderDelay,
|
|
38
|
-
...(attribution.navigationEntry && {
|
|
39
|
-
pageUrl: (0, _cleanUrl.cleanURL)(attribution.navigationEntry.name)
|
|
40
|
-
}) // used to ensure the LCP gets the correct URL at harvest time if a soft nav has occurred before page load
|
|
41
|
-
};
|
|
42
|
-
if (attribution.url) attrs.elUrl = (0, _cleanUrl.cleanURL)(attribution.url);
|
|
35
|
+
attrs.size = lcpEntry.size;
|
|
36
|
+
attrs.eid = lcpEntry.id;
|
|
43
37
|
if (lcpEntry.element?.tagName) attrs.elTag = lcpEntry.element.tagName;
|
|
44
38
|
}
|
|
39
|
+
if (attribution.element) attrs.element = attribution.element;
|
|
40
|
+
if (attribution.navigationEntry) attrs.pageUrl = (0, _cleanUrl.cleanURL)(attribution.navigationEntry.name); // used to ensure the LCP gets the correct URL at harvest time if a soft nav has occurred before page load
|
|
41
|
+
if (attribution.url) attrs.elUrl = (0, _cleanUrl.cleanURL)(attribution.url);
|
|
45
42
|
largestContentfulPaint.update({
|
|
46
43
|
value,
|
|
47
44
|
attrs
|
|
@@ -95,7 +95,7 @@ class Aggregate extends _aggregateBase.AggregateBase {
|
|
|
95
95
|
/**
|
|
96
96
|
*
|
|
97
97
|
* @param {Error|UncaughtError} err The error instance to be processed
|
|
98
|
-
* @param {number} time the relative ms (to origin) timestamp of
|
|
98
|
+
* @param {number} time the relative ms (to origin) timestamp of occurrence
|
|
99
99
|
* @param {boolean=} internal if the error was "caught" and deemed "internal" before reporting to the jserrors feature
|
|
100
100
|
* @param {object=} customAttributes any custom attributes to be included in the error payload
|
|
101
101
|
* @param {boolean=} hasReplay a flag indicating if the error occurred during a replay session
|
|
@@ -37,13 +37,13 @@ class InitialPageLoadInteraction extends _interaction.Interaction {
|
|
|
37
37
|
get navTiming() {
|
|
38
38
|
if (!_navTiming.navTimingValues.length) return;
|
|
39
39
|
/*
|
|
40
|
-
1. we initialize the
|
|
40
|
+
1. we initialize the separator to ',' (separates the nodeType id from the first value)
|
|
41
41
|
2. we initialize the navTiming node to 'b' (the nodeType id)
|
|
42
|
-
3. if the value is present, we add the
|
|
42
|
+
3. if the value is present, we add the separator followed by the value;
|
|
43
43
|
otherwise:
|
|
44
|
-
- we add null
|
|
45
|
-
- we set the
|
|
46
|
-
the reason for writing the null
|
|
44
|
+
- we add null separator ('!') to the navTimingNode
|
|
45
|
+
- we set the separator to an empty string since we already wrote it above
|
|
46
|
+
the reason for writing the null separator instead of setting the separator
|
|
47
47
|
is to ensure we still write it if the null is the last navTiming value.
|
|
48
48
|
*/
|
|
49
49
|
let seperator = ',';
|
|
@@ -20,7 +20,7 @@ class FeatureBase {
|
|
|
20
20
|
/** @type {string} */
|
|
21
21
|
this.featureName = featureName;
|
|
22
22
|
/**
|
|
23
|
-
* Blocked can be used to prevent aggregation and harvest after
|
|
23
|
+
* Blocked can be used to prevent aggregation and harvest after initialization time of the feature.
|
|
24
24
|
* This can currently happen if RUM response setToken flag is 0, which is tied to ingest account entitlement info.
|
|
25
25
|
* @type {boolean}
|
|
26
26
|
*/
|
|
@@ -127,7 +127,7 @@ function drainGroup(agentIdentifier, group, activateGroup = true) {
|
|
|
127
127
|
|
|
128
128
|
/**
|
|
129
129
|
* Processes the specified event using all relevant handler functions associated with a particular feature, based on
|
|
130
|
-
* whether the
|
|
130
|
+
* whether the handler is meant to apply to events of this type. (Event type is a descriptive string set at the
|
|
131
131
|
* time an event is originally created by instrumentation, as with calls to the `handle` method.)
|
|
132
132
|
* @param {*} evt - A single event to be emitted to (processed by) eligible handler functions.
|
|
133
133
|
* @param {*} groupHandlers - A set of handler functions associated with a particular feature's event-group.
|
|
@@ -35,7 +35,7 @@ export class Harvester {
|
|
|
35
35
|
this.initializedAggregates.forEach(aggregateInst => this.triggerHarvestFor(aggregateInst, {
|
|
36
36
|
isFinalHarvest: true
|
|
37
37
|
}));
|
|
38
|
-
/* This callback should run in bubble phase, so that
|
|
38
|
+
/* This callback should run in bubble phase, so that CWV api, like "onLCP", is called before the final harvest so that emitted timings are part of last outgoing. */
|
|
39
39
|
}, false);
|
|
40
40
|
}
|
|
41
41
|
startTimer(harvestInterval = this.agentRef.init.harvest.interval) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright 2020-
|
|
2
|
+
* Copyright 2020-2026 New Relic, Inc. All rights reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
import { onLCP } from 'web-vitals/attribution';
|
|
@@ -15,26 +15,23 @@ if (isBrowserScope) {
|
|
|
15
15
|
}) => {
|
|
16
16
|
/* Largest Contentful Paint - As of WV v3, it still imperfectly tries to detect document vis state asap and isn't supposed to report if page starts hidden. */
|
|
17
17
|
if (initiallyHidden || largestContentfulPaint.isValid) return;
|
|
18
|
-
let attrs
|
|
18
|
+
let attrs = {
|
|
19
|
+
timeToFirstByte: attribution.timeToFirstByte,
|
|
20
|
+
resourceLoadDelay: attribution.resourceLoadDelay,
|
|
21
|
+
resourceLoadDuration: attribution.resourceLoadDuration,
|
|
22
|
+
resourceLoadTime: attribution.resourceLoadDuration,
|
|
23
|
+
// kept for NR backwards compatibility, deprecated in v3->v4
|
|
24
|
+
elementRenderDelay: attribution.elementRenderDelay
|
|
25
|
+
};
|
|
19
26
|
const lcpEntry = attribution.lcpEntry;
|
|
20
27
|
if (lcpEntry) {
|
|
21
|
-
attrs =
|
|
22
|
-
|
|
23
|
-
eid: lcpEntry.id,
|
|
24
|
-
element: attribution.element,
|
|
25
|
-
timeToFirstByte: attribution.timeToFirstByte,
|
|
26
|
-
resourceLoadDelay: attribution.resourceLoadDelay,
|
|
27
|
-
resourceLoadDuration: attribution.resourceLoadDuration,
|
|
28
|
-
resourceLoadTime: attribution.resourceLoadDuration,
|
|
29
|
-
// kept for NR backwards compatibility, deprecated in v3->v4
|
|
30
|
-
elementRenderDelay: attribution.elementRenderDelay,
|
|
31
|
-
...(attribution.navigationEntry && {
|
|
32
|
-
pageUrl: cleanURL(attribution.navigationEntry.name)
|
|
33
|
-
}) // used to ensure the LCP gets the correct URL at harvest time if a soft nav has occurred before page load
|
|
34
|
-
};
|
|
35
|
-
if (attribution.url) attrs.elUrl = cleanURL(attribution.url);
|
|
28
|
+
attrs.size = lcpEntry.size;
|
|
29
|
+
attrs.eid = lcpEntry.id;
|
|
36
30
|
if (lcpEntry.element?.tagName) attrs.elTag = lcpEntry.element.tagName;
|
|
37
31
|
}
|
|
32
|
+
if (attribution.element) attrs.element = attribution.element;
|
|
33
|
+
if (attribution.navigationEntry) attrs.pageUrl = cleanURL(attribution.navigationEntry.name); // used to ensure the LCP gets the correct URL at harvest time if a soft nav has occurred before page load
|
|
34
|
+
if (attribution.url) attrs.elUrl = cleanURL(attribution.url);
|
|
38
35
|
largestContentfulPaint.update({
|
|
39
36
|
value,
|
|
40
37
|
attrs
|
|
@@ -90,7 +90,7 @@ export class Aggregate extends AggregateBase {
|
|
|
90
90
|
/**
|
|
91
91
|
*
|
|
92
92
|
* @param {Error|UncaughtError} err The error instance to be processed
|
|
93
|
-
* @param {number} time the relative ms (to origin) timestamp of
|
|
93
|
+
* @param {number} time the relative ms (to origin) timestamp of occurrence
|
|
94
94
|
* @param {boolean=} internal if the error was "caught" and deemed "internal" before reporting to the jserrors feature
|
|
95
95
|
* @param {object=} customAttributes any custom attributes to be included in the error payload
|
|
96
96
|
* @param {boolean=} hasReplay a flag indicating if the error occurred during a replay session
|
|
@@ -30,13 +30,13 @@ export class InitialPageLoadInteraction extends Interaction {
|
|
|
30
30
|
get navTiming() {
|
|
31
31
|
if (!navTimingValues.length) return;
|
|
32
32
|
/*
|
|
33
|
-
1. we initialize the
|
|
33
|
+
1. we initialize the separator to ',' (separates the nodeType id from the first value)
|
|
34
34
|
2. we initialize the navTiming node to 'b' (the nodeType id)
|
|
35
|
-
3. if the value is present, we add the
|
|
35
|
+
3. if the value is present, we add the separator followed by the value;
|
|
36
36
|
otherwise:
|
|
37
|
-
- we add null
|
|
38
|
-
- we set the
|
|
39
|
-
the reason for writing the null
|
|
37
|
+
- we add null separator ('!') to the navTimingNode
|
|
38
|
+
- we set the separator to an empty string since we already wrote it above
|
|
39
|
+
the reason for writing the null separator instead of setting the separator
|
|
40
40
|
is to ensure we still write it if the null is the last navTiming value.
|
|
41
41
|
*/
|
|
42
42
|
let seperator = ',';
|
|
@@ -13,7 +13,7 @@ export class FeatureBase {
|
|
|
13
13
|
/** @type {string} */
|
|
14
14
|
this.featureName = featureName;
|
|
15
15
|
/**
|
|
16
|
-
* Blocked can be used to prevent aggregation and harvest after
|
|
16
|
+
* Blocked can be used to prevent aggregation and harvest after initialization time of the feature.
|
|
17
17
|
* This can currently happen if RUM response setToken flag is 0, which is tied to ingest account entitlement info.
|
|
18
18
|
* @type {boolean}
|
|
19
19
|
*/
|
|
@@ -24,7 +24,7 @@ export class Aggregate extends AggregateBase {
|
|
|
24
24
|
/**
|
|
25
25
|
*
|
|
26
26
|
* @param {Error|UncaughtError} err The error instance to be processed
|
|
27
|
-
* @param {number} time the relative ms (to origin) timestamp of
|
|
27
|
+
* @param {number} time the relative ms (to origin) timestamp of occurrence
|
|
28
28
|
* @param {boolean=} internal if the error was "caught" and deemed "internal" before reporting to the jserrors feature
|
|
29
29
|
* @param {object=} customAttributes any custom attributes to be included in the error payload
|
|
30
30
|
* @param {boolean=} hasReplay a flag indicating if the error occurred during a replay session
|
|
@@ -7,7 +7,7 @@ export class FeatureBase {
|
|
|
7
7
|
/** @type {string} */
|
|
8
8
|
featureName: string;
|
|
9
9
|
/**
|
|
10
|
-
* Blocked can be used to prevent aggregation and harvest after
|
|
10
|
+
* Blocked can be used to prevent aggregation and harvest after initialization time of the feature.
|
|
11
11
|
* This can currently happen if RUM response setToken flag is 0, which is tied to ingest account entitlement info.
|
|
12
12
|
* @type {boolean}
|
|
13
13
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@newrelic/browser-agent",
|
|
3
|
-
"version": "1.310.
|
|
3
|
+
"version": "1.310.1-rc.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "New Relic Browser Agent Team <browser-agent@newrelic.com>",
|
|
6
6
|
"description": "New Relic Browser Agent",
|
|
@@ -284,4 +284,4 @@
|
|
|
284
284
|
"README.md",
|
|
285
285
|
"CHANGELOG.md"
|
|
286
286
|
]
|
|
287
|
-
}
|
|
287
|
+
}
|
|
@@ -128,7 +128,7 @@ function drainGroup (agentIdentifier, group, activateGroup = true) {
|
|
|
128
128
|
|
|
129
129
|
/**
|
|
130
130
|
* Processes the specified event using all relevant handler functions associated with a particular feature, based on
|
|
131
|
-
* whether the
|
|
131
|
+
* whether the handler is meant to apply to events of this type. (Event type is a descriptive string set at the
|
|
132
132
|
* time an event is originally created by instrumentation, as with calls to the `handle` method.)
|
|
133
133
|
* @param {*} evt - A single event to be emitted to (processed by) eligible handler functions.
|
|
134
134
|
* @param {*} groupHandlers - A set of handler functions associated with a particular feature's event-group.
|
|
@@ -35,7 +35,7 @@ export class Harvester {
|
|
|
35
35
|
if (typeof aggregateInst.harvestOpts.beforeUnload === 'function') aggregateInst.harvestOpts.beforeUnload()
|
|
36
36
|
})
|
|
37
37
|
this.initializedAggregates.forEach(aggregateInst => this.triggerHarvestFor(aggregateInst, { isFinalHarvest: true }))
|
|
38
|
-
/* This callback should run in bubble phase, so that
|
|
38
|
+
/* This callback should run in bubble phase, so that CWV api, like "onLCP", is called before the final harvest so that emitted timings are part of last outgoing. */
|
|
39
39
|
}, false)
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copyright 2020-
|
|
2
|
+
* Copyright 2020-2026 New Relic, Inc. All rights reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
import { onLCP } from 'web-vitals/attribution'
|
|
@@ -15,23 +15,22 @@ if (isBrowserScope) {
|
|
|
15
15
|
/* Largest Contentful Paint - As of WV v3, it still imperfectly tries to detect document vis state asap and isn't supposed to report if page starts hidden. */
|
|
16
16
|
if (initiallyHidden || largestContentfulPaint.isValid) return
|
|
17
17
|
|
|
18
|
-
let attrs
|
|
18
|
+
let attrs = {
|
|
19
|
+
timeToFirstByte: attribution.timeToFirstByte,
|
|
20
|
+
resourceLoadDelay: attribution.resourceLoadDelay,
|
|
21
|
+
resourceLoadDuration: attribution.resourceLoadDuration,
|
|
22
|
+
resourceLoadTime: attribution.resourceLoadDuration, // kept for NR backwards compatibility, deprecated in v3->v4
|
|
23
|
+
elementRenderDelay: attribution.elementRenderDelay
|
|
24
|
+
}
|
|
19
25
|
const lcpEntry = attribution.lcpEntry
|
|
20
26
|
if (lcpEntry) {
|
|
21
|
-
attrs =
|
|
22
|
-
|
|
23
|
-
eid: lcpEntry.id,
|
|
24
|
-
element: attribution.element,
|
|
25
|
-
timeToFirstByte: attribution.timeToFirstByte,
|
|
26
|
-
resourceLoadDelay: attribution.resourceLoadDelay,
|
|
27
|
-
resourceLoadDuration: attribution.resourceLoadDuration,
|
|
28
|
-
resourceLoadTime: attribution.resourceLoadDuration, // kept for NR backwards compatibility, deprecated in v3->v4
|
|
29
|
-
elementRenderDelay: attribution.elementRenderDelay,
|
|
30
|
-
...(attribution.navigationEntry && { pageUrl: cleanURL(attribution.navigationEntry.name) }) // used to ensure the LCP gets the correct URL at harvest time if a soft nav has occurred before page load
|
|
31
|
-
}
|
|
32
|
-
if (attribution.url) attrs.elUrl = cleanURL(attribution.url)
|
|
27
|
+
attrs.size = lcpEntry.size
|
|
28
|
+
attrs.eid = lcpEntry.id
|
|
33
29
|
if (lcpEntry.element?.tagName) attrs.elTag = lcpEntry.element.tagName
|
|
34
30
|
}
|
|
31
|
+
if (attribution.element) attrs.element = attribution.element
|
|
32
|
+
if (attribution.navigationEntry) attrs.pageUrl = cleanURL(attribution.navigationEntry.name) // used to ensure the LCP gets the correct URL at harvest time if a soft nav has occurred before page load
|
|
33
|
+
if (attribution.url) attrs.elUrl = cleanURL(attribution.url)
|
|
35
34
|
|
|
36
35
|
largestContentfulPaint.update({ value, attrs })
|
|
37
36
|
})
|
|
@@ -99,7 +99,7 @@ export class Aggregate extends AggregateBase {
|
|
|
99
99
|
/**
|
|
100
100
|
*
|
|
101
101
|
* @param {Error|UncaughtError} err The error instance to be processed
|
|
102
|
-
* @param {number} time the relative ms (to origin) timestamp of
|
|
102
|
+
* @param {number} time the relative ms (to origin) timestamp of occurrence
|
|
103
103
|
* @param {boolean=} internal if the error was "caught" and deemed "internal" before reporting to the jserrors feature
|
|
104
104
|
* @param {object=} customAttributes any custom attributes to be included in the error payload
|
|
105
105
|
* @param {boolean=} hasReplay a flag indicating if the error occurred during a replay session
|
|
@@ -28,13 +28,13 @@ export class InitialPageLoadInteraction extends Interaction {
|
|
|
28
28
|
get navTiming () {
|
|
29
29
|
if (!navTimingValues.length) return
|
|
30
30
|
/*
|
|
31
|
-
1. we initialize the
|
|
31
|
+
1. we initialize the separator to ',' (separates the nodeType id from the first value)
|
|
32
32
|
2. we initialize the navTiming node to 'b' (the nodeType id)
|
|
33
|
-
3. if the value is present, we add the
|
|
33
|
+
3. if the value is present, we add the separator followed by the value;
|
|
34
34
|
otherwise:
|
|
35
|
-
- we add null
|
|
36
|
-
- we set the
|
|
37
|
-
the reason for writing the null
|
|
35
|
+
- we add null separator ('!') to the navTimingNode
|
|
36
|
+
- we set the separator to an empty string since we already wrote it above
|
|
37
|
+
the reason for writing the null separator instead of setting the separator
|
|
38
38
|
is to ensure we still write it if the null is the last navTiming value.
|
|
39
39
|
*/
|
|
40
40
|
let seperator = ','
|
|
@@ -14,7 +14,7 @@ export class FeatureBase {
|
|
|
14
14
|
/** @type {string} */
|
|
15
15
|
this.featureName = featureName
|
|
16
16
|
/**
|
|
17
|
-
* Blocked can be used to prevent aggregation and harvest after
|
|
17
|
+
* Blocked can be used to prevent aggregation and harvest after initialization time of the feature.
|
|
18
18
|
* This can currently happen if RUM response setToken flag is 0, which is tied to ingest account entitlement info.
|
|
19
19
|
* @type {boolean}
|
|
20
20
|
*/
|