@newrelic/browser-agent 1.232.0 → 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 (273) 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/canonicalize-url.js +32 -0
  16. package/dist/cjs/common/url/canonicalize-url.test.js +42 -0
  17. package/dist/cjs/common/url/clean-url.js +10 -3
  18. package/dist/cjs/common/url/protocol.test.js +0 -1
  19. package/dist/cjs/common/util/feature-flags.js +2 -1
  20. package/dist/cjs/common/util/global-scope.js +4 -2
  21. package/dist/cjs/common/util/submit-data.js +57 -18
  22. package/dist/cjs/common/wrap/wrap-fetch.js +1 -3
  23. package/dist/cjs/common/wrap/wrap-function.js +1 -3
  24. package/dist/cjs/common/wrap/wrap-promise.js +1 -1
  25. package/dist/cjs/features/ajax/aggregate/index.js +2 -2
  26. package/dist/cjs/features/ajax/instrument/index.js +1 -1
  27. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.js +12 -4
  28. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +93 -10
  29. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.test.js +164 -38
  30. package/dist/cjs/features/jserrors/aggregate/index.js +29 -48
  31. package/dist/cjs/features/jserrors/instrument/index.js +0 -2
  32. package/dist/cjs/features/metrics/aggregate/framework-detection.js +67 -0
  33. package/dist/cjs/features/metrics/aggregate/framework-detection.test.js +137 -0
  34. package/dist/cjs/features/metrics/aggregate/index.js +7 -3
  35. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.js +14 -0
  36. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.test.js +17 -0
  37. package/dist/cjs/features/metrics/aggregate/polyfill-detection.js +53 -0
  38. package/dist/cjs/features/metrics/aggregate/polyfill-detection.test.js +165 -0
  39. package/dist/cjs/features/page_action/aggregate/index.js +2 -2
  40. package/dist/cjs/features/page_view_event/aggregate/index.js +6 -3
  41. package/dist/cjs/features/page_view_timing/aggregate/index.js +2 -2
  42. package/dist/cjs/features/session_replay/aggregate/index.js +333 -0
  43. package/dist/cjs/features/session_replay/constants.js +9 -0
  44. package/dist/cjs/features/session_replay/index.js +12 -0
  45. package/dist/cjs/features/session_replay/instrument/index.js +29 -0
  46. package/dist/cjs/features/session_trace/aggregate/index.js +163 -164
  47. package/dist/cjs/features/session_trace/constants.js +2 -9
  48. package/dist/cjs/features/session_trace/instrument/index.js +24 -66
  49. package/dist/cjs/features/spa/aggregate/index.js +2 -2
  50. package/dist/cjs/features/utils/agent-session.js +1 -2
  51. package/dist/cjs/features/utils/aggregate-base.js +64 -0
  52. package/dist/cjs/features/utils/feature-base.js +0 -31
  53. package/dist/cjs/features/utils/handler-cache.js +3 -4
  54. package/dist/cjs/features/utils/instrument-base.js +42 -10
  55. package/dist/cjs/features/utils/{lazy-loader.js → lazy-feature-loader.js} +4 -2
  56. package/dist/cjs/loaders/agent.js +1 -1
  57. package/dist/cjs/loaders/api/apiAsync.js +3 -1
  58. package/dist/cjs/loaders/configure/configure.js +3 -3
  59. package/dist/cjs/loaders/features/featureDependencies.js +0 -12
  60. package/dist/cjs/loaders/features/features.js +3 -1
  61. package/dist/cjs/loaders/micro-agent.js +6 -6
  62. package/dist/esm/cdn/polyfills.js +5 -2
  63. package/dist/esm/common/config/state/configurable.js +14 -24
  64. package/dist/esm/common/config/state/info.js +2 -2
  65. package/dist/esm/common/config/state/init.js +102 -57
  66. package/dist/esm/common/config/state/loader-config.js +2 -2
  67. package/dist/esm/common/config/state/runtime.js +2 -4
  68. package/dist/esm/common/constants/env.cdn.js +1 -1
  69. package/dist/esm/common/constants/env.npm.js +1 -1
  70. package/dist/esm/common/drain/drain.js +1 -1
  71. package/dist/esm/common/harvest/harvest-scheduler.js +30 -10
  72. package/dist/esm/common/harvest/harvest.js +121 -56
  73. package/dist/esm/common/session/session-entity.js +35 -22
  74. package/dist/esm/common/session/session-entity.test.js +73 -49
  75. package/dist/esm/common/timer/interaction-timer.js +9 -12
  76. package/dist/esm/common/url/canonicalize-url.js +27 -0
  77. package/dist/esm/common/url/canonicalize-url.test.js +38 -0
  78. package/dist/esm/common/url/clean-url.js +10 -3
  79. package/dist/esm/common/url/protocol.test.js +0 -1
  80. package/dist/esm/common/util/feature-flags.js +2 -1
  81. package/dist/esm/common/util/global-scope.js +1 -0
  82. package/dist/esm/common/util/submit-data.js +57 -18
  83. package/dist/esm/common/wrap/wrap-fetch.js +1 -2
  84. package/dist/esm/common/wrap/wrap-function.js +1 -2
  85. package/dist/esm/common/wrap/wrap-promise.js +1 -1
  86. package/dist/esm/features/ajax/aggregate/index.js +2 -2
  87. package/dist/esm/features/ajax/instrument/index.js +1 -1
  88. package/dist/esm/features/jserrors/aggregate/canonical-function-name.js +12 -4
  89. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +93 -10
  90. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.test.js +149 -25
  91. package/dist/esm/features/jserrors/aggregate/index.js +30 -48
  92. package/dist/esm/features/jserrors/instrument/index.js +0 -1
  93. package/dist/esm/features/metrics/aggregate/framework-detection.js +61 -0
  94. package/dist/esm/features/metrics/aggregate/framework-detection.test.js +133 -0
  95. package/dist/esm/features/metrics/aggregate/index.js +7 -3
  96. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.js +8 -0
  97. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.test.js +15 -0
  98. package/dist/esm/features/metrics/aggregate/polyfill-detection.js +47 -0
  99. package/dist/esm/features/metrics/aggregate/polyfill-detection.test.js +163 -0
  100. package/dist/esm/features/page_action/aggregate/index.js +2 -2
  101. package/dist/esm/features/page_view_event/aggregate/index.js +6 -3
  102. package/dist/esm/features/page_view_timing/aggregate/index.js +2 -2
  103. package/dist/esm/features/session_replay/aggregate/index.js +327 -0
  104. package/dist/esm/features/session_replay/constants.js +2 -0
  105. package/dist/esm/features/session_replay/index.js +12 -0
  106. package/dist/esm/features/session_replay/instrument/index.js +21 -0
  107. package/dist/esm/features/session_trace/aggregate/index.js +163 -163
  108. package/dist/esm/features/session_trace/constants.js +1 -5
  109. package/dist/esm/features/session_trace/instrument/index.js +24 -66
  110. package/dist/esm/features/spa/aggregate/index.js +2 -2
  111. package/dist/esm/features/utils/agent-session.js +1 -2
  112. package/dist/esm/features/utils/aggregate-base.js +57 -0
  113. package/dist/esm/features/utils/feature-base.js +1 -32
  114. package/dist/esm/features/utils/handler-cache.js +3 -4
  115. package/dist/esm/features/utils/instrument-base.js +42 -10
  116. package/dist/esm/features/utils/{lazy-loader.js → lazy-feature-loader.js} +3 -1
  117. package/dist/esm/loaders/agent.js +1 -1
  118. package/dist/esm/loaders/api/apiAsync.js +3 -1
  119. package/dist/esm/loaders/configure/configure.js +3 -3
  120. package/dist/esm/loaders/features/featureDependencies.js +0 -11
  121. package/dist/esm/loaders/features/features.js +3 -1
  122. package/dist/esm/loaders/micro-agent.js +6 -6
  123. package/dist/types/common/config/state/configurable.d.ts +1 -3
  124. package/dist/types/common/config/state/configurable.d.ts.map +1 -1
  125. package/dist/types/common/config/state/init.d.ts.map +1 -1
  126. package/dist/types/common/config/state/runtime.d.ts.map +1 -1
  127. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
  128. package/dist/types/common/harvest/harvest.d.ts +37 -34
  129. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  130. package/dist/types/common/session/session-entity.d.ts +6 -3
  131. package/dist/types/common/session/session-entity.d.ts.map +1 -1
  132. package/dist/types/common/timer/interaction-timer.d.ts +2 -1
  133. package/dist/types/common/timer/interaction-timer.d.ts.map +1 -1
  134. package/dist/types/common/url/canonicalize-url.d.ts +9 -0
  135. package/dist/types/common/url/canonicalize-url.d.ts.map +1 -0
  136. package/dist/types/common/url/clean-url.d.ts +7 -1
  137. package/dist/types/common/url/clean-url.d.ts.map +1 -1
  138. package/dist/types/common/util/feature-flags.d.ts.map +1 -1
  139. package/dist/types/common/util/global-scope.d.ts +1 -0
  140. package/dist/types/common/util/global-scope.d.ts.map +1 -1
  141. package/dist/types/common/util/submit-data.d.ts +40 -14
  142. package/dist/types/common/util/submit-data.d.ts.map +1 -1
  143. package/dist/types/common/wrap/wrap-fetch.d.ts.map +1 -1
  144. package/dist/types/common/wrap/wrap-function.d.ts.map +1 -1
  145. package/dist/types/features/ajax/aggregate/index.d.ts +2 -2
  146. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
  147. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts +8 -1
  148. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts.map +1 -1
  149. package/dist/types/features/jserrors/aggregate/compute-stack-trace.d.ts +48 -19
  150. package/dist/types/features/jserrors/aggregate/compute-stack-trace.d.ts.map +1 -1
  151. package/dist/types/features/jserrors/aggregate/index.d.ts +14 -5
  152. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  153. package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -1
  154. package/dist/types/features/metrics/aggregate/framework-detection.d.ts.map +1 -0
  155. package/dist/types/features/metrics/aggregate/index.d.ts +2 -2
  156. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
  157. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts +6 -0
  158. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts.map +1 -0
  159. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts +7 -0
  160. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts.map +1 -0
  161. package/dist/types/features/page_action/aggregate/index.d.ts +3 -3
  162. package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
  163. package/dist/types/features/page_view_event/aggregate/index.d.ts +2 -2
  164. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  165. package/dist/types/features/page_view_timing/aggregate/index.d.ts +2 -2
  166. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  167. package/dist/types/features/session_replay/aggregate/index.d.ts +96 -0
  168. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -0
  169. package/dist/types/features/session_replay/constants.d.ts +2 -0
  170. package/dist/types/features/session_replay/constants.d.ts.map +1 -0
  171. package/dist/types/features/session_replay/index.d.ts +2 -0
  172. package/dist/types/features/session_replay/index.d.ts.map +1 -0
  173. package/dist/types/features/session_replay/instrument/index.d.ts +6 -0
  174. package/dist/types/features/session_replay/instrument/index.d.ts.map +1 -0
  175. package/dist/types/features/session_trace/aggregate/index.d.ts +8 -57
  176. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  177. package/dist/types/features/session_trace/constants.d.ts +0 -3
  178. package/dist/types/features/session_trace/constants.d.ts.map +1 -1
  179. package/dist/types/features/session_trace/instrument/index.d.ts +1 -3
  180. package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
  181. package/dist/types/features/spa/aggregate/index.d.ts +2 -2
  182. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
  183. package/dist/types/features/utils/agent-session.d.ts.map +1 -1
  184. package/dist/types/features/utils/aggregate-base.d.ts +11 -0
  185. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -0
  186. package/dist/types/features/utils/feature-base.d.ts +0 -5
  187. package/dist/types/features/utils/feature-base.d.ts.map +1 -1
  188. package/dist/types/features/utils/handler-cache.d.ts.map +1 -1
  189. package/dist/types/features/utils/instrument-base.d.ts +3 -1
  190. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  191. package/dist/types/features/utils/{lazy-loader.d.ts → lazy-feature-loader.d.ts} +2 -2
  192. package/dist/types/features/utils/lazy-feature-loader.d.ts.map +1 -0
  193. package/dist/types/loaders/configure/configure.d.ts.map +1 -1
  194. package/dist/types/loaders/features/featureDependencies.d.ts +0 -1
  195. package/dist/types/loaders/features/featureDependencies.d.ts.map +1 -1
  196. package/dist/types/loaders/features/features.d.ts +1 -0
  197. package/dist/types/loaders/features/features.d.ts.map +1 -1
  198. package/package.json +31 -22
  199. package/src/cdn/polyfills.js +4 -1
  200. package/src/common/config/state/configurable.js +18 -24
  201. package/src/common/config/state/info.js +2 -2
  202. package/src/common/config/state/init.js +62 -28
  203. package/src/common/config/state/loader-config.js +2 -2
  204. package/src/common/config/state/runtime.js +2 -4
  205. package/src/common/drain/drain.js +1 -1
  206. package/src/common/harvest/harvest-scheduler.js +35 -10
  207. package/src/common/harvest/harvest.js +73 -50
  208. package/src/common/session/session-entity.js +34 -23
  209. package/src/common/session/session-entity.test.js +57 -51
  210. package/src/common/timer/interaction-timer.js +9 -12
  211. package/src/common/url/canonicalize-url.js +28 -0
  212. package/src/common/url/canonicalize-url.test.js +34 -0
  213. package/src/common/url/clean-url.js +10 -3
  214. package/src/common/url/protocol.test.js +0 -1
  215. package/src/common/util/feature-flags.js +2 -2
  216. package/src/common/util/global-scope.js +2 -0
  217. package/src/common/util/submit-data.js +28 -17
  218. package/src/common/wrap/wrap-fetch.js +1 -2
  219. package/src/common/wrap/wrap-function.js +1 -2
  220. package/src/common/wrap/wrap-promise.js +1 -1
  221. package/src/features/ajax/aggregate/index.js +2 -2
  222. package/src/features/ajax/instrument/index.js +1 -1
  223. package/src/features/jserrors/aggregate/canonical-function-name.js +12 -4
  224. package/src/features/jserrors/aggregate/compute-stack-trace.js +85 -11
  225. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +141 -24
  226. package/src/features/jserrors/aggregate/index.js +28 -52
  227. package/src/features/jserrors/instrument/index.js +0 -1
  228. package/src/features/metrics/aggregate/framework-detection.js +73 -0
  229. package/src/features/metrics/aggregate/framework-detection.test.js +201 -0
  230. package/src/features/metrics/aggregate/index.js +8 -3
  231. package/src/features/metrics/aggregate/polyfill-detection.es5.js +9 -0
  232. package/src/features/metrics/aggregate/polyfill-detection.es5.test.js +16 -0
  233. package/src/features/metrics/aggregate/polyfill-detection.js +48 -0
  234. package/src/features/metrics/aggregate/polyfill-detection.test.js +163 -0
  235. package/src/features/page_action/aggregate/index.js +2 -2
  236. package/src/features/page_view_event/aggregate/index.js +5 -5
  237. package/src/features/page_view_timing/aggregate/index.js +2 -2
  238. package/src/features/session_replay/aggregate/index.js +314 -0
  239. package/src/features/session_replay/constants.js +3 -0
  240. package/src/features/session_replay/index.js +12 -0
  241. package/src/features/session_replay/instrument/index.js +22 -0
  242. package/src/features/session_trace/aggregate/index.js +148 -188
  243. package/src/features/session_trace/constants.js +0 -4
  244. package/src/features/session_trace/instrument/index.js +17 -69
  245. package/src/features/spa/aggregate/index.js +2 -2
  246. package/src/features/utils/agent-session.js +1 -2
  247. package/src/features/utils/aggregate-base.js +51 -0
  248. package/src/features/utils/feature-base.js +1 -31
  249. package/src/features/utils/handler-cache.js +3 -4
  250. package/src/features/utils/instrument-base.js +40 -8
  251. package/src/features/utils/{lazy-loader.js → lazy-feature-loader.js} +3 -1
  252. package/src/loaders/agent.js +1 -1
  253. package/src/loaders/api/apiAsync.js +1 -1
  254. package/src/loaders/configure/configure.js +4 -3
  255. package/src/loaders/features/featureDependencies.js +0 -12
  256. package/src/loaders/features/features.js +3 -1
  257. package/src/loaders/micro-agent.js +4 -4
  258. package/dist/cjs/common/metrics/framework-detection.js +0 -72
  259. package/dist/cjs/common/util/user-agent.js +0 -57
  260. package/dist/cjs/common/window/supports-performance-observer.js +0 -15
  261. package/dist/esm/common/metrics/framework-detection.js +0 -66
  262. package/dist/esm/common/util/user-agent.js +0 -48
  263. package/dist/esm/common/window/supports-performance-observer.js +0 -9
  264. package/dist/types/common/metrics/framework-detection.d.ts.map +0 -1
  265. package/dist/types/common/util/user-agent.d.ts +0 -5
  266. package/dist/types/common/util/user-agent.d.ts.map +0 -1
  267. package/dist/types/common/window/supports-performance-observer.d.ts +0 -2
  268. package/dist/types/common/window/supports-performance-observer.d.ts.map +0 -1
  269. package/dist/types/features/utils/lazy-loader.d.ts.map +0 -1
  270. package/src/common/metrics/framework-detection.js +0 -71
  271. package/src/common/util/user-agent.js +0 -56
  272. package/src/common/window/supports-performance-observer.js +0 -10
  273. /package/dist/types/{common/metrics → features/metrics/aggregate}/framework-detection.d.ts +0 -0
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getGlobalScope = getGlobalScope;
7
- exports.isWorkerScope = exports.isBrowserScope = exports.globalScope = void 0;
7
+ exports.isWorkerScope = exports.isBrowserScope = exports.initialLocation = exports.globalScope = void 0;
8
8
  exports.resetScope = resetScope;
