@newrelic/browser-agent 1.263.0 → 1.265.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 (478) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +2 -2
  3. package/dist/cjs/cdn/experimental.js +3 -7
  4. package/dist/cjs/cdn/pro.js +2 -2
  5. package/dist/cjs/cdn/spa.js +2 -2
  6. package/dist/cjs/common/aggregate/aggregator.js +2 -3
  7. package/dist/cjs/common/config/{state/configurable.js → configurable.js} +1 -1
  8. package/dist/cjs/common/config/{state/info.js → info.js} +1 -1
  9. package/dist/cjs/common/config/{state/init.js → init.js} +11 -8
  10. package/dist/cjs/common/config/{state/loader-config.js → loader-config.js} +1 -1
  11. package/dist/cjs/common/config/{state/runtime.js → runtime.js} +16 -5
  12. package/dist/cjs/common/constants/agent-constants.js +8 -0
  13. package/dist/cjs/common/constants/env.cdn.js +1 -1
  14. package/dist/cjs/common/constants/env.npm.js +1 -1
  15. package/dist/cjs/common/constants/runtime.js +1 -3
  16. package/dist/cjs/common/context/shared-context.js +1 -2
  17. package/dist/cjs/common/dispatch/global-event.js +1 -2
  18. package/dist/cjs/common/drain/drain.js +12 -18
  19. package/dist/cjs/common/event-emitter/contextual-ee.js +3 -4
  20. package/dist/cjs/common/event-listener/event-listener-opts.js +2 -6
  21. package/dist/cjs/common/harvest/harvest-scheduler.js +1 -2
  22. package/dist/cjs/common/harvest/harvest.js +30 -57
  23. package/dist/cjs/common/serialize/bel-serializer.js +6 -11
  24. package/dist/cjs/common/session/session-entity.js +10 -13
  25. package/dist/cjs/common/timing/nav-timing.js +1 -3
  26. package/dist/cjs/common/timing/time-keeper.js +16 -6
  27. package/dist/cjs/common/url/encode.js +3 -7
  28. package/dist/cjs/common/util/console.js +2 -0
  29. package/dist/cjs/common/util/invoke.js +6 -16
  30. package/dist/cjs/common/util/obfuscate.js +97 -53
  31. package/dist/cjs/common/util/submit-data.js +17 -21
  32. package/dist/cjs/common/util/text.js +9 -0
  33. package/dist/cjs/common/util/traverse.js +1 -3
  34. package/dist/cjs/common/vitals/cumulative-layout-shift.js +5 -6
  35. package/dist/cjs/common/vitals/first-contentful-paint.js +4 -5
  36. package/dist/cjs/common/vitals/first-input-delay.js +4 -5
  37. package/dist/cjs/common/vitals/interaction-to-next-paint.js +5 -6
  38. package/dist/cjs/common/vitals/largest-contentful-paint.js +4 -5
  39. package/dist/cjs/common/vitals/time-to-first-byte.js +4 -5
  40. package/dist/cjs/common/vitals/vital-metric.js +5 -7
  41. package/dist/cjs/common/window/nreum.js +2 -1
  42. package/dist/cjs/common/window/page-visibility.js +1 -4
  43. package/dist/cjs/common/wrap/wrap-events.js +1 -4
  44. package/dist/cjs/common/wrap/wrap-promise.js +1 -4
  45. package/dist/cjs/common/wrap/wrap-websocket.js +74 -0
  46. package/dist/cjs/features/ajax/aggregate/chunk.js +4 -3
  47. package/dist/cjs/features/ajax/aggregate/gql.js +4 -5
  48. package/dist/cjs/features/ajax/aggregate/index.js +19 -22
  49. package/dist/cjs/features/ajax/constants.js +2 -3
  50. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +9 -8
  51. package/dist/cjs/features/ajax/instrument/index.js +14 -12
  52. package/dist/cjs/features/generic_events/aggregate/index.js +128 -0
  53. package/dist/cjs/features/generic_events/constants.js +10 -0
  54. package/dist/cjs/features/generic_events/index.js +12 -0
  55. package/dist/cjs/features/generic_events/instrument/index.js +27 -0
  56. package/dist/cjs/features/jserrors/aggregate/index.js +25 -44
  57. package/dist/cjs/features/jserrors/instrument/index.js +4 -4
  58. package/dist/cjs/features/logging/aggregate/index.js +33 -36
  59. package/dist/cjs/features/logging/constants.js +2 -3
  60. package/dist/cjs/features/logging/instrument/index.js +5 -6
  61. package/dist/cjs/features/logging/shared/log.js +1 -3
  62. package/dist/cjs/features/logging/shared/utils.js +2 -4
  63. package/dist/cjs/features/metrics/aggregate/index.js +34 -17
  64. package/dist/cjs/features/metrics/aggregate/websocket-detection.js +34 -0
  65. package/dist/cjs/features/metrics/constants.js +4 -2
  66. package/dist/cjs/features/metrics/instrument/index.js +12 -4
  67. package/dist/cjs/features/page_action/instrument/index.js +14 -10
  68. package/dist/cjs/features/page_view_event/aggregate/index.js +19 -39
  69. package/dist/cjs/features/page_view_event/aggregate/initialized-features.js +1 -1
  70. package/dist/cjs/features/page_view_event/instrument/index.js +4 -4
  71. package/dist/cjs/features/page_view_timing/aggregate/index.js +23 -39
  72. package/dist/cjs/features/page_view_timing/instrument/index.js +4 -4
  73. package/dist/cjs/features/session_replay/aggregate/index.js +35 -42
  74. package/dist/cjs/features/session_replay/constants.js +1 -5
  75. package/dist/cjs/features/session_replay/instrument/index.js +5 -9
  76. package/dist/cjs/features/session_replay/shared/recorder-events.js +25 -20
  77. package/dist/cjs/features/session_replay/shared/recorder.js +17 -13
  78. package/dist/cjs/features/session_replay/shared/stylesheet-evaluator.js +2 -2
  79. package/dist/cjs/features/session_replay/shared/utils.js +5 -4
  80. package/dist/cjs/features/session_trace/aggregate/index.js +25 -42
  81. package/dist/cjs/features/session_trace/aggregate/trace/storage.js +5 -3
  82. package/dist/cjs/features/session_trace/instrument/index.js +8 -7
  83. package/dist/cjs/features/soft_navigations/aggregate/ajax-node.js +1 -1
  84. package/dist/cjs/features/soft_navigations/aggregate/index.js +22 -30
  85. package/dist/cjs/features/soft_navigations/aggregate/initial-page-load-interaction.js +2 -2
  86. package/dist/cjs/features/soft_navigations/aggregate/interaction.js +4 -5
  87. package/dist/cjs/features/soft_navigations/instrument/index.js +14 -13
  88. package/dist/cjs/features/spa/aggregate/index.js +17 -28
  89. package/dist/cjs/features/spa/aggregate/interaction.js +7 -6
  90. package/dist/cjs/features/spa/aggregate/serializer.js +4 -5
  91. package/dist/cjs/features/spa/constants.js +2 -2
  92. package/dist/cjs/features/spa/instrument/index.js +20 -19
  93. package/dist/cjs/features/utils/agent-session.js +6 -4
  94. package/dist/cjs/features/utils/aggregate-base.js +17 -10
  95. package/dist/cjs/features/utils/event-buffer.js +132 -0
  96. package/dist/cjs/features/utils/feature-gates.js +2 -2
  97. package/dist/cjs/features/utils/instrument-base.js +7 -8
  98. package/dist/cjs/features/utils/lazy-feature-loader.js +12 -12
  99. package/dist/cjs/features/utils/nr1-debugger.js +1 -3
  100. package/dist/cjs/index.js +21 -0
  101. package/dist/cjs/loaders/agent-base.js +4 -12
  102. package/dist/cjs/loaders/agent.js +7 -2
  103. package/dist/cjs/loaders/api/api.js +23 -35
  104. package/dist/cjs/loaders/api/apiAsync.js +10 -13
  105. package/dist/cjs/loaders/browser-agent.js +4 -3
  106. package/dist/cjs/loaders/configure/configure.js +16 -15
  107. package/dist/cjs/loaders/features/enabled-features.js +2 -2
  108. package/dist/cjs/loaders/features/features.js +8 -4
  109. package/dist/cjs/loaders/micro-agent.js +16 -15
  110. package/dist/esm/cdn/experimental.js +2 -5
  111. package/dist/esm/cdn/pro.js +2 -2
  112. package/dist/esm/cdn/spa.js +2 -2
  113. package/dist/esm/common/aggregate/aggregator.js +2 -3
  114. package/dist/esm/common/config/{state/configurable.js → configurable.js} +1 -1
  115. package/dist/esm/common/config/{state/info.js → info.js} +1 -1
  116. package/dist/esm/common/config/{state/init.js → init.js} +11 -8
  117. package/dist/esm/common/config/{state/loader-config.js → loader-config.js} +1 -1
  118. package/dist/esm/common/config/{state/runtime.js → runtime.js} +17 -5
  119. package/dist/esm/common/constants/agent-constants.js +2 -0
  120. package/dist/esm/common/constants/env.cdn.js +1 -1
  121. package/dist/esm/common/constants/env.npm.js +1 -1
  122. package/dist/esm/common/constants/runtime.js +0 -2
  123. package/dist/esm/common/context/shared-context.js +1 -2
  124. package/dist/esm/common/dispatch/global-event.js +1 -2
  125. package/dist/esm/common/drain/drain.js +12 -18
  126. package/dist/esm/common/event-emitter/contextual-ee.js +2 -3
  127. package/dist/esm/common/event-listener/event-listener-opts.js +2 -6
  128. package/dist/esm/common/harvest/harvest-scheduler.js +1 -2
  129. package/dist/esm/common/harvest/harvest.js +24 -51
  130. package/dist/esm/common/serialize/bel-serializer.js +6 -11
  131. package/dist/esm/common/session/session-entity.js +10 -13
  132. package/dist/esm/common/timing/nav-timing.js +1 -3
  133. package/dist/esm/common/timing/time-keeper.js +15 -5
  134. package/dist/esm/common/url/encode.js +3 -7
  135. package/dist/esm/common/util/console.js +2 -0
  136. package/dist/esm/common/util/invoke.js +6 -16
  137. package/dist/esm/common/util/obfuscate.js +96 -49
  138. package/dist/esm/common/util/submit-data.js +17 -21
  139. package/dist/esm/common/util/text.js +3 -0
  140. package/dist/esm/common/util/traverse.js +1 -3
  141. package/dist/esm/common/vitals/cumulative-layout-shift.js +5 -6
  142. package/dist/esm/common/vitals/first-contentful-paint.js +4 -5
  143. package/dist/esm/common/vitals/first-input-delay.js +4 -5
  144. package/dist/esm/common/vitals/interaction-to-next-paint.js +5 -6
  145. package/dist/esm/common/vitals/largest-contentful-paint.js +4 -5
  146. package/dist/esm/common/vitals/time-to-first-byte.js +4 -5
  147. package/dist/esm/common/vitals/vital-metric.js +5 -7
  148. package/dist/esm/common/window/nreum.js +2 -1
  149. package/dist/esm/common/window/page-visibility.js +1 -4
  150. package/dist/esm/common/wrap/wrap-events.js +1 -4
  151. package/dist/esm/common/wrap/wrap-promise.js +1 -4
  152. package/dist/esm/common/wrap/wrap-websocket.js +67 -0
  153. package/dist/esm/features/ajax/aggregate/chunk.js +3 -2
  154. package/dist/esm/features/ajax/aggregate/gql.js +4 -5
  155. package/dist/esm/features/ajax/aggregate/index.js +16 -19
  156. package/dist/esm/features/ajax/constants.js +1 -2
  157. package/dist/esm/features/ajax/instrument/distributed-tracing.js +2 -1
  158. package/dist/esm/features/ajax/instrument/index.js +10 -8
  159. package/dist/esm/features/generic_events/aggregate/index.js +120 -0
  160. package/dist/esm/features/generic_events/constants.js +4 -0
  161. package/dist/esm/features/generic_events/index.js +1 -0
  162. package/dist/esm/features/generic_events/instrument/index.js +20 -0
  163. package/dist/esm/features/jserrors/aggregate/index.js +20 -39
  164. package/dist/esm/features/jserrors/instrument/index.js +3 -3
  165. package/dist/esm/features/logging/aggregate/index.js +31 -34
  166. package/dist/esm/features/logging/constants.js +1 -2
  167. package/dist/esm/features/logging/instrument/index.js +4 -5
  168. package/dist/esm/features/logging/shared/log.js +1 -3
  169. package/dist/esm/features/logging/shared/utils.js +2 -4
  170. package/dist/esm/features/metrics/aggregate/index.js +28 -11
  171. package/dist/esm/features/metrics/aggregate/websocket-detection.js +29 -0
  172. package/dist/esm/features/metrics/constants.js +3 -1
  173. package/dist/esm/features/metrics/instrument/index.js +12 -4
  174. package/dist/esm/features/page_action/instrument/index.js +14 -9
  175. package/dist/esm/features/page_view_event/aggregate/index.js +17 -37
  176. package/dist/esm/features/page_view_event/aggregate/initialized-features.js +1 -1
  177. package/dist/esm/features/page_view_event/instrument/index.js +3 -3
  178. package/dist/esm/features/page_view_timing/aggregate/index.js +20 -36
  179. package/dist/esm/features/page_view_timing/instrument/index.js +3 -3
  180. package/dist/esm/features/session_replay/aggregate/index.js +25 -32
  181. package/dist/esm/features/session_replay/constants.js +0 -4
  182. package/dist/esm/features/session_replay/index.js +1 -7
  183. package/dist/esm/features/session_replay/instrument/index.js +5 -8
  184. package/dist/esm/features/session_replay/shared/recorder-events.js +25 -20
  185. package/dist/esm/features/session_replay/shared/recorder.js +14 -10
  186. package/dist/esm/features/session_replay/shared/stylesheet-evaluator.js +2 -2
  187. package/dist/esm/features/session_replay/shared/utils.js +3 -2
  188. package/dist/esm/features/session_trace/aggregate/index.js +20 -37
  189. package/dist/esm/features/session_trace/aggregate/trace/storage.js +5 -3
  190. package/dist/esm/features/session_trace/instrument/index.js +5 -4
  191. package/dist/esm/features/soft_navigations/aggregate/ajax-node.js +1 -1
  192. package/dist/esm/features/soft_navigations/aggregate/index.js +21 -29
  193. package/dist/esm/features/soft_navigations/aggregate/initial-page-load-interaction.js +1 -1
  194. package/dist/esm/features/soft_navigations/aggregate/interaction.js +2 -3
  195. package/dist/esm/features/soft_navigations/instrument/index.js +11 -10
  196. package/dist/esm/features/spa/aggregate/index.js +11 -22
  197. package/dist/esm/features/spa/aggregate/interaction.js +6 -5
  198. package/dist/esm/features/spa/aggregate/serializer.js +2 -3
  199. package/dist/esm/features/spa/constants.js +2 -2
  200. package/dist/esm/features/spa/instrument/index.js +12 -11
  201. package/dist/esm/features/utils/agent-session.js +3 -1
  202. package/dist/esm/features/utils/aggregate-base.js +16 -9
  203. package/dist/esm/features/utils/event-buffer.js +126 -0
  204. package/dist/esm/features/utils/feature-gates.js +1 -1
  205. package/dist/esm/features/utils/instrument-base.js +6 -7
  206. package/dist/esm/features/utils/lazy-feature-loader.js +12 -12
  207. package/dist/esm/features/utils/nr1-debugger.js +1 -3
  208. package/dist/esm/index.js +3 -0
  209. package/dist/esm/loaders/agent-base.js +4 -12
  210. package/dist/esm/loaders/agent.js +7 -2
  211. package/dist/esm/loaders/api/api.js +18 -30
  212. package/dist/esm/loaders/api/apiAsync.js +3 -6
  213. package/dist/esm/loaders/browser-agent.js +3 -2
  214. package/dist/esm/loaders/configure/configure.js +9 -8
  215. package/dist/esm/loaders/features/enabled-features.js +1 -1
  216. package/dist/esm/loaders/features/features.js +8 -4
  217. package/dist/esm/loaders/micro-agent.js +11 -10
  218. package/dist/types/common/aggregate/aggregator.d.ts.map +1 -1
  219. package/dist/types/common/config/configurable.d.ts.map +1 -0
  220. package/dist/types/common/config/info.d.ts.map +1 -0
  221. package/dist/types/common/config/init.d.ts.map +1 -0
  222. package/dist/types/common/config/loader-config.d.ts.map +1 -0
  223. package/dist/types/common/config/runtime.d.ts.map +1 -0
  224. package/dist/types/common/constants/agent-constants.d.ts +3 -0
  225. package/dist/types/common/constants/agent-constants.d.ts.map +1 -0
  226. package/dist/types/common/constants/runtime.d.ts +0 -1
  227. package/dist/types/common/constants/runtime.d.ts.map +1 -1
  228. package/dist/types/common/harvest/harvest.d.ts +1 -7
  229. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  230. package/dist/types/common/serialize/bel-serializer.d.ts.map +1 -1
  231. package/dist/types/common/timing/time-keeper.d.ts +9 -2
  232. package/dist/types/common/timing/time-keeper.d.ts.map +1 -1
  233. package/dist/types/common/url/encode.d.ts.map +1 -1
  234. package/dist/types/common/util/console.d.ts.map +1 -1
  235. package/dist/types/common/util/obfuscate.d.ts +78 -6
  236. package/dist/types/common/util/obfuscate.d.ts.map +1 -1
  237. package/dist/types/common/util/submit-data.d.ts.map +1 -1
  238. package/dist/types/common/util/text.d.ts +2 -0
  239. package/dist/types/common/util/text.d.ts.map +1 -0
  240. package/dist/types/common/window/nreum.d.ts.map +1 -1
  241. package/dist/types/common/wrap/wrap-websocket.d.ts +4 -0
  242. package/dist/types/common/wrap/wrap-websocket.d.ts.map +1 -0
  243. package/dist/types/features/ajax/aggregate/chunk.d.ts.map +1 -1
  244. package/dist/types/features/ajax/aggregate/index.d.ts +2 -3
  245. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
  246. package/dist/types/features/ajax/constants.d.ts +0 -1
  247. package/dist/types/features/ajax/constants.d.ts.map +1 -1
  248. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts.map +1 -1
  249. package/dist/types/features/ajax/instrument/index.d.ts +1 -0
  250. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
  251. package/dist/types/features/{page_action → generic_events}/aggregate/index.d.ts +10 -10
  252. package/dist/types/features/generic_events/aggregate/index.d.ts.map +1 -0
  253. package/dist/types/features/generic_events/constants.d.ts +4 -0
  254. package/dist/types/features/generic_events/constants.d.ts.map +1 -0
  255. package/dist/types/features/generic_events/index.d.ts +2 -0
  256. package/dist/types/features/generic_events/index.d.ts.map +1 -0
  257. package/dist/types/features/generic_events/instrument/index.d.ts +7 -0
  258. package/dist/types/features/generic_events/instrument/index.d.ts.map +1 -0
  259. package/dist/types/features/jserrors/aggregate/index.d.ts +2 -2
  260. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  261. package/dist/types/features/jserrors/instrument/index.d.ts +1 -0
  262. package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -1
  263. package/dist/types/features/logging/aggregate/index.d.ts +4 -7
  264. package/dist/types/features/logging/aggregate/index.d.ts.map +1 -1
  265. package/dist/types/features/logging/constants.d.ts +0 -1
  266. package/dist/types/features/logging/constants.d.ts.map +1 -1
  267. package/dist/types/features/logging/instrument/index.d.ts +1 -0
  268. package/dist/types/features/logging/instrument/index.d.ts.map +1 -1
  269. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
  270. package/dist/types/features/metrics/aggregate/websocket-detection.d.ts +12 -0
  271. package/dist/types/features/metrics/aggregate/websocket-detection.d.ts.map +1 -0
  272. package/dist/types/features/metrics/constants.d.ts +1 -0
  273. package/dist/types/features/metrics/constants.d.ts.map +1 -1
  274. package/dist/types/features/metrics/instrument/index.d.ts +1 -0
  275. package/dist/types/features/metrics/instrument/index.d.ts.map +1 -1
  276. package/dist/types/features/page_action/instrument/index.d.ts +9 -4
  277. package/dist/types/features/page_action/instrument/index.d.ts.map +1 -1
  278. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  279. package/dist/types/features/page_view_event/instrument/index.d.ts +1 -0
  280. package/dist/types/features/page_view_event/instrument/index.d.ts.map +1 -1
  281. package/dist/types/features/page_view_timing/aggregate/index.d.ts +2 -2
  282. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  283. package/dist/types/features/page_view_timing/instrument/index.d.ts +1 -0
  284. package/dist/types/features/page_view_timing/instrument/index.d.ts.map +1 -1
  285. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
  286. package/dist/types/features/session_replay/constants.d.ts +0 -4
  287. package/dist/types/features/session_replay/constants.d.ts.map +1 -1
  288. package/dist/types/features/session_replay/instrument/index.d.ts +1 -0
  289. package/dist/types/features/session_replay/instrument/index.d.ts.map +1 -1
  290. package/dist/types/features/session_replay/shared/recorder-events.d.ts +6 -6
  291. package/dist/types/features/session_replay/shared/recorder-events.d.ts.map +1 -1
  292. package/dist/types/features/session_replay/shared/recorder.d.ts +2 -2
  293. package/dist/types/features/session_replay/shared/recorder.d.ts.map +1 -1
  294. package/dist/types/features/session_replay/shared/utils.d.ts.map +1 -1
  295. package/dist/types/features/session_trace/aggregate/index.d.ts +2 -2
  296. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  297. package/dist/types/features/session_trace/aggregate/trace/storage.d.ts +1 -1
  298. package/dist/types/features/session_trace/aggregate/trace/storage.d.ts.map +1 -1
  299. package/dist/types/features/session_trace/instrument/index.d.ts +1 -0
  300. package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
  301. package/dist/types/features/soft_navigations/aggregate/index.d.ts +3 -3
  302. package/dist/types/features/soft_navigations/aggregate/index.d.ts.map +1 -1
  303. package/dist/types/features/soft_navigations/instrument/index.d.ts +1 -0
  304. package/dist/types/features/soft_navigations/instrument/index.d.ts.map +1 -1
  305. package/dist/types/features/spa/aggregate/index.d.ts +2 -2
  306. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
  307. package/dist/types/features/spa/aggregate/interaction.d.ts.map +1 -1
  308. package/dist/types/features/spa/aggregate/serializer.d.ts.map +1 -1
  309. package/dist/types/features/spa/constants.d.ts.map +1 -1
  310. package/dist/types/features/spa/instrument/index.d.ts +1 -0
  311. package/dist/types/features/spa/instrument/index.d.ts.map +1 -1
  312. package/dist/types/features/utils/agent-session.d.ts.map +1 -1
  313. package/dist/types/features/utils/aggregate-base.d.ts +1 -0
  314. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
  315. package/dist/types/features/utils/event-buffer.d.ts +72 -0
  316. package/dist/types/features/utils/event-buffer.d.ts.map +1 -0
  317. package/dist/types/features/utils/instrument-base.d.ts +1 -0
  318. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  319. package/dist/types/index.d.ts +3 -0
  320. package/dist/types/loaders/agent-base.d.ts +1 -2
  321. package/dist/types/loaders/agent-base.d.ts.map +1 -1
  322. package/dist/types/loaders/agent.d.ts.map +1 -1
  323. package/dist/types/loaders/api/api.d.ts.map +1 -1
  324. package/dist/types/loaders/browser-agent.d.ts.map +1 -1
  325. package/dist/types/loaders/configure/configure.d.ts.map +1 -1
  326. package/dist/types/loaders/features/features.d.ts +1 -0
  327. package/dist/types/loaders/features/features.d.ts.map +1 -1
  328. package/dist/types/loaders/micro-agent.d.ts.map +1 -1
  329. package/package.json +67 -52
  330. package/src/cdn/experimental.js +2 -4
  331. package/src/cdn/pro.js +2 -2
  332. package/src/cdn/spa.js +2 -2
  333. package/src/common/aggregate/aggregator.js +2 -3
  334. package/src/common/config/__mocks__/info.js +3 -0
  335. package/src/common/config/__mocks__/init.js +3 -0
  336. package/src/common/config/__mocks__/loader-config.js +2 -0
  337. package/src/common/config/__mocks__/runtime.js +2 -0
  338. package/src/common/config/{state/configurable.js → configurable.js} +1 -1
  339. package/src/common/config/{state/info.js → info.js} +1 -1
  340. package/src/common/config/{state/init.js → init.js} +7 -6
  341. package/src/common/config/{state/loader-config.js → loader-config.js} +1 -1
  342. package/src/common/config/{state/runtime.js → runtime.js} +19 -5
  343. package/src/common/constants/agent-constants.js +2 -0
  344. package/src/common/constants/runtime.js +0 -2
  345. package/src/common/drain/drain.js +8 -6
  346. package/src/common/event-emitter/contextual-ee.js +1 -1
  347. package/src/common/harvest/harvest.js +10 -24
  348. package/src/common/serialize/bel-serializer.js +6 -9
  349. package/src/common/session/session-entity.js +4 -4
  350. package/src/common/timing/__mocks__/time-keeper.js +6 -2
  351. package/src/common/timing/time-keeper.js +15 -5
  352. package/src/common/url/encode.js +2 -3
  353. package/src/common/util/__mocks__/console.js +1 -0
  354. package/src/common/util/__mocks__/obfuscate.js +5 -8
  355. package/src/common/util/console.js +2 -0
  356. package/src/common/util/obfuscate.js +94 -50
  357. package/src/common/util/submit-data.js +0 -1
  358. package/src/common/util/text.js +6 -0
  359. package/src/common/window/__mocks__/nreum.js +1 -1
  360. package/src/common/window/nreum.js +2 -1
  361. package/src/common/wrap/wrap-websocket.js +73 -0
  362. package/src/features/ajax/aggregate/chunk.js +3 -2
  363. package/src/features/ajax/aggregate/index.js +20 -19
  364. package/src/features/ajax/constants.js +0 -2
  365. package/src/features/ajax/instrument/distributed-tracing.js +2 -1
  366. package/src/features/ajax/instrument/index.js +9 -5
  367. package/src/features/generic_events/aggregate/index.js +139 -0
  368. package/src/features/generic_events/constants.js +5 -0
  369. package/src/features/generic_events/index.js +1 -0
  370. package/src/features/generic_events/instrument/index.js +24 -0
  371. package/src/features/jserrors/aggregate/index.js +18 -9
  372. package/src/features/jserrors/instrument/index.js +2 -0
  373. package/src/features/logging/aggregate/index.js +39 -31
  374. package/src/features/logging/constants.js +0 -2
  375. package/src/features/logging/instrument/index.js +2 -0
  376. package/src/features/logging/shared/utils.js +1 -1
  377. package/src/features/metrics/aggregate/index.js +24 -9
  378. package/src/features/metrics/aggregate/websocket-detection.js +31 -0
  379. package/src/features/metrics/constants.js +3 -0
  380. package/src/features/metrics/instrument/index.js +13 -1
  381. package/src/features/page_action/instrument/index.js +11 -6
  382. package/src/features/page_view_event/aggregate/index.js +8 -23
  383. package/src/features/page_view_event/aggregate/initialized-features.js +1 -1
  384. package/src/features/page_view_event/instrument/index.js +2 -0
  385. package/src/features/page_view_timing/aggregate/index.js +15 -18
  386. package/src/features/page_view_timing/instrument/index.js +2 -0
  387. package/src/features/session_replay/aggregate/index.js +13 -9
  388. package/src/features/session_replay/constants.js +0 -4
  389. package/src/features/session_replay/index.js +1 -7
  390. package/src/features/session_replay/instrument/index.js +3 -4
  391. package/src/features/session_replay/shared/recorder-events.js +27 -20
  392. package/src/features/session_replay/shared/recorder.js +13 -6
  393. package/src/features/session_replay/shared/stylesheet-evaluator.js +2 -2
  394. package/src/features/session_replay/shared/utils.js +3 -2
  395. package/src/features/session_trace/aggregate/index.js +16 -7
  396. package/src/features/session_trace/aggregate/trace/storage.js +6 -1
  397. package/src/features/session_trace/instrument/index.js +4 -1
  398. package/src/features/soft_navigations/aggregate/ajax-node.js +1 -1
  399. package/src/features/soft_navigations/aggregate/index.js +13 -15
  400. package/src/features/soft_navigations/aggregate/initial-page-load-interaction.js +1 -1
  401. package/src/features/soft_navigations/aggregate/interaction.js +1 -1
  402. package/src/features/soft_navigations/instrument/index.js +9 -5
  403. package/src/features/spa/aggregate/index.js +12 -20
  404. package/src/features/spa/aggregate/interaction.js +6 -5
  405. package/src/features/spa/aggregate/serializer.js +2 -3
  406. package/src/features/spa/constants.js +2 -2
  407. package/src/features/spa/instrument/index.js +9 -3
  408. package/src/features/utils/agent-session.js +3 -1
  409. package/src/features/utils/aggregate-base.js +13 -3
  410. package/src/features/utils/event-buffer.js +126 -0
  411. package/src/features/utils/feature-gates.js +1 -1
  412. package/src/features/utils/instrument-base.js +2 -1
  413. package/src/features/utils/lazy-feature-loader.js +2 -2
  414. package/src/index.js +3 -0
  415. package/src/loaders/agent-base.js +2 -6
  416. package/src/loaders/agent.js +7 -2
  417. package/src/loaders/api/api.js +3 -2
  418. package/src/loaders/api/apiAsync.js +2 -2
  419. package/src/loaders/browser-agent.js +5 -3
  420. package/src/loaders/configure/configure.js +9 -2
  421. package/src/loaders/features/enabled-features.js +1 -1
  422. package/src/loaders/features/features.js +8 -4
  423. package/src/loaders/micro-agent.js +5 -2
  424. package/dist/cjs/cdn/polyfills/lite.js +0 -16
  425. package/dist/cjs/cdn/polyfills/pro.js +0 -21
  426. package/dist/cjs/cdn/polyfills/spa.js +0 -22
  427. package/dist/cjs/cdn/polyfills.js +0 -24
  428. package/dist/cjs/common/config/config.js +0 -76
  429. package/dist/cjs/common/config/state/originals.js +0 -8
  430. package/dist/cjs/common/util/map-own.js +0 -31
  431. package/dist/cjs/common/wrap/index.js +0 -61
  432. package/dist/cjs/features/page_action/aggregate/index.js +0 -121
  433. package/dist/esm/cdn/polyfills/lite.js +0 -14
  434. package/dist/esm/cdn/polyfills/pro.js +0 -19
  435. package/dist/esm/cdn/polyfills/spa.js +0 -20
  436. package/dist/esm/cdn/polyfills.js +0 -27
  437. package/dist/esm/common/config/config.js +0 -11
  438. package/dist/esm/common/config/state/originals.js +0 -2
  439. package/dist/esm/common/util/map-own.js +0 -24
  440. package/dist/esm/common/wrap/index.js +0 -13
  441. package/dist/esm/features/page_action/aggregate/index.js +0 -114
  442. package/dist/types/cdn/polyfills/lite.d.ts +0 -2
  443. package/dist/types/cdn/polyfills/lite.d.ts.map +0 -1
  444. package/dist/types/cdn/polyfills/pro.d.ts +0 -2
  445. package/dist/types/cdn/polyfills/pro.d.ts.map +0 -1
  446. package/dist/types/cdn/polyfills/spa.d.ts +0 -2
  447. package/dist/types/cdn/polyfills/spa.d.ts.map +0 -1
  448. package/dist/types/cdn/polyfills.d.ts +0 -2
  449. package/dist/types/cdn/polyfills.d.ts.map +0 -1
  450. package/dist/types/common/config/config.d.ts +0 -13
  451. package/dist/types/common/config/config.d.ts.map +0 -1
  452. package/dist/types/common/config/state/configurable.d.ts.map +0 -1
  453. package/dist/types/common/config/state/info.d.ts.map +0 -1
  454. package/dist/types/common/config/state/init.d.ts.map +0 -1
  455. package/dist/types/common/config/state/loader-config.d.ts.map +0 -1
  456. package/dist/types/common/config/state/originals.d.ts +0 -2
  457. package/dist/types/common/config/state/originals.d.ts.map +0 -1
  458. package/dist/types/common/config/state/runtime.d.ts.map +0 -1
  459. package/dist/types/common/util/map-own.d.ts +0 -3
  460. package/dist/types/common/util/map-own.d.ts.map +0 -1
  461. package/dist/types/common/wrap/index.d.ts +0 -10
  462. package/dist/types/common/wrap/index.d.ts.map +0 -1
  463. package/dist/types/features/page_action/aggregate/index.d.ts.map +0 -1
  464. package/src/cdn/polyfills/lite.js +0 -20
  465. package/src/cdn/polyfills/pro.js +0 -30
  466. package/src/cdn/polyfills/spa.js +0 -32
  467. package/src/cdn/polyfills.js +0 -27
  468. package/src/common/config/__mocks__/config.js +0 -11
  469. package/src/common/config/config.js +0 -12
  470. package/src/common/config/state/originals.js +0 -3
  471. package/src/common/util/map-own.js +0 -22
  472. package/src/common/wrap/index.js +0 -16
  473. package/src/features/page_action/aggregate/index.js +0 -114
  474. /package/dist/types/common/config/{state/configurable.d.ts → configurable.d.ts} +0 -0
  475. /package/dist/types/common/config/{state/info.d.ts → info.d.ts} +0 -0
  476. /package/dist/types/common/config/{state/init.d.ts → init.d.ts} +0 -0
  477. /package/dist/types/common/config/{state/loader-config.d.ts → loader-config.d.ts} +0 -0
  478. /package/dist/types/common/config/{state/runtime.d.ts → runtime.d.ts} +0 -0
