@newrelic/browser-agent 0.1.229 → 0.1.230

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 (509) hide show
  1. package/README.md +40 -1
  2. package/dist/cjs/common/config/state/configurable.js +2 -1
  3. package/dist/cjs/common/config/state/runtime.js +1 -0
  4. package/dist/cjs/common/constants/environment-variables.js +1 -1
  5. package/dist/cjs/common/context/shared-context.js +2 -1
  6. package/dist/cjs/common/drain/drain.js +9 -3
  7. package/dist/cjs/common/event-listener/event-listener-opts.js +4 -2
  8. package/dist/cjs/common/harvest/harvest-scheduler.js +2 -1
  9. package/dist/cjs/common/harvest/harvest.js +13 -2
  10. package/dist/cjs/common/util/console.js +1 -1
  11. package/dist/cjs/common/util/map-own.js +21 -14
  12. package/dist/cjs/common/util/map-own.test.js +49 -0
  13. package/dist/cjs/common/util/submit-data.js +11 -3
  14. package/dist/cjs/common/window/page-visibility.js +2 -1
  15. package/dist/cjs/common/window/session-storage.js +56 -11
  16. package/dist/cjs/common/wrap/index.js +11 -4
  17. package/dist/cjs/common/wrap/wrap-console.js +54 -0
  18. package/dist/cjs/common/wrap/wrap-events.js +4 -1
  19. package/dist/cjs/common/wrap/wrap-fetch.js +0 -2
  20. package/dist/cjs/common/wrap/wrap-function.js +4 -18
  21. package/dist/cjs/common/wrap/wrap-promise.js +4 -1
  22. package/dist/cjs/features/ajax/instrument/index.js +2 -1
  23. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.test.js +5 -4
  24. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.js +1 -2
  25. package/dist/cjs/features/jserrors/aggregate/format-stack-trace.test.js +5 -4
  26. package/dist/cjs/features/jserrors/aggregate/index.js +32 -11
  27. package/dist/cjs/features/jserrors/aggregate/string-hash-code.test.js +5 -4
  28. package/dist/cjs/features/jserrors/instrument/index.js +7 -10
  29. package/dist/cjs/features/metrics/aggregate/index.js +11 -0
  30. package/dist/cjs/features/metrics/instrument/index.js +27 -1
  31. package/dist/cjs/features/metrics/instrument/workers-helper.js +4 -1
  32. package/dist/cjs/features/page_action/aggregate/index.js +11 -3
  33. package/dist/cjs/features/page_action/instrument/index.js +2 -1
  34. package/dist/cjs/features/page_view_event/aggregate/index.js +8 -4
  35. package/dist/cjs/features/page_view_event/instrument/index.js +2 -1
  36. package/dist/cjs/features/page_view_timing/aggregate/index.js +54 -35
  37. package/dist/cjs/features/page_view_timing/instrument/index.js +2 -1
  38. package/dist/cjs/features/session_trace/aggregate/index.js +53 -13
  39. package/dist/cjs/features/session_trace/instrument/index.js +2 -1
  40. package/dist/cjs/features/spa/instrument/index.js +2 -1
  41. package/dist/cjs/features/utils/instrument-base.js +2 -1
  42. package/dist/cjs/index.js +9 -9
  43. package/dist/cjs/loaders/agent.js +2 -1
  44. package/dist/cjs/loaders/api/api.js +86 -21
  45. package/dist/cjs/loaders/api/apiAsync.js +3 -3
  46. package/dist/cjs/loaders/configure/configure.js +13 -7
  47. package/dist/cjs/loaders/micro-agent.js +18 -13
  48. package/dist/esm/common/config/state/configurable.js +2 -1
  49. package/dist/esm/common/config/state/runtime.js +1 -0
  50. package/dist/esm/common/constants/environment-variables.js +1 -1
  51. package/dist/esm/common/context/shared-context.js +2 -1
  52. package/dist/esm/common/drain/drain.js +9 -3
  53. package/dist/esm/common/event-listener/event-listener-opts.js +4 -2
  54. package/dist/esm/common/harvest/harvest-scheduler.js +2 -1
  55. package/dist/esm/common/harvest/harvest.js +13 -2
  56. package/dist/esm/common/util/console.js +1 -1
  57. package/dist/esm/common/util/map-own.js +19 -13
  58. package/dist/esm/common/util/map-own.test.js +47 -0
  59. package/dist/esm/common/util/submit-data.js +11 -3
  60. package/dist/esm/common/window/page-visibility.js +2 -1
  61. package/dist/esm/common/window/session-storage.js +54 -13
  62. package/dist/esm/common/wrap/index.js +5 -4
  63. package/dist/esm/common/wrap/wrap-console.js +46 -0
  64. package/dist/esm/common/wrap/wrap-events.js +5 -2
  65. package/dist/esm/common/wrap/wrap-fetch.js +1 -3
  66. package/dist/esm/common/wrap/wrap-function.js +4 -17
  67. package/dist/esm/common/wrap/wrap-history.js +1 -1
  68. package/dist/esm/common/wrap/wrap-jsonp.js +1 -1
  69. package/dist/esm/common/wrap/wrap-promise.js +4 -1
  70. package/dist/esm/common/wrap/wrap-raf.js +1 -1
  71. package/dist/esm/common/wrap/wrap-timer.js +1 -1
  72. package/dist/esm/common/wrap/wrap-xhr.js +2 -2
  73. package/dist/esm/features/ajax/instrument/index.js +2 -1
  74. package/dist/esm/features/jserrors/aggregate/canonical-function-name.test.js +5 -4
  75. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.js +1 -2
  76. package/dist/esm/features/jserrors/aggregate/format-stack-trace.test.js +5 -4
  77. package/dist/esm/features/jserrors/aggregate/index.js +32 -11
  78. package/dist/esm/features/jserrors/aggregate/string-hash-code.test.js +5 -4
  79. package/dist/esm/features/jserrors/instrument/index.js +7 -10
  80. package/dist/esm/features/metrics/aggregate/index.js +11 -0
  81. package/dist/esm/features/metrics/instrument/index.js +27 -1
  82. package/dist/esm/features/metrics/instrument/workers-helper.js +4 -1
  83. package/dist/esm/features/page_action/aggregate/index.js +11 -3
  84. package/dist/esm/features/page_action/instrument/index.js +2 -1
  85. package/dist/esm/features/page_view_event/aggregate/index.js +8 -4
  86. package/dist/esm/features/page_view_event/instrument/index.js +2 -1
  87. package/dist/esm/features/page_view_timing/aggregate/index.js +54 -35
  88. package/dist/esm/features/page_view_timing/instrument/index.js +2 -1
  89. package/dist/esm/features/session_trace/aggregate/index.js +53 -13
  90. package/dist/esm/features/session_trace/instrument/index.js +2 -1
  91. package/dist/esm/features/spa/instrument/index.js +2 -1
  92. package/dist/esm/features/utils/instrument-base.js +2 -1
  93. package/dist/esm/index.js +4 -4
  94. package/dist/esm/loaders/agent.js +2 -1
  95. package/dist/esm/loaders/api/api.js +85 -21
  96. package/dist/esm/loaders/api/apiAsync.js +3 -3
  97. package/dist/esm/loaders/configure/configure.js +14 -8
  98. package/dist/esm/loaders/micro-agent.js +18 -13
  99. package/dist/types/cdn/lite.d.ts +2 -0
  100. package/dist/types/cdn/lite.d.ts.map +1 -0
  101. package/dist/types/cdn/polyfills/lite.d.ts +2 -0
  102. package/dist/types/cdn/polyfills/lite.d.ts.map +1 -0
  103. package/dist/types/cdn/polyfills/pro.d.ts +2 -0
  104. package/dist/types/cdn/polyfills/pro.d.ts.map +1 -0
  105. package/dist/types/cdn/polyfills/spa.d.ts +2 -0
  106. package/dist/types/cdn/polyfills/spa.d.ts.map +1 -0
  107. package/dist/types/cdn/polyfills.d.ts +2 -0
  108. package/dist/types/cdn/polyfills.d.ts.map +1 -0
  109. package/dist/types/cdn/pro.d.ts +2 -0
  110. package/dist/types/cdn/pro.d.ts.map +1 -0
  111. package/dist/types/cdn/spa.d.ts +2 -0
  112. package/dist/types/cdn/spa.d.ts.map +1 -0
  113. package/dist/types/cdn/worker.d.ts +2 -0
  114. package/dist/types/cdn/worker.d.ts.map +1 -0
  115. package/dist/types/common/aggregate/aggregator.d.ts +11 -0
  116. package/dist/types/common/aggregate/aggregator.d.ts.map +1 -0
  117. package/dist/types/common/browser-version/firefox-version.d.ts +2 -0
  118. package/dist/types/common/browser-version/firefox-version.d.ts.map +1 -0
  119. package/dist/types/common/browser-version/ios-version.d.ts +3 -0
  120. package/dist/types/common/browser-version/ios-version.d.ts.map +1 -0
  121. package/dist/types/common/config/config.d.ts +13 -0
  122. package/dist/types/common/config/config.d.ts.map +1 -0
  123. package/dist/types/common/config/state/configurable.d.ts +4 -0
  124. package/dist/types/common/config/state/configurable.d.ts.map +1 -0
  125. package/dist/types/common/config/state/info.d.ts +4 -0
  126. package/dist/types/common/config/state/info.d.ts.map +1 -0
  127. package/dist/types/common/config/state/init.d.ts +4 -0
  128. package/dist/types/common/config/state/init.d.ts.map +1 -0
  129. package/dist/types/common/config/state/loader-config.d.ts +3 -0
  130. package/dist/types/common/config/state/loader-config.d.ts.map +1 -0
  131. package/dist/types/common/config/state/originals.d.ts +2 -0
  132. package/dist/types/common/config/state/originals.d.ts.map +1 -0
  133. package/dist/types/common/config/state/runtime.d.ts +3 -0
  134. package/dist/types/common/config/state/runtime.d.ts.map +1 -0
  135. package/dist/types/common/constants/environment-variables.d.ts +4 -0
  136. package/dist/types/common/constants/environment-variables.d.ts.map +1 -0
  137. package/dist/types/common/context/shared-context.d.ts +5 -0
  138. package/dist/types/common/context/shared-context.d.ts.map +1 -0
  139. package/dist/types/common/deny-list/deny-list.d.ts +12 -0
  140. package/dist/types/common/deny-list/deny-list.d.ts.map +1 -0
  141. package/dist/types/common/drain/drain.d.ts +17 -0
  142. package/dist/types/common/drain/drain.d.ts.map +1 -0
  143. package/dist/types/common/event-emitter/contextual-ee.d.ts +4 -0
  144. package/dist/types/common/event-emitter/contextual-ee.d.ts.map +1 -0
  145. package/dist/types/common/event-emitter/handle.d.ts +3 -0
  146. package/dist/types/common/event-emitter/handle.d.ts.map +1 -0
  147. package/dist/types/common/event-emitter/register-handler.d.ts +8 -0
  148. package/dist/types/common/event-emitter/register-handler.d.ts.map +1 -0
  149. package/dist/types/common/event-listener/event-listener-opts.d.ts +10 -0
  150. package/dist/types/common/event-listener/event-listener-opts.d.ts.map +1 -0
  151. package/dist/types/common/harvest/harvest-scheduler.d.ts +21 -0
  152. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -0
  153. package/dist/types/common/harvest/harvest.d.ts +58 -0
  154. package/dist/types/common/harvest/harvest.d.ts.map +1 -0
  155. package/dist/types/common/ids/id.d.ts +2 -0
  156. package/dist/types/common/ids/id.d.ts.map +1 -0
  157. package/dist/types/common/ids/unique-id.d.ts +5 -0
  158. package/dist/types/common/ids/unique-id.d.ts.map +1 -0
  159. package/dist/types/common/metrics/framework-detection.d.ts +2 -0
  160. package/dist/types/common/metrics/framework-detection.d.ts.map +1 -0
  161. package/dist/types/common/metrics/paint-metrics.d.ts +2 -0
  162. package/dist/types/common/metrics/paint-metrics.d.ts.map +1 -0
  163. package/dist/types/common/serialize/bel-serializer.d.ts +5 -0
  164. package/dist/types/common/serialize/bel-serializer.d.ts.map +1 -0
  165. package/dist/types/common/timing/nav-timing.d.ts +5 -0
  166. package/dist/types/common/timing/nav-timing.d.ts.map +1 -0
  167. package/dist/types/common/timing/now.d.ts +2 -0
  168. package/dist/types/common/timing/now.d.ts.map +1 -0
  169. package/dist/types/common/unload/eol.d.ts +8 -0
  170. package/dist/types/common/unload/eol.d.ts.map +1 -0
  171. package/dist/types/common/url/clean-url.d.ts +2 -0
  172. package/dist/types/common/url/clean-url.d.ts.map +1 -0
  173. package/dist/types/common/url/encode.d.ts +5 -0
  174. package/dist/types/common/url/encode.d.ts.map +1 -0
  175. package/dist/types/common/url/location.d.ts +2 -0
  176. package/dist/types/common/url/location.d.ts.map +1 -0
  177. package/dist/types/common/url/parse-url.d.ts +2 -0
  178. package/dist/types/common/url/parse-url.d.ts.map +1 -0
  179. package/dist/types/common/url/protocol.d.ts +7 -0
  180. package/dist/types/common/url/protocol.d.ts.map +1 -0
  181. package/dist/types/common/util/console.d.ts +8 -0
  182. package/dist/types/common/util/console.d.ts.map +1 -0
  183. package/dist/types/common/util/data-size.d.ts +2 -0
  184. package/dist/types/common/util/data-size.d.ts.map +1 -0
  185. package/dist/types/common/util/feature-flags.d.ts +3 -0
  186. package/dist/types/common/util/feature-flags.d.ts.map +1 -0
  187. package/dist/types/common/util/get-or-set.d.ts +2 -0
  188. package/dist/types/common/util/get-or-set.d.ts.map +1 -0
  189. package/dist/types/common/util/global-scope.d.ts +13 -0
  190. package/dist/types/common/util/global-scope.d.ts.map +1 -0
  191. package/dist/types/common/util/map-own.d.ts +3 -0
  192. package/dist/types/common/util/map-own.d.ts.map +1 -0
  193. package/dist/types/common/util/obfuscate.d.ts +8 -0
  194. package/dist/types/common/util/obfuscate.d.ts.map +1 -0
  195. package/dist/types/common/util/s-hash.d.ts +2 -0
  196. package/dist/types/common/util/s-hash.d.ts.map +1 -0
  197. package/dist/types/common/util/single.d.ts +2 -0
  198. package/dist/types/common/util/single.d.ts.map +1 -0
  199. package/dist/types/common/util/stringify.d.ts +8 -0
  200. package/dist/types/common/util/stringify.d.ts.map +1 -0
  201. package/dist/types/common/util/submit-data.d.ts +35 -0
  202. package/dist/types/common/util/submit-data.d.ts.map +1 -0
  203. package/dist/types/common/util/traverse.d.ts +2 -0
  204. package/dist/types/common/util/traverse.d.ts.map +1 -0
  205. package/dist/types/common/util/user-agent.d.ts +5 -0
  206. package/dist/types/common/util/user-agent.d.ts.map +1 -0
  207. package/dist/types/common/window/load.d.ts +3 -0
  208. package/dist/types/common/window/load.d.ts.map +1 -0
  209. package/dist/types/common/window/nreum.d.ts +14 -0
  210. package/dist/types/common/window/nreum.d.ts.map +1 -0
  211. package/dist/types/common/window/page-visibility.d.ts +7 -0
  212. package/dist/types/common/window/page-visibility.d.ts.map +1 -0
  213. package/dist/types/common/window/session-storage.d.ts +18 -0
  214. package/dist/types/common/window/session-storage.d.ts.map +1 -0
  215. package/dist/types/common/window/supports-performance-observer.d.ts +2 -0
  216. package/dist/types/common/window/supports-performance-observer.d.ts.map +1 -0
  217. package/dist/types/common/wrap/index.d.ts +12 -0
  218. package/dist/types/common/wrap/index.d.ts.map +1 -0
  219. package/dist/types/common/wrap/wrap-console.d.ts +16 -0
  220. package/dist/types/common/wrap/wrap-console.d.ts.map +1 -0
  221. package/dist/types/common/wrap/wrap-events.d.ts +17 -0
  222. package/dist/types/common/wrap/wrap-events.d.ts.map +1 -0
  223. package/dist/types/common/wrap/wrap-fetch.d.ts +18 -0
  224. package/dist/types/common/wrap/wrap-fetch.d.ts.map +1 -0
  225. package/dist/types/common/wrap/wrap-function.d.ts +28 -0
  226. package/dist/types/common/wrap/wrap-function.d.ts.map +1 -0
  227. package/dist/types/common/wrap/wrap-history.d.ts +16 -0
  228. package/dist/types/common/wrap/wrap-history.d.ts.map +1 -0
  229. package/dist/types/common/wrap/wrap-jsonp.d.ts +16 -0
  230. package/dist/types/common/wrap/wrap-jsonp.d.ts.map +1 -0
  231. package/dist/types/common/wrap/wrap-mutation.d.ts +16 -0
  232. package/dist/types/common/wrap/wrap-mutation.d.ts.map +1 -0
  233. package/dist/types/common/wrap/wrap-promise.d.ts +17 -0
  234. package/dist/types/common/wrap/wrap-promise.d.ts.map +1 -0
  235. package/dist/types/common/wrap/wrap-raf.d.ts +16 -0
  236. package/dist/types/common/wrap/wrap-raf.d.ts.map +1 -0
  237. package/dist/types/common/wrap/wrap-timer.d.ts +17 -0
  238. package/dist/types/common/wrap/wrap-timer.d.ts.map +1 -0
  239. package/dist/types/common/wrap/wrap-xhr.d.ts +16 -0
  240. package/dist/types/common/wrap/wrap-xhr.d.ts.map +1 -0
  241. package/dist/types/features/ajax/aggregate/index.d.ts +16 -0
  242. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -0
  243. package/dist/types/features/ajax/constants.d.ts +2 -0
  244. package/dist/types/features/ajax/constants.d.ts.map +1 -0
  245. package/dist/types/features/ajax/index.d.ts +2 -0
  246. package/dist/types/features/ajax/index.d.ts.map +1 -0
  247. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts +19 -0
  248. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts.map +1 -0
  249. package/dist/types/features/ajax/instrument/index.d.ts +9 -0
  250. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -0
  251. package/dist/types/features/ajax/instrument/response-size.d.ts +2 -0
  252. package/dist/types/features/ajax/instrument/response-size.d.ts.map +1 -0
  253. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts +2 -0
  254. package/dist/types/features/jserrors/aggregate/canonical-function-name.d.ts.map +1 -0
  255. package/dist/types/features/jserrors/aggregate/compute-stack-trace.d.ts +22 -0
  256. package/dist/types/features/jserrors/aggregate/compute-stack-trace.d.ts.map +1 -0
  257. package/dist/types/features/jserrors/aggregate/format-stack-trace.d.ts +3 -0
  258. package/dist/types/features/jserrors/aggregate/format-stack-trace.d.ts.map +1 -0
  259. package/dist/types/features/jserrors/aggregate/index.d.ts +24 -0
  260. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -0
  261. package/dist/types/features/jserrors/aggregate/string-hash-code.d.ts +2 -0
  262. package/dist/types/features/jserrors/aggregate/string-hash-code.d.ts.map +1 -0
  263. package/dist/types/features/jserrors/constants.d.ts +3 -0
  264. package/dist/types/features/jserrors/constants.d.ts.map +1 -0
  265. package/dist/types/features/jserrors/index.d.ts +2 -0
  266. package/dist/types/features/jserrors/index.d.ts.map +1 -0
  267. package/dist/types/features/jserrors/instrument/debug.d.ts +2 -0
  268. package/dist/types/features/jserrors/instrument/debug.d.ts.map +1 -0
  269. package/dist/types/features/jserrors/instrument/index.d.ts +22 -0
  270. package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -0
  271. package/dist/types/features/metrics/aggregate/index.d.ts +12 -0
  272. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -0
  273. package/dist/types/features/metrics/constants.d.ts +6 -0
  274. package/dist/types/features/metrics/constants.d.ts.map +1 -0
  275. package/dist/types/features/metrics/index.d.ts +2 -0
  276. package/dist/types/features/metrics/index.d.ts.map +1 -0
  277. package/dist/types/features/metrics/instrument/index.d.ts +7 -0
  278. package/dist/types/features/metrics/instrument/index.d.ts.map +1 -0
  279. package/dist/types/features/metrics/instrument/workers-helper.d.ts +7 -0
  280. package/dist/types/features/metrics/instrument/workers-helper.d.ts.map +1 -0
  281. package/dist/types/features/page_action/aggregate/index.d.ts +24 -0
  282. package/dist/types/features/page_action/aggregate/index.d.ts.map +1 -0
  283. package/dist/types/features/page_action/constants.d.ts +2 -0
  284. package/dist/types/features/page_action/constants.d.ts.map +1 -0
  285. package/dist/types/features/page_action/index.d.ts +2 -0
  286. package/dist/types/features/page_action/index.d.ts.map +1 -0
  287. package/dist/types/features/page_action/instrument/index.d.ts +6 -0
  288. package/dist/types/features/page_action/instrument/index.d.ts.map +1 -0
  289. package/dist/types/features/page_view_event/aggregate/index.d.ts +9 -0
  290. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -0
  291. package/dist/types/features/page_view_event/aggregate/initialized-features.d.ts +8 -0
  292. package/dist/types/features/page_view_event/aggregate/initialized-features.d.ts.map +1 -0
  293. package/dist/types/features/page_view_event/constants.d.ts +5 -0
  294. package/dist/types/features/page_view_event/constants.d.ts.map +1 -0
  295. package/dist/types/features/page_view_event/index.d.ts +2 -0
  296. package/dist/types/features/page_view_event/index.d.ts.map +1 -0
  297. package/dist/types/features/page_view_event/instrument/index.d.ts +6 -0
  298. package/dist/types/features/page_view_event/instrument/index.d.ts.map +1 -0
  299. package/dist/types/features/page_view_timing/aggregate/index.d.ts +33 -0
  300. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -0
  301. package/dist/types/features/page_view_timing/constants.d.ts +2 -0
  302. package/dist/types/features/page_view_timing/constants.d.ts.map +1 -0
  303. package/dist/types/features/page_view_timing/first-paint.d.ts +2 -0
  304. package/dist/types/features/page_view_timing/first-paint.d.ts.map +1 -0
  305. package/dist/types/features/page_view_timing/index.d.ts +2 -0
  306. package/dist/types/features/page_view_timing/index.d.ts.map +1 -0
  307. package/dist/types/features/page_view_timing/instrument/index.d.ts +6 -0
  308. package/dist/types/features/page_view_timing/instrument/index.d.ts.map +1 -0
  309. package/dist/types/features/page_view_timing/long-tasks.d.ts +2 -0
  310. package/dist/types/features/page_view_timing/long-tasks.d.ts.map +1 -0
  311. package/dist/types/features/session_trace/aggregate/index.d.ts +77 -0
  312. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -0
  313. package/dist/types/features/session_trace/constants.d.ts +13 -0
  314. package/dist/types/features/session_trace/constants.d.ts.map +1 -0
  315. package/dist/types/features/session_trace/index.d.ts +2 -0
  316. package/dist/types/features/session_trace/index.d.ts.map +1 -0
  317. package/dist/types/features/session_trace/instrument/index.d.ts +11 -0
  318. package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -0
  319. package/dist/types/features/spa/aggregate/index.d.ts +25 -0
  320. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -0
  321. package/dist/types/features/spa/aggregate/interaction-node.d.ts +15 -0
  322. package/dist/types/features/spa/aggregate/interaction-node.d.ts.map +1 -0
  323. package/dist/types/features/spa/aggregate/interaction.d.ts +20 -0
  324. package/dist/types/features/spa/aggregate/interaction.d.ts.map +1 -0
  325. package/dist/types/features/spa/aggregate/serializer.d.ts +15 -0
  326. package/dist/types/features/spa/aggregate/serializer.d.ts.map +1 -0
  327. package/dist/types/features/spa/constants.d.ts +23 -0
  328. package/dist/types/features/spa/constants.d.ts.map +1 -0
  329. package/dist/types/features/spa/index.d.ts +2 -0
  330. package/dist/types/features/spa/index.d.ts.map +1 -0
  331. package/dist/types/features/spa/instrument/index.d.ts +8 -0
  332. package/dist/types/features/spa/instrument/index.d.ts.map +1 -0
  333. package/dist/types/features/utils/aggregate-base.d.ts +4 -0
  334. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -0
  335. package/dist/types/features/utils/feature-base.d.ts +23 -0
  336. package/dist/types/features/utils/feature-base.d.ts.map +1 -0
  337. package/dist/types/features/utils/handler-cache.d.ts +22 -0
  338. package/dist/types/features/utils/handler-cache.d.ts.map +1 -0
  339. package/dist/types/features/utils/instrument-base.d.ts +27 -0
  340. package/dist/types/features/utils/instrument-base.d.ts.map +1 -0
  341. package/dist/types/features/utils/lazy-loader.d.ts +13 -0
  342. package/dist/types/features/utils/lazy-loader.d.ts.map +1 -0
  343. package/dist/types/index.d.ts +12 -0
  344. package/dist/types/index.d.ts.map +1 -0
  345. package/dist/types/loaders/agent.d.ts +20 -0
  346. package/dist/types/loaders/agent.d.ts.map +1 -0
  347. package/dist/types/loaders/api/api.d.ts +17 -0
  348. package/dist/types/loaders/api/api.d.ts.map +1 -0
  349. package/dist/types/loaders/api/apiAsync.d.ts +2 -0
  350. package/dist/types/loaders/api/apiAsync.d.ts.map +1 -0
  351. package/dist/types/loaders/browser-agent.d.ts +9 -0
  352. package/dist/types/loaders/browser-agent.d.ts.map +1 -0
  353. package/dist/types/loaders/configure/configure.d.ts +10 -0
  354. package/dist/types/loaders/configure/configure.d.ts.map +1 -0
  355. package/dist/types/loaders/features/enabled-features.d.ts +2 -0
  356. package/dist/types/loaders/features/enabled-features.d.ts.map +1 -0
  357. package/dist/types/loaders/features/featureDependencies.d.ts +3 -0
  358. package/dist/types/loaders/features/featureDependencies.d.ts.map +1 -0
  359. package/dist/types/loaders/features/features.d.ts +18 -0
  360. package/dist/types/loaders/features/features.d.ts.map +1 -0
  361. package/dist/types/loaders/micro-agent.d.ts +25 -0
  362. package/dist/types/loaders/micro-agent.d.ts.map +1 -0
  363. package/dist/types/loaders/worker-agent.d.ts +8 -0
  364. package/dist/types/loaders/worker-agent.d.ts.map +1 -0
  365. package/package.json +61 -32
  366. package/src/cdn/lite.js +18 -0
  367. package/src/cdn/polyfills/lite.js +7 -0
  368. package/src/cdn/polyfills/pro.js +7 -0
  369. package/src/cdn/polyfills/spa.js +7 -0
  370. package/src/cdn/polyfills.js +17 -0
  371. package/src/cdn/pro.js +27 -0
  372. package/src/cdn/spa.js +28 -0
  373. package/src/cdn/worker.js +21 -0
  374. package/src/common/aggregate/aggregator.js +171 -0
  375. package/src/common/browser-version/firefox-version.js +10 -0
  376. package/src/common/browser-version/ios-version.js +10 -0
  377. package/src/common/config/config.js +12 -0
  378. package/src/common/config/state/configurable.js +26 -0
  379. package/src/common/config/state/info.js +49 -0
  380. package/src/common/config/state/init.js +56 -0
  381. package/src/common/config/state/loader-config.js +25 -0
  382. package/src/common/config/state/originals.js +3 -0
  383. package/src/common/config/state/runtime.js +45 -0
  384. package/src/common/constants/environment-variables.js +11 -0
  385. package/src/common/context/shared-context.js +21 -0
  386. package/src/common/deny-list/deny-list.js +116 -0
  387. package/src/common/drain/drain.js +119 -0
  388. package/src/common/event-emitter/contextual-ee.js +159 -0
  389. package/src/common/event-emitter/handle.js +17 -0
  390. package/src/common/event-emitter/register-handler.js +25 -0
  391. package/src/common/event-listener/event-listener-opts.js +41 -0
  392. package/src/common/harvest/harvest-scheduler.js +112 -0
  393. package/src/common/harvest/harvest.js +248 -0
  394. package/src/common/ids/id.js +23 -0
  395. package/src/common/ids/unique-id.js +81 -0
  396. package/src/common/metrics/framework-detection.js +71 -0
  397. package/src/common/metrics/paint-metrics.js +6 -0
  398. package/src/common/serialize/bel-serializer.js +93 -0
  399. package/src/common/timing/nav-timing.js +70 -0
  400. package/src/common/timing/now.js +9 -0
  401. package/src/common/unload/eol.js +63 -0
  402. package/src/common/url/clean-url.js +10 -0
  403. package/src/common/url/encode.js +75 -0
  404. package/src/common/url/location.js +8 -0
  405. package/src/common/url/parse-url.js +71 -0
  406. package/src/common/url/protocol.js +19 -0
  407. package/src/common/util/console.js +11 -0
  408. package/src/common/util/data-size.js +21 -0
  409. package/src/common/util/feature-flags.js +38 -0
  410. package/src/common/util/get-or-set.js +34 -0
  411. package/src/common/util/global-scope.js +48 -0
  412. package/src/common/util/map-own.js +22 -0
  413. package/src/common/util/map-own.test.js +52 -0
  414. package/src/common/util/obfuscate.js +73 -0
  415. package/src/common/util/s-hash.js +14 -0
  416. package/src/common/util/single.js +18 -0
  417. package/src/common/util/stringify.js +42 -0
  418. package/src/common/util/submit-data.js +101 -0
  419. package/src/common/util/traverse.js +36 -0
  420. package/src/common/util/user-agent.js +56 -0
  421. package/src/common/window/load.js +15 -0
  422. package/src/common/window/nreum.js +110 -0
  423. package/src/common/window/page-visibility.js +24 -0
  424. package/src/common/window/session-storage.js +75 -0
  425. package/src/common/window/supports-performance-observer.js +10 -0
  426. package/src/common/wrap/index.js +18 -0
  427. package/src/common/wrap/wrap-console.js +47 -0
  428. package/src/common/wrap/wrap-events.js +106 -0
  429. package/src/common/wrap/wrap-fetch.js +109 -0
  430. package/src/common/wrap/wrap-function.js +248 -0
  431. package/src/common/wrap/wrap-history.js +48 -0
  432. package/src/common/wrap/wrap-jsonp.js +134 -0
  433. package/src/common/wrap/wrap-mutation.js +55 -0
  434. package/src/common/wrap/wrap-promise.js +165 -0
  435. package/src/common/wrap/wrap-raf.js +50 -0
  436. package/src/common/wrap/wrap-timer.js +67 -0
  437. package/src/common/wrap/wrap-xhr.js +213 -0
  438. package/src/features/ajax/aggregate/index.js +248 -0
  439. package/src/features/ajax/constants.js +3 -0
  440. package/src/features/ajax/index.js +1 -0
  441. package/src/features/ajax/instrument/distributed-tracing.js +166 -0
  442. package/src/features/ajax/instrument/index.js +380 -0
  443. package/src/features/ajax/instrument/response-size.js +18 -0
  444. package/src/features/jserrors/aggregate/canonical-function-name.js +14 -0
  445. package/src/features/jserrors/aggregate/canonical-function-name.test.js +13 -0
  446. package/src/features/jserrors/aggregate/compute-stack-trace.js +231 -0
  447. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +297 -0
  448. package/src/features/jserrors/aggregate/format-stack-trace.js +30 -0
  449. package/src/features/jserrors/aggregate/format-stack-trace.test.js +39 -0
  450. package/src/features/jserrors/aggregate/index.js +310 -0
  451. package/src/features/jserrors/aggregate/string-hash-code.js +17 -0
  452. package/src/features/jserrors/aggregate/string-hash-code.test.js +12 -0
  453. package/src/features/jserrors/constants.js +4 -0
  454. package/src/features/jserrors/index.js +1 -0
  455. package/src/features/jserrors/instrument/debug.js +36 -0
  456. package/src/features/jserrors/instrument/index.js +149 -0
  457. package/src/features/metrics/aggregate/index.js +134 -0
  458. package/src/features/metrics/constants.js +7 -0
  459. package/src/features/metrics/index.js +1 -0
  460. package/src/features/metrics/instrument/index.js +44 -0
  461. package/src/features/metrics/instrument/workers-helper.js +110 -0
  462. package/src/features/page_action/aggregate/index.js +113 -0
  463. package/src/features/page_action/constants.js +3 -0
  464. package/src/features/page_action/index.js +1 -0
  465. package/src/features/page_action/instrument/index.js +15 -0
  466. package/src/features/page_view_event/aggregate/index.js +134 -0
  467. package/src/features/page_view_event/aggregate/initialized-features.js +31 -0
  468. package/src/features/page_view_event/constants.js +6 -0
  469. package/src/features/page_view_event/index.js +1 -0
  470. package/src/features/page_view_event/instrument/index.js +33 -0
  471. package/src/features/page_view_timing/aggregate/index.js +246 -0
  472. package/src/features/page_view_timing/constants.js +3 -0
  473. package/src/features/page_view_timing/first-paint.js +41 -0
  474. package/src/features/page_view_timing/index.js +1 -0
  475. package/src/features/page_view_timing/instrument/index.js +30 -0
  476. package/src/features/page_view_timing/long-tasks.js +60 -0
  477. package/src/features/session_trace/aggregate/index.js +410 -0
  478. package/src/features/session_trace/constants.js +15 -0
  479. package/src/features/session_trace/index.js +1 -0
  480. package/src/features/session_trace/instrument/index.js +126 -0
  481. package/src/features/spa/aggregate/index.js +738 -0
  482. package/src/features/spa/aggregate/interaction-node.js +85 -0
  483. package/src/features/spa/aggregate/interaction-node.test.js +17 -0
  484. package/src/features/spa/aggregate/interaction.js +112 -0
  485. package/src/features/spa/aggregate/serializer.js +198 -0
  486. package/src/features/spa/constants.js +36 -0
  487. package/src/features/spa/index.js +1 -0
  488. package/src/features/spa/instrument/index.js +112 -0
  489. package/src/features/utils/aggregate-base.js +7 -0
  490. package/src/features/utils/feature-base.js +51 -0
  491. package/src/features/utils/handler-cache.js +60 -0
  492. package/src/features/utils/instrument-base.js +68 -0
  493. package/src/features/utils/lazy-loader.js +37 -0
  494. package/src/index.js +15 -0
  495. package/src/loaders/agent.js +80 -0
  496. package/src/loaders/api/api.js +175 -0
  497. package/src/loaders/api/apiAsync.js +92 -0
  498. package/src/loaders/browser-agent.js +33 -0
  499. package/src/loaders/configure/configure.js +39 -0
  500. package/src/loaders/features/enabled-features.js +16 -0
  501. package/src/loaders/features/featureDependencies.js +26 -0
  502. package/src/loaders/features/features.js +25 -0
  503. package/src/loaders/micro-agent.js +84 -0
  504. package/src/loaders/worker-agent.js +24 -0
  505. package/dist/cjs/common/util/reduce.js +0 -22
  506. package/dist/cjs/common/window/top-level-callers.js +0 -23
  507. package/dist/esm/common/util/reduce.js +0 -16
  508. package/dist/esm/common/window/top-level-callers.js +0 -17
  509. package/types.ts +0 -221
