@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.
Files changed (27) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +1 -1
  3. package/dist/cjs/common/constants/env.cdn.js +1 -1
  4. package/dist/cjs/common/constants/env.npm.js +1 -1
  5. package/dist/cjs/common/drain/drain.js +1 -1
  6. package/dist/cjs/common/harvest/harvester.js +1 -1
  7. package/dist/cjs/common/vitals/largest-contentful-paint.js +14 -17
  8. package/dist/cjs/features/jserrors/aggregate/index.js +1 -1
  9. package/dist/cjs/features/soft_navigations/aggregate/initial-page-load-interaction.js +5 -5
  10. package/dist/cjs/features/utils/feature-base.js +1 -1
  11. package/dist/esm/common/constants/env.cdn.js +1 -1
  12. package/dist/esm/common/constants/env.npm.js +1 -1
  13. package/dist/esm/common/drain/drain.js +1 -1
  14. package/dist/esm/common/harvest/harvester.js +1 -1
  15. package/dist/esm/common/vitals/largest-contentful-paint.js +14 -17
  16. package/dist/esm/features/jserrors/aggregate/index.js +1 -1
  17. package/dist/esm/features/soft_navigations/aggregate/initial-page-load-interaction.js +5 -5
  18. package/dist/esm/features/utils/feature-base.js +1 -1
  19. package/dist/types/features/jserrors/aggregate/index.d.ts +1 -1
  20. package/dist/types/features/utils/feature-base.d.ts +1 -1
  21. package/package.json +2 -2
  22. package/src/common/drain/drain.js +1 -1
  23. package/src/common/harvest/harvester.js +1 -1
  24. package/src/common/vitals/largest-contentful-paint.js +13 -14
  25. package/src/features/jserrors/aggregate/index.js +1 -1
  26. package/src/features/soft_navigations/aggregate/initial-page-load-interaction.js +5 -5
  27. 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 the *Copy/Paste JavaScript* box in your browser app's *Application settings* page in New Relic.
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.0";
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.0";
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 the handler is meant to apply to events of this type. (Event type is a descriptive string set at 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 that CWV api, like "onLCP", is called before the final harvest so that emitted timings are part of last outgoing. */
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-2025 New Relic, Inc. All rights reserved.
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
- size: lcpEntry.size,
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 occurence
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 seperator to ',' (seperates the nodeType id from the first value)
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 seperator followed by the value;
42
+ 3. if the value is present, we add the separator followed by the value;
43
43
  otherwise:
44
- - we add null seperator ('!') to the navTimingNode
45
- - we set the seperator to an empty string since we already wrote it above
46
- the reason for writing the null seperator instead of setting the seperator
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 inititalization time of the feature.
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
  */
@@ -11,7 +11,7 @@
11
11
  /**
12
12
  * Exposes the version of the agent
13
13
  */
14
- export const VERSION = "1.310.0";
14
+ export const VERSION = "1.310.1-rc.1";
15
15
 
16
16
  /**
17
17
  * Exposes the build type of the agent
@@ -11,7 +11,7 @@
11
11
  /**
12
12
  * Exposes the version of the agent
13
13
  */
14
- export const VERSION = "1.310.0";
14
+ export const VERSION = "1.310.1-rc.1";
15
15
 
16
16
  /**
17
17
  * Exposes the build type of the agent
@@ -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 the handler is meant to apply to events of this type. (Event type is a descriptive string set at 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 that CWV api, like "onLCP", is called before the final harvest so that emitted timings are part of last outgoing. */
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-2025 New Relic, Inc. All rights reserved.
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
- size: lcpEntry.size,
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 occurence
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 seperator to ',' (seperates the nodeType id from the first value)
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 seperator followed by the value;
35
+ 3. if the value is present, we add the separator followed by the value;
36
36
  otherwise:
37
- - we add null seperator ('!') to the navTimingNode
38
- - we set the seperator to an empty string since we already wrote it above
39
- the reason for writing the null seperator instead of setting the seperator
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 inititalization time of the feature.
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 occurence
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 inititalization time of the feature.
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.0",
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 the handler is meant to apply to events of this type. (Event type is a descriptive string set at 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 that CWV api, like "onLCP", is called before the final harvest so that emitted timings are part of last outgoing. */
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-2025 New Relic, Inc. All rights reserved.
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
- size: lcpEntry.size,
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 occurence
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 seperator to ',' (seperates the nodeType id from the first value)
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 seperator followed by the value;
33
+ 3. if the value is present, we add the separator followed by the value;
34
34
  otherwise:
35
- - we add null seperator ('!') to the navTimingNode
36
- - we set the seperator to an empty string since we already wrote it above
37
- the reason for writing the null seperator instead of setting the seperator
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 inititalization time of the feature.
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
  */