@newrelic/browser-agent 0.1.229 → 0.1.231

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 (587) hide show
  1. package/README.md +65 -2
  2. package/dist/cjs/common/browser-version/ios-version.js +4 -3
  3. package/dist/cjs/common/config/state/configurable.js +3 -2
  4. package/dist/cjs/common/config/state/info.js +1 -1
  5. package/dist/cjs/common/config/state/init.js +1 -1
  6. package/dist/cjs/common/config/state/loader-config.js +1 -1
  7. package/dist/cjs/common/config/state/runtime.js +6 -5
  8. package/dist/cjs/common/constants/env.cdn.js +29 -0
  9. package/dist/cjs/common/constants/env.js +32 -0
  10. package/dist/cjs/common/constants/env.npm.js +30 -0
  11. package/dist/cjs/common/context/shared-context.js +2 -1
  12. package/dist/cjs/common/drain/drain.js +9 -3
  13. package/dist/cjs/common/event-emitter/contextual-ee.test.js +282 -0
  14. package/dist/cjs/common/event-emitter/handle.test.js +58 -0
  15. package/dist/cjs/common/event-emitter/register-handler.test.js +55 -0
  16. package/dist/cjs/common/event-listener/event-listener-opts.js +4 -2
  17. package/dist/cjs/common/harvest/harvest-scheduler.js +2 -1
  18. package/dist/cjs/common/harvest/harvest.js +15 -4
  19. package/dist/cjs/common/ids/id.js +14 -6
  20. package/dist/cjs/common/ids/id.test.js +85 -0
  21. package/dist/cjs/common/ids/unique-id.js +75 -51
  22. package/dist/cjs/common/ids/unique-id.test.js +49 -0
  23. package/dist/cjs/common/timing/nav-timing.js +51 -30
  24. package/dist/cjs/common/timing/nav-timing.test.js +192 -0
  25. package/dist/cjs/common/url/clean-url.test.js +9 -0
  26. package/dist/cjs/common/url/encode.test.js +74 -0
  27. package/dist/cjs/common/url/location.js +4 -0
  28. package/dist/cjs/common/url/location.test.js +13 -0
  29. package/dist/cjs/common/url/parse-url.test.js +111 -0
  30. package/dist/cjs/common/url/protocol.js +2 -12
  31. package/dist/cjs/common/url/protocol.test.js +16 -0
  32. package/dist/cjs/common/util/console.js +2 -2
  33. package/dist/cjs/common/util/map-own.js +21 -14
  34. package/dist/cjs/common/util/map-own.test.js +49 -0
  35. package/dist/cjs/common/util/obfuscate.js +1 -1
  36. package/dist/cjs/common/util/submit-data.js +11 -3
  37. package/dist/cjs/common/window/page-visibility.js +4 -2
  38. package/dist/cjs/common/window/session-storage.js +56 -11
  39. package/dist/cjs/common/wrap/index.js +4 -4
  40. package/dist/cjs/common/wrap/wrap-events.js +10 -10
  41. package/dist/cjs/common/wrap/wrap-fetch.js +6 -8
  42. package/dist/cjs/common/wrap/wrap-function.js +4 -18
  43. package/dist/cjs/common/wrap/wrap-history.js +7 -6
  44. package/dist/cjs/common/wrap/wrap-jsonp.js +7 -6
  45. package/dist/cjs/common/wrap/wrap-mutation.js +7 -6
  46. package/dist/cjs/common/wrap/wrap-promise.js +11 -7
  47. package/dist/cjs/common/wrap/wrap-promise.test.js +119 -0
  48. package/dist/cjs/common/wrap/wrap-raf.js +6 -6
  49. package/dist/cjs/common/wrap/wrap-timer.js +6 -6
  50. package/dist/cjs/common/wrap/wrap-xhr.js +5 -6
  51. package/dist/cjs/features/ajax/aggregate/index.js +1 -1
  52. package/dist/cjs/features/ajax/instrument/index.js +2 -1
  53. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.test.js +5 -4
  54. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +1 -2
  55. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.test.js +5 -5
  56. package/dist/cjs/features/jserrors/aggregate/format-stack-trace.test.js +6 -5
  57. package/dist/cjs/features/jserrors/aggregate/index.js +35 -14
  58. package/dist/cjs/features/jserrors/aggregate/string-hash-code.test.js +5 -4
  59. package/dist/cjs/features/jserrors/instrument/index.js +9 -12
  60. package/dist/cjs/features/metrics/aggregate/index.js +16 -6
  61. package/dist/cjs/features/metrics/instrument/index.js +2 -1
  62. package/dist/cjs/features/metrics/instrument/workers-helper.js +9 -6
  63. package/dist/cjs/features/page_action/aggregate/index.js +12 -4
  64. package/dist/cjs/features/page_action/instrument/index.js +2 -1
  65. package/dist/cjs/features/page_view_event/aggregate/index.js +25 -10
  66. package/dist/cjs/features/page_view_event/instrument/index.js +2 -1
  67. package/dist/cjs/features/page_view_timing/aggregate/index.js +90 -61
  68. package/dist/cjs/features/page_view_timing/instrument/index.js +2 -1
  69. package/dist/cjs/features/session_trace/aggregate/index.js +69 -26
  70. package/dist/cjs/features/session_trace/instrument/index.js +2 -1
  71. package/dist/cjs/features/spa/instrument/index.js +2 -1
  72. package/dist/cjs/features/utils/instrument-base.js +8 -3
  73. package/dist/cjs/features/utils/lazy-loader.js +1 -1
  74. package/dist/cjs/index.js +9 -9
  75. package/dist/cjs/loaders/agent.js +3 -2
  76. package/dist/cjs/loaders/api/api.js +90 -22
  77. package/dist/cjs/loaders/api/apiAsync.js +3 -3
  78. package/dist/cjs/loaders/configure/configure.js +13 -7
  79. package/dist/cjs/loaders/features/enabled-features.js +1 -1
  80. package/dist/cjs/loaders/micro-agent.js +20 -14
  81. package/dist/esm/common/browser-version/ios-version.js +4 -3
  82. package/dist/esm/common/config/state/configurable.js +3 -2
  83. package/dist/esm/common/config/state/info.js +1 -1
  84. package/dist/esm/common/config/state/init.js +1 -1
  85. package/dist/esm/common/config/state/loader-config.js +1 -1
  86. package/dist/esm/common/config/state/runtime.js +3 -2
  87. package/dist/esm/common/constants/env.cdn.js +20 -0
  88. package/dist/esm/common/constants/env.js +23 -0
  89. package/dist/esm/common/constants/env.npm.js +21 -0
  90. package/dist/esm/common/context/shared-context.js +2 -1
  91. package/dist/esm/common/drain/drain.js +9 -3
  92. package/dist/esm/common/event-emitter/contextual-ee.test.js +278 -0
  93. package/dist/esm/common/event-emitter/handle.test.js +54 -0
  94. package/dist/esm/common/event-emitter/register-handler.test.js +51 -0
  95. package/dist/esm/common/event-listener/event-listener-opts.js +4 -2
  96. package/dist/esm/common/harvest/harvest-scheduler.js +2 -1
  97. package/dist/esm/common/harvest/harvest.js +14 -3
  98. package/dist/esm/common/ids/id.js +16 -6
  99. package/dist/esm/common/ids/id.test.js +81 -0
  100. package/dist/esm/common/ids/unique-id.js +75 -51
  101. package/dist/esm/common/ids/unique-id.test.js +44 -0
  102. package/dist/esm/common/timing/nav-timing.js +51 -29
  103. package/dist/esm/common/timing/nav-timing.test.js +190 -0
  104. package/dist/esm/common/url/clean-url.test.js +7 -0
  105. package/dist/esm/common/url/encode.test.js +70 -0
  106. package/dist/esm/common/url/location.js +4 -0
  107. package/dist/esm/common/url/location.test.js +11 -0
  108. package/dist/esm/common/url/parse-url.test.js +107 -0
  109. package/dist/esm/common/url/protocol.js +3 -12
  110. package/dist/esm/common/url/protocol.test.js +14 -0
  111. package/dist/esm/common/util/console.js +2 -2
  112. package/dist/esm/common/util/map-own.js +19 -13
  113. package/dist/esm/common/util/map-own.test.js +47 -0
  114. package/dist/esm/common/util/obfuscate.js +2 -2
  115. package/dist/esm/common/util/submit-data.js +11 -3
  116. package/dist/esm/common/window/page-visibility.js +4 -2
  117. package/dist/esm/common/window/session-storage.js +54 -13
  118. package/dist/esm/common/wrap/index.js +3 -3
  119. package/dist/esm/common/wrap/wrap-events.js +11 -11
  120. package/dist/esm/common/wrap/wrap-fetch.js +7 -9
  121. package/dist/esm/common/wrap/wrap-function.js +4 -17
  122. package/dist/esm/common/wrap/wrap-history.js +8 -7
  123. package/dist/esm/common/wrap/wrap-jsonp.js +8 -7
  124. package/dist/esm/common/wrap/wrap-mutation.js +7 -6
  125. package/dist/esm/common/wrap/wrap-promise.js +11 -7
  126. package/dist/esm/common/wrap/wrap-promise.test.js +115 -0
  127. package/dist/esm/common/wrap/wrap-raf.js +7 -7
  128. package/dist/esm/common/wrap/wrap-timer.js +7 -7
  129. package/dist/esm/common/wrap/wrap-xhr.js +7 -8
  130. package/dist/esm/features/ajax/aggregate/index.js +1 -1
  131. package/dist/esm/features/ajax/instrument/index.js +2 -1
  132. package/dist/esm/features/jserrors/aggregate/canonical-function-name.test.js +5 -4
  133. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +1 -2
  134. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.test.js +5 -5
  135. package/dist/esm/features/jserrors/aggregate/format-stack-trace.test.js +6 -5
  136. package/dist/esm/features/jserrors/aggregate/index.js +35 -14
  137. package/dist/esm/features/jserrors/aggregate/string-hash-code.test.js +5 -4
  138. package/dist/esm/features/jserrors/instrument/index.js +9 -12
  139. package/dist/esm/features/metrics/aggregate/index.js +17 -7
  140. package/dist/esm/features/metrics/instrument/index.js +2 -1
  141. package/dist/esm/features/metrics/instrument/workers-helper.js +9 -6
  142. package/dist/esm/features/page_action/aggregate/index.js +12 -4
  143. package/dist/esm/features/page_action/instrument/index.js +2 -1
  144. package/dist/esm/features/page_view_event/aggregate/index.js +25 -10
  145. package/dist/esm/features/page_view_event/instrument/index.js +2 -1
  146. package/dist/esm/features/page_view_timing/aggregate/index.js +90 -61
  147. package/dist/esm/features/page_view_timing/instrument/index.js +2 -1
  148. package/dist/esm/features/session_trace/aggregate/index.js +69 -26
  149. package/dist/esm/features/session_trace/instrument/index.js +2 -1
  150. package/dist/esm/features/spa/instrument/index.js +2 -1
  151. package/dist/esm/features/utils/instrument-base.js +3 -2
  152. package/dist/esm/features/utils/lazy-loader.js +1 -1
  153. package/dist/esm/index.js +4 -4
  154. package/dist/esm/loaders/agent.js +3 -2
  155. package/dist/esm/loaders/api/api.js +85 -21
  156. package/dist/esm/loaders/api/apiAsync.js +3 -3
  157. package/dist/esm/loaders/configure/configure.js +14 -8
  158. package/dist/esm/loaders/features/enabled-features.js +1 -1
  159. package/dist/esm/loaders/micro-agent.js +18 -13
  160. package/dist/types/cdn/lite.d.ts +2 -0
  161. package/dist/types/cdn/lite.d.ts.map +1 -0
  162. package/dist/types/cdn/polyfills/lite.d.ts +2 -0
  163. package/dist/types/cdn/polyfills/lite.d.ts.map +1 -0
  164. package/dist/types/cdn/polyfills/pro.d.ts +2 -0
  165. package/dist/types/cdn/polyfills/pro.d.ts.map +1 -0
  166. package/dist/types/cdn/polyfills/spa.d.ts +2 -0
  167. package/dist/types/cdn/polyfills/spa.d.ts.map +1 -0
  168. package/dist/types/cdn/polyfills.d.ts +2 -0
  169. package/dist/types/cdn/polyfills.d.ts.map +1 -0
  170. package/dist/types/cdn/pro.d.ts +2 -0
  171. package/dist/types/cdn/pro.d.ts.map +1 -0
  172. package/dist/types/cdn/spa.d.ts +2 -0
  173. package/dist/types/cdn/spa.d.ts.map +1 -0
  174. package/dist/types/cdn/worker.d.ts +2 -0
  175. package/dist/types/cdn/worker.d.ts.map +1 -0
  176. package/dist/types/common/aggregate/aggregator.d.ts +11 -0
  177. package/dist/types/common/aggregate/aggregator.d.ts.map +1 -0
  178. package/dist/types/common/browser-version/firefox-version.d.ts +2 -0
  179. package/dist/types/common/browser-version/firefox-version.d.ts.map +1 -0
  180. package/dist/types/common/browser-version/ios-version.d.ts +3 -0
  181. package/dist/types/common/browser-version/ios-version.d.ts.map +1 -0
  182. package/dist/types/common/config/config.d.ts +13 -0
  183. package/dist/types/common/config/config.d.ts.map +1 -0
  184. package/dist/types/common/config/state/configurable.d.ts +4 -0
  185. package/dist/types/common/config/state/configurable.d.ts.map +1 -0
  186. package/dist/types/common/config/state/info.d.ts +4 -0
  187. package/dist/types/common/config/state/info.d.ts.map +1 -0
  188. package/dist/types/common/config/state/init.d.ts +4 -0
  189. package/dist/types/common/config/state/init.d.ts.map +1 -0
  190. package/dist/types/common/config/state/loader-config.d.ts +3 -0
  191. package/dist/types/common/config/state/loader-config.d.ts.map +1 -0
  192. package/dist/types/common/config/state/originals.d.ts +2 -0
  193. package/dist/types/common/config/state/originals.d.ts.map +1 -0
  194. package/dist/types/common/config/state/runtime.d.ts +3 -0
  195. package/dist/types/common/config/state/runtime.d.ts.map +1 -0
  196. package/dist/types/common/constants/env.cdn.d.ts +18 -0
  197. package/dist/types/common/constants/env.cdn.d.ts.map +1 -0
  198. package/dist/types/common/constants/env.d.ts +13 -0
  199. package/dist/types/common/constants/env.d.ts.map +1 -0
  200. package/dist/types/common/constants/env.npm.d.ts +19 -0
  201. package/dist/types/common/constants/env.npm.d.ts.map +1 -0
  202. package/dist/types/common/context/shared-context.d.ts +5 -0
  203. package/dist/types/common/context/shared-context.d.ts.map +1 -0
  204. package/dist/types/common/deny-list/deny-list.d.ts +12 -0
  205. package/dist/types/common/deny-list/deny-list.d.ts.map +1 -0
  206. package/dist/types/common/drain/drain.d.ts +17 -0
  207. package/dist/types/common/drain/drain.d.ts.map +1 -0
  208. package/dist/types/common/event-emitter/contextual-ee.d.ts +4 -0
  209. package/dist/types/common/event-emitter/contextual-ee.d.ts.map +1 -0
  210. package/dist/types/common/event-emitter/handle.d.ts +3 -0
  211. package/dist/types/common/event-emitter/handle.d.ts.map +1 -0
  212. package/dist/types/common/event-emitter/register-handler.d.ts +8 -0
  213. package/dist/types/common/event-emitter/register-handler.d.ts.map +1 -0
  214. package/dist/types/common/event-listener/event-listener-opts.d.ts +10 -0
  215. package/dist/types/common/event-listener/event-listener-opts.d.ts.map +1 -0
  216. package/dist/types/common/harvest/harvest-scheduler.d.ts +21 -0
  217. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -0
  218. package/dist/types/common/harvest/harvest.d.ts +58 -0
  219. package/dist/types/common/harvest/harvest.d.ts.map +1 -0
  220. package/dist/types/common/ids/id.d.ts +12 -0
  221. package/dist/types/common/ids/id.d.ts.map +1 -0
  222. package/dist/types/common/ids/unique-id.d.ts +28 -0
  223. package/dist/types/common/ids/unique-id.d.ts.map +1 -0
  224. package/dist/types/common/metrics/framework-detection.d.ts +2 -0
  225. package/dist/types/common/metrics/framework-detection.d.ts.map +1 -0
  226. package/dist/types/common/metrics/paint-metrics.d.ts +2 -0
  227. package/dist/types/common/metrics/paint-metrics.d.ts.map +1 -0
  228. package/dist/types/common/serialize/bel-serializer.d.ts +5 -0
  229. package/dist/types/common/serialize/bel-serializer.d.ts.map +1 -0
  230. package/dist/types/common/timing/nav-timing.d.ts +4 -0
  231. package/dist/types/common/timing/nav-timing.d.ts.map +1 -0
  232. package/dist/types/common/timing/now.d.ts +2 -0
  233. package/dist/types/common/timing/now.d.ts.map +1 -0
  234. package/dist/types/common/unload/eol.d.ts +8 -0
  235. package/dist/types/common/unload/eol.d.ts.map +1 -0
  236. package/dist/types/common/url/clean-url.d.ts +2 -0
  237. package/dist/types/common/url/clean-url.d.ts.map +1 -0
  238. package/dist/types/common/url/encode.d.ts +5 -0
  239. package/dist/types/common/url/encode.d.ts.map +1 -0
  240. package/dist/types/common/url/location.d.ts +6 -0
  241. package/dist/types/common/url/location.d.ts.map +1 -0
  242. package/dist/types/common/url/parse-url.d.ts +2 -0
  243. package/dist/types/common/url/parse-url.d.ts.map +1 -0
  244. package/dist/types/common/url/protocol.d.ts +2 -0
  245. package/dist/types/common/url/protocol.d.ts.map +1 -0
  246. package/dist/types/common/util/console.d.ts +8 -0
  247. package/dist/types/common/util/console.d.ts.map +1 -0
  248. package/dist/types/common/util/data-size.d.ts +2 -0
  249. package/dist/types/common/util/data-size.d.ts.map +1 -0
  250. package/dist/types/common/util/feature-flags.d.ts +3 -0
  251. package/dist/types/common/util/feature-flags.d.ts.map +1 -0
  252. package/dist/types/common/util/get-or-set.d.ts +2 -0
  253. package/dist/types/common/util/get-or-set.d.ts.map +1 -0
  254. package/dist/types/common/util/global-scope.d.ts +13 -0
  255. package/dist/types/common/util/global-scope.d.ts.map +1 -0
  256. package/dist/types/common/util/map-own.d.ts +3 -0
  257. package/dist/types/common/util/map-own.d.ts.map +1 -0
  258. package/dist/types/common/util/obfuscate.d.ts +8 -0
  259. package/dist/types/common/util/obfuscate.d.ts.map +1 -0
  260. package/dist/types/common/util/s-hash.d.ts +2 -0
  261. package/dist/types/common/util/s-hash.d.ts.map +1 -0
  262. package/dist/types/common/util/single.d.ts +2 -0
  263. package/dist/types/common/util/single.d.ts.map +1 -0
  264. package/dist/types/common/util/stringify.d.ts +8 -0
  265. package/dist/types/common/util/stringify.d.ts.map +1 -0
  266. package/dist/types/common/util/submit-data.d.ts +35 -0
  267. package/dist/types/common/util/submit-data.d.ts.map +1 -0
  268. package/dist/types/common/util/traverse.d.ts +2 -0
  269. package/dist/types/common/util/traverse.d.ts.map +1 -0
  270. package/dist/types/common/util/user-agent.d.ts +5 -0
  271. package/dist/types/common/util/user-agent.d.ts.map +1 -0
  272. package/dist/types/common/window/load.d.ts +3 -0
  273. package/dist/types/common/window/load.d.ts.map +1 -0
  274. package/dist/types/common/window/nreum.d.ts +14 -0
  275. package/dist/types/common/window/nreum.d.ts.map +1 -0
  276. package/dist/types/common/window/page-visibility.d.ts +7 -0
  277. package/dist/types/common/window/page-visibility.d.ts.map +1 -0
  278. package/dist/types/common/window/session-storage.d.ts +18 -0
  279. package/dist/types/common/window/session-storage.d.ts.map +1 -0
  280. package/dist/types/common/window/supports-performance-observer.d.ts +2 -0
  281. package/dist/types/common/window/supports-performance-observer.d.ts.map +1 -0
  282. package/dist/types/common/wrap/index.d.ts +11 -0
  283. package/dist/types/common/wrap/index.d.ts.map +1 -0
  284. package/dist/types/common/wrap/wrap-events.d.ts +17 -0
  285. package/dist/types/common/wrap/wrap-events.d.ts.map +1 -0
  286. package/dist/types/common/wrap/wrap-fetch.d.ts +18 -0
  287. package/dist/types/common/wrap/wrap-fetch.d.ts.map +1 -0
  288. package/dist/types/common/wrap/wrap-function.d.ts +28 -0
  289. package/dist/types/common/wrap/wrap-function.d.ts.map +1 -0
  290. package/dist/types/common/wrap/wrap-history.d.ts +16 -0
  291. package/dist/types/common/wrap/wrap-history.d.ts.map +1 -0
  292. package/dist/types/common/wrap/wrap-jsonp.d.ts +16 -0
  293. package/dist/types/common/wrap/wrap-jsonp.d.ts.map +1 -0
  294. package/dist/types/common/wrap/wrap-mutation.d.ts +16 -0
  295. package/dist/types/common/wrap/wrap-mutation.d.ts.map +1 -0
  296. package/dist/types/common/wrap/wrap-promise.d.ts +17 -0
  297. package/dist/types/common/wrap/wrap-promise.d.ts.map +1 -0
  298. package/dist/types/common/wrap/wrap-raf.d.ts +16 -0
  299. package/dist/types/common/wrap/wrap-raf.d.ts.map +1 -0
  300. package/dist/types/common/wrap/wrap-timer.d.ts +17 -0
  301. package/dist/types/common/wrap/wrap-timer.d.ts.map +1 -0
  302. package/dist/types/common/wrap/wrap-xhr.d.ts +16 -0
  303. package/dist/types/common/wrap/wrap-xhr.d.ts.map +1 -0
  304. package/dist/types/features/ajax/aggregate/index.d.ts +16 -0
  305. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -0
  306. package/dist/types/features/ajax/constants.d.ts +2 -0
  307. package/dist/types/features/ajax/constants.d.ts.map +1 -0
  308. package/dist/types/features/ajax/index.d.ts +2 -0
  309. package/dist/types/features/ajax/index.d.ts.map +1 -0
  310. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts +19 -0
  311. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts.map +1 -0
  312. package/dist/types/features/ajax/instrument/index.d.ts +9 -0
  313. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -0
  314. package/dist/types/features/ajax/instrument/response-size.d.ts +2 -0
  315. package/dist/types/features/ajax/instrument/response-size.d.ts.map +1 -0
  316. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts +2 -0
  317. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts.map +1 -0
  318. package/dist/types/features/jserrors/aggregate/compute-stack-trace.d.ts +22 -0
  319. package/dist/types/features/jserrors/aggregate/compute-stack-trace.d.ts.map +1 -0
  320. package/dist/types/features/jserrors/aggregate/format-stack-trace.d.ts +3 -0
  321. package/dist/types/features/jserrors/aggregate/format-stack-trace.d.ts.map +1 -0
  322. package/dist/types/features/jserrors/aggregate/index.d.ts +24 -0
  323. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -0
  324. package/dist/types/features/jserrors/aggregate/string-hash-code.d.ts +2 -0
  325. package/dist/types/features/jserrors/aggregate/string-hash-code.d.ts.map +1 -0
  326. package/dist/types/features/jserrors/constants.d.ts +3 -0
  327. package/dist/types/features/jserrors/constants.d.ts.map +1 -0
  328. package/dist/types/features/jserrors/index.d.ts +2 -0
  329. package/dist/types/features/jserrors/index.d.ts.map +1 -0
  330. package/dist/types/features/jserrors/instrument/debug.d.ts +2 -0
  331. package/dist/types/features/jserrors/instrument/debug.d.ts.map +1 -0
  332. package/dist/types/features/jserrors/instrument/index.d.ts +22 -0
  333. package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -0
  334. package/dist/types/features/metrics/aggregate/index.d.ts +12 -0
  335. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -0
  336. package/dist/types/features/metrics/constants.d.ts +6 -0
  337. package/dist/types/features/metrics/constants.d.ts.map +1 -0
  338. package/dist/types/features/metrics/index.d.ts +2 -0
  339. package/dist/types/features/metrics/index.d.ts.map +1 -0
  340. package/dist/types/features/metrics/instrument/index.d.ts +6 -0
  341. package/dist/types/features/metrics/instrument/index.d.ts.map +1 -0
  342. package/dist/types/features/metrics/instrument/workers-helper.d.ts +7 -0
  343. package/dist/types/features/metrics/instrument/workers-helper.d.ts.map +1 -0
  344. package/dist/types/features/page_action/aggregate/index.d.ts +24 -0
  345. package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -0
  346. package/dist/types/features/page_action/constants.d.ts +2 -0
  347. package/dist/types/features/page_action/constants.d.ts.map +1 -0
  348. package/dist/types/features/page_action/index.d.ts +2 -0
  349. package/dist/types/features/page_action/index.d.ts.map +1 -0
  350. package/dist/types/features/page_action/instrument/index.d.ts +6 -0
  351. package/dist/types/features/page_action/instrument/index.d.ts.map +1 -0
  352. package/dist/types/features/page_view_event/aggregate/index.d.ts +9 -0
  353. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -0
  354. package/dist/types/features/page_view_event/aggregate/initialized-features.d.ts +8 -0
  355. package/dist/types/features/page_view_event/aggregate/initialized-features.d.ts.map +1 -0
  356. package/dist/types/features/page_view_event/constants.d.ts +5 -0
  357. package/dist/types/features/page_view_event/constants.d.ts.map +1 -0
  358. package/dist/types/features/page_view_event/index.d.ts +2 -0
  359. package/dist/types/features/page_view_event/index.d.ts.map +1 -0
  360. package/dist/types/features/page_view_event/instrument/index.d.ts +6 -0
  361. package/dist/types/features/page_view_event/instrument/index.d.ts.map +1 -0
  362. package/dist/types/features/page_view_timing/aggregate/index.d.ts +32 -0
  363. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -0
  364. package/dist/types/features/page_view_timing/constants.d.ts +2 -0
  365. package/dist/types/features/page_view_timing/constants.d.ts.map +1 -0
  366. package/dist/types/features/page_view_timing/first-paint.d.ts +2 -0
  367. package/dist/types/features/page_view_timing/first-paint.d.ts.map +1 -0
  368. package/dist/types/features/page_view_timing/index.d.ts +2 -0
  369. package/dist/types/features/page_view_timing/index.d.ts.map +1 -0
  370. package/dist/types/features/page_view_timing/instrument/index.d.ts +6 -0
  371. package/dist/types/features/page_view_timing/instrument/index.d.ts.map +1 -0
  372. package/dist/types/features/page_view_timing/long-tasks.d.ts +2 -0
  373. package/dist/types/features/page_view_timing/long-tasks.d.ts.map +1 -0
  374. package/dist/types/features/session_trace/aggregate/index.d.ts +77 -0
  375. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -0
  376. package/dist/types/features/session_trace/constants.d.ts +13 -0
  377. package/dist/types/features/session_trace/constants.d.ts.map +1 -0
  378. package/dist/types/features/session_trace/index.d.ts +2 -0
  379. package/dist/types/features/session_trace/index.d.ts.map +1 -0
  380. package/dist/types/features/session_trace/instrument/index.d.ts +11 -0
  381. package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -0
  382. package/dist/types/features/spa/aggregate/index.d.ts +25 -0
  383. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -0
  384. package/dist/types/features/spa/aggregate/interaction-node.d.ts +15 -0
  385. package/dist/types/features/spa/aggregate/interaction-node.d.ts.map +1 -0
  386. package/dist/types/features/spa/aggregate/interaction.d.ts +20 -0
  387. package/dist/types/features/spa/aggregate/interaction.d.ts.map +1 -0
  388. package/dist/types/features/spa/aggregate/serializer.d.ts +15 -0
  389. package/dist/types/features/spa/aggregate/serializer.d.ts.map +1 -0
  390. package/dist/types/features/spa/constants.d.ts +23 -0
  391. package/dist/types/features/spa/constants.d.ts.map +1 -0
  392. package/dist/types/features/spa/index.d.ts +2 -0
  393. package/dist/types/features/spa/index.d.ts.map +1 -0
  394. package/dist/types/features/spa/instrument/index.d.ts +8 -0
  395. package/dist/types/features/spa/instrument/index.d.ts.map +1 -0
  396. package/dist/types/features/utils/aggregate-base.d.ts +4 -0
  397. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -0
  398. package/dist/types/features/utils/feature-base.d.ts +23 -0
  399. package/dist/types/features/utils/feature-base.d.ts.map +1 -0
  400. package/dist/types/features/utils/handler-cache.d.ts +22 -0
  401. package/dist/types/features/utils/handler-cache.d.ts.map +1 -0
  402. package/dist/types/features/utils/instrument-base.d.ts +27 -0
  403. package/dist/types/features/utils/instrument-base.d.ts.map +1 -0
  404. package/dist/types/features/utils/lazy-loader.d.ts +13 -0
  405. package/dist/types/features/utils/lazy-loader.d.ts.map +1 -0
  406. package/dist/types/index.d.ts +12 -0
  407. package/dist/types/index.d.ts.map +1 -0
  408. package/dist/types/loaders/agent.d.ts +20 -0
  409. package/dist/types/loaders/agent.d.ts.map +1 -0
  410. package/dist/types/loaders/api/api.d.ts +17 -0
  411. package/dist/types/loaders/api/api.d.ts.map +1 -0
  412. package/dist/types/loaders/api/apiAsync.d.ts +2 -0
  413. package/dist/types/loaders/api/apiAsync.d.ts.map +1 -0
  414. package/dist/types/loaders/browser-agent.d.ts +9 -0
  415. package/dist/types/loaders/browser-agent.d.ts.map +1 -0
  416. package/dist/types/loaders/configure/configure.d.ts +10 -0
  417. package/dist/types/loaders/configure/configure.d.ts.map +1 -0
  418. package/dist/types/loaders/features/enabled-features.d.ts +2 -0
  419. package/dist/types/loaders/features/enabled-features.d.ts.map +1 -0
  420. package/dist/types/loaders/features/featureDependencies.d.ts +3 -0
  421. package/dist/types/loaders/features/featureDependencies.d.ts.map +1 -0
  422. package/dist/types/loaders/features/features.d.ts +18 -0
  423. package/dist/types/loaders/features/features.d.ts.map +1 -0
  424. package/dist/types/loaders/micro-agent.d.ts +25 -0
  425. package/dist/types/loaders/micro-agent.d.ts.map +1 -0
  426. package/dist/types/loaders/worker-agent.d.ts +8 -0
  427. package/dist/types/loaders/worker-agent.d.ts.map +1 -0
  428. package/package.json +67 -59
  429. package/src/cdn/lite.js +18 -0
  430. package/src/cdn/polyfills/lite.js +7 -0
  431. package/src/cdn/polyfills/pro.js +7 -0
  432. package/src/cdn/polyfills/spa.js +7 -0
  433. package/src/cdn/polyfills.js +17 -0
  434. package/src/cdn/pro.js +27 -0
  435. package/src/cdn/spa.js +28 -0
  436. package/src/cdn/worker.js +21 -0
  437. package/src/common/aggregate/aggregator.js +171 -0
  438. package/src/common/browser-version/firefox-version.js +10 -0
  439. package/src/common/browser-version/ios-version.js +11 -0
  440. package/src/common/config/config.js +12 -0
  441. package/src/common/config/state/configurable.js +26 -0
  442. package/src/common/config/state/info.js +49 -0
  443. package/src/common/config/state/init.js +56 -0
  444. package/src/common/config/state/loader-config.js +25 -0
  445. package/src/common/config/state/originals.js +3 -0
  446. package/src/common/config/state/runtime.js +47 -0
  447. package/src/common/constants/env.cdn.js +20 -0
  448. package/src/common/constants/env.js +23 -0
  449. package/src/common/constants/env.npm.js +21 -0
  450. package/src/common/context/shared-context.js +21 -0
  451. package/src/common/deny-list/deny-list.js +116 -0
  452. package/src/common/drain/drain.js +119 -0
  453. package/src/common/event-emitter/contextual-ee.js +159 -0
  454. package/src/common/event-emitter/contextual-ee.test.js +310 -0
  455. package/src/common/event-emitter/handle.js +17 -0
  456. package/src/common/event-emitter/handle.test.js +56 -0
  457. package/src/common/event-emitter/register-handler.js +25 -0
  458. package/src/common/event-emitter/register-handler.test.js +61 -0
  459. package/src/common/event-listener/event-listener-opts.js +41 -0
  460. package/src/common/harvest/harvest-scheduler.js +112 -0
  461. package/src/common/harvest/harvest.js +248 -0
  462. package/src/common/ids/id.js +32 -0
  463. package/src/common/ids/id.test.js +92 -0
  464. package/src/common/ids/unique-id.js +104 -0
  465. package/src/common/ids/unique-id.test.js +58 -0
  466. package/src/common/metrics/framework-detection.js +71 -0
  467. package/src/common/metrics/paint-metrics.js +6 -0
  468. package/src/common/serialize/bel-serializer.js +93 -0
  469. package/src/common/timing/nav-timing.js +90 -0
  470. package/src/common/timing/nav-timing.test.js +161 -0
  471. package/src/common/timing/now.js +9 -0
  472. package/src/common/unload/eol.js +62 -0
  473. package/src/common/url/clean-url.js +10 -0
  474. package/src/common/url/clean-url.test.js +25 -0
  475. package/src/common/url/encode.js +75 -0
  476. package/src/common/url/encode.test.js +80 -0
  477. package/src/common/url/location.js +12 -0
  478. package/src/common/url/location.test.js +15 -0
  479. package/src/common/url/parse-url.js +70 -0
  480. package/src/common/url/parse-url.test.js +110 -0
  481. package/src/common/url/protocol.js +9 -0
  482. package/src/common/url/protocol.test.js +18 -0
  483. package/src/common/util/console.js +11 -0
  484. package/src/common/util/data-size.js +21 -0
  485. package/src/common/util/feature-flags.js +38 -0
  486. package/src/common/util/get-or-set.js +34 -0
  487. package/src/common/util/global-scope.js +47 -0
  488. package/src/common/util/map-own.js +22 -0
  489. package/src/common/util/map-own.test.js +52 -0
  490. package/src/common/util/obfuscate.js +73 -0
  491. package/src/common/util/s-hash.js +14 -0
  492. package/src/common/util/single.js +18 -0
  493. package/src/common/util/stringify.js +42 -0
  494. package/src/common/util/submit-data.js +101 -0
  495. package/src/common/util/traverse.js +36 -0
  496. package/src/common/util/user-agent.js +56 -0
  497. package/src/common/window/load.js +15 -0
  498. package/src/common/window/nreum.js +110 -0
  499. package/src/common/window/page-visibility.js +24 -0
  500. package/src/common/window/session-storage.js +75 -0
  501. package/src/common/window/supports-performance-observer.js +10 -0
  502. package/src/common/wrap/index.js +17 -0
  503. package/src/common/wrap/wrap-events.js +106 -0
  504. package/src/common/wrap/wrap-fetch.js +110 -0
  505. package/src/common/wrap/wrap-function.js +248 -0
  506. package/src/common/wrap/wrap-history.js +51 -0
  507. package/src/common/wrap/wrap-jsonp.js +136 -0
  508. package/src/common/wrap/wrap-mutation.js +58 -0
  509. package/src/common/wrap/wrap-promise.js +166 -0
  510. package/src/common/wrap/wrap-promise.test.js +140 -0
  511. package/src/common/wrap/wrap-raf.js +52 -0
  512. package/src/common/wrap/wrap-timer.js +69 -0
  513. package/src/common/wrap/wrap-xhr.js +214 -0
  514. package/src/features/ajax/aggregate/index.js +248 -0
  515. package/src/features/ajax/constants.js +3 -0
  516. package/src/features/ajax/index.js +1 -0
  517. package/src/features/ajax/instrument/distributed-tracing.js +166 -0
  518. package/src/features/ajax/instrument/index.js +380 -0
  519. package/src/features/ajax/instrument/response-size.js +18 -0
  520. package/src/features/jserrors/aggregate/canonical-function-name.js +14 -0
  521. package/src/features/jserrors/aggregate/canonical-function-name.test.js +13 -0
  522. package/src/features/jserrors/aggregate/compute-stack-trace.js +231 -0
  523. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +297 -0
  524. package/src/features/jserrors/aggregate/format-stack-trace.js +30 -0
  525. package/src/features/jserrors/aggregate/format-stack-trace.test.js +39 -0
  526. package/src/features/jserrors/aggregate/index.js +310 -0
  527. package/src/features/jserrors/aggregate/string-hash-code.js +17 -0
  528. package/src/features/jserrors/aggregate/string-hash-code.test.js +12 -0
  529. package/src/features/jserrors/constants.js +4 -0
  530. package/src/features/jserrors/index.js +1 -0
  531. package/src/features/jserrors/instrument/debug.js +36 -0
  532. package/src/features/jserrors/instrument/index.js +151 -0
  533. package/src/features/metrics/aggregate/index.js +133 -0
  534. package/src/features/metrics/constants.js +7 -0
  535. package/src/features/metrics/index.js +1 -0
  536. package/src/features/metrics/instrument/index.js +14 -0
  537. package/src/features/metrics/instrument/workers-helper.js +113 -0
  538. package/src/features/page_action/aggregate/index.js +113 -0
  539. package/src/features/page_action/constants.js +3 -0
  540. package/src/features/page_action/index.js +1 -0
  541. package/src/features/page_action/instrument/index.js +15 -0
  542. package/src/features/page_view_event/aggregate/index.js +143 -0
  543. package/src/features/page_view_event/aggregate/initialized-features.js +31 -0
  544. package/src/features/page_view_event/constants.js +6 -0
  545. package/src/features/page_view_event/index.js +1 -0
  546. package/src/features/page_view_event/instrument/index.js +33 -0
  547. package/src/features/page_view_timing/aggregate/index.js +257 -0
  548. package/src/features/page_view_timing/constants.js +3 -0
  549. package/src/features/page_view_timing/first-paint.js +41 -0
  550. package/src/features/page_view_timing/index.js +1 -0
  551. package/src/features/page_view_timing/instrument/index.js +30 -0
  552. package/src/features/page_view_timing/long-tasks.js +60 -0
  553. package/src/features/session_trace/aggregate/index.js +413 -0
  554. package/src/features/session_trace/constants.js +15 -0
  555. package/src/features/session_trace/index.js +1 -0
  556. package/src/features/session_trace/instrument/index.js +127 -0
  557. package/src/features/spa/aggregate/index.js +738 -0
  558. package/src/features/spa/aggregate/interaction-node.js +85 -0
  559. package/src/features/spa/aggregate/interaction-node.test.js +17 -0
  560. package/src/features/spa/aggregate/interaction.js +112 -0
  561. package/src/features/spa/aggregate/serializer.js +198 -0
  562. package/src/features/spa/constants.js +36 -0
  563. package/src/features/spa/index.js +1 -0
  564. package/src/features/spa/instrument/index.js +114 -0
  565. package/src/features/utils/aggregate-base.js +7 -0
  566. package/src/features/utils/feature-base.js +51 -0
  567. package/src/features/utils/handler-cache.js +60 -0
  568. package/src/features/utils/instrument-base.js +68 -0
  569. package/src/features/utils/lazy-loader.js +37 -0
  570. package/src/index.js +15 -0
  571. package/src/loaders/agent.js +80 -0
  572. package/src/loaders/api/api.js +175 -0
  573. package/src/loaders/api/apiAsync.js +92 -0
  574. package/src/loaders/browser-agent.js +33 -0
  575. package/src/loaders/configure/configure.js +39 -0
  576. package/src/loaders/features/enabled-features.js +16 -0
  577. package/src/loaders/features/featureDependencies.js +26 -0
  578. package/src/loaders/features/features.js +25 -0
  579. package/src/loaders/micro-agent.js +84 -0
  580. package/src/loaders/worker-agent.js +24 -0
  581. package/dist/cjs/common/constants/environment-variables.js +0 -20
  582. package/dist/cjs/common/util/reduce.js +0 -22
  583. package/dist/cjs/common/window/top-level-callers.js +0 -23
  584. package/dist/esm/common/constants/environment-variables.js +0 -11
  585. package/dist/esm/common/util/reduce.js +0 -16
  586. package/dist/esm/common/window/top-level-callers.js +0 -17
  587. package/types.ts +0 -221
