@newrelic/browser-agent 1.232.1 → 1.233.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.
Files changed (233) hide show
  1. package/dist/cjs/cdn/polyfills.js +5 -2
  2. package/dist/cjs/common/config/state/configurable.js +15 -26
  3. package/dist/cjs/common/config/state/info.js +1 -1
  4. package/dist/cjs/common/config/state/init.js +101 -56
  5. package/dist/cjs/common/config/state/loader-config.js +1 -1
  6. package/dist/cjs/common/config/state/runtime.js +1 -5
  7. package/dist/cjs/common/constants/env.cdn.js +1 -1
  8. package/dist/cjs/common/constants/env.npm.js +1 -1
  9. package/dist/cjs/common/drain/drain.js +1 -1
  10. package/dist/cjs/common/harvest/harvest-scheduler.js +30 -10
  11. package/dist/cjs/common/harvest/harvest.js +119 -55
  12. package/dist/cjs/common/session/session-entity.js +35 -22
  13. package/dist/cjs/common/session/session-entity.test.js +73 -49
  14. package/dist/cjs/common/timer/interaction-timer.js +9 -12
  15. package/dist/cjs/common/url/protocol.test.js +0 -1
  16. package/dist/cjs/common/util/feature-flags.js +2 -1
  17. package/dist/cjs/common/util/submit-data.js +57 -18
  18. package/dist/cjs/common/wrap/wrap-fetch.js +1 -1
  19. package/dist/cjs/common/wrap/wrap-function.js +1 -1
  20. package/dist/cjs/common/wrap/wrap-promise.js +1 -1
  21. package/dist/cjs/features/ajax/aggregate/index.js +2 -2
  22. package/dist/cjs/features/jserrors/aggregate/index.js +7 -5
  23. package/dist/cjs/features/metrics/aggregate/framework-detection.js +67 -0
  24. package/dist/cjs/features/metrics/aggregate/framework-detection.test.js +137 -0
  25. package/dist/cjs/features/metrics/aggregate/index.js +7 -3
  26. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.js +14 -0
  27. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.test.js +17 -0
  28. package/dist/cjs/features/metrics/aggregate/polyfill-detection.js +53 -0
  29. package/dist/cjs/features/metrics/aggregate/polyfill-detection.test.js +165 -0
  30. package/dist/cjs/features/page_action/aggregate/index.js +2 -2
  31. package/dist/cjs/features/page_view_event/aggregate/index.js +6 -3
  32. package/dist/cjs/features/page_view_timing/aggregate/index.js +2 -2
  33. package/dist/cjs/features/session_replay/aggregate/index.js +333 -0
  34. package/dist/cjs/features/session_replay/constants.js +9 -0
  35. package/dist/cjs/features/session_replay/index.js +12 -0
  36. package/dist/cjs/features/session_replay/instrument/index.js +29 -0
  37. package/dist/cjs/features/session_trace/aggregate/index.js +163 -162
  38. package/dist/cjs/features/session_trace/constants.js +2 -9
  39. package/dist/cjs/features/session_trace/instrument/index.js +24 -66
  40. package/dist/cjs/features/spa/aggregate/index.js +2 -2
  41. package/dist/cjs/features/utils/agent-session.js +1 -2
  42. package/dist/cjs/features/utils/aggregate-base.js +64 -0
  43. package/dist/cjs/features/utils/feature-base.js +0 -31
  44. package/dist/cjs/features/utils/handler-cache.js +3 -4
  45. package/dist/cjs/features/utils/instrument-base.js +42 -10
  46. package/dist/cjs/features/utils/{lazy-loader.js → lazy-feature-loader.js} +4 -2
  47. package/dist/cjs/loaders/agent.js +1 -1
  48. package/dist/cjs/loaders/api/apiAsync.js +3 -1
  49. package/dist/cjs/loaders/configure/configure.js +3 -3
  50. package/dist/cjs/loaders/features/featureDependencies.js +0 -12
  51. package/dist/cjs/loaders/features/features.js +3 -1
  52. package/dist/cjs/loaders/micro-agent.js +6 -6
  53. package/dist/esm/cdn/polyfills.js +5 -2
  54. package/dist/esm/common/config/state/configurable.js +14 -24
  55. package/dist/esm/common/config/state/info.js +2 -2
  56. package/dist/esm/common/config/state/init.js +102 -57
  57. package/dist/esm/common/config/state/loader-config.js +2 -2
  58. package/dist/esm/common/config/state/runtime.js +2 -4
  59. package/dist/esm/common/constants/env.cdn.js +1 -1
  60. package/dist/esm/common/constants/env.npm.js +1 -1
  61. package/dist/esm/common/drain/drain.js +1 -1
  62. package/dist/esm/common/harvest/harvest-scheduler.js +30 -10
  63. package/dist/esm/common/harvest/harvest.js +121 -56
  64. package/dist/esm/common/session/session-entity.js +35 -22
  65. package/dist/esm/common/session/session-entity.test.js +73 -49
  66. package/dist/esm/common/timer/interaction-timer.js +9 -12
  67. package/dist/esm/common/url/protocol.test.js +0 -1
  68. package/dist/esm/common/util/feature-flags.js +2 -1
  69. package/dist/esm/common/util/submit-data.js +57 -18
  70. package/dist/esm/common/wrap/wrap-fetch.js +1 -1
  71. package/dist/esm/common/wrap/wrap-function.js +1 -1
  72. package/dist/esm/common/wrap/wrap-promise.js +1 -1
  73. package/dist/esm/features/ajax/aggregate/index.js +2 -2
  74. package/dist/esm/features/jserrors/aggregate/index.js +7 -5
  75. package/dist/esm/features/metrics/aggregate/framework-detection.js +61 -0
  76. package/dist/esm/features/metrics/aggregate/framework-detection.test.js +133 -0
  77. package/dist/esm/features/metrics/aggregate/index.js +7 -3
  78. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.js +8 -0
  79. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.test.js +15 -0
  80. package/dist/esm/features/metrics/aggregate/polyfill-detection.js +47 -0
  81. package/dist/esm/features/metrics/aggregate/polyfill-detection.test.js +163 -0
  82. package/dist/esm/features/page_action/aggregate/index.js +2 -2
  83. package/dist/esm/features/page_view_event/aggregate/index.js +6 -3
  84. package/dist/esm/features/page_view_timing/aggregate/index.js +2 -2
  85. package/dist/esm/features/session_replay/aggregate/index.js +327 -0
  86. package/dist/esm/features/session_replay/constants.js +2 -0
  87. package/dist/esm/features/session_replay/index.js +12 -0
  88. package/dist/esm/features/session_replay/instrument/index.js +21 -0
  89. package/dist/esm/features/session_trace/aggregate/index.js +163 -162
  90. package/dist/esm/features/session_trace/constants.js +1 -5
  91. package/dist/esm/features/session_trace/instrument/index.js +24 -66
  92. package/dist/esm/features/spa/aggregate/index.js +2 -2
  93. package/dist/esm/features/utils/agent-session.js +1 -2
  94. package/dist/esm/features/utils/aggregate-base.js +57 -0
  95. package/dist/esm/features/utils/feature-base.js +1 -32
  96. package/dist/esm/features/utils/handler-cache.js +3 -4
  97. package/dist/esm/features/utils/instrument-base.js +42 -10
  98. package/dist/esm/features/utils/{lazy-loader.js → lazy-feature-loader.js} +3 -1
  99. package/dist/esm/loaders/agent.js +1 -1
  100. package/dist/esm/loaders/api/apiAsync.js +3 -1
  101. package/dist/esm/loaders/configure/configure.js +3 -3
  102. package/dist/esm/loaders/features/featureDependencies.js +0 -11
  103. package/dist/esm/loaders/features/features.js +3 -1
  104. package/dist/esm/loaders/micro-agent.js +6 -6
  105. package/dist/types/common/config/state/configurable.d.ts +1 -3
  106. package/dist/types/common/config/state/configurable.d.ts.map +1 -1
  107. package/dist/types/common/config/state/init.d.ts.map +1 -1
  108. package/dist/types/common/config/state/runtime.d.ts.map +1 -1
  109. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
  110. package/dist/types/common/harvest/harvest.d.ts +37 -34
  111. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  112. package/dist/types/common/session/session-entity.d.ts +6 -3
  113. package/dist/types/common/session/session-entity.d.ts.map +1 -1
  114. package/dist/types/common/timer/interaction-timer.d.ts +2 -1
  115. package/dist/types/common/timer/interaction-timer.d.ts.map +1 -1
  116. package/dist/types/common/util/feature-flags.d.ts.map +1 -1
  117. package/dist/types/common/util/submit-data.d.ts +40 -14
  118. package/dist/types/common/util/submit-data.d.ts.map +1 -1
  119. package/dist/types/features/ajax/aggregate/index.d.ts +2 -2
  120. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
  121. package/dist/types/features/jserrors/aggregate/index.d.ts +2 -2
  122. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  123. package/dist/types/features/metrics/aggregate/framework-detection.d.ts.map +1 -0
  124. package/dist/types/features/metrics/aggregate/index.d.ts +2 -2
  125. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
  126. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts +6 -0
  127. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts.map +1 -0
  128. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts +7 -0
  129. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts.map +1 -0
  130. package/dist/types/features/page_action/aggregate/index.d.ts +2 -2
  131. package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
  132. package/dist/types/features/page_view_event/aggregate/index.d.ts +2 -2
  133. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  134. package/dist/types/features/page_view_timing/aggregate/index.d.ts +2 -2
  135. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  136. package/dist/types/features/session_replay/aggregate/index.d.ts +96 -0
  137. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -0
  138. package/dist/types/features/session_replay/constants.d.ts +2 -0
  139. package/dist/types/features/session_replay/constants.d.ts.map +1 -0
  140. package/dist/types/features/session_replay/index.d.ts +2 -0
  141. package/dist/types/features/session_replay/index.d.ts.map +1 -0
  142. package/dist/types/features/session_replay/instrument/index.d.ts +6 -0
  143. package/dist/types/features/session_replay/instrument/index.d.ts.map +1 -0
  144. package/dist/types/features/session_trace/aggregate/index.d.ts +8 -57
  145. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  146. package/dist/types/features/session_trace/constants.d.ts +0 -3
  147. package/dist/types/features/session_trace/constants.d.ts.map +1 -1
  148. package/dist/types/features/session_trace/instrument/index.d.ts +1 -3
  149. package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
  150. package/dist/types/features/spa/aggregate/index.d.ts +2 -2
  151. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
  152. package/dist/types/features/utils/agent-session.d.ts.map +1 -1
  153. package/dist/types/features/utils/aggregate-base.d.ts +11 -0
  154. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -0
  155. package/dist/types/features/utils/feature-base.d.ts +0 -5
  156. package/dist/types/features/utils/feature-base.d.ts.map +1 -1
  157. package/dist/types/features/utils/handler-cache.d.ts.map +1 -1
  158. package/dist/types/features/utils/instrument-base.d.ts +3 -1
  159. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  160. package/dist/types/features/utils/{lazy-loader.d.ts → lazy-feature-loader.d.ts} +2 -2
  161. package/dist/types/features/utils/lazy-feature-loader.d.ts.map +1 -0
  162. package/dist/types/loaders/configure/configure.d.ts.map +1 -1
  163. package/dist/types/loaders/features/featureDependencies.d.ts +0 -1
  164. package/dist/types/loaders/features/featureDependencies.d.ts.map +1 -1
  165. package/dist/types/loaders/features/features.d.ts +1 -0
  166. package/dist/types/loaders/features/features.d.ts.map +1 -1
  167. package/package.json +28 -19
  168. package/src/cdn/polyfills.js +4 -1
  169. package/src/common/config/state/configurable.js +18 -24
  170. package/src/common/config/state/info.js +2 -2
  171. package/src/common/config/state/init.js +62 -28
  172. package/src/common/config/state/loader-config.js +2 -2
  173. package/src/common/config/state/runtime.js +2 -4
  174. package/src/common/drain/drain.js +1 -1
  175. package/src/common/harvest/harvest-scheduler.js +35 -10
  176. package/src/common/harvest/harvest.js +73 -50
  177. package/src/common/session/session-entity.js +34 -23
  178. package/src/common/session/session-entity.test.js +57 -51
  179. package/src/common/timer/interaction-timer.js +9 -12
  180. package/src/common/url/protocol.test.js +0 -1
  181. package/src/common/util/feature-flags.js +2 -2
  182. package/src/common/util/submit-data.js +28 -17
  183. package/src/common/wrap/wrap-fetch.js +1 -1
  184. package/src/common/wrap/wrap-function.js +1 -1
  185. package/src/common/wrap/wrap-promise.js +1 -1
  186. package/src/features/ajax/aggregate/index.js +2 -2
  187. package/src/features/jserrors/aggregate/index.js +7 -5
  188. package/src/features/metrics/aggregate/framework-detection.js +73 -0
  189. package/src/features/metrics/aggregate/framework-detection.test.js +201 -0
  190. package/src/features/metrics/aggregate/index.js +8 -3
  191. package/src/features/metrics/aggregate/polyfill-detection.es5.js +9 -0
  192. package/src/features/metrics/aggregate/polyfill-detection.es5.test.js +16 -0
  193. package/src/features/metrics/aggregate/polyfill-detection.js +48 -0
  194. package/src/features/metrics/aggregate/polyfill-detection.test.js +163 -0
  195. package/src/features/page_action/aggregate/index.js +2 -2
  196. package/src/features/page_view_event/aggregate/index.js +5 -5
  197. package/src/features/page_view_timing/aggregate/index.js +2 -2
  198. package/src/features/session_replay/aggregate/index.js +314 -0
  199. package/src/features/session_replay/constants.js +3 -0
  200. package/src/features/session_replay/index.js +12 -0
  201. package/src/features/session_replay/instrument/index.js +22 -0
  202. package/src/features/session_trace/aggregate/index.js +148 -187
  203. package/src/features/session_trace/constants.js +0 -4
  204. package/src/features/session_trace/instrument/index.js +17 -69
  205. package/src/features/spa/aggregate/index.js +2 -2
  206. package/src/features/utils/agent-session.js +1 -2
  207. package/src/features/utils/aggregate-base.js +51 -0
  208. package/src/features/utils/feature-base.js +1 -31
  209. package/src/features/utils/handler-cache.js +3 -4
  210. package/src/features/utils/instrument-base.js +40 -8
  211. package/src/features/utils/{lazy-loader.js → lazy-feature-loader.js} +3 -1
  212. package/src/loaders/agent.js +1 -1
  213. package/src/loaders/api/apiAsync.js +1 -1
  214. package/src/loaders/configure/configure.js +4 -3
  215. package/src/loaders/features/featureDependencies.js +0 -12
  216. package/src/loaders/features/features.js +3 -1
  217. package/src/loaders/micro-agent.js +4 -4
  218. package/dist/cjs/common/metrics/framework-detection.js +0 -72
  219. package/dist/cjs/common/util/user-agent.js +0 -57
  220. package/dist/cjs/common/window/supports-performance-observer.js +0 -15
  221. package/dist/esm/common/metrics/framework-detection.js +0 -66
  222. package/dist/esm/common/util/user-agent.js +0 -48
  223. package/dist/esm/common/window/supports-performance-observer.js +0 -9
  224. package/dist/types/common/metrics/framework-detection.d.ts.map +0 -1
  225. package/dist/types/common/util/user-agent.d.ts +0 -5
  226. package/dist/types/common/util/user-agent.d.ts.map +0 -1
  227. package/dist/types/common/window/supports-performance-observer.d.ts +0 -2
  228. package/dist/types/common/window/supports-performance-observer.d.ts.map +0 -1
  229. package/dist/types/features/utils/lazy-loader.d.ts.map +0 -1
  230. package/src/common/metrics/framework-detection.js +0 -71
  231. package/src/common/util/user-agent.js +0 -56
  232. package/src/common/window/supports-performance-observer.js +0 -10
  233. /package/dist/types/{common/metrics → features/metrics/aggregate}/framework-detection.d.ts +0 -0