@@ -7,9 +7,8 @@ exports.addCustomAttributes = addCustomAttributes;
7
7
  exports.getAddStringContext = getAddStringContext;
8
8
  exports.nullable = nullable;
9
9
  exports.numeric = numeric;
10
- var _mapOwn = require("../util/map-own");
11
10
  var _stringify = require("../util/stringify");
12
- var _obfuscate = require("../util/obfuscate");
11
+ var _runtime = require("../config/runtime");
13
12
  /*
14
13
  * Copyright 2020 New Relic Corporation. All rights reserved.
15
14
  * SPDX-License-Identifier: Apache-2.0
@@ -27,17 +26,13 @@ function numeric(n, noDefault) {
27
26
  return n === undefined || n === 0 ? '' : Math.floor(n).toString(36);
28
27
  }
29
28
  function getAddStringContext(agentIdentifier) {
30
- // eslint-disable-next-line
31
- var stringTable = Object.hasOwnProperty('create') ? Object.create(null) : {};
32
- var stringTableIdx = 0;
29
+ let stringTableIdx = 0;
30
+ const stringTable = Object.prototype.hasOwnProperty.call(Object, 'create') ? Object.create(null) : {};
31
+ const obfuscator = (0, _runtime.getRuntime)(agentIdentifier).obfuscator;
33
32
  return addString;
34
33
  function addString(str) {
35
34
  if (typeof str === 'undefined' || str === '') return '';
36
- var obfuscator = new _obfuscate.Obfuscator({
37
- agentIdentifier
38
- });
39
- str = String(str);
40
- if (obfuscator.shouldObfuscate()) str = obfuscator.obfuscateString(str);
35
+ str = obfuscator.obfuscateString(String(str));
41
36
  if (hasOwnProp.call(stringTable, str)) {
42
37
  return numeric(stringTable[str], true);
43
38
  } else {
@@ -48,7 +43,7 @@ function getAddStringContext(agentIdentifier) {
48
43
  }
49
44
  function addCustomAttributes(attrs, addString) {
50
45
  var attrParts = [];
51
- (0, _mapOwn.mapOwn)(attrs, function (key, val) {
46
+ Object.entries(attrs || {}).forEach(([key, val]) => {
52
47
  if (attrParts.length >= MAX_ATTRIBUTES) return;
53
48
  var type = 5;
54
49
  var serializedValue;
@@ -12,8 +12,8 @@ var _timer = require("../timer/timer");
12
12
  var _runtime = require("../constants/runtime");
13
13
  var _constants = require("./constants");
14
14
  var _interactionTimer = require("../timer/interaction-timer");
15
- var _wrap = require("../wrap");
16
- var _configurable = require("../config/state/configurable");
15
+ var _wrapEvents = require("../wrap/wrap-events");
16
+ var _configurable = require("../config/configurable");
17
17
  var _handle = require("../event-emitter/handle");
18
18
  var _constants2 = require("../../features/metrics/constants");
19
19
  var _features = require("../../loaders/features/features");
@@ -56,7 +56,7 @@ class SessionEntity {
56
56
  // key is intended to act as the k=v pair
57
57
  this.key = key;
58
58
  this.ee = _contextualEe.ee.get(agentIdentifier);
59
- (0, _wrap.wrapEvents)(this.ee);
59
+ (0, _wrapEvents.wrapEvents)(this.ee);
60
60
  this.setup(opts);
61
61
 
62
62
  /**
@@ -64,7 +64,7 @@ class SessionEntity {
64
64
  * if the event was spawned on the current page or an adjacent page, and the behavior tied
65
65
  * to storage events is critical to apply only to cross-tab behavior
66
66
  * */
