@newrelic/browser-agent 1.237.1 → 1.239.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 (307) hide show
  1. package/dist/cjs/common/config/state/init.js +21 -13
  2. package/dist/cjs/common/config/state/runtime.js +0 -4
  3. package/dist/cjs/common/constants/env.cdn.js +1 -1
  4. package/dist/cjs/common/constants/env.npm.js +1 -1
  5. package/dist/cjs/common/constants/runtime.js +3 -3
  6. package/dist/cjs/common/constants/shared-channel.js +3 -1
  7. package/dist/cjs/common/deny-list/deny-list.js +3 -9
  8. package/dist/cjs/common/drain/drain.js +1 -1
  9. package/dist/cjs/common/event-emitter/contextual-ee.js +24 -32
  10. package/dist/cjs/common/event-emitter/event-context.js +12 -0
  11. package/dist/cjs/common/harvest/harvest-scheduler.js +2 -4
  12. package/dist/cjs/common/harvest/harvest.js +4 -7
  13. package/dist/cjs/common/ids/bundle-id.js +19 -0
  14. package/dist/cjs/common/serialize/bel-serializer.js +1 -1
  15. package/dist/cjs/common/session/session-entity.js +16 -12
  16. package/dist/cjs/common/storage/first-party-cookies.js +5 -4
  17. package/dist/cjs/common/storage/local-storage.js +3 -2
  18. package/dist/cjs/common/timer/interaction-timer.js +14 -6
  19. package/dist/cjs/common/timing/nav-timing.js +1 -1
  20. package/dist/cjs/common/unload/eol.js +4 -30
  21. package/dist/cjs/common/util/feature-flags.js +14 -15
  22. package/dist/cjs/common/util/invoke.js +3 -1
  23. package/dist/cjs/common/util/obfuscate.js +3 -5
  24. package/dist/cjs/common/util/traverse.js +1 -0
  25. package/dist/cjs/common/window/page-visibility.js +1 -2
  26. package/dist/cjs/common/wrap/wrap-events.js +3 -2
  27. package/dist/cjs/common/wrap/wrap-fetch.js +1 -3
  28. package/dist/cjs/common/wrap/wrap-function.js +15 -46
  29. package/dist/cjs/common/wrap/wrap-jsonp.js +1 -1
  30. package/dist/cjs/common/wrap/wrap-mutation.js +1 -2
  31. package/dist/cjs/common/wrap/wrap-promise.js +2 -3
  32. package/dist/cjs/common/wrap/wrap-xhr.js +23 -27
  33. package/dist/cjs/features/ajax/aggregate/index.js +5 -7
  34. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +8 -12
  35. package/dist/cjs/features/ajax/instrument/index.js +66 -24
  36. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.js +0 -1
  37. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  38. package/dist/cjs/features/jserrors/aggregate/index.js +4 -5
  39. package/dist/cjs/features/metrics/aggregate/framework-detection.js +103 -7
  40. package/dist/cjs/features/metrics/aggregate/index.js +20 -37
  41. package/dist/cjs/features/metrics/instrument/index.js +0 -2
  42. package/dist/cjs/features/page_action/aggregate/index.js +17 -19
  43. package/dist/cjs/features/page_view_event/aggregate/index.js +1 -2
  44. package/dist/cjs/features/page_view_event/instrument/index.js +4 -2
  45. package/dist/cjs/features/page_view_timing/aggregate/index.js +6 -7
  46. package/dist/cjs/features/session_replay/aggregate/index.js +5 -3
  47. package/dist/cjs/features/session_trace/aggregate/index.js +22 -16
  48. package/dist/cjs/features/spa/aggregate/index.js +14 -20
  49. package/dist/cjs/features/spa/aggregate/interaction.js +0 -2
  50. package/dist/cjs/features/spa/aggregate/serializer.js +1 -1
  51. package/dist/cjs/features/utils/aggregate-base.js +4 -0
  52. package/dist/cjs/features/utils/handler-cache.js +3 -1
  53. package/dist/cjs/features/utils/instrument-base.js +24 -6
  54. package/dist/cjs/loaders/agent-base.js +23 -0
  55. package/dist/cjs/loaders/agent.js +7 -7
  56. package/dist/cjs/loaders/api/api.js +34 -4
  57. package/dist/cjs/loaders/api/apiAsync.js +19 -20
  58. package/dist/cjs/loaders/api/interaction-types.js +11 -4
  59. package/dist/cjs/loaders/configure/configure.js +3 -0
  60. package/dist/cjs/loaders/micro-agent.js +20 -3
  61. package/dist/esm/common/config/state/init.js +21 -13
  62. package/dist/esm/common/config/state/runtime.js +0 -4
  63. package/dist/esm/common/constants/env.cdn.js +1 -1
  64. package/dist/esm/common/constants/env.npm.js +1 -1
  65. package/dist/esm/common/constants/runtime.js +1 -1
  66. package/dist/esm/common/constants/shared-channel.js +3 -1
  67. package/dist/esm/common/deny-list/deny-list.js +3 -9
  68. package/dist/esm/common/drain/drain.js +1 -1
  69. package/dist/esm/common/event-emitter/contextual-ee.js +22 -29
  70. package/dist/esm/common/event-emitter/event-context.js +5 -0
  71. package/dist/esm/common/harvest/harvest-scheduler.js +2 -4
  72. package/dist/esm/common/harvest/harvest.js +4 -7
  73. package/dist/esm/common/ids/bundle-id.js +13 -0
  74. package/dist/esm/common/serialize/bel-serializer.js +1 -1
  75. package/dist/esm/common/session/session-entity.js +16 -12
  76. package/dist/esm/common/storage/first-party-cookies.js +5 -4
  77. package/dist/esm/common/storage/local-storage.js +3 -2
  78. package/dist/esm/common/timer/interaction-timer.js +14 -6
  79. package/dist/esm/common/timing/nav-timing.js +1 -1
  80. package/dist/esm/common/unload/eol.js +5 -31
  81. package/dist/esm/common/util/feature-flags.js +14 -15
  82. package/dist/esm/common/util/invoke.js +3 -1
  83. package/dist/esm/common/util/obfuscate.js +3 -5
  84. package/dist/esm/common/util/traverse.js +1 -0
  85. package/dist/esm/common/window/page-visibility.js +1 -2
  86. package/dist/esm/common/wrap/wrap-events.js +4 -3
  87. package/dist/esm/common/wrap/wrap-fetch.js +2 -4
  88. package/dist/esm/common/wrap/wrap-function.js +15 -44
  89. package/dist/esm/common/wrap/wrap-jsonp.js +1 -1
  90. package/dist/esm/common/wrap/wrap-mutation.js +2 -3
  91. package/dist/esm/common/wrap/wrap-promise.js +3 -4
  92. package/dist/esm/common/wrap/wrap-xhr.js +23 -27
  93. package/dist/esm/features/ajax/aggregate/index.js +5 -7
  94. package/dist/esm/features/ajax/instrument/distributed-tracing.js +8 -12
  95. package/dist/esm/features/ajax/instrument/index.js +67 -25
  96. package/dist/esm/features/jserrors/aggregate/canonical-function-name.js +0 -1
  97. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  98. package/dist/esm/features/jserrors/aggregate/index.js +4 -5
  99. package/dist/esm/features/metrics/aggregate/framework-detection.js +103 -7
  100. package/dist/esm/features/metrics/aggregate/index.js +22 -39
  101. package/dist/esm/features/metrics/instrument/index.js +1 -3
  102. package/dist/esm/features/page_action/aggregate/index.js +17 -19
  103. package/dist/esm/features/page_view_event/aggregate/index.js +1 -2
  104. package/dist/esm/features/page_view_event/instrument/index.js +4 -2
  105. package/dist/esm/features/page_view_timing/aggregate/index.js +7 -8
  106. package/dist/esm/features/session_replay/aggregate/index.js +4 -2
  107. package/dist/esm/features/session_trace/aggregate/index.js +22 -16
  108. package/dist/esm/features/spa/aggregate/index.js +14 -20
  109. package/dist/esm/features/spa/aggregate/interaction.js +0 -2
  110. package/dist/esm/features/spa/aggregate/serializer.js +1 -1
  111. package/dist/esm/features/utils/aggregate-base.js +4 -0
  112. package/dist/esm/features/utils/handler-cache.js +3 -1
  113. package/dist/esm/features/utils/instrument-base.js +24 -6
  114. package/dist/esm/loaders/agent-base.js +23 -0
  115. package/dist/esm/loaders/agent.js +7 -7
  116. package/dist/esm/loaders/api/api.js +34 -4
  117. package/dist/esm/loaders/api/apiAsync.js +19 -20
  118. package/dist/esm/loaders/api/interaction-types.js +11 -4
  119. package/dist/esm/loaders/configure/configure.js +3 -0
  120. package/dist/esm/loaders/features/enabled-features.js +1 -1
  121. package/dist/esm/loaders/micro-agent.js +21 -4
  122. package/dist/types/common/config/state/init.d.ts.map +1 -1
  123. package/dist/types/common/config/state/runtime.d.ts.map +1 -1
  124. package/dist/types/common/constants/runtime.d.ts +1 -1
  125. package/dist/types/common/constants/runtime.d.ts.map +1 -1
  126. package/dist/types/common/event-emitter/contextual-ee.d.ts +22 -2
  127. package/dist/types/common/event-emitter/contextual-ee.d.ts.map +1 -1
  128. package/dist/types/common/event-emitter/event-context.d.ts +5 -0
  129. package/dist/types/common/event-emitter/event-context.d.ts.map +1 -0
  130. package/dist/types/common/event-emitter/register-handler.d.ts +1 -1
  131. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
  132. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  133. package/dist/types/common/ids/bundle-id.d.ts +5 -0
  134. package/dist/types/common/ids/bundle-id.d.ts.map +1 -0
  135. package/dist/types/common/session/session-entity.d.ts +12 -15
  136. package/dist/types/common/session/session-entity.d.ts.map +1 -1
  137. package/dist/types/common/storage/first-party-cookies.d.ts +1 -1
  138. package/dist/types/common/storage/first-party-cookies.d.ts.map +1 -1
  139. package/dist/types/common/storage/local-storage.d.ts.map +1 -1
  140. package/dist/types/common/timer/interaction-timer.d.ts +3 -0
  141. package/dist/types/common/timer/interaction-timer.d.ts.map +1 -1
  142. package/dist/types/common/unload/eol.d.ts +1 -2
  143. package/dist/types/common/unload/eol.d.ts.map +1 -1
  144. package/dist/types/common/util/feature-flags.d.ts.map +1 -1
  145. package/dist/types/common/util/obfuscate.d.ts.map +1 -1
  146. package/dist/types/common/util/traverse.d.ts.map +1 -1
  147. package/dist/types/common/window/nreum.d.ts +2 -2
  148. package/dist/types/common/window/page-visibility.d.ts.map +1 -1
  149. package/dist/types/common/wrap/wrap-events.d.ts.map +1 -1
  150. package/dist/types/common/wrap/wrap-fetch.d.ts.map +1 -1
  151. package/dist/types/common/wrap/wrap-function.d.ts +1 -19
  152. package/dist/types/common/wrap/wrap-function.d.ts.map +1 -1
  153. package/dist/types/common/wrap/wrap-mutation.d.ts.map +1 -1
  154. package/dist/types/common/wrap/wrap-promise.d.ts.map +1 -1
  155. package/dist/types/common/wrap/wrap-xhr.d.ts.map +1 -1
  156. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
  157. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts +1 -1
  158. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts.map +1 -1
  159. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
  160. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts.map +1 -1
  161. package/dist/types/features/jserrors/aggregate/index.d.ts +1 -1
  162. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  163. package/dist/types/features/metrics/aggregate/framework-detection.d.ts.map +1 -1
  164. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
  165. package/dist/types/features/metrics/instrument/index.d.ts.map +1 -1
  166. package/dist/types/features/page_action/aggregate/index.d.ts +2 -2
  167. package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -1
  168. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  169. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  170. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
  171. package/dist/types/features/session_trace/aggregate/index.d.ts +5 -0
  172. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  173. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
  174. package/dist/types/features/spa/aggregate/interaction.d.ts.map +1 -1
  175. package/dist/types/features/utils/aggregate-base.d.ts +1 -0
  176. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
  177. package/dist/types/features/utils/handler-cache.d.ts.map +1 -1
  178. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  179. package/dist/types/loaders/agent-base.d.ts +15 -0
  180. package/dist/types/loaders/agent-base.d.ts.map +1 -1
  181. package/dist/types/loaders/agent.d.ts +1 -1
  182. package/dist/types/loaders/agent.d.ts.map +1 -1
  183. package/dist/types/loaders/api/api.d.ts +7 -0
  184. package/dist/types/loaders/api/api.d.ts.map +1 -1
  185. package/dist/types/loaders/api/apiAsync.d.ts.map +1 -1
  186. package/dist/types/loaders/api/interaction-types.d.ts +18 -7
  187. package/dist/types/loaders/api/interaction-types.d.ts.map +1 -1
  188. package/dist/types/loaders/configure/configure.d.ts +2 -0
  189. package/dist/types/loaders/configure/configure.d.ts.map +1 -1
  190. package/dist/types/loaders/features/features.d.ts +9 -9
  191. package/dist/types/loaders/micro-agent.d.ts +7 -1
  192. package/dist/types/loaders/micro-agent.d.ts.map +1 -1
  193. package/package.json +62 -38
  194. package/src/common/aggregate/aggregator.test.js +107 -0
  195. package/src/common/config/state/configurable.test.js +73 -0
  196. package/src/common/config/state/info.test.js +31 -0
  197. package/src/common/config/state/init.js +13 -12
  198. package/src/common/config/state/init.test.js +28 -0
  199. package/src/common/config/state/loader-config.test.js +21 -0
  200. package/src/common/config/state/runtime.js +0 -2
  201. package/src/common/config/state/runtime.test.js +21 -0
  202. package/src/common/constants/__mocks__/runtime.js +1 -1
  203. package/src/common/constants/runtime.js +1 -1
  204. package/src/common/constants/runtime.test.js +2 -2
  205. package/src/common/constants/shared-channel.js +1 -1
  206. package/src/common/deny-list/deny-list.js +3 -11
  207. package/src/common/deny-list/deny-list.test.js +103 -30
  208. package/src/common/drain/drain.js +1 -1
  209. package/src/common/drain/drain.test.js +74 -0
  210. package/src/common/event-emitter/{contextual-ee.test.js → contextual-ee.component-test.js} +15 -32
  211. package/src/common/event-emitter/contextual-ee.js +26 -37
  212. package/src/common/event-emitter/event-context.js +5 -0
  213. package/src/common/harvest/harvest-scheduler.js +2 -5
  214. package/src/common/harvest/harvest-scheduler.test.js +2 -6
  215. package/src/common/harvest/harvest.js +4 -7
  216. package/src/common/harvest/harvest.test.js +1 -3
  217. package/src/common/ids/__mocks__/bundle-id.js +2 -0
  218. package/src/common/ids/__mocks__/unique-id.js +17 -0
  219. package/src/common/ids/bundle-id.js +13 -0
  220. package/src/common/ids/id.test.js +6 -6
  221. package/src/common/serialize/bel-serializer.js +1 -1
  222. package/src/common/session/session-entity.component-test.js +3 -2
  223. package/src/common/session/session-entity.js +11 -9
  224. package/src/common/storage/first-party-cookies.js +5 -4
  225. package/src/common/storage/local-storage.js +3 -2
  226. package/src/common/timer/interaction-timer.component-test.js +52 -7
  227. package/src/common/timer/interaction-timer.js +15 -6
  228. package/src/common/timer/timer.test.js +0 -1
  229. package/src/common/timing/nav-timing.js +1 -1
  230. package/src/common/unload/eol.js +5 -31
  231. package/src/common/url/__mocks__/parse-url.js +15 -0
  232. package/src/common/url/{encode.component-test.js → encode.test.js} +1 -0
  233. package/src/common/util/__mocks__/get-or-set.js +5 -0
  234. package/src/common/util/__mocks__/invoke.js +1 -0
  235. package/src/common/util/data-size.test.js +0 -1
  236. package/src/common/util/feature-flags.js +15 -17
  237. package/src/common/util/feature-flags.test.js +4 -8
  238. package/src/common/util/invoke.js +1 -1
  239. package/src/common/util/obfuscate.js +3 -5
  240. package/src/common/util/submit-data.test.js +1 -1
  241. package/src/common/util/traverse.js +1 -0
  242. package/src/common/window/__mocks__/nreum.js +12 -0
  243. package/src/common/window/page-visibility.js +1 -2
  244. package/src/common/wrap/wrap-events.js +4 -3
  245. package/src/common/wrap/wrap-fetch.js +2 -4
  246. package/src/common/wrap/wrap-function.js +16 -44
  247. package/src/common/wrap/wrap-jsonp.js +1 -1
  248. package/src/common/wrap/wrap-mutation.js +2 -3
  249. package/src/common/wrap/{wrap-promise.test.js → wrap-promise.component-test.js} +2 -32
  250. package/src/common/wrap/wrap-promise.js +3 -4
  251. package/src/common/wrap/wrap-xhr.js +24 -28
  252. package/src/features/ajax/aggregate/index.js +5 -7
  253. package/src/features/ajax/instrument/distributed-tracing.js +8 -12
  254. package/src/features/ajax/instrument/distributed-tracing.test.js +375 -0
  255. package/src/features/ajax/instrument/index.js +62 -27
  256. package/src/features/jserrors/aggregate/canonical-function-name.js +0 -2
  257. package/src/features/jserrors/aggregate/compute-stack-trace.js +4 -4
  258. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +1 -1
  259. package/src/features/jserrors/aggregate/index.js +4 -5
  260. package/src/features/metrics/aggregate/framework-detection.js +129 -8
  261. package/src/features/metrics/aggregate/framework-detection.test.js +213 -82
  262. package/src/features/metrics/aggregate/index.js +22 -45
  263. package/src/features/metrics/instrument/index.js +1 -3
  264. package/src/features/page_action/aggregate/index.js +12 -13
  265. package/src/features/page_view_event/aggregate/index.js +1 -2
  266. package/src/features/page_view_event/instrument/index.js +2 -2
  267. package/src/features/page_view_timing/aggregate/index.js +7 -8
  268. package/src/features/session_replay/aggregate/index.component-test.js +3 -15
  269. package/src/features/session_replay/aggregate/index.js +4 -2
  270. package/src/features/session_trace/aggregate/index.js +22 -16
  271. package/src/features/spa/aggregate/index.js +14 -20
  272. package/src/features/spa/aggregate/interaction.js +0 -2
  273. package/src/features/spa/aggregate/serializer.js +1 -1
  274. package/src/features/utils/aggregate-base.js +5 -0
  275. package/src/features/utils/aggregate-base.test.js +2 -1
  276. package/src/features/utils/handler-cache.js +3 -2
  277. package/src/features/utils/instrument-base.js +25 -6
  278. package/src/features/utils/instrument-base.test.js +2 -2
  279. package/src/loaders/agent-base.js +23 -0
  280. package/src/loaders/agent.js +7 -7
  281. package/src/loaders/api/api.component-test.js +45 -0
  282. package/src/loaders/api/api.js +34 -4
  283. package/src/loaders/api/api.test.js +85 -0
  284. package/src/loaders/api/apiAsync.js +19 -20
  285. package/src/loaders/api/apiAsync.test.js +17 -0
  286. package/src/loaders/api/interaction-types.js +11 -4
  287. package/src/loaders/configure/configure.js +3 -0
  288. package/src/loaders/features/enabled-features.js +1 -1
  289. package/src/loaders/micro-agent.js +22 -4
  290. package/dist/cjs/features/metrics/aggregate/endpoint-map.js +0 -14
  291. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.js +0 -14
  292. package/dist/cjs/features/metrics/aggregate/polyfill-detection.js +0 -53
  293. package/dist/esm/features/metrics/aggregate/endpoint-map.js +0 -7
  294. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.js +0 -8
  295. package/dist/esm/features/metrics/aggregate/polyfill-detection.js +0 -47
  296. package/dist/types/features/metrics/aggregate/endpoint-map.d.ts +0 -8
  297. package/dist/types/features/metrics/aggregate/endpoint-map.d.ts.map +0 -1
  298. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts +0 -6
  299. package/dist/types/features/metrics/aggregate/polyfill-detection.d.ts.map +0 -1
  300. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts +0 -7
  301. package/dist/types/features/metrics/aggregate/polyfill-detection.es5.d.ts.map +0 -1
  302. package/src/features/metrics/aggregate/endpoint-map.js +0 -7
  303. package/src/features/metrics/aggregate/polyfill-detection.es5.js +0 -8
  304. package/src/features/metrics/aggregate/polyfill-detection.es5.test.js +0 -16
  305. package/src/features/metrics/aggregate/polyfill-detection.js +0 -48
  306. package/src/features/metrics/aggregate/polyfill-detection.test.js +0 -163
  307. /package/src/common/url/{protocol.component-test.js → protocol.test.js} +0 -0
