@newrelic/browser-agent 0.0.9 → 0.1.229

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/README.md +84 -207
  2. package/dist/cjs/cdn/lite.js +14 -0
  3. package/dist/cjs/cdn/polyfills/lite.js +4 -0
  4. package/dist/cjs/cdn/polyfills/pro.js +4 -0
  5. package/dist/cjs/cdn/polyfills/spa.js +4 -0
  6. package/dist/cjs/cdn/polyfills.js +14 -0
  7. package/dist/cjs/cdn/pro.js +19 -0
  8. package/dist/cjs/cdn/spa.js +19 -0
  9. package/dist/cjs/cdn/worker.js +16 -0
  10. package/dist/cjs/common/aggregate/aggregator.js +168 -0
  11. package/dist/cjs/common/browser-version/firefox-version.js +17 -0
  12. package/dist/cjs/common/browser-version/ios-version.js +18 -0
  13. package/dist/cjs/common/config/config.js +76 -0
  14. package/dist/cjs/common/config/state/configurable.js +32 -0
  15. package/dist/cjs/common/config/state/info.js +50 -0
  16. package/dist/cjs/common/config/state/init.js +86 -0
  17. package/dist/cjs/common/config/state/loader-config.js +28 -0
  18. package/dist/cjs/common/config/state/originals.js +9 -0
  19. package/dist/cjs/common/config/state/runtime.js +50 -0
  20. package/dist/cjs/common/constants/environment-variables.js +20 -0
  21. package/dist/cjs/common/context/shared-context.js +25 -0
  22. package/dist/cjs/common/deny-list/deny-list.js +108 -0
  23. package/dist/cjs/common/drain/drain.js +126 -0
  24. package/dist/cjs/common/event-emitter/contextual-ee.js +149 -0
  25. package/dist/cjs/common/event-emitter/handle.js +24 -0
  26. package/dist/cjs/common/event-emitter/register-handler.js +24 -0
  27. package/dist/cjs/common/event-listener/event-listener-opts.js +46 -0
  28. package/dist/cjs/common/harvest/harvest-scheduler.js +111 -0
  29. package/dist/cjs/common/harvest/harvest.js +236 -0
  30. package/dist/cjs/common/ids/id.js +30 -0
  31. package/dist/cjs/common/ids/unique-id.js +84 -0
  32. package/dist/cjs/common/metrics/framework-detection.js +72 -0
  33. package/dist/cjs/common/metrics/paint-metrics.js +13 -0
  34. package/dist/cjs/common/serialize/bel-serializer.js +89 -0
  35. package/dist/cjs/common/timing/nav-timing.js +77 -0
  36. package/dist/cjs/common/timing/now.js +15 -0
  37. package/dist/cjs/common/unload/eol.js +69 -0
  38. package/dist/cjs/common/url/clean-url.js +16 -0
  39. package/dist/cjs/common/url/encode.js +79 -0
  40. package/dist/cjs/common/url/location.js +14 -0
  41. package/dist/cjs/common/url/parse-url.js +66 -0
  42. package/dist/cjs/common/url/protocol.js +25 -0
  43. package/dist/cjs/common/util/console.js +17 -0
  44. package/dist/cjs/common/util/data-size.js +25 -0
  45. package/dist/cjs/common/util/feature-flags.js +42 -0
  46. package/dist/cjs/common/util/get-or-set.js +39 -0
  47. package/dist/cjs/common/util/global-scope.js +56 -0
  48. package/dist/cjs/common/util/map-own.js +24 -0
  49. package/dist/cjs/common/util/obfuscate.js +76 -0
  50. package/dist/cjs/common/util/reduce.js +22 -0
  51. package/dist/cjs/common/util/s-hash.js +19 -0
  52. package/dist/cjs/common/util/single.js +23 -0
  53. package/dist/cjs/common/util/stringify.js +47 -0
  54. package/dist/cjs/common/util/submit-data.js +99 -0
  55. package/dist/cjs/common/util/traverse.js +41 -0
  56. package/dist/cjs/common/util/user-agent.js +57 -0
  57. package/dist/cjs/common/window/load.js +19 -0
  58. package/dist/cjs/common/window/nreum.js +107 -0
  59. package/dist/cjs/common/window/page-visibility.js +28 -0
  60. package/dist/cjs/common/window/session-storage.js +42 -0
  61. package/dist/cjs/common/window/supports-performance-observer.js +15 -0
  62. package/dist/cjs/common/window/top-level-callers.js +23 -0
  63. package/dist/cjs/common/wrap/index.js +68 -0
  64. package/dist/cjs/common/wrap/wrap-events.js +105 -0
  65. package/dist/cjs/common/wrap/wrap-fetch.js +114 -0
  66. package/dist/cjs/common/wrap/wrap-function.js +269 -0
  67. package/dist/cjs/common/wrap/wrap-history.js +56 -0
  68. package/dist/cjs/common/wrap/wrap-jsonp.js +129 -0
  69. package/dist/cjs/common/wrap/wrap-mutation.js +61 -0
  70. package/dist/cjs/common/wrap/wrap-promise.js +160 -0
  71. package/dist/cjs/common/wrap/wrap-raf.js +55 -0
  72. package/dist/cjs/common/wrap/wrap-timer.js +70 -0
  73. package/dist/cjs/common/wrap/wrap-xhr.js +206 -0
  74. package/dist/cjs/features/ajax/aggregate/index.js +226 -0
  75. package/dist/cjs/features/ajax/constants.js +9 -0
  76. package/dist/cjs/features/ajax/index.js +12 -0
  77. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +145 -0
  78. package/dist/cjs/features/ajax/instrument/index.js +338 -0
  79. package/dist/cjs/features/ajax/instrument/response-size.js +26 -0
  80. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.js +18 -0
  81. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.test.js +30 -0
  82. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +216 -0
  83. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.test.js +257 -0
  84. package/dist/cjs/features/jserrors/aggregate/format-stack-trace.js +36 -0
  85. package/dist/cjs/features/jserrors/aggregate/format-stack-trace.test.js +39 -0
  86. package/dist/cjs/features/jserrors/aggregate/index.js +267 -0
  87. package/dist/cjs/features/jserrors/aggregate/string-hash-code.js +23 -0
  88. package/dist/cjs/features/jserrors/aggregate/string-hash-code.test.js +26 -0
  89. package/dist/cjs/features/jserrors/constants.js +11 -0
  90. package/dist/cjs/features/jserrors/index.js +12 -0
  91. package/dist/cjs/features/jserrors/instrument/debug.js +40 -0
  92. package/dist/cjs/features/jserrors/instrument/index.js +158 -0
  93. package/dist/cjs/features/metrics/aggregate/index.js +136 -0
  94. package/dist/cjs/features/metrics/constants.js +17 -0
  95. package/dist/cjs/features/metrics/index.js +12 -0
  96. package/dist/cjs/features/metrics/instrument/index.js +20 -0
  97. package/dist/cjs/features/metrics/instrument/workers-helper.js +121 -0
  98. package/dist/cjs/features/page_action/aggregate/index.js +112 -0
  99. package/dist/cjs/features/page_action/constants.js +9 -0
  100. package/dist/cjs/features/page_action/index.js +12 -0
  101. package/dist/cjs/features/page_action/instrument/index.js +21 -0
  102. package/dist/cjs/features/page_view_event/aggregate/index.js +133 -0
  103. package/dist/cjs/features/page_view_event/aggregate/initialized-features.js +39 -0
  104. package/dist/cjs/features/page_view_event/constants.js +15 -0
  105. package/dist/cjs/features/page_view_event/index.js +12 -0
  106. package/dist/cjs/features/page_view_event/instrument/index.js +38 -0
  107. package/dist/cjs/features/page_view_timing/aggregate/index.js +265 -0
  108. package/dist/cjs/features/page_view_timing/constants.js +9 -0
  109. package/dist/cjs/features/page_view_timing/first-paint.js +50 -0
  110. package/dist/cjs/features/page_view_timing/index.js +12 -0
  111. package/dist/cjs/features/page_view_timing/instrument/index.js +36 -0
  112. package/dist/cjs/features/page_view_timing/long-tasks.js +75 -0
  113. package/dist/cjs/features/session_trace/aggregate/index.js +375 -0
  114. package/dist/cjs/features/session_trace/constants.js +32 -0
  115. package/dist/cjs/features/session_trace/index.js +12 -0
  116. package/dist/cjs/features/session_trace/instrument/index.js +133 -0
  117. package/dist/cjs/features/spa/aggregate/index.js +684 -0
  118. package/dist/cjs/features/spa/aggregate/interaction-node.js +84 -0
  119. package/dist/cjs/features/spa/aggregate/interaction-node.test.js +16 -0
  120. package/dist/cjs/features/spa/aggregate/interaction.js +98 -0
  121. package/dist/cjs/features/spa/aggregate/serializer.js +147 -0
  122. package/dist/cjs/features/spa/constants.js +53 -0
  123. package/dist/cjs/features/spa/index.js +12 -0
  124. package/dist/cjs/features/spa/instrument/index.js +114 -0
  125. package/dist/cjs/features/utils/aggregate-base.js +13 -0
  126. package/dist/cjs/features/utils/feature-base.js +58 -0
  127. package/dist/cjs/features/utils/handler-cache.js +64 -0
  128. package/dist/cjs/features/utils/instrument-base.js +71 -0
  129. package/dist/cjs/features/utils/lazy-loader.js +44 -0
  130. package/dist/cjs/index.js +81 -58
  131. package/dist/cjs/loaders/agent.js +86 -0
  132. package/dist/cjs/loaders/api/api.js +109 -0
  133. package/dist/cjs/loaders/api/apiAsync.js +94 -0
  134. package/dist/cjs/loaders/browser-agent.js +29 -0
  135. package/dist/cjs/loaders/configure/configure.js +47 -0
  136. package/dist/cjs/loaders/features/enabled-features.js +19 -0
  137. package/dist/cjs/loaders/features/featureDependencies.js +32 -0
  138. package/dist/cjs/loaders/features/features.js +33 -0
  139. package/dist/cjs/loaders/micro-agent.js +93 -0
  140. package/dist/cjs/loaders/worker-agent.js +24 -0
  141. package/dist/esm/cdn/lite.js +12 -0
  142. package/dist/esm/cdn/polyfills/lite.js +7 -0
  143. package/dist/esm/cdn/polyfills/pro.js +7 -0
  144. package/dist/esm/cdn/polyfills/spa.js +7 -0
  145. package/dist/esm/cdn/polyfills.js +17 -0
  146. package/dist/esm/cdn/pro.js +17 -0
  147. package/dist/esm/cdn/spa.js +17 -0
  148. package/dist/esm/cdn/worker.js +14 -0
  149. package/dist/esm/common/aggregate/aggregator.js +161 -0
  150. package/dist/esm/common/browser-version/firefox-version.js +10 -0
  151. package/dist/esm/common/browser-version/ios-version.js +10 -0
  152. package/dist/esm/common/config/config.js +11 -0
  153. package/dist/esm/common/config/state/configurable.js +25 -0
  154. package/dist/esm/common/config/state/info.js +42 -0
  155. package/dist/esm/common/config/state/init.js +78 -0
  156. package/dist/esm/common/config/state/loader-config.js +21 -0
  157. package/dist/esm/common/config/state/originals.js +2 -0
  158. package/dist/esm/common/config/state/runtime.js +41 -0
  159. package/dist/esm/common/constants/environment-variables.js +11 -0
  160. package/dist/esm/common/context/shared-context.js +18 -0
  161. package/dist/esm/common/deny-list/deny-list.js +101 -0
  162. package/dist/esm/common/drain/drain.js +119 -0
  163. package/dist/esm/common/event-emitter/contextual-ee.js +142 -0
  164. package/dist/esm/common/event-emitter/handle.js +16 -0
  165. package/dist/esm/common/event-emitter/register-handler.js +19 -0
  166. package/dist/esm/common/event-listener/event-listener-opts.js +39 -0
  167. package/dist/esm/common/harvest/harvest-scheduler.js +105 -0
  168. package/dist/esm/common/harvest/harvest.js +228 -0
  169. package/dist/esm/common/ids/id.js +23 -0
  170. package/dist/esm/common/ids/unique-id.js +75 -0
  171. package/dist/esm/common/metrics/framework-detection.js +66 -0
  172. package/dist/esm/common/metrics/paint-metrics.js +6 -0
  173. package/dist/esm/common/serialize/bel-serializer.js +80 -0
  174. package/dist/esm/common/timing/nav-timing.js +67 -0
  175. package/dist/esm/common/timing/now.js +9 -0
  176. package/dist/esm/common/unload/eol.js +62 -0
  177. package/dist/esm/common/url/clean-url.js +10 -0
  178. package/dist/esm/common/url/encode.js +71 -0
  179. package/dist/esm/common/url/location.js +8 -0
  180. package/dist/esm/common/url/parse-url.js +60 -0
  181. package/dist/esm/common/url/protocol.js +17 -0
  182. package/dist/esm/common/util/console.js +11 -0
  183. package/dist/esm/common/util/data-size.js +19 -0
  184. package/dist/esm/common/util/feature-flags.js +33 -0
  185. package/dist/esm/common/util/get-or-set.js +33 -0
  186. package/dist/esm/common/util/global-scope.js +44 -0
  187. package/dist/esm/common/util/map-own.js +18 -0
  188. package/dist/esm/common/util/obfuscate.js +67 -0
  189. package/dist/esm/common/util/reduce.js +16 -0
  190. package/dist/esm/common/util/s-hash.js +13 -0
  191. package/dist/esm/common/util/single.js +16 -0
  192. package/dist/esm/common/util/stringify.js +42 -0
  193. package/dist/esm/common/util/submit-data.js +91 -0
  194. package/dist/esm/common/util/traverse.js +35 -0
  195. package/dist/esm/common/util/user-agent.js +48 -0
  196. package/dist/esm/common/window/load.js +12 -0
  197. package/dist/esm/common/window/nreum.js +91 -0
  198. package/dist/esm/common/window/page-visibility.js +23 -0
  199. package/dist/esm/common/window/session-storage.js +36 -0
  200. package/dist/esm/common/window/supports-performance-observer.js +9 -0
  201. package/dist/esm/common/window/top-level-callers.js +17 -0
  202. package/dist/esm/common/wrap/index.js +14 -0
  203. package/dist/esm/common/wrap/wrap-events.js +97 -0
  204. package/dist/esm/common/wrap/wrap-fetch.js +105 -0
  205. package/dist/esm/common/wrap/wrap-function.js +257 -0
  206. package/dist/esm/common/wrap/wrap-history.js +48 -0
  207. package/dist/esm/common/wrap/wrap-jsonp.js +122 -0
  208. package/dist/esm/common/wrap/wrap-mutation.js +54 -0
  209. package/dist/esm/common/wrap/wrap-promise.js +153 -0
  210. package/dist/esm/common/wrap/wrap-raf.js +48 -0
  211. package/dist/esm/common/wrap/wrap-timer.js +63 -0
  212. package/dist/esm/common/wrap/wrap-xhr.js +199 -0
  213. package/dist/esm/features/ajax/aggregate/index.js +218 -0
  214. package/dist/esm/features/ajax/constants.js +2 -0
  215. package/dist/esm/features/ajax/index.js +1 -0
  216. package/dist/esm/features/ajax/instrument/distributed-tracing.js +137 -0
  217. package/dist/esm/features/ajax/instrument/index.js +330 -0
  218. package/dist/esm/features/ajax/instrument/response-size.js +19 -0
  219. package/dist/esm/features/jserrors/aggregate/canonical-function-name.js +12 -0
  220. package/dist/esm/features/jserrors/aggregate/canonical-function-name.test.js +28 -0
  221. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +209 -0
  222. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.test.js +255 -0
  223. package/dist/esm/features/jserrors/aggregate/format-stack-trace.js +29 -0
  224. package/dist/esm/features/jserrors/aggregate/format-stack-trace.test.js +37 -0
  225. package/dist/esm/features/jserrors/aggregate/index.js +260 -0
  226. package/dist/esm/features/jserrors/aggregate/string-hash-code.js +17 -0
  227. package/dist/esm/features/jserrors/aggregate/string-hash-code.test.js +24 -0
  228. package/dist/esm/features/jserrors/constants.js +3 -0
  229. package/dist/esm/features/jserrors/index.js +1 -0
  230. package/dist/esm/features/jserrors/instrument/debug.js +38 -0
  231. package/dist/esm/features/jserrors/instrument/index.js +150 -0
  232. package/dist/esm/features/metrics/aggregate/index.js +129 -0
  233. package/dist/esm/features/metrics/constants.js +6 -0
  234. package/dist/esm/features/metrics/index.js +1 -0
  235. package/dist/esm/features/metrics/instrument/index.js +13 -0
  236. package/dist/esm/features/metrics/instrument/workers-helper.js +116 -0
  237. package/dist/esm/features/page_action/aggregate/index.js +105 -0
  238. package/dist/esm/features/page_action/constants.js +2 -0
  239. package/dist/esm/features/page_action/index.js +1 -0
  240. package/dist/esm/features/page_action/instrument/index.js +14 -0
  241. package/dist/esm/features/page_view_event/aggregate/index.js +124 -0
  242. package/dist/esm/features/page_view_event/aggregate/initialized-features.js +34 -0
  243. package/dist/esm/features/page_view_event/constants.js +5 -0
  244. package/dist/esm/features/page_view_event/index.js +1 -0
  245. package/dist/esm/features/page_view_event/instrument/index.js +29 -0
  246. package/dist/esm/features/page_view_timing/aggregate/index.js +258 -0
  247. package/dist/esm/features/page_view_timing/constants.js +2 -0
  248. package/dist/esm/features/page_view_timing/first-paint.js +43 -0
  249. package/dist/esm/features/page_view_timing/index.js +1 -0
  250. package/dist/esm/features/page_view_timing/instrument/index.js +28 -0
  251. package/dist/esm/features/page_view_timing/long-tasks.js +69 -0
  252. package/dist/esm/features/session_trace/aggregate/index.js +366 -0
  253. package/dist/esm/features/session_trace/constants.js +14 -0
  254. package/dist/esm/features/session_trace/index.js +1 -0
  255. package/dist/esm/features/session_trace/instrument/index.js +123 -0
  256. package/dist/esm/features/spa/aggregate/index.js +674 -0
  257. package/dist/esm/features/spa/aggregate/interaction-node.js +78 -0
  258. package/dist/esm/features/spa/aggregate/interaction-node.test.js +14 -0
  259. package/dist/esm/features/spa/aggregate/interaction.js +92 -0
  260. package/dist/esm/features/spa/aggregate/serializer.js +139 -0
  261. package/dist/esm/features/spa/constants.js +25 -0
  262. package/dist/esm/features/spa/index.js +1 -0
  263. package/dist/esm/features/spa/instrument/index.js +104 -0
  264. package/dist/esm/features/utils/aggregate-base.js +6 -0
  265. package/dist/esm/features/utils/feature-base.js +51 -0
  266. package/dist/esm/features/utils/handler-cache.js +57 -0
  267. package/dist/esm/features/utils/instrument-base.js +69 -0
  268. package/dist/esm/features/utils/lazy-loader.js +37 -0
  269. package/dist/esm/index.js +15 -0
  270. package/dist/esm/loaders/agent.js +77 -0
  271. package/dist/esm/loaders/api/api.js +104 -0
  272. package/dist/esm/loaders/api/apiAsync.js +88 -0
  273. package/dist/esm/loaders/browser-agent.js +23 -0
  274. package/dist/esm/loaders/configure/configure.js +41 -0
  275. package/dist/esm/loaders/features/enabled-features.js +13 -0
  276. package/dist/esm/loaders/features/featureDependencies.js +25 -0
  277. package/dist/esm/loaders/features/features.js +25 -0
  278. package/dist/esm/loaders/micro-agent.js +86 -0
  279. package/dist/esm/loaders/worker-agent.js +18 -0
  280. package/package.json +204 -71
  281. package/types.ts +221 -0
  282. package/dist/bundled/es5/index.js +0 -2
  283. package/dist/bundled/es5/index.js.map +0 -1
  284. package/dist/bundled/es6/index.js +0 -2
  285. package/dist/bundled/es6/index.js.map +0 -1
  286. package/dist/cjs/index.d.ts +0 -19
  287. package/dist/cjs/index.js.map +0 -1
  288. package/dist/cjs/types.d.ts +0 -94
  289. package/dist/cjs/types.js +0 -28
  290. package/dist/cjs/types.js.map +0 -1
  291. package/dist/cjs/utils/api/api.d.ts +0 -10
  292. package/dist/cjs/utils/api/api.js +0 -40
  293. package/dist/cjs/utils/api/api.js.map +0 -1
  294. package/dist/cjs/utils/config/build-configs.d.ts +0 -6
  295. package/dist/cjs/utils/config/build-configs.js +0 -68
  296. package/dist/cjs/utils/config/build-configs.js.map +0 -1
  297. package/dist/cjs/utils/features/features.d.ts +0 -5
  298. package/dist/cjs/utils/features/features.js +0 -14
  299. package/dist/cjs/utils/features/features.js.map +0 -1
  300. package/dist/cjs/utils/features/initialize.d.ts +0 -5
  301. package/dist/cjs/utils/features/initialize.js +0 -51
  302. package/dist/cjs/utils/features/initialize.js.map +0 -1
  303. package/dist/es/index.d.ts +0 -19
  304. package/dist/es/index.js +0 -55
  305. package/dist/es/index.js.map +0 -1
  306. package/dist/es/types.d.ts +0 -94
  307. package/dist/es/types.js +0 -24
  308. package/dist/es/types.js.map +0 -1
  309. package/dist/es/utils/api/api.d.ts +0 -10
  310. package/dist/es/utils/api/api.js +0 -36
  311. package/dist/es/utils/api/api.js.map +0 -1
  312. package/dist/es/utils/config/build-configs.d.ts +0 -6
  313. package/dist/es/utils/config/build-configs.js +0 -64
  314. package/dist/es/utils/config/build-configs.js.map +0 -1
  315. package/dist/es/utils/features/features.d.ts +0 -5
  316. package/dist/es/utils/features/features.js +0 -10
  317. package/dist/es/utils/features/features.js.map +0 -1
  318. package/dist/es/utils/features/initialize.d.ts +0 -5
  319. package/dist/es/utils/features/initialize.js +0 -24
  320. package/dist/es/utils/features/initialize.js.map +0 -1
  321. package/dist/umd/index.d.ts +0 -19
  322. package/dist/umd/index.js +0 -69
  323. package/dist/umd/index.js.map +0 -1
  324. package/dist/umd/types.d.ts +0 -94
  325. package/dist/umd/types.js +0 -38
  326. package/dist/umd/types.js.map +0 -1
  327. package/dist/umd/utils/api/api.d.ts +0 -10
  328. package/dist/umd/utils/api/api.js +0 -50
  329. package/dist/umd/utils/api/api.js.map +0 -1
  330. package/dist/umd/utils/config/build-configs.d.ts +0 -6
  331. package/dist/umd/utils/config/build-configs.js +0 -78
  332. package/dist/umd/utils/config/build-configs.js.map +0 -1
  333. package/dist/umd/utils/features/features.d.ts +0 -5
  334. package/dist/umd/utils/features/features.js +0 -24
  335. package/dist/umd/utils/features/features.js.map +0 -1
  336. package/dist/umd/utils/features/initialize.d.ts +0 -5
  337. package/dist/umd/utils/features/initialize.js +0 -63
  338. package/dist/umd/utils/features/initialize.js.map +0 -1
  339. package/dist/webpack-analysis.html +0 -38
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.scopedEE = scopedEE;
7
+ exports.wrapXhr = wrapXhr;
8
+ var _wrapEvents = require("./wrap-events");
9
+ var _contextualEe = require("../event-emitter/contextual-ee");
10
+ var _eventListenerOpts = require("../event-listener/event-listener-opts");
11
+ var _wrapFunction = require("./wrap-function");
12
+ var _config = require("../config/config");
13
+ var _globalScope = require("../util/global-scope");
14
+ var _console = require("../util/console");
15
+ /*
16
+ * Copyright 2020 New Relic Corporation. All rights reserved.
17
+ * SPDX-License-Identifier: Apache-2.0
18
+ */
19
+ /**
20
+ * @file Wraps AJAX (XHR) related methods for instrumentation.
21
+ * This module is used by: ajax, jserrors, spa.
22
+ */
23
+
24
+ const wrapped = {};
25
+ const XHR_PROPS = ['open', 'send']; // these are the specific funcs being wrapped on all XMLHttpRequests(.prototype)
26
+
27
+ /**
28
+ * Wraps the native XMLHttpRequest (XHR) object to emit custom events to its readystatechange event and an assortment
29
+ * of handlers. Adds instrumentation in context of a new event emitter scoped only to XHR.
30
+ * @param {Object} sharedEE - The shared event emitter on which a new scoped event emitter will be based.
31
+ * @returns {Object} Scoped event emitter with a debug ID of `xhr`.
32
+ */
33
+ // eslint-disable-next-line
34
+ function wrapXhr(sharedEE) {
35
+ var baseEE = sharedEE || _contextualEe.ee;
36
+ const ee = scopedEE(baseEE);
37
+ if (wrapped[ee.debugId]++)
38
+ // Notice if our wrapping never ran yet, the falsey NaN will not early return; but if it has,
39
+ {
40
+ return ee;
41
+ } // then we increment the count to track # of feats using this at runtime.
42
+ wrapped[ee.debugId] = 1; // <- otherwise, first feature to wrap XHR
43
+
44
+ (0, _wrapEvents.wrapEvents)(baseEE); // wrap-events patches XMLHttpRequest.prototype.addEventListener for us
45
+ var wrapFn = (0, _wrapFunction.createWrapperWithEmitter)(ee);
46
+ var OrigXHR = _config.originals.XHR;
47
+ var MutationObserver = _config.originals.MO;
48
+ var Promise = _config.originals.PR;
49
+ var setImmediate = _config.originals.SI;
50
+ var READY_STATE_CHANGE = 'readystatechange';
51
+ var handlers = ['onload', 'onerror', 'onabort', 'onloadstart', 'onloadend', 'onprogress', 'ontimeout'];
52
+ var pendingXhrs = [];
53
+ var activeListeners = _globalScope.globalScope.XMLHttpRequest.listeners;
54
+ var XHR = _globalScope.globalScope.XMLHttpRequest = newXHR;
55
+ function newXHR(opts) {
56
+ var xhr = new OrigXHR(opts);
57
+ this.listeners = activeListeners ? [...activeListeners, intercept] : [intercept];
58
+ function intercept() {
59
+ try {
60
+ ee.emit('new-xhr', [xhr], xhr);
61
+ xhr.addEventListener(READY_STATE_CHANGE, wrapXHR, (0, _eventListenerOpts.eventListenerOpts)(false));
62
+ } catch (e) {
63
+ (0, _console.warn)('An error occured while intercepting XHR', e);
64
+ try {
65
+ ee.emit('internal-error', [e]);
66
+ } catch (err) {
67
+ // do nothing
68
+ }
69
+ }
70
+ }
71
+ this.listeners.forEach(listener => listener());
72
+ return xhr;
73
+ }
74
+ copy(OrigXHR, XHR);
75
+ XHR.prototype = OrigXHR.prototype;
76
+ wrapFn.inPlace(XHR.prototype, XHR_PROPS, '-xhr-', getObject);
77
+ ee.on('send-xhr-start', function (args, xhr) {
78
+ wrapOnreadystatechange(args, xhr);
79
+ enqueuePendingXhr(xhr);
80
+ });
81
+ ee.on('open-xhr-start', wrapOnreadystatechange);
82
+ function wrapOnreadystatechange(args, xhr) {
83
+ wrapFn.inPlace(xhr, ['onreadystatechange'], 'fn-', getObject);
84
+ }
85
+ function wrapXHR() {
86
+ var xhr = this;
87
+ var ctx = ee.context(xhr);
88
+ if (xhr.readyState > 3 && !ctx.resolved) {
89
+ ctx.resolved = true;
90
+ ee.emit('xhr-resolved', [], xhr);
91
+ }
92
+ wrapFn.inPlace(xhr, handlers, 'fn-', getObject);
93
+ }
94
+
95
+ // Wrapping the onreadystatechange property of XHRs takes some special tricks.
96
+ //
97
+ // The issue is that the onreadystatechange property may be assigned *after*
98
+ // send() is called against an XHR. This is of particular importance because
99
+ // jQuery uses a single onreadystatechange handler to implement all of the XHR
100
+ // callbacks thtat it provides, and it assigns that property after calling send.
101
+ //
102
+ // There are several 'obvious' approaches to wrapping the onreadystatechange
103
+ // when it's assigned after send:
104
+ //
105
+ // 1. Try to wrap the onreadystatechange handler from a readystatechange
106
+ // addEventListener callback (the addEventListener callback will fire before
107
+ // the onreadystatechange callback).
108
+ //
109
+ // Caveat: this doesn't work in Chrome or Safari, and in fact will cause
110
+ // the onreadystatechange handler to not be invoked at all during the
111
+ // firing cycle in which it is wrapped, which may break applications :(
112
+ //
113
+ // 2. Use Object.defineProperty to create a setter for the onreadystatechange
114
+ // property, and wrap from that setter.
115
+ //
116
+ // Caveat: onreadystatechange is not a configurable property in Safari or
117
+ // older versions of the Android browser.
118
+ //
119
+ // 3. Schedule wrapping of the onreadystatechange property using a setTimeout
120
+ // call issued just before the call to send.
121
+ //
122
+ // Caveat: sometimes, the onreadystatechange handler fires before the
123
+ // setTimeout, meaning the wrapping happens too late.
124
+ //
125
+ // The setTimeout approach is closest to what we use here: we want to schedule
126
+ // the wrapping of the onreadystatechange property when send is called, but
127
+ // ensure that our wrapping happens before onreadystatechange has a chance to
128
+ // fire.
129
+ //
130
+ // We achieve this using a hybrid approach:
131
+ //
132
+ // * In browsers that support MutationObserver, we use that to schedule wrapping
133
+ // of onreadystatechange.
134
+ //
135
+ // * We have discovered that MutationObserver in IE causes a memory leak, so we
136
+ // now will prefer setImmediate for IE, and use a resolved promise to schedule
137
+ // the wrapping in Edge (and other browsers that support promises)
138
+ //
139
+ // * In older browsers that don't support MutationObserver, we rely on the fact
140
+ // that the call to send is probably happening within a callback that we've
141
+ // already wrapped, and use our existing fn-end event callback to wrap the
142
+ // onreadystatechange at the end of the current callback.
143
+ //
144
+
145
+ if (MutationObserver) {
146
+ var resolved = Promise && Promise.resolve();
147
+ if (!setImmediate && !Promise) {
148
+ var toggle = 1;
149
+ var dummyNode = document.createTextNode(toggle);
150
+ new MutationObserver(drainPendingXhrs).observe(dummyNode, {
151
+ characterData: true
152
+ });
153
+ }
154
+ } else {
155
+ // this below case applies to web workers too
156
+ baseEE.on('fn-end', function (args) {
157
+ // We don't want to try to wrap onreadystatechange from within a
158
+ // readystatechange callback.
159
+ if (args[0] && args[0].type === READY_STATE_CHANGE) return;
160
+ drainPendingXhrs();
161
+ });
162
+ }
163
+ function enqueuePendingXhr(xhr) {
164
+ pendingXhrs.push(xhr);
165
+ if (MutationObserver) {
166
+ if (resolved) {
167
+ resolved.then(drainPendingXhrs);
168
+ } else if (setImmediate) {
169
+ setImmediate(drainPendingXhrs);
170
+ } else {
171
+ toggle = -toggle;
172
+ dummyNode.data = toggle;
173
+ }
174
+ }
175
+ }
176
+ function drainPendingXhrs() {
177
+ for (var i = 0; i < pendingXhrs.length; i++) {
178
+ wrapOnreadystatechange([], pendingXhrs[i]);
179
+ }
180
+ if (pendingXhrs.length) pendingXhrs = [];
181
+ }
182
+
183
+ // Use the object these methods are on as their
184
+ // context store for the event emitter
185
+ function getObject(args, obj) {
186
+ return obj;
187
+ }
188
+ function copy(from, to) {
189
+ for (var i in from) {
190
+ to[i] = from[i];
191
+ }
192
+ return to;
193
+ }
194
+ return ee;
195
+ }
196
+
197
+ /**
198
+ * Returns an event emitter scoped specifically for the `xhr` context. This scoping is a remnant from when all the
199
+ * features shared the same group in the event, to isolate events between features. It will likely be revisited.
200
+ * @param {Object} sharedEE - Optional event emitter on which to base the scoped emitter.
201
+ * Uses `ee` on the global scope if undefined).
202
+ * @returns {Object} Scoped event emitter with a debug ID of 'xhr'.
203
+ */
204
+ function scopedEE(sharedEE) {
205
+ return (sharedEE || _contextualEe.ee).get('xhr');
206
+ }
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Aggregate = void 0;
7
+ var _registerHandler = require("../../../common/event-emitter/register-handler");
8
+ var _stringify = require("../../../common/util/stringify");
9
+ var _belSerializer = require("../../../common/serialize/bel-serializer");
10
+ var _handle = require("../../../common/event-emitter/handle");
11
+ var _config = require("../../../common/config/config");
12
+ var _harvestScheduler = require("../../../common/harvest/harvest-scheduler");
13
+ var _denyList = require("../../../common/deny-list/deny-list");
14
+ var _aggregateBase = require("../../utils/aggregate-base");
15
+ var _constants = require("../constants");
16
+ var _drain = require("../../../common/drain/drain");
17
+ var _features = require("../../../loaders/features/features");
18
+ var _constants2 = require("../../metrics/constants");
19
+ /*
20
+ * Copyright 2020 New Relic Corporation. All rights reserved.
21
+ * SPDX-License-Identifier: Apache-2.0
22
+ */
23
+
24
+ class Aggregate extends _aggregateBase.AggregateBase {
25
+ static featureName = _constants.FEATURE_NAME;
26
+ constructor(agentIdentifier, aggregator) {
27
+ super(agentIdentifier, aggregator, _constants.FEATURE_NAME);
28
+ let ajaxEvents = [];
29
+ let spaAjaxEvents = {};
30
+ let sentAjaxEvents = [];
31
+ let scheduler;
32
+ const ee = this.ee;
33
+ const harvestTimeSeconds = (0, _config.getConfigurationValue)(agentIdentifier, 'ajax.harvestTimeSeconds') || 10;
34
+ const MAX_PAYLOAD_SIZE = (0, _config.getConfigurationValue)(agentIdentifier, 'ajax.maxPayloadSize') || 1000000;
35
+
36
+ // Exposes these methods to browser test files -- future TO DO: can be removed once these fns are extracted from the constructor into class func
37
+ this.storeXhr = storeXhr;
38
+ this.prepareHarvest = prepareHarvest;
39
+ this.getStoredEvents = function () {
40
+ return {
41
+ ajaxEvents,
42
+ spaAjaxEvents
43
+ };
44
+ };
45
+ ee.on('interactionSaved', interaction => {
46
+ if (!spaAjaxEvents[interaction.id]) return;
47
+ // remove from the spaAjaxEvents buffer, and let spa harvest it
48
+ delete spaAjaxEvents[interaction.id];
49
+ });
50
+ ee.on('interactionDiscarded', interaction => {
51
+ if (!spaAjaxEvents[interaction.id] || !allAjaxIsEnabled()) return;
52
+ spaAjaxEvents[interaction.id].forEach(function (item) {
53
+ // move it from the spaAjaxEvents buffer to the ajaxEvents buffer for harvesting here
54
+ ajaxEvents.push(item);
55
+ });
56
+ delete spaAjaxEvents[interaction.id];
57
+ });
58
+ if (allAjaxIsEnabled()) (0, _denyList.setDenyList)((0, _config.getConfigurationValue)(agentIdentifier, 'ajax.deny_list'));
59
+ (0, _registerHandler.registerHandler)('xhr', storeXhr, this.featureName, this.ee);
60
+ if (allAjaxIsEnabled()) {
61
+ scheduler = new _harvestScheduler.HarvestScheduler('events', {
62
+ onFinished: onEventsHarvestFinished,
63
+ getPayload: prepareHarvest
64
+ }, this);
65
+ ee.on(`drain-${this.featureName}`, () => {
66
+ scheduler.startTimer(harvestTimeSeconds);
67
+ });
68
+ }
69
+ function storeXhr(params, metrics, startTime, endTime, type) {
70
+ metrics.time = startTime;
71
+
72
+ // send to session traces
73
+ var hash;
74
+ if (params.cat) {
75
+ hash = (0, _stringify.stringify)([params.status, params.cat]);
76
+ } else {
77
+ hash = (0, _stringify.stringify)([params.status, params.host, params.pathname]);
78
+ }
79
+ (0, _handle.handle)('bstXhrAgg', ['xhr', hash, params, metrics], undefined, _features.FEATURE_NAMES.sessionTrace, ee);
80
+
81
+ // store as metric
82
+ aggregator.store('xhr', hash, params, metrics);
83
+ if (!allAjaxIsEnabled()) {
84
+ return;
85
+ }
86
+ if (!(0, _denyList.shouldCollectEvent)(params)) {
87
+ if (params.hostname === (0, _config.getInfo)(agentIdentifier).errorBeacon) {
88
+ (0, _handle.handle)(_constants2.SUPPORTABILITY_METRIC_CHANNEL, ['Ajax/Events/Excluded/Agent'], undefined, _features.FEATURE_NAMES.metrics, ee);
89
+ } else {
90
+ (0, _handle.handle)(_constants2.SUPPORTABILITY_METRIC_CHANNEL, ['Ajax/Events/Excluded/App'], undefined, _features.FEATURE_NAMES.metrics, ee);
91
+ }
92
+ return;
93
+ }
94
+ var xhrContext = this;
95
+ var event = {
96
+ method: params.method,
97
+ status: params.status,
98
+ domain: params.host,
99
+ path: params.pathname,
100
+ requestSize: metrics.txSize,
101
+ responseSize: metrics.rxSize,
102
+ type: type,
103
+ startTime: startTime,
104
+ endTime: endTime,
105
+ callbackDuration: metrics.cbTime
106
+ };
107
+ if (xhrContext.dt) {
108
+ event.spanId = xhrContext.dt.spanId;
109
+ event.traceId = xhrContext.dt.traceId;
110
+ event.spanTimestamp = xhrContext.dt.timestamp;
111
+ }
112
+
113
+ // if the ajax happened inside an interaction, hold it until the interaction finishes
114
+ if (this.spaNode) {
115
+ var interactionId = this.spaNode.interaction.id;
116
+ spaAjaxEvents[interactionId] = spaAjaxEvents[interactionId] || [];
117
+ spaAjaxEvents[interactionId].push(event);
118
+ } else {
119
+ ajaxEvents.push(event);
120
+ }
121
+ }
122
+ function prepareHarvest(options) {
123
+ options = options || {};
124
+ if (ajaxEvents.length === 0) {
125
+ return null;
126
+ }
127
+ var payload = getPayload(ajaxEvents, options.maxPayloadSize || MAX_PAYLOAD_SIZE);
128
+ var payloadObjs = [];
129
+ for (var i = 0; i < payload.length; i++) {
130
+ payloadObjs.push({
131
+ body: {
132
+ e: payload[i]
133
+ }
134
+ });
135
+ }
136
+ if (options.retry) {
137
+ sentAjaxEvents = ajaxEvents.slice();
138
+ }
139
+ ajaxEvents = [];
140
+ return payloadObjs;
141
+ }
142
+ function getPayload(events, maxPayloadSize, chunks) {
143
+ chunks = chunks || 1;
144
+ var payload = [];
145
+ var chunkSize = events.length / chunks;
146
+ var eventChunks = splitChunks(events, chunkSize);
147
+ var tooBig = false;
148
+ for (var i = 0; i < eventChunks.length; i++) {
149
+ var currentChunk = eventChunks[i];
150
+ if (currentChunk.tooBig(maxPayloadSize)) {
151
+ if (currentChunk.events.length !== 1) {
152
+ /* if it is too big BUT it isnt length 1, we can split it down again,
153
+ else we just want to NOT push it into payload
154
+ because if it's length 1 and still too big for the maxPayloadSize
155
+ it cant get any smaller and we dont want to recurse forever */
156
+ tooBig = true;
157
+ break;
158
+ }
159
+ } else {
160
+ payload.push(currentChunk.payload);
161
+ }
162
+ }
163
+ // check if the current payload string is too big, if so then run getPayload again with more buckets
164
+ return tooBig ? getPayload(events, maxPayloadSize, ++chunks) : payload;
165
+ }
166
+ function onEventsHarvestFinished(result) {
167
+ if (result.retry && sentAjaxEvents.length > 0 && allAjaxIsEnabled()) {
168
+ ajaxEvents = ajaxEvents.concat(sentAjaxEvents);
169
+ sentAjaxEvents = [];
170
+ }
171
+ }
172
+ function splitChunks(arr, chunkSize) {
173
+ chunkSize = chunkSize || arr.length;
174
+ var chunks = [];
175
+ for (var i = 0, len = arr.length; i < len; i += chunkSize) {
176
+ chunks.push(new Chunk(arr.slice(i, i + chunkSize)));
177
+ }
178
+ return chunks;
179
+ }
180
+ function Chunk(events) {
181
+ this.addString = (0, _belSerializer.getAddStringContext)(agentIdentifier); // pass agentIdentifier here
182
+ this.events = events;
183
+ this.payload = 'bel.7;';
184
+ for (var i = 0; i < events.length; i++) {
185
+ var event = events[i];
186
+ var fields = [(0, _belSerializer.numeric)(event.startTime), (0, _belSerializer.numeric)(event.endTime - event.startTime), (0, _belSerializer.numeric)(0),
187
+ // callbackEnd
188
+ (0, _belSerializer.numeric)(0),
189
+ // no callbackDuration for non-SPA events
190
+ this.addString(event.method), (0, _belSerializer.numeric)(event.status), this.addString(event.domain), this.addString(event.path), (0, _belSerializer.numeric)(event.requestSize), (0, _belSerializer.numeric)(event.responseSize), event.type === 'fetch' ? 1 : '', this.addString(0),
191
+ // nodeId
192
+ (0, _belSerializer.nullable)(event.spanId, this.addString, true) +
193
+ // guid
194
+ (0, _belSerializer.nullable)(event.traceId, this.addString, true) +
195
+ // traceId
196
+ (0, _belSerializer.nullable)(event.spanTimestamp, _belSerializer.numeric, false) // timestamp
197
+ ];
198
+
199
+ var insert = '2,';
200
+
201
+ // add custom attributes
202
+ var attrParts = (0, _belSerializer.addCustomAttributes)((0, _config.getInfo)(agentIdentifier).jsAttributes || {}, this.addString);
203
+ fields.unshift((0, _belSerializer.numeric)(attrParts.length));
204
+ insert += fields.join(',');
205
+ if (attrParts && attrParts.length > 0) {
206
+ insert += ';' + attrParts.join(';');
207
+ }
208
+ if (i + 1 < events.length) insert += ';';
209
+ this.payload += insert;
210
+ }
211
+ this.tooBig = function (maxPayloadSize) {
212
+ maxPayloadSize = maxPayloadSize || MAX_PAYLOAD_SIZE;
213
+ return this.payload.length * 2 > maxPayloadSize;
214
+ };
215
+ }
216
+ function allAjaxIsEnabled() {
217
+ var enabled = (0, _config.getConfigurationValue)(agentIdentifier, 'ajax.enabled');
218
+ if (enabled === false) {
219
+ return false;
220
+ }
221
+ return true;
222
+ }
223
+ (0, _drain.drain)(this.agentIdentifier, this.featureName);
224
+ }
225
+ }
226
+ exports.Aggregate = Aggregate;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FEATURE_NAME = void 0;
7
+ var _features = require("../../loaders/features/features");
8
+ const FEATURE_NAME = _features.FEATURE_NAMES.ajax;
9
+ exports.FEATURE_NAME = FEATURE_NAME;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "Ajax", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _index.Instrument;
10
+ }
11
+ });
12
+ var _index = require("./instrument/index");
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DT = void 0;
7
+ var _config = require("../../../common/config/config");
8
+ var _uniqueId = require("../../../common/ids/unique-id");
9
+ var _parseUrl = require("../../../common/url/parse-url");
10
+ var _globalScope = require("../../../common/util/global-scope");
11
+ var _stringify = require("../../../common/util/stringify");
12
+ /*
13
+ * Copyright 2020 New Relic Corporation. All rights reserved.
14
+ * SPDX-License-Identifier: Apache-2.0
15
+ */
16
+
17
+ class DT {
18
+ constructor(agentIdentifier) {
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
+ }
25
+ generateTracePayload(parsedOrigin) {
26
+ if (!this.shouldGenerateTrace(parsedOrigin)) {
27
+ return null;
28
+ }
29
+ var loader_config = (0, _config.getLoaderConfig)(this.agentIdentifier);
30
+ if (!loader_config) {
31
+ return null;
32
+ }
33
+ var accountId = (loader_config.accountID || '').toString() || null;
34
+ var agentId = (loader_config.agentID || '').toString() || null;
35
+ var trustKey = (loader_config.trustKey || '').toString() || null;
36
+ if (!accountId || !agentId) {
37
+ return null;
38
+ }
39
+ var spanId = (0, _uniqueId.generateSpanId)();
40
+ var traceId = (0, _uniqueId.generateTraceId)();
41
+ var timestamp = Date.now();
42
+ var payload = {
43
+ spanId: spanId,
44
+ traceId: traceId,
45
+ timestamp: timestamp
46
+ };
47
+ if (parsedOrigin.sameOrigin || this.isAllowedOrigin(parsedOrigin) && this.useTraceContextHeadersForCors()) {
48
+ payload.traceContextParentHeader = this.generateTraceContextParentHeader(spanId, traceId);
49
+ payload.traceContextStateHeader = this.generateTraceContextStateHeader(spanId, timestamp, accountId, agentId, trustKey);
50
+ }
51
+ if (parsedOrigin.sameOrigin && !this.excludeNewrelicHeader() || !parsedOrigin.sameOrigin && this.isAllowedOrigin(parsedOrigin) && this.useNewrelicHeaderForCors()) {
52
+ payload.newrelicHeader = this.generateTraceHeader(spanId, traceId, timestamp, accountId, agentId, trustKey);
53
+ }
54
+ return payload;
55
+ }
56
+ generateTraceContextParentHeader(spanId, traceId) {
57
+ return '00-' + traceId + '-' + spanId + '-01';
58
+ }
59
+ generateTraceContextStateHeader(spanId, timestamp, accountId, appId, trustKey) {
60
+ var version = 0;
61
+ var transactionId = '';
62
+ var parentType = 1;
63
+ var sampled = '';
64
+ var priority = '';
65
+ return trustKey + '@nr=' + version + '-' + parentType + '-' + accountId + '-' + appId + '-' + spanId + '-' + transactionId + '-' + sampled + '-' + priority + '-' + timestamp;
66
+ }
67
+ generateTraceHeader(spanId, traceId, timestamp, accountId, appId, trustKey) {
68
+ var hasBtoa = typeof _globalScope.globalScope?.btoa === 'function';
69
+ if (!hasBtoa) {
70
+ return null;
71
+ }
72
+ var payload = {
73
+ v: [0, 1],
74
+ d: {
75
+ ty: 'Browser',
76
+ ac: accountId,
77
+ ap: appId,
78
+ id: spanId,
79
+ tr: traceId,
80
+ ti: timestamp
81
+ }
82
+ };
83
+ if (trustKey && accountId !== trustKey) {
84
+ payload.d.tk = trustKey;
85
+ }
86
+ return btoa((0, _stringify.stringify)(payload));
87
+ }
88
+
89
+ // return true if DT is enabled and the origin is allowed, either by being
90
+ // same-origin, or included in the allowed list
91
+ shouldGenerateTrace(parsedOrigin) {
92
+ return this.isDtEnabled() && this.isAllowedOrigin(parsedOrigin);
93
+ }
94
+ isAllowedOrigin(parsedOrigin) {
95
+ var allowed = false;
96
+ var dtConfig = {};
97
+ var dt = (0, _config.getConfigurationValue)(this.agentIdentifier, 'distributed_tracing');
98
+ if (dt) {
99
+ dtConfig = (0, _config.getConfiguration)(this.agentIdentifier).distributed_tracing;
100
+ }
101
+ if (parsedOrigin.sameOrigin) {
102
+ allowed = true;
103
+ } else if (dtConfig.allowed_origins instanceof Array) {
104
+ for (var i = 0; i < dtConfig.allowed_origins.length; i++) {
105
+ var allowedOrigin = (0, _parseUrl.parseUrl)(dtConfig.allowed_origins[i]);
106
+ if (parsedOrigin.hostname === allowedOrigin.hostname && parsedOrigin.protocol === allowedOrigin.protocol && parsedOrigin.port === allowedOrigin.port) {
107
+ allowed = true;
108
+ break;
109
+ }
110
+ }
111
+ }
112
+ return allowed;
113
+ }
114
+ isDtEnabled() {
115
+ var dt = (0, _config.getConfigurationValue)(this.agentIdentifier, 'distributed_tracing');
116
+ if (dt) {
117
+ return !!dt.enabled;
118
+ }
119
+ return false;
120
+ }
121
+
122
+ // exclude the newrelic header for same-origin calls
123
+ excludeNewrelicHeader() {
124
+ var dt = (0, _config.getConfigurationValue)(this.agentIdentifier, 'distributed_tracing');
125
+ if (dt) {
126
+ return !!dt.exclude_newrelic_header;
127
+ }
128
+ return false;
129
+ }
130
+ useNewrelicHeaderForCors() {
131
+ var dt = (0, _config.getConfigurationValue)(this.agentIdentifier, 'distributed_tracing');
132
+ if (dt) {
133
+ return dt.cors_use_newrelic_header !== false;
134
+ }
135
+ return false;
136
+ }
137
+ useTraceContextHeadersForCors() {
138
+ var dt = (0, _config.getConfigurationValue)(this.agentIdentifier, 'distributed_tracing');
139
+ if (dt) {
140
+ return !!dt.cors_use_tracecontext_headers;
141
+ }
142
+ return false;
143
+ }
144
+ }
145
+ exports.DT = DT;