@newrelic/browser-agent 1.234.0 → 1.236.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/README.md +42 -2
  2. package/dist/cjs/common/config/state/init.js +3 -0
  3. package/dist/cjs/common/config/state/runtime.js +4 -4
  4. package/dist/cjs/common/constants/env.cdn.js +2 -2
  5. package/dist/cjs/common/constants/env.npm.js +1 -1
  6. package/dist/cjs/common/constants/runtime.js +52 -0
  7. package/dist/cjs/common/constants/shared-channel.js +19 -0
  8. package/dist/cjs/common/event-listener/event-listener-opts.js +3 -3
  9. package/dist/cjs/common/harvest/harvest-scheduler.js +35 -16
  10. package/dist/cjs/common/harvest/harvest.js +163 -144
  11. package/dist/cjs/common/harvest/types.js +54 -0
  12. package/dist/cjs/common/ids/id.js +2 -2
  13. package/dist/cjs/common/ids/unique-id.js +3 -3
  14. package/dist/cjs/common/session/session-entity.js +21 -13
  15. package/dist/cjs/common/timer/interaction-timer.js +3 -3
  16. package/dist/cjs/common/unload/eol.js +10 -11
  17. package/dist/cjs/common/url/canonicalize-url.js +2 -2
  18. package/dist/cjs/common/url/parse-url.js +3 -3
  19. package/dist/cjs/common/url/protocol.js +2 -2
  20. package/dist/cjs/common/util/feature-flags.js +23 -12
  21. package/dist/cjs/common/util/obfuscate.js +2 -2
  22. package/dist/cjs/common/util/submit-data.js +61 -79
  23. package/dist/cjs/common/window/nreum.js +14 -14
  24. package/dist/cjs/common/wrap/wrap-events.js +3 -3
  25. package/dist/cjs/common/wrap/wrap-fetch.js +5 -5
  26. package/dist/cjs/common/wrap/wrap-history.js +2 -2
  27. package/dist/cjs/common/wrap/wrap-jsonp.js +2 -2
  28. package/dist/cjs/common/wrap/wrap-mutation.js +2 -2
  29. package/dist/cjs/common/wrap/wrap-promise.js +2 -2
  30. package/dist/cjs/common/wrap/wrap-raf.js +3 -3
  31. package/dist/cjs/common/wrap/wrap-timer.js +5 -5
  32. package/dist/cjs/common/wrap/wrap-xhr.js +3 -3
  33. package/dist/cjs/features/ajax/aggregate/index.js +1 -1
  34. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +2 -2
  35. package/dist/cjs/features/ajax/instrument/index.js +6 -7
  36. package/dist/cjs/features/jserrors/aggregate/index.js +11 -4
  37. package/dist/cjs/features/jserrors/instrument/index.js +6 -19
  38. package/dist/cjs/features/metrics/aggregate/framework-detection.js +2 -2
  39. package/dist/cjs/features/metrics/aggregate/index.js +3 -3
  40. package/dist/cjs/features/page_action/aggregate/index.js +3 -3
  41. package/dist/cjs/features/page_view_event/aggregate/index.js +10 -11
  42. package/dist/cjs/features/page_view_event/instrument/index.js +2 -2
  43. package/dist/cjs/features/page_view_timing/aggregate/index.js +3 -5
  44. package/dist/cjs/features/page_view_timing/instrument/index.js +2 -2
  45. package/dist/cjs/features/session_replay/aggregate/index.js +99 -82
  46. package/dist/cjs/features/session_replay/replay-mode.js +28 -0
  47. package/dist/cjs/features/session_trace/aggregate/index.js +222 -99
  48. package/dist/cjs/features/session_trace/constants.js +1 -3
  49. package/dist/cjs/features/session_trace/instrument/index.js +2 -18
  50. package/dist/cjs/features/spa/aggregate/index.js +1 -1
  51. package/dist/cjs/features/spa/constants.js +0 -1
  52. package/dist/cjs/features/spa/instrument/index.js +2 -2
  53. package/dist/cjs/features/utils/agent-session.js +20 -36
  54. package/dist/cjs/features/utils/aggregate-base.js +7 -12
  55. package/dist/cjs/features/utils/handler-cache.js +28 -23
  56. package/dist/cjs/features/utils/instrument-base.js +58 -40
  57. package/dist/cjs/index.js +7 -0
  58. package/dist/cjs/loaders/agent.js +7 -1
  59. package/dist/cjs/loaders/api/api.js +2 -2
  60. package/dist/cjs/loaders/api/apiAsync.js +6 -4
  61. package/dist/cjs/loaders/configure/configure.js +2 -2
  62. package/dist/cjs/loaders/features/featureDependencies.js +2 -0
  63. package/dist/cjs/loaders/micro-agent.js +29 -38
  64. package/dist/esm/common/config/state/init.js +3 -0
  65. package/dist/esm/common/config/state/runtime.js +1 -1
  66. package/dist/esm/common/constants/env.cdn.js +2 -2
  67. package/dist/esm/common/constants/env.npm.js +1 -1
  68. package/dist/esm/common/constants/runtime.js +38 -0
  69. package/dist/esm/common/constants/shared-channel.js +12 -0
  70. package/dist/esm/common/event-listener/event-listener-opts.js +1 -1
  71. package/dist/esm/common/harvest/harvest-scheduler.js +34 -17
  72. package/dist/esm/common/harvest/harvest.js +160 -142
  73. package/dist/esm/common/harvest/types.js +47 -0
  74. package/dist/esm/common/ids/id.js +1 -1
  75. package/dist/esm/common/ids/unique-id.js +1 -1
  76. package/dist/esm/common/session/session-entity.js +18 -12
  77. package/dist/esm/common/timer/interaction-timer.js +2 -2
  78. package/dist/esm/common/unload/eol.js +1 -2
  79. package/dist/esm/common/url/canonicalize-url.js +1 -1
  80. package/dist/esm/common/url/parse-url.js +1 -1
  81. package/dist/esm/common/url/protocol.js +1 -1
  82. package/dist/esm/common/util/feature-flags.js +23 -12
  83. package/dist/esm/common/util/obfuscate.js +2 -2
  84. package/dist/esm/common/util/submit-data.js +58 -76
  85. package/dist/esm/common/window/nreum.js +1 -1
  86. package/dist/esm/common/wrap/wrap-events.js +1 -1
  87. package/dist/esm/common/wrap/wrap-fetch.js +1 -1
  88. package/dist/esm/common/wrap/wrap-history.js +1 -1
  89. package/dist/esm/common/wrap/wrap-jsonp.js +1 -1
  90. package/dist/esm/common/wrap/wrap-mutation.js +1 -1
  91. package/dist/esm/common/wrap/wrap-promise.js +1 -1
  92. package/dist/esm/common/wrap/wrap-raf.js +2 -2
  93. package/dist/esm/common/wrap/wrap-timer.js +2 -2
  94. package/dist/esm/common/wrap/wrap-xhr.js +1 -1
  95. package/dist/esm/features/ajax/aggregate/index.js +1 -1
  96. package/dist/esm/features/ajax/instrument/distributed-tracing.js +1 -1
  97. package/dist/esm/features/ajax/instrument/index.js +1 -2
  98. package/dist/esm/features/jserrors/aggregate/index.js +10 -3
  99. package/dist/esm/features/jserrors/instrument/index.js +3 -16
  100. package/dist/esm/features/metrics/aggregate/framework-detection.js +1 -1
  101. package/dist/esm/features/metrics/aggregate/index.js +1 -1
  102. package/dist/esm/features/page_action/aggregate/index.js +1 -1
  103. package/dist/esm/features/page_view_event/aggregate/index.js +1 -2
  104. package/dist/esm/features/page_view_event/instrument/index.js +1 -1
  105. package/dist/esm/features/page_view_timing/aggregate/index.js +2 -4
  106. package/dist/esm/features/page_view_timing/instrument/index.js +1 -1
  107. package/dist/esm/features/session_replay/aggregate/index.js +92 -78
  108. package/dist/esm/features/session_replay/replay-mode.js +23 -0
  109. package/dist/esm/features/session_trace/aggregate/index.js +223 -100
  110. package/dist/esm/features/session_trace/constants.js +0 -1
  111. package/dist/esm/features/session_trace/instrument/index.js +2 -18
  112. package/dist/esm/features/spa/aggregate/index.js +1 -1
  113. package/dist/esm/features/spa/constants.js +0 -1
  114. package/dist/esm/features/spa/instrument/index.js +1 -1
  115. package/dist/esm/features/utils/agent-session.js +21 -37
  116. package/dist/esm/features/utils/aggregate-base.js +7 -12
  117. package/dist/esm/features/utils/handler-cache.js +28 -23
  118. package/dist/esm/features/utils/instrument-base.js +57 -39
  119. package/dist/esm/index.js +1 -4
  120. package/dist/esm/loaders/agent.js +7 -1
  121. package/dist/esm/loaders/api/api.js +2 -2
  122. package/dist/esm/loaders/api/apiAsync.js +3 -3
  123. package/dist/esm/loaders/configure/configure.js +1 -1
  124. package/dist/esm/loaders/features/featureDependencies.js +2 -0
  125. package/dist/esm/loaders/micro-agent.js +29 -38
  126. package/dist/types/common/config/state/init.d.ts.map +1 -1
  127. package/dist/types/common/constants/runtime.d.ts +29 -0
  128. package/dist/types/common/constants/runtime.d.ts.map +1 -0
  129. package/dist/types/common/constants/shared-channel.d.ts +5 -0
  130. package/dist/types/common/constants/shared-channel.d.ts.map +1 -0
  131. package/dist/types/common/harvest/harvest-scheduler.d.ts +5 -1
  132. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
  133. package/dist/types/common/harvest/harvest.d.ts +49 -38
  134. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  135. package/dist/types/common/harvest/types.d.ts +100 -0
  136. package/dist/types/common/harvest/types.d.ts.map +1 -0
  137. package/dist/types/common/session/session-entity.d.ts +9 -5
  138. package/dist/types/common/session/session-entity.d.ts.map +1 -1
  139. package/dist/types/common/unload/eol.d.ts.map +1 -1
  140. package/dist/types/common/util/feature-flags.d.ts +1 -0
  141. package/dist/types/common/util/feature-flags.d.ts.map +1 -1
  142. package/dist/types/common/util/submit-data.d.ts +62 -64
  143. package/dist/types/common/util/submit-data.d.ts.map +1 -1
  144. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
  145. package/dist/types/features/jserrors/aggregate/index.d.ts +2 -1
  146. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  147. package/dist/types/features/jserrors/instrument/index.d.ts +1 -1
  148. package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -1
  149. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  150. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  151. package/dist/types/features/session_replay/aggregate/index.d.ts +14 -5
  152. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
  153. package/dist/types/features/session_replay/instrument/index.d.ts.map +1 -1
  154. package/dist/types/features/session_replay/replay-mode.d.ts +9 -0
  155. package/dist/types/features/session_replay/replay-mode.d.ts.map +1 -0
  156. package/dist/types/features/session_trace/aggregate/index.d.ts +21 -3
  157. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  158. package/dist/types/features/session_trace/constants.d.ts +0 -1
  159. package/dist/types/features/session_trace/constants.d.ts.map +1 -1
  160. package/dist/types/features/session_trace/instrument/index.d.ts +0 -2
  161. package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
  162. package/dist/types/features/spa/constants.d.ts.map +1 -1
  163. package/dist/types/features/utils/agent-session.d.ts.map +1 -1
  164. package/dist/types/features/utils/aggregate-base.d.ts +6 -1
  165. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
  166. package/dist/types/features/utils/handler-cache.d.ts +12 -11
  167. package/dist/types/features/utils/handler-cache.d.ts.map +1 -1
  168. package/dist/types/features/utils/instrument-base.d.ts +17 -1
  169. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  170. package/dist/types/index.d.ts +1 -0
  171. package/dist/types/loaders/agent.d.ts +4 -4
  172. package/dist/types/loaders/agent.d.ts.map +1 -1
  173. package/dist/types/loaders/features/featureDependencies.d.ts.map +1 -1
  174. package/dist/types/loaders/micro-agent.d.ts +3 -4
  175. package/dist/types/loaders/micro-agent.d.ts.map +1 -1
  176. package/package.json +14 -7
  177. package/src/common/config/__mocks__/config.js +11 -0
  178. package/src/common/config/state/init.js +1 -0
  179. package/src/common/config/state/runtime.js +1 -1
  180. package/src/common/constants/__mocks__/env.js +3 -0
  181. package/src/common/constants/__mocks__/runtime.js +8 -0
  182. package/src/common/constants/env.cdn.test.js +7 -0
  183. package/src/common/constants/env.npm.test.js +7 -0
  184. package/src/common/constants/env.test.js +7 -0
  185. package/src/common/constants/runtime.js +71 -0
  186. package/src/common/constants/runtime.test.js +168 -0
  187. package/src/common/constants/shared-channel.js +13 -0
  188. package/src/common/context/__mocks__/shared-context.js +8 -0
  189. package/src/common/event-listener/__mocks__/event-listener-opts.js +7 -0
  190. package/src/common/event-listener/event-listener-opts.js +1 -1
  191. package/src/common/harvest/__mocks__/harvest.js +13 -0
  192. package/src/common/harvest/harvest-scheduler.js +31 -19
  193. package/src/common/harvest/harvest-scheduler.test.js +491 -20
  194. package/src/common/harvest/harvest.js +147 -130
  195. package/src/common/harvest/harvest.test.js +788 -139
  196. package/src/common/harvest/types.js +47 -0
  197. package/src/common/ids/id.js +1 -1
  198. package/src/common/ids/unique-id.js +1 -1
  199. package/src/common/session/__mocks__/session-entity.js +25 -0
  200. package/src/common/session/{session-entity.test.js → session-entity.component-test.js} +71 -48
  201. package/src/common/session/session-entity.js +16 -13
  202. package/src/common/timer/interaction-timer.js +2 -2
  203. package/src/common/timing/__mocks__/now.js +1 -0
  204. package/src/common/unload/__mocks__/eol.js +1 -0
  205. package/src/common/unload/eol.js +1 -2
  206. package/src/common/url/__mocks__/clean-url.js +1 -0
  207. package/src/common/url/__mocks__/encode.js +7 -0
  208. package/src/common/url/__mocks__/location.js +1 -0
  209. package/src/common/url/canonicalize-url.js +1 -1
  210. package/src/common/url/canonicalize-url.test.js +32 -21
  211. package/src/common/url/parse-url.js +1 -1
  212. package/src/common/url/parse-url.test.js +3 -3
  213. package/src/common/url/protocol.js +1 -1
  214. package/src/common/util/__mocks__/obfuscate.js +10 -0
  215. package/src/common/util/__mocks__/stringify.js +1 -0
  216. package/src/common/util/__mocks__/submit-data.js +6 -0
  217. package/src/common/util/__mocks__/traverse.js +1 -0
  218. package/src/common/util/data-size.test.js +27 -20
  219. package/src/common/util/feature-flags.js +24 -12
  220. package/src/common/util/feature-flags.test.js +98 -0
  221. package/src/common/util/obfuscate.component-test.js +173 -0
  222. package/src/common/util/obfuscate.js +2 -2
  223. package/src/common/util/submit-data.js +42 -56
  224. package/src/common/util/submit-data.test.js +158 -137
  225. package/src/common/window/nreum.js +1 -1
  226. package/src/common/wrap/wrap-events.js +1 -1
  227. package/src/common/wrap/wrap-fetch.js +1 -1
  228. package/src/common/wrap/wrap-history.js +1 -1
  229. package/src/common/wrap/wrap-jsonp.js +1 -1
  230. package/src/common/wrap/wrap-mutation.js +1 -1
  231. package/src/common/wrap/wrap-promise.js +1 -1
  232. package/src/common/wrap/wrap-promise.test.js +2 -2
  233. package/src/common/wrap/wrap-raf.js +2 -2
  234. package/src/common/wrap/wrap-timer.js +2 -2
  235. package/src/common/wrap/wrap-xhr.js +1 -1
  236. package/src/features/ajax/aggregate/index.js +1 -1
  237. package/src/features/ajax/instrument/distributed-tracing.js +1 -1
  238. package/src/features/ajax/instrument/index.js +1 -2
  239. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +1 -1
  240. package/src/features/jserrors/aggregate/index.js +12 -3
  241. package/src/features/jserrors/instrument/index.js +3 -16
  242. package/src/features/metrics/aggregate/framework-detection.js +1 -1
  243. package/src/features/metrics/aggregate/framework-detection.test.js +2 -2
  244. package/src/features/metrics/aggregate/index.js +1 -1
  245. package/src/features/page_action/aggregate/index.js +1 -1
  246. package/src/features/page_view_event/aggregate/index.js +1 -2
  247. package/src/features/page_view_event/instrument/index.js +1 -1
  248. package/src/features/page_view_timing/aggregate/index.js +2 -4
  249. package/src/features/page_view_timing/instrument/index.js +1 -1
  250. package/src/features/session_replay/aggregate/index.component-test.js +368 -0
  251. package/src/features/session_replay/aggregate/index.js +96 -71
  252. package/src/features/session_replay/instrument/index.js +0 -1
  253. package/src/features/session_replay/replay-mode.js +23 -0
  254. package/src/features/session_trace/aggregate/index.js +198 -79
  255. package/src/features/session_trace/constants.js +0 -1
  256. package/src/features/session_trace/instrument/index.js +3 -20
  257. package/src/features/spa/aggregate/index.js +1 -1
  258. package/src/features/spa/constants.js +0 -1
  259. package/src/features/spa/instrument/index.js +1 -1
  260. package/src/features/utils/agent-session.js +22 -34
  261. package/src/features/utils/agent-session.test.js +194 -0
  262. package/src/features/utils/aggregate-base.js +12 -9
  263. package/src/features/utils/aggregate-base.test.js +122 -0
  264. package/src/features/utils/feature-base.test.js +45 -0
  265. package/src/features/utils/handler-cache.js +29 -23
  266. package/src/features/utils/handler-cache.test.js +72 -0
  267. package/src/features/utils/instrument-base.js +45 -29
  268. package/src/features/utils/instrument-base.test.js +209 -0
  269. package/src/features/utils/lazy-feature-loader.test.js +37 -0
  270. package/src/index.js +1 -3
  271. package/src/loaders/agent.js +8 -1
  272. package/src/loaders/api/api.js +2 -2
  273. package/src/loaders/api/apiAsync.js +3 -3
  274. package/src/loaders/configure/configure.js +1 -1
  275. package/src/loaders/features/featureDependencies.js +2 -0
  276. package/src/loaders/micro-agent.js +26 -30
  277. package/dist/cjs/common/browser-version/firefox-version.js +0 -17
  278. package/dist/cjs/common/browser-version/ios-version.js +0 -19
  279. package/dist/cjs/common/event-emitter/contextual-ee.test.js +0 -282
  280. package/dist/cjs/common/event-emitter/handle.test.js +0 -58
  281. package/dist/cjs/common/event-emitter/register-handler.test.js +0 -55
  282. package/dist/cjs/common/harvest/harvest-scheduler.test.js +0 -39
  283. package/dist/cjs/common/harvest/harvest.test.js +0 -224
  284. package/dist/cjs/common/ids/id.test.js +0 -85
  285. package/dist/cjs/common/ids/unique-id.test.js +0 -49
  286. package/dist/cjs/common/session/session-entity.test.js +0 -460
  287. package/dist/cjs/common/storage/local-memory.js +0 -35
  288. package/dist/cjs/common/storage/local-memory.test.js +0 -20
  289. package/dist/cjs/common/storage/local-storage.test.js +0 -14
  290. package/dist/cjs/common/timer/interaction-timer.test.js +0 -216
  291. package/dist/cjs/common/timer/timer.test.js +0 -105
  292. package/dist/cjs/common/timing/nav-timing.test.js +0 -192
  293. package/dist/cjs/common/url/canonicalize-url.test.js +0 -42
  294. package/dist/cjs/common/url/clean-url.test.js +0 -9
  295. package/dist/cjs/common/url/encode.test.js +0 -74
  296. package/dist/cjs/common/url/location.test.js +0 -13
  297. package/dist/cjs/common/url/parse-url.test.js +0 -111
  298. package/dist/cjs/common/url/protocol.test.js +0 -15
  299. package/dist/cjs/common/util/console.test.js +0 -30
  300. package/dist/cjs/common/util/data-size.test.js +0 -47
  301. package/dist/cjs/common/util/get-or-set.test.js +0 -47
  302. package/dist/cjs/common/util/global-scope.js +0 -58
  303. package/dist/cjs/common/util/invoke.test.js +0 -49
  304. package/dist/cjs/common/util/map-own.test.js +0 -49
  305. package/dist/cjs/common/util/stringify.test.js +0 -48
  306. package/dist/cjs/common/util/submit-data.test.js +0 -221
  307. package/dist/cjs/common/util/traverse.test.js +0 -44
  308. package/dist/cjs/common/wrap/wrap-promise.test.js +0 -119
  309. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.test.js +0 -31
  310. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.test.js +0 -383
  311. package/dist/cjs/features/jserrors/aggregate/format-stack-trace.test.js +0 -40
  312. package/dist/cjs/features/jserrors/aggregate/string-hash-code.test.js +0 -27
  313. package/dist/cjs/features/metrics/aggregate/framework-detection.test.js +0 -137
  314. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.test.js +0 -17
  315. package/dist/cjs/features/metrics/aggregate/polyfill-detection.test.js +0 -165
  316. package/dist/cjs/features/spa/aggregate/interaction-node.test.js +0 -16
  317. package/dist/esm/common/browser-version/firefox-version.js +0 -10
  318. package/dist/esm/common/browser-version/ios-version.js +0 -11
  319. package/dist/esm/common/event-emitter/contextual-ee.test.js +0 -278
  320. package/dist/esm/common/event-emitter/handle.test.js +0 -54
  321. package/dist/esm/common/event-emitter/register-handler.test.js +0 -51
  322. package/dist/esm/common/harvest/harvest-scheduler.test.js +0 -37
  323. package/dist/esm/common/harvest/harvest.test.js +0 -222
  324. package/dist/esm/common/ids/id.test.js +0 -81
  325. package/dist/esm/common/ids/unique-id.test.js +0 -44
  326. package/dist/esm/common/session/session-entity.test.js +0 -458
  327. package/dist/esm/common/storage/local-memory.js +0 -28
  328. package/dist/esm/common/storage/local-memory.test.js +0 -18
  329. package/dist/esm/common/storage/local-storage.test.js +0 -12
  330. package/dist/esm/common/timer/interaction-timer.test.js +0 -214
  331. package/dist/esm/common/timer/timer.test.js +0 -103
  332. package/dist/esm/common/timing/nav-timing.test.js +0 -190
  333. package/dist/esm/common/url/canonicalize-url.test.js +0 -38
  334. package/dist/esm/common/url/clean-url.test.js +0 -7
  335. package/dist/esm/common/url/encode.test.js +0 -70
  336. package/dist/esm/common/url/location.test.js +0 -11
  337. package/dist/esm/common/url/parse-url.test.js +0 -107
  338. package/dist/esm/common/url/protocol.test.js +0 -13
  339. package/dist/esm/common/util/console.test.js +0 -28
  340. package/dist/esm/common/util/data-size.test.js +0 -45
  341. package/dist/esm/common/util/get-or-set.test.js +0 -45
  342. package/dist/esm/common/util/global-scope.js +0 -45
  343. package/dist/esm/common/util/invoke.test.js +0 -47
  344. package/dist/esm/common/util/map-own.test.js +0 -47
  345. package/dist/esm/common/util/stringify.test.js +0 -46
  346. package/dist/esm/common/util/submit-data.test.js +0 -219
  347. package/dist/esm/common/util/traverse.test.js +0 -42
  348. package/dist/esm/common/wrap/wrap-promise.test.js +0 -115
  349. package/dist/esm/features/jserrors/aggregate/canonical-function-name.test.js +0 -29
  350. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.test.js +0 -379
  351. package/dist/esm/features/jserrors/aggregate/format-stack-trace.test.js +0 -38
  352. package/dist/esm/features/jserrors/aggregate/string-hash-code.test.js +0 -25
  353. package/dist/esm/features/metrics/aggregate/framework-detection.test.js +0 -133
  354. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.test.js +0 -15
  355. package/dist/esm/features/metrics/aggregate/polyfill-detection.test.js +0 -163
  356. package/dist/esm/features/spa/aggregate/interaction-node.test.js +0 -14
  357. package/dist/types/common/browser-version/firefox-version.d.ts +0 -2
  358. package/dist/types/common/browser-version/firefox-version.d.ts.map +0 -1
  359. package/dist/types/common/browser-version/ios-version.d.ts +0 -3
  360. package/dist/types/common/browser-version/ios-version.d.ts.map +0 -1
  361. package/dist/types/common/storage/local-memory.d.ts +0 -8
  362. package/dist/types/common/storage/local-memory.d.ts.map +0 -1
  363. package/dist/types/common/util/global-scope.d.ts +0 -14
  364. package/dist/types/common/util/global-scope.d.ts.map +0 -1
  365. package/src/common/browser-version/firefox-version.js +0 -10
  366. package/src/common/browser-version/ios-version.js +0 -11
  367. package/src/common/storage/local-memory.js +0 -30
  368. package/src/common/storage/local-memory.test.js +0 -19
  369. package/src/common/util/global-scope.js +0 -49
  370. /package/src/common/timer/{interaction-timer.test.js → interaction-timer.component-test.js} +0 -0
  371. /package/src/common/url/{encode.test.js → encode.component-test.js} +0 -0
  372. /package/src/common/url/{protocol.test.js → protocol.component-test.js} +0 -0