@@ -7,7 +7,6 @@ exports.activateFeatures = activateFeatures;
7
7
  exports.activatedFeatures = void 0;
8
8
  var _contextualEe = require("../event-emitter/contextual-ee");
9
9
  var _handle = require("../event-emitter/handle");
10
- var _drain = require("../drain/drain");
11
10
  var _features = require("../../loaders/features/features");
12
11
  /*
13
12
  * Copyright 2020 New Relic Corporation. All rights reserved.
@@ -21,24 +20,24 @@ const bucketMap = {
21
20
  spa: [_features.FEATURE_NAMES.spa],
22
21
  sr: [_features.FEATURE_NAMES.sessionReplay, _features.FEATURE_NAMES.sessionTrace]
23
22
  };
23
+ const sentIds = new Set();
24
24
 
25
25
  /** Note that this function only processes each unique flag ONCE, with the first occurrence of each flag and numeric value determining its switch on/off setting. */
26
26
  function activateFeatures(flags, agentIdentifier) {
27
27
  const sharedEE = _contextualEe.ee.get(agentIdentifier);
28
28
  if (!(flags && typeof flags === 'object')) return;
29
- Object.entries(flags).forEach(_ref => {
30
- let [flag, num] = _ref;
31
- if (activatedFeatures[flag] !== undefined) return;
32
- if (bucketMap[flag]) {
33
- bucketMap[flag].forEach(feat => {
34
- if (!num) (0, _handle.handle)('block-' + flag, [], undefined, feat, sharedEE);else (0, _handle.handle)('feat-' + flag, [], undefined, feat, sharedEE);
35
- (0, _handle.handle)('rumresp-' + flag, [Boolean(num)], undefined, feat, sharedEE); // this is a duplicate of feat-/block- but makes awaiting for 1 event easier than 2
36
- });
37
- } else if (num) (0, _handle.handle)('feat-' + flag, [], undefined, undefined, sharedEE); // not sure what other flags are overlooked, but there's a test for ones not in the map --
38
- // ^^^ THIS DOESN'T ACTUALLY DO ANYTHHING AS UNDEFINED/FEATURE GROUP ISN'T DRAINED
39
-
40
- activatedFeatures[flag] = Boolean(num);
41
- });
29
+ if (!sentIds.has(agentIdentifier)) {
30
+ Object.entries(flags).forEach(_ref => {
31
+ let [flag, num] = _ref;
32
+ if (bucketMap[flag]) {
33
+ bucketMap[flag].forEach(feat => {
34
+ if (!num) (0, _handle.handle)('block-' + flag, [], undefined, feat, sharedEE);else (0, _handle.handle)('feat-' + flag, [], undefined, feat, sharedEE);
35
+ (0, _handle.handle)('rumresp-' + flag, [Boolean(num)], undefined, feat, sharedEE); // this is a duplicate of feat-/block- but makes awaiting for 1 event easier than 2
36
+ });
37
+ } else if (num) (0, _handle.handle)('feat-' + flag, [], undefined, undefined, sharedEE); // not sure what other flags are overlooked, but there's a test for ones not in the map --
38
+ activatedFeatures[flag] = Boolean(num);
39
+ });
40
+ }
42
41
 
43
42
  // Let the features waiting on their respective flags know that RUM response was received and that any missing flags are interpreted as bad entitlement / "off".
44
43
  // Hence, those features will not be hanging forever if their flags aren't included in the response.
@@ -48,7 +47,7 @@ function activateFeatures(flags, agentIdentifier) {
48
47
  activatedFeatures[flag] = false;
49
48
  }
50
49
  });