67
- if (_runtime.isBrowserScope && !_runtime.isIE) {
67
+ if (_runtime.isBrowserScope) {
68
68
  (0, _eventListenerOpts.windowAddEventListener)('storage', event => {
69
69
  if (event.key === this.lookupKey) {
70
70
  const obj = typeof event.newValue === 'string' ? JSON.parse(event.newValue) : event.newValue;
@@ -74,12 +74,11 @@ class SessionEntity {
74
74
  });
75
75
  }
76
76
  }
77
- setup(_ref) {
78
- let {
79
- value = (0, _uniqueId.generateRandomHexString)(16),
80
- expiresMs = _constants.DEFAULT_EXPIRES_MS,
81
- inactiveMs = _constants.DEFAULT_INACTIVE_MS
82
- } = _ref;
77
+ setup({
78
+ value = (0, _uniqueId.generateRandomHexString)(16),
79
+ expiresMs = _constants.DEFAULT_EXPIRES_MS,
80
+ inactiveMs = _constants.DEFAULT_INACTIVE_MS
81
+ }) {
83
82
  /** Ensure that certain properties are preserved across a reset if already set */
84
83
  const persistentAttributes = {
85
84
  serverTimeDiff: this.state.serverTimeDiff || model.serverTimeDiff
@@ -287,9 +286,7 @@ class SessionEntity {
287
286
  if (type === 'inactive') tag = 'Session/Inactive/Seen';
288
287
  if (tag) (0, _handle.handle)(_constants2.SUPPORTABILITY_METRIC_CHANNEL, [tag, value], undefined, _features.FEATURE_NAMES.metrics, this.ee);
289
288
  }
290
- getDuration() {
291
- let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state;
292
- let useUpdatedAt = arguments.length > 1 ? arguments[1] : undefined;
289
+ getDuration(data = this.state, useUpdatedAt) {
293
290
  const startingTimestamp = data.expiresAt - this.expiresMs;
294
291
  const endingTimestamp = !useUpdatedAt ? data.updatedAt : Date.now();
295
292
  return endingTimestamp - startingTimestamp;
@@ -43,9 +43,7 @@ function getPntType(type) {
43
43
  };
44
44
  return types[type];
45
45
  }
46
- function addPT(offset, pt) {
47
- let v = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
48
- let isL1Api = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
46
+ function addPT(offset, pt, v = {}, isL1Api = false) {
49
47
  if (!pt) return;
50
48
  v.of = offset;
51
49
  handleValue(v.of, v, 'n', true);
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.TimeKeeper = void 0;
7
7
  var _runtime = require("../constants/runtime");
8
- var _config = require("../config/config");
8
+ var _runtime2 = require("../config/runtime");
9
9
  const rfc2616Regex = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), ([0-3][0-9]) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-9]{4}) ([01][0-9]|2[0-3])(:[0-5][0-9]){2} GMT$/;
10
10
 
11
11
  /**
@@ -40,7 +40,7 @@ class TimeKeeper {
40
40
  */
41
41
  #ready = false;
42
42
  constructor(agentIdentifier) {
43
- this.#session = (0, _config.getRuntime)(agentIdentifier)?.session;
43
+ this.#session = (0, _runtime2.getRuntime)(agentIdentifier)?.session;
44
44
  this.processStoredDiff();
45
45
  }
46
46
  get ready() {
@@ -87,21 +87,31 @@ class TimeKeeper {
87
87
 
88
88
  /**
89
89
  * Converts a page origin relative time to an absolute timestamp
90
- * corrected to NR server time.
90
+ * using the user's local clock.
91
91
  * @param relativeTime {number} The relative time of the event in milliseconds
92
92
  * @returns {number} Corrected unix/epoch timestamp
93
93
  */
94
94
  convertRelativeTimestamp(relativeTime) {
95
- return Math.floor(this.#correctedOriginTime + relativeTime);
95
+ return _runtime.originTime + relativeTime;
96
96
  }
97
97
 
98
98
  /**
99
- * Corrects an event timestamp to NR server time.
99
+ * Converts an absolute timestamp to a relative timestamp using the
100
+ * user's local clock.
101
+ * @param timestamp
102
+ * @returns {number}
103
+ */
104
+ convertAbsoluteTimestamp(timestamp) {
105
+ return timestamp - _runtime.originTime;
106
+ }
107
+
108
+ /**
109
+ * Corrects an absolute timestamp to NR server time.
100
110
  * @param timestamp {number} The unix/epoch timestamp of the event with milliseconds
101
111
  * @return {number} Corrected unix/epoch timestamp
102
112
  */
103
113
  correctAbsoluteTimestamp(timestamp) {
104
- return Math.floor(timestamp - this.#localTimeDiff);
114
+ return timestamp - this.#localTimeDiff;
105
115
  }
106
116
 
107
117
  /** Process the session entity and use the info to set the main time calculations if present */
@@ -7,7 +7,6 @@ exports.fromArray = fromArray;
7
7
  exports.obj = obj;
8
8
  exports.param = param;
9
9
  exports.qs = qs;
10
- var _mapOwn = require("../util/map-own");
11
10
  var _stringify = require("../util/stringify");
12
11
  /*
13
12
  * Copyright 2020 New Relic Corporation. All rights reserved.
@@ -23,9 +22,7 @@ var charMap = {
23
22
  '%24': '$',
24
23
  '%3B': ';'
25
24
  };
26
- var charList = (0, _mapOwn.mapOwn)(charMap, function (k) {
27
- return k;
28
- });
25
+ var charList = Object.keys(charMap);
29
26
  var safeEncoded = new RegExp(charList.join('|'), 'g');
30
27
  function real(c) {
31
28
  return charMap[c];
@@ -48,7 +45,7 @@ function fromArray(qs, maxBytes) {
48
45
  function obj(payload, maxBytes) {
49
46
  var total = 0;
50
47
  var result = '';
51
- (0, _mapOwn.mapOwn)(payload, function (feature, dataArray) {
48
+ Object.entries(payload || {}).forEach(([feature, dataArray]) => {
52
49
  var intermediate = [];
53
50
  var next;
54
51
  var i;
@@ -71,8 +68,7 @@ function obj(payload, maxBytes) {
71
68
  }
72
69
 
73
70
  // Constructs an HTTP parameter to add to the BAM router URL
74
- function param(name, value) {
75
- let base = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
71
+ function param(name, value, base = {}) {
76
72
  if (Object.keys(base).includes(name)) return ''; // we assume if feature supplied a matching qp to the base, we should honor what the feature sent over the default
77
73
  if (value && typeof value === 'string') {
78
74
  return '&' + name + '=' + qs(value);
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.warn = warn;
7
+ /* eslint no-console: ["error", { allow: ["debug"] }] */
8
+
7
9
  /**
8
10
  * A helper method to warn to the console with New Relic: decoration
9
11
  * @param {string} message The primary message to warn
@@ -27,18 +27,12 @@ exports.single = single;
27
27
  * @returns {function} A wrapping function that will ensure the provided function
28
28
  * is invoked only once within the given timeout.
29
29
  */
30
- function debounce(func) {
31
- var _this = this;
32
- let timeout = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 500;
33
- let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
30
+ function debounce(func, timeout = 500, options = {}) {
34
31
  const leading = options?.leading || false;
35
32
  let timer;
36
- return function () {
37
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
38
- args[_key] = arguments[_key];
39
- }
33
+ return (...args) => {
40
34
  if (leading && timer === undefined) {
41
- func.apply(_this, args);
35
+ func.apply(this, args);
42
36
  timer = setTimeout(() => {
43
37
  timer = clearTimeout(timer);
44
38
  }, timeout);
@@ -46,7 +40,7 @@ function debounce(func) {
46
40
  if (!leading) {
47
41
  clearTimeout(timer);
48
42
  timer = setTimeout(() => {
49
- func.apply(_this, args);
43
+ func.apply(this, args);
50
44
  }, timeout);
51
45
  }
52
46
  };
@@ -61,15 +55,11 @@ function debounce(func) {
61
55
  * is invoked only once.
62
56
  */
63
57
  function single(func) {
64
- var _this2 = this;
65
58
  let called = false;
66
- return function () {
59
+ return (...args) => {
67
60
  if (!called) {
68
61
  called = true;
69
- for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
70
- args[_key2] = arguments[_key2];
71
- }
72
- func.apply(_this2, args);
62
+ func.apply(this, args);
73
63
  }
74
64
  };
75
65
  }
@@ -4,67 +4,111 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Obfuscator = void 0;
7
- exports.getRules = getRules;
8
- exports.validateRules = validateRules;
9
- var _config = require("../config/config");
10
- var _sharedContext = require("../context/shared-context");
7
+ var _init = require("../config/init");
11
8
  var _protocol = require("../url/protocol");
12
9
  var _console = require("./console");
13
- var fileProtocolRule = {
14
- regex: /^file:\/\/(.*)/,
15
- replacement: atob('ZmlsZTovL09CRlVTQ0FURUQ=')
16
- };
17
- class Obfuscator extends _sharedContext.SharedContext {
18
- shouldObfuscate() {
19
- return getRules(this.sharedContext.agentIdentifier).length > 0;
10
+ /**
11
+ * Represents an obfuscation rule that can be applied to harvested payloads
12
+ * @typedef {object} ObfuscationRule
13
+ * @property {string|RegExp} regex The regular expression to match against in the payload
14
+ * @property {string} [replacement] The string to replace the matched regex with
15
+ */
16
+
17
+ /**
18
+ * Represents an obfuscation rule validation state
19
+ * @typedef {object} ObfuscationRuleValidation
20
+ * @property {ObfuscationRule} rule The original rule validated
21
+ * @property {boolean} isValid Whether the rule is valid
22
+ * @property {object} errors Validation errors
23
+ * @property {boolean} errors.regexMissingDetected Whether the regex is missing
24
+ * @property {boolean} errors.invalidRegexDetected Whether the regex is invalid
25
+ * @property {boolean} errors.invalidReplacementDetected Whether the replacement is invalid
26
+ */
27
+
28
+ class Obfuscator {
29
+ /**
30
+ * @type {ObfuscationRuleValidation[]}
31
+ */
32
+ #ruleValidationCache;
33
+ constructor(agentIdentifier) {
34
+ this.#ruleValidationCache = Obfuscator.getRuleValidationCache(agentIdentifier);
35
+ Obfuscator.logObfuscationRuleErrors(this.#ruleValidationCache);
36
+ }
37
+ get ruleValidationCache() {
38
+ return this.#ruleValidationCache;
20
39
  }
21
40
 
22
- // applies all regex obfuscation rules to provided URL string and returns the result
23
- obfuscateString(string) {
24
- // if string is empty string, null or not a string, return unmodified
25
- if (!string || typeof string !== 'string') return string;
26
- var rules = getRules(this.sharedContext.agentIdentifier);
27
- var obfuscated = string;
41
+ /**
42
+ * Applies all valid obfuscation rules to the provided input string
43
+ * @param {string} input String to obfuscate
44
+ * @returns {string}
45
+ */
46
+ obfuscateString(input) {
47
+ // if input is not of type string or is an empty string, short-circuit
48
+ if (typeof input !== 'string' || input.trim().length === 0) return input;
49
+ return this.#ruleValidationCache.filter(ruleValidation => ruleValidation.isValid).reduce((input, ruleValidation) => {
50
+ const {
51
+ rule
52
+ } = ruleValidation;
53
+ return input.replace(rule.regex, rule.replacement || '*');
54
+ }, input);
55
+ }
28
56
 
29
- // apply every rule to URL string
30
- for (var i = 0; i < rules.length; i++) {
31
- var regex = rules[i].regex;
32
- var replacement = rules[i].replacement || '*';
33
- obfuscated = obfuscated.replace(regex, replacement);
57
+ /**
58
+ * Returns an array of obfuscation rules to be applied to harvested payloads
59
+ * @param {string} agentIdentifier The agent identifier to get rules for
60
+ * @returns {ObfuscationRuleValidation[]} The array of rules or validation states
61
+ */
62
+ static getRuleValidationCache(agentIdentifier) {
63
+ /**
64
+ * @type {ObfuscationRule[]}
65
+ */
66
+ let rules = (0, _init.getConfigurationValue)(agentIdentifier, 'obfuscate') || [];
67
+ if ((0, _protocol.isFileProtocol)()) {
68
+ rules.push({
69
+ regex: /^file:\/\/(.*)/,
70
+ replacement: atob('ZmlsZTovL09CRlVTQ0FURUQ=')
71
+ });
34
72
  }
35
- return obfuscated;
73
+ return rules.map(rule => Obfuscator.validateObfuscationRule(rule));
36
74
  }
37
- }
38
75
 
39
- // TO DO: this function should be inside the Obfuscator class since its context relates to agentID
40
- exports.Obfuscator = Obfuscator;
41
- function getRules(agentIdentifier) {
42
- var rules = [];
43
- var configRules = (0, _config.getConfigurationValue)(agentIdentifier, 'obfuscate') || [];
44
- rules = rules.concat(configRules);
45
- if ((0, _protocol.isFileProtocol)()) rules.push(fileProtocolRule);
46
- // could add additional runtime/environment-specific rules here
47
-
48
- return rules;
49
- }
76
+ /**
77
+ * Validates an obfuscation rule and provides errors if any are found.
78
+ * @param {ObfuscationRule} rule The rule to validate
79
+ * @returns {ObfuscationRuleValidation} The validation state of the rule
80
+ */
81
+ static validateObfuscationRule(rule) {
82
+ const regexMissingDetected = Boolean(rule.regex === undefined);
83
+ const invalidRegexDetected = Boolean(rule.regex !== undefined && typeof rule.regex !== 'string' && !(rule.regex instanceof RegExp));
84
+ const invalidReplacementDetected = Boolean(rule.replacement && typeof rule.replacement !== 'string');
85
+ return {
86
+ rule,
87
+ isValid: !regexMissingDetected && !invalidRegexDetected && !invalidReplacementDetected,
88
+ errors: {
89
+ regexMissingDetected,
90
+ invalidRegexDetected,
91
+ invalidReplacementDetected
92
+ }
93
+ };
94
+ }
50
95
 
51
- // takes array of rule objects, logs warning and returns false if any portion of rule is invalid
52
- function validateRules(rules) {
53
- var invalidReplacementDetected = false;
54
- var invalidRegexDetected = false;
55
- for (var i = 0; i < rules.length; i++) {
56
- if (!('regex' in rules[i])) {
57
- (0, _console.warn)(12);
58
- invalidRegexDetected = true;
59
- } else if (typeof rules[i].regex !== 'string' && !(rules[i].regex instanceof RegExp)) {
60
- (0, _console.warn)(13);
61
- invalidRegexDetected = true;
62
- }
63
- var replacement = rules[i].replacement;
64
- if (replacement && typeof replacement !== 'string') {
65
- (0, _console.warn)(14);
66
- invalidReplacementDetected = true;
96
+ /**
97
+ * Logs any obfuscation rule errors to the console. This is called when an obfuscator
98
+ * instance is created.
99
+ * @param {ObfuscationRuleValidation[]} ruleValidationCache The cache of rule validation states
100
+ */
101
+ static logObfuscationRuleErrors(ruleValidationCache) {
102
+ for (const ruleValidation of ruleValidationCache) {
103
+ const {
104
+ rule,
105
+ isValid,
106
+ errors
107
+ } = ruleValidation;
108
+ if (isValid) continue;
109
+ if (errors.regexMissingDetected) (0, _console.warn)(12, rule);else if (errors.invalidRegexDetected) (0, _console.warn)(13, rule);
110
+ if (errors.invalidReplacementDetected) (0, _console.warn)(14, rule);
67
111
  }
68
112
  }
69
- return !invalidReplacementDetected && !invalidRegexDetected;
70
- }
113
+ }
114
+ exports.Obfuscator = Obfuscator;
@@ -23,14 +23,12 @@ var _runtime = require("../constants/runtime");
23
23
  * @param {boolean} opts.isFinalHarvest Indicates if the data submission is due to
24
24
  * a final harvest within the agent.
25
25
  */
26
- function getSubmitMethod() {
27
- let {
28
- isFinalHarvest = false
29
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
26
+ function getSubmitMethod({
27
+ isFinalHarvest = false
28
+ } = {}) {
30
29
  return isFinalHarvest && _runtime.isBrowserScope && _runtime.supportsSendBeacon
31
30
  // Use sendBeacon for final harvest
32
31
  ? beacon
33
- // Only IE does not support sendBeacon for final harvest
34
32
  // If not final harvest, or not browserScope, always use xhr post
35
33
  : xhr;
36
34
  }
@@ -45,17 +43,16 @@ function getSubmitMethod() {
45
43
  * @param {{key: string, value: string}[]} [args.headers] - The headers to attach.
46
44
  * @returns {XMLHttpRequest}
47
45
  */
48
- function xhr(_ref) {
49
- let {
50
- url,
51
- body = null,
52
- sync,
53
- method = 'POST',
54
- headers = [{
55
- key: 'content-type',
56
- value: 'text/plain'
57
- }]
58
- } = _ref;
46
+ function xhr({
47
+ url,
48
+ body = null,
49
+ sync,
50
+ method = 'POST',
51
+ headers = [{
52
+ key: 'content-type',
53
+ value: 'text/plain'
54
+ }]
55
+ }) {
59
56
  const request = new XMLHttpRequest();
60
57
  request.open(method, url, !sync);
61
58
  try {
@@ -78,11 +75,10 @@ function xhr(_ref) {
78
75
  * @param {string=} args.body - The Stringified body
79
76
  * @returns {boolean}
80
77
  */
81
- function beacon(_ref2) {
82
- let {
83
- url,
84
- body
85
- } = _ref2;
78
+ function beacon({
79
+ url,
80
+ body
81
+ }) {
86
82
  try {
87
83
  // Navigator has to be bound to ensure it does not error in some browsers
88
84
  // https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.toTitleCase = toTitleCase;
7
+ function toTitleCase(str, regex = /\w*/g) {
8
+ return str.replace(regex, text => text.charAt(0).toUpperCase() + text.substring(1).toLowerCase());
9
+ }
@@ -18,9 +18,7 @@ exports.applyFnToProps = applyFnToProps;
18
18
  * @param {Array<string>} [ignoreKeys=[]] - The keys of properties to ignore and not modify.
19
19
  * @returns {Object} - The object with function recursively applied.
20
20
  */
21
- function applyFnToProps(obj, fn) {
22
- let type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'string';
23
- let ignoreKeys = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
21
+ function applyFnToProps(obj, fn, type = 'string', ignoreKeys = []) {
24
22
  if (!obj || typeof obj !== 'object') return obj;
25
23
  Object.keys(obj).forEach(property => {
26
24
  if (typeof obj[property] === 'object') {
@@ -10,12 +10,11 @@ var _vitalMetric = require("./vital-metric");
10
10
  var _runtime = require("../constants/runtime");
11
11
  const cumulativeLayoutShift = exports.cumulativeLayoutShift = new _vitalMetric.VitalMetric(_constants.VITAL_NAMES.CUMULATIVE_LAYOUT_SHIFT, x => x);
12
12
  if (_runtime.isBrowserScope) {
13
- (0, _attribution.onCLS)(_ref => {
14
- let {
15
- value,
16
- attribution,
17
- id
18
- } = _ref;
13
+ (0, _attribution.onCLS)(({
14
+ value,
15
+ attribution,
16
+ id
17
+ }) => {
19
18
  const attrs = {
20
19
  metricId: id,
21
20
  largestShiftTarget: attribution.largestShiftTarget,
@@ -32,11 +32,10 @@ if (_runtime.isBrowserScope) {
32
32
  // ignore
33
33
  }
34
34
  } else {
35
- (0, _attribution.onFCP)(_ref => {
36
- let {
37
- value,
38
- attribution
39
- } = _ref;
35
+ (0, _attribution.onFCP)(({
36
+ value,
37
+ attribution
38
+ }) => {
40
39
  if (_runtime.initiallyHidden || firstContentfulPaint.isValid) return;
41
40
  const attrs = {
42
41
  timeToFirstByte: attribution.timeToFirstByte,
@@ -10,11 +10,10 @@ var _constants = require("./constants");
10
10
  var _runtime = require("../constants/runtime");
11
11
  const firstInputDelay = exports.firstInputDelay = new _vitalMetric.VitalMetric(_constants.VITAL_NAMES.FIRST_INPUT_DELAY);
12
12
  if (_runtime.isBrowserScope) {
13
- (0, _attribution.onFID)(_ref => {
14
- let {
15
- value,
16
- attribution
17
- } = _ref;
13
+ (0, _attribution.onFID)(({
14
+ value,
15
+ attribution
16
+ }) => {
18
17
  if (_runtime.initiallyHidden || firstInputDelay.isValid) return;
19
18
  const attrs = {
20
19
  type: attribution.eventType,
@@ -11,12 +11,11 @@ var _runtime = require("../constants/runtime");
11
11
  const interactionToNextPaint = exports.interactionToNextPaint = new _vitalMetric.VitalMetric(_constants.VITAL_NAMES.INTERACTION_TO_NEXT_PAINT);
12
12
  if (_runtime.isBrowserScope) {
13
13
  /* Interaction-to-Next-Paint */
14
- (0, _attribution.onINP)(_ref => {
15
- let {
16
- value,
17
- attribution,
18
- id
19
- } = _ref;
14
+ (0, _attribution.onINP)(({
15
+ value,
16
+ attribution,
17
+ id
18
+ }) => {
20
19
  const attrs = {
21
20
  metricId: id,
22
21
  eventTarget: attribution.eventTarget,
@@ -11,11 +11,10 @@ var _runtime = require("../constants/runtime");
11
11
  var _cleanUrl = require("../url/clean-url");
12
12
  const largestContentfulPaint = exports.largestContentfulPaint = new _vitalMetric.VitalMetric(_constants.VITAL_NAMES.LARGEST_CONTENTFUL_PAINT);
13
13
  if (_runtime.isBrowserScope) {
14
- (0, _attribution.onLCP)(_ref => {
15
- let {
16
- value,
17
- attribution
18
- } = _ref;
14
+ (0, _attribution.onLCP)(({
15
+ value,
16
+ attribution
17
+ }) => {
19
18
  /* Largest Contentful Paint - As of WV v3, it still imperfectly tries to detect document vis state asap and isn't supposed to report if page starts hidden. */
20
19
  if (_runtime.initiallyHidden || largestContentfulPaint.isValid) return;
21
20
  let attrs;
@@ -18,11 +18,10 @@ const timeToFirstByte = exports.timeToFirstByte = new _vitalMetric.VitalMetric(_
18
18
  * - cross-origin iframes specifically in firefox and safari
19
19
  */
20
20
  if (_runtime.isBrowserScope && typeof PerformanceNavigationTiming !== 'undefined' && !_runtime.isiOS && window === window.parent) {
21
- (0, _attribution.onTTFB)(_ref => {
22
- let {
23
- value,
24
- attribution
25
- } = _ref;
21
+ (0, _attribution.onTTFB)(({
22
+ value,
23
+ attribution
24
+ }) => {
26
25
  if (timeToFirstByte.isValid) return;
27
26
  timeToFirstByte.update({
28
27
  value,
@@ -12,11 +12,10 @@ class VitalMetric {
12
12
  this.attrs = {};
13
13
  this.roundingMethod = typeof roundingMethod === 'function' ? roundingMethod : Math.floor;
14
14
  }
15
- update(_ref) {
16
- let {
17
- value,
18
- attrs = {}
19
- } = _ref;
15
+ update({
16
+ value,
17
+ attrs = {}
18
+ }) {
20
19
  if (value === undefined || value === null || value < 0) return;
21
20
  const state = {
22
21
  value: this.roundingMethod(value),
@@ -42,8 +41,7 @@ class VitalMetric {
42
41
  get isValid() {
43
42
  return this.current.value >= 0;
44
43
  }
45
- subscribe(callback) {
46
- let buffered = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
44
+ subscribe(callback, buffered = true) {
47
45
  if (typeof callback !== 'function') return;
48
46
  this.#subscribers.add(callback);
49
47
  // emit full history on subscription ("buffered" behavior)
@@ -66,7 +66,8 @@ function gosNREUMOriginals() {
66
66
  PR: _runtime.globalScope.Promise,
67
67
  MO: _runtime.globalScope.MutationObserver,
68
68
  // this'll be undefined if not in a web window
69
- FETCH: _runtime.globalScope.fetch
69
+ FETCH: _runtime.globalScope.fetch,
70
+ WS: _runtime.globalScope.WebSocket
70
71
  };
71
72
  }
72
73
  return nr;