@newrelic/browser-agent 1.264.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 (407) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/cjs/common/aggregate/aggregator.js +1 -2
  3. package/dist/cjs/common/config/{state/configurable.js → configurable.js} +1 -1
  4. package/dist/cjs/common/config/{state/info.js → info.js} +1 -1
  5. package/dist/cjs/common/config/{state/init.js → init.js} +5 -5
  6. package/dist/cjs/common/config/{state/loader-config.js → loader-config.js} +1 -1
  7. package/dist/cjs/common/config/{state/runtime.js → runtime.js} +16 -5
  8. package/dist/cjs/common/constants/agent-constants.js +8 -0
  9. package/dist/cjs/common/constants/env.cdn.js +1 -1
  10. package/dist/cjs/common/constants/env.npm.js +1 -1
  11. package/dist/cjs/common/context/shared-context.js +1 -2
  12. package/dist/cjs/common/dispatch/global-event.js +1 -2
  13. package/dist/cjs/common/drain/drain.js +10 -16
  14. package/dist/cjs/common/event-emitter/contextual-ee.js +3 -4
  15. package/dist/cjs/common/event-listener/event-listener-opts.js +2 -6
  16. package/dist/cjs/common/harvest/harvest-scheduler.js +1 -2
  17. package/dist/cjs/common/harvest/harvest.js +29 -56
  18. package/dist/cjs/common/serialize/bel-serializer.js +6 -11
  19. package/dist/cjs/common/session/session-entity.js +9 -12
  20. package/dist/cjs/common/timing/nav-timing.js +1 -3
  21. package/dist/cjs/common/timing/time-keeper.js +16 -6
  22. package/dist/cjs/common/url/encode.js +2 -4
  23. package/dist/cjs/common/util/console.js +2 -0
  24. package/dist/cjs/common/util/invoke.js +6 -16
  25. package/dist/cjs/common/util/obfuscate.js +97 -53
  26. package/dist/cjs/common/util/submit-data.js +17 -20
  27. package/dist/cjs/common/util/text.js +9 -0
  28. package/dist/cjs/common/util/traverse.js +1 -3
  29. package/dist/cjs/common/vitals/cumulative-layout-shift.js +5 -6
  30. package/dist/cjs/common/vitals/first-contentful-paint.js +4 -5
  31. package/dist/cjs/common/vitals/first-input-delay.js +4 -5
  32. package/dist/cjs/common/vitals/interaction-to-next-paint.js +5 -6
  33. package/dist/cjs/common/vitals/largest-contentful-paint.js +4 -5
  34. package/dist/cjs/common/vitals/time-to-first-byte.js +4 -5
  35. package/dist/cjs/common/vitals/vital-metric.js +6 -8
  36. package/dist/cjs/common/window/nreum.js +2 -1
  37. package/dist/cjs/common/window/page-visibility.js +1 -4
  38. package/dist/cjs/common/wrap/wrap-events.js +1 -4
  39. package/dist/cjs/common/wrap/wrap-promise.js +1 -4
  40. package/dist/cjs/common/wrap/wrap-websocket.js +74 -0
  41. package/dist/cjs/features/ajax/aggregate/chunk.js +4 -3
  42. package/dist/cjs/features/ajax/aggregate/gql.js +4 -5
  43. package/dist/cjs/features/ajax/aggregate/index.js +20 -23
  44. package/dist/cjs/features/ajax/constants.js +2 -3
  45. package/dist/cjs/features/ajax/instrument/distributed-tracing.js +9 -8
  46. package/dist/cjs/features/ajax/instrument/index.js +15 -13
  47. package/dist/cjs/features/generic_events/aggregate/index.js +49 -58
  48. package/dist/cjs/features/generic_events/constants.js +4 -2
  49. package/dist/cjs/features/generic_events/instrument/index.js +7 -7
  50. package/dist/cjs/features/jserrors/aggregate/index.js +24 -44
  51. package/dist/cjs/features/jserrors/instrument/index.js +5 -5
  52. package/dist/cjs/features/logging/aggregate/index.js +34 -37
  53. package/dist/cjs/features/logging/constants.js +2 -3
  54. package/dist/cjs/features/logging/instrument/index.js +6 -7
  55. package/dist/cjs/features/logging/shared/log.js +1 -3
  56. package/dist/cjs/features/logging/shared/utils.js +2 -4
  57. package/dist/cjs/features/metrics/aggregate/index.js +35 -18
  58. package/dist/cjs/features/metrics/aggregate/websocket-detection.js +34 -0
  59. package/dist/cjs/features/metrics/constants.js +4 -2
  60. package/dist/cjs/features/metrics/instrument/index.js +13 -5
  61. package/dist/cjs/features/page_action/instrument/index.js +8 -4
  62. package/dist/cjs/features/page_view_event/aggregate/index.js +20 -40
  63. package/dist/cjs/features/page_view_event/instrument/index.js +5 -5
  64. package/dist/cjs/features/page_view_timing/aggregate/index.js +24 -40
  65. package/dist/cjs/features/page_view_timing/instrument/index.js +5 -5
  66. package/dist/cjs/features/session_replay/aggregate/index.js +37 -44
  67. package/dist/cjs/features/session_replay/constants.js +1 -5
  68. package/dist/cjs/features/session_replay/instrument/index.js +6 -10
  69. package/dist/cjs/features/session_replay/shared/recorder-events.js +25 -20
  70. package/dist/cjs/features/session_replay/shared/recorder.js +17 -13
  71. package/dist/cjs/features/session_replay/shared/stylesheet-evaluator.js +3 -3
  72. package/dist/cjs/features/session_replay/shared/utils.js +5 -4
  73. package/dist/cjs/features/session_trace/aggregate/index.js +26 -43
  74. package/dist/cjs/features/session_trace/aggregate/trace/storage.js +7 -5
  75. package/dist/cjs/features/session_trace/instrument/index.js +9 -8
  76. package/dist/cjs/features/soft_navigations/aggregate/ajax-node.js +1 -1
  77. package/dist/cjs/features/soft_navigations/aggregate/bel-node.js +1 -1
  78. package/dist/cjs/features/soft_navigations/aggregate/index.js +23 -31
  79. package/dist/cjs/features/soft_navigations/aggregate/initial-page-load-interaction.js +2 -2
  80. package/dist/cjs/features/soft_navigations/aggregate/interaction.js +9 -10
  81. package/dist/cjs/features/soft_navigations/instrument/index.js +15 -14
  82. package/dist/cjs/features/spa/aggregate/index.js +17 -27
  83. package/dist/cjs/features/spa/aggregate/interaction.js +7 -6
  84. package/dist/cjs/features/spa/aggregate/serializer.js +3 -3
  85. package/dist/cjs/features/spa/constants.js +2 -2
  86. package/dist/cjs/features/spa/instrument/index.js +21 -20
  87. package/dist/cjs/features/utils/agent-session.js +6 -4
  88. package/dist/cjs/features/utils/aggregate-base.js +15 -10
  89. package/dist/cjs/features/utils/event-buffer.js +132 -0
  90. package/dist/cjs/features/utils/feature-gates.js +2 -2
  91. package/dist/cjs/features/utils/instrument-base.js +7 -8
  92. package/dist/cjs/features/utils/lazy-feature-loader.js +11 -11
  93. package/dist/cjs/features/utils/nr1-debugger.js +1 -3
  94. package/dist/cjs/loaders/agent-base.js +4 -8
  95. package/dist/cjs/loaders/agent.js +7 -2
  96. package/dist/cjs/loaders/api/api.js +22 -34
  97. package/dist/cjs/loaders/api/apiAsync.js +9 -12
  98. package/dist/cjs/loaders/configure/configure.js +12 -12
  99. package/dist/cjs/loaders/features/enabled-features.js +2 -2
  100. package/dist/cjs/loaders/micro-agent.js +15 -14
  101. package/dist/esm/common/aggregate/aggregator.js +1 -2
  102. package/dist/esm/common/config/{state/configurable.js → configurable.js} +1 -1
  103. package/dist/esm/common/config/{state/info.js → info.js} +1 -1
  104. package/dist/esm/common/config/{state/init.js → init.js} +5 -5
  105. package/dist/esm/common/config/{state/loader-config.js → loader-config.js} +1 -1
  106. package/dist/esm/common/config/{state/runtime.js → runtime.js} +17 -5
  107. package/dist/esm/common/constants/agent-constants.js +2 -0
  108. package/dist/esm/common/constants/env.cdn.js +1 -1
  109. package/dist/esm/common/constants/env.npm.js +1 -1
  110. package/dist/esm/common/context/shared-context.js +1 -2
  111. package/dist/esm/common/dispatch/global-event.js +1 -2
  112. package/dist/esm/common/drain/drain.js +10 -16
  113. package/dist/esm/common/event-emitter/contextual-ee.js +2 -3
  114. package/dist/esm/common/event-listener/event-listener-opts.js +2 -6
  115. package/dist/esm/common/harvest/harvest-scheduler.js +1 -2
  116. package/dist/esm/common/harvest/harvest.js +21 -48
  117. package/dist/esm/common/serialize/bel-serializer.js +6 -11
  118. package/dist/esm/common/session/session-entity.js +8 -11
  119. package/dist/esm/common/timing/nav-timing.js +1 -3
  120. package/dist/esm/common/timing/time-keeper.js +15 -5
  121. package/dist/esm/common/url/encode.js +2 -4
  122. package/dist/esm/common/util/console.js +2 -0
  123. package/dist/esm/common/util/invoke.js +6 -16
  124. package/dist/esm/common/util/obfuscate.js +96 -49
  125. package/dist/esm/common/util/submit-data.js +17 -20
  126. package/dist/esm/common/util/text.js +3 -0
  127. package/dist/esm/common/util/traverse.js +1 -3
  128. package/dist/esm/common/vitals/cumulative-layout-shift.js +5 -6
  129. package/dist/esm/common/vitals/first-contentful-paint.js +4 -5
  130. package/dist/esm/common/vitals/first-input-delay.js +4 -5
  131. package/dist/esm/common/vitals/interaction-to-next-paint.js +5 -6
  132. package/dist/esm/common/vitals/largest-contentful-paint.js +4 -5
  133. package/dist/esm/common/vitals/time-to-first-byte.js +4 -5
  134. package/dist/esm/common/vitals/vital-metric.js +6 -8
  135. package/dist/esm/common/window/nreum.js +2 -1
  136. package/dist/esm/common/window/page-visibility.js +1 -4
  137. package/dist/esm/common/wrap/wrap-events.js +1 -4
  138. package/dist/esm/common/wrap/wrap-promise.js +1 -4
  139. package/dist/esm/common/wrap/wrap-websocket.js +67 -0
  140. package/dist/esm/features/ajax/aggregate/chunk.js +3 -2
  141. package/dist/esm/features/ajax/aggregate/gql.js +4 -5
  142. package/dist/esm/features/ajax/aggregate/index.js +17 -20
  143. package/dist/esm/features/ajax/constants.js +1 -2
  144. package/dist/esm/features/ajax/instrument/distributed-tracing.js +2 -1
  145. package/dist/esm/features/ajax/instrument/index.js +11 -9
  146. package/dist/esm/features/generic_events/aggregate/index.js +41 -50
  147. package/dist/esm/features/generic_events/constants.js +3 -1
  148. package/dist/esm/features/generic_events/instrument/index.js +5 -5
  149. package/dist/esm/features/jserrors/aggregate/index.js +19 -39
  150. package/dist/esm/features/jserrors/instrument/index.js +4 -4
  151. package/dist/esm/features/logging/aggregate/index.js +32 -35
  152. package/dist/esm/features/logging/constants.js +1 -2
  153. package/dist/esm/features/logging/instrument/index.js +5 -6
  154. package/dist/esm/features/logging/shared/log.js +1 -3
  155. package/dist/esm/features/logging/shared/utils.js +2 -4
  156. package/dist/esm/features/metrics/aggregate/index.js +29 -12
  157. package/dist/esm/features/metrics/aggregate/websocket-detection.js +29 -0
  158. package/dist/esm/features/metrics/constants.js +3 -1
  159. package/dist/esm/features/metrics/instrument/index.js +13 -5
  160. package/dist/esm/features/page_action/instrument/index.js +7 -3
  161. package/dist/esm/features/page_view_event/aggregate/index.js +18 -38
  162. package/dist/esm/features/page_view_event/instrument/index.js +4 -4
  163. package/dist/esm/features/page_view_timing/aggregate/index.js +21 -37
  164. package/dist/esm/features/page_view_timing/instrument/index.js +4 -4
  165. package/dist/esm/features/session_replay/aggregate/index.js +27 -34
  166. package/dist/esm/features/session_replay/constants.js +0 -4
  167. package/dist/esm/features/session_replay/index.js +1 -7
  168. package/dist/esm/features/session_replay/instrument/index.js +6 -9
  169. package/dist/esm/features/session_replay/shared/recorder-events.js +25 -20
  170. package/dist/esm/features/session_replay/shared/recorder.js +14 -10
  171. package/dist/esm/features/session_replay/shared/stylesheet-evaluator.js +3 -3
  172. package/dist/esm/features/session_replay/shared/utils.js +3 -2
  173. package/dist/esm/features/session_trace/aggregate/index.js +21 -38
  174. package/dist/esm/features/session_trace/aggregate/trace/storage.js +7 -5
  175. package/dist/esm/features/session_trace/instrument/index.js +6 -5
  176. package/dist/esm/features/soft_navigations/aggregate/ajax-node.js +1 -1
  177. package/dist/esm/features/soft_navigations/aggregate/bel-node.js +1 -1
  178. package/dist/esm/features/soft_navigations/aggregate/index.js +22 -30
  179. package/dist/esm/features/soft_navigations/aggregate/initial-page-load-interaction.js +1 -1
  180. package/dist/esm/features/soft_navigations/aggregate/interaction.js +7 -8
  181. package/dist/esm/features/soft_navigations/instrument/index.js +12 -11
  182. package/dist/esm/features/spa/aggregate/index.js +11 -21
  183. package/dist/esm/features/spa/aggregate/interaction.js +6 -5
  184. package/dist/esm/features/spa/aggregate/serializer.js +1 -1
  185. package/dist/esm/features/spa/constants.js +2 -2
  186. package/dist/esm/features/spa/instrument/index.js +13 -12
  187. package/dist/esm/features/utils/agent-session.js +3 -1
  188. package/dist/esm/features/utils/aggregate-base.js +13 -8
  189. package/dist/esm/features/utils/event-buffer.js +126 -0
  190. package/dist/esm/features/utils/feature-gates.js +1 -1
  191. package/dist/esm/features/utils/instrument-base.js +6 -7
  192. package/dist/esm/features/utils/lazy-feature-loader.js +11 -11
  193. package/dist/esm/features/utils/nr1-debugger.js +1 -3
  194. package/dist/esm/loaders/agent-base.js +4 -8
  195. package/dist/esm/loaders/agent.js +7 -2
  196. package/dist/esm/loaders/api/api.js +17 -29
  197. package/dist/esm/loaders/api/apiAsync.js +2 -5
  198. package/dist/esm/loaders/configure/configure.js +5 -5
  199. package/dist/esm/loaders/features/enabled-features.js +1 -1
  200. package/dist/esm/loaders/micro-agent.js +10 -9
  201. package/dist/types/common/config/configurable.d.ts.map +1 -0
  202. package/dist/types/common/config/info.d.ts.map +1 -0
  203. package/dist/types/common/config/init.d.ts.map +1 -0
  204. package/dist/types/common/config/loader-config.d.ts.map +1 -0
  205. package/dist/types/common/config/runtime.d.ts.map +1 -0
  206. package/dist/types/common/constants/agent-constants.d.ts +3 -0
  207. package/dist/types/common/constants/agent-constants.d.ts.map +1 -0
  208. package/dist/types/common/drain/drain.d.ts.map +1 -1
  209. package/dist/types/common/harvest/harvest.d.ts +1 -7
  210. package/dist/types/common/harvest/harvest.d.ts.map +1 -1
  211. package/dist/types/common/serialize/bel-serializer.d.ts.map +1 -1
  212. package/dist/types/common/timing/time-keeper.d.ts +9 -2
  213. package/dist/types/common/timing/time-keeper.d.ts.map +1 -1
  214. package/dist/types/common/util/console.d.ts.map +1 -1
  215. package/dist/types/common/util/obfuscate.d.ts +78 -6
  216. package/dist/types/common/util/obfuscate.d.ts.map +1 -1
  217. package/dist/types/common/util/text.d.ts +2 -0
  218. package/dist/types/common/util/text.d.ts.map +1 -0
  219. package/dist/types/common/window/nreum.d.ts.map +1 -1
  220. package/dist/types/common/wrap/wrap-websocket.d.ts +4 -0
  221. package/dist/types/common/wrap/wrap-websocket.d.ts.map +1 -0
  222. package/dist/types/features/ajax/aggregate/chunk.d.ts.map +1 -1
  223. package/dist/types/features/ajax/aggregate/index.d.ts +2 -3
  224. package/dist/types/features/ajax/aggregate/index.d.ts.map +1 -1
  225. package/dist/types/features/ajax/constants.d.ts +0 -1
  226. package/dist/types/features/ajax/constants.d.ts.map +1 -1
  227. package/dist/types/features/ajax/instrument/distributed-tracing.d.ts.map +1 -1
  228. package/dist/types/features/ajax/instrument/index.d.ts +1 -0
  229. package/dist/types/features/ajax/instrument/index.d.ts.map +1 -1
  230. package/dist/types/features/generic_events/aggregate/index.d.ts +6 -8
  231. package/dist/types/features/generic_events/aggregate/index.d.ts.map +1 -1
  232. package/dist/types/features/generic_events/constants.d.ts +2 -0
  233. package/dist/types/features/generic_events/constants.d.ts.map +1 -1
  234. package/dist/types/features/generic_events/instrument/index.d.ts +1 -0
  235. package/dist/types/features/generic_events/instrument/index.d.ts.map +1 -1
  236. package/dist/types/features/jserrors/aggregate/index.d.ts +2 -2
  237. package/dist/types/features/jserrors/aggregate/index.d.ts.map +1 -1
  238. package/dist/types/features/jserrors/instrument/index.d.ts +1 -0
  239. package/dist/types/features/jserrors/instrument/index.d.ts.map +1 -1
  240. package/dist/types/features/logging/aggregate/index.d.ts +4 -7
  241. package/dist/types/features/logging/aggregate/index.d.ts.map +1 -1
  242. package/dist/types/features/logging/constants.d.ts +0 -1
  243. package/dist/types/features/logging/constants.d.ts.map +1 -1
  244. package/dist/types/features/logging/instrument/index.d.ts +1 -0
  245. package/dist/types/features/logging/instrument/index.d.ts.map +1 -1
  246. package/dist/types/features/metrics/aggregate/index.d.ts.map +1 -1
  247. package/dist/types/features/metrics/aggregate/websocket-detection.d.ts +12 -0
  248. package/dist/types/features/metrics/aggregate/websocket-detection.d.ts.map +1 -0
  249. package/dist/types/features/metrics/constants.d.ts +1 -0
  250. package/dist/types/features/metrics/constants.d.ts.map +1 -1
  251. package/dist/types/features/metrics/instrument/index.d.ts +1 -0
  252. package/dist/types/features/metrics/instrument/index.d.ts.map +1 -1
  253. package/dist/types/features/page_action/instrument/index.d.ts +4 -0
  254. package/dist/types/features/page_action/instrument/index.d.ts.map +1 -1
  255. package/dist/types/features/page_view_event/aggregate/index.d.ts.map +1 -1
  256. package/dist/types/features/page_view_event/instrument/index.d.ts +1 -0
  257. package/dist/types/features/page_view_event/instrument/index.d.ts.map +1 -1
  258. package/dist/types/features/page_view_timing/aggregate/index.d.ts +2 -2
  259. package/dist/types/features/page_view_timing/aggregate/index.d.ts.map +1 -1
  260. package/dist/types/features/page_view_timing/instrument/index.d.ts +1 -0
  261. package/dist/types/features/page_view_timing/instrument/index.d.ts.map +1 -1
  262. package/dist/types/features/session_replay/aggregate/index.d.ts.map +1 -1
  263. package/dist/types/features/session_replay/constants.d.ts +0 -4
  264. package/dist/types/features/session_replay/constants.d.ts.map +1 -1
  265. package/dist/types/features/session_replay/instrument/index.d.ts +1 -0
  266. package/dist/types/features/session_replay/instrument/index.d.ts.map +1 -1
  267. package/dist/types/features/session_replay/shared/recorder-events.d.ts +6 -6
  268. package/dist/types/features/session_replay/shared/recorder-events.d.ts.map +1 -1
  269. package/dist/types/features/session_replay/shared/recorder.d.ts +2 -2
  270. package/dist/types/features/session_replay/shared/recorder.d.ts.map +1 -1
  271. package/dist/types/features/session_replay/shared/utils.d.ts.map +1 -1
  272. package/dist/types/features/session_trace/aggregate/index.d.ts +2 -2
  273. package/dist/types/features/session_trace/aggregate/index.d.ts.map +1 -1
  274. package/dist/types/features/session_trace/aggregate/trace/storage.d.ts +1 -1
  275. package/dist/types/features/session_trace/aggregate/trace/storage.d.ts.map +1 -1
  276. package/dist/types/features/session_trace/instrument/index.d.ts +1 -0
  277. package/dist/types/features/session_trace/instrument/index.d.ts.map +1 -1
  278. package/dist/types/features/soft_navigations/aggregate/index.d.ts +3 -3
  279. package/dist/types/features/soft_navigations/aggregate/index.d.ts.map +1 -1
  280. package/dist/types/features/soft_navigations/instrument/index.d.ts +1 -0
  281. package/dist/types/features/soft_navigations/instrument/index.d.ts.map +1 -1
  282. package/dist/types/features/spa/aggregate/index.d.ts +2 -2
  283. package/dist/types/features/spa/aggregate/index.d.ts.map +1 -1
  284. package/dist/types/features/spa/aggregate/interaction.d.ts.map +1 -1
  285. package/dist/types/features/spa/constants.d.ts.map +1 -1
  286. package/dist/types/features/spa/instrument/index.d.ts +1 -0
  287. package/dist/types/features/spa/instrument/index.d.ts.map +1 -1
  288. package/dist/types/features/utils/agent-session.d.ts.map +1 -1
  289. package/dist/types/features/utils/aggregate-base.d.ts +1 -0
  290. package/dist/types/features/utils/aggregate-base.d.ts.map +1 -1
  291. package/dist/types/features/utils/event-buffer.d.ts +72 -0
  292. package/dist/types/features/utils/event-buffer.d.ts.map +1 -0
  293. package/dist/types/features/utils/instrument-base.d.ts +1 -0
  294. package/dist/types/features/utils/instrument-base.d.ts.map +1 -1
  295. package/dist/types/loaders/agent-base.d.ts +1 -1
  296. package/dist/types/loaders/agent.d.ts.map +1 -1
  297. package/dist/types/loaders/api/api.d.ts.map +1 -1
  298. package/dist/types/loaders/configure/configure.d.ts.map +1 -1
  299. package/dist/types/loaders/micro-agent.d.ts.map +1 -1
  300. package/package.json +55 -59
  301. package/src/common/config/__mocks__/info.js +3 -0
  302. package/src/common/config/__mocks__/init.js +3 -0
  303. package/src/common/config/__mocks__/loader-config.js +2 -0
  304. package/src/common/config/__mocks__/runtime.js +2 -0
  305. package/src/common/config/{state/configurable.js → configurable.js} +1 -1
  306. package/src/common/config/{state/info.js → info.js} +1 -1
  307. package/src/common/config/{state/init.js → init.js} +5 -5
  308. package/src/common/config/{state/loader-config.js → loader-config.js} +1 -1
  309. package/src/common/config/{state/runtime.js → runtime.js} +19 -5
  310. package/src/common/constants/agent-constants.js +2 -0
  311. package/src/common/drain/drain.js +5 -2
  312. package/src/common/event-emitter/contextual-ee.js +1 -1
  313. package/src/common/harvest/harvest.js +7 -21
  314. package/src/common/serialize/bel-serializer.js +5 -7
  315. package/src/common/session/session-entity.js +2 -2
  316. package/src/common/timing/__mocks__/time-keeper.js +6 -2
  317. package/src/common/timing/time-keeper.js +15 -5
  318. package/src/common/util/__mocks__/console.js +1 -0
  319. package/src/common/util/__mocks__/obfuscate.js +5 -8
  320. package/src/common/util/console.js +2 -0
  321. package/src/common/util/obfuscate.js +94 -50
  322. package/src/common/util/text.js +6 -0
  323. package/src/common/window/__mocks__/nreum.js +1 -1
  324. package/src/common/window/nreum.js +2 -1
  325. package/src/common/wrap/wrap-websocket.js +73 -0
  326. package/src/features/ajax/aggregate/chunk.js +3 -2
  327. package/src/features/ajax/aggregate/index.js +20 -19
  328. package/src/features/ajax/constants.js +0 -2
  329. package/src/features/ajax/instrument/distributed-tracing.js +2 -1
  330. package/src/features/ajax/instrument/index.js +9 -5
  331. package/src/features/generic_events/aggregate/index.js +43 -37
  332. package/src/features/generic_events/constants.js +2 -0
  333. package/src/features/generic_events/instrument/index.js +3 -1
  334. package/src/features/jserrors/aggregate/index.js +14 -4
  335. package/src/features/jserrors/instrument/index.js +2 -0
  336. package/src/features/logging/aggregate/index.js +39 -31
  337. package/src/features/logging/constants.js +0 -2
  338. package/src/features/logging/instrument/index.js +2 -0
  339. package/src/features/logging/shared/utils.js +1 -1
  340. package/src/features/metrics/aggregate/index.js +24 -9
  341. package/src/features/metrics/aggregate/websocket-detection.js +31 -0
  342. package/src/features/metrics/constants.js +3 -0
  343. package/src/features/metrics/instrument/index.js +13 -1
  344. package/src/features/page_action/instrument/index.js +5 -0
  345. package/src/features/page_view_event/aggregate/index.js +8 -23
  346. package/src/features/page_view_event/instrument/index.js +2 -0
  347. package/src/features/page_view_timing/aggregate/index.js +14 -16
  348. package/src/features/page_view_timing/instrument/index.js +2 -0
  349. package/src/features/session_replay/aggregate/index.js +13 -9
  350. package/src/features/session_replay/constants.js +0 -4
  351. package/src/features/session_replay/index.js +1 -7
  352. package/src/features/session_replay/instrument/index.js +3 -4
  353. package/src/features/session_replay/shared/recorder-events.js +27 -20
  354. package/src/features/session_replay/shared/recorder.js +13 -6
  355. package/src/features/session_replay/shared/stylesheet-evaluator.js +2 -2
  356. package/src/features/session_replay/shared/utils.js +3 -2
  357. package/src/features/session_trace/aggregate/index.js +16 -7
  358. package/src/features/session_trace/aggregate/trace/storage.js +6 -1
  359. package/src/features/session_trace/instrument/index.js +4 -1
  360. package/src/features/soft_navigations/aggregate/ajax-node.js +1 -1
  361. package/src/features/soft_navigations/aggregate/index.js +13 -15
  362. package/src/features/soft_navigations/aggregate/initial-page-load-interaction.js +1 -1
  363. package/src/features/soft_navigations/aggregate/interaction.js +1 -1
  364. package/src/features/soft_navigations/instrument/index.js +9 -5
  365. package/src/features/spa/aggregate/index.js +11 -18
  366. package/src/features/spa/aggregate/interaction.js +5 -3
  367. package/src/features/spa/aggregate/serializer.js +1 -1
  368. package/src/features/spa/constants.js +2 -2
  369. package/src/features/spa/instrument/index.js +9 -3
  370. package/src/features/utils/agent-session.js +3 -1
  371. package/src/features/utils/aggregate-base.js +10 -2
  372. package/src/features/utils/event-buffer.js +126 -0
  373. package/src/features/utils/feature-gates.js +1 -1
  374. package/src/features/utils/instrument-base.js +2 -1
  375. package/src/loaders/agent-base.js +2 -2
  376. package/src/loaders/agent.js +7 -2
  377. package/src/loaders/api/api.js +2 -1
  378. package/src/loaders/api/apiAsync.js +1 -1
  379. package/src/loaders/configure/configure.js +4 -1
  380. package/src/loaders/features/enabled-features.js +1 -1
  381. package/src/loaders/micro-agent.js +4 -1
  382. package/dist/cjs/common/config/config.js +0 -76
  383. package/dist/cjs/common/config/state/originals.js +0 -8
  384. package/dist/cjs/common/wrap/index.js +0 -61
  385. package/dist/esm/common/config/config.js +0 -11
  386. package/dist/esm/common/config/state/originals.js +0 -2
  387. package/dist/esm/common/wrap/index.js +0 -13
  388. package/dist/types/common/config/config.d.ts +0 -13
  389. package/dist/types/common/config/config.d.ts.map +0 -1
  390. package/dist/types/common/config/state/configurable.d.ts.map +0 -1
  391. package/dist/types/common/config/state/info.d.ts.map +0 -1
  392. package/dist/types/common/config/state/init.d.ts.map +0 -1
  393. package/dist/types/common/config/state/loader-config.d.ts.map +0 -1
  394. package/dist/types/common/config/state/originals.d.ts +0 -2
  395. package/dist/types/common/config/state/originals.d.ts.map +0 -1
  396. package/dist/types/common/config/state/runtime.d.ts.map +0 -1
  397. package/dist/types/common/wrap/index.d.ts +0 -10
  398. package/dist/types/common/wrap/index.d.ts.map +0 -1
  399. package/src/common/config/__mocks__/config.js +0 -11
  400. package/src/common/config/config.js +0 -12
  401. package/src/common/config/state/originals.js +0 -3
  402. package/src/common/wrap/index.js +0 -16
  403. /package/dist/types/common/config/{state/configurable.d.ts → configurable.d.ts} +0 -0
  404. /package/dist/types/common/config/{state/info.d.ts → info.d.ts} +0 -0
  405. /package/dist/types/common/config/{state/init.d.ts → init.d.ts} +0 -0
  406. /package/dist/types/common/config/{state/loader-config.d.ts → loader-config.d.ts} +0 -0
  407. /package/dist/types/common/config/{state/runtime.d.ts → runtime.d.ts} +0 -0