51
- (0, _drain.drain)(agentIdentifier, _features.FEATURE_NAMES.pageViewEvent);
50
+ sentIds.add(agentIdentifier);
52
51
  }
53
52
  const activatedFeatures = {};
54
53
  exports.activatedFeatures = activatedFeatures;
@@ -39,7 +39,9 @@ function debounce(func) {
39
39
  }
40
40
  if (leading && timer === undefined) {
41
41
  func.apply(_this, args);
42
- timer = setTimeout(() => timer = clearTimeout(timer), timeout);
42
+ timer = setTimeout(() => {
43
+ timer = clearTimeout(timer);
44
+ }, timeout);
43
45
  }
44
46
  if (!leading) {
45
47
  clearTimeout(timer);
@@ -61,11 +61,9 @@ function validateRules(rules) {
61
61
  invalidRegexDetected = true;
62
62
  }
63
63
  var replacement = rules[i].replacement;
64
- if (replacement) {
65
- if (typeof replacement !== 'string') {
66
- (0, _console.warn)('An obfuscation replacement rule contains a "replacement" value with an invalid type (must be a string)');
67
- invalidReplacementDetected = true;
68
- }
64
+ if (replacement && typeof replacement !== 'string') {
65
+ (0, _console.warn)('An obfuscation replacement rule contains a "replacement" value with an invalid type (must be a string)');
66
+ invalidReplacementDetected = true;
69
67
  }
70
68
  }
71
69
  return !invalidReplacementDetected && !invalidRegexDetected;
@@ -26,6 +26,7 @@ function applyFnToProps(obj, fn) {
26
26
  if (typeof obj[property] === 'object') {
27
27
  applyFnToProps(obj[property], fn, type, ignoreKeys);
28
28
  } else {
29
+ // eslint-disable-next-line valid-typeof
29
30
  if (typeof obj[property] === type && !ignoreKeys.includes(property)) obj[property] = fn(obj[property]);
30
31
  }
31
32
  });
