@newrelic/browser-agent 1.235.0 → 1.236.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/README.md +41 -1
  2. package/dist/cjs/common/config/state/init.js +3 -0
  3. package/dist/cjs/common/config/state/runtime.js +4 -4
  4. package/dist/cjs/common/constants/env.cdn.js +2 -2
  5. package/dist/cjs/common/constants/env.npm.js +1 -1
  6. package/dist/cjs/common/constants/runtime.js +52 -0
  7. package/dist/cjs/common/event-listener/event-listener-opts.js +3 -3
  8. package/dist/cjs/common/harvest/harvest-scheduler.js +22 -19
  9. package/dist/cjs/common/harvest/harvest.js +163 -144
  10. package/dist/cjs/common/harvest/types.js +54 -0
  11. package/dist/cjs/common/ids/id.js +2 -2
  12. package/dist/cjs/common/ids/unique-id.js +3 -3
  13. package/dist/cjs/common/session/session-entity.js +2 -2
  14. package/dist/cjs/common/timer/interaction-timer.js +2 -2
  15. package/dist/cjs/common/unload/eol.js +10 -11
  16. package/dist/cjs/common/url/canonicalize-url.js +2 -2
  17. package/dist/cjs/common/url/parse-url.js +3 -3
  18. package/dist/cjs/common/url/protocol.js +2 -2
  19. package/dist/cjs/common/util/submit-data.js +58 -76
  20. package/dist/cjs/common/window/nreum.js +14 -14
  21. package/dist/cjs/common/wrap/wrap-events.js +3 -3
  22. package/dist/cjs/common/wrap/wrap-fetch.js +5 -5
  23. package/dist/cjs/common/wrap/wrap-history.js +2 -2
  24. package/dist/cjs/common/wrap/wrap-jsonp.js +2 -2
  25. package/dist/cjs/common/wrap/wrap-mutation.js +2 -2
  26. package/dist/cjs/common/wrap/wrap-promise.js +2 -2
  27. package/dist/cjs/common/wrap/wrap-raf.js +2 -2
  28. package/dist/cjs/common/wrap/wrap-timer.js +4 -4
  29. package/dist/cjs/common/wrap/wrap-xhr.js +3 -3
  30. package/dist/cjs/features/ajax/aggregate/index.js +1 -1
  31. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +2 -2
  32. package/dist/cjs/features/ajax/instrument/index.js +6 -7
  33. package/dist/cjs/features/jserrors/aggregate/index.js +7 -4
  34. package/dist/cjs/features/jserrors/instrument/index.js +4 -4
  35. package/dist/cjs/features/metrics/aggregate/framework-detection.js +2 -2
  36. package/dist/cjs/features/metrics/aggregate/index.js +3 -3
  37. package/dist/cjs/features/page_action/aggregate/index.js +3 -3
  38. package/dist/cjs/features/page_view_event/aggregate/index.js +10 -11
  39. package/dist/cjs/features/page_view_event/instrument/index.js +2 -2
  40. package/dist/cjs/features/page_view_timing/aggregate/index.js +3 -5
  41. package/dist/cjs/features/page_view_timing/instrument/index.js +2 -2
  42. package/dist/cjs/features/session_replay/replay-mode.js +2 -2
  43. package/dist/cjs/features/session_trace/instrument/index.js +2 -2
  44. package/dist/cjs/features/spa/aggregate/index.js +1 -1
  45. package/dist/cjs/features/spa/instrument/index.js +2 -2
  46. package/dist/cjs/features/utils/instrument-base.js +6 -7
  47. package/dist/cjs/index.js +7 -0
  48. package/dist/cjs/loaders/agent.js +7 -0
  49. package/dist/cjs/loaders/api/api.js +2 -2
  50. package/dist/cjs/loaders/api/apiAsync.js +6 -4
  51. package/dist/cjs/loaders/configure/configure.js +2 -2
  52. package/dist/cjs/loaders/micro-agent.js +29 -38
  53. package/dist/esm/common/config/state/init.js +3 -0
  54. package/dist/esm/common/config/state/runtime.js +1 -1
  55. package/dist/esm/common/constants/env.cdn.js +2 -2
  56. package/dist/esm/common/constants/env.npm.js +1 -1
  57. package/dist/esm/common/constants/runtime.js +38 -0
  58. package/dist/esm/common/event-listener/event-listener-opts.js +1 -1
  59. package/dist/esm/common/harvest/harvest-scheduler.js +21 -20
  60. package/dist/esm/common/harvest/harvest.js +160 -142
  61. package/dist/esm/common/harvest/types.js +47 -0
  62. package/dist/esm/common/ids/id.js +1 -1
  63. package/dist/esm/common/ids/unique-id.js +1 -1
  64. package/dist/esm/common/session/session-entity.js +1 -1
  65. package/dist/esm/common/timer/interaction-timer.js +1 -1
  66. package/dist/esm/common/unload/eol.js +1 -2
  67. package/dist/esm/common/url/canonicalize-url.js +1 -1
  68. package/dist/esm/common/url/parse-url.js +1 -1
  69. package/dist/esm/common/url/protocol.js +1 -1
  70. package/dist/esm/common/util/submit-data.js +55 -73
  71. package/dist/esm/common/window/nreum.js +1 -1
  72. package/dist/esm/common/wrap/wrap-events.js +1 -1
  73. package/dist/esm/common/wrap/wrap-fetch.js +1 -1
  74. package/dist/esm/common/wrap/wrap-history.js +1 -1
  75. package/dist/esm/common/wrap/wrap-jsonp.js +1 -1
  76. package/dist/esm/common/wrap/wrap-mutation.js +1 -1
  77. package/dist/esm/common/wrap/wrap-promise.js +1 -1
  78. package/dist/esm/common/wrap/wrap-raf.js +1 -1
  79. package/dist/esm/common/wrap/wrap-timer.js +1 -1
  80. package/dist/esm/common/wrap/wrap-xhr.js +1 -1
  81. package/dist/esm/features/ajax/aggregate/index.js +1 -1
  82. package/dist/esm/features/ajax/instrument/distributed-tracing.js +1 -1
  83. package/dist/esm/features/ajax/instrument/index.js +1 -2
  84. package/dist/esm/features/jserrors/aggregate/index.js +6 -3
  85. package/dist/esm/features/jserrors/instrument/index.js +1 -1
  86. package/dist/esm/features/metrics/aggregate/framework-detection.js +1 -1
  87. package/dist/esm/features/metrics/aggregate/index.js +1 -1
  88. package/dist/esm/features/page_action/aggregate/index.js +1 -1
  89. package/dist/esm/features/page_view_event/aggregate/index.js +1 -2
  90. package/dist/esm/features/page_view_event/instrument/index.js +1 -1
  91. package/dist/esm/features/page_view_timing/aggregate/index.js +2 -4
  92. package/dist/esm/features/page_view_timing/instrument/index.js +1 -1
  93. package/dist/esm/features/session_replay/replay-mode.js +2 -2
  94. package/dist/esm/features/session_trace/instrument/index.js +1 -1
  95. package/dist/esm/features/spa/aggregate/index.js +1 -1
  96. package/dist/esm/features/spa/instrument/index.js +1 -1
  97. package/dist/esm/features/utils/instrument-base.js +4 -5
  98. package/dist/esm/index.js +1 -4
  99. package/dist/esm/loaders/agent.js +7 -0
  100. package/dist/esm/loaders/api/api.js +1 -1
  101. package/dist/esm/loaders/api/apiAsync.js +3 -3
  102. package/dist/esm/loaders/configure/configure.js +1 -1
  103. package/dist/esm/loaders/micro-agent.js +29 -38
  104. package/dist/types/common/config/state/init.d.ts.map +1 -1
  105. package/dist/types/common/constants/runtime.d.ts +29 -0
  106. package/dist/types/common/constants/runtime.d.ts.map +1 -0
  107. package/dist/types/common/harvest/harvest-scheduler.d.ts +1 -1
  108. package/dist/types/common/harvest/harvest-scheduler.d.ts.map +1 -1
  109. package/dist/types/common/harvest/harvest.d.ts +49 -38
  110. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  111. package/dist/types/common/harvest/types.d.ts +100 -0
  112. package/dist/types/common/harvest/types.d.ts.map +1 -0
  113. package/dist/types/common/unload/eol.d.ts.map +1 -1
  114. package/dist/types/common/util/submit-data.d.ts +62 -64
  115. package/dist/types/common/util/submit-data.d.ts.map +1 -1
  116. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
  117. package/dist/types/features/jserrors/aggregate/index.d.ts +1 -1
  118. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  119. package/dist/types/features/jserrors/instrument/index.d.ts +1 -1
  120. package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -1
  121. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  122. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  123. package/dist/types/index.d.ts +1 -0
  124. package/dist/types/loaders/agent.d.ts +4 -4
  125. package/dist/types/loaders/agent.d.ts.map +1 -1
  126. package/dist/types/loaders/micro-agent.d.ts +3 -4
  127. package/dist/types/loaders/micro-agent.d.ts.map +1 -1
  128. package/package.json +6 -1
  129. package/src/common/config/__mocks__/config.js +11 -0
  130. package/src/common/config/state/init.js +1 -0
  131. package/src/common/config/state/runtime.js +1 -1
  132. package/src/common/constants/__mocks__/env.js +3 -0
  133. package/src/common/constants/__mocks__/runtime.js +8 -0
  134. package/src/common/constants/env.cdn.test.js +7 -0
  135. package/src/common/constants/env.npm.test.js +7 -0
  136. package/src/common/constants/env.test.js +7 -0
  137. package/src/common/constants/runtime.js +71 -0
  138. package/src/common/constants/runtime.test.js +168 -0
  139. package/src/common/context/__mocks__/shared-context.js +8 -0
  140. package/src/common/event-listener/__mocks__/event-listener-opts.js +7 -0
  141. package/src/common/event-listener/event-listener-opts.js +1 -1
  142. package/src/common/harvest/__mocks__/harvest.js +13 -0
  143. package/src/common/harvest/harvest-scheduler.js +21 -20
  144. package/src/common/harvest/harvest-scheduler.test.js +496 -0
  145. package/src/common/harvest/harvest.js +147 -130
  146. package/src/common/harvest/harvest.test.js +818 -0
  147. package/src/common/harvest/types.js +47 -0
  148. package/src/common/ids/id.js +1 -1
  149. package/src/common/ids/unique-id.js +1 -1
  150. package/src/common/session/__mocks__/session-entity.js +25 -0
  151. package/src/common/session/session-entity.component-test.js +1 -1
  152. package/src/common/session/session-entity.js +1 -1
  153. package/src/common/timer/interaction-timer.js +1 -1
  154. package/src/common/timing/__mocks__/now.js +1 -0
  155. package/src/common/unload/__mocks__/eol.js +1 -0
  156. package/src/common/unload/eol.js +1 -2
  157. package/src/common/url/__mocks__/clean-url.js +1 -0
  158. package/src/common/url/__mocks__/encode.js +7 -0
  159. package/src/common/url/__mocks__/location.js +1 -0
  160. package/src/common/url/canonicalize-url.js +1 -1
  161. package/src/common/url/canonicalize-url.test.js +2 -2
  162. package/src/common/url/parse-url.js +1 -1
  163. package/src/common/url/parse-url.test.js +3 -3
  164. package/src/common/url/protocol.js +1 -1
  165. package/src/common/util/__mocks__/obfuscate.js +10 -0
  166. package/src/common/util/__mocks__/stringify.js +1 -0
  167. package/src/common/util/__mocks__/submit-data.js +6 -0
  168. package/src/common/util/__mocks__/traverse.js +1 -0
  169. package/src/common/util/submit-data.js +39 -53
  170. package/src/common/util/submit-data.test.js +81 -68
  171. package/src/common/window/nreum.js +1 -1
  172. package/src/common/wrap/wrap-events.js +1 -1
  173. package/src/common/wrap/wrap-fetch.js +1 -1
  174. package/src/common/wrap/wrap-history.js +1 -1
  175. package/src/common/wrap/wrap-jsonp.js +1 -1
  176. package/src/common/wrap/wrap-mutation.js +1 -1
  177. package/src/common/wrap/wrap-promise.js +1 -1
  178. package/src/common/wrap/wrap-promise.test.js +2 -2
  179. package/src/common/wrap/wrap-raf.js +1 -1
  180. package/src/common/wrap/wrap-timer.js +1 -1
  181. package/src/common/wrap/wrap-xhr.js +1 -1
  182. package/src/features/ajax/aggregate/index.js +1 -1
  183. package/src/features/ajax/instrument/distributed-tracing.js +1 -1
  184. package/src/features/ajax/instrument/index.js +1 -2
  185. package/src/features/jserrors/aggregate/compute-stack-trace.test.js +1 -1
  186. package/src/features/jserrors/aggregate/index.js +7 -3
  187. package/src/features/jserrors/instrument/index.js +1 -1
  188. package/src/features/metrics/aggregate/framework-detection.js +1 -1
  189. package/src/features/metrics/aggregate/framework-detection.test.js +2 -2
  190. package/src/features/metrics/aggregate/index.js +1 -1
  191. package/src/features/page_action/aggregate/index.js +1 -1
  192. package/src/features/page_view_event/aggregate/index.js +1 -2
  193. package/src/features/page_view_event/instrument/index.js +1 -1
  194. package/src/features/page_view_timing/aggregate/index.js +2 -4
  195. package/src/features/page_view_timing/instrument/index.js +1 -1
  196. package/src/features/session_replay/replay-mode.js +2 -2
  197. package/src/features/session_trace/instrument/index.js +1 -1
  198. package/src/features/spa/aggregate/index.js +1 -1
  199. package/src/features/spa/instrument/index.js +1 -1
  200. package/src/features/utils/agent-session.test.js +2 -2
  201. package/src/features/utils/instrument-base.js +5 -5
  202. package/src/features/utils/instrument-base.test.js +22 -3
  203. package/src/index.js +1 -3
  204. package/src/loaders/agent.js +8 -0
  205. package/src/loaders/api/api.js +1 -1
  206. package/src/loaders/api/apiAsync.js +3 -3
  207. package/src/loaders/configure/configure.js +1 -1
  208. package/src/loaders/micro-agent.js +26 -30
  209. package/dist/cjs/common/browser-version/firefox-version.js +0 -17
  210. package/dist/cjs/common/browser-version/ios-version.js +0 -19
  211. package/dist/cjs/common/event-emitter/contextual-ee.test.js +0 -282
  212. package/dist/cjs/common/event-emitter/handle.test.js +0 -58
  213. package/dist/cjs/common/event-emitter/register-handler.test.js +0 -55
  214. package/dist/cjs/common/harvest/harvest-scheduler.component-test.js +0 -39
  215. package/dist/cjs/common/harvest/harvest.component-test.js +0 -224
  216. package/dist/cjs/common/ids/id.test.js +0 -85
  217. package/dist/cjs/common/ids/unique-id.test.js +0 -49
  218. package/dist/cjs/common/session/session-entity.component-test.js +0 -497
  219. package/dist/cjs/common/storage/local-storage.test.js +0 -14
  220. package/dist/cjs/common/timer/interaction-timer.component-test.js +0 -216
  221. package/dist/cjs/common/timer/timer.test.js +0 -105
  222. package/dist/cjs/common/timing/nav-timing.test.js +0 -192
  223. package/dist/cjs/common/url/canonicalize-url.test.js +0 -38
  224. package/dist/cjs/common/url/clean-url.test.js +0 -9
  225. package/dist/cjs/common/url/encode.component-test.js +0 -74
  226. package/dist/cjs/common/url/location.test.js +0 -13
  227. package/dist/cjs/common/url/parse-url.test.js +0 -111
  228. package/dist/cjs/common/url/protocol.component-test.js +0 -15
  229. package/dist/cjs/common/util/console.test.js +0 -30
  230. package/dist/cjs/common/util/data-size.test.js +0 -64
  231. package/dist/cjs/common/util/feature-flags.test.js +0 -84
  232. package/dist/cjs/common/util/get-or-set.test.js +0 -47
  233. package/dist/cjs/common/util/global-scope.js +0 -27
  234. package/dist/cjs/common/util/global-scope.test.js +0 -72
  235. package/dist/cjs/common/util/invoke.test.js +0 -49
  236. package/dist/cjs/common/util/map-own.test.js +0 -49
  237. package/dist/cjs/common/util/obfuscate.component-test.js +0 -129
  238. package/dist/cjs/common/util/stringify.test.js +0 -48
  239. package/dist/cjs/common/util/submit-data.test.js +0 -245
  240. package/dist/cjs/common/util/traverse.test.js +0 -44
  241. package/dist/cjs/common/wrap/wrap-promise.test.js +0 -119
  242. package/dist/cjs/features/jserrors/aggregate/canonical-function-name.test.js +0 -31
  243. package/dist/cjs/features/jserrors/aggregate/compute-stack-trace.test.js +0 -383
  244. package/dist/cjs/features/jserrors/aggregate/format-stack-trace.test.js +0 -40
  245. package/dist/cjs/features/jserrors/aggregate/string-hash-code.test.js +0 -27
  246. package/dist/cjs/features/metrics/aggregate/framework-detection.test.js +0 -137
  247. package/dist/cjs/features/metrics/aggregate/polyfill-detection.es5.test.js +0 -17
  248. package/dist/cjs/features/metrics/aggregate/polyfill-detection.test.js +0 -165
  249. package/dist/cjs/features/session_replay/aggregate/index.component-test.js +0 -457
  250. package/dist/cjs/features/spa/aggregate/interaction-node.test.js +0 -16
  251. package/dist/cjs/features/utils/agent-session.test.js +0 -211
  252. package/dist/cjs/features/utils/aggregate-base.test.js +0 -110
  253. package/dist/cjs/features/utils/feature-base.test.js +0 -42
  254. package/dist/cjs/features/utils/handler-cache.test.js +0 -53
  255. package/dist/cjs/features/utils/instrument-base.test.js +0 -179
  256. package/dist/cjs/features/utils/lazy-feature-loader.test.js +0 -30
  257. package/dist/esm/common/browser-version/firefox-version.js +0 -10
  258. package/dist/esm/common/browser-version/ios-version.js +0 -11
  259. package/dist/esm/common/event-emitter/contextual-ee.test.js +0 -278
  260. package/dist/esm/common/event-emitter/handle.test.js +0 -54
  261. package/dist/esm/common/event-emitter/register-handler.test.js +0 -51
  262. package/dist/esm/common/harvest/harvest-scheduler.component-test.js +0 -37
  263. package/dist/esm/common/harvest/harvest.component-test.js +0 -222
  264. package/dist/esm/common/ids/id.test.js +0 -81
  265. package/dist/esm/common/ids/unique-id.test.js +0 -44
  266. package/dist/esm/common/session/session-entity.component-test.js +0 -495
  267. package/dist/esm/common/storage/local-storage.test.js +0 -12
  268. package/dist/esm/common/timer/interaction-timer.component-test.js +0 -214
  269. package/dist/esm/common/timer/timer.test.js +0 -103
  270. package/dist/esm/common/timing/nav-timing.test.js +0 -190
  271. package/dist/esm/common/url/canonicalize-url.test.js +0 -34
  272. package/dist/esm/common/url/clean-url.test.js +0 -7
  273. package/dist/esm/common/url/encode.component-test.js +0 -70
  274. package/dist/esm/common/url/location.test.js +0 -11
  275. package/dist/esm/common/url/parse-url.test.js +0 -107
  276. package/dist/esm/common/url/protocol.component-test.js +0 -13
  277. package/dist/esm/common/util/console.test.js +0 -28
  278. package/dist/esm/common/util/data-size.test.js +0 -60
  279. package/dist/esm/common/util/feature-flags.test.js +0 -80
  280. package/dist/esm/common/util/get-or-set.test.js +0 -45
  281. package/dist/esm/common/util/global-scope.js +0 -17
  282. package/dist/esm/common/util/global-scope.test.js +0 -70
  283. package/dist/esm/common/util/invoke.test.js +0 -47
  284. package/dist/esm/common/util/map-own.test.js +0 -47
  285. package/dist/esm/common/util/obfuscate.component-test.js +0 -125
  286. package/dist/esm/common/util/stringify.test.js +0 -46
  287. package/dist/esm/common/util/submit-data.test.js +0 -241
  288. package/dist/esm/common/util/traverse.test.js +0 -42
  289. package/dist/esm/common/wrap/wrap-promise.test.js +0 -115
  290. package/dist/esm/features/jserrors/aggregate/canonical-function-name.test.js +0 -29
  291. package/dist/esm/features/jserrors/aggregate/compute-stack-trace.test.js +0 -379
  292. package/dist/esm/features/jserrors/aggregate/format-stack-trace.test.js +0 -38
  293. package/dist/esm/features/jserrors/aggregate/string-hash-code.test.js +0 -25
  294. package/dist/esm/features/metrics/aggregate/framework-detection.test.js +0 -133
  295. package/dist/esm/features/metrics/aggregate/polyfill-detection.es5.test.js +0 -15
  296. package/dist/esm/features/metrics/aggregate/polyfill-detection.test.js +0 -163
  297. package/dist/esm/features/session_replay/aggregate/index.component-test.js +0 -453
  298. package/dist/esm/features/spa/aggregate/interaction-node.test.js +0 -14
  299. package/dist/esm/features/utils/agent-session.test.js +0 -207
  300. package/dist/esm/features/utils/aggregate-base.test.js +0 -108
  301. package/dist/esm/features/utils/feature-base.test.js +0 -40
  302. package/dist/esm/features/utils/handler-cache.test.js +0 -51
  303. package/dist/esm/features/utils/instrument-base.test.js +0 -175
  304. package/dist/esm/features/utils/lazy-feature-loader.test.js +0 -29
  305. package/dist/types/common/browser-version/firefox-version.d.ts +0 -2
  306. package/dist/types/common/browser-version/firefox-version.d.ts.map +0 -1
  307. package/dist/types/common/browser-version/ios-version.d.ts +0 -3
  308. package/dist/types/common/browser-version/ios-version.d.ts.map +0 -1
  309. package/dist/types/common/harvest/harvest-scheduler.component-test.d.ts +0 -2
  310. package/dist/types/common/harvest/harvest-scheduler.component-test.d.ts.map +0 -1
  311. package/dist/types/common/harvest/harvest.component-test.d.ts +0 -2
  312. package/dist/types/common/harvest/harvest.component-test.d.ts.map +0 -1
  313. package/dist/types/common/session/session-entity.component-test.d.ts +0 -2
  314. package/dist/types/common/session/session-entity.component-test.d.ts.map +0 -1
  315. package/dist/types/common/timer/interaction-timer.component-test.d.ts +0 -2
  316. package/dist/types/common/timer/interaction-timer.component-test.d.ts.map +0 -1
  317. package/dist/types/common/url/encode.component-test.d.ts +0 -2
  318. package/dist/types/common/url/encode.component-test.d.ts.map +0 -1
  319. package/dist/types/common/url/protocol.component-test.d.ts +0 -2
  320. package/dist/types/common/url/protocol.component-test.d.ts.map +0 -1
  321. package/dist/types/common/util/global-scope.d.ts +0 -5
  322. package/dist/types/common/util/global-scope.d.ts.map +0 -1
  323. package/dist/types/common/util/obfuscate.component-test.d.ts +0 -2
  324. package/dist/types/common/util/obfuscate.component-test.d.ts.map +0 -1
  325. package/dist/types/features/session_replay/aggregate/index.component-test.d.ts +0 -2
  326. package/dist/types/features/session_replay/aggregate/index.component-test.d.ts.map +0 -1
  327. package/src/common/browser-version/firefox-version.js +0 -10
  328. package/src/common/browser-version/ios-version.js +0 -11
  329. package/src/common/harvest/harvest-scheduler.component-test.js +0 -25
  330. package/src/common/harvest/harvest.component-test.js +0 -169
  331. package/src/common/util/global-scope.js +0 -23
  332. package/src/common/util/global-scope.test.js +0 -87
