@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newrelic/browser-agent",
3
- "version": "1.235.0",
3
+ "version": "1.236.0",
4
4
  "private": false,
5
5
  "author": "New Relic Browser Agent Team <browser-agent@newrelic.com>",
6
6
  "description": "Tests for the New Relic JavaScript agent",
@@ -37,6 +37,11 @@
37
37
  "require": "./dist/cjs/loaders/browser-agent.js",
38
38
  "default": "./dist/esm/loaders/browser-agent.js"
39
39
  },
40
+ "./loaders/micro-agent": {
41
+ "types": "./dist/types/loaders/micro-agent.d.ts",
42
+ "require": "./dist/cjs/loaders/micro-agent.js",
43
+ "default": "./dist/esm/loaders/micro-agent.js"
44
+ },
40
45
  "./loaders/worker-agent": {
41
46
  "types": "./dist/types/loaders/worker-agent.d.ts",
42
47
  "require": "./dist/cjs/loaders/worker-agent.js",
@@ -0,0 +1,11 @@
1
+ export const isConfigured = jest.fn()
2
+ export const getInfo = jest.fn()
3
+ export const setInfo = jest.fn()
4
+ export const getConfiguration = jest.fn()
5
+ export const getConfigurationValue = jest.fn()
6
+ export const setConfiguration = jest.fn()
7
+ export const getLoaderConfig = jest.fn()
8
+ export const setLoaderConfig = jest.fn()
9
+ export const originals = {}
10
+ export const getRuntime = jest.fn()
11
+ export const setRuntime = jest.fn()
@@ -31,6 +31,7 @@ const model = () => {
31
31
  page_view_event: { enabled: true },
32
32
  page_view_timing: { enabled: true, harvestTimeSeconds: 30, long_task: false },
33
33
  session_trace: { enabled: true, harvestTimeSeconds: 10 },
34
+ harvest: { tooManyRequestsDelay: 60 },
34
35
  session_replay: {
35
36
  // feature settings
36
37
  enabled: false,
@@ -1,6 +1,6 @@
1
1
  import { getModeledObject } from './configurable'
2
2
  import { gosNREUMInitializedAgents } from '../../window/nreum'
3
- import { globalScope } from '../../util/global-scope'
3
+ import { globalScope } from '../../constants/runtime'
4
4
  import { BUILD_ENV, DIST_METHOD, VERSION } from '../../constants/env'
5
5
 
6
6
  const model = {
@@ -0,0 +1,3 @@
1
+ export const VERSION = '0.0.0'
2
+ export const BUILD_ENV = 'TEST'
3
+ export const DIST_METHOD = 'TEST'
@@ -0,0 +1,8 @@
1
+ export const isBrowserScope = true
2
+ export const isWorkerScope = false
3
+ export const globalScope = window
4
+ export const initialLocation = '' + globalScope?.location
5
+ export const isiOS = false
6
+ export const iOS_below16 = false
7
+ export const ffVersion = 0
8
+ export const supportsSendBeacon = true
@@ -0,0 +1,7 @@
1
+ import * as env from './env.cdn'
2
+
3
+ test('should default environment variables to CDN values', async () => {
4
+ expect(env.VERSION).toMatch(/\d{1,3}\.\d{1,3}\.\d{1,3}/)
5
+ expect(env.BUILD_ENV).toEqual('CDN')
6
+ expect(env.DIST_METHOD).toEqual('CDN')
7
+ })
@@ -0,0 +1,7 @@
1
+ import * as env from './env.npm'
2
+
3
+ test('should default environment variables to NPM values', () => {
4
+ expect(env.VERSION).toMatch(/\d{1,3}\.\d{1,3}\.\d{1,3}/)
5
+ expect(env.BUILD_ENV).toEqual('NPM')
6
+ expect(env.DIST_METHOD).toEqual('NPM')
7
+ })
@@ -0,0 +1,7 @@
1
+ import * as env from './env'
2
+
3
+ test('should default environment variables to NPM values', () => {
4
+ expect(env.VERSION).toMatch(/\d{1,3}\.\d{1,3}\.\d{1,3}/)
5
+ expect(env.BUILD_ENV).toEqual('NPM')
6
+ expect(env.DIST_METHOD).toEqual('NPM')
7
+ })
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @file Contains constants about the environment the agent is running
3
+ * within. These values are derived at the time the agent is first loaded.
4
+ * @copyright 2023 New Relic Corporation. All rights reserved.
5
+ * @license Apache-2.0
6
+ */
7
+
8
+ /**
9
+ * Indicates if the agent is running within a normal browser window context.
10
+ */
11
+ export const isBrowserScope =
12
+ typeof window !== 'undefined' &&
13
+ !!window.document
14
+
15
+ /**
16
+ * Indicates if the agent is running within a worker context.
17
+ */
18
+ export const isWorkerScope =
19
+ typeof WorkerGlobalScope !== 'undefined' &&
20
+ (
21
+ (
22
+ typeof self !== 'undefined' &&
23
+ self instanceof WorkerGlobalScope &&
24
+ self.navigator instanceof WorkerNavigator
25
+ ) ||
26
+ (
27
+ (
28
+ typeof globalThis !== 'undefined' &&
29
+ globalThis instanceof WorkerGlobalScope &&
30
+ globalThis.navigator instanceof WorkerNavigator
31
+ )
32
+ )
33
+ )
34
+
35
+ export const globalScope = isBrowserScope
36
+ ? window
37
+ : typeof WorkerGlobalScope !== 'undefined' && ((
38
+ typeof self !== 'undefined' &&
39
+ self instanceof WorkerGlobalScope &&
40
+ self
41
+ ) || (
42
+ typeof globalThis !== 'undefined' &&
43
+ globalThis instanceof WorkerGlobalScope &&
44
+ globalThis
45
+ ))
46
+
47
+ export const initialLocation = '' + globalScope?.location
48
+
49
+ export const isiOS = /iPad|iPhone|iPod/.test(navigator.userAgent)
50
+
51
+ /**
52
+ * Shared Web Workers introduced in iOS 16.0+ and n/a in 15.6-
53
+ *
54
+ * It was discovered in Safari 14 (https://bugs.webkit.org/show_bug.cgi?id=225305) that the buffered flag in PerformanceObserver
55
+ * did not work. This affects our onFCP metric in particular since web-vitals uses that flag to retrieve paint timing entries.
56
+ * This was fixed in v16+.
57
+ */
58
+ export const iOS_below16 = (isiOS && typeof SharedWorker === 'undefined')
59
+
60
+ export const ffVersion = (() => {
61
+ const match = navigator.userAgent.match(/Firefox[/\s](\d+\.\d+)/)
62
+ if (Array.isArray(match) && match.length >= 2) {
63
+ return +match[1]
64
+ }
65
+
66
+ return 0
67
+ })()
68
+
69
+ export const isIE = Boolean(isBrowserScope && window.document.documentMode) // deprecated property that only works in IE
70
+
71
+ export const supportsSendBeacon = !!navigator.sendBeacon
@@ -0,0 +1,168 @@
1
+ /**
2
+ * The runtime module exports variables whose values are set at the time of import and
3
+ * can depend on the environment the agent is running within. To make testing this module
4
+ * easier, use async import to import the module and only use the node jest environment so
5
+ * we can more easily define environment variables.
6
+ * @jest-environment node
7
+ */
8
+
9
+ import { faker } from '@faker-js/faker'
10
+
11
+ beforeEach(() => {
12
+ // We assume every runtime has a global navigator variable
13
+ global.navigator = {
14
+ userAgent: faker.lorem.sentence()
15
+ }
16
+ })
17
+
18
+ afterEach(() => {
19
+ delete global.navigator
20
+ jest.resetModules()
21
+ })
22
+
23
+ test('should indicate agent is running in a browser scope', async () => {
24
+ const mockedWindow = global.window = {
25
+ [faker.datatype.uuid()]: faker.lorem.sentence,
26
+ document: {
27
+ [faker.datatype.uuid()]: faker.lorem.sentence
28
+ }
29
+ }
30
+
31
+ const runtime = await import('./runtime')
32
+
33
+ delete global.window
34
+
35
+ expect(runtime.isBrowserScope).toEqual(true)
36
+ expect(runtime.isWorkerScope).toEqual(false)
37
+ expect(runtime.globalScope).toEqual(mockedWindow)
38
+ })
39
+
40
+ test('should indicate agent is running in a worker scope using global self variable', async () => {
41
+ global.WorkerGlobalScope = class WorkerGlobalScope {}
42
+ global.WorkerNavigator = class WorkerNavigator {}
43
+ const mockedGlobalSelf = global.self = new global.WorkerGlobalScope()
44
+ mockedGlobalSelf.navigator = new global.WorkerNavigator()
45
+
46
+ const runtime = await import('./runtime')
47
+
48
+ delete global.WorkerGlobalScope
49
+ delete global.WorkerNavigator
50
+ delete global.self
51
+
52
+ expect(runtime.isBrowserScope).toEqual(false)
53
+ expect(runtime.isWorkerScope).toEqual(true)
54
+ expect(runtime.globalScope).toEqual(mockedGlobalSelf)
55
+ })
56
+
57
+ test('should indicate agent is running in a worker scope using global self variable', async () => {
58
+ global.WorkerGlobalScope = class WorkerGlobalScope {}
59
+ global.WorkerNavigator = class WorkerNavigator {}
60
+ const cachedGlobalThis = global.globalThis
61
+ const mockedGlobalThis = global.globalThis = new WorkerGlobalScope()
62
+ Object.defineProperties(global.globalThis, Object.getOwnPropertyDescriptors(cachedGlobalThis))
63
+ global.globalThis.navigator = new WorkerNavigator()
64
+
65
+ const runtime = await import('./runtime')
66
+
67
+ delete global.WorkerGlobalScope
68
+ delete global.WorkerNavigator
69
+ global.globalThis = cachedGlobalThis
70
+
71
+ expect(runtime.isBrowserScope).toEqual(false)
72
+ expect(runtime.isWorkerScope).toEqual(true)
73
+ expect(runtime.globalScope).toEqual(mockedGlobalThis)
74
+ })
75
+
76
+ test('should store the initial page location', async () => {
77
+ const initialLocation = faker.internet.url()
78
+ const mockedWindow = global.window = {
79
+ [faker.datatype.uuid()]: faker.lorem.sentence,
80
+ document: {
81
+ [faker.datatype.uuid()]: faker.lorem.sentence
82
+ },
83
+ location: {
84
+ href: initialLocation,
85
+ toString () {
86
+ return this.href
87
+ }
88
+ }
89
+ }
90
+
91
+ const runtime = await import('./runtime')
92
+ mockedWindow.location.href = faker.internet.url()
93
+
94
+ delete global.window
95
+
96
+ expect(runtime.initialLocation).toEqual(initialLocation)
97
+ expect(runtime.initialLocation).not.toEqual(mockedWindow.location.href)
98
+ })
99
+
100
+ test.each([
101
+ { userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: true },
102
+ { userAgent: 'Mozilla/5.0 (iPad; CPU OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: true },
103
+ { userAgent: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: true },
104
+ { userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15', expected: false },
105
+ { userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0', expected: false },
106
+ { userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13.4; rv:109.0) Gecko/20100101 Firefox/114.0', expected: false }
107
+ ])('should set isiOS to $expected for $userAgent', async ({ userAgent, expected }) => {
108
+ global.navigator.userAgent = userAgent
109
+
110
+ const runtime = await import('./runtime')
111
+
112
+ expect(runtime.isiOS).toEqual(expected)
113
+ })
114
+
115
+ test.each([
116
+ { userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: false },
117
+ { userAgent: 'Mozilla/5.0 (iPad; CPU OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: false },
118
+ { userAgent: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: false },
119
+ { userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1', expected: true },
120
+ { userAgent: 'Mozilla/5.0 (iPad; CPU OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1', expected: true },
121
+ { userAgent: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Mobile/15E148 Safari/604.1', expected: true },
122
+ { userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15', expected: false },
123
+ { userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0', expected: false },
124
+ { userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13.4; rv:109.0) Gecko/20100101 Firefox/114.0', expected: false }
125
+ ])('should set iOS_below16 to $expected for $userAgent', async ({ userAgent, expected }) => {
126
+ if (!expected) {
127
+ global.SharedWorker = class SharedWorker {}
128
+ }
129
+ global.navigator.userAgent = userAgent
130
+
131
+ const runtime = await import('./runtime')
132
+
133
+ delete global.SharedWorker
134
+
135
+ expect(runtime.iOS_below16).toEqual(expected)
136
+ })
137
+
138
+ test.each([
139
+ { userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: 0 },
140
+ { userAgent: 'Mozilla/5.0 (iPad; CPU OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: 0 },
141
+ { userAgent: 'Mozilla/5.0 (iPod touch; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1', expected: 0 },
142
+ { userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15', expected: 0 },
143
+ { userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0', expected: 114 },
144
+ { userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13.4; rv:109.0) Gecko/20100101 Firefox/114.0', expected: 114 }
145
+ ])('should set ffVersion to $expected for $userAgent', async ({ userAgent, expected }) => {
146
+ global.navigator.userAgent = userAgent
147
+
148
+ const runtime = await import('./runtime')
149
+
150
+ expect(runtime.ffVersion).toEqual(expected)
151
+ })
152
+
153
+ test('should set supportsSendBeacon to false', async () => {
154
+ // Ensure we don't have a sendBeacon function
155
+ delete global.navigator.sendBeacon
156
+
157
+ const runtime = await import('./runtime')
158
+
159
+ expect(runtime.supportsSendBeacon).toEqual(false)
160
+ })
161
+
162
+ test('should set supportsSendBeacon to true', async () => {
163
+ global.navigator.sendBeacon = jest.fn()
164
+
165
+ const runtime = await import('./runtime')
166
+
167
+ expect(runtime.supportsSendBeacon).toEqual(true)
168
+ })
@@ -0,0 +1,8 @@
1
+ export const SharedContext = jest.fn(function () {
2
+ this.sharedContext = {
3
+ agentIdentifier: 'abcd',
4
+ ee: {
5
+ on: jest.fn()
6
+ }
7
+ }
8
+ })
@@ -0,0 +1,7 @@
1
+ export const eventListenerOpts = jest.fn((useCapture, abortSignal) => ({
2
+ capture: !!useCapture,
3
+ passive: true,
4
+ signal: abortSignal
5
+ }))
6
+ export const windowAddEventListener = jest.fn()
7
+ export const documentAddEventListener = jest.fn()
@@ -1,4 +1,4 @@
1
- import { globalScope } from '../util/global-scope'
1
+ import { globalScope } from '../constants/runtime'
2
2
 
3
3
  /*
4
4
  * See https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#safely_detecting_option_support
@@ -0,0 +1,13 @@
1
+ export const Harvest = jest.fn(function () {
2
+ this.sharedContext = {
3
+ agentIdentifier: 'abcd'
4
+ }
5
+ this.sendX = jest.fn()
6
+ this.send = jest.fn()
7
+ this.obfuscateAndSend = jest.fn()
8
+ this._send = jest.fn()
9
+ this.baseQueryString = jest.fn()
10
+ this.createPayload = jest.fn()
11
+ this.cleanPayload = jest.fn()
12
+ this.on = jest.fn()
13
+ })
@@ -3,9 +3,9 @@
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
5
 
6
- import { submitData } from '../util/submit-data'
6
+ import * as submitData from '../util/submit-data'
7
7
  import { SharedContext } from '../context/shared-context'
8
- import { Harvest, getSubmitMethod } from './harvest'
8
+ import { Harvest } from './harvest'
9
9
  import { subscribeToEOL } from '../unload/eol'
10
10
  import { getConfigurationValue } from '../config/config'
11
11
  import { SESSION_EVENTS } from '../session/session-entity'
@@ -71,30 +71,39 @@ export class HarvestScheduler extends SharedContext {
71
71
 
72
72
  scheduleHarvest (delay, opts) {
73
73
  if (this.timeoutHandle) return
74
- var timer = this
75
74
 
76
75
  if (delay == null) {
77
76
  delay = this.interval
78
77
  }
79
78
  this.timeoutHandle = setTimeout(() => {
80
- timer.timeoutHandle = null
81
- timer.runHarvest(opts)
79
+ this.timeoutHandle = null
80
+ this.runHarvest(opts)
82
81
  }, delay * 1000)
83
82
  }
84
83
 
85
84
  runHarvest (opts) {
86
85
  if (this.aborted) return
87
- var scheduler = this
86
+
87
+ /**
88
+ * This is executed immediately after harvest sends the data via XHR, or if there's nothing to send. Note that this excludes on unloading / sendBeacon.
89
+ * @param {Object} result
90
+ */
91
+ const cbRanAfterSend = (result) => {
92
+ if (opts?.forceNoRetry) result.retry = false // discard unsent data rather than re-queuing for next harvest attempt
93
+ this.onHarvestFinished(opts, result)
94
+ }
88
95
 
89
96
  let harvests = []
90
97
  let submitMethod
98
+ let payload
91
99
 
92
- if (this.opts.getPayload) { // Ajax & PVT & SR
93
- submitMethod = getSubmitMethod(this.endpoint, opts)
100
+ if (this.opts.getPayload) {
101
+ // Ajax & PVT & SR features provide a callback function to get data for harvesting
102
+ submitMethod = submitData.getSubmitMethod({ isFinalHarvest: opts?.unload })
94
103
  if (!submitMethod) return false
95
104
 
96
- const retry = submitMethod.method === submitData.xhr
97
- var payload = this.opts.getPayload({ retry: retry })
105
+ const retry = !opts?.unload && submitMethod === submitData.xhr
106
+ payload = this.opts.getPayload({ retry: retry })
98
107
 
99
108
  if (!payload) {
100
109
  if (this.started) {
@@ -134,16 +143,8 @@ export class HarvestScheduler extends SharedContext {
134
143
  if (this.started) {
135
144
  this.scheduleHarvest()
136
145
  }
137
- return
138
146
 
139
- /**
140
- * This is executed immediately after harvest sends the data via XHR, or if there's nothing to send. Note that this excludes on unloading / sendBeacon.
141
- * @param {Object} result
142
- */
143
- function cbRanAfterSend (result) {
144
- if (opts?.forceNoRetry) result.retry = false // discard unsent data rather than re-queuing for next harvest attempt
145
- scheduler.onHarvestFinished(opts, result)
146
- }
147
+ return
147
148
  }
148
149
 
149
150
  onHarvestFinished (opts, result) {
@@ -152,7 +153,7 @@ export class HarvestScheduler extends SharedContext {
152
153
  }
153
154
 
154
155
  if (result.sent && result.retry) {
155
- var delay = result.delay || this.opts.retryDelay
156
+ const delay = result.delay || this.opts.retryDelay
156
157
  // reschedule next harvest if should be delayed longer
157
158
  if (this.started && delay) {
158
159
  clearTimeout(this.timeoutHandle)