@@ -20,11 +20,10 @@ function subscribeToVisibilityChange(cb) {
20
20
  let capture = arguments.length > 2 ? arguments[2] : undefined;
21
21
  let abortSignal = arguments.length > 3 ? arguments[3] : undefined;
22
22
  (0, _eventListenerOpts.documentAddEventListener)('visibilitychange', handleVisibilityChange, capture, abortSignal);
23
- return;
24
23
  function handleVisibilityChange() {
25
24
  if (toHiddenOnly) {
26
25
  // trigger cb on change to hidden state only
27
- if (document.visibilityState == 'hidden') cb();
26
+ if (document.visibilityState === 'hidden') cb();
28
27
  return;
29
28
  }
30
29
  cb(document.visibilityState);
@@ -20,9 +20,10 @@ var _runtime = require("../constants/runtime");
20
20
  */
21
21
 
22
22
  const wrapped = {};
23
- const XHR = XMLHttpRequest;
23
+ const XHR = _runtime.globalScope.XMLHttpRequest;
24
24
  const ADD_EVENT_LISTENER = 'addEventListener';
25
25
  const REMOVE_EVENT_LISTENER = 'removeEventListener';
26
+ const flag = "nr@wrapped:".concat(_contextualEe.contextId);
26
27
 
27
28
  /**
28
29
  * Wraps `addEventListener` and `removeEventListener` on: global scope; the prototype of `XMLHttpRequest`, and
@@ -51,7 +52,7 @@ function wrapEvents(sharedEE) {
51
52
  if (originalListener === null || typeof originalListener !== 'function' && typeof originalListener !== 'object') {
52
53
  return;
53
54
  }
54
- var wrapped = (0, _getOrSet.getOrSet)(originalListener, 'nr@wrapped', function () {
55
+ var wrapped = (0, _getOrSet.getOrSet)(originalListener, flag, function () {
55
56
  var listener = {
56
57
  object: wrapHandleEvent,
57
58
  function: originalListener
@@ -7,7 +7,6 @@ exports.scopedEE = scopedEE;
7
7
  exports.wrapFetch = wrapFetch;
8
8
  var _contextualEe = require("../event-emitter/contextual-ee");
9
9
  var _runtime = require("../constants/runtime");
10
- var _wrapFunction = require("./wrap-function");
11
10
  /*
12
11
  * Copyright 2020 New Relic Corporation. All rights reserved.
13
12
  * SPDX-License-Identifier: Apache-2.0
@@ -23,7 +22,6 @@ var bodyMethods = ['arrayBuffer', 'blob', 'json', 'text', 'formData'];
23
22
  var Req = _runtime.globalScope.Request;
24
23
  var Res = _runtime.globalScope.Response;
25
24
  var proto = 'prototype';
26
- var ctxId = 'nr@context';
27
25
  const wrapped = {};
28
26
 
29
27
  /**
@@ -80,7 +78,7 @@ function wrapFetch(sharedEE) {
80
78
  // we are wrapping args in an array so we can preserve the reference
81
79
  ee.emit(prefix + 'before-start', [args], ctx);
82
80
  var dtPayload;
83
- if (ctx[ctxId] && ctx[ctxId].dt) dtPayload = ctx[ctxId].dt;
81
+ if (ctx[_contextualEe.contextId] && ctx[_contextualEe.contextId].dt) dtPayload = ctx[_contextualEe.contextId].dt;
84
82
  var origPromiseFromFetch = fn.apply(this, args);
85
83
  ee.emit(prefix + 'start', [args, dtPayload], origPromiseFromFetch);
86
84
 
@@ -5,9 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createWrapperWithEmitter = createWrapperWithEmitter;
7
7
  exports.flag = exports.default = void 0;
8
- exports.wrapFunction = wrapFunction;
9
- exports.wrapInPlace = wrapInPlace;
10
8
  var _contextualEe = require("../event-emitter/contextual-ee");
9
+ var _bundleId = require("../ids/bundle-id");
11
10
  /*
12
11
  * Copyright 2020 New Relic Corporation. All rights reserved.
13
12
  * SPDX-License-Identifier: Apache-2.0
@@ -16,7 +15,7 @@ var _contextualEe = require("../event-emitter/contextual-ee");
16
15
  * @file Provides helper functions for wrapping functions in various scenarios.
17
16
  */
18
17
 
19
- const flag = 'nr@original';
18
+ const flag = "nr@original:".concat(_bundleId.bundleId);
20
19
 
21
20
  /**
22
21
  * A convenience alias of `hasOwnProperty`.
@@ -110,25 +109,23 @@ function createWrapperWithEmitter(emitter, always) {
110
109
 
111
110
  /**
112
111
  * Creates wrapper functions around each of an array of methods on a specified object.
113
- * @param {Object} obj - The object to which the specified methods belong.
114
- * @param {string[]} methods - An array of method names to be wrapped.
115
- * @param {string} [prefix=''] - A prefix to add to the names of emitted events. If `-` is the first character, also
116
- * adds the method name before the prefix.
117
- * @param {function|object} [getContext] - The function or object that will serve as the 'this' context for handlers
118
- * of events emitted by this wrapper.
119
- * @param {boolean} [bubble=false] - If `true`, emitted events should also bubble up to the old emitter upon which
120
- * the `emitter` in the current scope was based (if it defines one).
112
+ * @param {Object} obj The object to which the specified methods belong.
113
+ * @param {string[]} methods An array of method names to be wrapped.
114
+ * @param {string} [prefix=''] A prefix to add to the names of emitted events. If `-` is the first character, also
115
+ * adds the method name before the prefix.
116
+ * @param {function|object} [getContext] The function or object that will serve as the 'this' context for handlers
117
+ * of events emitted by this wrapper.
118
+ * @param {boolean} [bubble=false] If `true`, emitted events should also bubble up to the old emitter upon which
119
+ * the `emitter` in the current scope was based (if it defines one).
121
120
  */
122
121
  function inPlace(obj, methods, prefix, getContext, bubble) {
123
122
  if (!prefix) prefix = '';
123
+
124
124
  // If prefix starts with '-' set this boolean to add the method name to the prefix before passing each one to wrap.
125
- var prependMethodPrefix = prefix.charAt(0) === '-';
126
- var fn;
127
- var method;
128
- var i;
129
- for (i = 0; i < methods.length; i++) {
130
- method = methods[i];
131
- fn = obj[method];
125
+ const prependMethodPrefix = prefix.charAt(0) === '-';
126
+ for (let i = 0; i < methods.length; i++) {
127
+ const method = methods[i];
128
+ const fn = obj[method];
132
129
 
133
130
  // Unless fn is both wrappable and unwrapped, bail so we don't add extra properties with undefined values.
134
131
  if (notWrappable(fn)) continue;
@@ -222,32 +219,4 @@ function copy(from, to, emitter) {
222
219
  */
223
220
  function notWrappable(fn) {
224
221
  return !(fn && fn instanceof Function && fn.apply && !fn[flag]);
225
- }
226
-
227
- /**
228
- * Creates a wrapped version of a function using a specified wrapper function. The new wrapped function references the
229
- * original function. Also copies the properties of the original function to the wrapped function.
230
- * @param {function} fn - A function to be wrapped.
231
- * @param {function} wrapper - A higher order function that returns a new function, which executes the function passed
232
- * to the higher order function as an argument.
233
- * @returns {function} A wrapped function with an internal reference to the original function.
234
- */
235
- function wrapFunction(fn, wrapper) {
236
- var wrapped = wrapper(fn);
237
- wrapped[flag] = fn;
238
- copy(fn, wrapped, _contextualEe.ee);
239
- return wrapped;
240
- }
241
-
242
- /**
243
- * Replaces a function with a wrapped version of itself. To preserve object references, rather than taking the function
244
- * itself as an argument, takes the object on which the particular named function is a property.
245
- * @param {Object} obj - The object on which the named function is a property.
246
- * @param {string} fnName - The name of the function to be wrapped.
247
- * @param {function} wrapper - A higher order function that returns a new function, which executes the function passed
248
- * to the higher order function as an argument.
249
- */
250
- function wrapInPlace(obj, fnName, wrapper) {
251
- var fn = obj[fnName];
252
- obj[fnName] = wrapFunction(fn, wrapper);
253
222
  }
@@ -117,7 +117,7 @@ function wrapJsonP(sharedEE) {
117
117
  };
118
118
  }
119
119
  return {
120
- key: key,
120
+ key,
121
121
  parent: window
122
122
  };
123
123
  }
@@ -7,7 +7,6 @@ exports.scopedEE = scopedEE;
7
7
  exports.wrapMutation = wrapMutation;
8
8
  var _contextualEe = require("../event-emitter/contextual-ee");
9
9
  var _wrapFunction = require("./wrap-function");
10
- var _config = require("../config/config");
11
10
  var _runtime = require("../constants/runtime");
12
11
  /*
13
12
  * Copyright 2020 New Relic Corporation. All rights reserved.
@@ -36,7 +35,7 @@ function wrapMutation(sharedEE) {
36
35
  wrapped[ee.debugId] = true; // otherwise, first feature to wrap mutations
37
36
 
38
37
  var wrapFn = (0, _wrapFunction.createWrapperWithEmitter)(ee);
39
- var OriginalObserver = _config.originals.MO;
38
+ var OriginalObserver = _runtime.globalScope.MutationObserver;
40
39
  if (OriginalObserver) {
41
40
  window.MutationObserver = function WrappedMutationObserver(cb) {
42
41
  if (this instanceof OriginalObserver) {
@@ -7,7 +7,6 @@ exports.scopedEE = scopedEE;
7
7
  exports.wrapPromise = wrapPromise;
8
8
  var _wrapFunction = require("./wrap-function");
9
9
  var _contextualEe = require("../event-emitter/contextual-ee");
10
- var _config = require("../config/config");
11
10
  var _runtime = require("../constants/runtime");
12
11
  /*
13
12
  * Copyright 2020 New Relic Corporation. All rights reserved.
@@ -35,9 +34,9 @@ function wrapPromise(sharedEE) {
35
34
  if (wrapped[promiseEE.debugId]) return promiseEE;
36
35
  wrapped[promiseEE.debugId] = true; // otherwise, first feature to wrap promise
37
36
 
38
- var getContext = _contextualEe.getOrSetContext;
37
+ var getContext = promiseEE.context;
39
38
  var promiseWrapper = (0, _wrapFunction.createWrapperWithEmitter)(promiseEE);
40
- var prevPromiseObj = _config.originals.PR;
39
+ var prevPromiseObj = _runtime.globalScope.Promise;
41
40
  if (prevPromiseObj) {
42
41
  // ensure there's a Promise API (native or otherwise) to even wrap
43
42
  wrap();
@@ -9,7 +9,6 @@ var _wrapEvents = require("./wrap-events");
9
9
  var _contextualEe = require("../event-emitter/contextual-ee");
10
10
  var _eventListenerOpts = require("../event-listener/event-listener-opts");
11
11
  var _wrapFunction = require("./wrap-function");
12
- var _config = require("../config/config");
13
12
  var _runtime = require("../constants/runtime");
14
13
  var _console = require("../util/console");
15
14
  /*
@@ -42,32 +41,28 @@ function wrapXhr(sharedEE) {
42
41
 
43
42
  (0, _wrapEvents.wrapEvents)(baseEE); // wrap-events patches XMLHttpRequest.prototype.addEventListener for us
44
43
  var wrapFn = (0, _wrapFunction.createWrapperWithEmitter)(ee);
45
- var OrigXHR = _config.originals.XHR;
46
- var MutationObserver = _config.originals.MO;
47
- var Promise = _config.originals.PR;
48
- var setImmediate = _config.originals.SI;
44
+ var OrigXHR = _runtime.globalScope.XMLHttpRequest;
45
+ var MutationObserver = _runtime.globalScope.MutationObserver;
46
+ var Promise = _runtime.globalScope.Promise;
47
+ var setImmediate = _runtime.globalScope.setInterval;
49
48
  var READY_STATE_CHANGE = 'readystatechange';
50
49
  var handlers = ['onload', 'onerror', 'onabort', 'onloadstart', 'onloadend', 'onprogress', 'ontimeout'];
51
50
  var pendingXhrs = [];
52
- var activeListeners = _runtime.globalScope.XMLHttpRequest.listeners;
53
51
  var XHR = _runtime.globalScope.XMLHttpRequest = newXHR;
54
52
  function newXHR(opts) {
55
- var xhr = new OrigXHR(opts);
56
- this.listeners = activeListeners ? [...activeListeners, intercept] : [intercept];
57
- function intercept() {
53
+ const xhr = new OrigXHR(opts);
54
+ const context = ee.context(xhr);
55
+ try {
56
+ ee.emit('new-xhr', [xhr], context);
57
+ xhr.addEventListener(READY_STATE_CHANGE, wrapXHR(context), (0, _eventListenerOpts.eventListenerOpts)(false));
58
+ } catch (e) {
59
+ (0, _console.warn)('An error occurred while intercepting XHR', e);
58
60
  try {
59
- ee.emit('new-xhr', [xhr], xhr);
60
- xhr.addEventListener(READY_STATE_CHANGE, wrapXHR, (0, _eventListenerOpts.eventListenerOpts)(false));
61
- } catch (e) {
62
- (0, _console.warn)('An error occured while intercepting XHR', e);
63
- try {
64
- ee.emit('internal-error', [e]);
65
- } catch (err) {
66
- // do nothing
67
- }
61
+ ee.emit('internal-error', [e]);
62
+ } catch (err) {
63
+ // do nothing
68
64
  }
69
65
  }
70
- this.listeners.forEach(listener => listener());
71
66
  return xhr;
72
67
  }
73
68
  copy(OrigXHR, XHR);
@@ -81,14 +76,15 @@ function wrapXhr(sharedEE) {
81
76
  function wrapOnreadystatechange(args, xhr) {
82
77
  wrapFn.inPlace(xhr, ['onreadystatechange'], 'fn-', getObject);
83
78
  }
84
- function wrapXHR() {
85
- var xhr = this;
86
- var ctx = ee.context(xhr);
87
- if (xhr.readyState > 3 && !ctx.resolved) {
88
- ctx.resolved = true;
89
- ee.emit('xhr-resolved', [], xhr);
90
- }
91
- wrapFn.inPlace(xhr, handlers, 'fn-', getObject);
79
+ function wrapXHR(ctx) {
80
+ return function () {
81
+ var xhr = this;
82
+ if (xhr.readyState > 3 && !ctx.resolved) {
83
+ ctx.resolved = true;
84
+ ee.emit('xhr-resolved', [], xhr);
85
+ }
86
+ wrapFn.inPlace(xhr, handlers, 'fn-', getObject);
87
+ };
92
88
  }
93
89
 
94
90
  // Wrapping the onreadystatechange property of XHRs takes some special tricks.
@@ -12,7 +12,6 @@ var _config = require("../../../common/config/config");
12
12
  var _harvestScheduler = require("../../../common/harvest/harvest-scheduler");
13
13
  var _denyList = require("../../../common/deny-list/deny-list");
14
14
  var _constants = require("../constants");
15
- var _drain = require("../../../common/drain/drain");
16
15
  var _features = require("../../../loaders/features/features");
17
16
  var _constants2 = require("../../metrics/constants");
18
17
  var _aggregateBase = require("../../utils/aggregate-base");
@@ -29,7 +28,7 @@ class Aggregate extends _aggregateBase.AggregateBase {
29
28
  const allAjaxIsEnabled = agentInit.ajax.enabled !== false;
30
29
  (0, _registerHandler.registerHandler)('xhr', storeXhr, this.featureName, this.ee);
31
30
  if (!allAjaxIsEnabled) {
32
- (0, _drain.drain)(this.agentIdentifier, this.featureName);
31
+ this.drain();
33
32
  return; // feature will only collect timeslice metrics & ajax trace nodes if it's not fully enabled
34
33
  }
35
34
 
@@ -71,8 +70,7 @@ class Aggregate extends _aggregateBase.AggregateBase {
71
70
  ee.on("drain-".concat(this.featureName), () => {
72
71
  scheduler.startTimer(harvestTimeSeconds);
73
72
  });
74
- (0, _drain.drain)(this.agentIdentifier, this.featureName);
75
- return;
73
+ this.drain();
76
74
  function storeXhr(params, metrics, startTime, endTime, type) {
77
75
  metrics.time = startTime;
78
76
 
@@ -104,9 +102,9 @@ class Aggregate extends _aggregateBase.AggregateBase {
104
102
  path: params.pathname,
105
103
  requestSize: metrics.txSize,
106
104
  responseSize: metrics.rxSize,
107
- type: type,
108
- startTime: startTime,
109
- endTime: endTime,
105
+ type,
106
+ startTime,
107
+ endTime,
110
108
  callbackDuration: metrics.cbTime
111
109
  };
112
110
  if (xhrContext.dt) {
@@ -17,22 +17,18 @@ var _stringify = require("../../../common/util/stringify");
17
17
  class DT {
18
18
  constructor(agentIdentifier) {
19
19
  this.agentIdentifier = agentIdentifier;
20
- // Binds this class instance context to the following fn used in an external module (exported);
21
- // Alternatively, can make them class field arrow functions, but requires experimental features/plugin for eslint.
22
- this.generateTracePayload = this.generateTracePayload.bind(this);
23
- this.shouldGenerateTrace = this.shouldGenerateTrace.bind(this);
24
20
  }
25
21
  generateTracePayload(parsedOrigin) {
26
22
  if (!this.shouldGenerateTrace(parsedOrigin)) {
27
23
  return null;
28
24
  }
29
- var loader_config = (0, _config.getLoaderConfig)(this.agentIdentifier);
30
- if (!loader_config) {
25
+ var loaderConfig = (0, _config.getLoaderConfig)(this.agentIdentifier);
26
+ if (!loaderConfig) {
31
27
  return null;
32
28
  }
33
- var accountId = (loader_config.accountID || '').toString() || null;
34
- var agentId = (loader_config.agentID || '').toString() || null;
35
- var trustKey = (loader_config.trustKey || '').toString() || null;
29
+ var accountId = (loaderConfig.accountID || '').toString() || null;
30
+ var agentId = (loaderConfig.agentID || '').toString() || null;
31
+ var trustKey = (loaderConfig.trustKey || '').toString() || null;
36
32
  if (!accountId || !agentId) {
37
33
  return null;
38
34
  }
@@ -40,9 +36,9 @@ class DT {
40
36
  var traceId = (0, _uniqueId.generateTraceId)();
41
37
  var timestamp = Date.now();
42
38
  var payload = {
43
- spanId: spanId,
44
- traceId: traceId,
45
- timestamp: timestamp
39
+ spanId,
40
+ traceId,
41
+ timestamp
46
42
  };
47
43
  if (parsedOrigin.sameOrigin || this.isAllowedOrigin(parsedOrigin) && this.useTraceContextHeadersForCors()) {
48
44
  payload.traceContextParentHeader = this.generateTraceContextParentHeader(spanId, traceId);
@@ -26,7 +26,7 @@ var _features = require("../../../loaders/features/features");
26
26
  var handlers = ['load', 'error', 'abort', 'timeout'];
27
27
  var handlersLen = handlers.length;
28
28
  var origRequest = _config.originals.REQ;
29
- var origXHR = _runtime.globalScope.XMLHttpRequest;
29
+ var origXHR = _config.originals.XHR;
30
30
  class Instrument extends _instrumentBase.InstrumentBase {
31
31
  static featureName = _constants.FEATURE_NAME;
32
32
  constructor(agentIdentifier, aggregator) {
@@ -37,6 +37,38 @@ class Instrument extends _instrumentBase.InstrumentBase {
37
37
  if (!(0, _config.getRuntime)(agentIdentifier).xhrWrappable) return;
38
38
  this.dt = new _distributedTracing.DT(agentIdentifier);
39
39
  this.handler = (type, args, ctx, group) => (0, _handle.handle)(type, args, ctx, group, this.ee);
40
+
41
+ // this is a best (but imperfect) effort at capturing AJAX calls that may have fired before the agent was instantiated
42
+ // this could happen because the agent was "improperly" set up (ie, not at the top of the head) or
43
+ // because it was deferred from loading in some way -- e.g. 'deferred' script loading tags or other lazy-loading techniques
44
+ //
45
+ // it is "imperfect" because we cannot capture the following with the API vs wrapping the events directly:
46
+ // * requestBodySize - (txSize -- request body size)
47
+ // * method - request type (GET, POST, etc)
48
+ // * callbackDuration - (cbTime -- sum of resulting callback time)
49
+ try {
50
+ const initiators = {
51
+ xmlhttprequest: 'xhr',
52
+ fetch: 'fetch',
53
+ beacon: 'beacon'
54
+ };
55
+ _runtime.globalScope?.performance?.getEntriesByType('resource').forEach(resource => {
56
+ if (resource.initiatorType in initiators && resource.responseStatus !== 0) {
57
+ const params = {
58
+ status: resource.responseStatus
59
+ };
60
+ const metrics = {
61
+ rxSize: resource.transferSize,
62
+ duration: Math.floor(resource.duration),
63
+ cbTime: 0
64
+ };
65
+ addUrl(params, resource.name);
66
+ this.handler('xhr', [params, metrics, resource.startTime, resource.responseEnd, initiators[resource.initiatorType]], undefined, _features.FEATURE_NAMES.ajax);
67
+ }
68
+ });
69
+ } catch (err) {
70
+ // do nothing
71
+ }
40
72
  (0, _wrap.wrapFetch)(this.ee);
41
73
  (0, _wrap.wrapXhr)(this.ee);
42
74
  subscribeToEvents(agentIdentifier, this.ee, this.handler, this.dt);
@@ -97,9 +129,9 @@ function subscribeToEvents(agentIdentifier, ee, handler, dt) {
97
129
  this.metrics = {};
98
130
  }
99
131
  function onOpenXhrEnd(args, xhr) {
100
- var loader_config = (0, _config.getLoaderConfig)(agentIdentifier);
101
- if (loader_config.xpid && this.sameOrigin) {
102
- xhr.setRequestHeader('X-NewRelic-ID', loader_config.xpid);
132
+ var loaderConfig = (0, _config.getLoaderConfig)(agentIdentifier);
133
+ if (loaderConfig.xpid && this.sameOrigin) {
134
+ xhr.setRequestHeader('X-NewRelic-ID', loaderConfig.xpid);
103
135
  }
104
136
  var payload = dt.generateTracePayload(this.parsedOrigin);
105
137
  if (payload) {
@@ -193,15 +225,25 @@ function subscribeToEvents(agentIdentifier, ee, handler, dt) {
193
225
  function onFetchBeforeStart(args) {
194
226
  var opts = args[1] || {};
195
227
  var url;
196
- // argument is USVString
197
228
  if (typeof args[0] === 'string') {
229
+ // argument is USVString
198
230
  url = args[0];
199
- // argument is Request object
231
+ if (url.length === 0 && _runtime.isBrowserScope) {
232
+ url = '' + _runtime.globalScope.location.href;
233
+ }
200
234
  } else if (args[0] && args[0].url) {
235
+ // argument is Request object
201
236
  url = args[0].url;
202
- // argument is URL object
203
237
  } else if (_runtime.globalScope?.URL && args[0] && args[0] instanceof URL) {
238
+ // argument is URL object
204
239
  url = args[0].href;
240
+ } else if (typeof args[0].toString === 'function') {
241
+ url = args[0].toString();
242
+ }
243
+ if (typeof url !== 'string' || url.length === 0) {
244
+ // Short-circuit DT since we could not determine the URL of the fetch call
245
+ // this is very unlikely to happen
246
+ return;
205
247
  }
206
248
  if (url) {
207
249
  this.parsedOrigin = (0, _parseUrl.parseUrl)(url);
@@ -211,7 +253,11 @@ function subscribeToEvents(agentIdentifier, ee, handler, dt) {
211
253
  if (!payload || !payload.newrelicHeader && !payload.traceContextParentHeader) {
212
254
  return;
213
255
  }
214
- if (typeof args[0] === 'string' || _runtime.globalScope?.URL && args[0] && args[0] instanceof URL) {
256
+ if (args[0] && args[0].headers) {
257
+ if (addHeaders(args[0].headers, payload)) {
258
+ this.dt = payload;
259
+ }
260
+ } else {
215
261
  var clone = {};
216
262
  for (var key in opts) {
217
263
  clone[key] = opts[key];
@@ -225,10 +271,6 @@ function subscribeToEvents(agentIdentifier, ee, handler, dt) {
225
271
  } else {
226
272
  args.push(clone);
227
273
  }
228
- } else if (args[0] && args[0].headers) {
229
- if (addHeaders(args[0].headers, payload)) {
230
- this.dt = payload;
231
- }
232
274
  }
233
275
  function addHeaders(headersObj, payload) {
234
276
  var added = false;
@@ -271,7 +313,7 @@ function subscribeToEvents(agentIdentifier, ee, handler, dt) {
271
313
 
272
314
  // we capture failed call as status 0, the actual error is ignored
273
315
  // eslint-disable-next-line handle-callback-err
274
- function onFetchDone(err, res) {
316
+ function onFetchDone(_, res) {
275
317
  this.endTime = (0, _now.now)();
276
318
  if (!this.params) {
277
319
  this.params = {};
@@ -312,17 +354,6 @@ function subscribeToEvents(agentIdentifier, ee, handler, dt) {
312
354
  metrics.cbTime = this.cbTime;
313
355
  handler('xhr', [params, metrics, this.startTime, this.endTime, 'xhr'], this, _features.FEATURE_NAMES.ajax);
314
356
  }
315
- function addUrl(ctx, url) {
316
- var parsed = (0, _parseUrl.parseUrl)(url);
317
- var params = ctx.params;
318
- params.hostname = parsed.hostname;
319
- params.port = parsed.port;
320
- params.protocol = parsed.protocol;
321
- params.host = parsed.hostname + ':' + parsed.port;
322
- params.pathname = parsed.pathname;
323
- ctx.parsedOrigin = parsed;
324
- ctx.sameOrigin = parsed.sameOrigin;
325
- }
326
357
  function captureXhrData(ctx, xhr) {
327
358
  ctx.params.status = xhr.status;
328
359
  var size = (0, _responseSize.responseSizeFromXhr)(xhr, ctx.lastSize);
@@ -335,4 +366,15 @@ function subscribeToEvents(agentIdentifier, ee, handler, dt) {
335
366
  }
336
367
  ctx.loadCaptureCalled = true;
337
368
  }
369
+ }
370
+ function addUrl(ctx, url) {
371
+ var parsed = (0, _parseUrl.parseUrl)(url);
372
+ var params = ctx.params || ctx;
373
+ params.hostname = parsed.hostname;
374
+ params.port = parsed.port;
375
+ params.protocol = parsed.protocol;
376
+ params.host = parsed.hostname + ':' + parsed.port;
377
+ params.pathname = parsed.pathname;
378
+ ctx.parsedOrigin = parsed;
379
+ ctx.sameOrigin = parsed.sameOrigin;
338
380
  }
@@ -22,5 +22,4 @@ function canonicalFunctionName(functionNameString) {
22
22
  if (!functionNameString) return;
23
23
  const match = functionNameString.match(canonicalFunctionNameRe);
24
24
  if (match) return match[1];
25
- return;
26
25
  }
@@ -69,8 +69,8 @@ var debug = false;
69
69
  var classNameRegex = /function (.+?)\s*\(/;
70
70
  var chrome = /^\s*at (?:((?:\[object object\])?(?:[^(]*\([^)]*\))*[^()]*(?: \[as \S+\])?) )?\(?((?:file|http|https|chrome-extension):.*?)?:(\d+)(?::(\d+))?\)?\s*$/i;
71
71
  var gecko = /^\s*(?:(\S*|global code)(?:\(.*?\))?@)?((?:file|http|https|chrome|safari-extension).*?):(\d+)(?::(\d+))?\s*$/i;
72
- var chrome_eval = /^\s*at .+ \(eval at \S+ \((?:(?:file|http|https):[^)]+)?\)(?:, [^:]*:\d+:\d+)?\)$/i;
73
- var ie_eval = /^\s*at Function code \(Function code:\d+:\d+\)\s*/i;
72
+ var chromeEval = /^\s*at .+ \(eval at \S+ \((?:(?:file|http|https):[^)]+)?\)(?:, [^:]*:\d+:\d+)?\)$/i;
73
+ var ieEval = /^\s*at Function code \(Function code:\d+:\d+\)\s*/i;
74
74
 
75
75
  /**
76
76
  * Represents an error with a stack trace.
@@ -204,7 +204,7 @@ function getStackElement(line) {
204
204
  column: parts[4] ? +parts[4] : null
205
205
  };
206
206
  }
207
- if (line.match(chrome_eval) || line.match(ie_eval) || line === 'anonymous') {
207
+ if (line.match(chromeEval) || line.match(ieEval) || line === 'anonymous') {
208
208
  return {
209
209
  func: 'evaluated code'
210
210
  };
@@ -249,7 +249,7 @@ function computeStackTraceBySourceAndLine(ex) {
249
249
  mode: 'sourceline',
250
250
  name: className,
251
251
  message: ex.message,
252
- stackString: stackString,
252
+ stackString,
253
253
  frames: [{
254
254
  url: canonicalUrl,
255
255
  line: ex.line,