@@ -11,7 +11,9 @@ import { registerHandler as register } from '../../../common/event-emitter/regis
11
11
  import { HarvestScheduler } from '../../../common/harvest/harvest-scheduler';
12
12
  import { stringify } from '../../../common/util/stringify';
13
13
  import { handle } from '../../../common/event-emitter/handle';
14
- import { getInfo, getConfigurationValue, getRuntime } from '../../../common/config/config';
14
+ import { getInfo } from '../../../common/config/info';
15
+ import { getConfigurationValue } from '../../../common/config/init';
16
+ import { getRuntime } from '../../../common/config/runtime';
15
17
  import { globalScope } from '../../../common/constants/runtime';
16
18
  import { FEATURE_NAME } from '../constants';
17
19
  import { FEATURE_NAMES } from '../../../loaders/features/features';
@@ -19,17 +21,16 @@ import { AggregateBase } from '../../utils/aggregate-base';
19
21
  import { getNREUMInitializedAgent } from '../../../common/window/nreum';
20
22
  import { deregisterDrain } from '../../../common/drain/drain';
21
23
  import { now } from '../../../common/timing/now';
24
+ import { applyFnToProps } from '../../../common/util/traverse';
22
25
 
23
26
  /**
24
27
  * @typedef {import('./compute-stack-trace.js').StackInfo} StackInfo
25
28
  */