@@ -20,7 +20,7 @@ var _contextualEe = require("../../../common/event-emitter/contextual-ee");
20
20
  var CONSTANTS = _interopRequireWildcard(require("../constants"));
21
21
  var _drain = require("../../../common/drain/drain");
22
22
  var _features = require("../../../loaders/features/features");
23
- var _featureBase = require("../../utils/feature-base");
23
+ var _aggregateBase = require("../../utils/aggregate-base");
24
24
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
25
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
26
  /*
@@ -47,7 +47,7 @@ const {
47
47
  JSONP_END,
48
48
  originalSetTimeout
49
49
  } = CONSTANTS;
50
- class Aggregate extends _featureBase.FeatureBase {
50
+ class Aggregate extends _aggregateBase.AggregateBase {
51
51
  static featureName = FEATURE_NAME;
52
52
  constructor(agentIdentifier, aggregator) {
53
53
  super(agentIdentifier, aggregator, FEATURE_NAME);
@@ -12,7 +12,6 @@ var _globalScope = require("../../common/util/global-scope");
12
12
  var _sessionEntity = require("../../common/session/session-entity");
13
13
  var _localStorage = require("../../common/storage/local-storage.js");
14
14
  var _firstPartyCookies = require("../../common/storage/first-party-cookies");
15
- var _localMemory = require("../../common/storage/local-memory");
16
15
  let ranOnce = 0;
17
16
  function setupAgentSession(agentIdentifier) {
18
17
  const agentRuntime = (0, _config.getRuntime)(agentIdentifier);
@@ -42,7 +41,7 @@ function setupAgentSession(agentIdentifier) {
42
41
  // that's currently stored in the storage API into the local info.jsAttributes object
43
42
  if (_globalScope.isBrowserScope) {
44
43
  // retrieve & re-add all of the persisted setCustomAttribute|setUserId k-v from previous page load(s)
45
- const customSessionData = agentRuntime.session?.read?.()?.custom;
44
+ const customSessionData = agentRuntime.session.state.custom;
46
45
  const agentInfo = (0, _config.getInfo)(agentIdentifier);
47
46
  if (customSessionData) {
48
47
  (0, _config.setInfo)(agentIdentifier, {
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.AggregateBase = void 0;
7
+ var _registerHandler = require("../../common/event-emitter/register-handler");
8
+ var _featureBase = require("./feature-base");
9
+ var _config = require("../../common/config/config");
10
+ var _configure = require("../../loaders/configure/configure");
11
+ var _nreum = require("../../common/window/nreum");
12
+ class AggregateBase extends _featureBase.FeatureBase {
13
+ constructor() {
14
+ super(...arguments);
15
+ this.checkConfiguration();
16
+ }
17
+ waitForFlags() {
18
+ let flagNames = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
19
+ return Promise.all(flagNames.map(fName => new Promise(resolve => {
20
+ (0, _registerHandler.registerHandler)("feat-".concat(fName), () => {
21
+ resolve({
22
+ name: fName,
23
+ value: true
24
+ });
25
+ }, this.featureName, this.ee);
26
+ (0, _registerHandler.registerHandler)("block-".concat(fName), () => {
27
+ resolve({
28
+ name: fName,
29
+ value: false
30
+ });
31
+ }, this.feature, this.ee);
32
+ })));
33
+ }
34
+
35
+ /**
36
+ * Checks for additional `jsAttributes` items to support backward compatibility with implementations of the agent where
37
+ * loader configurations may appear after the loader code is executed.
38
+ */
39
+ checkConfiguration() {
40
+ // NOTE: This check has to happen at aggregator load time
41
+ if (!(0, _config.isConfigured)(this.agentIdentifier)) {
42
+ let jsAttributes = {
43
+ ...(0, _nreum.gosCDN)().info?.jsAttributes
44
+ };
45
+ try {
46
+ jsAttributes = {
47
+ ...jsAttributes,
48
+ ...(0, _config.getInfo)(this.agentIdentifier)?.jsAttributes
49
+ };
50
+ } catch (err) {
51
+ // do nothing
52
+ }
53
+ (0, _configure.configure)(this.agentIdentifier, {
54
+ ...(0, _nreum.gosCDN)(),
55
+ info: {
56
+ ...(0, _nreum.gosCDN)().info,
57
+ jsAttributes
58
+ },
59
+ runtime: (0, _config.getRuntime)(this.agentIdentifier)
60
+ });
61
+ }
62
+ }
63
+ }
64
+ exports.AggregateBase = AggregateBase;
@@ -6,8 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.FeatureBase = void 0;
7
7
  var _config = require("../../common/config/config");