@@ -3,216 +3,237 @@
3
3
  * @jest-environment-options {"html": "<html><head><script></script></head><body></body></html>", "url": "https://example.com/"}
4
4
  */
5
5
 
6
- import { submitData } from './submit-data'
6
+ import { faker } from '@faker-js/faker'
7
+ import * as runtimeModule from '../constants/runtime'
8
+ import * as submitData from './submit-data'
7
9
 
8
- const mockWorkerScope = jest.fn().mockImplementation(() => false)
9
- jest.mock('./global-scope', () => ({
10
- __esModule: true,
11
- get isWorkerScope () {
12
- return mockWorkerScope()
13
- }
14
- }))
10
+ jest.enableAutomock()
11
+ jest.unmock('./submit-data')
15
12
 
16
13
  const url = 'https://example.com/api'
17
14
 
18
- beforeEach(() => {
19
- jest.restoreAllMocks()
20
- mockWorkerScope.mockReturnValue(false)
15
+ afterEach(() => {
16
+ jest.clearAllMocks()
21
17
  })
22
18
 
23
- describe('submitData.jsonp', () => {
24
- // This test requires a script tag to exist in the html set by this file's jest-environment-options header block.
25
- test('should return an HTMLScriptElement when called from a web window environment', () => {
26
- mockWorkerScope.mockReturnValue(false)
19
+ describe('getSubmitMethod', () => {
20
+ test('should use xhr for final harvest when isBrowserScope is false', () => {
21
+ jest.replaceProperty(runtimeModule, 'isBrowserScope', false)
22
+ jest.replaceProperty(runtimeModule, 'supportsSendBeacon', true)
27
23
 
28
- const jsonp = 'callback'
29
-
30
- const result = submitData.jsonp({ url, jsonp })
31
-
32
- expect(result).toBeInstanceOf(HTMLScriptElement)
33
- expect(result.type).toBe('text/javascript')
34
- expect(result.src).toBe(url + '&jsonp=' + jsonp)
24
+ expect(submitData.getSubmitMethod({ isFinalHarvest: true })).toEqual(submitData.xhr)
35
25
  })
36
26
 
37
- test('should try to use importScripts when called from a worker scope', () => {
38
- mockWorkerScope.mockReturnValueOnce(true)
39
-
40
- const jsonp = 'callback'
41
-
42
- global.importScripts = jest.fn()
43
-
44
- submitData.jsonp({ url, jsonp })
45
-
46
- expect(importScripts).toHaveBeenCalledWith(url + '&jsonp=' + jsonp)
27
+ test('should use xhr for final harvest when supportsSendBeacon is false', () => {
28
+ jest.replaceProperty(runtimeModule, 'isBrowserScope', true)
29
+ jest.replaceProperty(runtimeModule, 'supportsSendBeacon', false)
47
30
 
48
- delete global.importScripts
31
+ expect(submitData.getSubmitMethod({ isFinalHarvest: true })).toEqual(submitData.xhr)
49
32
  })
50
33
 
51
- test('should fall back to an xhrGet call and return false when called from a worker scope', () => {
52
- mockWorkerScope.mockReturnValueOnce(true)
34
+ test('should use beacon for final harvest when isBrowserScope and supportsSendBeacon is true', () => {
35
+ jest.replaceProperty(runtimeModule, 'isBrowserScope', true)
36
+ jest.replaceProperty(runtimeModule, 'supportsSendBeacon', true)
53
37
 
54
- const jsonp = 'callback'
55
-
56
- jest.spyOn(submitData, 'xhrGet').mockImplementation(jest.fn())
38
+ expect(submitData.getSubmitMethod({ isFinalHarvest: true })).toEqual(submitData.beacon)
39
+ })
57
40
 
58
- const result = submitData.jsonp({ url, jsonp })
41
+ test.each([
42
+ null, undefined, false
43
+ ])('should use xhr when final harvest is %s', (isFinalHarvest) => {
44
+ jest.replaceProperty(runtimeModule, 'isBrowserScope', true)
45
+ jest.replaceProperty(runtimeModule, 'supportsSendBeacon', true)
59
46
 
60
- expect(result).toBe(false)
61
- expect(submitData.xhrGet).toHaveBeenCalledTimes(1)
47
+ expect(submitData.getSubmitMethod({ isFinalHarvest })).toEqual(submitData.xhr)
62
48
  })
63
49
 
64
- test('should not throw an error if any error occurs during execution', () => {
65
- jest.spyOn(document, 'createElement').mockImplementation(() => { throw new Error('message') })
50
+ test('should use xhr when opts is undefined', () => {
51
+ jest.replaceProperty(runtimeModule, 'isBrowserScope', true)
52
+ jest.replaceProperty(runtimeModule, 'supportsSendBeacon', true)
66
53
 
67
- const jsonp = 'callback'
68
-
69
- expect(() => {
70
- submitData.jsonp({ url, jsonp })
71
- }).not.toThrow()
54
+ expect(submitData.getSubmitMethod()).toEqual(submitData.xhr)
72
55
  })
73
56
  })
74
57
 
75
- describe('submitData.xhrGet', () => {
76
- test('should return an XMLHttpRequest object', () => {
77
- const result = submitData.xhrGet({ url })
78
- expect(result).toBeInstanceOf(XMLHttpRequest)
79
- })
80
-
81
- test('should not throw an error if URL is not provided', () => {
82
- expect(() => {
83
- submitData.xhrGet({})
84
- }).not.toThrow()
58
+ describe('xhr', () => {
59
+ beforeEach(() => {
60
+ jest.spyOn(global, 'XMLHttpRequest').mockImplementation(function () {
61
+ this.prototype = XMLHttpRequest.prototype
62
+ this.open = jest.fn()
63
+ this.send = jest.fn()
64
+ this.setRequestHeader = jest.fn()
65
+
66
+ this._withCredentials = false
67
+ Object.defineProperty(this, 'withCredentials', {
68
+ get: jest.fn(() => this._withCredentials),
69
+ set: jest.fn((val) => this._withCredentials = val)
70
+ })
71
+ })
85
72
  })
86
73
 
87
- test('should not throw an error if an invalid URL is provided', () => {
88
- expect(() => {
89
- submitData.xhrGet({ url: 'invalid url' })
90
- }).not.toThrow()
91
- })
92
- })
74
+ test('should make and send an xhr with default values', () => {
75
+ const result = submitData.xhr({ url })
76
+ const xhr = jest.mocked(global.XMLHttpRequest).mock.instances[0]
93
77
 
94
- describe('submitData.xhr', () => {
95
- test('should return an XMLHttpRequest object', () => {
96
- const result = submitData.xhrGet({ url })
97
78
  expect(result).toBeInstanceOf(XMLHttpRequest)
79
+ expect(result.withCredentials).toBe(true)
80
+ expect(xhr.open).toHaveBeenCalledWith('POST', url, true)
81
+ expect(xhr.setRequestHeader).toHaveBeenCalledWith('content-type', 'text/plain')
82
+ expect(xhr.send).toHaveBeenCalledWith(null)
98
83
  })
99
84
 
100
- test('should not throw an error if URL is not provided', () => {
101
- expect(() => {
102
- submitData.xhr({})
103
- }).not.toThrow()
104
- })
85
+ test('should send the body when provided', () => {
86
+ const body = faker.lorem.paragraph()
87
+ submitData.xhr({ url, body })
88
+ const xhr = jest.mocked(global.XMLHttpRequest).mock.instances[0]
105
89
 
106
- test('should not throw an error if an invalid URL is provided', () => {
107
- expect(() => {
108
- submitData.xhr({ url: 'invalid url' })
109
- }).not.toThrow()
90
+ expect(xhr.send).toHaveBeenCalledWith(body)
110
91
  })
111
92
 
112
- test('should send a POST request by default', () => {
113
- jest.spyOn(XMLHttpRequest.prototype, 'open')
114
-
115
- submitData.xhr({ url })
93
+ test('should set async to false', () => {
94
+ submitData.xhr({ url, sync: true })
95
+ const xhr = jest.mocked(global.XMLHttpRequest).mock.instances[0]
116
96
 
117
- expect(XMLHttpRequest.prototype.open).toHaveBeenCalledWith('POST', url, true)
97
+ expect(xhr.open).toHaveBeenCalledWith('POST', url, false)
118
98
  })
119
99
 
120
- test('should send a GET request if specified', () => {
121
- jest.spyOn(XMLHttpRequest.prototype, 'open')
122
-
123
- submitData.xhr({ url, method: 'GET' })
100
+ test('should use the provided method', () => {
101
+ submitData.xhr({ url, method: 'HEAD' })
102
+ const xhr = jest.mocked(global.XMLHttpRequest).mock.instances[0]
124
103
 
125
- expect(XMLHttpRequest.prototype.open).toHaveBeenCalledWith('GET', url, true)
104
+ expect(xhr.open).toHaveBeenCalledWith('HEAD', url, true)
126
105
  })
127
106
 
128
- // This test requires a same-origin url to be set by this file's jest-environment-options header block.
129
- test('should send a request synchronously if specified', () => {
130
- jest.spyOn(XMLHttpRequest.prototype, 'open')
131
-
132
- submitData.xhr({ url, sync: true })
107
+ test('should use the provided headers', () => {
108
+ const headers = [{ key: faker.lorem.word(), value: faker.datatype.uuid() }]
109
+ submitData.xhr({ url, headers })
110
+ const xhr = jest.mocked(global.XMLHttpRequest).mock.instances[0]
133
111
 
134
- expect(XMLHttpRequest.prototype.open).toHaveBeenCalledWith('POST', url, false)
112
+ expect(xhr.setRequestHeader).not.toHaveBeenCalledWith('content-type', 'text/plain')
113
+ expect(xhr.setRequestHeader).toHaveBeenCalledWith(headers[0].key, headers[0].value)
135
114
  })
136
115
 
137
- test('should set custom headers if provided', () => {
138
- const headers = [{ key: 'Content-Type', value: 'application/json' }]
116
+ test('should not throw an error if withCredentials is not supported', () => {
117
+ jest.spyOn(global, 'XMLHttpRequest').mockImplementation(function () {
118
+ this.prototype = XMLHttpRequest.prototype
119
+ this.open = jest.fn()
120
+ this.send = jest.fn()
121
+ this.setRequestHeader = jest.fn()
122
+ })
139
123
 
140
- jest.spyOn(XMLHttpRequest.prototype, 'setRequestHeader')
124
+ expect(() => submitData.xhr({ url })).not.toThrow()
125
+ })
141
126
 
142
- submitData.xhr({ url, headers })
127
+ test('should not throw an error if setRequestHeader throws an error', () => {
128
+ jest.spyOn(global, 'XMLHttpRequest').mockImplementation(function () {
129
+ this.prototype = XMLHttpRequest.prototype
130
+ this.open = jest.fn()
131
+ this.send = jest.fn()
132
+ this.setRequestHeader = jest.fn()
143
133
 
144
- headers.forEach((header) => {
145
- expect(XMLHttpRequest.prototype.setRequestHeader).toHaveBeenCalledWith(header.key, header.value)
134
+ Object.defineProperty(this, 'withCredentials', {
135
+ get: jest.fn().mockImplementation(() => { throw new Error(faker.lorem.sentence()) }),
136
+ set: jest.fn().mockImplementation(() => { throw new Error(faker.lorem.sentence()) })
137
+ })
146
138
  })
139
+
140
+ expect(() => submitData.xhr({ url })).not.toThrow()
147
141
  })
142
+ })
148
143
 
149
- test('should send a request with the specified body', () => {
150
- const body = JSON.stringify({ key: 'value' })
144
+ describe('fetchKeepAlive', () => {
145
+ beforeEach(() => {
146
+ global.fetch = jest.fn().mockReturnValue(Promise.resolve())
147
+ })
151
148
 
152
- jest.spyOn(XMLHttpRequest.prototype, 'send')
149
+ afterEach(() => {
150
+ delete global.fetch
151
+ })
153
152
 
154
- submitData.xhr({ url, body })
153
+ test('should make a fetch with default values', () => {
154
+ submitData.fetchKeepAlive({ url })
155
155
 
156
- expect(XMLHttpRequest.prototype.send).toHaveBeenCalledWith(body)
156
+ expect(global.fetch).toHaveBeenCalledWith(url, {
157
+ method: 'POST',
158
+ body: null,
159
+ keepalive: true,
160
+ headers: [['content-type', 'text/plain']]
161
+ })
157
162
  })
158
- })
159
-
160
- describe('submitData.img', () => {
161
- test('should return an HTMLImageElement', () => {
162
- const imageUrl = 'https://example.com/image.png'
163
163
 
164
- const result = submitData.img({ url: imageUrl })
164
+ test('should send the body when provided', () => {
165
+ const body = faker.lorem.paragraph()
166
+ submitData.fetchKeepAlive({ url, body })
165
167
 
166
- expect(result).toBeInstanceOf(HTMLImageElement)
168
+ expect(global.fetch).toHaveBeenCalledWith(url, {
169
+ method: 'POST',
170
+ body,
171
+ keepalive: true,
172
+ headers: [['content-type', 'text/plain']]
173
+ })
167
174
  })
168
175
 
169
- test('should not throw an error if URL is not provided', () => {
170
- expect(() => {
171
- submitData.img({})
172
- }).not.toThrow()
173
- })
176
+ test('should use the provided method', () => {
177
+ submitData.fetchKeepAlive({ url, method: 'HEAD' })
174
178
 
175
- test('should set the src attribute of the image element to the provided URL', () => {
176
- const imageUrl = 'https://example.com/image.png'
179
+ expect(global.fetch).toHaveBeenCalledWith(url, {
180
+ method: 'HEAD',
181
+ body: null,
182
+ keepalive: true,
183
+ headers: [['content-type', 'text/plain']]
184
+ })
185
+ })
177
186
 
178
- const result = submitData.img({ url: imageUrl })
187
+ test('should use the provided headers', () => {
188
+ const headers = [{ key: faker.lorem.word(), value: faker.datatype.uuid() }]
189
+ submitData.fetchKeepAlive({ url, headers })
179
190
 
180
- expect(result.src).toBe(imageUrl)
191
+ expect(global.fetch).toHaveBeenCalledWith(url, {
192
+ method: 'POST',
193
+ body: null,
194
+ keepalive: true,
195
+ headers: [[headers[0].key, headers[0].value]]
196
+ })
181
197
  })
182
198
  })
183
199
 
184
- describe('submitData.beacon', () => {
185
- test('should return true when beacon request succeeds', () => {
186
- const body = JSON.stringify({ key: 'value' })
200
+ describe('beacon', () => {
201
+ afterEach(() => {
202
+ delete window.navigator.sendBeacon
203
+ })
187
204
 
188
- window.navigator.sendBeacon = {
189
- bind: jest.fn(() => () => true)
190
- }
205
+ test('should return true when beacon request succeeds', () => {
206
+ window.navigator.sendBeacon = jest.fn().mockReturnValue(true)
191
207
 
208
+ const body = faker.lorem.paragraph()
192
209
  const result = submitData.beacon({ url, body })
193
210
 
194
211
  expect(result).toBe(true)
212
+ expect(window.navigator.sendBeacon).toHaveBeenCalledWith(url, body)
195
213
  })
196
214
 
197
- test('should return false when beacon request fails', () => {
198
- const body = JSON.stringify({ key: 'value' })
215
+ test('should return false when beacon request returns false', () => {
216
+ window.navigator.sendBeacon = jest.fn().mockReturnValue(false)
199
217
 
200
- window.navigator.sendBeacon = {
201
- bind: jest.fn(() => () => { throw new Error('message') })
202
- }
218
+ const result = submitData.beacon({ url })
203
219
 
204
- const result = submitData.beacon({ url, body })
220
+ expect(result).toBe(false)
221
+ })
222
+
223
+ test('should return false when beacon request throws an error', () => {
224
+ window.navigator.sendBeacon = jest.fn(() => { throw new Error(faker.lorem.sentence()) })
225
+
226
+ const result = submitData.beacon({ url })
205
227
 
206
228
  expect(result).toBe(false)
207
229
  })
208
230
 
209
- test('should error if sendBeacon is not supported', () => {
210
- const body = JSON.stringify({ key: 'value' })
231
+ test('should always bind window.navigator to the sendBeacon function', () => {
232
+ window.navigator.sendBeacon = jest.fn().mockReturnValue(true)
233
+ window.navigator.sendBeacon.bind = jest.fn(() => {})
211
234
 
212
- window.navigator.sendBeacon = undefined
235
+ submitData.beacon({ url })
213
236
 
214
- expect(() => {
215
- submitData.beacon({ url, body })
216
- }).toThrow()
237
+ expect(window.navigator.sendBeacon.bind).toHaveBeenCalledWith(window.navigator)
217
238
  })
218
239
  })
@@ -1,5 +1,5 @@
1
1
  import { now } from '../timing/now'
2
- import { globalScope } from '../util/global-scope'
2
+ import { globalScope } from '../constants/runtime'
3
3
 
4
4
  export const defaults = {
5
5
  beacon: 'bam.nr-data.net',
@@ -10,7 +10,7 @@
10
10
  import { ee as baseEE } from '../event-emitter/contextual-ee'
11
11
  import { createWrapperWithEmitter as wfn } from './wrap-function'
12
12
  import { getOrSet } from '../util/get-or-set'
13
- import { globalScope, isBrowserScope } from '../util/global-scope'
13
+ import { globalScope, isBrowserScope } from '../constants/runtime'
14
14
 
15
15
  const wrapped = {}
16
16
  const XHR = XMLHttpRequest
@@ -7,7 +7,7 @@
7
7
  * This module is used by: ajax, spa.
8
8
  */
9
9
  import { ee as baseEE } from '../event-emitter/contextual-ee'
10
- import { globalScope } from '../util/global-scope'
10
+ import { globalScope } from '../constants/runtime'
11
11
  import { flag } from './wrap-function'
12
12
 
13
13
  var prefix = 'fetch-'
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { ee as globalEE } from '../event-emitter/contextual-ee'
10
10
  import { createWrapperWithEmitter as wfn } from './wrap-function'
11
- import { isBrowserScope } from '../util/global-scope'
11
+ import { isBrowserScope } from '../constants/runtime'
12
12
 
13
13
  const wrapped = {}
14
14
  const HISTORY_FNS = ['pushState', 'replaceState']
@@ -10,7 +10,7 @@
10
10
  import { eventListenerOpts } from '../event-listener/event-listener-opts'
11
11
  import { ee as baseEE } from '../event-emitter/contextual-ee'
12
12
  import { createWrapperWithEmitter as wfn } from './wrap-function'
13
- import { isBrowserScope } from '../util/global-scope'
13
+ import { isBrowserScope } from '../constants/runtime'
14
14
 
15
15
  const wrapped = {}
16
16
  const domInsertMethods = ['appendChild', 'insertBefore', 'replaceChild']
@@ -10,7 +10,7 @@
10
10
  import { ee as baseEE } from '../event-emitter/contextual-ee'
11
11
  import { createWrapperWithEmitter as wfn } from './wrap-function'
12
12
  import { originals } from '../config/config'
13
- import { isBrowserScope } from '../util/global-scope'
13
+ import { isBrowserScope } from '../constants/runtime'
14
14
 
15
15
  const wrapped = {}
16
16
 
@@ -10,7 +10,7 @@
10
10
  import { createWrapperWithEmitter as wrapFn, flag } from './wrap-function'
11
11
  import { ee as baseEE, getOrSetContext } from '../event-emitter/contextual-ee'
12
12
  import { originals } from '../config/config'
13
- import { globalScope } from '../util/global-scope'
13
+ import { globalScope } from '../constants/runtime'
14
14
 
15
15
  const wrapped = {}
16
16
 
@@ -1,5 +1,5 @@
1
1
  import { faker } from '@faker-js/faker'
2
- import { globalScope } from '../util/global-scope'
2
+ import { globalScope } from '../constants/runtime'
3
3
  import { originals } from '../config/config'
4
4
 
5
5
  jest.mock('./wrap-function', () => ({
@@ -24,7 +24,7 @@ jest.mock('../config/config', () => ({
24
24
  __esModule: true,
25
25
  originals: {}
26
26
  }))
27
- jest.mock('../util/global-scope', () => ({
27
+ jest.mock('../constants/runtime', () => ({
28
28
  __esModule: true,
29
29
  globalScope: {
30
30
  NREUM: {}
@@ -4,12 +4,12 @@
4
4
  */
5
5
  /**
6
6
  * @file Wraps `window.requestAnimationFrame` for instrumentation.
7
- * This module is used by: jserror, session_trace.
7
+ * This module is used by: jserror.
8
8
  */
9
9
 
10
10
  import { ee as baseEE } from '../event-emitter/contextual-ee'
11
11
  import { createWrapperWithEmitter as wfn } from './wrap-function'
12
- import { isBrowserScope } from '../util/global-scope'
12
+ import { isBrowserScope } from '../constants/runtime'
13
13
 
14
14
  const wrapped = {}
15
15
  const RAF_NAME = 'requestAnimationFrame'
@@ -4,12 +4,12 @@
4
4
  */
5
5
  /**
6
6
  * @file Wraps native timeout and interval methods for instrumentation.
7
- * This module is used by: jserrors, session_trace, spa.
7
+ * This module is used by: jserrors, spa.
8
8
  */
9
9
 
10
10
  import { ee as baseEE } from '../event-emitter/contextual-ee'
11
11
  import { createWrapperWithEmitter as wfn } from './wrap-function'
12
- import { globalScope } from '../util/global-scope'
12
+ import { globalScope } from '../constants/runtime'
13
13
 
14
14
  const wrapped = {}
15
15
  const SET_TIMEOUT = 'setTimeout'
@@ -12,7 +12,7 @@ import { ee as contextualEE } from '../event-emitter/contextual-ee'
12
12
  import { eventListenerOpts } from '../event-listener/event-listener-opts'
13
13
  import { createWrapperWithEmitter as wfn } from './wrap-function'
14
14
  import { originals } from '../config/config'
15
- import { globalScope } from '../util/global-scope'
15
+ import { globalScope } from '../constants/runtime'
16
16
  import { warn } from '../util/console'
17
17
 
18
18
  const wrapped = {}
@@ -173,7 +173,7 @@ export class Aggregate extends AggregateBase {
173
173
 
174
174
  function onEventsHarvestFinished (result) {
175
175
  if (result.retry && sentAjaxEvents.length > 0 && allAjaxIsEnabled()) {
176
- ajaxEvents = ajaxEvents.concat(sentAjaxEvents)
176
+ ajaxEvents.unshift(...sentAjaxEvents)
177
177
  sentAjaxEvents = []
178
178
  }
179
179
  }
@@ -5,7 +5,7 @@
5
5
  import { getConfiguration, getConfigurationValue, getLoaderConfig } from '../../../common/config/config'
6
6
  import { generateSpanId, generateTraceId } from '../../../common/ids/unique-id'
7
7
  import { parseUrl } from '../../../common/url/parse-url'
8
- import { globalScope } from '../../../common/util/global-scope'
8
+ import { globalScope } from '../../../common/constants/runtime'
9
9
  import { stringify } from '../../../common/util/stringify'
10
10
 
11
11
  export class DT {
@@ -5,7 +5,7 @@
5
5
  import { originals, getLoaderConfig, getRuntime } from '../../../common/config/config'
6
6
  import { handle } from '../../../common/event-emitter/handle'
7
7
  import { id } from '../../../common/ids/id'
8
- import { ffVersion } from '../../../common/browser-version/firefox-version'
8
+ import { ffVersion, globalScope } from '../../../common/constants/runtime'
9
9
  import { dataSize } from '../../../common/util/data-size'
10
10
  import { eventListenerOpts } from '../../../common/event-listener/event-listener-opts'
11
11
  import { now } from '../../../common/timing/now'
@@ -16,7 +16,6 @@ import { responseSizeFromXhr } from './response-size'
16
16
  import { InstrumentBase } from '../../utils/instrument-base'
17
17
  import { FEATURE_NAME } from '../constants'
18
18
  import { FEATURE_NAMES } from '../../../loaders/features/features'
19
- import { globalScope } from '../../../common/util/global-scope'
20
19
 
21
20
  var handlers = ['load', 'error', 'abort', 'timeout']
22
21
  var handlersLen = handlers.length
@@ -4,7 +4,7 @@ import { browserErrorUtils } from '../../../../tools/testing-utils'
4
4
  const globalScopeLocation = 'https://example.com/'
5
5
 
6
6
  const mockGlobalScopeLocation = (url) => {
7
- jest.doMock('../../../common/util/global-scope', () => ({
7
+ jest.doMock('../../../common/constants/runtime', () => ({
8
8
  initialLocation: url || globalScopeLocation
9
9
  }))
10
10
  }
@@ -15,7 +15,7 @@ import { handle } from '../../../common/event-emitter/handle'
15
15
  import { mapOwn } from '../../../common/util/map-own'
16
16
  import { getInfo, getConfigurationValue, getRuntime } from '../../../common/config/config'
17
17
  import { now } from '../../../common/timing/now'
18
- import { globalScope } from '../../../common/util/global-scope'
18
+ import { globalScope } from '../../../common/constants/runtime'
19
19
 
20
20
  import { FEATURE_NAME } from '../constants'
21
21
  import { drain } from '../../../common/drain/drain'
@@ -32,6 +32,7 @@ export class Aggregate extends AggregateBase {
32
32
  super(agentIdentifier, aggregator, FEATURE_NAME)
33
33
 
34
34
  this.stackReported = {}
35
+ this.observedAt = {}
35
36
  this.pageviewReported = {}
36
37
  this.errorCache = {}
37
38
  this.currentBody
@@ -92,7 +93,7 @@ export class Aggregate extends AggregateBase {
92
93
  mapOwn(this.currentBody, (key, value) => {
93
94
  for (var i = 0; i < value.length; i++) {
94
95
  var bucket = value[i]
95
- var name = this.getBucketName(bucket.params, bucket.custom)
96
+ var name = this.getBucketName(key, bucket.params, bucket.custom)
96
97
  this.aggregator.merge(key, name, bucket.metrics, bucket.params, bucket.custom)
97
98
  }
98
99
  })
@@ -104,7 +105,11 @@ export class Aggregate extends AggregateBase {
104
105
  return stringHashCode(`${params.exceptionClass}_${params.message}_${params.stack_trace || params.browser_stack_hash}`)
105
106
  }
106
107
 
107
- getBucketName (params, customParams) {
108
+ getBucketName (objType, params, customParams) {
109
+ if (objType === 'xhr') {
110
+ return stringHashCode(stringify(params)) + ':' + stringHashCode(stringify(customParams))
111
+ }
112
+
108
113
  return this.nameHash(params) + ':' + stringHashCode(stringify(customParams))
109
114
  }
110
115
 
@@ -171,6 +176,7 @@ export class Aggregate extends AggregateBase {
171
176
  if (!this.stackReported[bucketHash]) {
172
177
  this.stackReported[bucketHash] = true
173
178
  params.stack_trace = truncateSize(stackInfo.stackString)
179
+ this.observedAt[bucketHash] = agentRuntime.offset + time
174
180
  } else {
175
181
  params.browser_stack_hash = stringHashCode(stackInfo.stackString)
176
182
  }
@@ -186,6 +192,9 @@ export class Aggregate extends AggregateBase {
186
192
  this.pageviewReported[bucketHash] = true
187
193
  }
188
194
 
195
+ if (agentRuntime?.session?.state?.sessionReplay) params.hasReplay = true
196
+ params.firstOccurrenceTimestamp = this.observedAt[bucketHash]
197
+
189
198
  var type = internal ? 'ierr' : 'err'
190
199
  var newMetrics = { time: time }
191
200