@@ -0,0 +1,171 @@
1
+ /*
2
+ * Copyright 2020 New Relic Corporation. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ import { SharedContext } from '../context/shared-context'
7
+ import { mapOwn } from '../util/map-own'
8
+
9
+ export class Aggregator extends SharedContext {
10
+ constructor (parent) {
11
+ super(parent)
12
+ this.aggregatedData = {}
13
+ }
14
+
15
+ // Items with the same type and name get aggregated together
16
+ // params are example data from the aggregated items
17
+ // metrics are the numeric values to be aggregated
18
+
19
+ store (type, name, params, newMetrics, customParams) {
20
+ var bucket = this.getBucket(type, name, params, customParams)
21
+ bucket.metrics = aggregateMetrics(newMetrics, bucket.metrics)
22
+ return bucket
23
+ }
24
+
25
+ merge (type, name, metrics, params, customParams) {
26
+ var bucket = this.getBucket(type, name, params, customParams)
27
+
28
+ if (!bucket.metrics) {
29
+ bucket.metrics = metrics
30
+ return
31
+ }
32
+
33
+ var oldMetrics = bucket.metrics
34
+ oldMetrics.count += metrics.count
35
+
36
+ // iterate through each new metric and merge
37
+ mapOwn(metrics, function (key, value) {
38
+ // count is a special case handled above
39
+ if (key === 'count') return
40
+
41
+ var oldMetric = oldMetrics[key]
42
+ var newMetric = metrics[key]
43
+
44
+ // handling the case where newMetric is a single-value first
45
+ if (newMetric && !newMetric.c) {
46
+ oldMetrics[key] = updateMetric(newMetric.t, oldMetric)
47
+ } else { // newMetric is a metric object
48
+ oldMetrics[key] = mergeMetric(newMetric, oldMetrics[key])
49
+ }
50
+ })
51
+ }
52
+
53
+ storeMetric (type, name, params, value) {
54
+ var bucket = this.getBucket(type, name, params)
55
+ bucket.stats = updateMetric(value, bucket.stats)
56
+ return bucket
57
+ }
58
+
59
+ getBucket (type, name, params, customParams) {
60
+ if (!this.aggregatedData[type]) this.aggregatedData[type] = {}
61
+ var bucket = this.aggregatedData[type][name]
62
+ if (!bucket) {
63
+ bucket = this.aggregatedData[type][name] = { params: params || {} }
64
+ if (customParams) {
65
+ bucket.custom = customParams
66
+ }
67
+ }
68
+ return bucket
69
+ }
70
+
71
+ get (type, name) {
72
+ // if name is passed, get a single bucket
73
+ if (name) return this.aggregatedData[type] && this.aggregatedData[type][name]
74
+ // else, get all buckets of that type
75
+ return this.aggregatedData[type]
76
+ }
77
+
78
+ // Like get, but for many types and it deletes the retrieved content from the aggregatedData
79
+ take (types) {
80
+ var results = {}
81
+ var type = ''
82
+ var hasData = false
83
+ for (var i = 0; i < types.length; i++) {
84
+ type = types[i]
85
+ results[type] = toArray(this.aggregatedData[type])
86
+ if (results[type].length) hasData = true
87
+ delete this.aggregatedData[type]
88
+ }
89
+ return hasData ? results : null
90
+ }
91
+ }
92
+
93
+ function aggregateMetrics (newMetrics, oldMetrics) {
94
+ if (!oldMetrics) oldMetrics = { count: 0 }
95
+ oldMetrics.count += 1
96
+ mapOwn(newMetrics, function (key, value) {
97
+ oldMetrics[key] = updateMetric(value, oldMetrics[key])
98
+ })
99
+ return oldMetrics
100
+ }
101
+
102
+ function updateMetric (value, metric) {
103
+ // when there is no value, then send only count
104
+ if (value == null) {
105
+ return updateCounterMetric(metric)
106
+ }
107
+
108
+ // When there is only one data point, the c (count), min, max, and sos (sum of squares) params are superfluous.
109
+ if (!metric) return { t: value }
110
+
111
+ // but on the second data point, we need to calculate the other values before aggregating in new values
112
+ if (!metric.c) {
113
+ metric = createMetricObject(metric.t)
114
+ }
115
+
116
+ // at this point, metric is always uncondensed
117
+ metric.c += 1
118
+ metric.t += value
119
+ metric.sos += value * value
120
+ if (value > metric.max) metric.max = value
121
+ if (value < metric.min) metric.min = value
122
+
123
+ return metric
124
+ }
125
+
126
+ function updateCounterMetric (metric) {
127
+ if (!metric) {
128
+ metric = { c: 1 }
129
+ } else {
130
+ metric.c++
131
+ }
132
+ return metric
133
+ }
134
+
135
+ function mergeMetric (newMetric, oldMetric) {
136
+ if (!oldMetric) return newMetric
137
+
138
+ if (!oldMetric.c) {
139
+ // oldMetric is a single-value
140
+ oldMetric = createMetricObject(oldMetric.t)
141
+ }
142
+
143
+ oldMetric.min = Math.min(newMetric.min, oldMetric.min)
144
+ oldMetric.max = Math.max(newMetric.max, oldMetric.max)
145
+ oldMetric.t += newMetric.t
146
+ oldMetric.sos += newMetric.sos
147
+ oldMetric.c += newMetric.c
148
+
149
+ return oldMetric
150
+ }
151
+
152
+ // take a value and create a metric object
153
+ function createMetricObject (value) {
154
+ return {
155
+ t: value,
156
+ min: value,
157
+ max: value,
158
+ sos: value * value,
159
+ c: 1
160
+ }
161
+ }
162
+
163
+ function toArray (obj) {
164
+ if (typeof obj !== 'object') return []
165
+
166
+ return mapOwn(obj, getValue)
167
+ }
168
+
169
+ function getValue (key, value) {
170
+ return value
171
+ }
@@ -0,0 +1,10 @@
1
+ /*
2
+ * Copyright 2020 New Relic Corporation. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ /* eslint-disable no-useless-escape */
7
+
8
+ export var ffVersion = 0
9
+ var match = navigator.userAgent.match(/Firefox[\/\s](\d+\.\d+)/)
10
+ if (match) ffVersion = +match[1]
@@ -0,0 +1,10 @@
1
+ export const isiOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent)
2
+
3
+ /* Feature detection to get our version(s). */
4
+
5
+ // Shared Web Workers introduced in iOS 16.0+ and n/a in 15.6-
6
+ export const iOS_below16 = isiOS && Boolean(typeof SharedWorker === 'undefined')
7
+ /* ^ It was discovered in Safari 14 (https://bugs.webkit.org/show_bug.cgi?id=225305) that the buffered flag in PerformanceObserver
8
+ did not work. This affects our onFCP metric in particular since web-vitals uses that flag to retrieve paint timing entries.
9
+ This was fixed in v16+.
10
+ */
@@ -0,0 +1,12 @@
1
+ import { getInfo, isValid, setInfo } from './state/info'
2
+ import { getConfiguration, getConfigurationValue, setConfiguration } from './state/init'
3
+ import { getLoaderConfig, setLoaderConfig } from './state/loader-config'
4
+ import { originals } from './state/originals'
5
+ import { getRuntime, setRuntime } from './state/runtime'
6
+
7
+ function isConfigured (agentIdentifier) {
8
+ return isValid(agentIdentifier)
9
+ }
10
+
11
+ // This module acts as a hub that bundles the static and dynamic properties used by each agent instance into one single interface
12
+ export { getInfo, setInfo, getConfiguration, getConfigurationValue, setConfiguration, getLoaderConfig, setLoaderConfig, originals, getRuntime, setRuntime, isConfigured }
@@ -0,0 +1,26 @@
1
+ import { getFrozenAttributes } from '../../../loaders/features/featureDependencies'
2
+ import { warn } from '../../util/console'
3
+
4
+ export class Configurable {
5
+ constructor (obj, model) {
6
+ try {
7
+ if (!obj || typeof obj !== 'object') return warn('New setting a Configurable requires an object as input')
8
+ if (!model || typeof model !== 'object') return warn('Setting a Configurable requires a model to set its initial properties')
9
+ Object.assign(this, model)
10
+ Object.entries(obj).forEach(([key, value]) => {
11
+ const frozenAttrs = getFrozenAttributes(key)
12
+ if (frozenAttrs.length && value && typeof value === 'object') {
13
+ frozenAttrs.forEach(attr => {
14
+ if (attr in value) {
15
+ warn(`"${attr}" is a protected attribute and can not be changed in feature ${key}. It will have no effect.`)
16
+ delete value[attr]
17
+ }
18
+ })
19
+ }
20
+ this[key] = value
21
+ })
22
+ } catch (err) {
23
+ warn('An error occured while setting a Configurable', err)
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,49 @@
1
+ import { defaults as nrDefaults, gosNREUMInitializedAgents } from '../../window/nreum'
2
+ import { Configurable } from './configurable'
3
+
4
+ const model = {
5
+ // preset defaults
6
+ beacon: nrDefaults.beacon,
7
+ errorBeacon: nrDefaults.errorBeacon,
8
+ // others must be populated by user
9
+ licenseKey: undefined,
10
+ applicationID: undefined,
11
+ sa: undefined,
12
+ queueTime: undefined,
13
+ applicationTime: undefined,
14
+ ttGuid: undefined,
15
+ user: undefined,
16
+ account: undefined,
17
+ product: undefined,
18
+ extra: undefined,
19
+ jsAttributes: {
20
+
21
+ },
22
+ userAttributes: undefined,
23
+ atts: undefined,
24
+ transactionName: undefined,
25
+ tNamePlain: undefined
26
+ }
27
+
28
+ const _cache = {}
29
+
30
+ export function isValid (id) {
31
+ try {
32
+ const info = getInfo(id)
33
+ return (!!info.licenseKey && !!info.errorBeacon && !!info.applicationID)
34
+ } catch (err) {
35
+ return false
36
+ }
37
+ }
38
+
39
+ export function getInfo (id) {
40
+ if (!id) throw new Error('All info objects require an agent identifier!')
41
+ if (!_cache[id]) throw new Error(`Info for ${id} was never set`)
42
+ return _cache[id]
43
+ }
44
+
45
+ export function setInfo (id, obj) {
46
+ if (!id) throw new Error('All info objects require an agent identifier!')
47
+ _cache[id] = new Configurable(obj, model)
48
+ gosNREUMInitializedAgents(id, _cache[id], 'info')
49
+ }
@@ -0,0 +1,56 @@
1
+
2
+ import { gosNREUMInitializedAgents } from '../../window/nreum'
3
+ import { Configurable } from './configurable'
4
+
5
+ const model = {
6
+ allow_bfcache: true, // *cli - temporary feature flag for BFCache work
7
+ privacy: { cookies_enabled: true }, // *cli - per discussion, default should be true
8
+ ajax: { deny_list: undefined, enabled: true, harvestTimeSeconds: 10 },
9
+ distributed_tracing: {
10
+ enabled: undefined,
11
+ exclude_newrelic_header: undefined,
12
+ cors_use_newrelic_header: undefined,
13
+ cors_use_tracecontext_headers: undefined,
14
+ allowed_origins: undefined
15
+ },
16
+ ssl: undefined,
17
+ obfuscate: undefined,
18
+ jserrors: { enabled: true, harvestTimeSeconds: 10 },
19
+ metrics: { enabled: true },
20
+ page_action: { enabled: true, harvestTimeSeconds: 30 },
21
+ page_view_event: { enabled: true },
22
+ page_view_timing: { enabled: true, harvestTimeSeconds: 30, long_task: false },
23
+ session_trace: { enabled: true, harvestTimeSeconds: 10 },
24
+ spa: { enabled: true, harvestTimeSeconds: 10 }
25
+ }
26
+
27
+ const _cache = {}
28
+
29
+ export function getConfiguration (id) {
30
+ if (!id) throw new Error('All configuration objects require an agent identifier!')
31
+ if (!_cache[id]) throw new Error(`Configuration for ${id} was never set`)
32
+ return _cache[id]
33
+ }
34
+
35
+ export function setConfiguration (id, obj) {
36
+ if (!id) throw new Error('All configuration objects require an agent identifier!')
37
+ _cache[id] = new Configurable(obj, model)
38
+ gosNREUMInitializedAgents(id, _cache[id], 'config')
39
+ }
40
+
41
+ export function getConfigurationValue (id, path) {
42
+ if (!id) throw new Error('All configuration objects require an agent identifier!')
43
+ var val = getConfiguration(id)
44
+ if (val) {
45
+ var parts = path.split('.')
46
+ for (var i = 0; i < parts.length - 1; i++) {
47
+ val = val[parts[i]]
48
+ if (typeof val !== 'object') return
49
+ }
50
+ val = val[parts[parts.length - 1]]
51
+ }
52
+ return val
53
+ }
54
+
55
+ // TO DO: a setConfigurationValue equivalent may be nice so individual
56
+ // properties can be tuned instead of reseting the whole model per call to `setConfiguration(agentIdentifier, {})`
@@ -0,0 +1,25 @@
1
+ import { gosNREUMInitializedAgents } from '../../window/nreum'
2
+ import { Configurable } from './configurable'
3
+
4
+ const model = {
5
+ accountID: undefined,
6
+ trustKey: undefined,
7
+ agentID: undefined,
8
+ licenseKey: undefined,
9
+ applicationID: undefined,
10
+ xpid: undefined
11
+ }
12
+
13
+ const _cache = {}
14
+
15
+ export function getLoaderConfig (id) {
16
+ if (!id) throw new Error('All loader-config objects require an agent identifier!')
17
+ if (!_cache[id]) throw new Error(`LoaderConfig for ${id} was never set`)
18
+ return _cache[id]
19
+ }
20
+
21
+ export function setLoaderConfig (id, obj) {
22
+ if (!id) throw new Error('All loader-config objects require an agent identifier!')
23
+ _cache[id] = new Configurable(obj, model)
24
+ gosNREUMInitializedAgents(id, _cache[id], 'loader_config')
25
+ }
@@ -0,0 +1,3 @@
1
+ import { gosNREUMOriginals } from '../../window/nreum'
2
+
3
+ export const originals = gosNREUMOriginals().o
@@ -0,0 +1,45 @@
1
+ import * as userAgent from '../../util/user-agent'
2
+ import { Configurable } from './configurable'
3
+ import { gosNREUMInitializedAgents } from '../../window/nreum'
4
+ import { getCurrentSessionIdOrMakeNew } from '../../window/session-storage'
5
+ import { getConfigurationValue } from '../config'
6
+ import { globalScope } from '../../util/global-scope'
7
+ import { BUILD_ENV, DIST_METHOD, VERSION } from '../../constants/environment-variables'
8
+
9
+ const model = agentId => { return {
10
+ buildEnv: BUILD_ENV,
11
+ bytesSent: {},
12
+ customTransaction: undefined,
13
+ disabled: false,
14
+ distMethod: DIST_METHOD,
15
+ isolatedBacklog: false,
16
+ loaderType: undefined,
17
+ maxBytes: 30000,
18
+ // The "timeOrigin" property is the new standard timestamp property shared across main frame and workers, but is not supported in some early Safari browsers (safari<15) + IE
19
+ // ingest expects an integer value, and timeOrigin can return a float.
20
+ offset: Math.floor(globalScope?.performance?.timeOrigin || globalScope?.performance?.timing?.navigationStart || Date.now()),
21
+ onerror: undefined,
22
+ origin: '' + globalScope.location,
23
+ ptid: undefined,
24
+ releaseIds: {},
25
+ sessionId: getConfigurationValue(agentId, 'privacy.cookies_enabled') == true
26
+ ? getCurrentSessionIdOrMakeNew()
27
+ : null, // if cookies (now session tracking) is turned off or can't get session ID, this is null
28
+ xhrWrappable: typeof globalScope.XMLHttpRequest?.prototype?.addEventListener === 'function',
29
+ userAgent,
30
+ version: VERSION
31
+ } }
32
+
33
+ const _cache = {}
34
+
35
+ export function getRuntime (id) {
36
+ if (!id) throw new Error('All runtime objects require an agent identifier!')
37
+ if (!_cache[id]) throw new Error(`Runtime for ${id} was never set`)
38
+ return _cache[id]
39
+ }
40
+
41
+ export function setRuntime (id, obj) {
42
+ if (!id) throw new Error('All runtime objects require an agent identifier!')
43
+ _cache[id] = new Configurable(obj, model(id))
44
+ gosNREUMInitializedAgents(id, _cache[id], 'runtime')
45
+ }
@@ -0,0 +1,11 @@
1
+ // Webpack and NPM builds define `process.env.BUILD_VERSION` at build time based on variables supplied at build time.
2
+ // VERSION as defined here ends up decorating: agent runtime configuration, harvest, and supportability metrics.
3
+ export const VERSION = typeof process.env.BUILD_VERSION !== 'undefined' && process.env.BUILD_VERSION || ''
4
+
5
+ // process.env.BUILD_ENV is replaced during webpack -or- npm build with environment vars supplied at build time
6
+ // LOCAL, PROD, DEV, etc
7
+ export const BUILD_ENV = typeof process.env.BUILD_ENV !== 'undefined' && process.env.BUILD_ENV || ''
8
+
9
+ // process.env.DIST_METHOD is replaced during webpack -or- npm build with environment vars supplied at build time
10
+ // CDN, NPM etc
11
+ export const DIST_METHOD = typeof process.env.DIST_METHOD !== 'undefined' && process.env.DIST_METHOD || ''
@@ -0,0 +1,21 @@
1
+
2
+ import { warn } from '../util/console'
3
+
4
+ const model = {
5
+ agentIdentifier: ''
6
+ }
7
+
8
+ export class SharedContext {
9
+ constructor (context) {
10
+ try {
11
+ if (typeof context !== 'object') return warn('shared context requires an object as input')
12
+ this.sharedContext = {}
13
+ Object.assign(this.sharedContext, model)
14
+ Object.entries(context).forEach(([key, value]) => {
15
+ if (Object.keys(model).includes(key)) this.sharedContext[key] = value
16
+ })
17
+ } catch (err) {
18
+ warn('An error occured while setting SharedContext', err)
19
+ }
20
+ }
21
+ }
@@ -0,0 +1,116 @@
1
+ /** An array of filter objects {hostname, pathname} for identifying XHR events to be excluded from collection.
2
+ * @see {@link https://docs.newrelic.com/docs/browser/new-relic-browser/configuration/filter-ajax-request-events/ Filter AjaxRequest events}
3
+ * @type {Array.<{hostname: string, pathname: string}>}
4
+ */
5
+ var denyList = []
6
+
7
+ /**
8
+ * Evaluates whether an XHR event should be included for collection based on the {@link denyList|AjaxRequest deny list}.
9
+ * @param {Object} params - object with properties of the XHR event
10
+ * @returns {boolean} `true` if request does not match any entries of {@link denyList|deny list}; else `false`
11
+ */
12
+ export function shouldCollectEvent (params) {
13
+ if (denyList.length === 0) {
14
+ return true
15
+ }
16
+
17
+ // XHR requests with an undefined hostname (e.g., data URLs) should not be collected.
18
+ if (params.hostname === undefined) {
19
+ return false
20
+ }
21
+
22
+ for (var i = 0; i < denyList.length; i++) {
23
+ var parsed = denyList[i]
24
+
25
+ if (parsed.hostname === '*') {
26
+ return false
27
+ }
28
+
29
+ if (domainMatchesPattern(parsed.hostname, params.hostname) &&
30
+ comparePath(parsed.pathname, params.pathname)) {
31
+ return false
32
+ }
33
+ }
34
+
35
+ return true
36
+ }
37
+
38
+ /**
39
+ * Initializes the {@link denyList|XHR deny list} by extracting hostname and pathname from an array of filter strings.
40
+ * @param {string[]} denyListConfig - array of URL filters to identify XHR requests to be excluded from collection
41
+ */
42
+ export function setDenyList (denyListConfig) {
43
+ denyList = []
44
+
45
+ if (!denyListConfig || !denyListConfig.length) {
46
+ return
47
+ }
48
+
49
+ for (var i = 0; i < denyListConfig.length; i++) {
50
+ var url = denyListConfig[i]
51
+
52
+ if (url.indexOf('http://') === 0) {
53
+ url = url.substring(7)
54
+ } else if (url.indexOf('https://') === 0) {
55
+ url = url.substring(8)
56
+ }
57
+
58
+ var firstSlash = url.indexOf('/')
59
+
60
+ if (firstSlash > 0) {
61
+ denyList.push({
62
+ hostname: url.substring(0, firstSlash),
63
+ pathname: url.substring(firstSlash)
64
+ })
65
+ } else {
66
+ denyList.push({
67
+ hostname: url,
68
+ pathname: ''
69
+ })
70
+ }
71
+ }
72
+ }
73
+ /**
74
+ * Returns true if the right side of `domain` (end of string) matches `pattern`.
75
+ * @param {string} pattern - a string to be matched against the end of `domain` string
76
+ * @param {string} domain - a domain string with no protocol or path (e.g., app1.example.com)
77
+ * @returns {boolean} `true` if domain matches pattern; else `false`
78
+ */
79
+ function domainMatchesPattern (pattern, domain) {
80
+ if (pattern.length > domain.length) {
81
+ return false
82
+ }
83
+
84
+ if (domain.indexOf(pattern) === (domain.length - pattern.length)) {
85
+ return true
86
+ }
87
+
88
+ return false
89
+ }
90
+
91
+ /**
92
+ * Returns true if a URL path matches a pattern string, disregarding leading slashes.
93
+ * @param {string} pattern - a string to compare with path (e.g., api/v1)
94
+ * @param {string} path - a string representing a URL path (e.g., /api/v1)
95
+ * @returns {boolean} `true` if path and pattern are an exact string match (except for leading slashes); else `false`
96
+ */
97
+ function comparePath (pattern, path) {
98
+ if (pattern.indexOf('/') === 0) {
99
+ pattern = pattern.substring(1)
100
+ }
101
+
102
+ if (path.indexOf('/') === 0) {
103
+ path = path.substring(1)
104
+ }
105
+
106
+ // No path in pattern means match all paths.
107
+ if (pattern === '') {
108
+ return true
109
+ }
110
+
111
+ if (pattern === path) {
112
+ return true
113
+ }
114
+
115
+ return false
116
+ }
@@ -0,0 +1,119 @@
1
+ /*
2
+ * Copyright 2020 New Relic Corporation. All rights reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ import { ee } from '../event-emitter/contextual-ee'
7
+ import { mapOwn } from '../util/map-own'
8
+ import { registerHandler as defaultRegister } from '../event-emitter/register-handler'
9
+ import { featurePriority } from '../../loaders/features/features'
10
+
11
+ const registry = {}
12
+
13
+ /**
14
+ * Adds an entry to the centralized drain registry specifying that a particular agent has events of a particular named
15
+ * event-group "bucket" that should be drained at the time the agent drains all its buffered events. Buffered events
16
+ * accumulate because instrumentation begins as soon as possible, before the agent has finished lazy-loading the code
17
+ * responsible for aggregating and reporting captured data.
18
+ * @param {string} agentIdentifier - A 16 character string uniquely identifying the agent.
19
+ * @param {string} group - The named "bucket" for the events this feature will be bucketing for later collection.
20
+ */
21
+ export function registerDrain (agentIdentifier, group) {
22
+ // Here `item` captures the registered properties of a feature-group: whether it is ready for its buffered events
23
+ // to be drained (`staged`) and the `priority` order in which it should be drained relative to other feature groups.
24
+ const item = { staged: false, priority: featurePriority[group] || 0 }
25
+ curateRegistry(agentIdentifier)
26
+ if (!registry[agentIdentifier].get(group)) registry[agentIdentifier].set(group, item)
27
+ }
28
+
29
+ /**
30
+ * Registers the specified agent with the centralized event buffer registry if it is not already registered.
31
+ * Agents without an identifier (as in the case of some tests) will be excluded from the registry.
32
+ * @param {string} agentIdentifier - A 16 character string uniquely identifying an agent.
33
+ */
34
+ function curateRegistry (agentIdentifier) {
35
+ if (!agentIdentifier) return
36
+ if (!registry[agentIdentifier]) registry[agentIdentifier] = new Map()
37
+ }
38
+
39
+ /**
40
+ * Drain buffered events out of the event emitter. Each feature should have its events bucketed by "group" and drain
41
+ * its own named group explicitly, when ready.
42
+ * @param {string} agentIdentifier - A unique 16 character ID corresponding to an instantiated agent.
43
+ * @param {string} featureName - A named group into which the feature's buffered events are bucketed.
44
+ */
45
+ export function drain (agentIdentifier = '', featureName = 'feature') {
46
+ curateRegistry(agentIdentifier)
47
+
48
+ // If the feature for the specified agent is not in the registry, that means the instrument file was bypassed.
49
+ // This could happen in tests, or loaders that directly import the aggregator. In these cases it is safe to
50
+ // drain the feature group immediately rather than waiting to drain all at once.
51
+ if (!agentIdentifier || !registry[agentIdentifier].get(featureName)) return drainGroup(featureName)
52
+
53
+ // When `drain` is called, this feature is ready to drain (staged).
54
+ registry[agentIdentifier].get(featureName).staged = true
55
+
56
+ // Only when the event-groups for all features are ready to drain (staged) do we execute the drain. This has the effect
57
+ // that the last feature to call drain triggers drain for all features.
58
+ const items = Array.from(registry[agentIdentifier])
59
+ if (items.every(([key, values]) => values.staged)) {
60
+ items.sort((a, b) => a[1].priority - b[1].priority)
61
+ items.forEach(([group]) => {
62
+ drainGroup(group)
63
+ })
64
+ }
65
+
66
+ /**
67
+ * Drains all the buffered (backlog) events for a particular feature's event-group by emitting each event to each of
68
+ * the subscribed handlers for the group.
69
+ * @param {*} group - The name of a particular feature's event "bucket".
70
+ */
71
+ function drainGroup (group) {
72
+ const baseEE = agentIdentifier ? ee.get(agentIdentifier) : ee
73
+ const handlers = defaultRegister.handlers
74
+ if (!baseEE.backlog || !handlers) return
75
+
76
+ var bufferedEventsInGroup = baseEE.backlog[group]
77
+ var groupHandlers = handlers[group]
78
+ if (groupHandlers) {
79
+ // We don't cache the length of the buffer while looping because events might still be added while processing.
80
+ for (var i = 0; bufferedEventsInGroup && i < bufferedEventsInGroup.length; ++i) { // eslint-disable-line no-unmodified-loop-condition
81
+ emitEvent(bufferedEventsInGroup[i], groupHandlers)
82
+ }
83
+
84
+ mapOwn(groupHandlers, function (eventType, handlerRegistrationList) {
85
+ mapOwn(handlerRegistrationList, function (i, registration) {
86
+ // registration is an array of: [targetEE, eventHandler]
87
+ registration[0].on(eventType, registration[1])
88
+ })
89
+ })
90
+ }
91
+
92
+ delete handlers[group]
93
+
94
+ // Keep the feature's event-group as a property of the event emitter so we know it was already created and drained.
95
+ baseEE.backlog[group] = null
96
+ baseEE.emit('drain-' + group, [])
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Processes the specified event using all relevant handler functions associated with a particular feature, based on
102
+ * whether the the handler is meant to apply to events of this type. (Event type is a descriptive string set at the
103
+ * time an event is originally created by instrumentation, as with calls to the `handle` method.)
104
+ * @param {*} evt - A single event to be emitted to (processed by) eligible handler functions.
105
+ * @param {*} groupHandlers - A set of handler functions associated with a particular feature's event-group.
106
+ */
107
+ function emitEvent (evt, groupHandlers) {
108
+ var type = evt[1]
109
+ mapOwn(groupHandlers[type], function (i, registration) {
110
+ var sourceEE = evt[0]
111
+ var ee = registration[0]
112
+ if (ee === sourceEE) {
113
+ var handler = registration[1]
114
+ var ctx = evt[3]
115
+ var args = evt[2]
116
+ handler.apply(ctx, args)
117
+ }
118
+ })
119
+ }