8
8
  var _contextualEe = require("../../common/event-emitter/contextual-ee");
9
- var _configure = require("../../loaders/configure/configure");
10
- var _nreum = require("../../common/window/nreum");
11
9
  class FeatureBase {
12
10
  constructor(agentIdentifier, aggregator, featureName) {
13
11
  /** @type {string} */
@@ -24,35 +22,6 @@ class FeatureBase {
24
22
  * @type {boolean}
25
23
  */
26
24
  this.blocked = false;
27
- this.checkConfiguration();
28
- }
29
-
30
- /**
31
- * Checks for additional `jsAttributes` items to support backward compatibility with implementations of the agent where
32
- * loader configurations may appear after the loader code is executed.
33
- */
34
- checkConfiguration() {
35
- // NOTE: This check has to happen at aggregator load time
36
- if (!(0, _config.isConfigured)(this.agentIdentifier)) {
37
- let jsAttributes = {
38
- ...(0, _nreum.gosCDN)().info?.jsAttributes
39
- };
40
- try {
41
- jsAttributes = {
42
- ...jsAttributes,
43
- ...(0, _config.getInfo)(this.agentIdentifier)?.jsAttributes
44
- };
45
- } catch (err) {
46
- // do nothing
47
- }
48
- (0, _configure.configure)(this.agentIdentifier, {
49
- ...(0, _nreum.gosCDN)(),
50
- info: {
51
- ...(0, _nreum.gosCDN)().info,
52
- jsAttributes
53
- }
54
- });
55
- }
56
25
  }
57
26
  }
58
27
  exports.FeatureBase = FeatureBase;
@@ -10,8 +10,6 @@ exports.HandlerCache = void 0;
10
10
  class HandlerCache {
11
11
  /** @private @type {boolean | undefined} */
12
12
  #decision = undefined;
13
- /** @private @type {boolean} */
14
- #shouldsettle = true;
15
13
  /** @private @type {Function[]} */
16
14
  #cache = [];
17
15
  /** @private @type {Timeout} */
@@ -34,7 +32,7 @@ class HandlerCache {
34
32
  * @private
35
33
  */
36
34
  #close() {
37
- this.#shouldsettle = false;
35
+ this.#decision = false; // settle() & decide() cannot be used after close
38
36
  this.#cache = [];
39
37
  }
40
38
 
@@ -44,7 +42,7 @@ class HandlerCache {
44
42
  * @returns {void}
45
43
  */
46
44
  settle(handler) {
47
- if (this.#decision === false || this.#shouldsettle === false) return;else if (this.#decision === undefined) this.#cache.push(handler);else handler();
45
+ if (this.#decision === false) return;else if (this.#decision === undefined) this.#cache.push(handler);else handler();
48
46
  }
49
47
 
50
48
  /**
@@ -56,6 +54,7 @@ class HandlerCache {
56
54
  * @param {boolean} decision
57
55
  */
58
56
  decide(decision) {
57
+ if (this.#decision !== undefined) return; // a decision can only be made once
59
58
  this.#decision = decision;
60
59
  if (decision === false) this.#close();
61
60
  if (decision === true) this.#drain();
@@ -9,6 +9,8 @@ var _featureBase = require("./feature-base");
9
9
  var _load = require("../../common/window/load");
10
10
  var _globalScope = require("../../common/util/global-scope");
11
11
  var _console = require("../../common/util/console");
12
+ var _features = require("../../loaders/features/features");
13
+ var _config = require("../../common/config/config");
12
14
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
15
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /**
14
16
  * @file Defines `InstrumentBase` to be used as the super of the Instrument classes implemented by each feature.
@@ -43,10 +45,18 @@ class InstrumentBase extends _featureBase.FeatureBase {
43
45
  /**
44
46
  * Lazy-load the latter part of the feature: its aggregator. This method is called by the first part of the feature
45
47
  * (the instrumentation) when instrumentation is complete.
48
+ * @param {Object} [argsObjFromInstrument] - any values or references to pass down to aggregate
49
+ * @returns void
46
50
  */
47
- importAggregator() {
51
+ importAggregator(argsObjFromInstrument) {
48
52
  if (this.hasAggregator || !this.auto) return;
49
53
  this.hasAggregator = true;
54
+ let session, agentSessionImport;
55
+ if ((0, _config.getConfigurationValue)(this.agentIdentifier, 'privacy.cookies_enabled') === true && !_globalScope.isWorkerScope) {
56
+ agentSessionImport = Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "session-manager" */'./agent-session'))).catch(err => {
57
+ (0, _console.warn)('failed to import the session manager', err);
58
+ });
59
+ }
50
60
  const importLater = async () => {
51
61
  /**
52
62
  * Note this try-catch differs from the one in Agent.start() in that it's placed later in a page's lifecycle and
@@ -54,18 +64,25 @@ class InstrumentBase extends _featureBase.FeatureBase {
54
64
  */
55
65
  try {
56
66
  // The session entity needs to be attached to the config internals before the aggregator chunk runs
57
- const {
58
- setupAgentSession
59
- } = await Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "session-manager" */'./agent-session')));
60
- setupAgentSession(this.agentIdentifier);
67
+ if (agentSessionImport && !session) {
68
+ const {
69
+ setupAgentSession
70
+ } = await agentSessionImport;
71
+ session = setupAgentSession(this.agentIdentifier);
72
+ }
73
+ if (!shouldImportAgg(this.featureName, session)) {
74
+ (0, _drain.drain)(this.agentIdentifier, this.featureName);
75
+ return;
76
+ }
77
+
61
78
  // import and instantiate the aggregator chunk
62
79
  const {
63
- lazyLoader
64
- } = await Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-loader" */'./lazy-loader')));
80
+ lazyFeatureLoader
81
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-feature-loader" */'./lazy-feature-loader')));
65
82
  const {
66
83
  Aggregate
67
- } = await lazyLoader(this.featureName, 'aggregate');
68
- new Aggregate(this.agentIdentifier, this.aggregator);
84
+ } = await lazyFeatureLoader(this.featureName, 'aggregate');
85
+ new Aggregate(this.agentIdentifier, this.aggregator, argsObjFromInstrument);
69
86
  } catch (e) {
70
87
  (0, _console.warn)("Downloading ".concat(this.featureName, " failed..."), e);
71
88
  this.abortHandler?.(); // undo any important alterations made to the page
@@ -78,4 +95,19 @@ class InstrumentBase extends _featureBase.FeatureBase {
78
95
  if (_globalScope.isWorkerScope) importLater();else (0, _load.onWindowLoad)(() => importLater(), true);
79
96
  }
80
97
  }
81
- exports.InstrumentBase = InstrumentBase;
98
+ /**
99
+ * Make a determination if an aggregate class should even be imported
100
+ * @param {string} featureName
101
+ * @param {SessionEntity} session
102
+ * @returns
103
+ */
104
+ exports.InstrumentBase = InstrumentBase;
105
+ function shouldImportAgg(featureName, session) {
106
+ // if this isnt the FIRST load of a session AND
107
+ // we are not actively recording SR... DO NOT run the aggregator
108
+ // session replay samples can only be decided on the first load of a session
109
+ // session replays can continue if in progress
110
+ if (featureName === _features.FEATURE_NAMES.sessionReplay) return !!session?.isNew || !!session?.state.sessionReplayActive;
111
+ // todo -- add case like above for session trace
112
+ return true;
113
+ }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.lazyLoader = lazyLoader;
6
+ exports.lazyFeatureLoader = lazyFeatureLoader;
7
7
  var _features = require("../../loaders/features/features");
8
8
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
9
9
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -18,7 +18,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
18
18
  * @param featurePart Name of the feature part to load; should be either instrument or aggregate
19
19
  * @returns {Promise<InstrumentBase|FeatureBase|null>}
20
20
  */
21
- function lazyLoader(featureName, featurePart) {
21
+ function lazyFeatureLoader(featureName, featurePart) {
22
22
  if (featurePart === 'aggregate') {
23
23
  switch (featureName) {
24
24
  case _features.FEATURE_NAMES.ajax:
@@ -33,6 +33,8 @@ function lazyLoader(featureName, featurePart) {
33
33
  return Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "page_view_event-aggregate" */'../page_view_event/aggregate')));
34
34
  case _features.FEATURE_NAMES.pageViewTiming:
35
35
  return Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "page_view_timing-aggregate" */'../page_view_timing/aggregate')));
36
+ case _features.FEATURE_NAMES.sessionReplay:
37
+ return Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "session_replay-aggregate" */'../session_replay/aggregate')));
36
38
  case _features.FEATURE_NAMES.sessionTrace:
37
39
  return Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "session_trace-aggregate" */'../session_trace/aggregate')));
38
40
  case _features.FEATURE_NAMES.spa:
@@ -55,7 +55,7 @@ class Agent {
55
55
  // Attempt to initialize all the requested features (sequentially in prio order & synchronously), with any failure aborting the whole process.
56
56
  try {
57
57
  const enabledFeatures = (0, _enabledFeatures.getEnabledFeatures)(this.agentIdentifier);
58
- const featuresToStart = Array.from(this.desiredFeatures);
58
+ const featuresToStart = [...this.desiredFeatures];
59
59
  featuresToStart.sort((a, b) => _features.featurePriority[a.featureName] - _features.featurePriority[b.featureName]);
60
60
  featuresToStart.forEach(f => {
61
61
  // pageViewEvent must be enabled because RUM calls are not optional. See comment in constructor and PR 428.
@@ -82,7 +82,9 @@ function setAPI(agentIdentifier) {
82
82
  url += 'dc=' + ~~dom_time + '&';
83
83
  url += 'fe=' + ~~fe_time + '&';
84
84
  url += 'c=' + cycle;
85
- _submitData.submitData.img(url);
85
+ _submitData.submitData.img({
86
+ url
87
+ });
86
88
  }
87
89
  function setErrorHandler(t, handler) {
88
90
  (0, _config.getRuntime)(agentIdentifier).onerror = handler;
@@ -28,15 +28,15 @@ function configure(agentIdentifier) {
28
28
  info = nr.info;
29
29
  loader_config = nr.loader_config;
30
30
  }
31
+ (0, _config.setConfiguration)(agentIdentifier, init || {});
32
+ (0, _config.setLoaderConfig)(agentIdentifier, loader_config || {});
33
+ (0, _config.setRuntime)(agentIdentifier, runtime);
31
34
  info.jsAttributes ??= {};
32
35
  if (_globalScope.isWorkerScope) {
33
36
  // add a default attr to all worker payloads
34
37
  info.jsAttributes.isWorker = true;
35
38
  }
36
39
  (0, _config.setInfo)(agentIdentifier, info);
37
- (0, _config.setConfiguration)(agentIdentifier, init || {});
38
- (0, _config.setLoaderConfig)(agentIdentifier, loader_config || {});
39
- (0, _config.setRuntime)(agentIdentifier, runtime);
40
40
  (0, _api.setTopLevelCallers)();
41
41
  const api = (0, _api.setAPI)(agentIdentifier, forceDrain);
42
42
  (0, _nreum.gosNREUMInitializedAgents)(agentIdentifier, api, 'api');
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getFeatureDependencyNames = getFeatureDependencyNames;
7
- exports.getFrozenAttributes = getFrozenAttributes;
8
7
  var _features = require("./features");
9
8
  function getFeatureDependencyNames(feature) {
10
9
  switch (feature) {
@@ -18,15 +17,4 @@ function getFeatureDependencyNames(feature) {
18
17
  default:
19
18
  return [];
20
19
  }
21
- }
22
- function getFrozenAttributes(feature) {
23
- switch (feature) {
24
- // right now, jserrors is the only feature that can have "on" or "off" page-level auto-instrumentation...
25
- // page_action is always "off" (no instr)
26
- // as new API/manual implementation methods are added, this list can likely be pruned
27
- case _features.FEATURE_NAMES.jserrors:
28
- return [];
29
- default:
30
- return ['auto'];
31
- }
32
20
  }
@@ -11,6 +11,7 @@ const FEATURE_NAMES = {
11
11
  pageAction: 'page_action',
12
12
  pageViewEvent: 'page_view_event',
13
13
  pageViewTiming: 'page_view_timing',
14
+ sessionReplay: 'session_replay',
14
15
  sessionTrace: 'session_trace',
15
16
  spa: 'spa'
16
17
  };
@@ -28,6 +29,7 @@ const featurePriority = {
28
29
  [FEATURE_NAMES.ajax]: 5,
29
30
  [FEATURE_NAMES.sessionTrace]: 6,
30
31
  [FEATURE_NAMES.pageAction]: 7,
31
- [FEATURE_NAMES.spa]: 8
32
+ [FEATURE_NAMES.spa]: 8,
33
+ [FEATURE_NAMES.sessionReplay]: 9
32
34
  };
33
35
  exports.featurePriority = featurePriority;
@@ -58,11 +58,11 @@ class MicroAgent {
58
58
  autoFeatures.forEach(f => {
59
59
  if (enabledFeatures[f]) {
60
60
  // TODO - THIS does not work, the instrument switch in lazy loader increases the size of the worker build. Needs to be revisited
61
- Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-loader" */'../features/utils/lazy-loader'))).then(_ref => {
61
+ Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-feature-loader" */'../features/utils/lazy-feature-loader'))).then(_ref => {
62
62
  let {
63
- lazyLoader
63
+ lazyFeatureLoader
64
64
  } = _ref;
65
- return lazyLoader(f, 'instrument');
65
+ return lazyFeatureLoader(f, 'instrument');
66
66
  }).then(_ref2 => {
67
67
  let {
68
68
  Instrument
@@ -75,11 +75,11 @@ class MicroAgent {
75
75
  if (enabledFeatures[f]) {
76
76
  // TODO - THIS does not work, the instrument switch in lazy loader increases the size of the worker build. Needs to be revisited
77
77
  // Parts of the lazy-loader were removed because webpack was transpiling them into the worker build, errantly inflating the build size.
78
- Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-loader" */'../features/utils/lazy-loader'))).then(_ref3 => {
78
+ Promise.resolve().then(() => _interopRequireWildcard(require( /* webpackChunkName: "lazy-feature-loader" */'../features/utils/lazy-feature-loader'))).then(_ref3 => {
79
79
  let {
80
- lazyLoader
80
+ lazyFeatureLoader
81
81
  } = _ref3;
82
- return lazyLoader(f, 'aggregate');
82
+ return lazyFeatureLoader(f, 'aggregate');
83
83
  }).then(_ref4 => {
84
84
  let {
85
85
  Aggregate
@@ -5,8 +5,10 @@
5
5
 
6
6
  import 'core-js/stable/promise';
7
7
  import 'core-js/stable/array/includes';
8
- import 'core-js/stable/array/from';
9
8
  import 'core-js/stable/array/find';
9
+ import 'core-js/stable/array/flat';
10
+ import 'core-js/stable/array/flat-map';
11
+ import 'core-js/stable/array/from';
10
12
  import 'core-js/stable/array/some';
11
13
  import 'core-js/stable/object/assign';
12
14
  import 'core-js/stable/object/entries';
@@ -14,4 +16,5 @@ import 'core-js/stable/object/values';
14
16
  import 'core-js/stable/map';
15
17
  import 'core-js/stable/reflect';
16
18
  import 'core-js/stable/set';
17
- import 'core-js/stable/weak-set';
19
+ import 'core-js/stable/weak-set';
20
+ import 'core-js/stable/object/get-own-property-descriptors';
@@ -1,31 +1,21 @@
1
- import { getFrozenAttributes } from '../../../loaders/features/featureDependencies';
2
1
  import { warn } from '../../util/console';
3
- export class Configurable {
4
- constructor(obj, model) {
5
- Object.assign(this, setValues(obj, model));
6
- }
7
- }
8
- function setValues(obj, model) {
9
- const state = {};
2
+ export function getModeledObject(obj, model) {
10
3
  try {
11
- if (!obj || typeof obj !== 'object') return warn('New setting a Configurable requires an object as input');
4
+ if (!obj || typeof obj !== 'object') return warn('Setting a Configurable requires an object as input');
12
5
  if (!model || typeof model !== 'object') return warn('Setting a Configurable requires a model to set its initial properties');
13
- Object.assign(state, model);
14
- Object.entries(obj).forEach(_ref => {
15
- let [key, value] = _ref;
16
- if (!Object.keys(model).includes(key)) return;
17
- const frozenAttrs = getFrozenAttributes(key);
18
- if (frozenAttrs.length && value && typeof value === 'object') {
19
- frozenAttrs.forEach(attr => {
20
- if (attr in value) {
21
- warn("\"".concat(attr, "\" is a protected attribute and can not be changed in feature ").concat(key, ". It will have no effect."));
22
- delete value[attr];
23
- }
24
- });
6
+ // allow getters and setters to pass from model to target
7
+ const output = Object.create(Object.getPrototypeOf(model), Object.getOwnPropertyDescriptors(model));
8
+ const target = Object.keys(output).length === 0 ? obj : output;
9
+ for (let key in target) {
10
+ if (obj[key] !== undefined) {
11
+ try {
12
+ if (typeof obj[key] === 'object' && typeof model[key] === 'object') output[key] = getModeledObject(obj[key], model[key]);else output[key] = obj[key];
13
+ } catch (e) {
14
+ warn('An error occurred while setting a property of a Configurable', e);
15
+ }
25
16
  }
26
- state[key] = value;
27
- });
28
- return state;
17
+ }
18
+ return output;
29
19
  } catch (err) {
30
20
  warn('An error occured while setting a Configurable', err);
31
21
  }
@@ -1,5 +1,5 @@
1
1
  import { defaults as nrDefaults, gosNREUMInitializedAgents } from '../../window/nreum';
2
- import { Configurable } from './configurable';
2
+ import { getModeledObject } from './configurable';
3
3
  const model = {
4
4
  // preset defaults
5
5
  beacon: nrDefaults.beacon,
@@ -37,6 +37,6 @@ export function getInfo(id) {
37
37
  }
38
38
  export function setInfo(id, obj) {
39
39
  if (!id) throw new Error('All info objects require an agent identifier!');
40
- _cache[id] = new Configurable(obj, model);
40
+ _cache[id] = getModeledObject(obj, model);
41
41
  gosNREUMInitializedAgents(id, _cache[id], 'info');
42
42
  }