26
29
 
27
30
  export class Aggregate extends AggregateBase {
28
- static featureName = (() => FEATURE_NAME)();
31
+ static featureName = FEATURE_NAME;
29
32
  constructor(agentIdentifier, aggregator) {
30
- var _this;
31
33
  super(agentIdentifier, aggregator, FEATURE_NAME);
32
- _this = this;
33
34
  this.stackReported = {};
34
35
  this.observedAt = {};
35
36
  this.pageviewReported = {};
@@ -39,28 +40,19 @@ export class Aggregate extends AggregateBase {
39
40
 
40
41
  // this will need to change to match whatever ee we use in the instrument
41
42
  this.ee.on('interactionDone', (interaction, wasSaved) => this.onInteractionDone(interaction, wasSaved));
42
- register('err', function () {
43
- return _this.storeError(...arguments);
44
- }, this.featureName, this.ee);
45
- register('ierr', function () {
46
- return _this.storeError(...arguments);
47
- }, this.featureName, this.ee);
43
+ register('err', (...args) => this.storeError(...args), this.featureName, this.ee);
44
+ register('ierr', (...args) => this.storeError(...args), this.featureName, this.ee);
48
45
  register('softNavFlush', (interactionId, wasFinished, softNavAttrs) => this.onSoftNavNotification(interactionId, wasFinished, softNavAttrs), this.featureName, this.ee); // when an ixn is done or cancelled
49
46
 
50
47
  const harvestTimeSeconds = getConfigurationValue(this.agentIdentifier, 'jserrors.harvestTimeSeconds') || 10;
51
48
 
52
49
  // 0 == off, 1 == on
53
- this.waitForFlags(['err']).then(_ref => {
54
- let [errFlag] = _ref;
50
+ this.waitForFlags(['err']).then(([errFlag]) => {
55
51
  if (errFlag) {
56
52
  const scheduler = new HarvestScheduler('jserrors', {
57
- onFinished: function () {
58
- return _this.onHarvestFinished(...arguments);
59
- }
53
+ onFinished: (...args) => this.onHarvestFinished(...args)
60
54
  }, this);
61
- scheduler.harvest.on('jserrors', function () {
62
- return _this.onHarvestStarted(...arguments);
63
- });
55
+ scheduler.harvest.on('jserrors', (...args) => this.onHarvestStarted(...args));
64
56
  scheduler.startTimer(harvestTimeSeconds);
65
57
  this.drain();
66
58
  } else {
@@ -71,7 +63,7 @@ export class Aggregate extends AggregateBase {
71
63
  }
72
64
  onHarvestStarted(options) {
73
65
  // this gets rid of dependency in AJAX module
74
- var body = this.aggregator.take(['err', 'ierr', 'xhr']);
66
+ var body = applyFnToProps(this.aggregator.take(['err', 'ierr', 'xhr']), this.obfuscator.obfuscateString.bind(this.obfuscator), 'string');
75
67
  if (options.retry) {
76
68
  this.currentBody = body;
77
69
  }
@@ -94,8 +86,7 @@ export class Aggregate extends AggregateBase {
94
86
  }
95
87
  onHarvestFinished(result) {
96
88
  if (result.retry && this.currentBody) {
97
- Object.entries(this.currentBody || {}).forEach(_ref2 => {
98
- let [key, value] = _ref2;
89
+ Object.entries(this.currentBody || {}).forEach(([key, value]) => {
99
90
  for (var i = 0; i < value.length; i++) {
100
91
  var bucket = value[i];
101
92
  var name = this.getBucketName(key, bucket.params, bucket.custom);
@@ -171,7 +162,7 @@ export class Aggregate extends AggregateBase {
171
162
  if (!this.stackReported[bucketHash]) {
172
163
  this.stackReported[bucketHash] = true;
173
164
  params.stack_trace = truncateSize(stackInfo.stackString);
174
- this.observedAt[bucketHash] = agentRuntime.timeKeeper.convertRelativeTimestamp(time);
165
+ this.observedAt[bucketHash] = Math.floor(agentRuntime.timeKeeper.correctAbsoluteTimestamp(agentRuntime.timeKeeper.convertRelativeTimestamp(time)));
175
166
  } else {
176
167
  params.browser_stack_hash = stringHashCode(stackInfo.stackString);
177
168
  }
@@ -187,7 +178,7 @@ export class Aggregate extends AggregateBase {
187
178
  this.pageviewReported[bucketHash] = true;
188
179
  }
189
180
  params.firstOccurrenceTimestamp = this.observedAt[bucketHash];
190
- params.timestamp = agentRuntime.timeKeeper.convertRelativeTimestamp(time);
181
+ params.timestamp = Math.floor(agentRuntime.timeKeeper.correctAbsoluteTimestamp(agentRuntime.timeKeeper.convertRelativeTimestamp(time)));
191
182
  var type = internal ? 'ierr' : 'err';
192
183
  var newMetrics = {
193
184
  time
@@ -220,30 +211,20 @@ export class Aggregate extends AggregateBase {
220
211
  this.#storeJserrorForHarvest(jsErrorEvent, params.browserInteractionId !== undefined, params._softNavAttributes);
221
212
  }
222
213
  }
223
- #storeJserrorForHarvest(errorInfoArr, softNavOccurredFinished) {
224
- let softNavCustomAttrs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
214
+ #storeJserrorForHarvest(errorInfoArr, softNavOccurredFinished, softNavCustomAttrs = {}) {
225
215
  let [type, bucketHash, params, newMetrics, localAttrs] = errorInfoArr;
226
216
  const allCustomAttrs = {};
227
217
  if (softNavOccurredFinished) {
228
- Object.entries(softNavCustomAttrs).forEach(_ref3 => {
229
- let [k, v] = _ref3;
230
- return setCustom(k, v);
231
- }); // when an ixn finishes, it'll include stuff in jsAttributes + attrs specific to the ixn
218
+ Object.entries(softNavCustomAttrs).forEach(([k, v]) => setCustom(k, v)); // when an ixn finishes, it'll include stuff in jsAttributes + attrs specific to the ixn
232
219
  bucketHash += params.browserInteractionId;
233
220
  delete params._softNavAttributes; // cleanup temp properties from synchronous evaluation; this is harmless when async from soft nav (properties DNE)
234
221
  delete params._softNavFinished;
235
222
  } else {
236
223
  // interaction was cancelled -> error should not be associated OR there was no interaction
237
- Object.entries(getInfo(this.agentIdentifier).jsAttributes).forEach(_ref4 => {
238
- let [k, v] = _ref4;
239
- return setCustom(k, v);
240
- });
224
+ Object.entries(getInfo(this.agentIdentifier).jsAttributes).forEach(([k, v]) => setCustom(k, v));
241
225
  delete params.browserInteractionId;
242
226
  }
243
- if (localAttrs) Object.entries(localAttrs).forEach(_ref5 => {
244
- let [k, v] = _ref5;
245
- return setCustom(k, v);
246
- }); // local custom attrs are applied in either case with the highest precedence
227
+ if (localAttrs) Object.entries(localAttrs).forEach(([k, v]) => setCustom(k, v)); // local custom attrs are applied in either case with the highest precedence
247
228
 
248
229
  const jsAttributesHash = stringHashCode(stringify(allCustomAttrs));
249
230
  const aggregateHash = bucketHash + ':' + jsAttributesHash;
@@ -272,8 +253,7 @@ export class Aggregate extends AggregateBase {
272
253
  var jsAttributesHash = stringHashCode(stringify(allCustomAttrs));
273
254
  var aggregateHash = hash + ':' + jsAttributesHash;
274
255
  this.aggregator.store(item[0], aggregateHash, params, item[3], allCustomAttrs);
275
- function setCustom(_ref6) {
276
- let [key, val] = _ref6;
256
+ function setCustom([key, val]) {
277
257
  allCustomAttrs[key] = val && typeof val === 'object' ? stringify(val) : val;
278
258
  }
279
259
  });
@@ -12,10 +12,9 @@ import { now } from '../../../common/timing/now';
12
12
  import { SR_EVENT_EMITTER_TYPES } from '../../session_replay/constants';
13
13
  import { castError, castErrorEvent, castPromiseRejectionEvent } from '../shared/cast-error';
14
14
  export class Instrument extends InstrumentBase {
15
- static featureName = (() => FEATURE_NAME)();
15
+ static featureName = FEATURE_NAME;
16
16
  #replayRunning = false;
17
- constructor(agentIdentifier, aggregator) {
18
- let auto = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
17
+ constructor(agentIdentifier, aggregator, auto = true) {
19
18
  super(agentIdentifier, aggregator, FEATURE_NAME, auto);
20
19
  try {
21
20
  // this try-catch can be removed when IE11 is completely unsupported & gone
@@ -47,4 +46,5 @@ export class Instrument extends InstrumentBase {
47
46
  this.removeOnAbort?.abort();
48
47
  this.abortHandler = undefined; // weakly allow this abort op to run only once
49
48
  }
50
- }
49
+ }
50
+ export const JSErrors = Instrument;
@@ -1,4 +1,6 @@
1
- import { getConfigurationValue, getInfo, getRuntime } from '../../../common/config/config';
1
+ import { getInfo } from '../../../common/config/info';
2
+ import { getConfigurationValue } from '../../../common/config/init';
3
+ import { getRuntime } from '../../../common/config/runtime';
2
4
  import { handle } from '../../../common/event-emitter/handle';
3
5
  import { registerHandler } from '../../../common/event-emitter/register-handler';
4
6
  import { HarvestScheduler } from '../../../common/harvest/harvest-scheduler';
@@ -6,22 +8,21 @@ import { warn } from '../../../common/util/console';
6
8
  import { stringify } from '../../../common/util/stringify';
7
9
  import { SUPPORTABILITY_METRIC_CHANNEL } from '../../metrics/constants';
8
10
  import { AggregateBase } from '../../utils/aggregate-base';
9
- import { FEATURE_NAME, LOGGING_EVENT_EMITTER_CHANNEL, LOG_LEVELS, MAX_PAYLOAD_SIZE } from '../constants';
11
+ import { FEATURE_NAME, LOGGING_EVENT_EMITTER_CHANNEL, LOG_LEVELS } from '../constants';
10
12
  import { Log } from '../shared/log';
11
13
  import { isValidLogLevel } from '../shared/utils';
14
+ import { applyFnToProps } from '../../../common/util/traverse';
15
+ import { MAX_PAYLOAD_SIZE } from '../../../common/constants/agent-constants';
16
+ import { EventBuffer } from '../../utils/event-buffer';
12
17
  export class Aggregate extends AggregateBase {
13
- static featureName = (() => FEATURE_NAME)();
18
+ static featureName = FEATURE_NAME;
14
19
  #agentRuntime;
15
20
  #agentInfo;
16
21
  constructor(agentIdentifier, aggregator) {
17
22
  super(agentIdentifier, aggregator, FEATURE_NAME);
18
23
 
19
24
  /** held logs before sending */
20
- this.bufferedLogs = [];
21
- /** held logs during sending, for retries */
22
- this.outgoingLogs = [];
23
- /** the estimated bytes of log data waiting to be sent -- triggers a harvest if adding a new log will exceed limit */
24
- this.estimatedBytes = 0;
25
+ this.bufferedLogs = new EventBuffer();
25
26
  this.#agentRuntime = getRuntime(this.agentIdentifier);
26
27
  this.#agentInfo = getInfo(this.agentIdentifier);
27
28
  this.harvestTimeSeconds = getConfigurationValue(this.agentIdentifier, 'logging.harvestTimeSeconds');
@@ -32,16 +33,14 @@ export class Aggregate extends AggregateBase {
32
33
  getPayload: this.prepareHarvest.bind(this),
33
34
  raw: true
34
35
  }, this);
35
- /** harvest immediately once started to purge pre-load logs collected */
36
- this.scheduler.startTimer(this.harvestTimeSeconds, 0);
37
36
  /** emitted by instrument class (wrapped loggers) or the api methods directly */
38
37
  registerHandler(LOGGING_EVENT_EMITTER_CHANNEL, this.handleLog.bind(this), this.featureName, this.ee);
39
38
  this.drain();
39
+ /** harvest immediately once started to purge pre-load logs collected */
40
+ this.scheduler.startTimer(this.harvestTimeSeconds, 0);
40
41
  });
41
42
  }
42
- handleLog(timestamp, message) {
43
- let attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
44
- let level = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : LOG_LEVELS.INFO;
43
+ handleLog(timestamp, message, attributes = {}, level = LOG_LEVELS.INFO) {
45
44
  if (this.blocked) return;
46
45
  if (!attributes || typeof attributes !== 'object') attributes = {};
47
46
  if (typeof level === 'string') level = level.toUpperCase();
@@ -61,30 +60,26 @@ export class Aggregate extends AggregateBase {
61
60
  return;
62
61
  }
63
62
  if (typeof message !== 'string' || !message) return warn(32);
64
- if (message.length > MAX_PAYLOAD_SIZE) {
65
- handle(SUPPORTABILITY_METRIC_CHANNEL, ['Logging/Harvest/Failed/Seen', message.length]);
66
- return warn(31, message.slice(0, 25) + '...');
67
- }
68
- const log = new Log(this.#agentRuntime.timeKeeper.convertRelativeTimestamp(timestamp), message, attributes, level);
63
+ const log = new Log(Math.floor(this.#agentRuntime.timeKeeper.correctAbsoluteTimestamp(this.#agentRuntime.timeKeeper.convertRelativeTimestamp(timestamp))), message, attributes, level);
69
64
  const logBytes = log.message.length + stringify(log.attributes).length + log.level.length + 10; // timestamp == 10 chars
70
- if (logBytes > MAX_PAYLOAD_SIZE) {
71
- handle(SUPPORTABILITY_METRIC_CHANNEL, ['Logging/Harvest/Failed/Seen', logBytes]);
72
- return warn(31, log.message.slice(0, 25) + '...');
73
- }
74
- if (this.estimatedBytes + logBytes >= MAX_PAYLOAD_SIZE) {
75
- handle(SUPPORTABILITY_METRIC_CHANNEL, ['Logging/Harvest/Early/Seen', this.estimatedBytes + logBytes]);
76
- this.scheduler.runHarvest({});
65
+
66
+ if (!this.bufferedLogs.canMerge(logBytes)) {
67
+ if (this.bufferedLogs.hasData) {
68
+ handle(SUPPORTABILITY_METRIC_CHANNEL, ['Logging/Harvest/Early/Seen', this.bufferedLogs.bytes + logBytes]);
69
+ this.scheduler.runHarvest({});
70
+ if (logBytes < MAX_PAYLOAD_SIZE) this.bufferedLogs.add(log);
71
+ } else {
72
+ handle(SUPPORTABILITY_METRIC_CHANNEL, ['Logging/Harvest/Failed/Seen', logBytes]);
73
+ warn(31, log.message.slice(0, 25) + '...');
74
+ }
75
+ return;
77
76
  }
78
- this.estimatedBytes += logBytes;
79
- this.bufferedLogs.push(log);
77
+ this.bufferedLogs.add(log);
80
78
  }
81
- prepareHarvest() {
82
- if (this.blocked || !(this.bufferedLogs.length || this.outgoingLogs.length)) return;
83
- /** populate outgoing array while also clearing main buffer */
84
- this.outgoingLogs.push(...this.bufferedLogs.splice(0));
85
- this.estimatedBytes = 0;
79
+ prepareHarvest(options = {}) {
80
+ if (this.blocked || !this.bufferedLogs.hasData) return;
86
81
  /** see https://source.datanerd.us/agents/rum-specs/blob/main/browser/Log for logging spec */
87
- return {
82
+ const payload = {
88
83
  qs: {
89
84
  browser_monitoring_key: this.#agentInfo.licenseKey
90
85
  },
@@ -110,11 +105,13 @@ export class Aggregate extends AggregateBase {
110
105
  }
111
106
  },
112
107
  /** logs section contains individual unique log entries */
113
- logs: this.outgoingLogs
108
+ logs: applyFnToProps(this.bufferedLogs.buffer, this.obfuscator.obfuscateString.bind(this.obfuscator), 'string')
114
109
  }]
115
110
  };
111
+ if (options.retry) this.bufferedLogs.hold();else this.bufferedLogs.clear();
112
+ return payload;
116
113
  }
117
114
  onHarvestFinished(result) {
118
- if (!result.retry) this.outgoingLogs = [];
115
+ if (result.retry) this.bufferedLogs.unhold();else this.bufferedLogs.held.clear();
119
116
  }
120
117
  }
@@ -7,5 +7,4 @@ export const LOG_LEVELS = {
7
7
  TRACE: 'TRACE'
8
8
  };
9
9
  export const LOGGING_EVENT_EMITTER_CHANNEL = 'log';
10
- export const FEATURE_NAME = FEATURE_NAMES.logging;
11
- export const MAX_PAYLOAD_SIZE = 1000000;
10
+ export const FEATURE_NAME = FEATURE_NAMES.logging;
@@ -2,14 +2,12 @@ import { InstrumentBase } from '../../utils/instrument-base';
2
2
  import { FEATURE_NAME } from '../constants';
3
3
  import { bufferLog } from '../shared/utils';
4
4
  export class Instrument extends InstrumentBase {
5
- static featureName = (() => FEATURE_NAME)();
6
- constructor(agentIdentifier, aggregator) {
7
- let auto = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
5
+ static featureName = FEATURE_NAME;
6
+ constructor(agentIdentifier, aggregator, auto = true) {
8
7
  super(agentIdentifier, aggregator, FEATURE_NAME, auto);
9
8
  const instanceEE = this.ee;
10
9
  /** emitted by wrap-logger function */
11
- this.ee.on('wrap-logger-end', function handleLog(_ref) {
12
- let [message] = _ref;
10
+ this.ee.on('wrap-logger-end', function handleLog([message]) {
13
11
  const {
14
12
  level,
15
13
  customAttributes
@@ -18,4 +16,5 @@ export class Instrument extends InstrumentBase {
18
16
  });
19
17
  this.importAggregator();
20
18
  }
21
- }
19
+ }
20
+ export const Logging = Instrument;
@@ -17,9 +17,7 @@ export class Log {
17
17
  * @param {object} attributes - other log event attributes
18
18
  * @param {enum} level - Log level
19
19
  */
20
- constructor(timestamp, message) {
21
- let attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
22
- let level = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : LOG_LEVELS.INFO;
20
+ constructor(timestamp, message, attributes = {}, level = LOG_LEVELS.INFO) {
23
21
  /** @type {long} */
24
22
  this.timestamp = timestamp;
25
23
  this.message = message;
@@ -10,9 +10,7 @@ import { LOGGING_EVENT_EMITTER_CHANNEL, LOG_LEVELS } from '../constants';
10
10
  * @param {{[key: string]: *}} customAttributes - The log's custom attributes if any
11
11
  * @param {enum} level - the log level enum
12
12
  */
13
- export function bufferLog(ee, message) {
14
- let customAttributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
15
- let level = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : LOG_LEVELS.INFO;
13
+ export function bufferLog(ee, message, customAttributes = {}, level = LOG_LEVELS.INFO) {
16
14
  handle(SUPPORTABILITY_METRIC_CHANNEL, ["API/logging/".concat(level.toLowerCase(), "/called")], undefined, FEATURE_NAMES.metrics, ee);
17
15
  handle(LOGGING_EVENT_EMITTER_CHANNEL, [now(), message, customAttributes, level], undefined, FEATURE_NAMES.logging, ee);
18
16
  }
@@ -24,5 +22,5 @@ export function bufferLog(ee, message) {
24
22
  */
25
23
  export function isValidLogLevel(level) {
26
24
  if (typeof level !== 'string') return false;
27
- return Object.values(LOG_LEVELS).some(logLevel => logLevel === level);
25
+ return Object.values(LOG_LEVELS).some(logLevel => logLevel === level.toUpperCase().trim());
28
26
  }
@@ -1,21 +1,22 @@
1
- import { getRuntime, getConfiguration } from '../../../common/config/config';
1
+ import { getConfiguration } from '../../../common/config/init';
2
+ import { getRuntime } from '../../../common/config/runtime';
2
3
  import { registerHandler } from '../../../common/event-emitter/register-handler';
3
4
  import { HarvestScheduler } from '../../../common/harvest/harvest-scheduler';
4
- import { FEATURE_NAME, SUPPORTABILITY_METRIC, CUSTOM_METRIC, SUPPORTABILITY_METRIC_CHANNEL, CUSTOM_METRIC_CHANNEL } from '../constants';
5
+ import { FEATURE_NAME, SUPPORTABILITY_METRIC, CUSTOM_METRIC, SUPPORTABILITY_METRIC_CHANNEL, CUSTOM_METRIC_CHANNEL, WATCHABLE_WEB_SOCKET_EVENTS } from '../constants';
5
6
  import { getFrameworks } from './framework-detection';
6
7
  import { isFileProtocol } from '../../../common/url/protocol';
7
- import { getRules, validateRules } from '../../../common/util/obfuscate';
8
8
  import { onDOMContentLoaded } from '../../../common/window/load';
9
9
  import { windowAddEventListener } from '../../../common/event-listener/event-listener-opts';
10
10
  import { isBrowserScope, isWorkerScope } from '../../../common/constants/runtime';
11
11
  import { AggregateBase } from '../../utils/aggregate-base';
12
12
  import { deregisterDrain } from '../../../common/drain/drain';
13
+ import { WEBSOCKET_TAG } from '../../../common/wrap/wrap-websocket';
14
+ import { handleWebsocketEvents } from './websocket-detection';
13
15
  export class Aggregate extends AggregateBase {
14
- static featureName = (() => FEATURE_NAME)();
16
+ static featureName = FEATURE_NAME;
15
17
  constructor(agentIdentifier, aggregator) {
16
18
  super(agentIdentifier, aggregator, FEATURE_NAME);
17
- this.waitForFlags(['err']).then(_ref => {
18
- let [errFlag] = _ref;
19
+ this.waitForFlags(['err']).then(([errFlag]) => {
19
20
  if (errFlag) {
20
21
  // *cli, Mar 23 - Per NR-94597, this feature should only harvest ONCE at the (potential) EoL time of the page.
21
22
  const scheduler = new HarvestScheduler('jserrors', {
@@ -95,21 +96,32 @@ export class Aggregate extends AggregateBase {
95
96
  }
96
97
 
97
98
  // Capture SMs to assess customer engagement with the obfuscation config
98
- const rules = getRules(this.agentIdentifier);
99
- if (rules.length > 0) this.storeSupportabilityMetrics('Generic/Obfuscate/Detected');
100
- if (rules.length > 0 && !validateRules(rules)) this.storeSupportabilityMetrics('Generic/Obfuscate/Invalid');
99
+ const ruleValidations = this.obfuscator.ruleValidationCache;
100
+ if (ruleValidations.length > 0) {
101
+ this.storeSupportabilityMetrics('Generic/Obfuscate/Detected');
102
+ if (ruleValidations.filter(ruleValidation => !ruleValidation.isValid).length > 0) this.storeSupportabilityMetrics('Generic/Obfuscate/Invalid');
103
+ }
101
104
 
102
105
  // Check if proxy for either chunks or beacon is being used
103
106
  if (proxy.assets) this.storeSupportabilityMetrics('Config/AssetsUrl/Changed');
104
107
  if (proxy.beacon) this.storeSupportabilityMetrics('Config/BeaconUrl/Changed');
105
108
  if (isBrowserScope && window.MutationObserver) {
106
- this.storeSupportabilityMetrics('Generic/VideoElement/Added', window.document.querySelectorAll('video').length);
109
+ if (window.self !== window.top) {
110
+ this.storeSupportabilityMetrics('Generic/Runtime/IFrame/Detected');
111
+ }
112
+ const preExistingVideos = window.document.querySelectorAll('video').length;
113
+ if (preExistingVideos) this.storeSupportabilityMetrics('Generic/VideoElement/Added', preExistingVideos);
114
+ const preExistingIframes = window.document.querySelectorAll('iframe').length;
115
+ if (preExistingIframes) this.storeSupportabilityMetrics('Generic/IFrame/Added', preExistingIframes);
107
116
  const mo = new MutationObserver(records => {
108
117
  records.forEach(record => {
109
118
  record.addedNodes.forEach(addedNode => {
110
119
  if (addedNode instanceof HTMLVideoElement) {
111
120
  this.storeSupportabilityMetrics('Generic/VideoElement/Added', 1);
112
121
  }
122
+ if (addedNode instanceof HTMLIFrameElement) {
123
+ this.storeSupportabilityMetrics('Generic/IFrame/Added', 1);
124
+ }
113
125
  });
114
126
  });
115
127
  });
@@ -118,6 +130,11 @@ export class Aggregate extends AggregateBase {
118
130
  subtree: true
119
131
  });
120
132
  }
133
+ WATCHABLE_WEB_SOCKET_EVENTS.forEach(tag => {
134
+ registerHandler('buffered-' + WEBSOCKET_TAG + tag, (...args) => {
135
+ handleWebsocketEvents(this.storeSupportabilityMetrics.bind(this), tag, ...args);
136
+ }, this.featureName, this.ee);
137
+ });
121
138
  }
122
139
  eachSessionChecks() {
123
140
  if (!isBrowserScope) return;
@@ -159,8 +176,8 @@ export class Aggregate extends AggregateBase {
159
176
  if (typeof performance !== 'undefined') {
160
177
  const markers = performance.getEntriesByType('mark');
161
178
  const measures = performance.getEntriesByType('measure');
162
- this.storeSupportabilityMetrics('Generic/Performance/Mark/Seen', markers.length);
163
- this.storeSupportabilityMetrics('Generic/Performance/Measure/Seen', measures.length);
179
+ if (markers.length) this.storeSupportabilityMetrics('Generic/Performance/Mark/Seen', markers.length);
180
+ if (measures.length) this.storeSupportabilityMetrics('Generic/Performance/Measure/Seen', measures.length);
164
181
  }
165
182
  } catch (e) {
166
183
  // do nothing
@@ -0,0 +1,29 @@
1
+ import { dataSize } from '../../../common/util/data-size';
2
+ import { toTitleCase } from '../../../common/util/text';
3
+ import { ADD_EVENT_LISTENER_TAG } from '../../../common/wrap/wrap-websocket';
4
+
5
+ /**
6
+ * A SM handler for web socket events, which converts them to a shape suitable for SMs and reports them.
7
+ * @param {Function} reporter a function that reports data as a supportability metric
8
+ * @param {string} tag the unique tag to assign to the sm
9
+ * @param {number} timestamp ms from page origin
10
+ * @param {number} timeSinceInit ms from class init
11
+ * @param {boolean} isLoaded whether the even was observed before the page load event
12
+ * @param {string} socketId a unique id assigned to the observed socket
13
+ * @param {*} data the data reported alongside the socket event
14
+ */
15
+ export function handleWebsocketEvents(reporter, tag, timestamp, timeSinceInit, isLoaded, socketId, data) {
16
+ // socketId is unused in the SMs
17
+ const useDataType = tag === ADD_EVENT_LISTENER_TAG;
18
+ let metricTag = toTitleCase(useDataType ? data.eventType : tag);
19
+ if (metricTag === 'Close') {
20
+ if (data?.event.code === 1000 || data?.event.wasClean) metricTag += '-Clean';else metricTag += '-Dirty';
21
+ }
22
+ const bytes = metricTag === 'Message' && dataSize(data?.event?.data) || metricTag === 'Send' && dataSize(data);
23
+ reporter(buildSMTag(metricTag, 'Ms'), timestamp);
24
+ reporter(buildSMTag(metricTag, 'MsSinceClassInit'), timeSinceInit);
25
+ if (bytes) reporter(buildSMTag(metricTag, 'Bytes'), bytes);
26
+ }
27
+ function buildSMTag(tag, category) {
28
+ return 'WebSocket/' + tag + '/' + category;
29
+ }
@@ -1,6 +1,8 @@
1
+ import { ADD_EVENT_LISTENER_TAG } from '../../common/wrap/wrap-websocket';
1
2
  import { FEATURE_NAMES } from '../../loaders/features/features';
2
3
  export const FEATURE_NAME = FEATURE_NAMES.metrics;
3
4
  export const SUPPORTABILITY_METRIC = 'sm';
4
5
  export const CUSTOM_METRIC = 'cm';
5
6
  export const SUPPORTABILITY_METRIC_CHANNEL = 'storeSupportabilityMetrics';
6
- export const CUSTOM_METRIC_CHANNEL = 'storeEventMetrics';
7
+ export const CUSTOM_METRIC_CHANNEL = 'storeEventMetrics';
8
+ export const WATCHABLE_WEB_SOCKET_EVENTS = ['new', 'send', 'close', ADD_EVENT_LISTENER_TAG];
@@ -1,10 +1,18 @@
1
+ import { handle } from '../../../common/event-emitter/handle';
2
+ import { WEBSOCKET_TAG, wrapWebSocket } from '../../../common/wrap/wrap-websocket';
1
3
  import { InstrumentBase } from '../../utils/instrument-base';
2
- import { FEATURE_NAME } from '../constants';
4
+ import { FEATURE_NAME, WATCHABLE_WEB_SOCKET_EVENTS } from '../constants';
3
5
  export class Instrument extends InstrumentBase {
4
- static featureName = (() => FEATURE_NAME)();
5
- constructor(agentIdentifier, aggregator) {
6
- let auto = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
6
+ static featureName = FEATURE_NAME;
7
+ constructor(agentIdentifier, aggregator, auto = true) {
7
8
  super(agentIdentifier, aggregator, FEATURE_NAME, auto);
9
+ wrapWebSocket(this.ee);
10
+ WATCHABLE_WEB_SOCKET_EVENTS.forEach(suffix => {
11
+ this.ee.on(WEBSOCKET_TAG + suffix, (...args) => {
12
+ handle('buffered-' + WEBSOCKET_TAG + suffix, [...args], undefined, this.featureName, this.ee);
13
+ });
14
+ });
8
15
  this.importAggregator();
9
16
  }
10
- }
17
+ }
18
+ export const Metrics = Instrument;
@@ -9,8 +9,12 @@ import { GenericEvents } from '../../generic_events';
9
9
  * @deprecated This feature has been replaced by Generic Events. Use/Import `GenericEvents` instead. This wrapper will be removed in a future release
10
10
  */
11
11
  export class Instrument extends GenericEvents {
12
- constructor(agentIdentifier, aggregator) {
13
- let auto = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
12
+ constructor(agentIdentifier, aggregator, auto = true) {
14
13
  super(agentIdentifier, aggregator, auto);
15
14
  }
16
- }
15
+ }
16
+
17
+ /**
18
+ * @deprecated This feature has been replaced by Generic Events. Use/Import `GenericEvents` instead. This wrapper will be removed in a future release
19
+ */
20
+ export const PageAction = Instrument;
@@ -1,7 +1,8 @@
1
1
  import { globalScope, isBrowserScope, originTime } from '../../../common/constants/runtime';
2
2
  import { addPT, addPN } from '../../../common/timing/nav-timing';
3
3
  import { stringify } from '../../../common/util/stringify';
4
- import { getInfo, getRuntime, isConfigured } from '../../../common/config/config';
4
+ import { getInfo, isValid } from '../../../common/config/info';
5
+ import { getRuntime } from '../../../common/config/runtime';
5
6
  import { Harvest } from '../../../common/harvest/harvest';
6
7
  import * as CONSTANTS from '../constants';
7
8
  import { getActivatedFeaturesFlags } from './initialized-features';
@@ -11,30 +12,26 @@ import { AggregateBase } from '../../utils/aggregate-base';
11
12
  import { firstContentfulPaint } from '../../../common/vitals/first-contentful-paint';
12
13
  import { firstPaint } from '../../../common/vitals/first-paint';
13
14
  import { timeToFirstByte } from '../../../common/vitals/time-to-first-byte';
14
- import { drain } from '../../../common/drain/drain';
15
- import { FEATURE_NAMES } from '../../../loaders/features/features';
16
- import { handle } from '../../../common/event-emitter/handle';
17
- import { SUPPORTABILITY_METRIC_CHANNEL } from '../../metrics/constants';
18
15
  import { now } from '../../../common/timing/now';
19
16
  import { TimeKeeper } from '../../../common/timing/time-keeper';
17
+ import { applyFnToProps } from '../../../common/util/traverse';
20
18
  export class Aggregate extends AggregateBase {
21
- static featureName = (() => CONSTANTS.FEATURE_NAME)();
19
+ static featureName = CONSTANTS.FEATURE_NAME;
22
20
  constructor(agentIdentifier, aggregator) {
23
21
  super(agentIdentifier, aggregator, CONSTANTS.FEATURE_NAME);
24
22
  this.timeToFirstByte = 0;
25
23
  this.firstByteToWindowLoad = 0; // our "frontend" duration
26
24
  this.firstByteToDomContent = 0; // our "dom processing" duration
27
25
  this.timeKeeper = new TimeKeeper(this.agentIdentifier);
28
- if (!isConfigured(agentIdentifier)) {
26
+ if (!isValid(agentIdentifier)) {
29
27
  this.ee.abort();
30
28
  return warn(43);
31
29
  }
32
30
  if (isBrowserScope) {
33
- timeToFirstByte.subscribe(_ref => {
34
- let {
35
- value,
36
- attrs
37
- } = _ref;
31
+ timeToFirstByte.subscribe(({
32
+ value,
33
+ attrs
34
+ }) => {
38
35
  const navEntry = attrs.navigationEntry;
39
36
  this.timeToFirstByte = Math.max(value, this.timeToFirstByte);
40
37
  this.firstByteToWindowLoad = Math.max(Math.round(navEntry.loadEventEnd - this.timeToFirstByte), this.firstByteToWindowLoad); // our "frontend" duration
@@ -76,8 +73,7 @@ export class Aggregate extends AggregateBase {
76
73
  ac: info.account,
77
74
  pr: info.product,
78
75
  af: getActivatedFeaturesFlags(this.agentIdentifier).join(','),
79
- ...Object.entries(this.aggregator.get('measures') || {}).reduce((aggregator, _ref2) => {
80
- let [metricName, measure] = _ref2;
76
+ ...Object.entries(this.aggregator.get('measures') || {}).reduce((aggregator, [metricName, measure]) => {
81
77
  aggregator[metricName] = measure.params?.value;
82
78
  return aggregator;
83
79
  }, {}),
@@ -89,9 +85,9 @@ export class Aggregate extends AggregateBase {
89
85
 
90
86
  let body;
91
87
  if (typeof info.jsAttributes === 'object' && Object.keys(info.jsAttributes).length > 0) {
92
- body = {
88
+ body = applyFnToProps({
93
89
  ja: info.jsAttributes
94
- };
90
+ }, this.obfuscator.obfuscateString.bind(this.obfuscator), 'string');
95
91
  }
96
92
  if (globalScope.performance) {
97
93
  if (typeof PerformanceNavigationTiming !== 'undefined') {
@@ -114,7 +110,7 @@ export class Aggregate extends AggregateBase {
114
110
  queryParameters.fp = firstPaint.current.value;
115
111
  queryParameters.fcp = firstContentfulPaint.current.value;
116
112
  if (this.timeKeeper?.ready) {
117
- queryParameters.timestamp = this.timeKeeper.convertRelativeTimestamp(now());
113
+ queryParameters.timestamp = Math.floor(this.timeKeeper.correctAbsoluteTimestamp(this.timeKeeper.convertRelativeTimestamp(now())));
118
114
  }
119
115
  const rumStartTime = now();
120
116
  harvester.send({
@@ -127,12 +123,11 @@ export class Aggregate extends AggregateBase {
127
123
  needResponse: true,
128
124
  sendEmptyBody: true
129
125
  },
130
- cbFinished: _ref3 => {
131
- let {
132
- status,
133
- responseText,
134
- xhr
135
- } = _ref3;
126
+ cbFinished: ({
127
+ status,
128
+ responseText,
129
+ xhr
130
+ }) => {
136
131
  const rumEndTime = now();
137
132
  if (status >= 400 || status === 0) {
138
133
  // Adding retry logic for the rum call will be a separate change
@@ -143,22 +138,7 @@ export class Aggregate extends AggregateBase {
143
138
  this.timeKeeper.processRumRequest(xhr, rumStartTime, rumEndTime);
144
139
  if (!this.timeKeeper.ready) throw new Error('TimeKeeper not ready');
145
140
  agentRuntime.timeKeeper = this.timeKeeper;
146
-
147
- // Check if the time diff is such that we need to capture a supportability metric
148
- if (this.timeKeeper.localTimeDiff >= 12 * 60 * 60 * 1000) {
149
- handle(SUPPORTABILITY_METRIC_CHANNEL, ['PVE/NRTime/Calculation/DiffExceed12Hrs'], undefined, FEATURE_NAMES.metrics, this.ee);
150
- } else if (this.timeKeeper.localTimeDiff >= 6 * 60 * 60 * 1000) {
151
- handle(SUPPORTABILITY_METRIC_CHANNEL, ['PVE/NRTime/Calculation/DiffExceed6Hrs'], undefined, FEATURE_NAMES.metrics, this.ee);
152
- } else if (this.timeKeeper.localTimeDiff >= 60 * 60 * 1000) {
153
- handle(SUPPORTABILITY_METRIC_CHANNEL, ['PVE/NRTime/Calculation/DiffExceed1Hrs'], undefined, FEATURE_NAMES.metrics, this.ee);
154
- }
155
141
  } catch (error) {
156
- if (error?.message?.indexOf('invalid format') > 0) {
157
- handle(SUPPORTABILITY_METRIC_CHANNEL, ['PVE/NRTime/Calculation/InvalidFormat'], undefined, FEATURE_NAMES.metrics, this.ee);
158
- } else {
159
- handle(SUPPORTABILITY_METRIC_CHANNEL, ['PVE/NRTime/Calculation/Failed'], undefined, FEATURE_NAMES.metrics, this.ee);
160
- }
161
- drain(this.agentIdentifier, FEATURE_NAMES.metrics, true);
162
142
  this.ee.abort();
163
143
  warn(17, error);
164
144
  return;