@newrelic/browser-agent 0.0.9 → 0.1.229

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 (339) hide show
  1. package/README.md +84 -207
  2. package/dist/cjs/cdn/lite.js +14 -0
  3. package/dist/cjs/cdn/polyfills/lite.js +4 -0
  4. package/dist/cjs/cdn/polyfills/pro.js +4 -0
  5. package/dist/cjs/cdn/polyfills/spa.js +4 -0
  6. package/dist/cjs/cdn/polyfills.js +14 -0
  7. package/dist/cjs/cdn/pro.js +19 -0
  8. package/dist/cjs/cdn/spa.js +19 -0
  9. package/dist/cjs/cdn/worker.js +16 -0
  10. package/dist/cjs/common/aggregate/aggregator.js +168 -0
  11. package/dist/cjs/common/browser-version/firefox-version.js +17 -0
  12. package/dist/cjs/common/browser-version/ios-version.js +18 -0
  13. package/dist/cjs/common/config/config.js +76 -0
  14. package/dist/cjs/common/config/state/configurable.js +32 -0
  15. package/dist/cjs/common/config/state/info.js +50 -0
  16. package/dist/cjs/common/config/state/init.js +86 -0
  17. package/dist/cjs/common/config/state/loader-config.js +28 -0
  18. package/dist/cjs/common/config/state/originals.js +9 -0
  19. package/dist/cjs/common/config/state/runtime.js +50 -0
  20. package/dist/cjs/common/constants/environment-variables.js +20 -0
  21. package/dist/cjs/common/context/shared-context.js +25 -0
  22. package/dist/cjs/common/deny-list/deny-list.js +108 -0
  23. package/dist/cjs/common/drain/drain.js +126 -0
  24. package/dist/cjs/common/event-emitter/contextual-ee.js +149 -0
  25. package/dist/cjs/common/event-emitter/handle.js +24 -0
  26. package/dist/cjs/common/event-emitter/register-handler.js +24 -0
  27. package/dist/cjs/common/event-listener/event-listener-opts.js +46 -0
  28. package/dist/cjs/common/harvest/harvest-scheduler.js +111 -0
  29. package/dist/cjs/common/harvest/harvest.js +236 -0
  30. package/dist/cjs/common/ids/id.js +30 -0
  31. package/dist/cjs/common/ids/unique-id.js +84 -0
  32. package/dist/cjs/common/metrics/framework-detection.js +72 -0
  33. package/dist/cjs/common/metrics/paint-metrics.js +13 -0
  34. package/dist/cjs/common/serialize/bel-serializer.js +89 -0
  35. package/dist/cjs/common/timing/nav-timing.js +77 -0
  36. package/dist/cjs/common/timing/now.js +15 -0
  37. package/dist/cjs/common/unload/eol.js +69 -0
  38. package/dist/cjs/common/url/clean-url.js +16 -0
  39. package/dist/cjs/common/url/encode.js +79 -0
  40. package/dist/cjs/common/url/location.js +14 -0
  41. package/dist/cjs/common/url/parse-url.js +66 -0
  42. package/dist/cjs/common/url/protocol.js +25 -0
  43. package/dist/cjs/common/util/console.js +17 -0
  44. package/dist/cjs/common/util/data-size.js +25 -0
  45. package/dist/cjs/common/util/feature-flags.js +42 -0
  46. package/dist/cjs/common/util/get-or-set.js +39 -0
  47. package/dist/cjs/common/util/global-scope.js +56 -0
  48. package/dist/cjs/common/util/map-own.js +24 -0
  49. package/dist/cjs/common/util/obfuscate.js +76 -0
  50. package/dist/cjs/common/util/reduce.js +22 -0
  51. package/dist/cjs/common/util/s-hash.js +19 -0
  52. package/dist/cjs/common/util/single.js +23 -0
  53. package/dist/cjs/common/util/stringify.js +47 -0
  54. package/dist/cjs/common/util/submit-data.js +99 -0
  55. package/dist/cjs/common/util/traverse.js +41 -0
  56. package/dist/cjs/common/util/user-agent.js +57 -0
  57. package/dist/cjs/common/window/load.js +19 -0
  58. package/dist/cjs/common/window/nreum.js +107 -0
  59. package/dist/cjs/common/window/page-visibility.js +28 -0
  60. package/dist/cjs/common/window/session-storage.js +42 -0
  61. package/dist/cjs/common/window/supports-performance-observer.js +15 -0
  62. package/dist/cjs/common/window/top-level-callers.js +23 -0
  63. package/dist/cjs/common/wrap/index.js +68 -0
  64. package/dist/cjs/common/wrap/wrap-events.js +105 -0
  65. package/dist/cjs/common/wrap/wrap-fetch.js +114 -0
  66. package/dist/cjs/common/wrap/wrap-function.js +269 -0
  67. package/dist/cjs/common/wrap/wrap-history.js +56 -0
  68. package/dist/cjs/common/wrap/wrap-jsonp.js +129 -0
  69. package/dist/cjs/common/wrap/wrap-mutation.js +61 -0
  70. package/dist/cjs/common/wrap/wrap-promise.js +160 -0
  71. package/dist/cjs/common/wrap/wrap-raf.js +55 -0
  72. package/dist/cjs/common/wrap/wrap-timer.js +70 -0
  73. package/dist/cjs/common/wrap/wrap-xhr.js +206 -0
  74. package/dist/cjs/features/ajax/aggregate/index.js +226 -0
  75. package/dist/cjs/features/ajax/constants.js +9 -0
  76. package/dist/cjs/features/ajax/index.js +12 -0
  77. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +145 -0
  78. package/dist/cjs/features/ajax/instrument/index.js +338 -0
  79. package/dist/cjs/features/ajax/instrument/response-size.js +26 -0
  80. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.js +18 -0
  81. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.test.js +30 -0
  82. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +216 -0
  83. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.test.js +257 -0
  84. package/dist/cjs/features/jserrors/aggregate/format-stack-trace.js +36 -0
  85. package/dist/cjs/features/jserrors/aggregate/format-stack-trace.test.js +39 -0
  86. package/dist/cjs/features/jserrors/aggregate/index.js +267 -0
  87. package/dist/cjs/features/jserrors/aggregate/string-hash-code.js +23 -0
  88. package/dist/cjs/features/jserrors/aggregate/string-hash-code.test.js +26 -0
  89. package/dist/cjs/features/jserrors/constants.js +11 -0
  90. package/dist/cjs/features/jserrors/index.js +12 -0
  91. package/dist/cjs/features/jserrors/instrument/debug.js +40 -0
  92. package/dist/cjs/features/jserrors/instrument/index.js +158 -0
  93. package/dist/cjs/features/metrics/aggregate/index.js +136 -0
  94. package/dist/cjs/features/metrics/constants.js +17 -0
  95. package/dist/cjs/features/metrics/index.js +12 -0
  96. package/dist/cjs/features/metrics/instrument/index.js +20 -0
  97. package/dist/cjs/features/metrics/instrument/workers-helper.js +121 -0
  98. package/dist/cjs/features/page_action/aggregate/index.js +112 -0
  99. package/dist/cjs/features/page_action/constants.js +9 -0
  100. package/dist/cjs/features/page_action/index.js +12 -0
  101. package/dist/cjs/features/page_action/instrument/index.js +21 -0
  102. package/dist/cjs/features/page_view_event/aggregate/index.js +133 -0
  103. package/dist/cjs/features/page_view_event/aggregate/initialized-features.js +39 -0
  104. package/dist/cjs/features/page_view_event/constants.js +15 -0
  105. package/dist/cjs/features/page_view_event/index.js +12 -0
  106. package/dist/cjs/features/page_view_event/instrument/index.js +38 -0
  107. package/dist/cjs/features/page_view_timing/aggregate/index.js +265 -0
  108. package/dist/cjs/features/page_view_timing/constants.js +9 -0
  109. package/dist/cjs/features/page_view_timing/first-paint.js +50 -0
  110. package/dist/cjs/features/page_view_timing/index.js +12 -0
  111. package/dist/cjs/features/page_view_timing/instrument/index.js +36 -0
  112. package/dist/cjs/features/page_view_timing/long-tasks.js +75 -0
  113. package/dist/cjs/features/session_trace/aggregate/index.js +375 -0
  114. package/dist/cjs/features/session_trace/constants.js +32 -0
  115. package/dist/cjs/features/session_trace/index.js +12 -0
  116. package/dist/cjs/features/session_trace/instrument/index.js +133 -0
  117. package/dist/cjs/features/spa/aggregate/index.js +684 -0
  118. package/dist/cjs/features/spa/aggregate/interaction-node.js +84 -0
  119. package/dist/cjs/features/spa/aggregate/interaction-node.test.js +16 -0
  120. package/dist/cjs/features/spa/aggregate/interaction.js +98 -0
  121. package/dist/cjs/features/spa/aggregate/serializer.js +147 -0
  122. package/dist/cjs/features/spa/constants.js +53 -0
  123. package/dist/cjs/features/spa/index.js +12 -0
  124. package/dist/cjs/features/spa/instrument/index.js +114 -0
  125. package/dist/cjs/features/utils/aggregate-base.js +13 -0
  126. package/dist/cjs/features/utils/feature-base.js +58 -0
  127. package/dist/cjs/features/utils/handler-cache.js +64 -0
  128. package/dist/cjs/features/utils/instrument-base.js +71 -0
  129. package/dist/cjs/features/utils/lazy-loader.js +44 -0
  130. package/dist/cjs/index.js +81 -58
  131. package/dist/cjs/loaders/agent.js +86 -0
  132. package/dist/cjs/loaders/api/api.js +109 -0
  133. package/dist/cjs/loaders/api/apiAsync.js +94 -0
  134. package/dist/cjs/loaders/browser-agent.js +29 -0
  135. package/dist/cjs/loaders/configure/configure.js +47 -0
  136. package/dist/cjs/loaders/features/enabled-features.js +19 -0
  137. package/dist/cjs/loaders/features/featureDependencies.js +32 -0
  138. package/dist/cjs/loaders/features/features.js +33 -0
  139. package/dist/cjs/loaders/micro-agent.js +93 -0
  140. package/dist/cjs/loaders/worker-agent.js +24 -0
  141. package/dist/esm/cdn/lite.js +12 -0
  142. package/dist/esm/cdn/polyfills/lite.js +7 -0
  143. package/dist/esm/cdn/polyfills/pro.js +7 -0
  144. package/dist/esm/cdn/polyfills/spa.js +7 -0
  145. package/dist/esm/cdn/polyfills.js +17 -0
  146. package/dist/esm/cdn/pro.js +17 -0
  147. package/dist/esm/cdn/spa.js +17 -0
  148. package/dist/esm/cdn/worker.js +14 -0
  149. package/dist/esm/common/aggregate/aggregator.js +161 -0
  150. package/dist/esm/common/browser-version/firefox-version.js +10 -0
  151. package/dist/esm/common/browser-version/ios-version.js +10 -0
  152. package/dist/esm/common/config/config.js +11 -0
  153. package/dist/esm/common/config/state/configurable.js +25 -0
  154. package/dist/esm/common/config/state/info.js +42 -0
  155. package/dist/esm/common/config/state/init.js +78 -0
  156. package/dist/esm/common/config/state/loader-config.js +21 -0
  157. package/dist/esm/common/config/state/originals.js +2 -0
  158. package/dist/esm/common/config/state/runtime.js +41 -0
  159. package/dist/esm/common/constants/environment-variables.js +11 -0
  160. package/dist/esm/common/context/shared-context.js +18 -0
  161. package/dist/esm/common/deny-list/deny-list.js +101 -0
  162. package/dist/esm/common/drain/drain.js +119 -0
  163. package/dist/esm/common/event-emitter/contextual-ee.js +142 -0
  164. package/dist/esm/common/event-emitter/handle.js +16 -0
  165. package/dist/esm/common/event-emitter/register-handler.js +19 -0
  166. package/dist/esm/common/event-listener/event-listener-opts.js +39 -0
  167. package/dist/esm/common/harvest/harvest-scheduler.js +105 -0
  168. package/dist/esm/common/harvest/harvest.js +228 -0
  169. package/dist/esm/common/ids/id.js +23 -0
  170. package/dist/esm/common/ids/unique-id.js +75 -0
  171. package/dist/esm/common/metrics/framework-detection.js +66 -0
  172. package/dist/esm/common/metrics/paint-metrics.js +6 -0
  173. package/dist/esm/common/serialize/bel-serializer.js +80 -0
  174. package/dist/esm/common/timing/nav-timing.js +67 -0
  175. package/dist/esm/common/timing/now.js +9 -0
  176. package/dist/esm/common/unload/eol.js +62 -0
  177. package/dist/esm/common/url/clean-url.js +10 -0
  178. package/dist/esm/common/url/encode.js +71 -0
  179. package/dist/esm/common/url/location.js +8 -0
  180. package/dist/esm/common/url/parse-url.js +60 -0
  181. package/dist/esm/common/url/protocol.js +17 -0
  182. package/dist/esm/common/util/console.js +11 -0
  183. package/dist/esm/common/util/data-size.js +19 -0
  184. package/dist/esm/common/util/feature-flags.js +33 -0
  185. package/dist/esm/common/util/get-or-set.js +33 -0
  186. package/dist/esm/common/util/global-scope.js +44 -0
  187. package/dist/esm/common/util/map-own.js +18 -0
  188. package/dist/esm/common/util/obfuscate.js +67 -0
  189. package/dist/esm/common/util/reduce.js +16 -0
  190. package/dist/esm/common/util/s-hash.js +13 -0
  191. package/dist/esm/common/util/single.js +16 -0
  192. package/dist/esm/common/util/stringify.js +42 -0
  193. package/dist/esm/common/util/submit-data.js +91 -0
  194. package/dist/esm/common/util/traverse.js +35 -0
  195. package/dist/esm/common/util/user-agent.js +48 -0
  196. package/dist/esm/common/window/load.js +12 -0
  197. package/dist/esm/common/window/nreum.js +91 -0
  198. package/dist/esm/common/window/page-visibility.js +23 -0
  199. package/dist/esm/common/window/session-storage.js +36 -0
  200. package/dist/esm/common/window/supports-performance-observer.js +9 -0
  201. package/dist/esm/common/window/top-level-callers.js +17 -0
  202. package/dist/esm/common/wrap/index.js +14 -0
  203. package/dist/esm/common/wrap/wrap-events.js +97 -0
  204. package/dist/esm/common/wrap/wrap-fetch.js +105 -0
  205. package/dist/esm/common/wrap/wrap-function.js +257 -0
  206. package/dist/esm/common/wrap/wrap-history.js +48 -0
  207. package/dist/esm/common/wrap/wrap-jsonp.js +122 -0
  208. package/dist/esm/common/wrap/wrap-mutation.js +54 -0
  209. package/dist/esm/common/wrap/wrap-promise.js +153 -0
  210. package/dist/esm/common/wrap/wrap-raf.js +48 -0
  211. package/dist/esm/common/wrap/wrap-timer.js +63 -0
  212. package/dist/esm/common/wrap/wrap-xhr.js +199 -0
  213. package/dist/esm/features/ajax/aggregate/index.js +218 -0
  214. package/dist/esm/features/ajax/constants.js +2 -0
  215. package/dist/esm/features/ajax/index.js +1 -0
  216. package/dist/esm/features/ajax/instrument/distributed-tracing.js +137 -0
  217. package/dist/esm/features/ajax/instrument/index.js +330 -0
  218. package/dist/esm/features/ajax/instrument/response-size.js +19 -0
  219. package/dist/esm/features/jserrors/aggregate/canonical-function-name.js +12 -0
  220. package/dist/esm/features/jserrors/aggregate/canonical-function-name.test.js +28 -0
  221. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +209 -0
  222. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.test.js +255 -0
  223. package/dist/esm/features/jserrors/aggregate/format-stack-trace.js +29 -0
  224. package/dist/esm/features/jserrors/aggregate/format-stack-trace.test.js +37 -0
  225. package/dist/esm/features/jserrors/aggregate/index.js +260 -0
  226. package/dist/esm/features/jserrors/aggregate/string-hash-code.js +17 -0
  227. package/dist/esm/features/jserrors/aggregate/string-hash-code.test.js +24 -0
  228. package/dist/esm/features/jserrors/constants.js +3 -0
  229. package/dist/esm/features/jserrors/index.js +1 -0
  230. package/dist/esm/features/jserrors/instrument/debug.js +38 -0
  231. package/dist/esm/features/jserrors/instrument/index.js +150 -0
  232. package/dist/esm/features/metrics/aggregate/index.js +129 -0
  233. package/dist/esm/features/metrics/constants.js +6 -0
  234. package/dist/esm/features/metrics/index.js +1 -0
  235. package/dist/esm/features/metrics/instrument/index.js +13 -0
  236. package/dist/esm/features/metrics/instrument/workers-helper.js +116 -0
  237. package/dist/esm/features/page_action/aggregate/index.js +105 -0
  238. package/dist/esm/features/page_action/constants.js +2 -0
  239. package/dist/esm/features/page_action/index.js +1 -0
  240. package/dist/esm/features/page_action/instrument/index.js +14 -0
  241. package/dist/esm/features/page_view_event/aggregate/index.js +124 -0
  242. package/dist/esm/features/page_view_event/aggregate/initialized-features.js +34 -0
  243. package/dist/esm/features/page_view_event/constants.js +5 -0
  244. package/dist/esm/features/page_view_event/index.js +1 -0
  245. package/dist/esm/features/page_view_event/instrument/index.js +29 -0
  246. package/dist/esm/features/page_view_timing/aggregate/index.js +258 -0
  247. package/dist/esm/features/page_view_timing/constants.js +2 -0
  248. package/dist/esm/features/page_view_timing/first-paint.js +43 -0
  249. package/dist/esm/features/page_view_timing/index.js +1 -0
  250. package/dist/esm/features/page_view_timing/instrument/index.js +28 -0
  251. package/dist/esm/features/page_view_timing/long-tasks.js +69 -0
  252. package/dist/esm/features/session_trace/aggregate/index.js +366 -0
  253. package/dist/esm/features/session_trace/constants.js +14 -0
  254. package/dist/esm/features/session_trace/index.js +1 -0
  255. package/dist/esm/features/session_trace/instrument/index.js +123 -0
  256. package/dist/esm/features/spa/aggregate/index.js +674 -0
  257. package/dist/esm/features/spa/aggregate/interaction-node.js +78 -0
  258. package/dist/esm/features/spa/aggregate/interaction-node.test.js +14 -0
  259. package/dist/esm/features/spa/aggregate/interaction.js +92 -0
  260. package/dist/esm/features/spa/aggregate/serializer.js +139 -0
  261. package/dist/esm/features/spa/constants.js +25 -0
  262. package/dist/esm/features/spa/index.js +1 -0
  263. package/dist/esm/features/spa/instrument/index.js +104 -0
  264. package/dist/esm/features/utils/aggregate-base.js +6 -0
  265. package/dist/esm/features/utils/feature-base.js +51 -0
  266. package/dist/esm/features/utils/handler-cache.js +57 -0
  267. package/dist/esm/features/utils/instrument-base.js +69 -0
  268. package/dist/esm/features/utils/lazy-loader.js +37 -0
  269. package/dist/esm/index.js +15 -0
  270. package/dist/esm/loaders/agent.js +77 -0
  271. package/dist/esm/loaders/api/api.js +104 -0
  272. package/dist/esm/loaders/api/apiAsync.js +88 -0
  273. package/dist/esm/loaders/browser-agent.js +23 -0
  274. package/dist/esm/loaders/configure/configure.js +41 -0
  275. package/dist/esm/loaders/features/enabled-features.js +13 -0
  276. package/dist/esm/loaders/features/featureDependencies.js +25 -0
  277. package/dist/esm/loaders/features/features.js +25 -0
  278. package/dist/esm/loaders/micro-agent.js +86 -0
  279. package/dist/esm/loaders/worker-agent.js +18 -0
  280. package/package.json +204 -71
  281. package/types.ts +221 -0
  282. package/dist/bundled/es5/index.js +0 -2
  283. package/dist/bundled/es5/index.js.map +0 -1
  284. package/dist/bundled/es6/index.js +0 -2
  285. package/dist/bundled/es6/index.js.map +0 -1
  286. package/dist/cjs/index.d.ts +0 -19
  287. package/dist/cjs/index.js.map +0 -1
  288. package/dist/cjs/types.d.ts +0 -94
  289. package/dist/cjs/types.js +0 -28
  290. package/dist/cjs/types.js.map +0 -1
  291. package/dist/cjs/utils/api/api.d.ts +0 -10
  292. package/dist/cjs/utils/api/api.js +0 -40
  293. package/dist/cjs/utils/api/api.js.map +0 -1
  294. package/dist/cjs/utils/config/build-configs.d.ts +0 -6
  295. package/dist/cjs/utils/config/build-configs.js +0 -68
  296. package/dist/cjs/utils/config/build-configs.js.map +0 -1
  297. package/dist/cjs/utils/features/features.d.ts +0 -5
  298. package/dist/cjs/utils/features/features.js +0 -14
  299. package/dist/cjs/utils/features/features.js.map +0 -1
  300. package/dist/cjs/utils/features/initialize.d.ts +0 -5
  301. package/dist/cjs/utils/features/initialize.js +0 -51
  302. package/dist/cjs/utils/features/initialize.js.map +0 -1
  303. package/dist/es/index.d.ts +0 -19
  304. package/dist/es/index.js +0 -55
  305. package/dist/es/index.js.map +0 -1
  306. package/dist/es/types.d.ts +0 -94
  307. package/dist/es/types.js +0 -24
  308. package/dist/es/types.js.map +0 -1
  309. package/dist/es/utils/api/api.d.ts +0 -10
  310. package/dist/es/utils/api/api.js +0 -36
  311. package/dist/es/utils/api/api.js.map +0 -1
  312. package/dist/es/utils/config/build-configs.d.ts +0 -6
  313. package/dist/es/utils/config/build-configs.js +0 -64
  314. package/dist/es/utils/config/build-configs.js.map +0 -1
  315. package/dist/es/utils/features/features.d.ts +0 -5
  316. package/dist/es/utils/features/features.js +0 -10
  317. package/dist/es/utils/features/features.js.map +0 -1
  318. package/dist/es/utils/features/initialize.d.ts +0 -5
  319. package/dist/es/utils/features/initialize.js +0 -24
  320. package/dist/es/utils/features/initialize.js.map +0 -1
  321. package/dist/umd/index.d.ts +0 -19
  322. package/dist/umd/index.js +0 -69
  323. package/dist/umd/index.js.map +0 -1
  324. package/dist/umd/types.d.ts +0 -94
  325. package/dist/umd/types.js +0 -38
  326. package/dist/umd/types.js.map +0 -1
  327. package/dist/umd/utils/api/api.d.ts +0 -10
  328. package/dist/umd/utils/api/api.js +0 -50
  329. package/dist/umd/utils/api/api.js.map +0 -1
  330. package/dist/umd/utils/config/build-configs.d.ts +0 -6
  331. package/dist/umd/utils/config/build-configs.js +0 -78
  332. package/dist/umd/utils/config/build-configs.js.map +0 -1
  333. package/dist/umd/utils/features/features.d.ts +0 -5
  334. package/dist/umd/utils/features/features.js +0 -24
  335. package/dist/umd/utils/features/features.js.map +0 -1
  336. package/dist/umd/utils/features/initialize.d.ts +0 -5
  337. package/dist/umd/utils/features/initialize.js +0 -63
  338. package/dist/umd/utils/features/initialize.js.map +0 -1
  339. package/dist/webpack-analysis.html +0 -38
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+
3
+ var _faker = require("@faker-js/faker");
4
+ var _testingUtils = require("../../../../tools/testing-utils");
5
+ var _computeStackTrace = require("./compute-stack-trace");
6
+ const baseMockError = {
7
+ toString: 'RangeError: Invalid array length',
8
+ name: 'RangeError',
9
+ constructor: 'function RangeError() { [native code] }',
10
+ message: 'Invalid array length',
11
+ 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)'
12
+ };
13
+ test('parsing should return a failure for a null error object', () => {
14
+ const result = (0, _computeStackTrace.computeStackTrace)(null);
15
+ expect(result).toEqual(expect.objectContaining({
16
+ mode: 'failed',
17
+ stackString: '',
18
+ frames: []
19
+ }));
20
+ });
21
+ describe('errors with stack property', () => {
22
+ test('parsed name should be unknown when name and constructor are missing', () => {
23
+ const mockError = _testingUtils.browserErrorUtils.constructError({
24
+ ...baseMockError,
25
+ name: null,
26
+ constructor: null
27
+ });
28
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
29
+ expect(result).toEqual(expect.objectContaining({
30
+ mode: 'stack',
31
+ name: 'unknown',
32
+ message: mockError.message,
33
+ stackString: mockError.stack
34
+ }));
35
+ });
36
+ test('parsed stack should not contain nrWrapper', () => {
37
+ const alteredError = baseMockError;
38
+ alteredError.stack += '\n at nrWrapper (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html?loader=spa:60:17)';
39
+ const mockError = _testingUtils.browserErrorUtils.constructError(alteredError);
40
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
41
+ expect(result).toEqual(expect.objectContaining({
42
+ mode: 'stack',
43
+ name: mockError.name,
44
+ message: mockError.message,
45
+ stackString: expect.not.stringContaining('nrWrapper')
46
+ }));
47
+ expect(result.frames).not.toContainEqual(expect.objectContaining({
48
+ func: 'nrWrapper'
49
+ }));
50
+ });
51
+ test('stack should still parse when column numbers are missing', () => {
52
+ const mockError = _testingUtils.browserErrorUtils.constructError({
53
+ ...baseMockError,
54
+ stack: '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)'
55
+ });
56
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
57
+ expect(result).toEqual(expect.objectContaining({
58
+ mode: 'stack',
59
+ name: mockError.name,
60
+ message: mockError.message,
61
+ stackString: mockError.stack
62
+ }));
63
+ expect(result.frames.length).toEqual(3);
64
+ expect(result.frames).toContainEqual(expect.objectContaining({
65
+ func: 'errorTest',
66
+ column: null
67
+ }));
68
+ expect(result.frames).toContainEqual(expect.objectContaining({
69
+ func: 'captureError',
70
+ column: null
71
+ }));
72
+ expect(result.frames).toContainEqual(expect.objectContaining({
73
+ func: 'onload',
74
+ column: null
75
+ }));
76
+ });
77
+ test('parser can handle chrome eval stack', () => {
78
+ const mockError = _testingUtils.browserErrorUtils.constructError({
79
+ ...baseMockError,
80
+ stack: ' at foobar (eval at foobar (http://bam-test-1.nr-local.net:3334/tests/assets/instrumented.html))'
81
+ });
82
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
83
+ expect(result).toEqual(expect.objectContaining({
84
+ mode: 'stack',
85
+ name: mockError.name,
86
+ message: mockError.message,
87
+ stackString: mockError.stack
88
+ }));
89
+ expect(result.frames.length).toEqual(1);
90
+ expect(result.frames).toContainEqual(expect.objectContaining({
91
+ func: 'evaluated code'
92
+ }));
93
+ });
94
+ test('parser can handle ie eval stack', () => {
95
+ const mockError = _testingUtils.browserErrorUtils.constructError({
96
+ toString: 'TypeError: Permission denied',
97
+ name: 'TypeError',
98
+ constructor: '\nfunction TypeError() {\n [native code]\n}\n',
99
+ message: 'Permission denied',
100
+ stack: ' at Function code (Function code:23:23)'
101
+ });
102
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
103
+ expect(result).toEqual(expect.objectContaining({
104
+ mode: 'stack',
105
+ name: mockError.name,
106
+ message: mockError.message,
107
+ stackString: mockError.stack
108
+ }));
109
+ expect(result.frames.length).toEqual(1);
110
+ expect(result.frames).toContainEqual(expect.objectContaining({
111
+ func: 'evaluated code'
112
+ }));
113
+ });
114
+ test('parser can handle stack with anonymous function', () => {
115
+ const mockError = _testingUtils.browserErrorUtils.constructError({
116
+ ...baseMockError,
117
+ stack: 'anonymous'
118
+ });
119
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
120
+ expect(result).toEqual(expect.objectContaining({
121
+ mode: 'stack',
122
+ name: mockError.name,
123
+ message: mockError.message,
124
+ stackString: mockError.stack
125
+ }));
126
+ expect(result.frames.length).toEqual(1);
127
+ expect(result.frames).toContainEqual(expect.objectContaining({
128
+ func: 'evaluated code'
129
+ }));
130
+ });
131
+ });
132
+ describe('errors without stack property and with line property', () => {
133
+ /**
134
+ * @deprecated sourceURL is no longer present in errors for any browsers we support
135
+ */
136
+ test('parsed stack should contain sourceURL and line number', () => {
137
+ const sourceURL = _faker.faker.internet.url();
138
+ const mockError = _testingUtils.browserErrorUtils.constructError({
139
+ ...baseMockError,
140
+ stack: undefined,
141
+ line: 100,
142
+ sourceURL
143
+ });
144
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
145
+ expect(result).toEqual(expect.objectContaining({
146
+ mode: 'sourceline',
147
+ name: mockError.name,
148
+ message: mockError.message,
149
+ stackString: `${mockError.name}: ${mockError.message}\n at ${sourceURL}:${mockError.line}`
150
+ }));
151
+ expect(result.frames.length).toEqual(1);
152
+ expect(result.frames).toContainEqual(expect.objectContaining({
153
+ url: sourceURL,
154
+ line: mockError.line
155
+ }));
156
+ });
157
+
158
+ /**
159
+ * @deprecated sourceURL is no longer present in errors for any browsers we support
160
+ */
161
+ test('parsed stack should contain sourceURL, line number, and column number', () => {
162
+ const sourceURL = _faker.faker.internet.url();
163
+ const mockError = _testingUtils.browserErrorUtils.constructError({
164
+ ...baseMockError,
165
+ line: 100,
166
+ column: 200,
167
+ stack: undefined,
168
+ sourceURL
169
+ });
170
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
171
+ expect(result).toEqual(expect.objectContaining({
172
+ mode: 'sourceline',
173
+ name: mockError.name,
174
+ message: mockError.message,
175
+ stackString: `${mockError.name}: ${mockError.message}\n at ${sourceURL}:${mockError.line}:${mockError.column}`
176
+ }));
177
+ expect(result.frames.length).toEqual(1);
178
+ expect(result.frames).toContainEqual(expect.objectContaining({
179
+ url: sourceURL,
180
+ line: mockError.line,
181
+ column: mockError.column
182
+ }));
183
+ });
184
+ test('parsed stack should contain "evaluated code" if sourceURL property is not present', () => {
185
+ const mockError = _testingUtils.browserErrorUtils.constructError({
186
+ ...baseMockError,
187
+ line: 100,
188
+ column: 200,
189
+ stack: undefined
190
+ });
191
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
192
+ expect(result).toEqual(expect.objectContaining({
193
+ mode: 'sourceline',
194
+ name: mockError.name,
195
+ message: mockError.message,
196
+ stackString: `RangeError: ${mockError.message}\n in evaluated code`
197
+ }));
198
+ expect(result.frames.length).toEqual(1);
199
+ expect(result.frames).toContainEqual(expect.objectContaining({
200
+ func: 'evaluated code'
201
+ }));
202
+ });
203
+
204
+ // TODO: computeStackTraceBySourceAndLine does not respect firefox lineNumber and columnNumber properties when stack is empty
205
+ });
206
+
207
+ /**
208
+ * These tests are here because JS allows you to throw absolutely anything as an
209
+ * error, including primitives.
210
+ */
211
+ describe('errors that are messages only or primitives', () => {
212
+ test('parser should get error name from constructor', () => {
213
+ const mockError = _testingUtils.browserErrorUtils.constructError({
214
+ toString: '0',
215
+ constructor: 'function Number() { [native code] }'
216
+ });
217
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
218
+ expect(result).toEqual(expect.objectContaining({
219
+ mode: 'nameonly',
220
+ name: 'Number',
221
+ stackString: 'Number: undefined',
222
+ frames: []
223
+ }));
224
+ });
225
+ test('parser should get error name from name property', () => {
226
+ const mockError = _testingUtils.browserErrorUtils.constructError({
227
+ toString: '0',
228
+ name: _faker.faker.datatype.uuid(),
229
+ constructor: 'function Number() { [native code] }'
230
+ });
231
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
232
+ expect(result).toEqual(expect.objectContaining({
233
+ mode: 'nameonly',
234
+ name: mockError.name,
235
+ stackString: `${mockError.name}: undefined`,
236
+ frames: []
237
+ }));
238
+ });
239
+ test('parser should include the message property', () => {
240
+ const mockError = _testingUtils.browserErrorUtils.constructError({
241
+ toString: '0',
242
+ name: _faker.faker.datatype.uuid(),
243
+ message: _faker.faker.datatype.uuid(),
244
+ constructor: 'function Number() { [native code] }'
245
+ });
246
+ const result = (0, _computeStackTrace.computeStackTrace)(mockError);
247
+ expect(result).toEqual(expect.objectContaining({
248
+ mode: 'nameonly',
249
+ name: mockError.name,
250
+ message: mockError.message,
251
+ stackString: `${mockError.name}: ${mockError.message}`,
252
+ frames: []
253
+ }));
254
+ });
255
+ });
256
+
257
+ // describe('')
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.formatStackTrace = formatStackTrace;
7
+ exports.truncateSize = truncateSize;
8
+ /*
9
+ * Copyright 2020 New Relic Corporation. All rights reserved.
10
+ * SPDX-License-Identifier: Apache-2.0
11
+ */
12
+
13
+ var stripNewlinesRegex = /^\n+|\n+$/g;
14
+ var MAX_STACK_TRACE_LENGTH = 65530;
15
+ function formatStackTrace(stackLines) {
16
+ return truncateStackLines(stackLines).replace(stripNewlinesRegex, '');
17
+ }
18
+
19
+ // takes array of stack lines and returns string with top 50 and buttom 50 lines
20
+ function truncateStackLines(stackLines) {
21
+ var stackString;
22
+ if (stackLines.length > 100) {
23
+ var truncatedLines = stackLines.length - 100;
24
+ stackString = stackLines.slice(0, 50).join('\n');
25
+ stackString += '\n< ...truncated ' + truncatedLines + ' lines... >\n';
26
+ stackString += stackLines.slice(-50).join('\n');
27
+ } else {
28
+ stackString = stackLines.join('\n');
29
+ }
30
+ return stackString;
31
+ }
32
+
33
+ // truncates stack string to limit what is sent to backend
34
+ function truncateSize(stackString) {
35
+ return stackString.length > MAX_STACK_TRACE_LENGTH ? stackString.substr(0, MAX_STACK_TRACE_LENGTH) : stackString;
36
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ var _faker = require("@faker-js/faker");
4
+ var _formatStackTrace = require("./format-stack-trace");
5
+ describe('formatStackTrace', () => {
6
+ test.each([{
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'],
12
+ expected: 'line 1\nline 2',
13
+ title: 'Strips leading empty stack frame'
14
+ }, {
15
+ input: ['line 1', 'line 2', ''],
16
+ expected: 'line 1\nline 2',
17
+ title: 'Strips ending empty stack frame'
18
+ }])('$title', ({
19
+ input,
20
+ expected
21
+ }) => {
22
+ const result = (0, _formatStackTrace.formatStackTrace)(input);
23
+ expect(result).toEqual(expected);
24
+ });
25
+ test('truncates the middle of the stack lines when more than 100', () => {
26
+ const input = Array.apply(null, Array(200)).map(() => _faker.faker.datatype.uuid());
27
+ const expected = input.slice(0, 50).join('\n') + `\n< ...truncated ${input.length - 100} lines... >\n` + input.slice(-50).join('\n');
28
+ const result = (0, _formatStackTrace.formatStackTrace)(input);
29
+ expect(result).toEqual(expected);
30
+ });
31
+ });
32
+ describe('truncateSize', () => {
33
+ test('should truncate stack string to max limit', () => {
34
+ const maxSize = 65530;
35
+ const input = _faker.faker.datatype.string(maxSize + 1);
36
+ const result = (0, _formatStackTrace.truncateSize)(input);
37
+ expect(result).toEqual(input.slice(0, maxSize));
38
+ });
39
+ });
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Aggregate = void 0;
7
+ var _canonicalFunctionName = require("./canonical-function-name");
8
+ var _cleanUrl = require("../../../common/url/clean-url");
9
+ var _computeStackTrace = require("./compute-stack-trace");
10
+ var _stringHashCode = require("./string-hash-code");
11
+ var _formatStackTrace = require("./format-stack-trace");
12
+ var _registerHandler = require("../../../common/event-emitter/register-handler");
13
+ var _harvestScheduler = require("../../../common/harvest/harvest-scheduler");
14
+ var _stringify = require("../../../common/util/stringify");
15
+ var _handle = require("../../../common/event-emitter/handle");
16
+ var _mapOwn = require("../../../common/util/map-own");
17
+ var _config = require("../../../common/config/config");
18
+ var _now = require("../../../common/timing/now");
19
+ var _globalScope = require("../../../common/util/global-scope");
20
+ var _aggregateBase = require("../../utils/aggregate-base");
21
+ var _constants = require("../constants");
22
+ var _drain = require("../../../common/drain/drain");
23
+ var _features = require("../../../loaders/features/features");
24
+ var _load = require("../../../common/window/load");
25
+ /*
26
+ * Copyright 2020 New Relic Corporation. All rights reserved.
27
+ * SPDX-License-Identifier: Apache-2.0
28
+ */
29
+
30
+ class Aggregate extends _aggregateBase.AggregateBase {
31
+ static featureName = _constants.FEATURE_NAME;
32
+ constructor(agentIdentifier, aggregator) {
33
+ super(agentIdentifier, aggregator, _constants.FEATURE_NAME);
34
+ this.stackReported = {};
35
+ this.pageviewReported = {};
36
+ this.errorCache = {};
37
+ this.currentBody;
38
+ this.errorOnPage = false;
39
+
40
+ // this will need to change to match whatever ee we use in the instrument
41
+ this.ee.on('interactionSaved', interaction => this.onInteractionSaved(interaction));
42
+
43
+ // this will need to change to match whatever ee we use in the instrument
44
+ this.ee.on('interactionDiscarded', interaction => this.onInteractionDiscarded(interaction));
45
+ (0, _registerHandler.registerHandler)('err', (...args) => this.storeError(...args), this.featureName, this.ee);
46
+ (0, _registerHandler.registerHandler)('ierr', (...args) => this.storeError(...args), this.featureName, this.ee);
47
+ const harvestTimeSeconds = (0, _config.getConfigurationValue)(this.agentIdentifier, 'jserrors.harvestTimeSeconds') || 10;
48
+ const scheduler = new _harvestScheduler.HarvestScheduler('jserrors', {
49
+ onFinished: (...args) => this.onHarvestFinished(...args)
50
+ }, this);
51
+ scheduler.harvest.on('jserrors', (...args) => this.onHarvestStarted(...args));
52
+
53
+ // Don't start harvesting until "drain" for this feat has been called (which currently requires RUM response).
54
+ this.ee.on(`drain-${this.featureName}`, () => {
55
+ if (!this.blocked) scheduler.startTimer(harvestTimeSeconds); // and only if ingest will accept jserror payloads
56
+ });
57
+
58
+ // If RUM-call's response determines that customer lacks entitlements for the /jserror ingest endpoint, don't harvest at all.
59
+ (0, _registerHandler.registerHandler)('block-err', () => {
60
+ this.blocked = true;
61
+ scheduler.stopTimer(true);
62
+ }, this.featureName, this.ee);
63
+ (0, _drain.drain)(this.agentIdentifier, this.featureName);
64
+ }
65
+ onHarvestStarted(options) {
66
+ // this gets rid of dependency in AJAX module
67
+ var body = this.aggregator.take(['err', 'ierr', 'xhr']);
68
+ if (options.retry) {
69
+ this.currentBody = body;
70
+ }
71
+ var payload = {
72
+ body: body,
73
+ qs: {}
74
+ };
75
+ var releaseIds = (0, _stringify.stringify)((0, _config.getRuntime)(this.agentIdentifier).releaseIds);
76
+ if (releaseIds !== '{}') {
77
+ payload.qs.ri = releaseIds;
78
+ }
79
+ if (body && body.err && body.err.length && !this.errorOnPage) {
80
+ payload.qs.pve = '1';
81
+ this.errorOnPage = true;
82
+ }
83
+ return payload;
84
+ }
85
+ onHarvestFinished(result) {
86
+ if (result.retry && this.currentBody) {
87
+ (0, _mapOwn.mapOwn)(this.currentBody, (key, value) => {
88
+ for (var i = 0; i < value.length; i++) {
89
+ var bucket = value[i];
90
+ var name = this.getBucketName(bucket.params, bucket.custom);
91
+ this.aggregator.merge(key, name, bucket.metrics, bucket.params, bucket.custom);
92
+ }
93
+ });
94
+ this.currentBody = null;
95
+ }
96
+ }
97
+ nameHash(params) {
98
+ return (0, _stringHashCode.stringHashCode)(`${params.exceptionClass}_${params.message}_${params.stack_trace || params.browser_stack_hash}`);
99
+ }
100
+ getBucketName(params, customParams) {
101
+ return this.nameHash(params) + ':' + (0, _stringHashCode.stringHashCode)((0, _stringify.stringify)(customParams));
102
+ }
103
+ canonicalizeURL(url, cleanedOrigin) {
104
+ if (typeof url !== 'string') return '';
105
+ var cleanedURL = (0, _cleanUrl.cleanURL)(url);
106
+ if (cleanedURL === cleanedOrigin) {
107
+ return '<inline>';
108
+ } else {
109
+ return cleanedURL;
110
+ }
111
+ }
112
+ buildCanonicalStackString(stackInfo, cleanedOrigin) {
113
+ var canonicalStack = '';
114
+ for (var i = 0; i < stackInfo.frames.length; i++) {
115
+ var frame = stackInfo.frames[i];
116
+ var func = (0, _canonicalFunctionName.canonicalFunctionName)(frame.func);
117
+ if (canonicalStack) canonicalStack += '\n';
118
+ if (func) canonicalStack += func + '@';
119
+ if (typeof frame.url === 'string') canonicalStack += frame.url;
120
+ if (frame.line) canonicalStack += ':' + frame.line;
121
+ }
122
+ return canonicalStack;
123
+ }
124
+
125
+ // Strip query parameters and fragments from the stackString property of the
126
+ // given stackInfo, along with the 'url' properties of each frame in
127
+ // stackInfo.frames.
128
+ //
129
+ // Any URLs that are equivalent to the cleaned version of the origin will also
130
+ // be replaced with the string '<inline>'.
131
+ //
132
+ canonicalizeStackURLs(stackInfo) {
133
+ // Currently, loader.origin might contain a fragment, but we don't want to use it
134
+ // for comparing with frame URLs.
135
+ var cleanedOrigin = (0, _cleanUrl.cleanURL)((0, _config.getRuntime)(this.agentIdentifier).origin);
136
+ for (var i = 0; i < stackInfo.frames.length; i++) {
137
+ var frame = stackInfo.frames[i];
138
+ var originalURL = frame.url;
139
+ var cleanedURL = this.canonicalizeURL(originalURL, cleanedOrigin);
140
+ if (cleanedURL && cleanedURL !== frame.url) {
141
+ frame.url = cleanedURL;
142
+ stackInfo.stackString = stackInfo.stackString.split(originalURL).join(cleanedURL);
143
+ }
144
+ }
145
+ return stackInfo;
146
+ }
147
+ storeError(err, time, internal, customAttributes) {
148
+ // are we in an interaction
149
+ time = time || (0, _now.now)();
150
+ if (!internal && (0, _config.getRuntime)(this.agentIdentifier).onerror && (0, _config.getRuntime)(this.agentIdentifier).onerror(err)) return;
151
+ var stackInfo = this.canonicalizeStackURLs((0, _computeStackTrace.computeStackTrace)(err));
152
+ var canonicalStack = this.buildCanonicalStackString(stackInfo);
153
+ var params = {
154
+ stackHash: (0, _stringHashCode.stringHashCode)(canonicalStack),
155
+ exceptionClass: stackInfo.name,
156
+ request_uri: _globalScope.globalScope?.location.pathname
157
+ };
158
+ if (stackInfo.message) {
159
+ params.message = '' + stackInfo.message;
160
+ }
161
+
162
+ /**
163
+ * The bucketHash is different from the params.stackHash because the params.stackHash is based on the canonicalized
164
+ * stack trace and is used downstream in NR1 to attempt to group the same errors across different browsers. However,
165
+ * the canonical stack trace excludes items like the column number increasing the hit-rate of different errors potentially
166
+ * bucketing and ultimately resulting in the loss of data in NR1.
167
+ */
168
+ var bucketHash = (0, _stringHashCode.stringHashCode)(`${stackInfo.name}_${stackInfo.message}_${stackInfo.stackString}`);
169
+ if (!this.stackReported[bucketHash]) {
170
+ this.stackReported[bucketHash] = true;
171
+ params.stack_trace = (0, _formatStackTrace.truncateSize)(stackInfo.stackString);
172
+ } else {
173
+ params.browser_stack_hash = (0, _stringHashCode.stringHashCode)(stackInfo.stackString);
174
+ }
175
+ params.releaseIds = (0, _stringify.stringify)((0, _config.getRuntime)(this.agentIdentifier).releaseIds);
176
+
177
+ // When debugging stack canonicalization/hashing, uncomment these lines for
178
+ // more output in the test logs
179
+ // params.origStack = err.stack
180
+ // params.canonicalStack = canonicalStack
181
+
182
+ if (!this.pageviewReported[bucketHash]) {
183
+ params.pageview = 1;
184
+ this.pageviewReported[bucketHash] = true;
185
+ }
186
+ var type = internal ? 'ierr' : 'err';
187
+ var newMetrics = {
188
+ time: time
189
+ };
190
+
191
+ // stn and spa aggregators listen to this event - stn sends the error in its payload,
192
+ // and spa annotates the error with interaction info
193
+ (0, _handle.handle)('errorAgg', [type, bucketHash, params, newMetrics], undefined, _features.FEATURE_NAMES.sessionTrace, this.ee);
194
+ (0, _handle.handle)('errorAgg', [type, bucketHash, params, newMetrics], undefined, _features.FEATURE_NAMES.spa, this.ee);
195
+
196
+ // still send EE events for other features such as above, but stop this one from aggregating internal data
197
+ if (this.blocked) return;
198
+ if (params._interactionId != null) {
199
+ // hold on to the error until the interaction finishes
200
+ this.errorCache[params._interactionId] = this.errorCache[params._interactionId] || [];
201
+ this.errorCache[params._interactionId].push([type, bucketHash, params, newMetrics, att, customAttributes]);
202
+ } else {
203
+ // store custom attributes
204
+ var customParams = {};
205
+ var att = (0, _config.getInfo)(this.agentIdentifier).jsAttributes;
206
+ (0, _mapOwn.mapOwn)(att, setCustom);
207
+ if (customAttributes) {
208
+ (0, _mapOwn.mapOwn)(customAttributes, setCustom);
209
+ }
210
+ var jsAttributesHash = (0, _stringHashCode.stringHashCode)((0, _stringify.stringify)(customParams));
211
+ var aggregateHash = bucketHash + ':' + jsAttributesHash;
212
+ this.aggregator.store(type, aggregateHash, params, newMetrics, customParams);
213
+ }
214
+ function setCustom(key, val) {
215
+ customParams[key] = val && typeof val === 'object' ? (0, _stringify.stringify)(val) : val;
216
+ }
217
+ }
218
+ onInteractionSaved(interaction) {
219
+ if (!this.errorCache[interaction.id] || this.blocked) return;
220
+ this.errorCache[interaction.id].forEach(item => {
221
+ var customParams = {};
222
+ var globalCustomParams = item[4];
223
+ var localCustomParams = item[5];
224
+ (0, _mapOwn.mapOwn)(globalCustomParams, setCustom);
225
+ (0, _mapOwn.mapOwn)(interaction.root.attrs.custom, setCustom);
226
+ (0, _mapOwn.mapOwn)(localCustomParams, setCustom);
227
+ var params = item[2];
228
+ params.browserInteractionId = interaction.root.attrs.id;
229
+ delete params._interactionId;
230
+ if (params._interactionNodeId) {
231
+ params.parentNodeId = params._interactionNodeId.toString();
232
+ delete params._interactionNodeId;
233
+ }
234
+ var hash = item[1] + interaction.root.attrs.id;
235
+ var jsAttributesHash = (0, _stringHashCode.stringHashCode)((0, _stringify.stringify)(customParams));
236
+ var aggregateHash = hash + ':' + jsAttributesHash;
237
+ this.aggregator.store(item[0], aggregateHash, params, item[3], customParams);
238
+ function setCustom(key, val) {
239
+ customParams[key] = val && typeof val === 'object' ? (0, _stringify.stringify)(val) : val;
240
+ }
241
+ });
242
+ delete this.errorCache[interaction.id];
243
+ }
244
+ onInteractionDiscarded(interaction) {
245
+ if (!this.errorCache || !this.errorCache[interaction.id] || this.blocked) return;
246
+ this.errorCache[interaction.id].forEach(item => {
247
+ var customParams = {};
248
+ var globalCustomParams = item[4];
249
+ var localCustomParams = item[5];
250
+ (0, _mapOwn.mapOwn)(globalCustomParams, setCustom);
251
+ (0, _mapOwn.mapOwn)(interaction.root.attrs.custom, setCustom);
252
+ (0, _mapOwn.mapOwn)(localCustomParams, setCustom);
253
+ var params = item[2];
254
+ delete params._interactionId;
255
+ delete params._interactionNodeId;
256
+ var hash = item[1];
257
+ var jsAttributesHash = (0, _stringHashCode.stringHashCode)((0, _stringify.stringify)(customParams));
258
+ var aggregateHash = hash + ':' + jsAttributesHash;
259
+ this.aggregator.store(item[0], aggregateHash, item[2], item[3], customParams);
260
+ function setCustom(key, val) {
261
+ customParams[key] = val && typeof val === 'object' ? (0, _stringify.stringify)(val) : val;
262
+ }
263
+ });
264
+ delete this.errorCache[interaction.id];
265
+ }
266
+ }
267
+ exports.Aggregate = Aggregate;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.stringHashCode = stringHashCode;
7
+ /*
8
+ * Copyright 2020 New Relic Corporation. All rights reserved.
9
+ * SPDX-License-Identifier: Apache-2.0
10
+ */
11
+
12
+ function stringHashCode(string) {
13
+ var hash = 0;
14
+ var charVal;
15
+ if (!string || !string.length) return hash;
16
+ for (var i = 0; i < string.length; i++) {
17
+ charVal = string.charCodeAt(i);
18
+ hash = (hash << 5) - hash + charVal;
19
+ hash = hash | 0; // Convert to 32bit integer
20
+ }
21
+
22
+ return hash;
23
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ var _stringHashCode = require("./string-hash-code");
4
+ test.each([{
5
+ input: undefined,
6
+ expected: 0,
7
+ title: 'Return 0 for undefined input'
8
+ }, {
9
+ input: null,
10
+ expected: 0,
11
+ title: 'Return 0 for null input'
12
+ }, {
13
+ input: '',
14
+ expected: 0,
15
+ title: 'Return 0 for empty string input'
16
+ }, {
17
+ input: 'lksjdflksjdf',
18
+ expected: 32668720,
19
+ title: 'Return valid hash of string'
20
+ }])('$title', ({
21
+ input,
22
+ expected
23
+ }) => {
24
+ const result = (0, _stringHashCode.stringHashCode)(input);
25
+ expect(result).toEqual(expected);
26
+ });
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.NR_ERR_PROP = exports.FEATURE_NAME = void 0;
7
+ var _features = require("../../loaders/features/features");
8
+ const FEATURE_NAME = _features.FEATURE_NAMES.jserrors;
9
+ exports.FEATURE_NAME = FEATURE_NAME;
10
+ const NR_ERR_PROP = 'nr@seenError';
11
+ exports.NR_ERR_PROP = NR_ERR_PROP;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "JSErrors", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _index.Instrument;
10
+ }
11
+ });
12
+ var _index = require("./instrument/index");