@@ -0,0 +1,297 @@
1
+ import { faker } from '@faker-js/faker'
2
+ import { browserErrorUtils } from '../../../../tools/testing-utils'
3
+ import { computeStackTrace } from './compute-stack-trace'
4
+
5
+ const baseMockError = {
6
+ toString: 'RangeError: Invalid array length',
7
+ name: 'RangeError',
8
+ constructor: 'function RangeError() { [native code] }',
9
+ message: 'Invalid array length',
10
+ stack: 'RangeError: Invalid array length\n at errorTest (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html?loader=spa:74:16)\n at captureError (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html?loader=spa:17:9)\n at onload (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html?loader=spa:70:5)'
11
+ }
12
+
13
+ test('parsing should return a failure for a null error object', () => {
14
+ const result = computeStackTrace(null)
15
+
16
+ expect(result).toEqual(expect.objectContaining({
17
+ mode: 'failed',
18
+ stackString: '',
19
+ frames: []
20
+ }))
21
+ })
22
+
23
+ describe('errors with stack property', () => {
24
+ test('parsed name should be unknown when name and constructor are missing', () => {
25
+ const mockError = browserErrorUtils.constructError({
26
+ ...baseMockError,
27
+ name: null,
28
+ constructor: null
29
+ })
30
+
31
+ const result = computeStackTrace(mockError)
32
+
33
+ expect(result).toEqual(expect.objectContaining({
34
+ mode: 'stack',
35
+ name: 'unknown',
36
+ message: mockError.message,
37
+ stackString: mockError.stack
38
+ }))
39
+ })
40
+
41
+ test('parsed stack should not contain nrWrapper', () => {
42
+ const alteredError = baseMockError
43
+ alteredError.stack +=
44
+ '\n at nrWrapper (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html?loader=spa:60:17)'
45
+ const mockError = browserErrorUtils.constructError(alteredError)
46
+
47
+ const result = computeStackTrace(mockError)
48
+
49
+ expect(result).toEqual(expect.objectContaining({
50
+ mode: 'stack',
51
+ name: mockError.name,
52
+ message: mockError.message,
53
+ stackString: expect.not.stringContaining('nrWrapper')
54
+ }))
55
+ expect(result.frames).not.toContainEqual(expect.objectContaining({
56
+ func: 'nrWrapper'
57
+ }))
58
+ })
59
+
60
+ test('stack should still parse when column numbers are missing', () => {
61
+ const mockError = browserErrorUtils.constructError({
62
+ ...baseMockError,
63
+ stack:
64
+ 'Error: Blocked a frame with origin "http://bam-test-1.nr-local.net:3334" from accessing a cross-origin frame.\n at errorTest (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html?loader=spa:60)\n at captureError (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html?loader=spa:17)\n at onload (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html?loader=spa:57)'
65
+ })
66
+
67
+ const result = computeStackTrace(mockError)
68
+
69
+ expect(result).toEqual(expect.objectContaining({
70
+ mode: 'stack',
71
+ name: mockError.name,
72
+ message: mockError.message,
73
+ stackString: mockError.stack
74
+ }))
75
+ expect(result.frames.length).toEqual(3)
76
+ expect(result.frames).toContainEqual(expect.objectContaining({
77
+ func: 'errorTest',
78
+ column: null
79
+ }))
80
+ expect(result.frames).toContainEqual(expect.objectContaining({
81
+ func: 'captureError',
82
+ column: null
83
+ }))
84
+ expect(result.frames).toContainEqual(expect.objectContaining({
85
+ func: 'onload',
86
+ column: null
87
+ }))
88
+ })
89
+
90
+ test('parser can handle chrome eval stack', () => {
91
+ const mockError = browserErrorUtils.constructError({
92
+ ...baseMockError,
93
+ stack:
94
+ ' at foobar (eval at foobar (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html))'
95
+ })
96
+
97
+ const result = computeStackTrace(mockError)
98
+
99
+ expect(result).toEqual(expect.objectContaining({
100
+ mode: 'stack',
101
+ name: mockError.name,
102
+ message: mockError.message,
103
+ stackString: mockError.stack
104
+ }))
105
+ expect(result.frames.length).toEqual(1)
106
+ expect(result.frames).toContainEqual(expect.objectContaining({
107
+ func: 'evaluated code'
108
+ }))
109
+ })
110
+
111
+ test('parser can handle ie eval stack', () => {
112
+ const mockError = browserErrorUtils.constructError({
113
+ toString: 'TypeError: Permission denied',
114
+ name: 'TypeError',
115
+ constructor: '\nfunction TypeError() {\n [native code]\n}\n',
116
+ message: 'Permission denied',
117
+ stack:
118
+ ' at Function code (Function code:23:23)'
119
+ })
120
+
121
+ const result = computeStackTrace(mockError)
122
+
123
+ expect(result).toEqual(expect.objectContaining({
124
+ mode: 'stack',
125
+ name: mockError.name,
126
+ message: mockError.message,
127
+ stackString: mockError.stack
128
+ }))
129
+ expect(result.frames.length).toEqual(1)
130
+ expect(result.frames).toContainEqual(expect.objectContaining({
131
+ func: 'evaluated code'
132
+ }))
133
+ })
134
+
135
+ test('parser can handle stack with anonymous function', () => {
136
+ const mockError = browserErrorUtils.constructError({
137
+ ...baseMockError,
138
+ stack:
139
+ 'anonymous'
140
+ })
141
+
142
+ const result = computeStackTrace(mockError)
143
+
144
+ expect(result).toEqual(expect.objectContaining({
145
+ mode: 'stack',
146
+ name: mockError.name,
147
+ message: mockError.message,
148
+ stackString: mockError.stack
149
+ }))
150
+ expect(result.frames.length).toEqual(1)
151
+ expect(result.frames).toContainEqual(expect.objectContaining({
152
+ func: 'evaluated code'
153
+ }))
154
+ })
155
+ })
156
+
157
+ describe('errors without stack property and with line property', () => {
158
+ /**
159
+ * @deprecated sourceURL is no longer present in errors for any browsers we support
160
+ */
161
+ test('parsed stack should contain sourceURL and line number', () => {
162
+ const sourceURL = faker.internet.url()
163
+ const mockError = browserErrorUtils.constructError({
164
+ ...baseMockError,
165
+ stack: undefined,
166
+ line: 100,
167
+ sourceURL
168
+ })
169
+
170
+ const result = computeStackTrace(mockError)
171
+
172
+ expect(result).toEqual(expect.objectContaining({
173
+ mode: 'sourceline',
174
+ name: mockError.name,
175
+ message: mockError.message,
176
+ stackString: `${mockError.name}: ${mockError.message}\n at ${sourceURL}:${mockError.line}`
177
+ }))
178
+ expect(result.frames.length).toEqual(1)
179
+ expect(result.frames).toContainEqual(expect.objectContaining({
180
+ url: sourceURL,
181
+ line: mockError.line
182
+ }))
183
+ })
184
+
185
+ /**
186
+ * @deprecated sourceURL is no longer present in errors for any browsers we support
187
+ */
188
+ test('parsed stack should contain sourceURL, line number, and column number', () => {
189
+ const sourceURL = faker.internet.url()
190
+ const mockError = browserErrorUtils.constructError({
191
+ ...baseMockError,
192
+ line: 100,
193
+ column: 200,
194
+ stack: undefined,
195
+ sourceURL
196
+ })
197
+
198
+ const result = computeStackTrace(mockError)
199
+
200
+ expect(result).toEqual(expect.objectContaining({
201
+ mode: 'sourceline',
202
+ name: mockError.name,
203
+ message: mockError.message,
204
+ stackString: `${mockError.name}: ${mockError.message}\n at ${sourceURL}:${mockError.line}:${mockError.column}`
205
+ }))
206
+ expect(result.frames.length).toEqual(1)
207
+ expect(result.frames).toContainEqual(expect.objectContaining({
208
+ url: sourceURL,
209
+ line: mockError.line,
210
+ column: mockError.column
211
+ }))
212
+ })
213
+
214
+ test('parsed stack should contain "evaluated code" if sourceURL property is not present', () => {
215
+ const mockError = browserErrorUtils.constructError({
216
+ ...baseMockError,
217
+ line: 100,
218
+ column: 200,
219
+ stack: undefined
220
+ })
221
+
222
+ const result = computeStackTrace(mockError)
223
+
224
+ expect(result).toEqual(expect.objectContaining({
225
+ mode: 'sourceline',
226
+ name: mockError.name,
227
+ message: mockError.message,
228
+ stackString: `RangeError: ${mockError.message}\n in evaluated code`
229
+ }))
230
+ expect(result.frames.length).toEqual(1)
231
+ expect(result.frames).toContainEqual(expect.objectContaining({
232
+ func: 'evaluated code'
233
+ }))
234
+ })
235
+
236
+ // TODO: computeStackTraceBySourceAndLine does not respect firefox lineNumber and columnNumber properties when stack is empty
237
+ })
238
+
239
+ /**
240
+ * These tests are here because JS allows you to throw absolutely anything as an
241
+ * error, including primitives.
242
+ */
243
+ describe('errors that are messages only or primitives', () => {
244
+ test('parser should get error name from constructor', () => {
245
+ const mockError = browserErrorUtils.constructError({
246
+ toString: '0',
247
+ constructor: 'function Number() { [native code] }'
248
+ })
249
+
250
+ const result = computeStackTrace(mockError)
251
+
252
+ expect(result).toEqual(expect.objectContaining({
253
+ mode: 'nameonly',
254
+ name: 'Number',
255
+ stackString: 'Number: undefined',
256
+ frames: []
257
+ }))
258
+ })
259
+
260
+ test('parser should get error name from name property', () => {
261
+ const mockError = browserErrorUtils.constructError({
262
+ toString: '0',
263
+ name: faker.datatype.uuid(),
264
+ constructor: 'function Number() { [native code] }'
265
+ })
266
+
267
+ const result = computeStackTrace(mockError)
268
+
269
+ expect(result).toEqual(expect.objectContaining({
270
+ mode: 'nameonly',
271
+ name: mockError.name,
272
+ stackString: `${mockError.name}: undefined`,
273
+ frames: []
274
+ }))
275
+ })
276
+
277
+ test('parser should include the message property', () => {
278
+ const mockError = browserErrorUtils.constructError({
279
+ toString: '0',
280
+ name: faker.datatype.uuid(),
281
+ message: faker.datatype.uuid(),
282
+ constructor: 'function Number() { [native code] }'
283
+ })
284
+
285
+ const result = computeStackTrace(mockError)
286
+
287
+ expect(result).toEqual(expect.objectContaining({
288
+ mode: 'nameonly',
289
+ name: mockError.name,
290
+ message: mockError.message,
291
+ stackString: `${mockError.name}: ${mockError.message}`,
292
+ frames: []
293
+ }))
294
+ })
295
+ })
296
+
297
+ // describe('')
@@ -0,0 +1,30 @@
1
+ /*
2
+ * Copyright 2020 New Relic Corporation. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ var stripNewlinesRegex = /^\n+|\n+$/g
7
+ var MAX_STACK_TRACE_LENGTH = 65530
8
+
9
+ export function formatStackTrace (stackLines) {
10
+ return truncateStackLines(stackLines).replace(stripNewlinesRegex, '')
11
+ }
12
+
13
+ // takes array of stack lines and returns string with top 50 and buttom 50 lines
14
+ function truncateStackLines (stackLines) {
15
+ var stackString
16
+ if (stackLines.length > 100) {
17
+ var truncatedLines = stackLines.length - 100
18
+ stackString = stackLines.slice(0, 50).join('\n')
19
+ stackString += '\n< ...truncated ' + truncatedLines + ' lines... >\n'
20
+ stackString += stackLines.slice(-50).join('\n')
21
+ } else {
22
+ stackString = stackLines.join('\n')
23
+ }
24
+ return stackString
25
+ }
26
+
27
+ // truncates stack string to limit what is sent to backend
28
+ export function truncateSize (stackString) {
29
+ return (stackString.length > MAX_STACK_TRACE_LENGTH) ? stackString.substr(0, MAX_STACK_TRACE_LENGTH) : stackString
30
+ }
@@ -0,0 +1,39 @@
1
+ import { faker } from '@faker-js/faker'
2
+ import { formatStackTrace, truncateSize } from './format-stack-trace'
3
+
4
+ describe('formatStackTrace', () => {
5
+ test.each([
6
+ {
7
+ input: ['line 1', 'line 2', 'line 3', 'line 4'],
8
+ expected: 'line 1\nline 2\nline 3\nline 4',
9
+ title: 'Appends all stack lines together'
10
+ },
11
+ { input: ['', 'line 1', 'line 2'], expected: 'line 1\nline 2', title: 'Strips leading empty stack frame' },
12
+ { input: ['line 1', 'line 2', ''], expected: 'line 1\nline 2', title: 'Strips ending empty stack frame' }
13
+ ])('$title', ({ input, expected }) => {
14
+ const result = formatStackTrace(input)
15
+
16
+ expect(result).toEqual(expected)
17
+ })
18
+
19
+ test('truncates the middle of the stack lines when more than 100', () => {
20
+ const input = Array.apply(null, Array(200))
21
+ .map(() => faker.datatype.uuid())
22
+ const expected = input.slice(0, 50).join('\n') + `\n< ...truncated ${input.length - 100} lines... >\n` + input.slice(-50).join('\n')
23
+
24
+ const result = formatStackTrace(input)
25
+
26
+ expect(result).toEqual(expected)
27
+ })
28
+ })
29
+
30
+ describe('truncateSize', () => {
31
+ test('should truncate stack string to max limit', () => {
32
+ const maxSize = 65530
33
+ const input = faker.datatype.string(maxSize + 1)
34
+
35
+ const result = truncateSize(input)
36
+
37
+ expect(result).toEqual(input.slice(0, maxSize))
38
+ })
39
+ })
@@ -0,0 +1,310 @@
1
+ /*
2
+ * Copyright 2020 New Relic Corporation. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ import { canonicalFunctionName } from './canonical-function-name'
7
+ import { cleanURL } from '../../../common/url/clean-url'
8
+ import { computeStackTrace } from './compute-stack-trace'
9
+ import { stringHashCode } from './string-hash-code'
10
+ import { truncateSize } from './format-stack-trace'
11
+
12
+ import { registerHandler as register } from '../../../common/event-emitter/register-handler'
13
+ import { HarvestScheduler } from '../../../common/harvest/harvest-scheduler'
14
+ import { stringify } from '../../../common/util/stringify'
15
+ import { handle } from '../../../common/event-emitter/handle'
16
+ import { mapOwn } from '../../../common/util/map-own'
17
+ import { getInfo, getConfigurationValue, getRuntime } from '../../../common/config/config'
18
+ import { now } from '../../../common/timing/now'
19
+ import { globalScope } from '../../../common/util/global-scope'
20
+
21
+ import { AggregateBase } from '../../utils/aggregate-base'
22
+ import { FEATURE_NAME } from '../constants'
23
+ import { drain } from '../../../common/drain/drain'
24
+ import { FEATURE_NAMES } from '../../../loaders/features/features'
25
+
26
+ export class Aggregate extends AggregateBase {
27
+ static featureName = FEATURE_NAME
28
+ constructor (agentIdentifier, aggregator) {
29
+ super(agentIdentifier, aggregator, FEATURE_NAME)
30
+
31
+ this.stackReported = {}
32
+ this.pageviewReported = {}
33
+ this.errorCache = {}
34
+ this.currentBody
35
+ this.errorOnPage = false
36
+
37
+ // this will need to change to match whatever ee we use in the instrument
38
+ this.ee.on('interactionSaved', (interaction) => this.onInteractionSaved(interaction))
39
+
40
+ // this will need to change to match whatever ee we use in the instrument
41
+ this.ee.on('interactionDiscarded', (interaction) => this.onInteractionDiscarded(interaction))
42
+
43
+ register('err', (...args) => this.storeError(...args), this.featureName, this.ee)
44
+ register('ierr', (...args) => this.storeError(...args), this.featureName, this.ee)
45
+
46
+ const harvestTimeSeconds = getConfigurationValue(this.agentIdentifier, 'jserrors.harvestTimeSeconds') || 10
47
+
48
+ const scheduler = new HarvestScheduler('jserrors', { onFinished: (...args) => this.onHarvestFinished(...args) }, this)
49
+ scheduler.harvest.on('jserrors', (...args) => this.onHarvestStarted(...args))
50
+
51
+ // Don't start harvesting until "drain" for this feat has been called (which currently requires RUM response).
52
+ this.ee.on(`drain-${this.featureName}`, () => {
53
+ if (!this.blocked) scheduler.startTimer(harvestTimeSeconds) // and only if ingest will accept jserror payloads
54
+ })
55
+
56
+ // If RUM-call's response determines that customer lacks entitlements for the /jserror ingest endpoint, don't harvest at all.
57
+ register('block-err', () => {
58
+ this.blocked = true
59
+ scheduler.stopTimer(true)
60
+ }, this.featureName, this.ee)
61
+
62
+ drain(this.agentIdentifier, this.featureName)
63
+ }
64
+
65
+ onHarvestStarted (options) {
66
+ // this gets rid of dependency in AJAX module
67
+ var body = this.aggregator.take(['err', 'ierr', 'xhr'])
68
+
69
+ if (options.retry) {
70
+ this.currentBody = body
71
+ }
72
+
73
+ var payload = { body: body, qs: {} }
74
+ var releaseIds = stringify(getRuntime(this.agentIdentifier).releaseIds)
75
+
76
+ if (releaseIds !== '{}') {
77
+ payload.qs.ri = releaseIds
78
+ }
79
+
80
+ if (body && body.err && body.err.length && !this.errorOnPage) {
81
+ payload.qs.pve = '1'
82
+ this.errorOnPage = true
83
+ }
84
+ return payload
85
+ }
86
+
87
+ onHarvestFinished (result) {
88
+ if (result.retry && this.currentBody) {
89
+ mapOwn(this.currentBody, (key, value) => {
90
+ for (var i = 0; i < value.length; i++) {
91
+ var bucket = value[i]
92
+ var name = this.getBucketName(bucket.params, bucket.custom)
93
+ this.aggregator.merge(key, name, bucket.metrics, bucket.params, bucket.custom)
94
+ }
95
+ })
96
+ this.currentBody = null
97
+ }
98
+ }
99
+
100
+ nameHash (params) {
101
+ return stringHashCode(`${params.exceptionClass}_${params.message}_${params.stack_trace || params.browser_stack_hash}`)
102
+ }
103
+
104
+ getBucketName (params, customParams) {
105
+ return this.nameHash(params) + ':' + stringHashCode(stringify(customParams))
106
+ }
107
+
108
+ canonicalizeURL (url, cleanedOrigin) {
109
+ if (typeof url !== 'string') return ''
110
+
111
+ var cleanedURL = cleanURL(url)
112
+ if (cleanedURL === cleanedOrigin) {
113
+ return '<inline>'
114
+ } else {
115
+ return cleanedURL
116
+ }
117
+ }
118
+
119
+ buildCanonicalStackString (stackInfo, cleanedOrigin) {
120
+ var canonicalStack = ''
121
+
122
+ for (var i = 0; i < stackInfo.frames.length; i++) {
123
+ var frame = stackInfo.frames[i]
124
+ var func = canonicalFunctionName(frame.func)
125
+
126
+ if (canonicalStack) canonicalStack += '\n'
127
+ if (func) canonicalStack += func + '@'
128
+ if (typeof frame.url === 'string') canonicalStack += frame.url
129
+ if (frame.line) canonicalStack += ':' + frame.line
130
+ }
131
+
132
+ return canonicalStack
133
+ }
134
+
135
+ // Strip query parameters and fragments from the stackString property of the
136
+ // given stackInfo, along with the 'url' properties of each frame in
137
+ // stackInfo.frames.
138
+ //
139
+ // Any URLs that are equivalent to the cleaned version of the origin will also
140
+ // be replaced with the string '<inline>'.
141
+ //
142
+ canonicalizeStackURLs (stackInfo) {
143
+ // Currently, loader.origin might contain a fragment, but we don't want to use it
144
+ // for comparing with frame URLs.
145
+ var cleanedOrigin = cleanURL(getRuntime(this.agentIdentifier).origin)
146
+
147
+ for (var i = 0; i < stackInfo.frames.length; i++) {
148
+ var frame = stackInfo.frames[i]
149
+ var originalURL = frame.url
150
+ var cleanedURL = this.canonicalizeURL(originalURL, cleanedOrigin)
151
+ if (cleanedURL && cleanedURL !== frame.url) {
152
+ frame.url = cleanedURL
153
+ stackInfo.stackString = stackInfo.stackString.split(originalURL).join(cleanedURL)
154
+ }
155
+ }
156
+
157
+ return stackInfo
158
+ }
159
+
160
+ storeError (err, time, internal, customAttributes) {
161
+ // are we in an interaction
162
+ time = time || now()
163
+ const agentRuntime = getRuntime(this.agentIdentifier)
164
+ let filterOutput
165
+
166
+ if (!internal && agentRuntime.onerror) {
167
+ filterOutput = agentRuntime.onerror(err)
168
+ if (filterOutput && !(typeof filterOutput.group === 'string' && filterOutput.group.length)) {
169
+ // All truthy values mean don't report (store) the error, per backwards-compatible usage,
170
+ // - EXCEPT if a fingerprinting label is returned, via an object with key of 'group' and value of non-empty string
171
+ return
172
+ }
173
+ // Again as with previous usage, all falsey values would include the error.
174
+ }
175
+
176
+ var stackInfo = this.canonicalizeStackURLs(computeStackTrace(err))
177
+ var canonicalStack = this.buildCanonicalStackString(stackInfo)
178
+
179
+ const params = {
180
+ stackHash: stringHashCode(canonicalStack),
181
+ exceptionClass: stackInfo.name,
182
+ request_uri: globalScope?.location.pathname
183
+ }
184
+ if (stackInfo.message) params.message = '' + stackInfo.message
185
+ // Notice if filterOutput isn't false|undefined OR our specified object, this func would've returned already (so it's unnecessary to req-check group).
186
+ // Do not modify the name ('errorGroup') of params without DEM approval!
187
+ if (filterOutput?.group) params.errorGroup = filterOutput.group
188
+
189
+ /**
190
+ * The bucketHash is different from the params.stackHash because the params.stackHash is based on the canonicalized
191
+ * stack trace and is used downstream in NR1 to attempt to group the same errors across different browsers. However,
192
+ * the canonical stack trace excludes items like the column number increasing the hit-rate of different errors potentially
193
+ * bucketing and ultimately resulting in the loss of data in NR1.
194
+ */
195
+ var bucketHash = stringHashCode(`${stackInfo.name}_${stackInfo.message}_${stackInfo.stackString}`)
196
+
197
+ if (!this.stackReported[bucketHash]) {
198
+ this.stackReported[bucketHash] = true
199
+ params.stack_trace = truncateSize(stackInfo.stackString)
200
+ } else {
201
+ params.browser_stack_hash = stringHashCode(stackInfo.stackString)
202
+ }
203
+ params.releaseIds = stringify(agentRuntime.releaseIds)
204
+
205
+ // When debugging stack canonicalization/hashing, uncomment these lines for
206
+ // more output in the test logs
207
+ // params.origStack = err.stack
208
+ // params.canonicalStack = canonicalStack
209
+
210
+ if (!this.pageviewReported[bucketHash]) {
211
+ params.pageview = 1
212
+ this.pageviewReported[bucketHash] = true
213
+ }
214
+
215
+ var type = internal ? 'ierr' : 'err'
216
+ var newMetrics = { time: time }
217
+
218
+ // stn and spa aggregators listen to this event - stn sends the error in its payload,
219
+ // and spa annotates the error with interaction info
220
+ handle('errorAgg', [type, bucketHash, params, newMetrics], undefined, FEATURE_NAMES.sessionTrace, this.ee)
221
+ handle('errorAgg', [type, bucketHash, params, newMetrics], undefined, FEATURE_NAMES.spa, this.ee)
222
+
223
+ // still send EE events for other features such as above, but stop this one from aggregating internal data
224
+ if (this.blocked) return
225
+ if (params._interactionId != null) {
226
+ // hold on to the error until the interaction finishes
227
+ this.errorCache[params._interactionId] = this.errorCache[params._interactionId] || []
228
+ this.errorCache[params._interactionId].push([type, bucketHash, params, newMetrics, att, customAttributes])
229
+ } else {
230
+ // store custom attributes
231
+ var customParams = {}
232
+ var att = getInfo(this.agentIdentifier).jsAttributes
233
+ mapOwn(att, setCustom)
234
+ if (customAttributes) {
235
+ mapOwn(customAttributes, setCustom)
236
+ }
237
+
238
+ var jsAttributesHash = stringHashCode(stringify(customParams))
239
+ var aggregateHash = bucketHash + ':' + jsAttributesHash
240
+ this.aggregator.store(type, aggregateHash, params, newMetrics, customParams)
241
+ }
242
+
243
+ function setCustom (key, val) {
244
+ customParams[key] = (val && typeof val === 'object' ? stringify(val) : val)
245
+ }
246
+ }
247
+
248
+ onInteractionSaved (interaction) {
249
+ if (!this.errorCache[interaction.id] || this.blocked) return
250
+
251
+ this.errorCache[interaction.id].forEach((item) => {
252
+ var customParams = {}
253
+ var globalCustomParams = item[4]
254
+ var localCustomParams = item[5]
255
+
256
+ mapOwn(globalCustomParams, setCustom)
257
+ mapOwn(interaction.root.attrs.custom, setCustom)
258
+ mapOwn(localCustomParams, setCustom)
259
+
260
+ var params = item[2]
261
+ params.browserInteractionId = interaction.root.attrs.id
262
+ delete params._interactionId
263
+
264
+ if (params._interactionNodeId) {
265
+ params.parentNodeId = params._interactionNodeId.toString()
266
+ delete params._interactionNodeId
267
+ }
268
+
269
+ var hash = item[1] + interaction.root.attrs.id
270
+ var jsAttributesHash = stringHashCode(stringify(customParams))
271
+ var aggregateHash = hash + ':' + jsAttributesHash
272
+
273
+ this.aggregator.store(item[0], aggregateHash, params, item[3], customParams)
274
+
275
+ function setCustom (key, val) {
276
+ customParams[key] = (val && typeof val === 'object' ? stringify(val) : val)
277
+ }
278
+ })
279
+ delete this.errorCache[interaction.id]
280
+ }
281
+
282
+ onInteractionDiscarded (interaction) {
283
+ if (!this.errorCache || !this.errorCache[interaction.id] || this.blocked) return
284
+
285
+ this.errorCache[interaction.id].forEach((item) => {
286
+ var customParams = {}
287
+ var globalCustomParams = item[4]
288
+ var localCustomParams = item[5]
289
+
290
+ mapOwn(globalCustomParams, setCustom)
291
+ mapOwn(interaction.root.attrs.custom, setCustom)
292
+ mapOwn(localCustomParams, setCustom)
293
+
294
+ var params = item[2]
295
+ delete params._interactionId
296
+ delete params._interactionNodeId
297
+
298
+ var hash = item[1]
299
+ var jsAttributesHash = stringHashCode(stringify(customParams))
300
+ var aggregateHash = hash + ':' + jsAttributesHash
301
+
302
+ this.aggregator.store(item[0], aggregateHash, item[2], item[3], customParams)
303
+
304
+ function setCustom (key, val) {
305
+ customParams[key] = (val && typeof val === 'object' ? stringify(val) : val)
306
+ }
307
+ })
308
+ delete this.errorCache[interaction.id]
309
+ }
310
+ }
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Copyright 2020 New Relic Corporation. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ export function stringHashCode (string) {
7
+ var hash = 0
8
+ var charVal
9
+
10
+ if (!string || !string.length) return hash
11
+ for (var i = 0; i < string.length; i++) {
12
+ charVal = string.charCodeAt(i)
13
+ hash = ((hash << 5) - hash) + charVal
14
+ hash = hash | 0 // Convert to 32bit integer
15
+ }
16
+ return hash
17
+ }