@@ -1,278 +0,0 @@
1
- import { faker } from '@faker-js/faker';
2
- let mockNREUM;
3
- let runtime;
4
- beforeEach(() => {
5
- mockNREUM = {};
6
- runtime = {};
7
- jest.doMock('../window/nreum', () => ({
8
- __esModule: true,
9
- gosNREUM: jest.fn(() => mockNREUM)
10
- }));
11
- jest.doMock('../config/config', () => ({
12
- __esModule: true,
13
- getRuntime: jest.fn(() => runtime)
14
- }));
15
- });
16
- afterEach(() => {
17
- jest.resetModules();
18
- jest.resetAllMocks();
19
- });
20
- describe('global event-emitter', () => {
21
- test('it returns the event-emitter defined on window.NREUM', async () => {
22
- const mockEE = {};
23
- mockNREUM.ee = mockEE;
24
- const {
25
- ee
26
- } = await import('./contextual-ee');
27
- expect(ee).toEqual(mockEE);
28
- });
29
- test('it sets the global event-emitter on window.NREUM', async () => {
30
- const {
31
- ee
32
- } = await import('./contextual-ee');
33
- expect(ee).toEqual(mockNREUM.ee);
34
- });
35
- });
36
- describe('scoping event-emitter', () => {
37
- test('it creates a new child event-emitter', async () => {
38
- const {
39
- ee
40
- } = await import('./contextual-ee');
41
- const childName = faker.datatype.uuid();
42
- const result = ee.get(childName);
43
- expect(result).not.toEqual(mockNREUM.ee);
44
- expect(result).toEqual(ee.get(childName)); // Should always return the same event-emitter
45
- expect(result.debugId).toEqual(childName);
46
- });
47
- test('it creates a child event-emitter with an isolated backlog', async () => {
48
- const childName = faker.random.alphaNumeric(16);
49
- jest.doMock('../config/config', () => ({
50
- __esModule: true,
51
- getRuntime: jest.fn(id => {
52
- if (id === childName) {
53
- return {
54
- isolatedBacklog: true
55
- };
56
- }
57
- return runtime;
58
- })
59
- }));
60
- const {
61
- ee
62
- } = await import('./contextual-ee');
63
- const result = ee.get(childName);
64
- expect(ee.backlog).not.toBe(result.backlog);
65
- });
66
- });
67
- describe('event-emitter context', () => {
68
- test('it returns a new context', async () => {
69
- const {
70
- ee
71
- } = await import('./contextual-ee');
72
- const result = ee.context();
73
- expect(result).toEqual({});
74
- });
75
- test('it returns the same context', async () => {
76
- const {
77
- ee
78
- } = await import('./contextual-ee');
79
- const result = ee.context();
80
- expect(result).toEqual(ee.context(result));
81
- });
82
- test('it adds the context to the provided object', async () => {
83
- const {
84
- ee
85
- } = await import('./contextual-ee');
86
- const obj = {};
87
- const result = ee.context(obj);
88
- expect(result).toEqual(obj['nr@context']);
89
- });
90
- });
91
- describe('event-emitter buffer', () => {
92
- test('it should create a new buffer for the given group', async () => {
93
- const {
94
- ee
95
- } = await import('./contextual-ee');
96
- const eventType = faker.datatype.uuid();
97
- const group = faker.datatype.uuid();
98
- ee.buffer([eventType], group);
99
- expect(ee.backlog).toEqual(expect.objectContaining({
100
- [group]: []
101
- }));
102
- expect(ee.isBuffering(eventType)).toEqual(true);
103
- });
104
- test('it should default group to "feature"', async () => {
105
- const {
106
- ee
107
- } = await import('./contextual-ee');
108
- const eventType = faker.datatype.uuid();
109
- ee.buffer([eventType]);
110
- expect(ee.backlog).toEqual(expect.objectContaining({
111
- feature: []
112
- }));
113
- expect(ee.isBuffering(eventType)).toEqual(true);
114
- });
115
- test('it should not create buffer if event-emitter is aborted', async () => {
116
- const {
117
- ee
118
- } = await import('./contextual-ee');
119
- const eventType = faker.datatype.uuid();
120
- const group = faker.datatype.uuid();
121
- ee.backlog = {
122
- api: ['foo', 'bar', 'baz']
123
- };
124
- ee.abort();
125
- ee.buffer([eventType], group);
126
- expect(ee.backlog).toEqual({});
127
- expect(ee.isBuffering(eventType)).toEqual(false);
128
- });
129
- });
130
- describe('event-emitter abort', () => {
131
- test('it aborts if there is an API backlog', async () => {
132
- const {
133
- ee
134
- } = await import('./contextual-ee');
135
- ee.backlog = {
136
- api: ['foo', 'bar', 'baz']
137
- };
138
- ee.abort();
139
- expect(ee.aborted).toEqual(true);
140
- expect(ee.backlog).toEqual({});
141
- });
142
- test('it aborts if there is a feature backlog', async () => {
143
- const {
144
- ee
145
- } = await import('./contextual-ee');
146
- ee.backlog = {
147
- feature: ['foo', 'bar', 'baz']
148
- };
149
- ee.abort();
150
- expect(ee.aborted).toEqual(true);
151
- expect(ee.backlog).toEqual({});
152
- });
153
- });
154
- describe('event-emitter emit', () => {
155
- test('should execute the listener', async () => {
156
- const {
157
- ee
158
- } = await import('./contextual-ee');
159
- const mockListener = jest.fn();
160
- const eventType = faker.datatype.uuid();
161
- const eventArgs = ['a', 'b', 'c'];
162
- ee.on(eventType, mockListener);
163
- ee.emit(eventType, eventArgs);
164
- expect(mockListener).toHaveBeenCalledWith(eventArgs[0], eventArgs[1], eventArgs[2]);
165
- });
166
- test('should not execute the listener after removal', async () => {
167
- const {
168
- ee
169
- } = await import('./contextual-ee');
170
- const mockListener = jest.fn();
171
- const eventType = faker.datatype.uuid();
172
- const eventArgs = ['a', 'b', 'c'];
173
- ee.on(eventType, mockListener);
174
- ee.emit(eventType, eventArgs);
175
- ee.removeEventListener(eventType, mockListener);
176
- ee.emit(eventType, eventArgs);
177
- expect(mockListener).toHaveBeenCalledTimes(1);
178
- });
179
- test('should return early if global event-emitter is aborted', async () => {
180
- const {
181
- ee
182
- } = await import('./contextual-ee');
183
- const mockListener = jest.fn();
184
- const eventType = faker.datatype.uuid();
185
- const eventArgs = ['a', 'b', 'c'];
186
- ee.backlog = {
187
- api: ['foo', 'bar', 'baz']
188
- };
189
- ee.abort();
190
- ee.on(eventType, mockListener);
191
- ee.emit(eventType, eventArgs);
192
- expect(mockListener).toHaveBeenCalledTimes(0);
193
- });
194
- test('should still emit if global event-emitter is aborted but force flag is true', async () => {
195
- const {
196
- ee
197
- } = await import('./contextual-ee');
198
- const scopeEE = ee.get(faker.datatype.uuid());
199
- const mockScopeListener = jest.fn();
200
- const eventType = faker.datatype.uuid();
201
- const eventArgs = ['a', 'b', 'c'];
202
- ee.backlog = {
203
- api: ['foo', 'bar', 'baz']
204
- };
205
- ee.abort();
206
- scopeEE.on(eventType, mockScopeListener);
207
- scopeEE.emit(eventType, eventArgs, {}, true);
208
- expect(mockScopeListener).toHaveBeenCalledTimes(1);
209
- });
210
- test('should bubble the event if bubble flag is true', async () => {
211
- const {
212
- ee
213
- } = await import('./contextual-ee');
214
- const scopeEE = ee.get(faker.datatype.uuid());
215
- const mockListener = jest.fn();
216
- const mockScopeListener = jest.fn();
217
- const eventType = faker.datatype.uuid();
218
- const eventArgs = ['a', 'b', 'c'];
219
- ee.on(eventType, mockListener);
220
- scopeEE.on(eventType, mockScopeListener);
221
- scopeEE.emit(eventType, eventArgs, {}, false, true);
222
- expect(mockScopeListener).toHaveBeenCalledTimes(1);
223
- expect(mockListener).toHaveBeenCalledTimes(1);
224
- });
225
- test('should not bubble the event if bubble flag is false', async () => {
226
- const {
227
- ee
228
- } = await import('./contextual-ee');
229
- const scopeEE = ee.get(faker.datatype.uuid());
230
- const mockListener = jest.fn();
231
- const mockScopeListener = jest.fn();
232
- const eventType = faker.datatype.uuid();
233
- const eventArgs = ['a', 'b', 'c'];
234
- ee.on(eventType, mockListener);
235
- scopeEE.on(eventType, mockScopeListener);
236
- scopeEE.emit(eventType, eventArgs, {}, false, false);
237
- expect(mockScopeListener).toHaveBeenCalledTimes(1);
238
- expect(mockListener).not.toHaveBeenCalled();
239
- });
240
- test('should buffer the event on the scoped event-emitter', async () => {
241
- const {
242
- ee
243
- } = await import('./contextual-ee');
244
- const scopeEE = ee.get(faker.datatype.uuid());
245
- const mockListener = jest.fn();
246
- const mockScopeListener = jest.fn();
247
- const eventType = faker.datatype.uuid();
248
- const eventArgs = ['a', 'b', 'c'];
249
- ee.on(eventType, mockListener);
250
- ee.buffer([eventType]);
251
- scopeEE.on(eventType, mockScopeListener);
252
- scopeEE.buffer([eventType]);
253
- scopeEE.emit(eventType, eventArgs, {}, false, false);
254
- expect(mockScopeListener).toHaveBeenCalledTimes(1);
255
- expect(mockListener).not.toHaveBeenCalled();
256
- expect(scopeEE.backlog.feature).toEqual(expect.arrayContaining([expect.arrayContaining([scopeEE, eventType, eventArgs, {}])]));
257
- expect(ee.backlog.feature).toEqual(scopeEE.backlog.feature);
258
- });
259
- });
260
- describe('getOrSetContext', () => {
261
- test('it returns a new context', async () => {
262
- const {
263
- getOrSetContext
264
- } = await import('./contextual-ee');
265
- const obj = {};
266
- const result = getOrSetContext(obj);
267
- expect(result).toEqual({});
268
- expect(result).toEqual(obj['nr@context']);
269
- });
270
- test('it returns the same context', async () => {
271
- const {
272
- getOrSetContext
273
- } = await import('./contextual-ee');
274
- const obj = {};
275
- const result = getOrSetContext(obj);
276
- expect(getOrSetContext(obj)).toEqual(result);
277
- });
278
- });
@@ -1,54 +0,0 @@
1
- import { faker } from '@faker-js/faker';
2
- jest.mock('./contextual-ee', () => ({
3
- __esModule: true,
4
- ee: {
5
- buffer: jest.fn(),
6
- emit: jest.fn(),
7
- get: jest.fn(() => ({
8
- buffer: jest.fn(),
9
- emit: jest.fn()
10
- }))
11
- }
12
- }));
13
- afterEach(() => {
14
- jest.resetModules();
15
- jest.resetAllMocks();
16
- });
17
- test('it should create and use a default event-emitter', async () => {
18
- const {
19
- ee
20
- } = await import('./contextual-ee');
21
- const {
22
- handle
23
- } = await import('./handle');
24
- const handleEE = jest.mocked(ee.get).mock.results[0].value;
25
- const eventType = faker.datatype.uuid();
26
- const eventArgs = ['a', 'b', 'c'];
27
- const eventContext = {};
28
- const eventGroup = faker.datatype.uuid();
29
- handle(eventType, eventArgs, eventContext, eventGroup);
30
- expect(handleEE.buffer).toHaveBeenCalledWith([eventType], eventGroup);
31
- expect(handleEE.emit).toHaveBeenCalledWith(eventType, eventArgs, eventContext);
32
- });
33
- test('it should use the provided scoped event-emitter', async () => {
34
- const {
35
- ee
36
- } = await import('./contextual-ee');
37
- const {
38
- handle
39
- } = await import('./handle');
40
- const scopedEE = {
41
- buffer: jest.fn(),
42
- emit: jest.fn()
43
- };
44
- const handleEE = jest.mocked(ee.get).mock.results[0].value;
45
- const eventType = faker.datatype.uuid();
46
- const eventArgs = ['a', 'b', 'c'];
47
- const eventContext = {};
48
- const eventGroup = faker.datatype.uuid();
49
- handle(eventType, eventArgs, eventContext, eventGroup, scopedEE);
50
- expect(handleEE.buffer).not.toHaveBeenCalled();
51
- expect(handleEE.emit).not.toHaveBeenCalled();
52
- expect(scopedEE.buffer).toHaveBeenCalledWith([eventType], eventGroup);
53
- expect(scopedEE.emit).toHaveBeenCalledWith(eventType, eventArgs, eventContext);
54
- });
@@ -1,51 +0,0 @@
1
- import { faker } from '@faker-js/faker';
2
- jest.mock('./handle', () => ({
3
- __esModule: true,
4
- handleEE: {}
5
- }));
6
- afterEach(() => {
7
- jest.resetModules();
8
- jest.resetAllMocks();
9
- });
10
- test('should default group to "feature"', async () => {
11
- const {
12
- handleEE
13
- } = await import('./handle');
14
- const {
15
- registerHandler
16
- } = await import('./register-handler');
17
- const eventType = faker.datatype.uuid();
18
- const eventHandler = jest.fn();
19
- registerHandler(eventType, eventHandler);
20
- expect(registerHandler.handlers.feature).toEqual(expect.objectContaining({
21
- [eventType]: [expect.arrayContaining([handleEE, eventHandler])]
22
- }));
23
- });
24
- test('should use the provided group', async () => {
25
- const {
26
- handleEE
27
- } = await import('./handle');
28
- const {
29
- registerHandler
30
- } = await import('./register-handler');
31
- const eventType = faker.datatype.uuid();
32
- const eventGroup = faker.datatype.uuid();
33
- const eventHandler = jest.fn();
34
- registerHandler(eventType, eventHandler, eventGroup);
35
- expect(registerHandler.handlers[eventGroup]).toEqual(expect.objectContaining({
36
- [eventType]: [expect.arrayContaining([handleEE, eventHandler])]
37
- }));
38
- });
39
- test('should use the provided event-emitter', async () => {
40
- const {
41
- registerHandler
42
- } = await import('./register-handler');
43
- const scopedEE = {};
44
- const eventType = faker.datatype.uuid();
45
- const eventGroup = faker.datatype.uuid();
46
- const eventHandler = jest.fn();
47
- registerHandler(eventType, eventHandler, eventGroup, scopedEE);
48
- expect(registerHandler.handlers[eventGroup]).toEqual(expect.objectContaining({
49
- [eventType]: [expect.arrayContaining([scopedEE, eventHandler])]
50
- }));
51
- });
@@ -1,37 +0,0 @@
1
- import { setConfiguration } from '../config/state/init';
2
- import { HarvestScheduler } from './harvest-scheduler';
3
- describe('runHarvest', () => {
4
- test('should re-schedule harvest even if there is no accumulated data', () => {
5
- setConfiguration('asdf', {});
6
- const scheduler = new HarvestScheduler('events', {
7
- getPayload: jest.fn()
8
- }, {
9
- agentIdentifier: 'asdf',
10
- ee: {
11
- on: jest.fn()
12
- }
13
- });
14
- scheduler.started = true;
15
- jest.spyOn(scheduler, 'scheduleHarvest');
16
- scheduler.runHarvest();
17
- expect(scheduler.opts.getPayload()).toBeFalsy();
18
- expect(scheduler.scheduleHarvest).toHaveBeenCalledTimes(1);
19
- });
20
- test('should also re-schedule harvest if there is accumulated data', () => {
21
- setConfiguration('asdf', {});
22
- const scheduler = new HarvestScheduler('events', {
23
- getPayload: jest.fn().mockImplementation(() => 'payload')
24
- }, {
25
- agentIdentifier: 'asdf',
26
- ee: {
27
- on: jest.fn()
28
- }
29
- });
30
- scheduler.started = true;
31
- scheduler.harvest._send = () => {};
32
- jest.spyOn(scheduler, 'scheduleHarvest');
33
- scheduler.runHarvest();
34
- expect(scheduler.opts.getPayload()).toBeTruthy();
35
- expect(scheduler.scheduleHarvest).toHaveBeenCalledTimes(1);
36
- });
37
- });
@@ -1,222 +0,0 @@
1
- import { submitData } from '../util/submit-data';
2
- import { Harvest } from './harvest';
3
- jest.mock('../context/shared-context', () => ({
4
- __esModule: true,
5
- SharedContext: function () {
6
- this.sharedContext = {
7
- agentIdentifier: 'abcd'
8
- };
9
- }
10
- }));
11
- jest.mock('../config/config', () => ({
12
- __esModule: true,
13
- getConfigurationValue: jest.fn(),
14
- getInfo: jest.fn().mockReturnValue({
15
- errorBeacon: 'example.com',
16
- licenseKey: 'abcd'
17
- }),
18
- getRuntime: jest.fn().mockReturnValue({
19
- bytesSent: {},
20
- queryBytesSent: {}
21
- })
22
- }));
23
- jest.mock('../util/submit-data', () => ({
24
- __esModule: true,
25
- submitData: {
26
- xhr: jest.fn(() => ({
27
- addEventListener: jest.fn()
28
- })),
29
- beacon: jest.fn(),
30
- img: jest.fn()
31
- }
32
- }));
33
- describe('sendX', () => {
34
- test.each([null, undefined, false])('should not send request when body is empty and sendEmptyBody is %s', sendEmptyBody => {
35
- const sendCallback = jest.fn();
36
- const harvester = new Harvest();
37
- harvester.on('jserrors', () => ({
38
- body: {},
39
- qs: {}
40
- }));
41
- harvester.sendX({
42
- endpoint: 'jserrors',
43
- cbFinished: sendCallback
44
- });
45
- expect(sendCallback).toHaveBeenCalledWith({
46
- sent: false
47
- });
48
- expect(submitData.xhr).not.toHaveBeenCalled();
49
- expect(submitData.img).not.toHaveBeenCalled();
50
- expect(submitData.beacon).not.toHaveBeenCalled();
51
- });
52
- test('should send request when body is empty and sendEmptyBody is true', () => {
53
- const harvester = new Harvest();
54
- harvester.on('jserrors', () => ({
55
- body: {},
56
- qs: {}
57
- }));
58
- harvester.sendX({
59
- endpoint: 'jserrors',
60
- opts: {
61
- sendEmptyBody: true
62
- },
63
- cbFinished: jest.fn()
64
- });
65
- expect(submitData.xhr).toHaveBeenCalledWith(expect.objectContaining({
66
- url: expect.stringContaining('https://example.com/jserrors/1/abcd?'),
67
- body: undefined
68
- }));
69
- expect(submitData.img).not.toHaveBeenCalled();
70
- expect(submitData.beacon).not.toHaveBeenCalled();
71
- });
72
- test.each([null, undefined, []])('should remove %s values from the body and query string when sending', emptyValue => {
73
- const harvester = new Harvest();
74
- harvester.on('jserrors', () => ({
75
- body: {
76
- bar: 'foo',
77
- empty: emptyValue
78
- },
79
- qs: {
80
- foo: 'bar',
81
- empty: emptyValue
82
- }
83
- }));
84
- harvester.sendX({
85
- endpoint: 'jserrors',
86
- cbFinished: jest.fn()
87
- });
88
- expect(submitData.xhr).toHaveBeenCalledWith(expect.objectContaining({
89
- url: expect.stringContaining('&foo=bar'),
90
- body: JSON.stringify({
91
- bar: 'foo'
92
- })
93
- }));
94
- expect(submitData.xhr).toHaveBeenCalledWith(expect.objectContaining({
95
- url: expect.not.stringContaining('&empty'),
96
- body: expect.not.stringContaining('empty')
97
- }));
98
- expect(submitData.img).not.toHaveBeenCalled();
99
- expect(submitData.beacon).not.toHaveBeenCalled();
100
- });
101
- test.each([1, false, true])('should not remove value %s (when it doesn\'t have a length) from the body and query string when sending', nonStringValue => {
102
- const harvester = new Harvest();
103
- harvester.on('jserrors', () => ({
104
- body: {
105
- bar: 'foo',
106
- nonString: nonStringValue
107
- },
108
- qs: {
109
- foo: 'bar',
110
- nonString: nonStringValue
111
- }
112
- }));
113
- harvester.sendX({
114
- endpoint: 'jserrors',
115
- cbFinished: jest.fn()
116
- });
117
- expect(submitData.xhr).toHaveBeenCalledWith(expect.objectContaining({
118
- url: expect.stringContaining("&nonString=".concat(nonStringValue)),
119
- body: JSON.stringify({
120
- bar: 'foo',
121
- nonString: nonStringValue
122
- })
123
- }));
124
- expect(submitData.img).not.toHaveBeenCalled();
125
- expect(submitData.beacon).not.toHaveBeenCalled();
126
- });
127
- });
128
- describe('send', () => {
129
- test.each([null, undefined, false])('should not send request when body is empty and sendEmptyBody is %s', sendEmptyBody => {
130
- const sendCallback = jest.fn();
131
- const harvester = new Harvest();
132
- harvester.send({
133
- endpoint: 'rum',
134
- payload: {
135
- qs: {},
136
- body: {}
137
- },
138
- opts: {
139
- sendEmptyBody
140
- },
141
- cbFinished: sendCallback
142
- });
143
- expect(sendCallback).toHaveBeenCalledWith({
144
- sent: false
145
- });
146
- expect(submitData.xhr).not.toHaveBeenCalled();
147
- expect(submitData.img).not.toHaveBeenCalled();
148
- expect(submitData.beacon).not.toHaveBeenCalled();
149
- });
150
- test('should send request when body is empty and sendEmptyBody is true', () => {
151
- const harvester = new Harvest();
152
- harvester.send({
153
- endpoint: 'rum',
154
- payload: {
155
- qs: {},
156
- body: {}
157
- },
158
- opts: {
159
- sendEmptyBody: true
160
- }
161
- });
162
- expect(submitData.xhr).toHaveBeenCalledWith(expect.objectContaining({
163
- url: expect.stringContaining('https://example.com/1/abcd?'),
164
- body: undefined
165
- }));
166
- expect(submitData.img).not.toHaveBeenCalled();
167
- expect(submitData.beacon).not.toHaveBeenCalled();
168
- });
169
- test.each([null, undefined, []])('should remove %s values from the body and query string when sending', emptyValue => {
170
- const harvester = new Harvest();
171
- harvester.send({
172
- endpoint: 'rum',
173
- payload: {
174
- qs: {
175
- foo: 'bar',
176
- empty: emptyValue
177
- },
178
- body: {
179
- bar: 'foo',
180
- empty: emptyValue
181
- }
182
- }
183
- });
184
- expect(submitData.xhr).toHaveBeenCalledWith(expect.objectContaining({
185
- url: expect.stringContaining('&foo=bar'),
186
- body: JSON.stringify({
187
- bar: 'foo'
188
- })
189
- }));
190
- expect(submitData.xhr).toHaveBeenCalledWith(expect.objectContaining({
191
- url: expect.not.stringContaining('&empty'),
192
- body: expect.not.stringContaining('empty')
193
- }));
194
- expect(submitData.img).not.toHaveBeenCalled();
195
- expect(submitData.beacon).not.toHaveBeenCalled();
196
- });
197
- test.each([1, false, true])('should not remove value %s (when it doesn\'t have a length) from the body and query string when sending', nonStringValue => {
198
- const harvester = new Harvest();
199
- harvester.send({
200
- endpoint: 'rum',
201
- payload: {
202
- qs: {
203
- foo: 'bar',
204
- nonString: nonStringValue
205
- },
206
- body: {
207
- bar: 'foo',
208
- nonString: nonStringValue
209
- }
210
- }
211
- });
212
- expect(submitData.xhr).toHaveBeenCalledWith(expect.objectContaining({
213
- url: expect.stringContaining("&nonString=".concat(nonStringValue)),
214
- body: JSON.stringify({
215
- bar: 'foo',
216
- nonString: nonStringValue
217
- })
218
- }));
219
- expect(submitData.img).not.toHaveBeenCalled();
220
- expect(submitData.beacon).not.toHaveBeenCalled();
221
- });
222
- });