9
9
  exports.setScope = setScope;
10
10
  /* global globalThis, WorkerGlobalScope, WorkerNavigator */
@@ -25,6 +25,8 @@ let globalScope = (() => {
25
25
  }
26
26
  throw new Error('New Relic browser agent shutting down due to error: Unable to locate global scope. This is possibly due to code redefining browser global variables like "self" and "window".');
27
27
  })();
28
+ exports.globalScope = globalScope;
29
+ const initialLocation = '' + globalScope.location;
28
30
 
29
31
  /**
30
32
  * The below methods are only used for testing and should be removed once the
@@ -32,7 +34,7 @@ let globalScope = (() => {
32
34
  * tests/browser/protocol.browser.js
33
35
  * tests/browser/obfuscate.browser.js
34
36
  */
35
- exports.globalScope = globalScope;
37
+ exports.initialLocation = initialLocation;
36
38
  function setScope(obj) {
37
39
  exports.globalScope = globalScope = {
38
40
  ...obj
@@ -14,12 +14,18 @@ const submitData = {};
14
14
 
15
15
  /**
16
16
  * Send via JSONP. Do NOT call this function outside of a guaranteed web window environment.
17
- * @param {string} url
18
- * @param {string} jsonp
17
+ * @param {Object} args - The args
18
+ * @param {string} args.url - The URL to send to
19
+ * @param {string} args.jsonp - The string name of the jsonp cb method
20
+ * @returns {XMLHttpRequest}
19
21
  * @returns {Element}
20
22
  */
21
23
  exports.submitData = submitData;
22
- submitData.jsonp = function jsonp(url, jsonp) {
24
+ submitData.jsonp = function jsonp(_ref) {
25
+ let {
26
+ url,
27
+ jsonp
28
+ } = _ref;
23
29
  try {
24
30
  if (_globalScope.isWorkerScope) {
25
31
  try {
@@ -27,7 +33,9 @@ submitData.jsonp = function jsonp(url, jsonp) {
27
33
  } catch (e) {
28
34
  // for now theres no other way to execute the callback from ingest without jsonp, or unsafe eval / new Function calls
29
35
  // future work needs to be conducted to allow ingest to return a more traditional JSON API-like experience for the entitlement flags
30
- submitData.xhrGet(url + '&jsonp=' + jsonp);
36
+ submitData.xhrGet({
37
+ url: url + '&jsonp=' + jsonp
38
+ });
31
39
  return false;
32
40
  }
33
41
  } else {
@@ -42,19 +50,38 @@ submitData.jsonp = function jsonp(url, jsonp) {
42
50
  // do nothing
43
51
  }
44
52
  };
45
- submitData.xhrGet = function xhrGet(url) {
46
- return submitData.xhr(url, undefined, false, 'GET');
53
+ submitData.xhrGet = function xhrGet(_ref2) {
54
+ let {
55
+ url
56
+ } = _ref2;
57
+ return submitData.xhr({
58
+ url,
59
+ sync: false,
60
+ method: 'GET'
61
+ });
47
62
  };
48
63
 
49
64
  /**
50
65
  * Send via XHR
51
- * @param {string} url
52
- * @param {string} body
53
- * @param {boolean} sync
66
+ * @param {Object} args - The args
67
+ * @param {string} args.url - The URL to send to
68
+ * @param {string=} args.body - The Stringified body
69
+ * @param {boolean=} args.sync - Run XHR as Synchronous
70
+ * @param {string=} [args.method=POST] - The XHR method to use
71
+ * @param {{key: string, value: string}[]} [args.headers] - The headers to attach
54
72
  * @returns {XMLHttpRequest}
55
73
  */
56
- submitData.xhr = function xhr(url, body, sync) {
57
- let method = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'POST';
74
+ submitData.xhr = function xhr(_ref3) {
75
+ let {
76
+ url,
77
+ body,
78
+ sync,
79
+ method = 'POST',
80
+ headers = [{
81
+ key: 'content-type',
82
+ value: 'text/plain'
83
+ }]
84
+ } = _ref3;
58
85
  var request = new XMLHttpRequest();
59
86
  request.open(method, url, !sync);
60
87
  try {
@@ -63,7 +90,9 @@ submitData.xhr = function xhr(url, body, sync) {
63
90
  } catch (e) {
64
91
  // do nothing
65
92
  }
66
- request.setRequestHeader('content-type', 'text/plain');
93
+ headers.forEach(header => {
94
+ request.setRequestHeader(header.key, header.value);
95
+ });
67
96
  request.send(body);
68
97
  return request;
69
98
  };
@@ -77,10 +106,15 @@ submitData.xhr = function xhr(url, body, sync) {
77
106
 
78
107
  /**
79
108
  * Send by appending an <img> element to the page. Do NOT call this function outside of a guaranteed web window environment.
80
- * @param {string} url
81
- * @returns {Element}
109
+ * @param {Object} args - The args
110
+ * @param {string} args.url - The URL to send to
111
+ * @returns {HTMLImageElement}
82
112
  */
83
- submitData.img = function img(url) {
113
+ submitData.img = function img(_ref4) {
114
+ let {
115
+ url
116
+ } = _ref4;
117
+ console.log('img url', url);
84
118
  var element = new Image();
85
119
  element.src = url;
86
120
  return element;
@@ -88,11 +122,16 @@ submitData.img = function img(url) {
88
122
 
89
123
  /**
90
124
  * Send via sendBeacon. Do NOT call this function outside of a guaranteed web window environment.
91
- * @param {string} url
92
- * @param {string} body
125
+ * @param {Object} args - The args
126
+ * @param {string} args.url - The URL to send to
127
+ * @param {string=} args.body - The Stringified body
93
128
  * @returns {boolean}
94
129
  */
95
- submitData.beacon = function (url, body) {
130
+ submitData.beacon = function (_ref5) {
131
+ let {
132
+ url,
133
+ body
134
+ } = _ref5;
96
135
  // Navigator has to be bound to ensure it does not error in some browsers
97
136
  // https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch
98
137
  const send = window.navigator.sendBeacon.bind(window.navigator);
@@ -6,10 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.scopedEE = scopedEE;
7
7
  exports.wrapFetch = wrapFetch;
8
8
  var _contextualEe = require("../event-emitter/contextual-ee");
9
- var _lodash = _interopRequireDefault(require("lodash._slice"));
10
9
  var _globalScope = require("../util/global-scope");
11
10
  var _wrapFunction = require("./wrap-function");
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
11
  /*
14
12
  * Copyright 2020 New Relic Corporation. All rights reserved.
15
13
  * SPDX-License-Identifier: Apache-2.0
@@ -77,7 +75,7 @@ function wrapFetch(sharedEE) {
77
75
  var fn = target[name];
78
76
  if (typeof fn === 'function') {
79
77
  target[name] = function () {
80
- var args = (0, _lodash.default)(arguments);
78
+ var args = [...arguments];
81
79
  var ctx = {};
82
80
  // we are wrapping args in an array so we can preserve the reference
83
81
  ee.emit(prefix + 'before-start', [args], ctx);
@@ -8,8 +8,6 @@ exports.flag = exports.default = void 0;
8
8
  exports.wrapFunction = wrapFunction;
9
9
  exports.wrapInPlace = wrapInPlace;
10
10
  var _contextualEe = require("../event-emitter/contextual-ee");
11
- var _lodash = _interopRequireDefault(require("lodash._slice"));
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
11
  /*
14
12
  * Copyright 2020 New Relic Corporation. All rights reserved.
15
13
  * SPDX-License-Identifier: Apache-2.0
@@ -83,7 +81,7 @@ function createWrapperWithEmitter(emitter, always) {
83
81
  var result;
84
82
  try {
85
83
  originalThis = this;
86
- args = (0, _lodash.default)(arguments);
84
+ args = [...arguments];
87
85
  if (typeof getContext === 'function') {
88
86
  ctx = getContext(args, originalThis);
89
87
  } else {
@@ -76,7 +76,7 @@ function wrapPromise(sharedEE) {
76
76
  WrappedPromise[method] = function (subPromises) {
77
77
  // use our own wrapped version of "Promise.all" and ".race" static fns
78
78
  let finalized = false;
79
- Array.from(subPromises || []).forEach(sub => {
79
+ [...(subPromises || [])].forEach(sub => {
80
80
  this.resolve(sub).then(setNrId(method === 'all'), setNrId(false));
81
81
  });
82
82
  const origFnCallWithThis = prevStaticFn.apply(this, arguments);
@@ -15,13 +15,13 @@ var _constants = require("../constants");
15
15
  var _drain = require("../../../common/drain/drain");
16
16
  var _features = require("../../../loaders/features/features");
17
17
  var _constants2 = require("../../metrics/constants");
18
- var _featureBase = require("../../utils/feature-base");
18
+ var _aggregateBase = require("../../utils/aggregate-base");
19
19
  /*
20
20
  * Copyright 2020 New Relic Corporation. All rights reserved.
21
21
  * SPDX-License-Identifier: Apache-2.0
22
22
  */
23
23
 
24
- class Aggregate extends _featureBase.FeatureBase {
24
+ class Aggregate extends _aggregateBase.AggregateBase {
25
25
  static featureName = _constants.FEATURE_NAME;
26
26
  constructor(agentIdentifier, aggregator) {
27
27
  super(agentIdentifier, aggregator, _constants.FEATURE_NAME);
@@ -99,7 +99,7 @@ function subscribeToEvents(agentIdentifier, ee, handler, dt) {
99
99
  }
100
100
  function onOpenXhrEnd(args, xhr) {
101
101
  var loader_config = (0, _config.getLoaderConfig)(agentIdentifier);
102
- if ('xpid' in loader_config && this.sameOrigin) {
102
+ if (loader_config.xpid && this.sameOrigin) {
103
103
  xhr.setRequestHeader('X-NewRelic-ID', loader_config.xpid);
104
104
  }
105
105
  var payload = dt.generateTracePayload(this.parsedOrigin);
@@ -9,10 +9,18 @@ exports.canonicalFunctionName = canonicalFunctionName;
9
9
  * SPDX-License-Identifier: Apache-2.0
10
10
  */
11
11
 
12
- var canonicalFunctionNameRe = /([a-z0-9]+)$/i;
13
- function canonicalFunctionName(orig) {
14
- if (!orig) return;
15
- var match = orig.match(canonicalFunctionNameRe);
12
+ const canonicalFunctionNameRe = /([a-z0-9]+)$/i;
13
+
14
+ /**
15
+ * Given a function name string, extracts only an alphanumeric segment at the end of the string (if one exists).
16
+ * This is useful for stack traces, where functions might not be named (e.g., anonymous, computed).
17
+ *
18
+ * @param {string} functionNameString - The original function name string.
19
+ * @returns {string|undefined} The canonical function name, or undefined if the input is falsy or no alphanumeric segments are found.
20
+ */
21
+ function canonicalFunctionName(functionNameString) {
22
+ if (!functionNameString) return;
23
+ const match = functionNameString.match(canonicalFunctionNameRe);
16
24
  if (match) return match[1];
17
25
  return;
18
26
  }
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.computeStackTrace = computeStackTrace;
7
7
  var _formatStackTrace = require("./format-stack-trace");
8
+ var _canonicalizeUrl = require("../../../common/url/canonicalize-url");
8
9
  /*
9
10
  * Copyright 2020 New Relic Corporation. All rights reserved.
10
11
  * SPDX-License-Identifier: Apache-2.0
@@ -70,6 +71,24 @@ var chrome = /^\s*at (?:((?:\[object object\])?(?:[^(]*\([^)]*\))*[^()]*(?: \[as
70
71
  var gecko = /^\s*(?:(\S*|global code)(?:\(.*?\))?@)?((?:file|http|https|chrome|safari-extension).*?):(\d+)(?::(\d+))?\s*$/i;
71
72
  var chrome_eval = /^\s*at .+ \(eval at \S+ \((?:(?:file|http|https):[^)]+)?\)(?:, [^:]*:\d+:\d+)?\)$/i;
72
73
  var ie_eval = /^\s*at Function code \(Function code:\d+:\d+\)\s*/i;
74
+
75
+ /**
76
+ * Represents an error with a stack trace.
77
+ * @typedef {Object} StackInfo
78
+ * @property {string} name - The name of the error (e.g. 'TypeError').
79
+ * @property {string} message - The error message.
80
+ * @property {string} stackString - The stack trace as a string.
81
+ * @property {Array<Object>} frames - An array of frames in the stack trace.
82
+ * @property {string} frames.url - The URL of the file containing the code for the frame.
83
+ * @property {string} frames.func - The name of the function associated with the frame.
84
+ * @property {number} frames.line - The line number of the code in the frame.
85
+ */
86
+
87
+ /**
88
+ * Attempts to compute a stack trace for the given exception.
89
+ * @param {Error} ex - The exception for which to compute the stack trace.
90
+ * @returns {StackInfo} A stack trace object containing information about the frames on the stack.
91
+ */
73
92
  function computeStackTrace(ex) {
74
93
  var stack = null;
75
94
  try {
@@ -110,9 +129,9 @@ function computeStackTrace(ex) {
110
129
  }
111
130
 
112
131
  /**
113
- * Computes stack trace information from the stack property.
114
- * Chrome and Gecko use this property.
115
- * @param {Error} ex
132
+ * Computes stack trace information from the stack property. Chrome and Gecko use this property.
133
+ *
134
+ * @param {Error} ex - The error object to compute the stack trace for.
116
135
  * @return {?Object.<string, *>} Stack trace information.
117
136
  */
118
137
  function computeStackTraceFromStackProp(ex) {
@@ -133,17 +152,48 @@ function computeStackTraceFromStackProp(ex) {
133
152
  frames: errorInfo.frames
134
153
  };
135
154
  }
155
+
156
+ /**
157
+ * Parses a line from a JavaScript error stack trace and adds it to the given `info` object.
158
+ * Ignores all stack entries thrown from one of our wrapper functions.
159
+ *
160
+ * @param {object} info - The `info` object to add the parsed line to.
161
+ * @param {string} line - The line to parse.
162
+ * @returns {object} The `info` object with the parsed line added.
163
+ */
136
164
  function parseStackProp(info, line) {
137
- var element = getElement(line);
165
+ let element = getStackElement(line);
166
+
167
+ // This catches lines that aren't frames (like the first line stating the error).
138
168
  if (!element) {
139
169
  info.stackLines.push(line);
140
170
  return info;
141
171
  }
142
- if (isWrapper(element.func)) info.wrapperSeen = true;else info.stackLines.push(line);
143
- if (!info.wrapperSeen) info.frames.push(element);
172
+
173
+ // Once we've seen a wrapper, ignore all subsequent stack entries.
174
+ if (isNrWrapper(element.func)) info.wrapperSeen = true;
175
+ if (!info.wrapperSeen) {
176
+ // Query strings and fragments should be removed, and URLs matching the loader's origin should be "<inline>".
177
+ let canonicalUrl = (0, _canonicalizeUrl.canonicalizeUrl)(element.url);
178
+ if (canonicalUrl !== element.url) {
179
+ line = line.replace(element.url, canonicalUrl);
180
+ element.url = canonicalUrl;
181
+ }
182
+ info.stackLines.push(line);
183
+ info.frames.push(element);
184
+ }
144
185
  return info;
145
186
  }
146
- function getElement(line) {
187
+
188
+ /**
189
+ * Parses a line from a JavaScript error stack trace to extract information about a stack trace element, such as the
190
+ * URL, function name, line number, and column number.
191
+ *
192
+ * @param {string} line - A single line from a JavaScript error stack trace.
193
+ * @returns {object} An object containing information about the stack trace element, including the URL, function
194
+ * name, line number, and column number (if available).
195
+ */
196
+ function getStackElement(line) {
147
197
  var parts = line.match(gecko);
148
198
  if (!parts) parts = line.match(chrome);
149
199
  if (parts) {
@@ -160,6 +210,15 @@ function getElement(line) {
160
210
  };
161
211
  }
162
212
  }
213
+
214
+ /**
215
+ * Computes a stack trace object from an error object, by extracting the source and line number from the error object,
216
+ * and using them to create a single stack frame.
217
+ *
218
+ * @param {Error} ex - The error object to compute the stack trace for.
219
+ * @returns {Object|null} - An object representing the computed stack trace, or null if the
220
+ * input error object does not contain a line number.
221
+ */
163
222
  function computeStackTraceBySourceAndLine(ex) {
164
223
  if (!('line' in ex)) return null;
165
224
  var className = ex.name || getClassName(ex);
@@ -176,7 +235,10 @@ function computeStackTraceBySourceAndLine(ex) {
176
235
  }]
177
236
  };
178
237
  }
179
- var stackString = className + ': ' + ex.message + '\n at ' + ex.sourceURL;
238
+
239
+ // Remove any query string and fragment
240
+ var canonicalUrl = (0, _canonicalizeUrl.canonicalizeUrl)(ex.sourceURL);
241
+ var stackString = className + ': ' + ex.message + '\n at ' + canonicalUrl;
180
242
  if (ex.line) {
181
243
  stackString += ':' + ex.line;
182
244
  if (ex.column) {
@@ -189,12 +251,19 @@ function computeStackTraceBySourceAndLine(ex) {
189
251
  message: ex.message,
190
252
  stackString: stackString,
191
253
  frames: [{
192
- url: ex.sourceURL,
254
+ url: canonicalUrl,
193
255
  line: ex.line,
194
256
  column: ex.column
195
257
  }]
196
258
  };
197
259
  }
260
+
261
+ /**
262
+ * For exceptions with no stack and only a message, derives a stack trace by extracting the class name and message.
263
+ *
264
+ * @param {Error} ex - The exception for which to compute the stack trace.
265
+ * @returns {StackTrace} A stack trace object containing the name and message of the exception.
266
+ */
198
267
  function computeStackTraceWithMessageOnly(ex) {
199
268
  var className = ex.name || getClassName(ex);
200
269
  if (!className) return null;
@@ -206,10 +275,24 @@ function computeStackTraceWithMessageOnly(ex) {
206
275
  frames: []
207
276
  };
208
277
  }
278
+
279
+ /**
280
+ * Attempts to extract the name of the constructor function (the class) of the given object.
281
+ *
282
+ * @param {Object} obj - The object for which to extract the constructor function name.
283
+ * @returns {string} The name of the constructor function, or 'unknown' if the name cannot be determined.
284
+ */
209
285
  function getClassName(obj) {
210
286
  var results = classNameRegex.exec(String(obj.constructor));
211
287
  return results && results.length > 1 ? results[1] : 'unknown';
212
288
  }
213
- function isWrapper(functionName) {
289
+
290
+ /**
291
+ * Checks whether the given function name is a New Relic wrapper function.
292
+ *
293
+ * @param {string} functionName - The name of the function to check.
294
+ * @returns {boolean} True if the function name includes the string 'nrWrapper', false otherwise.
295
+ */
296
+ function isNrWrapper(functionName) {
214
297
  return functionName && functionName.indexOf('nrWrapper') >= 0;
215
298
  }