@safaricom-mxl/web-sdk 0.0.14 → 0.0.15

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 (234) hide show
  1. package/dist/api-logs/api/LogAPI/LogAPI.cjs.map +1 -1
  2. package/dist/api-logs/api/LogAPI/LogAPI.js.map +1 -1
  3. package/dist/api-logs/logAPI.cjs.map +1 -1
  4. package/dist/api-logs/logAPI.js.map +1 -1
  5. package/dist/api-logs/manager/NoOpLogManager/NoOpLogManager.cjs.map +1 -1
  6. package/dist/api-logs/manager/NoOpLogManager/NoOpLogManager.js.map +1 -1
  7. package/dist/api-logs/manager/ProxyLogManager/ProxyLogManager.cjs.map +1 -1
  8. package/dist/api-logs/manager/ProxyLogManager/ProxyLogManager.js.map +1 -1
  9. package/dist/api-page/api/PageAPI/PageAPI.cjs.map +1 -1
  10. package/dist/api-page/api/PageAPI/PageAPI.js.map +1 -1
  11. package/dist/api-page/manager/NoOpPageManager/NoOpPageManager.cjs.map +1 -1
  12. package/dist/api-page/manager/NoOpPageManager/NoOpPageManager.js.map +1 -1
  13. package/dist/api-page/manager/ProxyPageManager/ProxyPageManager.cjs.map +1 -1
  14. package/dist/api-page/manager/ProxyPageManager/ProxyPageManager.js.map +1 -1
  15. package/dist/api-page/pageAPI.cjs.map +1 -1
  16. package/dist/api-page/pageAPI.js.map +1 -1
  17. package/dist/api-sessions/api/SessionAPI/SessionAPI.cjs.map +1 -1
  18. package/dist/api-sessions/api/SessionAPI/SessionAPI.d.cts.map +1 -1
  19. package/dist/api-sessions/api/SessionAPI/SessionAPI.d.ts.map +1 -1
  20. package/dist/api-sessions/api/SessionAPI/SessionAPI.js.map +1 -1
  21. package/dist/api-sessions/manager/NoOpSpanSessionManager/NoOpSpanSessionManager.cjs.map +1 -1
  22. package/dist/api-sessions/manager/NoOpSpanSessionManager/NoOpSpanSessionManager.js.map +1 -1
  23. package/dist/api-sessions/manager/ProxySpanSessionManager/ProxySpanSessionManager.cjs.map +1 -1
  24. package/dist/api-sessions/manager/ProxySpanSessionManager/ProxySpanSessionManager.js.map +1 -1
  25. package/dist/api-sessions/sessionAPI.cjs.map +1 -1
  26. package/dist/api-sessions/sessionAPI.js.map +1 -1
  27. package/dist/api-traces/api/TraceAPI/TraceAPI.cjs.map +1 -1
  28. package/dist/api-traces/api/TraceAPI/TraceAPI.js.map +1 -1
  29. package/dist/api-traces/manager/NoOpTraceManager/NoOpTraceManager.cjs.map +1 -1
  30. package/dist/api-traces/manager/NoOpTraceManager/NoOpTraceManager.js.map +1 -1
  31. package/dist/api-traces/manager/NoOpTraceManager/NonRecordingExtendedSpan.cjs.map +1 -1
  32. package/dist/api-traces/manager/NoOpTraceManager/NonRecordingExtendedSpan.d.cts.map +1 -1
  33. package/dist/api-traces/manager/NoOpTraceManager/NonRecordingExtendedSpan.d.ts.map +1 -1
  34. package/dist/api-traces/manager/NoOpTraceManager/NonRecordingExtendedSpan.js.map +1 -1
  35. package/dist/api-traces/manager/ProxyTraceManager/ProxyTraceManager.cjs.map +1 -1
  36. package/dist/api-traces/manager/ProxyTraceManager/ProxyTraceManager.js.map +1 -1
  37. package/dist/api-traces/traceAPI.cjs.map +1 -1
  38. package/dist/api-traces/traceAPI.js.map +1 -1
  39. package/dist/api-users/api/UserAPI/UserAPI.cjs.map +1 -1
  40. package/dist/api-users/api/UserAPI/UserAPI.js.map +1 -1
  41. package/dist/api-users/manager/NoOpUserManager/NoOpUserManager.cjs.map +1 -1
  42. package/dist/api-users/manager/NoOpUserManager/NoOpUserManager.js.map +1 -1
  43. package/dist/api-users/manager/ProxyUserManager/ProxyUserManager.cjs.map +1 -1
  44. package/dist/api-users/manager/ProxyUserManager/ProxyUserManager.js.map +1 -1
  45. package/dist/api-users/userAPI.cjs.map +1 -1
  46. package/dist/api-users/userAPI.js.map +1 -1
  47. package/dist/common/attributes.cjs.map +1 -1
  48. package/dist/common/attributes.js.map +1 -1
  49. package/dist/exporters/MXLLogExporter/MXLLogExporter.cjs.map +1 -1
  50. package/dist/exporters/MXLLogExporter/MXLLogExporter.js.map +1 -1
  51. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.cjs.map +1 -1
  52. package/dist/exporters/MXLLogExporter/OTLPFetchLogExporter.js.map +1 -1
  53. package/dist/exporters/MXLLogExporter/utils.cjs.map +1 -1
  54. package/dist/exporters/MXLLogExporter/utils.js.map +1 -1
  55. package/dist/exporters/MXLTraceExporter/MXLTraceExporter.cjs.map +1 -1
  56. package/dist/exporters/MXLTraceExporter/MXLTraceExporter.js.map +1 -1
  57. package/dist/exporters/MXLTraceExporter/OTLPFetchTraceExporter.cjs.map +1 -1
  58. package/dist/exporters/MXLTraceExporter/OTLPFetchTraceExporter.js.map +1 -1
  59. package/dist/exporters/MXLTraceExporter/utils.cjs.map +1 -1
  60. package/dist/exporters/MXLTraceExporter/utils.js.map +1 -1
  61. package/dist/exporters/otlpBrowserFetchExportDelegate.cjs.map +1 -1
  62. package/dist/exporters/otlpBrowserFetchExportDelegate.d.cts.map +1 -1
  63. package/dist/exporters/otlpBrowserFetchExportDelegate.d.ts.map +1 -1
  64. package/dist/exporters/otlpBrowserFetchExportDelegate.js.map +1 -1
  65. package/dist/instrumentations/MXLInstrumentationBase/MXLInstrumentationBase.cjs.map +1 -1
  66. package/dist/instrumentations/MXLInstrumentationBase/MXLInstrumentationBase.js.map +1 -1
  67. package/dist/instrumentations/clicks/ClicksInstrumentation/ClicksInstrumentation.cjs.map +1 -1
  68. package/dist/instrumentations/clicks/ClicksInstrumentation/ClicksInstrumentation.js.map +1 -1
  69. package/dist/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.cjs.map +1 -1
  70. package/dist/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.d.cts.map +1 -1
  71. package/dist/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.d.ts.map +1 -1
  72. package/dist/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.js.map +1 -1
  73. package/dist/instrumentations/document-load/DocumentLoadInstrumentation/utils.cjs.map +1 -1
  74. package/dist/instrumentations/document-load/DocumentLoadInstrumentation/utils.js.map +1 -1
  75. package/dist/instrumentations/element-timing/ElementTimingInstrumentation/ElementTimingInstrumentation.cjs.map +1 -1
  76. package/dist/instrumentations/element-timing/ElementTimingInstrumentation/ElementTimingInstrumentation.js.map +1 -1
  77. package/dist/instrumentations/empty-root/EmptyRootInstrumentation/EmptyRootInstrumentation.cjs.map +1 -1
  78. package/dist/instrumentations/empty-root/EmptyRootInstrumentation/EmptyRootInstrumentation.js.map +1 -1
  79. package/dist/instrumentations/exceptions/GlobalExceptionInstrumentation/GlobalExceptionInstrumentation.cjs.map +1 -1
  80. package/dist/instrumentations/exceptions/GlobalExceptionInstrumentation/GlobalExceptionInstrumentation.js.map +1 -1
  81. package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.cjs.map +1 -1
  82. package/dist/instrumentations/exceptions/react/MXLErrorBoundary/MXLErrorBoundary.js.map +1 -1
  83. package/dist/instrumentations/fetch/MXLFetchInstrumentation/MXLFetchInstrumentation.cjs.map +1 -1
  84. package/dist/instrumentations/fetch/MXLFetchInstrumentation/MXLFetchInstrumentation.js.map +1 -1
  85. package/dist/instrumentations/loaf/LoafInstrumentation/LoafInstrumentation.cjs.map +1 -1
  86. package/dist/instrumentations/loaf/LoafInstrumentation/LoafInstrumentation.js.map +1 -1
  87. package/dist/instrumentations/navigation/NavigationInstrumentation/NavigationInstrumentation.cjs.map +1 -1
  88. package/dist/instrumentations/navigation/NavigationInstrumentation/NavigationInstrumentation.js.map +1 -1
  89. package/dist/instrumentations/navigation/NavigationInstrumentation/instance.cjs.map +1 -1
  90. package/dist/instrumentations/navigation/NavigationInstrumentation/instance.js.map +1 -1
  91. package/dist/instrumentations/navigation/NavigationInstrumentation/react/createReactRouterNavigationInstrumentation.cjs.map +1 -1
  92. package/dist/instrumentations/navigation/NavigationInstrumentation/react/createReactRouterNavigationInstrumentation.js.map +1 -1
  93. package/dist/instrumentations/navigation/NavigationInstrumentation/react/reactRouterV5/withMXLRoutingLegacy.cjs.map +1 -1
  94. package/dist/instrumentations/navigation/NavigationInstrumentation/react/reactRouterV5/withMXLRoutingLegacy.d.cts.map +1 -1
  95. package/dist/instrumentations/navigation/NavigationInstrumentation/react/reactRouterV5/withMXLRoutingLegacy.d.ts.map +1 -1
  96. package/dist/instrumentations/navigation/NavigationInstrumentation/react/reactRouterV5/withMXLRoutingLegacy.js.map +1 -1
  97. package/dist/instrumentations/navigation/NavigationInstrumentation/react/reactRouterV6Data/listenToRouterChanges.cjs.map +1 -1
  98. package/dist/instrumentations/navigation/NavigationInstrumentation/react/reactRouterV6Data/listenToRouterChanges.js.map +1 -1
  99. package/dist/instrumentations/navigation/NavigationInstrumentation/react/reactRouterV6Declarative/withMXLRouting.cjs.map +1 -1
  100. package/dist/instrumentations/navigation/NavigationInstrumentation/react/reactRouterV6Declarative/withMXLRouting.js.map +1 -1
  101. package/dist/instrumentations/server-timing/ServerTimingInstrumentation/ServerTimingInstrumentation.cjs.map +1 -1
  102. package/dist/instrumentations/server-timing/ServerTimingInstrumentation/ServerTimingInstrumentation.js.map +1 -1
  103. package/dist/instrumentations/session/SpanSessionBrowserActivityInstrumentation/SpanSessionBrowserActivityInstrumentation.cjs.map +1 -1
  104. package/dist/instrumentations/session/SpanSessionBrowserActivityInstrumentation/SpanSessionBrowserActivityInstrumentation.js.map +1 -1
  105. package/dist/instrumentations/session/SpanSessionOnLoadInstrumentation/SpanSessionOnLoadInstrumentation.cjs.map +1 -1
  106. package/dist/instrumentations/session/SpanSessionOnLoadInstrumentation/SpanSessionOnLoadInstrumentation.js.map +1 -1
  107. package/dist/instrumentations/session/SpanSessionTimeoutInstrumentation/SpanSessionTimeoutInstrumentation.cjs.map +1 -1
  108. package/dist/instrumentations/session/SpanSessionTimeoutInstrumentation/SpanSessionTimeoutInstrumentation.js.map +1 -1
  109. package/dist/instrumentations/session/SpanSessionVisibilityInstrumentation/SpanSessionVisibilityInstrumentation.cjs.map +1 -1
  110. package/dist/instrumentations/session/SpanSessionVisibilityInstrumentation/SpanSessionVisibilityInstrumentation.js.map +1 -1
  111. package/dist/instrumentations/user-timing/UserTimingInstrumentation/UserTimingInstrumentation.cjs.map +1 -1
  112. package/dist/instrumentations/user-timing/UserTimingInstrumentation/UserTimingInstrumentation.js.map +1 -1
  113. package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.cjs.map +1 -1
  114. package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.d.cts.map +1 -1
  115. package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.d.ts.map +1 -1
  116. package/dist/instrumentations/web-vitals/WebVitalsInstrumentation/WebVitalsInstrumentation.js.map +1 -1
  117. package/dist/instrumentations/xhr/MXLXHRInstrumentation/MXLXHRInstrumentation.cjs.map +1 -1
  118. package/dist/instrumentations/xhr/MXLXHRInstrumentation/MXLXHRInstrumentation.js.map +1 -1
  119. package/dist/managers/MXLConfigManager/MXLDynamicConfigManager.cjs +1 -1
  120. package/dist/managers/MXLConfigManager/MXLDynamicConfigManager.cjs.map +1 -1
  121. package/dist/managers/MXLConfigManager/MXLDynamicConfigManager.d.cts.map +1 -1
  122. package/dist/managers/MXLConfigManager/MXLDynamicConfigManager.d.ts.map +1 -1
  123. package/dist/managers/MXLConfigManager/MXLDynamicConfigManager.js +1 -1
  124. package/dist/managers/MXLConfigManager/MXLDynamicConfigManager.js.map +1 -1
  125. package/dist/managers/MXLConfigManager/constants.cjs.map +1 -1
  126. package/dist/managers/MXLConfigManager/constants.js.map +1 -1
  127. package/dist/managers/MXLConfigManager/utils.cjs.map +1 -1
  128. package/dist/managers/MXLConfigManager/utils.js.map +1 -1
  129. package/dist/managers/MXLLimitManager/MXLLimitManager.cjs.map +1 -1
  130. package/dist/managers/MXLLimitManager/MXLLimitManager.js.map +1 -1
  131. package/dist/managers/MXLLimitManager/constants.cjs.map +1 -1
  132. package/dist/managers/MXLLimitManager/constants.js.map +1 -1
  133. package/dist/managers/MXLLogManager/MXLLogManager.cjs.map +1 -1
  134. package/dist/managers/MXLLogManager/MXLLogManager.d.cts.map +1 -1
  135. package/dist/managers/MXLLogManager/MXLLogManager.d.ts.map +1 -1
  136. package/dist/managers/MXLLogManager/MXLLogManager.js.map +1 -1
  137. package/dist/managers/MXLPageManager/MXLPageManager.cjs.map +1 -1
  138. package/dist/managers/MXLPageManager/MXLPageManager.js.map +1 -1
  139. package/dist/managers/MXLSDKFeaturesManager/MXLSDKFeaturesManager.cjs.map +1 -1
  140. package/dist/managers/MXLSDKFeaturesManager/MXLSDKFeaturesManager.js.map +1 -1
  141. package/dist/managers/MXLSpanSessionManager/MXLSpanSessionManager.cjs.map +1 -1
  142. package/dist/managers/MXLSpanSessionManager/MXLSpanSessionManager.d.cts.map +1 -1
  143. package/dist/managers/MXLSpanSessionManager/MXLSpanSessionManager.d.ts.map +1 -1
  144. package/dist/managers/MXLSpanSessionManager/MXLSpanSessionManager.js.map +1 -1
  145. package/dist/managers/MXLTraceManager/MXLExtendedSpan.cjs.map +1 -1
  146. package/dist/managers/MXLTraceManager/MXLExtendedSpan.d.cts.map +1 -1
  147. package/dist/managers/MXLTraceManager/MXLExtendedSpan.d.ts.map +1 -1
  148. package/dist/managers/MXLTraceManager/MXLExtendedSpan.js.map +1 -1
  149. package/dist/managers/MXLTraceManager/MXLTraceManager.cjs.map +1 -1
  150. package/dist/managers/MXLTraceManager/MXLTraceManager.js.map +1 -1
  151. package/dist/managers/MXLUserManager/MXLUserManager.cjs.map +1 -1
  152. package/dist/managers/MXLUserManager/MXLUserManager.js.map +1 -1
  153. package/dist/managers/MXLUserManager/types.cjs.map +1 -1
  154. package/dist/managers/MXLUserManager/types.js.map +1 -1
  155. package/dist/mxl-web-sdk.js +5 -5
  156. package/dist/mxl-web-sdk.js.map +1 -1
  157. package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.cjs.map +1 -1
  158. package/dist/processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.js.map +1 -1
  159. package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.cjs.map +1 -1
  160. package/dist/processors/BrowserSpanProcessor/BrowserSpanProcessor.js.map +1 -1
  161. package/dist/processors/IdentifiableSessionLogRecordProcessor/IdentifiableSessionLogRecordProcessor.cjs.map +1 -1
  162. package/dist/processors/IdentifiableSessionLogRecordProcessor/IdentifiableSessionLogRecordProcessor.js.map +1 -1
  163. package/dist/processors/LogRecordScrubProcessor/LogRecordScrubProcessor.cjs.map +1 -1
  164. package/dist/processors/LogRecordScrubProcessor/LogRecordScrubProcessor.js.map +1 -1
  165. package/dist/processors/MXLLogRecordProcessor/MXLLogRecordProcessor.cjs.map +1 -1
  166. package/dist/processors/MXLLogRecordProcessor/MXLLogRecordProcessor.js.map +1 -1
  167. package/dist/processors/MXLNetworkSpanProcessor/MXLNetworkSpanProcessor.cjs.map +1 -1
  168. package/dist/processors/MXLNetworkSpanProcessor/MXLNetworkSpanProcessor.js.map +1 -1
  169. package/dist/processors/MXLSessionBatchedSpanProcessor/MXLSessionBatchedSpanProcessor.cjs.map +1 -1
  170. package/dist/processors/MXLSessionBatchedSpanProcessor/MXLSessionBatchedSpanProcessor.js.map +1 -1
  171. package/dist/processors/PageLogRecordProcessor/PageLogRecordProcessor.cjs.map +1 -1
  172. package/dist/processors/PageLogRecordProcessor/PageLogRecordProcessor.js.map +1 -1
  173. package/dist/processors/PageSpanProcessor/PageSpanProcessor.cjs.map +1 -1
  174. package/dist/processors/PageSpanProcessor/PageSpanProcessor.js.map +1 -1
  175. package/dist/processors/SpanScrubProcessor/SpanScrubProcessor.cjs.map +1 -1
  176. package/dist/processors/SpanScrubProcessor/SpanScrubProcessor.js.map +1 -1
  177. package/dist/processors/UserLogRecordProcessor/UserLogRecordProcessor.cjs.map +1 -1
  178. package/dist/processors/UserLogRecordProcessor/UserLogRecordProcessor.js.map +1 -1
  179. package/dist/processors/UserSpanProcessor/UserSpanProcessor.cjs.map +1 -1
  180. package/dist/processors/UserSpanProcessor/UserSpanProcessor.js.map +1 -1
  181. package/dist/propagators/MXLW3CTraceContextPropagator/MXLW3CTraceContextPropagator.cjs.map +1 -1
  182. package/dist/propagators/MXLW3CTraceContextPropagator/MXLW3CTraceContextPropagator.js.map +1 -1
  183. package/dist/resources/appInstanceId.cjs.map +1 -1
  184. package/dist/resources/appInstanceId.js.map +1 -1
  185. package/dist/resources/constants/index.cjs +1 -1
  186. package/dist/resources/constants/index.cjs.map +1 -1
  187. package/dist/resources/constants/index.d.cts +1 -1
  188. package/dist/resources/constants/index.d.ts +1 -1
  189. package/dist/resources/constants/index.js +1 -1
  190. package/dist/resources/constants/index.js.map +1 -1
  191. package/dist/resources/webSdkResource.cjs.map +1 -1
  192. package/dist/resources/webSdkResource.d.cts.map +1 -1
  193. package/dist/resources/webSdkResource.d.ts.map +1 -1
  194. package/dist/resources/webSdkResource.js.map +1 -1
  195. package/dist/sdk/defaultAttributeScrubbers.cjs.map +1 -1
  196. package/dist/sdk/defaultAttributeScrubbers.js.map +1 -1
  197. package/dist/sdk/initSDK.cjs +1 -1
  198. package/dist/sdk/initSDK.cjs.map +1 -1
  199. package/dist/sdk/initSDK.d.cts.map +1 -1
  200. package/dist/sdk/initSDK.d.ts.map +1 -1
  201. package/dist/sdk/initSDK.js +1 -1
  202. package/dist/sdk/initSDK.js.map +1 -1
  203. package/dist/sdk/registry.cjs.map +1 -1
  204. package/dist/sdk/registry.js.map +1 -1
  205. package/dist/sdk/setupDefaultInstrumentations.cjs.map +1 -1
  206. package/dist/sdk/setupDefaultInstrumentations.js.map +1 -1
  207. package/dist/sdk/setupSessionRecorder.cjs.map +1 -1
  208. package/dist/sdk/setupSessionRecorder.js.map +1 -1
  209. package/dist/sdk/types.d.cts.map +1 -1
  210. package/dist/sdk/types.d.ts +1 -1
  211. package/dist/sdk/types.d.ts.map +1 -1
  212. package/dist/sdk/utils.cjs.map +1 -1
  213. package/dist/sdk/utils.js.map +1 -1
  214. package/dist/transport/FetchTransport/FetchTransport.cjs.map +1 -1
  215. package/dist/transport/FetchTransport/FetchTransport.js.map +1 -1
  216. package/dist/transport/FetchTransport/createFetchTransport.cjs.map +1 -1
  217. package/dist/transport/FetchTransport/createFetchTransport.js.map +1 -1
  218. package/dist/transport/RetryingTransport/RetryingTransport.cjs.map +1 -1
  219. package/dist/transport/RetryingTransport/RetryingTransport.js.map +1 -1
  220. package/dist/transport/RetryingTransport/createRetryingTransport.cjs.map +1 -1
  221. package/dist/transport/RetryingTransport/createRetryingTransport.js.map +1 -1
  222. package/dist/utils/MXLSpanStorage/MXLSpanStorage.cjs.map +1 -1
  223. package/dist/utils/MXLSpanStorage/MXLSpanStorage.js.map +1 -1
  224. package/dist/utils/PerformanceManager/OTelPerformanceManager.cjs.map +1 -1
  225. package/dist/utils/PerformanceManager/OTelPerformanceManager.js.map +1 -1
  226. package/dist/utils/bulkAddEventListener/bulkAddEventListener.cjs.map +1 -1
  227. package/dist/utils/bulkAddEventListener/bulkAddEventListener.js.map +1 -1
  228. package/dist/utils/bulkRemoveEventListener/bulkRemoveEventListener.cjs.map +1 -1
  229. package/dist/utils/bulkRemoveEventListener/bulkRemoveEventListener.js.map +1 -1
  230. package/dist/utils/getVisibilityState.cjs.map +1 -1
  231. package/dist/utils/getVisibilityState.js.map +1 -1
  232. package/dist/utils/nsfConfigValidation.cjs.map +1 -1
  233. package/dist/utils/nsfConfigValidation.js.map +1 -1
  234. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MXLTraceExporter.js","names":[],"sources":["../../../src/exporters/MXLTraceExporter/MXLTraceExporter.ts"],"sourcesContent":["import { DEFAULT_MXL_EXPORTER_CONFIG } from '../constants.ts';\nimport { getMXLHeaders } from '../utils.ts';\nimport { OTLPFetchTraceExporter } from './OTLPFetchTraceExporter.ts';\nimport type { MXLTraceExporterArgs } from './types.ts';\nimport { getTraceEndpoint } from './utils.ts';\n\nexport class MXLTraceExporter extends OTLPFetchTraceExporter {\n public constructor({ appID, userID, mxlDataURL }: MXLTraceExporterArgs) {\n super({\n ...DEFAULT_MXL_EXPORTER_CONFIG,\n headers: getMXLHeaders(appID, userID),\n url: getTraceEndpoint(appID, mxlDataURL),\n });\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,mBAAb,cAAsC,uBAAuB;CAC3D,YAAmB,EAAE,OAAO,QAAQ,cAAoC;AACtE,QAAM;GACJ,GAAG;GACH,SAAS,cAAc,OAAO,OAAO;GACrC,KAAK,iBAAiB,OAAO,WAAW;GACzC,CAAC"}
1
+ {"version":3,"file":"MXLTraceExporter.js","names":[],"sources":["../../../src/exporters/MXLTraceExporter/MXLTraceExporter.ts"],"sourcesContent":["import { DEFAULT_MXL_EXPORTER_CONFIG } from '../constants';\nimport { getMXLHeaders } from '../utils';\nimport { OTLPFetchTraceExporter } from './OTLPFetchTraceExporter';\nimport type { MXLTraceExporterArgs } from './types';\nimport { getTraceEndpoint } from './utils';\n\nexport class MXLTraceExporter extends OTLPFetchTraceExporter {\n public constructor({ appID, userID, mxlDataURL }: MXLTraceExporterArgs) {\n super({\n ...DEFAULT_MXL_EXPORTER_CONFIG,\n headers: getMXLHeaders(appID, userID),\n url: getTraceEndpoint(appID, mxlDataURL),\n });\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,mBAAb,cAAsC,uBAAuB;CAC3D,YAAmB,EAAE,OAAO,QAAQ,cAAoC;AACtE,QAAM;GACJ,GAAG;GACH,SAAS,cAAc,OAAO,OAAO;GACrC,KAAK,iBAAiB,OAAO,WAAW;GACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"OTLPFetchTraceExporter.cjs","names":["BaseFetchExporter","createOtlpBrowserFetchExportDelegate","JsonTraceSerializer"],"sources":["../../../src/exporters/MXLTraceExporter/OTLPFetchTraceExporter.ts"],"sourcesContent":["import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-web';\nimport { JsonTraceSerializer } from '#safaricom-mxl/otlp-transformer'; // internal package: https://nodejs.org/api/packages.html#imports\nimport { BaseFetchExporter } from '../BaseFetchExporter/index.ts';\nimport { createOtlpBrowserFetchExportDelegate } from '../otlpBrowserFetchExportDelegate.ts';\nimport type { OtlpFetchExporterConfig } from '../types.ts';\n\nexport class OTLPFetchTraceExporter\n extends BaseFetchExporter<ReadableSpan[]>\n implements SpanExporter\n{\n public constructor(config: OtlpFetchExporterConfig) {\n super(\n createOtlpBrowserFetchExportDelegate(\n {\n ...config,\n compression: 'gzip',\n },\n JsonTraceSerializer,\n ),\n );\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,yBAAb,cACUA,sDAAAA,kBAEV;CACE,YAAmB,QAAiC;AAClD,QACEC,iDAAAA,qCACE;GACE,GAAG;GACH,aAAa;GACd,EACDC,cAAAA,oBACD,CACF"}
1
+ {"version":3,"file":"OTLPFetchTraceExporter.cjs","names":["BaseFetchExporter","createOtlpBrowserFetchExportDelegate","JsonTraceSerializer"],"sources":["../../../src/exporters/MXLTraceExporter/OTLPFetchTraceExporter.ts"],"sourcesContent":["import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-web';\nimport { JsonTraceSerializer } from '#safaricom-mxl/otlp-transformer'; // internal package: https://nodejs.org/api/packages.html#imports\nimport { BaseFetchExporter } from '../BaseFetchExporter';\nimport { createOtlpBrowserFetchExportDelegate } from '../otlpBrowserFetchExportDelegate';\nimport type { OtlpFetchExporterConfig } from '../types';\n\nexport class OTLPFetchTraceExporter\n extends BaseFetchExporter<ReadableSpan[]>\n implements SpanExporter\n{\n public constructor(config: OtlpFetchExporterConfig) {\n super(\n createOtlpBrowserFetchExportDelegate(\n {\n ...config,\n compression: 'gzip',\n },\n JsonTraceSerializer,\n ),\n );\n }\n}\n"],"mappings":";;;;;AAMA,IAAa,yBAAb,cACUA,sDAAAA,kBAEV;CACE,YAAmB,QAAiC;AAClD,QACEC,iDAAAA,qCACE;GACE,GAAG;GACH,aAAa;GACd,EACDC,cAAAA,oBACD,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"OTLPFetchTraceExporter.js","names":[],"sources":["../../../src/exporters/MXLTraceExporter/OTLPFetchTraceExporter.ts"],"sourcesContent":["import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-web';\nimport { JsonTraceSerializer } from '#safaricom-mxl/otlp-transformer'; // internal package: https://nodejs.org/api/packages.html#imports\nimport { BaseFetchExporter } from '../BaseFetchExporter/index.ts';\nimport { createOtlpBrowserFetchExportDelegate } from '../otlpBrowserFetchExportDelegate.ts';\nimport type { OtlpFetchExporterConfig } from '../types.ts';\n\nexport class OTLPFetchTraceExporter\n extends BaseFetchExporter<ReadableSpan[]>\n implements SpanExporter\n{\n public constructor(config: OtlpFetchExporterConfig) {\n super(\n createOtlpBrowserFetchExportDelegate(\n {\n ...config,\n compression: 'gzip',\n },\n JsonTraceSerializer,\n ),\n );\n }\n}\n"],"mappings":";;;;AAMA,IAAa,yBAAb,cACU,kBAEV;CACE,YAAmB,QAAiC;AAClD,QACE,qCACE;GACE,GAAG;GACH,aAAa;GACd,EACD,oBACD,CACF"}
1
+ {"version":3,"file":"OTLPFetchTraceExporter.js","names":[],"sources":["../../../src/exporters/MXLTraceExporter/OTLPFetchTraceExporter.ts"],"sourcesContent":["import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-web';\nimport { JsonTraceSerializer } from '#safaricom-mxl/otlp-transformer'; // internal package: https://nodejs.org/api/packages.html#imports\nimport { BaseFetchExporter } from '../BaseFetchExporter';\nimport { createOtlpBrowserFetchExportDelegate } from '../otlpBrowserFetchExportDelegate';\nimport type { OtlpFetchExporterConfig } from '../types';\n\nexport class OTLPFetchTraceExporter\n extends BaseFetchExporter<ReadableSpan[]>\n implements SpanExporter\n{\n public constructor(config: OtlpFetchExporterConfig) {\n super(\n createOtlpBrowserFetchExportDelegate(\n {\n ...config,\n compression: 'gzip',\n },\n JsonTraceSerializer,\n ),\n );\n }\n}\n"],"mappings":";;;;AAMA,IAAa,yBAAb,cACU,kBAEV;CACE,YAAmB,QAAiC;AAClD,QACE,qCACE;GACE,GAAG;GACH,aAAa;GACd,EACD,oBACD,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["getDataURL"],"sources":["../../../src/exporters/MXLTraceExporter/utils.ts"],"sourcesContent":["import { getDataURL } from '../utils.ts';\n\nexport const getTraceEndpoint = (appID: string, mxlDataURL?: string) =>\n `${getDataURL(appID, mxlDataURL)}/v1/traces`;\n"],"mappings":";;;AAEA,MAAa,oBAAoB,OAAe,eAC9C,GAAGA,wBAAAA,WAAW,OAAO,WAAW,CAAC"}
1
+ {"version":3,"file":"utils.cjs","names":["getDataURL"],"sources":["../../../src/exporters/MXLTraceExporter/utils.ts"],"sourcesContent":["import { getDataURL } from '../utils';\n\nexport const getTraceEndpoint = (appID: string, mxlDataURL?: string) =>\n `${getDataURL(appID, mxlDataURL)}/v1/traces`;\n"],"mappings":";;;AAEA,MAAa,oBAAoB,OAAe,eAC9C,GAAGA,wBAAAA,WAAW,OAAO,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../src/exporters/MXLTraceExporter/utils.ts"],"sourcesContent":["import { getDataURL } from '../utils.ts';\n\nexport const getTraceEndpoint = (appID: string, mxlDataURL?: string) =>\n `${getDataURL(appID, mxlDataURL)}/v1/traces`;\n"],"mappings":";;AAEA,MAAa,oBAAoB,OAAe,eAC9C,GAAG,WAAW,OAAO,WAAW,CAAC"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../src/exporters/MXLTraceExporter/utils.ts"],"sourcesContent":["import { getDataURL } from '../utils';\n\nexport const getTraceEndpoint = (appID: string, mxlDataURL?: string) =>\n `${getDataURL(appID, mxlDataURL)}/v1/traces`;\n"],"mappings":";;AAEA,MAAa,oBAAoB,OAAe,eAC9C,GAAG,WAAW,OAAO,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"otlpBrowserFetchExportDelegate.cjs","names":["createRetryingTransport","createFetchTransport"],"sources":["../../src/exporters/otlpBrowserFetchExportDelegate.ts"],"sourcesContent":["import { createOtlpNetworkExportDelegate } from '@opentelemetry/otlp-exporter-base';\nimport type { ISerializer } from '#safaricom-mxl/otlp-transformer'; // internal package: https://nodejs.org/api/packages.html#imports\nimport {\n createFetchTransport,\n createRetryingTransport,\n} from '../transport/index.ts';\nimport type { OtlpFetchExporterConfig } from './types.ts';\n\n// createOtlpBrowserFetchExportDelegate creates an export delegate that uses\n// the Fetch API to send data to an OTLP receiver.\nexport const createOtlpBrowserFetchExportDelegate = <Internal, Response>(\n config: OtlpFetchExporterConfig,\n serializer: ISerializer<Internal, Response>,\n) =>\n // createOtlpNetworkExportDelegate has an internal queue that handles\n // multiple requests going at the same time.\n createOtlpNetworkExportDelegate(\n config,\n serializer,\n createRetryingTransport({\n transport: createFetchTransport(config),\n }),\n );\n"],"mappings":";;;;;;AAUA,MAAa,wCACX,QACA,gBAAA,GAAA,kCAAA,iCAKE,QACA,YACAA,4DAAAA,wBAAwB,EACtB,WAAWC,sDAAAA,qBAAqB,OAAO,EACxC,CAAC,CACH"}
1
+ {"version":3,"file":"otlpBrowserFetchExportDelegate.cjs","names":["createRetryingTransport","createFetchTransport"],"sources":["../../src/exporters/otlpBrowserFetchExportDelegate.ts"],"sourcesContent":["import { createOtlpNetworkExportDelegate } from '@opentelemetry/otlp-exporter-base';\nimport type { ISerializer } from '#safaricom-mxl/otlp-transformer'; // internal package: https://nodejs.org/api/packages.html#imports\nimport { createFetchTransport, createRetryingTransport } from '../transport';\nimport type { OtlpFetchExporterConfig } from './types';\n\n// createOtlpBrowserFetchExportDelegate creates an export delegate that uses\n// the Fetch API to send data to an OTLP receiver.\nexport const createOtlpBrowserFetchExportDelegate = <Internal, Response>(\n config: OtlpFetchExporterConfig,\n serializer: ISerializer<Internal, Response>,\n) =>\n // createOtlpNetworkExportDelegate has an internal queue that handles\n // multiple requests going at the same time.\n createOtlpNetworkExportDelegate(\n config,\n serializer,\n createRetryingTransport({\n transport: createFetchTransport(config),\n }),\n );\n"],"mappings":";;;;;;AAOA,MAAa,wCACX,QACA,gBAAA,GAAA,kCAAA,iCAKE,QACA,YACAA,4DAAAA,wBAAwB,EACtB,WAAWC,sDAAAA,qBAAqB,OAAO,EACxC,CAAC,CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"otlpBrowserFetchExportDelegate.d.cts","names":[],"sources":["../../src/exporters/otlpBrowserFetchExportDelegate.ts"],"mappings":";;;;;cAUa,oCAAA,uBACX,MAAA,EAAQ,uBAAA,EACR,UAAA,EAAY,WAAA,CAAY,QAAA,EAAU,QAAA,MAAS,oCAAA,CAAA,mBAAA,CAAA,QAAA"}
1
+ {"version":3,"file":"otlpBrowserFetchExportDelegate.d.cts","names":[],"sources":["../../src/exporters/otlpBrowserFetchExportDelegate.ts"],"mappings":";;;;;cAOa,oCAAA,uBACX,MAAA,EAAQ,uBAAA,EACR,UAAA,EAAY,WAAA,CAAY,QAAA,EAAU,QAAA,MAAS,oCAAA,CAAA,mBAAA,CAAA,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"otlpBrowserFetchExportDelegate.d.ts","names":[],"sources":["../../src/exporters/otlpBrowserFetchExportDelegate.ts"],"mappings":";;;;;cAUa,oCAAA,uBACX,MAAA,EAAQ,uBAAA,EACR,UAAA,EAAY,WAAA,CAAY,QAAA,EAAU,QAAA,MAAS,oCAAA,CAAA,mBAAA,CAAA,QAAA"}
1
+ {"version":3,"file":"otlpBrowserFetchExportDelegate.d.ts","names":[],"sources":["../../src/exporters/otlpBrowserFetchExportDelegate.ts"],"mappings":";;;;;cAOa,oCAAA,uBACX,MAAA,EAAQ,uBAAA,EACR,UAAA,EAAY,WAAA,CAAY,QAAA,EAAU,QAAA,MAAS,oCAAA,CAAA,mBAAA,CAAA,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"otlpBrowserFetchExportDelegate.js","names":[],"sources":["../../src/exporters/otlpBrowserFetchExportDelegate.ts"],"sourcesContent":["import { createOtlpNetworkExportDelegate } from '@opentelemetry/otlp-exporter-base';\nimport type { ISerializer } from '#safaricom-mxl/otlp-transformer'; // internal package: https://nodejs.org/api/packages.html#imports\nimport {\n createFetchTransport,\n createRetryingTransport,\n} from '../transport/index.ts';\nimport type { OtlpFetchExporterConfig } from './types.ts';\n\n// createOtlpBrowserFetchExportDelegate creates an export delegate that uses\n// the Fetch API to send data to an OTLP receiver.\nexport const createOtlpBrowserFetchExportDelegate = <Internal, Response>(\n config: OtlpFetchExporterConfig,\n serializer: ISerializer<Internal, Response>,\n) =>\n // createOtlpNetworkExportDelegate has an internal queue that handles\n // multiple requests going at the same time.\n createOtlpNetworkExportDelegate(\n config,\n serializer,\n createRetryingTransport({\n transport: createFetchTransport(config),\n }),\n );\n"],"mappings":";;;;AAUA,MAAa,wCACX,QACA,eAIA,gCACE,QACA,YACA,wBAAwB,EACtB,WAAW,qBAAqB,OAAO,EACxC,CAAC,CACH"}
1
+ {"version":3,"file":"otlpBrowserFetchExportDelegate.js","names":[],"sources":["../../src/exporters/otlpBrowserFetchExportDelegate.ts"],"sourcesContent":["import { createOtlpNetworkExportDelegate } from '@opentelemetry/otlp-exporter-base';\nimport type { ISerializer } from '#safaricom-mxl/otlp-transformer'; // internal package: https://nodejs.org/api/packages.html#imports\nimport { createFetchTransport, createRetryingTransport } from '../transport';\nimport type { OtlpFetchExporterConfig } from './types';\n\n// createOtlpBrowserFetchExportDelegate creates an export delegate that uses\n// the Fetch API to send data to an OTLP receiver.\nexport const createOtlpBrowserFetchExportDelegate = <Internal, Response>(\n config: OtlpFetchExporterConfig,\n serializer: ISerializer<Internal, Response>,\n) =>\n // createOtlpNetworkExportDelegate has an internal queue that handles\n // multiple requests going at the same time.\n createOtlpNetworkExportDelegate(\n config,\n serializer,\n createRetryingTransport({\n transport: createFetchTransport(config),\n }),\n );\n"],"mappings":";;;;AAOA,MAAa,wCACX,QACA,eAIA,gCACE,QACA,YACA,wBAAwB,EACtB,WAAW,qBAAqB,OAAO,EACxC,CAAC,CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"MXLInstrumentationBase.cjs","names":["InstrumentationAbstract","OTelPerformanceManager","session","log"],"sources":["../../../src/instrumentations/MXLInstrumentationBase/MXLInstrumentationBase.ts"],"sourcesContent":["import type {\n Instrumentation,\n InstrumentationConfig,\n InstrumentationModuleDefinition,\n} from '@opentelemetry/instrumentation';\nimport type { LogManager } from '../../api-logs/index.ts';\nimport { log } from '../../api-logs/index.ts';\nimport type { SpanSessionManager } from '../../api-sessions/index.ts';\nimport { session } from '../../api-sessions/index.ts';\nimport type { LimitManagerInternal } from '../../managers/MXLLimitManager/types.ts';\nimport type { PerformanceManager } from '../../utils/index.ts';\nimport { OTelPerformanceManager } from '../../utils/index.ts';\nimport { InstrumentationAbstract } from '../InstrumentationAbstract/index.ts';\nimport type { MXLInstrumentationBaseArgs } from './types.ts';\n\nexport abstract class MXLInstrumentationBase<\n ConfigType extends InstrumentationConfig = InstrumentationConfig,\n >\n extends InstrumentationAbstract<ConfigType>\n implements Instrumentation<ConfigType>\n{\n private _sessionManager: SpanSessionManager;\n private _logManager: LogManager;\n private _limitManager: LimitManagerInternal | undefined;\n private readonly _perf: PerformanceManager;\n\n protected constructor({\n instrumentationName,\n instrumentationVersion,\n config,\n diag,\n perf,\n limitManager,\n }: MXLInstrumentationBaseArgs<ConfigType>) {\n super(instrumentationName, instrumentationVersion, config);\n // optionally override the diag logger from the base class\n if (diag) {\n this._diag = diag;\n }\n this._perf = perf ?? new OTelPerformanceManager();\n this._sessionManager = session.getSpanSessionManager();\n this._logManager = log.getLogManager();\n this._limitManager = limitManager;\n }\n\n /** Optional cap manager for timings and similar high-volume probes. */\n\n protected get limitManager(): LimitManagerInternal | undefined {\n return this._limitManager;\n }\n /* Returns session provider */\n protected get sessionManager(): SpanSessionManager {\n return this._sessionManager;\n }\n\n /* Returns log manager */\n protected get logManager(): LogManager {\n return this._logManager;\n }\n\n /* Returns the performance manager */\n protected get perf(): PerformanceManager {\n return this._perf;\n }\n\n // no-op\n // Note: OTel uses `| void` but we use `| undefined` for semantic clarity.\n // `void` in union types is confusing because it mixes \"returns nothing\" with \"returns data or nothing\".\n // `undefined` better expresses the intent: this method may or may not return a value.\n protected override init():\n | InstrumentationModuleDefinition\n | InstrumentationModuleDefinition[]\n | undefined {\n return;\n }\n\n public setLimitManager(limitManager: LimitManagerInternal): void {\n this._limitManager = limitManager;\n }\n\n public setLogManager(logManager: LogManager): void {\n this._logManager = logManager;\n }\n\n public setSessionManager(sessionManager: SpanSessionManager): void {\n this._sessionManager = sessionManager;\n }\n}\n"],"mappings":";;;;;;AAeA,IAAsB,yBAAtB,cAGUA,yEAAAA,wBAEV;CACE;CACA;CACA;CACA;CAEA,YAAsB,EACpB,qBACA,wBACA,QACA,MACA,MACA,gBACyC;AACzC,QAAM,qBAAqB,wBAAwB,OAAO;AAE1D,MAAI,KACF,MAAK,QAAQ;AAEf,OAAK,QAAQ,QAAQ,IAAIC,wDAAAA,wBAAwB;AACjD,OAAK,kBAAkBC,gCAAAA,QAAQ,uBAAuB;AACtD,OAAK,cAAcC,wBAAAA,IAAI,eAAe;AACtC,OAAK,gBAAgB;;;CAKvB,IAAc,eAAiD;AAC7D,SAAO,KAAK;;CAGd,IAAc,iBAAqC;AACjD,SAAO,KAAK;;CAId,IAAc,aAAyB;AACrC,SAAO,KAAK;;CAId,IAAc,OAA2B;AACvC,SAAO,KAAK;;CAOd,OAGc;CAId,gBAAuB,cAA0C;AAC/D,OAAK,gBAAgB;;CAGvB,cAAqB,YAA8B;AACjD,OAAK,cAAc;;CAGrB,kBAAyB,gBAA0C;AACjE,OAAK,kBAAkB"}
1
+ {"version":3,"file":"MXLInstrumentationBase.cjs","names":["InstrumentationAbstract","OTelPerformanceManager","session","log"],"sources":["../../../src/instrumentations/MXLInstrumentationBase/MXLInstrumentationBase.ts"],"sourcesContent":["import type {\n Instrumentation,\n InstrumentationConfig,\n InstrumentationModuleDefinition,\n} from '@opentelemetry/instrumentation';\nimport type { LogManager } from '../../api-logs';\nimport { log } from '../../api-logs';\nimport type { SpanSessionManager } from '../../api-sessions';\nimport { session } from '../../api-sessions';\nimport type { LimitManagerInternal } from '../../managers/MXLLimitManager/types';\nimport type { PerformanceManager } from '../../utils';\nimport { OTelPerformanceManager } from '../../utils';\nimport { InstrumentationAbstract } from '../InstrumentationAbstract';\nimport type { MXLInstrumentationBaseArgs } from './types';\n\nexport abstract class MXLInstrumentationBase<\n ConfigType extends InstrumentationConfig = InstrumentationConfig,\n >\n extends InstrumentationAbstract<ConfigType>\n implements Instrumentation<ConfigType>\n{\n private _sessionManager: SpanSessionManager;\n private _logManager: LogManager;\n private _limitManager: LimitManagerInternal | undefined;\n private readonly _perf: PerformanceManager;\n\n protected constructor({\n instrumentationName,\n instrumentationVersion,\n config,\n diag,\n perf,\n limitManager,\n }: MXLInstrumentationBaseArgs<ConfigType>) {\n super(instrumentationName, instrumentationVersion, config);\n // optionally override the diag logger from the base class\n if (diag) {\n this._diag = diag;\n }\n this._perf = perf ?? new OTelPerformanceManager();\n this._sessionManager = session.getSpanSessionManager();\n this._logManager = log.getLogManager();\n this._limitManager = limitManager;\n }\n\n /** Optional cap manager for timings and similar high-volume probes. */\n\n protected get limitManager(): LimitManagerInternal | undefined {\n return this._limitManager;\n }\n /* Returns session provider */\n protected get sessionManager(): SpanSessionManager {\n return this._sessionManager;\n }\n\n /* Returns log manager */\n protected get logManager(): LogManager {\n return this._logManager;\n }\n\n /* Returns the performance manager */\n protected get perf(): PerformanceManager {\n return this._perf;\n }\n\n // no-op\n // Note: OTel uses `| void` but we use `| undefined` for semantic clarity.\n // `void` in union types is confusing because it mixes \"returns nothing\" with \"returns data or nothing\".\n // `undefined` better expresses the intent: this method may or may not return a value.\n protected override init():\n | InstrumentationModuleDefinition\n | InstrumentationModuleDefinition[]\n | undefined {\n return;\n }\n\n public setLimitManager(limitManager: LimitManagerInternal): void {\n this._limitManager = limitManager;\n }\n\n public setLogManager(logManager: LogManager): void {\n this._logManager = logManager;\n }\n\n public setSessionManager(sessionManager: SpanSessionManager): void {\n this._sessionManager = sessionManager;\n }\n}\n"],"mappings":";;;;;;AAeA,IAAsB,yBAAtB,cAGUA,yEAAAA,wBAEV;CACE;CACA;CACA;CACA;CAEA,YAAsB,EACpB,qBACA,wBACA,QACA,MACA,MACA,gBACyC;AACzC,QAAM,qBAAqB,wBAAwB,OAAO;AAE1D,MAAI,KACF,MAAK,QAAQ;AAEf,OAAK,QAAQ,QAAQ,IAAIC,wDAAAA,wBAAwB;AACjD,OAAK,kBAAkBC,gCAAAA,QAAQ,uBAAuB;AACtD,OAAK,cAAcC,wBAAAA,IAAI,eAAe;AACtC,OAAK,gBAAgB;;;CAKvB,IAAc,eAAiD;AAC7D,SAAO,KAAK;;CAGd,IAAc,iBAAqC;AACjD,SAAO,KAAK;;CAId,IAAc,aAAyB;AACrC,SAAO,KAAK;;CAId,IAAc,OAA2B;AACvC,SAAO,KAAK;;CAOd,OAGc;CAId,gBAAuB,cAA0C;AAC/D,OAAK,gBAAgB;;CAGvB,cAAqB,YAA8B;AACjD,OAAK,cAAc;;CAGrB,kBAAyB,gBAA0C;AACjE,OAAK,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"MXLInstrumentationBase.js","names":[],"sources":["../../../src/instrumentations/MXLInstrumentationBase/MXLInstrumentationBase.ts"],"sourcesContent":["import type {\n Instrumentation,\n InstrumentationConfig,\n InstrumentationModuleDefinition,\n} from '@opentelemetry/instrumentation';\nimport type { LogManager } from '../../api-logs/index.ts';\nimport { log } from '../../api-logs/index.ts';\nimport type { SpanSessionManager } from '../../api-sessions/index.ts';\nimport { session } from '../../api-sessions/index.ts';\nimport type { LimitManagerInternal } from '../../managers/MXLLimitManager/types.ts';\nimport type { PerformanceManager } from '../../utils/index.ts';\nimport { OTelPerformanceManager } from '../../utils/index.ts';\nimport { InstrumentationAbstract } from '../InstrumentationAbstract/index.ts';\nimport type { MXLInstrumentationBaseArgs } from './types.ts';\n\nexport abstract class MXLInstrumentationBase<\n ConfigType extends InstrumentationConfig = InstrumentationConfig,\n >\n extends InstrumentationAbstract<ConfigType>\n implements Instrumentation<ConfigType>\n{\n private _sessionManager: SpanSessionManager;\n private _logManager: LogManager;\n private _limitManager: LimitManagerInternal | undefined;\n private readonly _perf: PerformanceManager;\n\n protected constructor({\n instrumentationName,\n instrumentationVersion,\n config,\n diag,\n perf,\n limitManager,\n }: MXLInstrumentationBaseArgs<ConfigType>) {\n super(instrumentationName, instrumentationVersion, config);\n // optionally override the diag logger from the base class\n if (diag) {\n this._diag = diag;\n }\n this._perf = perf ?? new OTelPerformanceManager();\n this._sessionManager = session.getSpanSessionManager();\n this._logManager = log.getLogManager();\n this._limitManager = limitManager;\n }\n\n /** Optional cap manager for timings and similar high-volume probes. */\n\n protected get limitManager(): LimitManagerInternal | undefined {\n return this._limitManager;\n }\n /* Returns session provider */\n protected get sessionManager(): SpanSessionManager {\n return this._sessionManager;\n }\n\n /* Returns log manager */\n protected get logManager(): LogManager {\n return this._logManager;\n }\n\n /* Returns the performance manager */\n protected get perf(): PerformanceManager {\n return this._perf;\n }\n\n // no-op\n // Note: OTel uses `| void` but we use `| undefined` for semantic clarity.\n // `void` in union types is confusing because it mixes \"returns nothing\" with \"returns data or nothing\".\n // `undefined` better expresses the intent: this method may or may not return a value.\n protected override init():\n | InstrumentationModuleDefinition\n | InstrumentationModuleDefinition[]\n | undefined {\n return;\n }\n\n public setLimitManager(limitManager: LimitManagerInternal): void {\n this._limitManager = limitManager;\n }\n\n public setLogManager(logManager: LogManager): void {\n this._logManager = logManager;\n }\n\n public setSessionManager(sessionManager: SpanSessionManager): void {\n this._sessionManager = sessionManager;\n }\n}\n"],"mappings":";;;;;AAeA,IAAsB,yBAAtB,cAGU,wBAEV;CACE;CACA;CACA;CACA;CAEA,YAAsB,EACpB,qBACA,wBACA,QACA,MACA,MACA,gBACyC;AACzC,QAAM,qBAAqB,wBAAwB,OAAO;AAE1D,MAAI,KACF,MAAK,QAAQ;AAEf,OAAK,QAAQ,QAAQ,IAAI,wBAAwB;AACjD,OAAK,kBAAkB,QAAQ,uBAAuB;AACtD,OAAK,cAAc,IAAI,eAAe;AACtC,OAAK,gBAAgB;;;CAKvB,IAAc,eAAiD;AAC7D,SAAO,KAAK;;CAGd,IAAc,iBAAqC;AACjD,SAAO,KAAK;;CAId,IAAc,aAAyB;AACrC,SAAO,KAAK;;CAId,IAAc,OAA2B;AACvC,SAAO,KAAK;;CAOd,OAGc;CAId,gBAAuB,cAA0C;AAC/D,OAAK,gBAAgB;;CAGvB,cAAqB,YAA8B;AACjD,OAAK,cAAc;;CAGrB,kBAAyB,gBAA0C;AACjE,OAAK,kBAAkB"}
1
+ {"version":3,"file":"MXLInstrumentationBase.js","names":[],"sources":["../../../src/instrumentations/MXLInstrumentationBase/MXLInstrumentationBase.ts"],"sourcesContent":["import type {\n Instrumentation,\n InstrumentationConfig,\n InstrumentationModuleDefinition,\n} from '@opentelemetry/instrumentation';\nimport type { LogManager } from '../../api-logs';\nimport { log } from '../../api-logs';\nimport type { SpanSessionManager } from '../../api-sessions';\nimport { session } from '../../api-sessions';\nimport type { LimitManagerInternal } from '../../managers/MXLLimitManager/types';\nimport type { PerformanceManager } from '../../utils';\nimport { OTelPerformanceManager } from '../../utils';\nimport { InstrumentationAbstract } from '../InstrumentationAbstract';\nimport type { MXLInstrumentationBaseArgs } from './types';\n\nexport abstract class MXLInstrumentationBase<\n ConfigType extends InstrumentationConfig = InstrumentationConfig,\n >\n extends InstrumentationAbstract<ConfigType>\n implements Instrumentation<ConfigType>\n{\n private _sessionManager: SpanSessionManager;\n private _logManager: LogManager;\n private _limitManager: LimitManagerInternal | undefined;\n private readonly _perf: PerformanceManager;\n\n protected constructor({\n instrumentationName,\n instrumentationVersion,\n config,\n diag,\n perf,\n limitManager,\n }: MXLInstrumentationBaseArgs<ConfigType>) {\n super(instrumentationName, instrumentationVersion, config);\n // optionally override the diag logger from the base class\n if (diag) {\n this._diag = diag;\n }\n this._perf = perf ?? new OTelPerformanceManager();\n this._sessionManager = session.getSpanSessionManager();\n this._logManager = log.getLogManager();\n this._limitManager = limitManager;\n }\n\n /** Optional cap manager for timings and similar high-volume probes. */\n\n protected get limitManager(): LimitManagerInternal | undefined {\n return this._limitManager;\n }\n /* Returns session provider */\n protected get sessionManager(): SpanSessionManager {\n return this._sessionManager;\n }\n\n /* Returns log manager */\n protected get logManager(): LogManager {\n return this._logManager;\n }\n\n /* Returns the performance manager */\n protected get perf(): PerformanceManager {\n return this._perf;\n }\n\n // no-op\n // Note: OTel uses `| void` but we use `| undefined` for semantic clarity.\n // `void` in union types is confusing because it mixes \"returns nothing\" with \"returns data or nothing\".\n // `undefined` better expresses the intent: this method may or may not return a value.\n protected override init():\n | InstrumentationModuleDefinition\n | InstrumentationModuleDefinition[]\n | undefined {\n return;\n }\n\n public setLimitManager(limitManager: LimitManagerInternal): void {\n this._limitManager = limitManager;\n }\n\n public setLogManager(logManager: LogManager): void {\n this._logManager = logManager;\n }\n\n public setSessionManager(sessionManager: SpanSessionManager): void {\n this._sessionManager = sessionManager;\n }\n}\n"],"mappings":";;;;;AAeA,IAAsB,yBAAtB,cAGU,wBAEV;CACE;CACA;CACA;CACA;CAEA,YAAsB,EACpB,qBACA,wBACA,QACA,MACA,MACA,gBACyC;AACzC,QAAM,qBAAqB,wBAAwB,OAAO;AAE1D,MAAI,KACF,MAAK,QAAQ;AAEf,OAAK,QAAQ,QAAQ,IAAI,wBAAwB;AACjD,OAAK,kBAAkB,QAAQ,uBAAuB;AACtD,OAAK,cAAc,IAAI,eAAe;AACtC,OAAK,gBAAgB;;;CAKvB,IAAc,eAAiD;AAC7D,SAAO,KAAK;;CAGd,IAAc,iBAAqC;AACjD,SAAO,KAAK;;CAId,IAAc,aAAyB;AACrC,SAAO,KAAK;;CAId,IAAc,OAA2B;AACvC,SAAO,KAAK;;CAOd,OAGc;CAId,gBAAuB,cAA0C;AAC/D,OAAK,gBAAgB;;CAGvB,cAAqB,YAA8B;AACjD,OAAK,cAAc;;CAGrB,kBAAyB,gBAA0C;AACjE,OAAK,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClicksInstrumentation.cjs","names":["MXLInstrumentationBase","getHTMLElementFriendlyName"],"sources":["../../../../src/instrumentations/clicks/ClicksInstrumentation/ClicksInstrumentation.ts"],"sourcesContent":["/*\n This instrumentation is taking code from here as a starting point:\n https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/plugins/web/opentelemetry-instrumentation-user-interaction/src/instrumentation.ts\n\n But not using that instrumentation directly because:\n\n 1) We want to record clicks as span events on the Session span\n 2) There is a bug with the instrumentation that causes a large number of spans to be created for a single click\n when zone context isn't available. To avoid the bug we take a simpler approach here and add a listener directly\n to `document` rather than trying to patch the `addEventListener` method on the prototype, this does mean we miss\n recording click events for which `stopPropagation` is called. See https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1368\n */\n\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport type { ClicksInstrumentationArgs } from './types.ts';\n\nimport { getHTMLElementFriendlyName } from './utils.ts';\n\nexport class ClicksInstrumentation extends MXLInstrumentationBase {\n private readonly _onClickHandler: (event: MouseEvent) => void;\n\n public constructor({\n diag,\n perf,\n shouldTrack,\n innerTextForElement,\n }: ClicksInstrumentationArgs = {}) {\n super({\n instrumentationName: 'ClicksInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n\n this._onClickHandler = (event: MouseEvent) => {\n const element = event.target;\n\n if (!(element instanceof HTMLElement)) {\n return;\n }\n if (element.hasAttribute('disabled')) {\n return;\n }\n\n if (shouldTrack && !shouldTrack(element)) {\n return;\n }\n\n try {\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n if (currentSessionSpan) {\n currentSessionSpan.addEvent(\n 'click',\n {\n 'mxl.type': 'ux.tap',\n 'view.name': getHTMLElementFriendlyName(\n element,\n innerTextForElement\n ? innerTextForElement(element)\n : element.innerText,\n ),\n 'tap.coords': `${event.x.toString()},${event.y.toString()}`,\n },\n this.perf.epochMillisFromOriginOffset(event.timeStamp),\n );\n }\n } catch (e) {\n this._diag.error('failed to create new user interaction span event', e);\n }\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public disable(): void {\n document.removeEventListener('click', this._onClickHandler);\n }\n\n public enable(): void {\n document.addEventListener('click', this._onClickHandler);\n }\n}\n"],"mappings":";;;;AAkBA,IAAa,wBAAb,cAA2CA,uEAAAA,uBAAuB;CAChE;CAEA,YAAmB,EACjB,MACA,MACA,aACA,wBAC6B,EAAE,EAAE;AACjC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,mBAAmB,UAAsB;GAC5C,MAAM,UAAU,MAAM;AAEtB,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,QAAQ,aAAa,WAAW,CAClC;AAGF,OAAI,eAAe,CAAC,YAAY,QAAQ,CACtC;AAGF,OAAI;IACF,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,QAAI,mBACF,oBAAmB,SACjB,SACA;KACE,YAAY;KACZ,aAAaC,4DAAAA,2BACX,SACA,sBACI,oBAAoB,QAAQ,GAC5B,QAAQ,UACb;KACD,cAAc,GAAG,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,UAAU;KAC1D,EACD,KAAK,KAAK,4BAA4B,MAAM,UAAU,CACvD;YAEI,GAAG;AACV,SAAK,MAAM,MAAM,oDAAoD,EAAE;;;AAI3E,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,WAAS,oBAAoB,SAAS,KAAK,gBAAgB;;CAG7D,SAAsB;AACpB,WAAS,iBAAiB,SAAS,KAAK,gBAAgB"}
1
+ {"version":3,"file":"ClicksInstrumentation.cjs","names":["MXLInstrumentationBase","getHTMLElementFriendlyName"],"sources":["../../../../src/instrumentations/clicks/ClicksInstrumentation/ClicksInstrumentation.ts"],"sourcesContent":["/*\n This instrumentation is taking code from here as a starting point:\n https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/plugins/web/opentelemetry-instrumentation-user-interaction/src/instrumentation.ts\n\n But not using that instrumentation directly because:\n\n 1) We want to record clicks as span events on the Session span\n 2) There is a bug with the instrumentation that causes a large number of spans to be created for a single click\n when zone context isn't available. To avoid the bug we take a simpler approach here and add a listener directly\n to `document` rather than trying to patch the `addEventListener` method on the prototype, this does mean we miss\n recording click events for which `stopPropagation` is called. See https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1368\n */\n\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport type { ClicksInstrumentationArgs } from './types';\n\nimport { getHTMLElementFriendlyName } from './utils';\n\nexport class ClicksInstrumentation extends MXLInstrumentationBase {\n private readonly _onClickHandler: (event: MouseEvent) => void;\n\n public constructor({\n diag,\n perf,\n shouldTrack,\n innerTextForElement,\n }: ClicksInstrumentationArgs = {}) {\n super({\n instrumentationName: 'ClicksInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n\n this._onClickHandler = (event: MouseEvent) => {\n const element = event.target;\n\n if (!(element instanceof HTMLElement)) {\n return;\n }\n if (element.hasAttribute('disabled')) {\n return;\n }\n\n if (shouldTrack && !shouldTrack(element)) {\n return;\n }\n\n try {\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n if (currentSessionSpan) {\n currentSessionSpan.addEvent(\n 'click',\n {\n 'mxl.type': 'ux.tap',\n 'view.name': getHTMLElementFriendlyName(\n element,\n innerTextForElement\n ? innerTextForElement(element)\n : element.innerText,\n ),\n 'tap.coords': `${event.x.toString()},${event.y.toString()}`,\n },\n this.perf.epochMillisFromOriginOffset(event.timeStamp),\n );\n }\n } catch (e) {\n this._diag.error('failed to create new user interaction span event', e);\n }\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public disable(): void {\n document.removeEventListener('click', this._onClickHandler);\n }\n\n public enable(): void {\n document.addEventListener('click', this._onClickHandler);\n }\n}\n"],"mappings":";;;;AAkBA,IAAa,wBAAb,cAA2CA,uEAAAA,uBAAuB;CAChE;CAEA,YAAmB,EACjB,MACA,MACA,aACA,wBAC6B,EAAE,EAAE;AACjC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,mBAAmB,UAAsB;GAC5C,MAAM,UAAU,MAAM;AAEtB,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,QAAQ,aAAa,WAAW,CAClC;AAGF,OAAI,eAAe,CAAC,YAAY,QAAQ,CACtC;AAGF,OAAI;IACF,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,QAAI,mBACF,oBAAmB,SACjB,SACA;KACE,YAAY;KACZ,aAAaC,4DAAAA,2BACX,SACA,sBACI,oBAAoB,QAAQ,GAC5B,QAAQ,UACb;KACD,cAAc,GAAG,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,UAAU;KAC1D,EACD,KAAK,KAAK,4BAA4B,MAAM,UAAU,CACvD;YAEI,GAAG;AACV,SAAK,MAAM,MAAM,oDAAoD,EAAE;;;AAI3E,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,WAAS,oBAAoB,SAAS,KAAK,gBAAgB;;CAG7D,SAAsB;AACpB,WAAS,iBAAiB,SAAS,KAAK,gBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClicksInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/clicks/ClicksInstrumentation/ClicksInstrumentation.ts"],"sourcesContent":["/*\n This instrumentation is taking code from here as a starting point:\n https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/plugins/web/opentelemetry-instrumentation-user-interaction/src/instrumentation.ts\n\n But not using that instrumentation directly because:\n\n 1) We want to record clicks as span events on the Session span\n 2) There is a bug with the instrumentation that causes a large number of spans to be created for a single click\n when zone context isn't available. To avoid the bug we take a simpler approach here and add a listener directly\n to `document` rather than trying to patch the `addEventListener` method on the prototype, this does mean we miss\n recording click events for which `stopPropagation` is called. See https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1368\n */\n\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport type { ClicksInstrumentationArgs } from './types.ts';\n\nimport { getHTMLElementFriendlyName } from './utils.ts';\n\nexport class ClicksInstrumentation extends MXLInstrumentationBase {\n private readonly _onClickHandler: (event: MouseEvent) => void;\n\n public constructor({\n diag,\n perf,\n shouldTrack,\n innerTextForElement,\n }: ClicksInstrumentationArgs = {}) {\n super({\n instrumentationName: 'ClicksInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n\n this._onClickHandler = (event: MouseEvent) => {\n const element = event.target;\n\n if (!(element instanceof HTMLElement)) {\n return;\n }\n if (element.hasAttribute('disabled')) {\n return;\n }\n\n if (shouldTrack && !shouldTrack(element)) {\n return;\n }\n\n try {\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n if (currentSessionSpan) {\n currentSessionSpan.addEvent(\n 'click',\n {\n 'mxl.type': 'ux.tap',\n 'view.name': getHTMLElementFriendlyName(\n element,\n innerTextForElement\n ? innerTextForElement(element)\n : element.innerText,\n ),\n 'tap.coords': `${event.x.toString()},${event.y.toString()}`,\n },\n this.perf.epochMillisFromOriginOffset(event.timeStamp),\n );\n }\n } catch (e) {\n this._diag.error('failed to create new user interaction span event', e);\n }\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public disable(): void {\n document.removeEventListener('click', this._onClickHandler);\n }\n\n public enable(): void {\n document.addEventListener('click', this._onClickHandler);\n }\n}\n"],"mappings":";;;AAkBA,IAAa,wBAAb,cAA2C,uBAAuB;CAChE;CAEA,YAAmB,EACjB,MACA,MACA,aACA,wBAC6B,EAAE,EAAE;AACjC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,mBAAmB,UAAsB;GAC5C,MAAM,UAAU,MAAM;AAEtB,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,QAAQ,aAAa,WAAW,CAClC;AAGF,OAAI,eAAe,CAAC,YAAY,QAAQ,CACtC;AAGF,OAAI;IACF,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,QAAI,mBACF,oBAAmB,SACjB,SACA;KACE,YAAY;KACZ,aAAa,2BACX,SACA,sBACI,oBAAoB,QAAQ,GAC5B,QAAQ,UACb;KACD,cAAc,GAAG,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,UAAU;KAC1D,EACD,KAAK,KAAK,4BAA4B,MAAM,UAAU,CACvD;YAEI,GAAG;AACV,SAAK,MAAM,MAAM,oDAAoD,EAAE;;;AAI3E,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,WAAS,oBAAoB,SAAS,KAAK,gBAAgB;;CAG7D,SAAsB;AACpB,WAAS,iBAAiB,SAAS,KAAK,gBAAgB"}
1
+ {"version":3,"file":"ClicksInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/clicks/ClicksInstrumentation/ClicksInstrumentation.ts"],"sourcesContent":["/*\n This instrumentation is taking code from here as a starting point:\n https://github.com/open-telemetry/opentelemetry-js-contrib/blob/main/plugins/web/opentelemetry-instrumentation-user-interaction/src/instrumentation.ts\n\n But not using that instrumentation directly because:\n\n 1) We want to record clicks as span events on the Session span\n 2) There is a bug with the instrumentation that causes a large number of spans to be created for a single click\n when zone context isn't available. To avoid the bug we take a simpler approach here and add a listener directly\n to `document` rather than trying to patch the `addEventListener` method on the prototype, this does mean we miss\n recording click events for which `stopPropagation` is called. See https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1368\n */\n\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport type { ClicksInstrumentationArgs } from './types';\n\nimport { getHTMLElementFriendlyName } from './utils';\n\nexport class ClicksInstrumentation extends MXLInstrumentationBase {\n private readonly _onClickHandler: (event: MouseEvent) => void;\n\n public constructor({\n diag,\n perf,\n shouldTrack,\n innerTextForElement,\n }: ClicksInstrumentationArgs = {}) {\n super({\n instrumentationName: 'ClicksInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n\n this._onClickHandler = (event: MouseEvent) => {\n const element = event.target;\n\n if (!(element instanceof HTMLElement)) {\n return;\n }\n if (element.hasAttribute('disabled')) {\n return;\n }\n\n if (shouldTrack && !shouldTrack(element)) {\n return;\n }\n\n try {\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n if (currentSessionSpan) {\n currentSessionSpan.addEvent(\n 'click',\n {\n 'mxl.type': 'ux.tap',\n 'view.name': getHTMLElementFriendlyName(\n element,\n innerTextForElement\n ? innerTextForElement(element)\n : element.innerText,\n ),\n 'tap.coords': `${event.x.toString()},${event.y.toString()}`,\n },\n this.perf.epochMillisFromOriginOffset(event.timeStamp),\n );\n }\n } catch (e) {\n this._diag.error('failed to create new user interaction span event', e);\n }\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public disable(): void {\n document.removeEventListener('click', this._onClickHandler);\n }\n\n public enable(): void {\n document.addEventListener('click', this._onClickHandler);\n }\n}\n"],"mappings":";;;AAkBA,IAAa,wBAAb,cAA2C,uBAAuB;CAChE;CAEA,YAAmB,EACjB,MACA,MACA,aACA,wBAC6B,EAAE,EAAE;AACjC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,mBAAmB,UAAsB;GAC5C,MAAM,UAAU,MAAM;AAEtB,OAAI,EAAE,mBAAmB,aACvB;AAEF,OAAI,QAAQ,aAAa,WAAW,CAClC;AAGF,OAAI,eAAe,CAAC,YAAY,QAAQ,CACtC;AAGF,OAAI;IACF,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,QAAI,mBACF,oBAAmB,SACjB,SACA;KACE,YAAY;KACZ,aAAa,2BACX,SACA,sBACI,oBAAoB,QAAQ,GAC5B,QAAQ,UACb;KACD,cAAc,GAAG,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,UAAU;KAC1D,EACD,KAAK,KAAK,4BAA4B,MAAM,UAAU,CACvD;YAEI,GAAG;AACV,SAAK,MAAM,MAAM,oDAAoD,EAAE;;;AAI3E,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,WAAS,oBAAoB,SAAS,KAAK,gBAAgB;;CAG7D,SAAsB;AACpB,WAAS,iBAAiB,SAAS,KAAK,gBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentLoadInstrumentation.cjs","names":["MXLInstrumentationBase","TRACE_PARENT_HEADER","getPerformanceNavigationEntries","propagation","ROOT_CONTEXT","PerformanceTimingNames","trace","context","ATTR_URL_FULL","KEY_MXL_TYPE","ATTR_USER_AGENT_ORIGINAL","ATTR_HTTP_RESPONSE_STATUS_CODE","ATTR_HTTP_RESPONSE_BODY_SIZE","ATTR_HTTP_RESPONSE_SIZE"],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.ts"],"sourcesContent":["/*\n * Adapted from OpenTelemetry document-load instrumentation\n * https://github.com/open-telemetry/opentelemetry-js-contrib/tree/cc7eff47e2e7bad7678241b766753d5bd6dbc85f/packages/instrumentation-document-load\n *\n * Additional PerformanceResourceTiming attributes collected:\n * - entry_type, initiator_type\n * - decoded_body_size, http.response.body.size, http.response.size\n * - delivery_type (Chromium only)\n * - render_blocking_status (Chromium only)\n * - http.response.status_code (no Safari support)\n *\n * Custom diagnostic attributes added to identify resource loading issues:\n * - http.response.cors_opaque - CORS-restricted resource (opaque response)\n * - http.response.cache_revalidated - 304 Not Modified response\n * - http.request.incomplete - Request started but didn't complete (network error, aborted)\n * - http.request.prevented - Request never started (blocked by CSP, browser, extension)\n */\n\nimport type { Span } from '@opentelemetry/api';\nimport { context, propagation, ROOT_CONTEXT, trace } from '@opentelemetry/api';\nimport { TRACE_PARENT_HEADER } from '@opentelemetry/core';\nimport { safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\nimport type { PerformanceEntries } from '@opentelemetry/sdk-trace-web';\nimport {\n addSpanNetworkEvent,\n addSpanNetworkEvents,\n hasKey,\n PerformanceTimingNames,\n} from '@opentelemetry/sdk-trace-web';\nimport { ATTR_HTTP_RESPONSE_STATUS_CODE } from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_SIZE,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { MXL_TYPES, KEY_MXL_TYPE } from '../../../constants/index.ts';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport { AttributeNames } from './enums/AttributeNames.ts';\nimport type {\n DocumentLoadCustomAttributeFunction,\n DocumentLoadInstrumentationConfig,\n ResourceFetchCustomAttributeFunction,\n} from './types.ts';\nimport {\n addSpanPerformancePaintEvents,\n getPerformanceNavigationEntries,\n} from './utils.ts';\n\n/**\n * Adds new browser features not yet in TypeScript's DOM lib (as of Oct 2025):\n * - deliveryType: Chromium only (experimental) https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType\n * - renderBlockingStatus: Chromium only https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/renderBlockingStatus\n */\ntype MXLPerformanceResourceTiming = PerformanceResourceTiming & {\n deliveryType?: 'cache' | '';\n renderBlockingStatus?: 'blocking' | 'non-blocking';\n};\n\n// PerformanceResourceTiming attribute names\nconst ATTR_HTTP_RESPONSE_DELIVERY_TYPE = 'http.response.delivery_type';\nconst ATTR_HTTP_RESPONSE_DECODED_BODY_SIZE = 'http.response.decoded_body_size';\nconst ATTR_HTTP_REQUEST_INITIATOR_TYPE = 'http.request.initiator_type';\nconst ATTR_HTTP_REQUEST_RENDER_BLOCKING_STATUS =\n 'http.request.render_blocking_status';\n\n// Diagnostic attribute names\nconst ATTR_HTTP_RESPONSE_CORS_OPAQUE = 'http.response.cors_opaque'; // CORS-restricted resource (opaque response)\nconst ATTR_HTTP_RESPONSE_CACHE_REVALIDATED = 'http.response.cache_revalidated'; // 304 Not Modified response\nconst ATTR_HTTP_REQUEST_INCOMPLETE = 'http.request.incomplete'; // Request started but didn't complete\nconst ATTR_HTTP_REQUEST_PREVENTED = 'http.request.prevented'; // Request never started (blocked)\n\nexport class DocumentLoadInstrumentation extends MXLInstrumentationBase<DocumentLoadInstrumentationConfig> {\n private readonly _onDocumentLoaded: () => void;\n private _performanceCollected = false;\n\n public constructor({\n diag,\n perf,\n enabled,\n applyCustomAttributesOnSpan,\n ignorePerformancePaintEvents = false,\n ignoreNetworkEvents = false,\n }: DocumentLoadInstrumentationConfig = {}) {\n super({\n instrumentationName: 'DocumentLoadInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {\n enabled,\n applyCustomAttributesOnSpan,\n ignorePerformancePaintEvents,\n ignoreNetworkEvents,\n },\n });\n\n this._onDocumentLoaded = () => {\n // Timeout needed because performance metrics for loadEnd aren't available until after the load event\n window.setTimeout(() => {\n this._collectPerformance();\n }, 0);\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n protected override init() {\n this._diag.debug('Initializing document load instrumentation');\n return undefined;\n }\n\n /**\n * Adds spans for all resources\n * @param rootSpan\n */\n private _addResourcesSpans(rootSpan: Span): void {\n const resources: MXLPerformanceResourceTiming[] =\n performance.getEntriesByType('resource');\n resources.forEach((resource) => {\n this._initResourceSpan(resource, rootSpan);\n });\n }\n\n /**\n * Collects information about performance and creates appropriate spans\n */\n private _collectPerformance(): void {\n if (this._performanceCollected) {\n return;\n }\n this._performanceCollected = true;\n\n const metaElement = Array.from(document.getElementsByTagName('meta')).find(\n (e) => e.getAttribute('name') === TRACE_PARENT_HEADER,\n );\n const entries = getPerformanceNavigationEntries();\n const traceparent = metaElement?.content || '';\n context.with(propagation.extract(ROOT_CONTEXT, { traceparent }), () => {\n const rootSpan = this._startSpan(\n AttributeNames.DOCUMENT_LOAD,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n if (!rootSpan) {\n return;\n }\n context.with(trace.setSpan(context.active(), rootSpan), () => {\n const fetchSpan = this._startSpan(\n AttributeNames.DOCUMENT_FETCH,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n if (fetchSpan) {\n fetchSpan.setAttribute(ATTR_URL_FULL, location.href);\n context.with(trace.setSpan(context.active(), fetchSpan), () => {\n addSpanNetworkEvents(\n fetchSpan,\n entries,\n this.getConfig().ignoreNetworkEvents,\n );\n this._addCustomAttributesOnSpan(\n fetchSpan,\n this.getConfig().applyCustomAttributesOnSpan?.documentFetch,\n );\n this._endSpan(\n fetchSpan,\n PerformanceTimingNames.RESPONSE_END,\n entries,\n );\n });\n }\n });\n\n rootSpan.setAttribute(KEY_MXL_TYPE, MXL_TYPES.DocumentLoad);\n rootSpan.setAttribute(ATTR_URL_FULL, location.href);\n rootSpan.setAttribute(ATTR_USER_AGENT_ORIGINAL, navigator.userAgent);\n\n this._addResourcesSpans(rootSpan);\n\n if (!this.getConfig().ignoreNetworkEvents) {\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.UNLOAD_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.UNLOAD_EVENT_END,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_INTERACTIVE,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_CONTENT_LOADED_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_CONTENT_LOADED_EVENT_END,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_COMPLETE,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.LOAD_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.LOAD_EVENT_END,\n entries,\n );\n }\n\n if (!this.getConfig().ignorePerformancePaintEvents) {\n addSpanPerformancePaintEvents(rootSpan);\n }\n\n this._addCustomAttributesOnSpan(\n rootSpan,\n this.getConfig().applyCustomAttributesOnSpan?.documentLoad,\n );\n this._endSpan(rootSpan, PerformanceTimingNames.LOAD_EVENT_END, entries);\n });\n }\n\n /**\n * Helper function for ending a span\n * @param span\n * @param performanceName name of performance entry for end time\n * @param entries\n */\n private _endSpan(\n span: Span | undefined,\n performanceName: string,\n entries: PerformanceEntries,\n ) {\n // Span can be undefined when entries are missing the required performance timing - no span will be created\n if (span) {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n span.end(entries[performanceName]);\n } else {\n span.end();\n }\n }\n }\n\n /**\n * Creates and ends a span with network information about a resource added as timed events\n * @param resource\n * @param parentSpan\n */\n private _initResourceSpan(\n resource: MXLPerformanceResourceTiming,\n parentSpan: Span,\n ) {\n const span = this._startSpan(\n AttributeNames.RESOURCE_FETCH,\n PerformanceTimingNames.FETCH_START,\n resource,\n parentSpan,\n );\n if (!span) {\n return;\n }\n\n span.setAttribute(KEY_MXL_TYPE, MXL_TYPES.ResourceFetch);\n span.setAttribute(ATTR_URL_FULL, resource.name);\n addSpanNetworkEvents(span, resource, this.getConfig().ignoreNetworkEvents);\n\n if (resource.deliveryType) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_DELIVERY_TYPE,\n resource.deliveryType,\n );\n }\n\n if (resource.initiatorType) {\n span.setAttribute(\n ATTR_HTTP_REQUEST_INITIATOR_TYPE,\n resource.initiatorType,\n );\n }\n\n if (resource.renderBlockingStatus) {\n span.setAttribute(\n ATTR_HTTP_REQUEST_RENDER_BLOCKING_STATUS,\n resource.renderBlockingStatus,\n );\n }\n\n if (resource.responseStatus) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n resource.responseStatus,\n );\n }\n\n // Validate size fields exist and aren't negative\n if (\n typeof resource.encodedBodySize === 'number' &&\n resource.encodedBodySize >= 0\n ) {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, resource.encodedBodySize);\n }\n\n if (\n typeof resource.transferSize === 'number' &&\n resource.transferSize >= 0\n ) {\n span.setAttribute(ATTR_HTTP_RESPONSE_SIZE, resource.transferSize);\n }\n\n if (\n typeof resource.decodedBodySize === 'number' &&\n resource.decodedBodySize >= 0\n ) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_DECODED_BODY_SIZE,\n resource.decodedBodySize,\n );\n }\n\n this._addResourceDiagnosticAttributes(span, resource);\n\n this._addCustomAttributesOnResourceSpan(\n span,\n resource,\n this.getConfig().applyCustomAttributesOnSpan?.resourceFetch,\n );\n this._endSpan(span, PerformanceTimingNames.RESPONSE_END, resource);\n }\n\n /**\n * Helper function for starting a span\n * @param spanName name of span\n * @param performanceName name of performance entry for time start\n * @param entries\n * @param parentSpan\n */\n private _startSpan(\n spanName: string,\n performanceName: string,\n entries: PerformanceEntries,\n parentSpan?: Span,\n ): Span | undefined {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n const span = this.tracer.startSpan(\n spanName,\n {\n startTime: entries[performanceName],\n },\n parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined,\n );\n return span;\n }\n return undefined;\n }\n\n /**\n * Executes callback {_onDocumentLoaded} when the page is loaded\n */\n private _waitForPageLoad() {\n if (window.document.readyState === 'complete') {\n this._onDocumentLoaded();\n } else {\n window.addEventListener('load', this._onDocumentLoaded);\n }\n }\n\n /**\n * Adds custom attributes to span if configured\n * Used for both documentFetch and documentLoad spans\n */\n private _addCustomAttributesOnSpan(\n span: Span,\n applyCustomAttributesOnSpan:\n | DocumentLoadCustomAttributeFunction\n | undefined,\n ) {\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => {\n applyCustomAttributesOnSpan(span);\n },\n (error) => {\n if (!error) {\n return;\n }\n\n this._diag.error('addCustomAttributesOnSpan', error);\n },\n true,\n );\n }\n }\n\n /**\n * Adds custom attributes to resource span if configured\n */\n private _addCustomAttributesOnResourceSpan(\n span: Span,\n resource: MXLPerformanceResourceTiming,\n applyCustomAttributesOnSpan:\n | ResourceFetchCustomAttributeFunction\n | undefined,\n ) {\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => {\n applyCustomAttributesOnSpan(span, resource);\n },\n (error) => {\n if (!error) {\n return;\n }\n\n this._diag.error('addCustomAttributesOnResourceSpan', error);\n },\n true,\n );\n }\n }\n\n private _hasNoSizeData(resource: MXLPerformanceResourceTiming): boolean {\n const transferSize =\n typeof resource.transferSize === 'number' ? resource.transferSize : 0;\n const decodedBodySize =\n typeof resource.decodedBodySize === 'number'\n ? resource.decodedBodySize\n : 0;\n const encodedBodySize =\n typeof resource.encodedBodySize === 'number'\n ? resource.encodedBodySize\n : 0;\n\n return transferSize === 0 && decodedBodySize === 0 && encodedBodySize === 0;\n }\n\n private _hasTimingData(resource: MXLPerformanceResourceTiming): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n const responseEnd =\n typeof resource.responseEnd === 'number' ? resource.responseEnd : 0;\n\n return fetchStart > 0 && responseEnd > 0;\n }\n\n private _isCorsRestricted(\n resource: MXLPerformanceResourceTiming,\n ): boolean {\n return this._hasNoSizeData(resource) && this._hasTimingData(resource);\n }\n\n private _isFetchIncomplete(\n resource: MXLPerformanceResourceTiming,\n ): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n const responseEnd =\n typeof resource.responseEnd === 'number' ? resource.responseEnd : 0;\n\n return this._hasNoSizeData(resource) && fetchStart > 0 && responseEnd === 0;\n }\n\n private _isFetchPrevented(\n resource: MXLPerformanceResourceTiming,\n ): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n\n return this._hasNoSizeData(resource) && fetchStart === 0;\n }\n\n /**\n * Detect cache validation (304 Not Modified responses)\n *\n * 304 responses show transferSize of ~300 bytes (headers only, no body).\n * Use deliveryType to distinguish from cache hits: 'cache' = no network, otherwise = 304.\n *\n * Spec: https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-transfersize\n */\n private _isCacheValidated(\n resource: MXLPerformanceResourceTiming,\n ): boolean {\n const transferSize =\n typeof resource.transferSize === 'number' ? resource.transferSize : 0;\n const deliveryType =\n typeof resource.deliveryType === 'string' ? resource.deliveryType : '';\n\n return transferSize === 300 && deliveryType !== 'cache';\n }\n\n /**\n * Add diagnostic attributes to identify resource loading issues\n *\n * Diagnostic attributes help identify why resources may have incomplete timing data:\n * - CORS restrictions (opaque responses without Timing-Allow-Origin header)\n * - Cache revalidation (304 Not Modified responses)\n * - Request incomplete (started but didn't complete - network error, aborted)\n * - Request prevented (never started - blocked by CSP, browser, extension)\n */\n private _addResourceDiagnosticAttributes(\n span: Span,\n resource: MXLPerformanceResourceTiming,\n ): void {\n if (this._isCorsRestricted(resource)) {\n span.setAttribute(ATTR_HTTP_RESPONSE_CORS_OPAQUE, true);\n } else if (this._isFetchIncomplete(resource)) {\n span.setAttribute(ATTR_HTTP_REQUEST_INCOMPLETE, true);\n } else if (this._isFetchPrevented(resource)) {\n span.setAttribute(ATTR_HTTP_REQUEST_PREVENTED, true);\n }\n\n if (this._isCacheValidated(resource)) {\n span.setAttribute(ATTR_HTTP_RESPONSE_CACHE_REVALIDATED, true);\n }\n }\n\n public enable(): void {\n window.removeEventListener('load', this._onDocumentLoaded);\n this._waitForPageLoad();\n }\n\n public disable(): void {\n window.removeEventListener('load', this._onDocumentLoaded);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DocumentLoadInstrumentation.cjs","names":["MXLInstrumentationBase","TRACE_PARENT_HEADER","getPerformanceNavigationEntries","propagation","ROOT_CONTEXT","PerformanceTimingNames","trace","context","ATTR_URL_FULL","KEY_MXL_TYPE","ATTR_USER_AGENT_ORIGINAL","ATTR_HTTP_RESPONSE_STATUS_CODE","ATTR_HTTP_RESPONSE_BODY_SIZE","ATTR_HTTP_RESPONSE_SIZE"],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.ts"],"sourcesContent":["/*\n * Adapted from OpenTelemetry document-load instrumentation\n * https://github.com/open-telemetry/opentelemetry-js-contrib/tree/cc7eff47e2e7bad7678241b766753d5bd6dbc85f/packages/instrumentation-document-load\n *\n * Additional PerformanceResourceTiming attributes collected:\n * - entry_type, initiator_type\n * - decoded_body_size, http.response.body.size, http.response.size\n * - delivery_type (Chromium only)\n * - render_blocking_status (Chromium only)\n * - http.response.status_code (no Safari support)\n *\n * Custom diagnostic attributes added to identify resource loading issues:\n * - http.response.cors_opaque - CORS-restricted resource (opaque response)\n * - http.response.cache_revalidated - 304 Not Modified response\n * - http.request.incomplete - Request started but didn't complete (network error, aborted)\n * - http.request.prevented - Request never started (blocked by CSP, browser, extension)\n */\n\nimport type { Span } from '@opentelemetry/api';\nimport { context, propagation, ROOT_CONTEXT, trace } from '@opentelemetry/api';\nimport { TRACE_PARENT_HEADER } from '@opentelemetry/core';\nimport { safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\nimport type { PerformanceEntries } from '@opentelemetry/sdk-trace-web';\nimport {\n addSpanNetworkEvent,\n addSpanNetworkEvents,\n hasKey,\n PerformanceTimingNames,\n} from '@opentelemetry/sdk-trace-web';\nimport { ATTR_HTTP_RESPONSE_STATUS_CODE } from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_SIZE,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { KEY_MXL_TYPE, MXL_TYPES } from '../../../constants';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport { AttributeNames } from './enums/AttributeNames';\nimport type {\n DocumentLoadCustomAttributeFunction,\n DocumentLoadInstrumentationConfig,\n ResourceFetchCustomAttributeFunction,\n} from './types';\nimport {\n addSpanPerformancePaintEvents,\n getPerformanceNavigationEntries,\n} from './utils';\n\n/**\n * Adds new browser features not yet in TypeScript's DOM lib (as of Oct 2025):\n * - deliveryType: Chromium only (experimental) https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType\n * - renderBlockingStatus: Chromium only https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/renderBlockingStatus\n */\ntype MXLPerformanceResourceTiming = PerformanceResourceTiming & {\n deliveryType?: 'cache' | '';\n renderBlockingStatus?: 'blocking' | 'non-blocking';\n};\n\n// PerformanceResourceTiming attribute names\nconst ATTR_HTTP_RESPONSE_DELIVERY_TYPE = 'http.response.delivery_type';\nconst ATTR_HTTP_RESPONSE_DECODED_BODY_SIZE = 'http.response.decoded_body_size';\nconst ATTR_HTTP_REQUEST_INITIATOR_TYPE = 'http.request.initiator_type';\nconst ATTR_HTTP_REQUEST_RENDER_BLOCKING_STATUS =\n 'http.request.render_blocking_status';\n\n// Diagnostic attribute names\nconst ATTR_HTTP_RESPONSE_CORS_OPAQUE = 'http.response.cors_opaque'; // CORS-restricted resource (opaque response)\nconst ATTR_HTTP_RESPONSE_CACHE_REVALIDATED = 'http.response.cache_revalidated'; // 304 Not Modified response\nconst ATTR_HTTP_REQUEST_INCOMPLETE = 'http.request.incomplete'; // Request started but didn't complete\nconst ATTR_HTTP_REQUEST_PREVENTED = 'http.request.prevented'; // Request never started (blocked)\n\nexport class DocumentLoadInstrumentation extends MXLInstrumentationBase<DocumentLoadInstrumentationConfig> {\n private readonly _onDocumentLoaded: () => void;\n private _performanceCollected = false;\n\n public constructor({\n diag,\n perf,\n enabled,\n applyCustomAttributesOnSpan,\n ignorePerformancePaintEvents = false,\n ignoreNetworkEvents = false,\n }: DocumentLoadInstrumentationConfig = {}) {\n super({\n instrumentationName: 'DocumentLoadInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {\n enabled,\n applyCustomAttributesOnSpan,\n ignorePerformancePaintEvents,\n ignoreNetworkEvents,\n },\n });\n\n this._onDocumentLoaded = () => {\n // Timeout needed because performance metrics for loadEnd aren't available until after the load event\n window.setTimeout(() => {\n this._collectPerformance();\n }, 0);\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n protected override init() {\n this._diag.debug('Initializing document load instrumentation');\n return undefined;\n }\n\n /**\n * Adds spans for all resources\n * @param rootSpan\n */\n private _addResourcesSpans(rootSpan: Span): void {\n const resources: MXLPerformanceResourceTiming[] =\n performance.getEntriesByType('resource');\n resources.forEach((resource) => {\n this._initResourceSpan(resource, rootSpan);\n });\n }\n\n /**\n * Collects information about performance and creates appropriate spans\n */\n private _collectPerformance(): void {\n if (this._performanceCollected) {\n return;\n }\n this._performanceCollected = true;\n\n const metaElement = Array.from(document.getElementsByTagName('meta')).find(\n (e) => e.getAttribute('name') === TRACE_PARENT_HEADER,\n );\n const entries = getPerformanceNavigationEntries();\n const traceparent = metaElement?.content || '';\n context.with(propagation.extract(ROOT_CONTEXT, { traceparent }), () => {\n const rootSpan = this._startSpan(\n AttributeNames.DOCUMENT_LOAD,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n if (!rootSpan) {\n return;\n }\n context.with(trace.setSpan(context.active(), rootSpan), () => {\n const fetchSpan = this._startSpan(\n AttributeNames.DOCUMENT_FETCH,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n if (fetchSpan) {\n fetchSpan.setAttribute(ATTR_URL_FULL, location.href);\n context.with(trace.setSpan(context.active(), fetchSpan), () => {\n addSpanNetworkEvents(\n fetchSpan,\n entries,\n this.getConfig().ignoreNetworkEvents,\n );\n this._addCustomAttributesOnSpan(\n fetchSpan,\n this.getConfig().applyCustomAttributesOnSpan?.documentFetch,\n );\n this._endSpan(\n fetchSpan,\n PerformanceTimingNames.RESPONSE_END,\n entries,\n );\n });\n }\n });\n\n rootSpan.setAttribute(KEY_MXL_TYPE, MXL_TYPES.DocumentLoad);\n rootSpan.setAttribute(ATTR_URL_FULL, location.href);\n rootSpan.setAttribute(ATTR_USER_AGENT_ORIGINAL, navigator.userAgent);\n\n this._addResourcesSpans(rootSpan);\n\n if (!this.getConfig().ignoreNetworkEvents) {\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.UNLOAD_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.UNLOAD_EVENT_END,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_INTERACTIVE,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_CONTENT_LOADED_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_CONTENT_LOADED_EVENT_END,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_COMPLETE,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.LOAD_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.LOAD_EVENT_END,\n entries,\n );\n }\n\n if (!this.getConfig().ignorePerformancePaintEvents) {\n addSpanPerformancePaintEvents(rootSpan);\n }\n\n this._addCustomAttributesOnSpan(\n rootSpan,\n this.getConfig().applyCustomAttributesOnSpan?.documentLoad,\n );\n this._endSpan(rootSpan, PerformanceTimingNames.LOAD_EVENT_END, entries);\n });\n }\n\n /**\n * Helper function for ending a span\n * @param span\n * @param performanceName name of performance entry for end time\n * @param entries\n */\n private _endSpan(\n span: Span | undefined,\n performanceName: string,\n entries: PerformanceEntries,\n ) {\n // Span can be undefined when entries are missing the required performance timing - no span will be created\n if (span) {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n span.end(entries[performanceName]);\n } else {\n span.end();\n }\n }\n }\n\n /**\n * Creates and ends a span with network information about a resource added as timed events\n * @param resource\n * @param parentSpan\n */\n private _initResourceSpan(\n resource: MXLPerformanceResourceTiming,\n parentSpan: Span,\n ) {\n const span = this._startSpan(\n AttributeNames.RESOURCE_FETCH,\n PerformanceTimingNames.FETCH_START,\n resource,\n parentSpan,\n );\n if (!span) {\n return;\n }\n\n span.setAttribute(KEY_MXL_TYPE, MXL_TYPES.ResourceFetch);\n span.setAttribute(ATTR_URL_FULL, resource.name);\n addSpanNetworkEvents(span, resource, this.getConfig().ignoreNetworkEvents);\n\n if (resource.deliveryType) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_DELIVERY_TYPE,\n resource.deliveryType,\n );\n }\n\n if (resource.initiatorType) {\n span.setAttribute(\n ATTR_HTTP_REQUEST_INITIATOR_TYPE,\n resource.initiatorType,\n );\n }\n\n if (resource.renderBlockingStatus) {\n span.setAttribute(\n ATTR_HTTP_REQUEST_RENDER_BLOCKING_STATUS,\n resource.renderBlockingStatus,\n );\n }\n\n if (resource.responseStatus) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n resource.responseStatus,\n );\n }\n\n // Validate size fields exist and aren't negative\n if (\n typeof resource.encodedBodySize === 'number' &&\n resource.encodedBodySize >= 0\n ) {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, resource.encodedBodySize);\n }\n\n if (\n typeof resource.transferSize === 'number' &&\n resource.transferSize >= 0\n ) {\n span.setAttribute(ATTR_HTTP_RESPONSE_SIZE, resource.transferSize);\n }\n\n if (\n typeof resource.decodedBodySize === 'number' &&\n resource.decodedBodySize >= 0\n ) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_DECODED_BODY_SIZE,\n resource.decodedBodySize,\n );\n }\n\n this._addResourceDiagnosticAttributes(span, resource);\n\n this._addCustomAttributesOnResourceSpan(\n span,\n resource,\n this.getConfig().applyCustomAttributesOnSpan?.resourceFetch,\n );\n this._endSpan(span, PerformanceTimingNames.RESPONSE_END, resource);\n }\n\n /**\n * Helper function for starting a span\n * @param spanName name of span\n * @param performanceName name of performance entry for time start\n * @param entries\n * @param parentSpan\n */\n private _startSpan(\n spanName: string,\n performanceName: string,\n entries: PerformanceEntries,\n parentSpan?: Span,\n ): Span | undefined {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n const span = this.tracer.startSpan(\n spanName,\n {\n startTime: entries[performanceName],\n },\n parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined,\n );\n return span;\n }\n return undefined;\n }\n\n /**\n * Executes callback {_onDocumentLoaded} when the page is loaded\n */\n private _waitForPageLoad() {\n if (window.document.readyState === 'complete') {\n this._onDocumentLoaded();\n } else {\n window.addEventListener('load', this._onDocumentLoaded);\n }\n }\n\n /**\n * Adds custom attributes to span if configured\n * Used for both documentFetch and documentLoad spans\n */\n private _addCustomAttributesOnSpan(\n span: Span,\n applyCustomAttributesOnSpan:\n | DocumentLoadCustomAttributeFunction\n | undefined,\n ) {\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => {\n applyCustomAttributesOnSpan(span);\n },\n (error) => {\n if (!error) {\n return;\n }\n\n this._diag.error('addCustomAttributesOnSpan', error);\n },\n true,\n );\n }\n }\n\n /**\n * Adds custom attributes to resource span if configured\n */\n private _addCustomAttributesOnResourceSpan(\n span: Span,\n resource: MXLPerformanceResourceTiming,\n applyCustomAttributesOnSpan:\n | ResourceFetchCustomAttributeFunction\n | undefined,\n ) {\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => {\n applyCustomAttributesOnSpan(span, resource);\n },\n (error) => {\n if (!error) {\n return;\n }\n\n this._diag.error('addCustomAttributesOnResourceSpan', error);\n },\n true,\n );\n }\n }\n\n private _hasNoSizeData(resource: MXLPerformanceResourceTiming): boolean {\n const transferSize =\n typeof resource.transferSize === 'number' ? resource.transferSize : 0;\n const decodedBodySize =\n typeof resource.decodedBodySize === 'number'\n ? resource.decodedBodySize\n : 0;\n const encodedBodySize =\n typeof resource.encodedBodySize === 'number'\n ? resource.encodedBodySize\n : 0;\n\n return transferSize === 0 && decodedBodySize === 0 && encodedBodySize === 0;\n }\n\n private _hasTimingData(resource: MXLPerformanceResourceTiming): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n const responseEnd =\n typeof resource.responseEnd === 'number' ? resource.responseEnd : 0;\n\n return fetchStart > 0 && responseEnd > 0;\n }\n\n private _isCorsRestricted(resource: MXLPerformanceResourceTiming): boolean {\n return this._hasNoSizeData(resource) && this._hasTimingData(resource);\n }\n\n private _isFetchIncomplete(resource: MXLPerformanceResourceTiming): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n const responseEnd =\n typeof resource.responseEnd === 'number' ? resource.responseEnd : 0;\n\n return this._hasNoSizeData(resource) && fetchStart > 0 && responseEnd === 0;\n }\n\n private _isFetchPrevented(resource: MXLPerformanceResourceTiming): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n\n return this._hasNoSizeData(resource) && fetchStart === 0;\n }\n\n /**\n * Detect cache validation (304 Not Modified responses)\n *\n * 304 responses show transferSize of ~300 bytes (headers only, no body).\n * Use deliveryType to distinguish from cache hits: 'cache' = no network, otherwise = 304.\n *\n * Spec: https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-transfersize\n */\n private _isCacheValidated(resource: MXLPerformanceResourceTiming): boolean {\n const transferSize =\n typeof resource.transferSize === 'number' ? resource.transferSize : 0;\n const deliveryType =\n typeof resource.deliveryType === 'string' ? resource.deliveryType : '';\n\n return transferSize === 300 && deliveryType !== 'cache';\n }\n\n /**\n * Add diagnostic attributes to identify resource loading issues\n *\n * Diagnostic attributes help identify why resources may have incomplete timing data:\n * - CORS restrictions (opaque responses without Timing-Allow-Origin header)\n * - Cache revalidation (304 Not Modified responses)\n * - Request incomplete (started but didn't complete - network error, aborted)\n * - Request prevented (never started - blocked by CSP, browser, extension)\n */\n private _addResourceDiagnosticAttributes(\n span: Span,\n resource: MXLPerformanceResourceTiming,\n ): void {\n if (this._isCorsRestricted(resource)) {\n span.setAttribute(ATTR_HTTP_RESPONSE_CORS_OPAQUE, true);\n } else if (this._isFetchIncomplete(resource)) {\n span.setAttribute(ATTR_HTTP_REQUEST_INCOMPLETE, true);\n } else if (this._isFetchPrevented(resource)) {\n span.setAttribute(ATTR_HTTP_REQUEST_PREVENTED, true);\n }\n\n if (this._isCacheValidated(resource)) {\n span.setAttribute(ATTR_HTTP_RESPONSE_CACHE_REVALIDATED, true);\n }\n }\n\n public enable(): void {\n window.removeEventListener('load', this._onDocumentLoaded);\n this._waitForPageLoad();\n }\n\n public disable(): void {\n window.removeEventListener('load', this._onDocumentLoaded);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentLoadInstrumentation.d.cts","names":[],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.ts"],"mappings":";;;;cAwEa,2BAAA,SAAoC,sBAAA,CAAuB,iCAAA;EAAA,iBACrD,iBAAA;EAAA,QACT,qBAAA;;IAGN,IAAA;IACA,IAAA;IACA,OAAA;IACA,2BAAA;IACA,4BAAA;IACA;EAAA,IACC,iCAAA;EAAA,UA0BgB,IAAA,CAAA;;;;;UASX,kBAAA;EAtCN;;;EAAA,QAiDM,mBAAA;EAzDuC;;;;;;EAAA,QAgLvC,QAAA;;;;;;UAuBA,iBAAA;EAhMN;;;;;;;EAAA,QAwRM,UAAA;EA1PW;;;EAAA,QAmRX,gBAAA;EAjHA;;;;EAAA,QA6HA,0BAAA;EAkDA;;;EAAA,QAxBA,kCAAA;EAAA,QAwBA,cAAA;EAAA,QAeA,cAAA;EAAA,QASA,iBAAA;EAAA,QAMA,kBAAA;EAAA,QAWA,iBAAA;EA2DM;;;;;;;;EAAA,QA1CN,iBAAA;;;;;;;;;;UAoBA,gCAAA;EAiBD,MAAA,CAAA;EAKA,OAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"DocumentLoadInstrumentation.d.cts","names":[],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.ts"],"mappings":";;;;cAwEa,2BAAA,SAAoC,sBAAA,CAAuB,iCAAA;EAAA,iBACrD,iBAAA;EAAA,QACT,qBAAA;;IAGN,IAAA;IACA,IAAA;IACA,OAAA;IACA,2BAAA;IACA,4BAAA;IACA;EAAA,IACC,iCAAA;EAAA,UA0BgB,IAAA,CAAA;;;;;UASX,kBAAA;EAtCN;;;EAAA,QAiDM,mBAAA;EAzDuC;;;;;;EAAA,QAgLvC,QAAA;;;;;;UAuBA,iBAAA;EAhMN;;;;;;;EAAA,QAwRM,UAAA;EA1PW;;;EAAA,QAmRX,gBAAA;EAjHA;;;;EAAA,QA6HA,0BAAA;EAkDA;;;EAAA,QAxBA,kCAAA;EAAA,QAwBA,cAAA;EAAA,QAeA,cAAA;EAAA,QASA,iBAAA;EAAA,QAIA,kBAAA;EAAA,QASA,iBAAA;EAuDM;;;;;;;;EAAA,QAxCN,iBAAA;;;;;;;;;;UAkBA,gCAAA;EAiBD,MAAA,CAAA;EAKA,OAAA,CAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentLoadInstrumentation.d.ts","names":[],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.ts"],"mappings":";;;;cAwEa,2BAAA,SAAoC,sBAAA,CAAuB,iCAAA;EAAA,iBACrD,iBAAA;EAAA,QACT,qBAAA;;IAGN,IAAA;IACA,IAAA;IACA,OAAA;IACA,2BAAA;IACA,4BAAA;IACA;EAAA,IACC,iCAAA;EAAA,UA0BgB,IAAA,CAAA;;;;;UASX,kBAAA;EAtCN;;;EAAA,QAiDM,mBAAA;EAzDuC;;;;;;EAAA,QAgLvC,QAAA;;;;;;UAuBA,iBAAA;EAhMN;;;;;;;EAAA,QAwRM,UAAA;EA1PW;;;EAAA,QAmRX,gBAAA;EAjHA;;;;EAAA,QA6HA,0BAAA;EAkDA;;;EAAA,QAxBA,kCAAA;EAAA,QAwBA,cAAA;EAAA,QAeA,cAAA;EAAA,QASA,iBAAA;EAAA,QAMA,kBAAA;EAAA,QAWA,iBAAA;EA2DM;;;;;;;;EAAA,QA1CN,iBAAA;;;;;;;;;;UAoBA,gCAAA;EAiBD,MAAA,CAAA;EAKA,OAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"DocumentLoadInstrumentation.d.ts","names":[],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.ts"],"mappings":";;;;cAwEa,2BAAA,SAAoC,sBAAA,CAAuB,iCAAA;EAAA,iBACrD,iBAAA;EAAA,QACT,qBAAA;;IAGN,IAAA;IACA,IAAA;IACA,OAAA;IACA,2BAAA;IACA,4BAAA;IACA;EAAA,IACC,iCAAA;EAAA,UA0BgB,IAAA,CAAA;;;;;UASX,kBAAA;EAtCN;;;EAAA,QAiDM,mBAAA;EAzDuC;;;;;;EAAA,QAgLvC,QAAA;;;;;;UAuBA,iBAAA;EAhMN;;;;;;;EAAA,QAwRM,UAAA;EA1PW;;;EAAA,QAmRX,gBAAA;EAjHA;;;;EAAA,QA6HA,0BAAA;EAkDA;;;EAAA,QAxBA,kCAAA;EAAA,QAwBA,cAAA;EAAA,QAeA,cAAA;EAAA,QASA,iBAAA;EAAA,QAIA,kBAAA;EAAA,QASA,iBAAA;EAuDM;;;;;;;;EAAA,QAxCN,iBAAA;;;;;;;;;;UAkBA,gCAAA;EAiBD,MAAA,CAAA;EAKA,OAAA,CAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"DocumentLoadInstrumentation.js","names":["ATTR_URL_FULL","ATTR_USER_AGENT_ORIGINAL"],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.ts"],"sourcesContent":["/*\n * Adapted from OpenTelemetry document-load instrumentation\n * https://github.com/open-telemetry/opentelemetry-js-contrib/tree/cc7eff47e2e7bad7678241b766753d5bd6dbc85f/packages/instrumentation-document-load\n *\n * Additional PerformanceResourceTiming attributes collected:\n * - entry_type, initiator_type\n * - decoded_body_size, http.response.body.size, http.response.size\n * - delivery_type (Chromium only)\n * - render_blocking_status (Chromium only)\n * - http.response.status_code (no Safari support)\n *\n * Custom diagnostic attributes added to identify resource loading issues:\n * - http.response.cors_opaque - CORS-restricted resource (opaque response)\n * - http.response.cache_revalidated - 304 Not Modified response\n * - http.request.incomplete - Request started but didn't complete (network error, aborted)\n * - http.request.prevented - Request never started (blocked by CSP, browser, extension)\n */\n\nimport type { Span } from '@opentelemetry/api';\nimport { context, propagation, ROOT_CONTEXT, trace } from '@opentelemetry/api';\nimport { TRACE_PARENT_HEADER } from '@opentelemetry/core';\nimport { safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\nimport type { PerformanceEntries } from '@opentelemetry/sdk-trace-web';\nimport {\n addSpanNetworkEvent,\n addSpanNetworkEvents,\n hasKey,\n PerformanceTimingNames,\n} from '@opentelemetry/sdk-trace-web';\nimport { ATTR_HTTP_RESPONSE_STATUS_CODE } from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_SIZE,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { MXL_TYPES, KEY_MXL_TYPE } from '../../../constants/index.ts';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport { AttributeNames } from './enums/AttributeNames.ts';\nimport type {\n DocumentLoadCustomAttributeFunction,\n DocumentLoadInstrumentationConfig,\n ResourceFetchCustomAttributeFunction,\n} from './types.ts';\nimport {\n addSpanPerformancePaintEvents,\n getPerformanceNavigationEntries,\n} from './utils.ts';\n\n/**\n * Adds new browser features not yet in TypeScript's DOM lib (as of Oct 2025):\n * - deliveryType: Chromium only (experimental) https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType\n * - renderBlockingStatus: Chromium only https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/renderBlockingStatus\n */\ntype MXLPerformanceResourceTiming = PerformanceResourceTiming & {\n deliveryType?: 'cache' | '';\n renderBlockingStatus?: 'blocking' | 'non-blocking';\n};\n\n// PerformanceResourceTiming attribute names\nconst ATTR_HTTP_RESPONSE_DELIVERY_TYPE = 'http.response.delivery_type';\nconst ATTR_HTTP_RESPONSE_DECODED_BODY_SIZE = 'http.response.decoded_body_size';\nconst ATTR_HTTP_REQUEST_INITIATOR_TYPE = 'http.request.initiator_type';\nconst ATTR_HTTP_REQUEST_RENDER_BLOCKING_STATUS =\n 'http.request.render_blocking_status';\n\n// Diagnostic attribute names\nconst ATTR_HTTP_RESPONSE_CORS_OPAQUE = 'http.response.cors_opaque'; // CORS-restricted resource (opaque response)\nconst ATTR_HTTP_RESPONSE_CACHE_REVALIDATED = 'http.response.cache_revalidated'; // 304 Not Modified response\nconst ATTR_HTTP_REQUEST_INCOMPLETE = 'http.request.incomplete'; // Request started but didn't complete\nconst ATTR_HTTP_REQUEST_PREVENTED = 'http.request.prevented'; // Request never started (blocked)\n\nexport class DocumentLoadInstrumentation extends MXLInstrumentationBase<DocumentLoadInstrumentationConfig> {\n private readonly _onDocumentLoaded: () => void;\n private _performanceCollected = false;\n\n public constructor({\n diag,\n perf,\n enabled,\n applyCustomAttributesOnSpan,\n ignorePerformancePaintEvents = false,\n ignoreNetworkEvents = false,\n }: DocumentLoadInstrumentationConfig = {}) {\n super({\n instrumentationName: 'DocumentLoadInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {\n enabled,\n applyCustomAttributesOnSpan,\n ignorePerformancePaintEvents,\n ignoreNetworkEvents,\n },\n });\n\n this._onDocumentLoaded = () => {\n // Timeout needed because performance metrics for loadEnd aren't available until after the load event\n window.setTimeout(() => {\n this._collectPerformance();\n }, 0);\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n protected override init() {\n this._diag.debug('Initializing document load instrumentation');\n return undefined;\n }\n\n /**\n * Adds spans for all resources\n * @param rootSpan\n */\n private _addResourcesSpans(rootSpan: Span): void {\n const resources: MXLPerformanceResourceTiming[] =\n performance.getEntriesByType('resource');\n resources.forEach((resource) => {\n this._initResourceSpan(resource, rootSpan);\n });\n }\n\n /**\n * Collects information about performance and creates appropriate spans\n */\n private _collectPerformance(): void {\n if (this._performanceCollected) {\n return;\n }\n this._performanceCollected = true;\n\n const metaElement = Array.from(document.getElementsByTagName('meta')).find(\n (e) => e.getAttribute('name') === TRACE_PARENT_HEADER,\n );\n const entries = getPerformanceNavigationEntries();\n const traceparent = metaElement?.content || '';\n context.with(propagation.extract(ROOT_CONTEXT, { traceparent }), () => {\n const rootSpan = this._startSpan(\n AttributeNames.DOCUMENT_LOAD,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n if (!rootSpan) {\n return;\n }\n context.with(trace.setSpan(context.active(), rootSpan), () => {\n const fetchSpan = this._startSpan(\n AttributeNames.DOCUMENT_FETCH,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n if (fetchSpan) {\n fetchSpan.setAttribute(ATTR_URL_FULL, location.href);\n context.with(trace.setSpan(context.active(), fetchSpan), () => {\n addSpanNetworkEvents(\n fetchSpan,\n entries,\n this.getConfig().ignoreNetworkEvents,\n );\n this._addCustomAttributesOnSpan(\n fetchSpan,\n this.getConfig().applyCustomAttributesOnSpan?.documentFetch,\n );\n this._endSpan(\n fetchSpan,\n PerformanceTimingNames.RESPONSE_END,\n entries,\n );\n });\n }\n });\n\n rootSpan.setAttribute(KEY_MXL_TYPE, MXL_TYPES.DocumentLoad);\n rootSpan.setAttribute(ATTR_URL_FULL, location.href);\n rootSpan.setAttribute(ATTR_USER_AGENT_ORIGINAL, navigator.userAgent);\n\n this._addResourcesSpans(rootSpan);\n\n if (!this.getConfig().ignoreNetworkEvents) {\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.UNLOAD_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.UNLOAD_EVENT_END,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_INTERACTIVE,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_CONTENT_LOADED_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_CONTENT_LOADED_EVENT_END,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_COMPLETE,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.LOAD_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.LOAD_EVENT_END,\n entries,\n );\n }\n\n if (!this.getConfig().ignorePerformancePaintEvents) {\n addSpanPerformancePaintEvents(rootSpan);\n }\n\n this._addCustomAttributesOnSpan(\n rootSpan,\n this.getConfig().applyCustomAttributesOnSpan?.documentLoad,\n );\n this._endSpan(rootSpan, PerformanceTimingNames.LOAD_EVENT_END, entries);\n });\n }\n\n /**\n * Helper function for ending a span\n * @param span\n * @param performanceName name of performance entry for end time\n * @param entries\n */\n private _endSpan(\n span: Span | undefined,\n performanceName: string,\n entries: PerformanceEntries,\n ) {\n // Span can be undefined when entries are missing the required performance timing - no span will be created\n if (span) {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n span.end(entries[performanceName]);\n } else {\n span.end();\n }\n }\n }\n\n /**\n * Creates and ends a span with network information about a resource added as timed events\n * @param resource\n * @param parentSpan\n */\n private _initResourceSpan(\n resource: MXLPerformanceResourceTiming,\n parentSpan: Span,\n ) {\n const span = this._startSpan(\n AttributeNames.RESOURCE_FETCH,\n PerformanceTimingNames.FETCH_START,\n resource,\n parentSpan,\n );\n if (!span) {\n return;\n }\n\n span.setAttribute(KEY_MXL_TYPE, MXL_TYPES.ResourceFetch);\n span.setAttribute(ATTR_URL_FULL, resource.name);\n addSpanNetworkEvents(span, resource, this.getConfig().ignoreNetworkEvents);\n\n if (resource.deliveryType) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_DELIVERY_TYPE,\n resource.deliveryType,\n );\n }\n\n if (resource.initiatorType) {\n span.setAttribute(\n ATTR_HTTP_REQUEST_INITIATOR_TYPE,\n resource.initiatorType,\n );\n }\n\n if (resource.renderBlockingStatus) {\n span.setAttribute(\n ATTR_HTTP_REQUEST_RENDER_BLOCKING_STATUS,\n resource.renderBlockingStatus,\n );\n }\n\n if (resource.responseStatus) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n resource.responseStatus,\n );\n }\n\n // Validate size fields exist and aren't negative\n if (\n typeof resource.encodedBodySize === 'number' &&\n resource.encodedBodySize >= 0\n ) {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, resource.encodedBodySize);\n }\n\n if (\n typeof resource.transferSize === 'number' &&\n resource.transferSize >= 0\n ) {\n span.setAttribute(ATTR_HTTP_RESPONSE_SIZE, resource.transferSize);\n }\n\n if (\n typeof resource.decodedBodySize === 'number' &&\n resource.decodedBodySize >= 0\n ) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_DECODED_BODY_SIZE,\n resource.decodedBodySize,\n );\n }\n\n this._addResourceDiagnosticAttributes(span, resource);\n\n this._addCustomAttributesOnResourceSpan(\n span,\n resource,\n this.getConfig().applyCustomAttributesOnSpan?.resourceFetch,\n );\n this._endSpan(span, PerformanceTimingNames.RESPONSE_END, resource);\n }\n\n /**\n * Helper function for starting a span\n * @param spanName name of span\n * @param performanceName name of performance entry for time start\n * @param entries\n * @param parentSpan\n */\n private _startSpan(\n spanName: string,\n performanceName: string,\n entries: PerformanceEntries,\n parentSpan?: Span,\n ): Span | undefined {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n const span = this.tracer.startSpan(\n spanName,\n {\n startTime: entries[performanceName],\n },\n parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined,\n );\n return span;\n }\n return undefined;\n }\n\n /**\n * Executes callback {_onDocumentLoaded} when the page is loaded\n */\n private _waitForPageLoad() {\n if (window.document.readyState === 'complete') {\n this._onDocumentLoaded();\n } else {\n window.addEventListener('load', this._onDocumentLoaded);\n }\n }\n\n /**\n * Adds custom attributes to span if configured\n * Used for both documentFetch and documentLoad spans\n */\n private _addCustomAttributesOnSpan(\n span: Span,\n applyCustomAttributesOnSpan:\n | DocumentLoadCustomAttributeFunction\n | undefined,\n ) {\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => {\n applyCustomAttributesOnSpan(span);\n },\n (error) => {\n if (!error) {\n return;\n }\n\n this._diag.error('addCustomAttributesOnSpan', error);\n },\n true,\n );\n }\n }\n\n /**\n * Adds custom attributes to resource span if configured\n */\n private _addCustomAttributesOnResourceSpan(\n span: Span,\n resource: MXLPerformanceResourceTiming,\n applyCustomAttributesOnSpan:\n | ResourceFetchCustomAttributeFunction\n | undefined,\n ) {\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => {\n applyCustomAttributesOnSpan(span, resource);\n },\n (error) => {\n if (!error) {\n return;\n }\n\n this._diag.error('addCustomAttributesOnResourceSpan', error);\n },\n true,\n );\n }\n }\n\n private _hasNoSizeData(resource: MXLPerformanceResourceTiming): boolean {\n const transferSize =\n typeof resource.transferSize === 'number' ? resource.transferSize : 0;\n const decodedBodySize =\n typeof resource.decodedBodySize === 'number'\n ? resource.decodedBodySize\n : 0;\n const encodedBodySize =\n typeof resource.encodedBodySize === 'number'\n ? resource.encodedBodySize\n : 0;\n\n return transferSize === 0 && decodedBodySize === 0 && encodedBodySize === 0;\n }\n\n private _hasTimingData(resource: MXLPerformanceResourceTiming): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n const responseEnd =\n typeof resource.responseEnd === 'number' ? resource.responseEnd : 0;\n\n return fetchStart > 0 && responseEnd > 0;\n }\n\n private _isCorsRestricted(\n resource: MXLPerformanceResourceTiming,\n ): boolean {\n return this._hasNoSizeData(resource) && this._hasTimingData(resource);\n }\n\n private _isFetchIncomplete(\n resource: MXLPerformanceResourceTiming,\n ): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n const responseEnd =\n typeof resource.responseEnd === 'number' ? resource.responseEnd : 0;\n\n return this._hasNoSizeData(resource) && fetchStart > 0 && responseEnd === 0;\n }\n\n private _isFetchPrevented(\n resource: MXLPerformanceResourceTiming,\n ): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n\n return this._hasNoSizeData(resource) && fetchStart === 0;\n }\n\n /**\n * Detect cache validation (304 Not Modified responses)\n *\n * 304 responses show transferSize of ~300 bytes (headers only, no body).\n * Use deliveryType to distinguish from cache hits: 'cache' = no network, otherwise = 304.\n *\n * Spec: https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-transfersize\n */\n private _isCacheValidated(\n resource: MXLPerformanceResourceTiming,\n ): boolean {\n const transferSize =\n typeof resource.transferSize === 'number' ? resource.transferSize : 0;\n const deliveryType =\n typeof resource.deliveryType === 'string' ? resource.deliveryType : '';\n\n return transferSize === 300 && deliveryType !== 'cache';\n }\n\n /**\n * Add diagnostic attributes to identify resource loading issues\n *\n * Diagnostic attributes help identify why resources may have incomplete timing data:\n * - CORS restrictions (opaque responses without Timing-Allow-Origin header)\n * - Cache revalidation (304 Not Modified responses)\n * - Request incomplete (started but didn't complete - network error, aborted)\n * - Request prevented (never started - blocked by CSP, browser, extension)\n */\n private _addResourceDiagnosticAttributes(\n span: Span,\n resource: MXLPerformanceResourceTiming,\n ): void {\n if (this._isCorsRestricted(resource)) {\n span.setAttribute(ATTR_HTTP_RESPONSE_CORS_OPAQUE, true);\n } else if (this._isFetchIncomplete(resource)) {\n span.setAttribute(ATTR_HTTP_REQUEST_INCOMPLETE, true);\n } else if (this._isFetchPrevented(resource)) {\n span.setAttribute(ATTR_HTTP_REQUEST_PREVENTED, true);\n }\n\n if (this._isCacheValidated(resource)) {\n span.setAttribute(ATTR_HTTP_RESPONSE_CACHE_REVALIDATED, true);\n }\n }\n\n public enable(): void {\n window.removeEventListener('load', this._onDocumentLoaded);\n this._waitForPageLoad();\n }\n\n public disable(): void {\n window.removeEventListener('load', this._onDocumentLoaded);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DocumentLoadInstrumentation.js","names":["ATTR_URL_FULL","ATTR_USER_AGENT_ORIGINAL"],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/DocumentLoadInstrumentation.ts"],"sourcesContent":["/*\n * Adapted from OpenTelemetry document-load instrumentation\n * https://github.com/open-telemetry/opentelemetry-js-contrib/tree/cc7eff47e2e7bad7678241b766753d5bd6dbc85f/packages/instrumentation-document-load\n *\n * Additional PerformanceResourceTiming attributes collected:\n * - entry_type, initiator_type\n * - decoded_body_size, http.response.body.size, http.response.size\n * - delivery_type (Chromium only)\n * - render_blocking_status (Chromium only)\n * - http.response.status_code (no Safari support)\n *\n * Custom diagnostic attributes added to identify resource loading issues:\n * - http.response.cors_opaque - CORS-restricted resource (opaque response)\n * - http.response.cache_revalidated - 304 Not Modified response\n * - http.request.incomplete - Request started but didn't complete (network error, aborted)\n * - http.request.prevented - Request never started (blocked by CSP, browser, extension)\n */\n\nimport type { Span } from '@opentelemetry/api';\nimport { context, propagation, ROOT_CONTEXT, trace } from '@opentelemetry/api';\nimport { TRACE_PARENT_HEADER } from '@opentelemetry/core';\nimport { safeExecuteInTheMiddle } from '@opentelemetry/instrumentation';\nimport type { PerformanceEntries } from '@opentelemetry/sdk-trace-web';\nimport {\n addSpanNetworkEvent,\n addSpanNetworkEvents,\n hasKey,\n PerformanceTimingNames,\n} from '@opentelemetry/sdk-trace-web';\nimport { ATTR_HTTP_RESPONSE_STATUS_CODE } from '@opentelemetry/semantic-conventions';\nimport {\n ATTR_HTTP_RESPONSE_BODY_SIZE,\n ATTR_HTTP_RESPONSE_SIZE,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport { KEY_MXL_TYPE, MXL_TYPES } from '../../../constants';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport { AttributeNames } from './enums/AttributeNames';\nimport type {\n DocumentLoadCustomAttributeFunction,\n DocumentLoadInstrumentationConfig,\n ResourceFetchCustomAttributeFunction,\n} from './types';\nimport {\n addSpanPerformancePaintEvents,\n getPerformanceNavigationEntries,\n} from './utils';\n\n/**\n * Adds new browser features not yet in TypeScript's DOM lib (as of Oct 2025):\n * - deliveryType: Chromium only (experimental) https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/deliveryType\n * - renderBlockingStatus: Chromium only https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming/renderBlockingStatus\n */\ntype MXLPerformanceResourceTiming = PerformanceResourceTiming & {\n deliveryType?: 'cache' | '';\n renderBlockingStatus?: 'blocking' | 'non-blocking';\n};\n\n// PerformanceResourceTiming attribute names\nconst ATTR_HTTP_RESPONSE_DELIVERY_TYPE = 'http.response.delivery_type';\nconst ATTR_HTTP_RESPONSE_DECODED_BODY_SIZE = 'http.response.decoded_body_size';\nconst ATTR_HTTP_REQUEST_INITIATOR_TYPE = 'http.request.initiator_type';\nconst ATTR_HTTP_REQUEST_RENDER_BLOCKING_STATUS =\n 'http.request.render_blocking_status';\n\n// Diagnostic attribute names\nconst ATTR_HTTP_RESPONSE_CORS_OPAQUE = 'http.response.cors_opaque'; // CORS-restricted resource (opaque response)\nconst ATTR_HTTP_RESPONSE_CACHE_REVALIDATED = 'http.response.cache_revalidated'; // 304 Not Modified response\nconst ATTR_HTTP_REQUEST_INCOMPLETE = 'http.request.incomplete'; // Request started but didn't complete\nconst ATTR_HTTP_REQUEST_PREVENTED = 'http.request.prevented'; // Request never started (blocked)\n\nexport class DocumentLoadInstrumentation extends MXLInstrumentationBase<DocumentLoadInstrumentationConfig> {\n private readonly _onDocumentLoaded: () => void;\n private _performanceCollected = false;\n\n public constructor({\n diag,\n perf,\n enabled,\n applyCustomAttributesOnSpan,\n ignorePerformancePaintEvents = false,\n ignoreNetworkEvents = false,\n }: DocumentLoadInstrumentationConfig = {}) {\n super({\n instrumentationName: 'DocumentLoadInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {\n enabled,\n applyCustomAttributesOnSpan,\n ignorePerformancePaintEvents,\n ignoreNetworkEvents,\n },\n });\n\n this._onDocumentLoaded = () => {\n // Timeout needed because performance metrics for loadEnd aren't available until after the load event\n window.setTimeout(() => {\n this._collectPerformance();\n }, 0);\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n protected override init() {\n this._diag.debug('Initializing document load instrumentation');\n return undefined;\n }\n\n /**\n * Adds spans for all resources\n * @param rootSpan\n */\n private _addResourcesSpans(rootSpan: Span): void {\n const resources: MXLPerformanceResourceTiming[] =\n performance.getEntriesByType('resource');\n resources.forEach((resource) => {\n this._initResourceSpan(resource, rootSpan);\n });\n }\n\n /**\n * Collects information about performance and creates appropriate spans\n */\n private _collectPerformance(): void {\n if (this._performanceCollected) {\n return;\n }\n this._performanceCollected = true;\n\n const metaElement = Array.from(document.getElementsByTagName('meta')).find(\n (e) => e.getAttribute('name') === TRACE_PARENT_HEADER,\n );\n const entries = getPerformanceNavigationEntries();\n const traceparent = metaElement?.content || '';\n context.with(propagation.extract(ROOT_CONTEXT, { traceparent }), () => {\n const rootSpan = this._startSpan(\n AttributeNames.DOCUMENT_LOAD,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n if (!rootSpan) {\n return;\n }\n context.with(trace.setSpan(context.active(), rootSpan), () => {\n const fetchSpan = this._startSpan(\n AttributeNames.DOCUMENT_FETCH,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n if (fetchSpan) {\n fetchSpan.setAttribute(ATTR_URL_FULL, location.href);\n context.with(trace.setSpan(context.active(), fetchSpan), () => {\n addSpanNetworkEvents(\n fetchSpan,\n entries,\n this.getConfig().ignoreNetworkEvents,\n );\n this._addCustomAttributesOnSpan(\n fetchSpan,\n this.getConfig().applyCustomAttributesOnSpan?.documentFetch,\n );\n this._endSpan(\n fetchSpan,\n PerformanceTimingNames.RESPONSE_END,\n entries,\n );\n });\n }\n });\n\n rootSpan.setAttribute(KEY_MXL_TYPE, MXL_TYPES.DocumentLoad);\n rootSpan.setAttribute(ATTR_URL_FULL, location.href);\n rootSpan.setAttribute(ATTR_USER_AGENT_ORIGINAL, navigator.userAgent);\n\n this._addResourcesSpans(rootSpan);\n\n if (!this.getConfig().ignoreNetworkEvents) {\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.FETCH_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.UNLOAD_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.UNLOAD_EVENT_END,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_INTERACTIVE,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_CONTENT_LOADED_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_CONTENT_LOADED_EVENT_END,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.DOM_COMPLETE,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.LOAD_EVENT_START,\n entries,\n );\n addSpanNetworkEvent(\n rootSpan,\n PerformanceTimingNames.LOAD_EVENT_END,\n entries,\n );\n }\n\n if (!this.getConfig().ignorePerformancePaintEvents) {\n addSpanPerformancePaintEvents(rootSpan);\n }\n\n this._addCustomAttributesOnSpan(\n rootSpan,\n this.getConfig().applyCustomAttributesOnSpan?.documentLoad,\n );\n this._endSpan(rootSpan, PerformanceTimingNames.LOAD_EVENT_END, entries);\n });\n }\n\n /**\n * Helper function for ending a span\n * @param span\n * @param performanceName name of performance entry for end time\n * @param entries\n */\n private _endSpan(\n span: Span | undefined,\n performanceName: string,\n entries: PerformanceEntries,\n ) {\n // Span can be undefined when entries are missing the required performance timing - no span will be created\n if (span) {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n span.end(entries[performanceName]);\n } else {\n span.end();\n }\n }\n }\n\n /**\n * Creates and ends a span with network information about a resource added as timed events\n * @param resource\n * @param parentSpan\n */\n private _initResourceSpan(\n resource: MXLPerformanceResourceTiming,\n parentSpan: Span,\n ) {\n const span = this._startSpan(\n AttributeNames.RESOURCE_FETCH,\n PerformanceTimingNames.FETCH_START,\n resource,\n parentSpan,\n );\n if (!span) {\n return;\n }\n\n span.setAttribute(KEY_MXL_TYPE, MXL_TYPES.ResourceFetch);\n span.setAttribute(ATTR_URL_FULL, resource.name);\n addSpanNetworkEvents(span, resource, this.getConfig().ignoreNetworkEvents);\n\n if (resource.deliveryType) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_DELIVERY_TYPE,\n resource.deliveryType,\n );\n }\n\n if (resource.initiatorType) {\n span.setAttribute(\n ATTR_HTTP_REQUEST_INITIATOR_TYPE,\n resource.initiatorType,\n );\n }\n\n if (resource.renderBlockingStatus) {\n span.setAttribute(\n ATTR_HTTP_REQUEST_RENDER_BLOCKING_STATUS,\n resource.renderBlockingStatus,\n );\n }\n\n if (resource.responseStatus) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_STATUS_CODE,\n resource.responseStatus,\n );\n }\n\n // Validate size fields exist and aren't negative\n if (\n typeof resource.encodedBodySize === 'number' &&\n resource.encodedBodySize >= 0\n ) {\n span.setAttribute(ATTR_HTTP_RESPONSE_BODY_SIZE, resource.encodedBodySize);\n }\n\n if (\n typeof resource.transferSize === 'number' &&\n resource.transferSize >= 0\n ) {\n span.setAttribute(ATTR_HTTP_RESPONSE_SIZE, resource.transferSize);\n }\n\n if (\n typeof resource.decodedBodySize === 'number' &&\n resource.decodedBodySize >= 0\n ) {\n span.setAttribute(\n ATTR_HTTP_RESPONSE_DECODED_BODY_SIZE,\n resource.decodedBodySize,\n );\n }\n\n this._addResourceDiagnosticAttributes(span, resource);\n\n this._addCustomAttributesOnResourceSpan(\n span,\n resource,\n this.getConfig().applyCustomAttributesOnSpan?.resourceFetch,\n );\n this._endSpan(span, PerformanceTimingNames.RESPONSE_END, resource);\n }\n\n /**\n * Helper function for starting a span\n * @param spanName name of span\n * @param performanceName name of performance entry for time start\n * @param entries\n * @param parentSpan\n */\n private _startSpan(\n spanName: string,\n performanceName: string,\n entries: PerformanceEntries,\n parentSpan?: Span,\n ): Span | undefined {\n if (\n hasKey(entries, performanceName) &&\n typeof entries[performanceName] === 'number'\n ) {\n const span = this.tracer.startSpan(\n spanName,\n {\n startTime: entries[performanceName],\n },\n parentSpan ? trace.setSpan(context.active(), parentSpan) : undefined,\n );\n return span;\n }\n return undefined;\n }\n\n /**\n * Executes callback {_onDocumentLoaded} when the page is loaded\n */\n private _waitForPageLoad() {\n if (window.document.readyState === 'complete') {\n this._onDocumentLoaded();\n } else {\n window.addEventListener('load', this._onDocumentLoaded);\n }\n }\n\n /**\n * Adds custom attributes to span if configured\n * Used for both documentFetch and documentLoad spans\n */\n private _addCustomAttributesOnSpan(\n span: Span,\n applyCustomAttributesOnSpan:\n | DocumentLoadCustomAttributeFunction\n | undefined,\n ) {\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => {\n applyCustomAttributesOnSpan(span);\n },\n (error) => {\n if (!error) {\n return;\n }\n\n this._diag.error('addCustomAttributesOnSpan', error);\n },\n true,\n );\n }\n }\n\n /**\n * Adds custom attributes to resource span if configured\n */\n private _addCustomAttributesOnResourceSpan(\n span: Span,\n resource: MXLPerformanceResourceTiming,\n applyCustomAttributesOnSpan:\n | ResourceFetchCustomAttributeFunction\n | undefined,\n ) {\n if (applyCustomAttributesOnSpan) {\n safeExecuteInTheMiddle(\n () => {\n applyCustomAttributesOnSpan(span, resource);\n },\n (error) => {\n if (!error) {\n return;\n }\n\n this._diag.error('addCustomAttributesOnResourceSpan', error);\n },\n true,\n );\n }\n }\n\n private _hasNoSizeData(resource: MXLPerformanceResourceTiming): boolean {\n const transferSize =\n typeof resource.transferSize === 'number' ? resource.transferSize : 0;\n const decodedBodySize =\n typeof resource.decodedBodySize === 'number'\n ? resource.decodedBodySize\n : 0;\n const encodedBodySize =\n typeof resource.encodedBodySize === 'number'\n ? resource.encodedBodySize\n : 0;\n\n return transferSize === 0 && decodedBodySize === 0 && encodedBodySize === 0;\n }\n\n private _hasTimingData(resource: MXLPerformanceResourceTiming): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n const responseEnd =\n typeof resource.responseEnd === 'number' ? resource.responseEnd : 0;\n\n return fetchStart > 0 && responseEnd > 0;\n }\n\n private _isCorsRestricted(resource: MXLPerformanceResourceTiming): boolean {\n return this._hasNoSizeData(resource) && this._hasTimingData(resource);\n }\n\n private _isFetchIncomplete(resource: MXLPerformanceResourceTiming): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n const responseEnd =\n typeof resource.responseEnd === 'number' ? resource.responseEnd : 0;\n\n return this._hasNoSizeData(resource) && fetchStart > 0 && responseEnd === 0;\n }\n\n private _isFetchPrevented(resource: MXLPerformanceResourceTiming): boolean {\n const fetchStart =\n typeof resource.fetchStart === 'number' ? resource.fetchStart : 0;\n\n return this._hasNoSizeData(resource) && fetchStart === 0;\n }\n\n /**\n * Detect cache validation (304 Not Modified responses)\n *\n * 304 responses show transferSize of ~300 bytes (headers only, no body).\n * Use deliveryType to distinguish from cache hits: 'cache' = no network, otherwise = 304.\n *\n * Spec: https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-transfersize\n */\n private _isCacheValidated(resource: MXLPerformanceResourceTiming): boolean {\n const transferSize =\n typeof resource.transferSize === 'number' ? resource.transferSize : 0;\n const deliveryType =\n typeof resource.deliveryType === 'string' ? resource.deliveryType : '';\n\n return transferSize === 300 && deliveryType !== 'cache';\n }\n\n /**\n * Add diagnostic attributes to identify resource loading issues\n *\n * Diagnostic attributes help identify why resources may have incomplete timing data:\n * - CORS restrictions (opaque responses without Timing-Allow-Origin header)\n * - Cache revalidation (304 Not Modified responses)\n * - Request incomplete (started but didn't complete - network error, aborted)\n * - Request prevented (never started - blocked by CSP, browser, extension)\n */\n private _addResourceDiagnosticAttributes(\n span: Span,\n resource: MXLPerformanceResourceTiming,\n ): void {\n if (this._isCorsRestricted(resource)) {\n span.setAttribute(ATTR_HTTP_RESPONSE_CORS_OPAQUE, true);\n } else if (this._isFetchIncomplete(resource)) {\n span.setAttribute(ATTR_HTTP_REQUEST_INCOMPLETE, true);\n } else if (this._isFetchPrevented(resource)) {\n span.setAttribute(ATTR_HTTP_REQUEST_PREVENTED, true);\n }\n\n if (this._isCacheValidated(resource)) {\n span.setAttribute(ATTR_HTTP_RESPONSE_CACHE_REVALIDATED, true);\n }\n }\n\n public enable(): void {\n window.removeEventListener('load', this._onDocumentLoaded);\n this._waitForPageLoad();\n }\n\n public disable(): void {\n window.removeEventListener('load', this._onDocumentLoaded);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":["PerformanceTimingNames"],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/utils.ts"],"sourcesContent":["/*\n * Adapted from OpenTelemetry document-load instrumentation\n * https://github.com/open-telemetry/opentelemetry-js-contrib/tree/cc7eff47e2e7bad7678241b766753d5bd6dbc85f/packages/instrumentation-document-load\n */\n\nimport type { Span } from '@opentelemetry/api';\nimport type { PerformanceEntries } from '@opentelemetry/sdk-trace-web';\nimport { hasKey, PerformanceTimingNames } from '@opentelemetry/sdk-trace-web';\nimport { EventNames } from './enums/EventNames.ts';\n\nexport const getPerformanceNavigationEntries = (): PerformanceEntries => {\n const entries: PerformanceEntries = {};\n const performanceNavigationTiming =\n window.performance.getEntriesByType('navigation')[0];\n\n const keys = Object.values(PerformanceTimingNames);\n keys.forEach((key: PerformanceTimingNames) => {\n if (hasKey(performanceNavigationTiming, key)) {\n const value = performanceNavigationTiming[key];\n if (typeof value === 'number') {\n entries[key] = value;\n }\n }\n });\n\n return entries;\n};\n\nconst performancePaintNames = {\n 'first-paint': EventNames.FIRST_PAINT,\n 'first-contentful-paint': EventNames.FIRST_CONTENTFUL_PAINT,\n};\n\nexport const addSpanPerformancePaintEvents = (span: Span) => {\n const performancePaintTiming = window.performance.getEntriesByType('paint');\n performancePaintTiming.forEach(({ name, startTime }) => {\n if (hasKey(performancePaintNames, name)) {\n span.addEvent(performancePaintNames[name], startTime);\n }\n });\n};\n"],"mappings":";;;;;AAUA,MAAa,wCAA4D;CACvE,MAAM,UAA8B,EAAE;CACtC,MAAM,8BACJ,OAAO,YAAY,iBAAiB,aAAa,CAAC;AAEvC,QAAO,OAAOA,6BAAAA,uBACvB,CAAC,SAAS,QAAgC;AAC5C,OAAA,GAAA,6BAAA,QAAW,6BAA6B,IAAI,EAAE;GAC5C,MAAM,QAAQ,4BAA4B;AAC1C,OAAI,OAAO,UAAU,SACnB,SAAQ,OAAO;;GAGnB;AAEF,QAAO;;AAGT,MAAM,wBAAwB;CAC5B,eAAA;CACA,0BAAA;CACD;AAED,MAAa,iCAAiC,SAAe;AAC5B,QAAO,YAAY,iBAAiB,QAC7C,CAAC,SAAS,EAAE,MAAM,gBAAgB;AACtD,OAAA,GAAA,6BAAA,QAAW,uBAAuB,KAAK,CACrC,MAAK,SAAS,sBAAsB,OAAO,UAAU;GAEvD"}
1
+ {"version":3,"file":"utils.cjs","names":["PerformanceTimingNames"],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/utils.ts"],"sourcesContent":["/*\n * Adapted from OpenTelemetry document-load instrumentation\n * https://github.com/open-telemetry/opentelemetry-js-contrib/tree/cc7eff47e2e7bad7678241b766753d5bd6dbc85f/packages/instrumentation-document-load\n */\n\nimport type { Span } from '@opentelemetry/api';\nimport type { PerformanceEntries } from '@opentelemetry/sdk-trace-web';\nimport { hasKey, PerformanceTimingNames } from '@opentelemetry/sdk-trace-web';\nimport { EventNames } from './enums/EventNames';\n\nexport const getPerformanceNavigationEntries = (): PerformanceEntries => {\n const entries: PerformanceEntries = {};\n const performanceNavigationTiming =\n window.performance.getEntriesByType('navigation')[0];\n\n const keys = Object.values(PerformanceTimingNames);\n keys.forEach((key: PerformanceTimingNames) => {\n if (hasKey(performanceNavigationTiming, key)) {\n const value = performanceNavigationTiming[key];\n if (typeof value === 'number') {\n entries[key] = value;\n }\n }\n });\n\n return entries;\n};\n\nconst performancePaintNames = {\n 'first-paint': EventNames.FIRST_PAINT,\n 'first-contentful-paint': EventNames.FIRST_CONTENTFUL_PAINT,\n};\n\nexport const addSpanPerformancePaintEvents = (span: Span) => {\n const performancePaintTiming = window.performance.getEntriesByType('paint');\n performancePaintTiming.forEach(({ name, startTime }) => {\n if (hasKey(performancePaintNames, name)) {\n span.addEvent(performancePaintNames[name], startTime);\n }\n });\n};\n"],"mappings":";;;;;AAUA,MAAa,wCAA4D;CACvE,MAAM,UAA8B,EAAE;CACtC,MAAM,8BACJ,OAAO,YAAY,iBAAiB,aAAa,CAAC;AAEvC,QAAO,OAAOA,6BAAAA,uBACvB,CAAC,SAAS,QAAgC;AAC5C,OAAA,GAAA,6BAAA,QAAW,6BAA6B,IAAI,EAAE;GAC5C,MAAM,QAAQ,4BAA4B;AAC1C,OAAI,OAAO,UAAU,SACnB,SAAQ,OAAO;;GAGnB;AAEF,QAAO;;AAGT,MAAM,wBAAwB;CAC5B,eAAA;CACA,0BAAA;CACD;AAED,MAAa,iCAAiC,SAAe;AAC5B,QAAO,YAAY,iBAAiB,QAC7C,CAAC,SAAS,EAAE,MAAM,gBAAgB;AACtD,OAAA,GAAA,6BAAA,QAAW,uBAAuB,KAAK,CACrC,MAAK,SAAS,sBAAsB,OAAO,UAAU;GAEvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/utils.ts"],"sourcesContent":["/*\n * Adapted from OpenTelemetry document-load instrumentation\n * https://github.com/open-telemetry/opentelemetry-js-contrib/tree/cc7eff47e2e7bad7678241b766753d5bd6dbc85f/packages/instrumentation-document-load\n */\n\nimport type { Span } from '@opentelemetry/api';\nimport type { PerformanceEntries } from '@opentelemetry/sdk-trace-web';\nimport { hasKey, PerformanceTimingNames } from '@opentelemetry/sdk-trace-web';\nimport { EventNames } from './enums/EventNames.ts';\n\nexport const getPerformanceNavigationEntries = (): PerformanceEntries => {\n const entries: PerformanceEntries = {};\n const performanceNavigationTiming =\n window.performance.getEntriesByType('navigation')[0];\n\n const keys = Object.values(PerformanceTimingNames);\n keys.forEach((key: PerformanceTimingNames) => {\n if (hasKey(performanceNavigationTiming, key)) {\n const value = performanceNavigationTiming[key];\n if (typeof value === 'number') {\n entries[key] = value;\n }\n }\n });\n\n return entries;\n};\n\nconst performancePaintNames = {\n 'first-paint': EventNames.FIRST_PAINT,\n 'first-contentful-paint': EventNames.FIRST_CONTENTFUL_PAINT,\n};\n\nexport const addSpanPerformancePaintEvents = (span: Span) => {\n const performancePaintTiming = window.performance.getEntriesByType('paint');\n performancePaintTiming.forEach(({ name, startTime }) => {\n if (hasKey(performancePaintNames, name)) {\n span.addEvent(performancePaintNames[name], startTime);\n }\n });\n};\n"],"mappings":";;;AAUA,MAAa,wCAA4D;CACvE,MAAM,UAA8B,EAAE;CACtC,MAAM,8BACJ,OAAO,YAAY,iBAAiB,aAAa,CAAC;AAEvC,QAAO,OAAO,uBACvB,CAAC,SAAS,QAAgC;AAC5C,MAAI,OAAO,6BAA6B,IAAI,EAAE;GAC5C,MAAM,QAAQ,4BAA4B;AAC1C,OAAI,OAAO,UAAU,SACnB,SAAQ,OAAO;;GAGnB;AAEF,QAAO;;AAGT,MAAM,wBAAwB;CAC5B,eAAA;CACA,0BAAA;CACD;AAED,MAAa,iCAAiC,SAAe;AAC5B,QAAO,YAAY,iBAAiB,QAC7C,CAAC,SAAS,EAAE,MAAM,gBAAgB;AACtD,MAAI,OAAO,uBAAuB,KAAK,CACrC,MAAK,SAAS,sBAAsB,OAAO,UAAU;GAEvD"}
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../src/instrumentations/document-load/DocumentLoadInstrumentation/utils.ts"],"sourcesContent":["/*\n * Adapted from OpenTelemetry document-load instrumentation\n * https://github.com/open-telemetry/opentelemetry-js-contrib/tree/cc7eff47e2e7bad7678241b766753d5bd6dbc85f/packages/instrumentation-document-load\n */\n\nimport type { Span } from '@opentelemetry/api';\nimport type { PerformanceEntries } from '@opentelemetry/sdk-trace-web';\nimport { hasKey, PerformanceTimingNames } from '@opentelemetry/sdk-trace-web';\nimport { EventNames } from './enums/EventNames';\n\nexport const getPerformanceNavigationEntries = (): PerformanceEntries => {\n const entries: PerformanceEntries = {};\n const performanceNavigationTiming =\n window.performance.getEntriesByType('navigation')[0];\n\n const keys = Object.values(PerformanceTimingNames);\n keys.forEach((key: PerformanceTimingNames) => {\n if (hasKey(performanceNavigationTiming, key)) {\n const value = performanceNavigationTiming[key];\n if (typeof value === 'number') {\n entries[key] = value;\n }\n }\n });\n\n return entries;\n};\n\nconst performancePaintNames = {\n 'first-paint': EventNames.FIRST_PAINT,\n 'first-contentful-paint': EventNames.FIRST_CONTENTFUL_PAINT,\n};\n\nexport const addSpanPerformancePaintEvents = (span: Span) => {\n const performancePaintTiming = window.performance.getEntriesByType('paint');\n performancePaintTiming.forEach(({ name, startTime }) => {\n if (hasKey(performancePaintNames, name)) {\n span.addEvent(performancePaintNames[name], startTime);\n }\n });\n};\n"],"mappings":";;;AAUA,MAAa,wCAA4D;CACvE,MAAM,UAA8B,EAAE;CACtC,MAAM,8BACJ,OAAO,YAAY,iBAAiB,aAAa,CAAC;AAEvC,QAAO,OAAO,uBACvB,CAAC,SAAS,QAAgC;AAC5C,MAAI,OAAO,6BAA6B,IAAI,EAAE;GAC5C,MAAM,QAAQ,4BAA4B;AAC1C,OAAI,OAAO,UAAU,SACnB,SAAQ,OAAO;;GAGnB;AAEF,QAAO;;AAGT,MAAM,wBAAwB;CAC5B,eAAA;CACA,0BAAA;CACD;AAED,MAAa,iCAAiC,SAAe;AAC5B,QAAO,YAAY,iBAAiB,QAC7C,CAAC,SAAS,EAAE,MAAM,gBAAgB;AACtD,MAAI,OAAO,uBAAuB,KAAK,CACrC,MAAK,SAAS,sBAAsB,OAAO,UAAU;GAEvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ElementTimingInstrumentation.cjs","names":["MXLInstrumentationBase","isEntryTypeSupported","createPerformanceObserver","KEY_MXL_TYPE","KEY_MXL_ELEMENT_TIMING_IDENTIFIER","KEY_MXL_ELEMENT_TIMING_ELEMENT","KEY_MXL_ELEMENT_TIMING_RENDER_TIME","KEY_MXL_ELEMENT_TIMING_LOAD_TIME","KEY_MXL_ELEMENT_TIMING_START_TIME","KEY_MXL_ELEMENT_TIMING_URL","KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH","KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT"],"sources":["../../../../src/instrumentations/element-timing/ElementTimingInstrumentation/ElementTimingInstrumentation.ts"],"sourcesContent":["import { MXL_TYPES, KEY_MXL_TYPE } from '../../../constants/index.ts';\nimport {\n createPerformanceObserver,\n isEntryTypeSupported,\n} from '../../../utils/index.ts';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport {\n KEY_MXL_ELEMENT_TIMING_ELEMENT,\n KEY_MXL_ELEMENT_TIMING_IDENTIFIER,\n KEY_MXL_ELEMENT_TIMING_LOAD_TIME,\n KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT,\n KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH,\n KEY_MXL_ELEMENT_TIMING_RENDER_TIME,\n KEY_MXL_ELEMENT_TIMING_START_TIME,\n KEY_MXL_ELEMENT_TIMING_URL,\n} from './constants.ts';\nimport type {\n ElementTimingInstrumentationArgs,\n PerformanceElementTiming,\n} from './types.ts';\n\nexport class ElementTimingInstrumentation extends MXLInstrumentationBase {\n private _observer: PerformanceObserver | null = null;\n private _isEnabled = false;\n\n public constructor({\n diag,\n perf,\n limitManager,\n }: ElementTimingInstrumentationArgs = {}) {\n super({\n instrumentationName: 'ElementTimingInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n limitManager,\n config: {},\n });\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public enable(): void {\n if (this._isEnabled) {\n return;\n }\n\n if (!isEntryTypeSupported('element')) {\n this._diag.debug('element not supported, skipping');\n return;\n }\n\n this._isEnabled = true;\n\n if (this._observer) {\n this._observer.disconnect();\n }\n\n this._observer = createPerformanceObserver<PerformanceElementTiming>(\n 'element',\n (entry) => this._processEntry(entry),\n { diag: this._diag },\n );\n\n if (!this._observer) {\n this._isEnabled = false;\n this._diag.error('failed to enable');\n return;\n }\n }\n\n public disable(): void {\n this._isEnabled = false;\n\n if (this._observer) {\n this._observer.disconnect();\n this._observer = null;\n }\n }\n\n private _processEntry(entry: PerformanceElementTiming): void {\n if (!this._isEnabled) {\n return;\n }\n\n if (this.limitManager?.limitElementTimingEntry()) {\n return;\n }\n\n const span = this.tracer.startSpan(entry.identifier, {\n // Span start anchors to navigation start so the span duration equals \"time from navigation\n // until the element was rendered\" — useful for analyzing page-load render timing.\n startTime: this.perf.epochMillisFromOriginOffset(0),\n attributes: {\n [KEY_MXL_TYPE]: MXL_TYPES.ElementTiming,\n [KEY_MXL_ELEMENT_TIMING_IDENTIFIER]: entry.identifier,\n [KEY_MXL_ELEMENT_TIMING_ELEMENT]: entry.element?.tagName?.toLowerCase(),\n [KEY_MXL_ELEMENT_TIMING_RENDER_TIME]: entry.renderTime,\n [KEY_MXL_ELEMENT_TIMING_LOAD_TIME]: entry.loadTime,\n [KEY_MXL_ELEMENT_TIMING_START_TIME]: entry.startTime,\n [KEY_MXL_ELEMENT_TIMING_URL]: entry.url,\n [KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH]: entry.naturalWidth,\n [KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT]: entry.naturalHeight,\n },\n });\n if (entry.loadTime > 0) {\n span.addEvent(\n 'load',\n this.perf.epochMillisFromOriginOffset(entry.loadTime),\n );\n }\n // entry.startTime = renderTime if non-zero, else loadTime\n span.end(this.perf.epochMillisFromOriginOffset(entry.startTime));\n }\n}\n"],"mappings":";;;;;;AAqBA,IAAa,+BAAb,cAAkDA,uEAAAA,uBAAuB;CACvE,YAAgD;CAChD,aAAqB;CAErB,YAAmB,EACjB,MACA,MACA,iBACoC,EAAE,EAAE;AACxC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,SAAsB;AACpB,MAAI,KAAK,WACP;AAGF,MAAI,CAACC,sDAAAA,qBAAqB,UAAU,EAAE;AACpC,QAAK,MAAM,MAAM,kCAAkC;AACnD;;AAGF,OAAK,aAAa;AAElB,MAAI,KAAK,UACP,MAAK,UAAU,YAAY;AAG7B,OAAK,YAAYC,sDAAAA,0BACf,YACC,UAAU,KAAK,cAAc,MAAM,EACpC,EAAE,MAAM,KAAK,OAAO,CACrB;AAED,MAAI,CAAC,KAAK,WAAW;AACnB,QAAK,aAAa;AAClB,QAAK,MAAM,MAAM,mBAAmB;AACpC;;;CAIJ,UAAuB;AACrB,OAAK,aAAa;AAElB,MAAI,KAAK,WAAW;AAClB,QAAK,UAAU,YAAY;AAC3B,QAAK,YAAY;;;CAIrB,cAAsB,OAAuC;AAC3D,MAAI,CAAC,KAAK,WACR;AAGF,MAAI,KAAK,cAAc,yBAAyB,CAC9C;EAGF,MAAM,OAAO,KAAK,OAAO,UAAU,MAAM,YAAY;GAGnD,WAAW,KAAK,KAAK,4BAA4B,EAAE;GACnD,YAAY;KACTC,6BAAAA,eAAAA;KACAC,+EAAAA,oCAAoC,MAAM;KAC1CC,+EAAAA,iCAAiC,MAAM,SAAS,SAAS,aAAa;KACtEC,+EAAAA,qCAAqC,MAAM;KAC3CC,+EAAAA,mCAAmC,MAAM;KACzCC,+EAAAA,oCAAoC,MAAM;KAC1CC,+EAAAA,6BAA6B,MAAM;KACnCC,+EAAAA,uCAAuC,MAAM;KAC7CC,+EAAAA,wCAAwC,MAAM;IAChD;GACF,CAAC;AACF,MAAI,MAAM,WAAW,EACnB,MAAK,SACH,QACA,KAAK,KAAK,4BAA4B,MAAM,SAAS,CACtD;AAGH,OAAK,IAAI,KAAK,KAAK,4BAA4B,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"ElementTimingInstrumentation.cjs","names":["MXLInstrumentationBase","isEntryTypeSupported","createPerformanceObserver","KEY_MXL_TYPE","KEY_MXL_ELEMENT_TIMING_IDENTIFIER","KEY_MXL_ELEMENT_TIMING_ELEMENT","KEY_MXL_ELEMENT_TIMING_RENDER_TIME","KEY_MXL_ELEMENT_TIMING_LOAD_TIME","KEY_MXL_ELEMENT_TIMING_START_TIME","KEY_MXL_ELEMENT_TIMING_URL","KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH","KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT"],"sources":["../../../../src/instrumentations/element-timing/ElementTimingInstrumentation/ElementTimingInstrumentation.ts"],"sourcesContent":["import { KEY_MXL_TYPE, MXL_TYPES } from '../../../constants';\nimport {\n createPerformanceObserver,\n isEntryTypeSupported,\n} from '../../../utils';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport {\n KEY_MXL_ELEMENT_TIMING_ELEMENT,\n KEY_MXL_ELEMENT_TIMING_IDENTIFIER,\n KEY_MXL_ELEMENT_TIMING_LOAD_TIME,\n KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT,\n KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH,\n KEY_MXL_ELEMENT_TIMING_RENDER_TIME,\n KEY_MXL_ELEMENT_TIMING_START_TIME,\n KEY_MXL_ELEMENT_TIMING_URL,\n} from './constants';\nimport type {\n ElementTimingInstrumentationArgs,\n PerformanceElementTiming,\n} from './types';\n\nexport class ElementTimingInstrumentation extends MXLInstrumentationBase {\n private _observer: PerformanceObserver | null = null;\n private _isEnabled = false;\n\n public constructor({\n diag,\n perf,\n limitManager,\n }: ElementTimingInstrumentationArgs = {}) {\n super({\n instrumentationName: 'ElementTimingInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n limitManager,\n config: {},\n });\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public enable(): void {\n if (this._isEnabled) {\n return;\n }\n\n if (!isEntryTypeSupported('element')) {\n this._diag.debug('element not supported, skipping');\n return;\n }\n\n this._isEnabled = true;\n\n if (this._observer) {\n this._observer.disconnect();\n }\n\n this._observer = createPerformanceObserver<PerformanceElementTiming>(\n 'element',\n (entry) => this._processEntry(entry),\n { diag: this._diag },\n );\n\n if (!this._observer) {\n this._isEnabled = false;\n this._diag.error('failed to enable');\n return;\n }\n }\n\n public disable(): void {\n this._isEnabled = false;\n\n if (this._observer) {\n this._observer.disconnect();\n this._observer = null;\n }\n }\n\n private _processEntry(entry: PerformanceElementTiming): void {\n if (!this._isEnabled) {\n return;\n }\n\n if (this.limitManager?.limitElementTimingEntry()) {\n return;\n }\n\n const span = this.tracer.startSpan(entry.identifier, {\n // Span start anchors to navigation start so the span duration equals \"time from navigation\n // until the element was rendered\" — useful for analyzing page-load render timing.\n startTime: this.perf.epochMillisFromOriginOffset(0),\n attributes: {\n [KEY_MXL_TYPE]: MXL_TYPES.ElementTiming,\n [KEY_MXL_ELEMENT_TIMING_IDENTIFIER]: entry.identifier,\n [KEY_MXL_ELEMENT_TIMING_ELEMENT]: entry.element?.tagName?.toLowerCase(),\n [KEY_MXL_ELEMENT_TIMING_RENDER_TIME]: entry.renderTime,\n [KEY_MXL_ELEMENT_TIMING_LOAD_TIME]: entry.loadTime,\n [KEY_MXL_ELEMENT_TIMING_START_TIME]: entry.startTime,\n [KEY_MXL_ELEMENT_TIMING_URL]: entry.url,\n [KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH]: entry.naturalWidth,\n [KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT]: entry.naturalHeight,\n },\n });\n if (entry.loadTime > 0) {\n span.addEvent(\n 'load',\n this.perf.epochMillisFromOriginOffset(entry.loadTime),\n );\n }\n // entry.startTime = renderTime if non-zero, else loadTime\n span.end(this.perf.epochMillisFromOriginOffset(entry.startTime));\n }\n}\n"],"mappings":";;;;;;AAqBA,IAAa,+BAAb,cAAkDA,uEAAAA,uBAAuB;CACvE,YAAgD;CAChD,aAAqB;CAErB,YAAmB,EACjB,MACA,MACA,iBACoC,EAAE,EAAE;AACxC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,SAAsB;AACpB,MAAI,KAAK,WACP;AAGF,MAAI,CAACC,sDAAAA,qBAAqB,UAAU,EAAE;AACpC,QAAK,MAAM,MAAM,kCAAkC;AACnD;;AAGF,OAAK,aAAa;AAElB,MAAI,KAAK,UACP,MAAK,UAAU,YAAY;AAG7B,OAAK,YAAYC,sDAAAA,0BACf,YACC,UAAU,KAAK,cAAc,MAAM,EACpC,EAAE,MAAM,KAAK,OAAO,CACrB;AAED,MAAI,CAAC,KAAK,WAAW;AACnB,QAAK,aAAa;AAClB,QAAK,MAAM,MAAM,mBAAmB;AACpC;;;CAIJ,UAAuB;AACrB,OAAK,aAAa;AAElB,MAAI,KAAK,WAAW;AAClB,QAAK,UAAU,YAAY;AAC3B,QAAK,YAAY;;;CAIrB,cAAsB,OAAuC;AAC3D,MAAI,CAAC,KAAK,WACR;AAGF,MAAI,KAAK,cAAc,yBAAyB,CAC9C;EAGF,MAAM,OAAO,KAAK,OAAO,UAAU,MAAM,YAAY;GAGnD,WAAW,KAAK,KAAK,4BAA4B,EAAE;GACnD,YAAY;KACTC,6BAAAA,eAAAA;KACAC,+EAAAA,oCAAoC,MAAM;KAC1CC,+EAAAA,iCAAiC,MAAM,SAAS,SAAS,aAAa;KACtEC,+EAAAA,qCAAqC,MAAM;KAC3CC,+EAAAA,mCAAmC,MAAM;KACzCC,+EAAAA,oCAAoC,MAAM;KAC1CC,+EAAAA,6BAA6B,MAAM;KACnCC,+EAAAA,uCAAuC,MAAM;KAC7CC,+EAAAA,wCAAwC,MAAM;IAChD;GACF,CAAC;AACF,MAAI,MAAM,WAAW,EACnB,MAAK,SACH,QACA,KAAK,KAAK,4BAA4B,MAAM,SAAS,CACtD;AAGH,OAAK,IAAI,KAAK,KAAK,4BAA4B,MAAM,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ElementTimingInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/element-timing/ElementTimingInstrumentation/ElementTimingInstrumentation.ts"],"sourcesContent":["import { MXL_TYPES, KEY_MXL_TYPE } from '../../../constants/index.ts';\nimport {\n createPerformanceObserver,\n isEntryTypeSupported,\n} from '../../../utils/index.ts';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport {\n KEY_MXL_ELEMENT_TIMING_ELEMENT,\n KEY_MXL_ELEMENT_TIMING_IDENTIFIER,\n KEY_MXL_ELEMENT_TIMING_LOAD_TIME,\n KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT,\n KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH,\n KEY_MXL_ELEMENT_TIMING_RENDER_TIME,\n KEY_MXL_ELEMENT_TIMING_START_TIME,\n KEY_MXL_ELEMENT_TIMING_URL,\n} from './constants.ts';\nimport type {\n ElementTimingInstrumentationArgs,\n PerformanceElementTiming,\n} from './types.ts';\n\nexport class ElementTimingInstrumentation extends MXLInstrumentationBase {\n private _observer: PerformanceObserver | null = null;\n private _isEnabled = false;\n\n public constructor({\n diag,\n perf,\n limitManager,\n }: ElementTimingInstrumentationArgs = {}) {\n super({\n instrumentationName: 'ElementTimingInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n limitManager,\n config: {},\n });\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public enable(): void {\n if (this._isEnabled) {\n return;\n }\n\n if (!isEntryTypeSupported('element')) {\n this._diag.debug('element not supported, skipping');\n return;\n }\n\n this._isEnabled = true;\n\n if (this._observer) {\n this._observer.disconnect();\n }\n\n this._observer = createPerformanceObserver<PerformanceElementTiming>(\n 'element',\n (entry) => this._processEntry(entry),\n { diag: this._diag },\n );\n\n if (!this._observer) {\n this._isEnabled = false;\n this._diag.error('failed to enable');\n return;\n }\n }\n\n public disable(): void {\n this._isEnabled = false;\n\n if (this._observer) {\n this._observer.disconnect();\n this._observer = null;\n }\n }\n\n private _processEntry(entry: PerformanceElementTiming): void {\n if (!this._isEnabled) {\n return;\n }\n\n if (this.limitManager?.limitElementTimingEntry()) {\n return;\n }\n\n const span = this.tracer.startSpan(entry.identifier, {\n // Span start anchors to navigation start so the span duration equals \"time from navigation\n // until the element was rendered\" — useful for analyzing page-load render timing.\n startTime: this.perf.epochMillisFromOriginOffset(0),\n attributes: {\n [KEY_MXL_TYPE]: MXL_TYPES.ElementTiming,\n [KEY_MXL_ELEMENT_TIMING_IDENTIFIER]: entry.identifier,\n [KEY_MXL_ELEMENT_TIMING_ELEMENT]: entry.element?.tagName?.toLowerCase(),\n [KEY_MXL_ELEMENT_TIMING_RENDER_TIME]: entry.renderTime,\n [KEY_MXL_ELEMENT_TIMING_LOAD_TIME]: entry.loadTime,\n [KEY_MXL_ELEMENT_TIMING_START_TIME]: entry.startTime,\n [KEY_MXL_ELEMENT_TIMING_URL]: entry.url,\n [KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH]: entry.naturalWidth,\n [KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT]: entry.naturalHeight,\n },\n });\n if (entry.loadTime > 0) {\n span.addEvent(\n 'load',\n this.perf.epochMillisFromOriginOffset(entry.loadTime),\n );\n }\n // entry.startTime = renderTime if non-zero, else loadTime\n span.end(this.perf.epochMillisFromOriginOffset(entry.startTime));\n }\n}\n"],"mappings":";;;;;AAqBA,IAAa,+BAAb,cAAkD,uBAAuB;CACvE,YAAgD;CAChD,aAAqB;CAErB,YAAmB,EACjB,MACA,MACA,iBACoC,EAAE,EAAE;AACxC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,SAAsB;AACpB,MAAI,KAAK,WACP;AAGF,MAAI,CAAC,qBAAqB,UAAU,EAAE;AACpC,QAAK,MAAM,MAAM,kCAAkC;AACnD;;AAGF,OAAK,aAAa;AAElB,MAAI,KAAK,UACP,MAAK,UAAU,YAAY;AAG7B,OAAK,YAAY,0BACf,YACC,UAAU,KAAK,cAAc,MAAM,EACpC,EAAE,MAAM,KAAK,OAAO,CACrB;AAED,MAAI,CAAC,KAAK,WAAW;AACnB,QAAK,aAAa;AAClB,QAAK,MAAM,MAAM,mBAAmB;AACpC;;;CAIJ,UAAuB;AACrB,OAAK,aAAa;AAElB,MAAI,KAAK,WAAW;AAClB,QAAK,UAAU,YAAY;AAC3B,QAAK,YAAY;;;CAIrB,cAAsB,OAAuC;AAC3D,MAAI,CAAC,KAAK,WACR;AAGF,MAAI,KAAK,cAAc,yBAAyB,CAC9C;EAGF,MAAM,OAAO,KAAK,OAAO,UAAU,MAAM,YAAY;GAGnD,WAAW,KAAK,KAAK,4BAA4B,EAAE;GACnD,YAAY;KACT,eAAA;KACA,oCAAoC,MAAM;KAC1C,iCAAiC,MAAM,SAAS,SAAS,aAAa;KACtE,qCAAqC,MAAM;KAC3C,mCAAmC,MAAM;KACzC,oCAAoC,MAAM;KAC1C,6BAA6B,MAAM;KACnC,uCAAuC,MAAM;KAC7C,wCAAwC,MAAM;IAChD;GACF,CAAC;AACF,MAAI,MAAM,WAAW,EACnB,MAAK,SACH,QACA,KAAK,KAAK,4BAA4B,MAAM,SAAS,CACtD;AAGH,OAAK,IAAI,KAAK,KAAK,4BAA4B,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"ElementTimingInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/element-timing/ElementTimingInstrumentation/ElementTimingInstrumentation.ts"],"sourcesContent":["import { KEY_MXL_TYPE, MXL_TYPES } from '../../../constants';\nimport {\n createPerformanceObserver,\n isEntryTypeSupported,\n} from '../../../utils';\nimport { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport {\n KEY_MXL_ELEMENT_TIMING_ELEMENT,\n KEY_MXL_ELEMENT_TIMING_IDENTIFIER,\n KEY_MXL_ELEMENT_TIMING_LOAD_TIME,\n KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT,\n KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH,\n KEY_MXL_ELEMENT_TIMING_RENDER_TIME,\n KEY_MXL_ELEMENT_TIMING_START_TIME,\n KEY_MXL_ELEMENT_TIMING_URL,\n} from './constants';\nimport type {\n ElementTimingInstrumentationArgs,\n PerformanceElementTiming,\n} from './types';\n\nexport class ElementTimingInstrumentation extends MXLInstrumentationBase {\n private _observer: PerformanceObserver | null = null;\n private _isEnabled = false;\n\n public constructor({\n diag,\n perf,\n limitManager,\n }: ElementTimingInstrumentationArgs = {}) {\n super({\n instrumentationName: 'ElementTimingInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n limitManager,\n config: {},\n });\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public enable(): void {\n if (this._isEnabled) {\n return;\n }\n\n if (!isEntryTypeSupported('element')) {\n this._diag.debug('element not supported, skipping');\n return;\n }\n\n this._isEnabled = true;\n\n if (this._observer) {\n this._observer.disconnect();\n }\n\n this._observer = createPerformanceObserver<PerformanceElementTiming>(\n 'element',\n (entry) => this._processEntry(entry),\n { diag: this._diag },\n );\n\n if (!this._observer) {\n this._isEnabled = false;\n this._diag.error('failed to enable');\n return;\n }\n }\n\n public disable(): void {\n this._isEnabled = false;\n\n if (this._observer) {\n this._observer.disconnect();\n this._observer = null;\n }\n }\n\n private _processEntry(entry: PerformanceElementTiming): void {\n if (!this._isEnabled) {\n return;\n }\n\n if (this.limitManager?.limitElementTimingEntry()) {\n return;\n }\n\n const span = this.tracer.startSpan(entry.identifier, {\n // Span start anchors to navigation start so the span duration equals \"time from navigation\n // until the element was rendered\" — useful for analyzing page-load render timing.\n startTime: this.perf.epochMillisFromOriginOffset(0),\n attributes: {\n [KEY_MXL_TYPE]: MXL_TYPES.ElementTiming,\n [KEY_MXL_ELEMENT_TIMING_IDENTIFIER]: entry.identifier,\n [KEY_MXL_ELEMENT_TIMING_ELEMENT]: entry.element?.tagName?.toLowerCase(),\n [KEY_MXL_ELEMENT_TIMING_RENDER_TIME]: entry.renderTime,\n [KEY_MXL_ELEMENT_TIMING_LOAD_TIME]: entry.loadTime,\n [KEY_MXL_ELEMENT_TIMING_START_TIME]: entry.startTime,\n [KEY_MXL_ELEMENT_TIMING_URL]: entry.url,\n [KEY_MXL_ELEMENT_TIMING_NATURAL_WIDTH]: entry.naturalWidth,\n [KEY_MXL_ELEMENT_TIMING_NATURAL_HEIGHT]: entry.naturalHeight,\n },\n });\n if (entry.loadTime > 0) {\n span.addEvent(\n 'load',\n this.perf.epochMillisFromOriginOffset(entry.loadTime),\n );\n }\n // entry.startTime = renderTime if non-zero, else loadTime\n span.end(this.perf.epochMillisFromOriginOffset(entry.startTime));\n }\n}\n"],"mappings":";;;;;AAqBA,IAAa,+BAAb,cAAkD,uBAAuB;CACvE,YAAgD;CAChD,aAAqB;CAErB,YAAmB,EACjB,MACA,MACA,iBACoC,EAAE,EAAE;AACxC,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,SAAsB;AACpB,MAAI,KAAK,WACP;AAGF,MAAI,CAAC,qBAAqB,UAAU,EAAE;AACpC,QAAK,MAAM,MAAM,kCAAkC;AACnD;;AAGF,OAAK,aAAa;AAElB,MAAI,KAAK,UACP,MAAK,UAAU,YAAY;AAG7B,OAAK,YAAY,0BACf,YACC,UAAU,KAAK,cAAc,MAAM,EACpC,EAAE,MAAM,KAAK,OAAO,CACrB;AAED,MAAI,CAAC,KAAK,WAAW;AACnB,QAAK,aAAa;AAClB,QAAK,MAAM,MAAM,mBAAmB;AACpC;;;CAIJ,UAAuB;AACrB,OAAK,aAAa;AAElB,MAAI,KAAK,WAAW;AAClB,QAAK,UAAU,YAAY;AAC3B,QAAK,YAAY;;;CAIrB,cAAsB,OAAuC;AAC3D,MAAI,CAAC,KAAK,WACR;AAGF,MAAI,KAAK,cAAc,yBAAyB,CAC9C;EAGF,MAAM,OAAO,KAAK,OAAO,UAAU,MAAM,YAAY;GAGnD,WAAW,KAAK,KAAK,4BAA4B,EAAE;GACnD,YAAY;KACT,eAAA;KACA,oCAAoC,MAAM;KAC1C,iCAAiC,MAAM,SAAS,SAAS,aAAa;KACtE,qCAAqC,MAAM;KAC3C,mCAAmC,MAAM;KACzC,oCAAoC,MAAM;KAC1C,6BAA6B,MAAM;KACnC,uCAAuC,MAAM;KAC7C,wCAAwC,MAAM;IAChD;GACF,CAAC;AACF,MAAI,MAAM,WAAW,EACnB,MAAK,SACH,QACA,KAAK,KAAK,4BAA4B,MAAM,SAAS,CACtD;AAGH,OAAK,IAAI,KAAK,KAAK,4BAA4B,MAAM,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyRootInstrumentation.cjs","names":["MXLInstrumentationBase"],"sources":["../../../../src/instrumentations/empty-root/EmptyRootInstrumentation/EmptyRootInstrumentation.ts"],"sourcesContent":["import { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport type { EmptyRootInstrumentationArgs } from './types.ts';\n\n/*\n EmptyRootInstrumentation observes changes to what is considered the root node of the application and emits a span\n event on the session span if it ever finds it empty.\n */\nexport class EmptyRootInstrumentation extends MXLInstrumentationBase {\n private readonly _observer: MutationObserver;\n private readonly _emptyCheckDelayMs: number;\n private readonly _rootNode: Node | null;\n\n public constructor({\n diag,\n perf,\n rootNode,\n emptyCheckDelayMs = 500,\n }: EmptyRootInstrumentationArgs) {\n super({\n instrumentationName: 'EmptyRootInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n\n this._rootNode = rootNode;\n this._emptyCheckDelayMs = emptyCheckDelayMs;\n\n this._observer = new MutationObserver(\n (mutationList: MutationRecord[], _observer: MutationObserver) => {\n this._observerCallback(mutationList);\n },\n );\n\n if (this._config.enabled && this._rootNode) {\n this.enable();\n } else if (!this._rootNode) {\n this._diag.warn(\n \"supplied root node was null, this instrumentation won't be enabled\",\n );\n }\n }\n\n public disable(): void {\n this._observer.disconnect();\n }\n\n public enable(): void {\n if (this._rootNode) {\n this._observer.observe(this._rootNode, { childList: true });\n }\n }\n\n protected _observerCallback(mutationList: MutationRecord[]): void {\n let removedNodesFromRoot = false;\n let addedNodesToRoot = false;\n\n for (const mutation of mutationList) {\n if (mutation.target === this._rootNode) {\n if (mutation.removedNodes.length > 0) {\n removedNodesFromRoot = true;\n }\n\n if (mutation.addedNodes.length > 0) {\n addedNodesToRoot = true;\n }\n }\n }\n\n if (removedNodesFromRoot && !addedNodesToRoot) {\n this._diag.debug(\n 'root node had child nodes removed without new ones being added, ' +\n `checking if it's empty in ${this._emptyCheckDelayMs}ms`,\n );\n\n window.setTimeout(() => {\n this._checkForEmptyRootNode();\n }, this._emptyCheckDelayMs);\n }\n }\n\n protected _checkForEmptyRootNode(): void {\n if (this._rootNode?.childNodes.length === 0) {\n this._diag.debug('root node was found to be empty');\n\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n if (currentSessionSpan) {\n currentSessionSpan.addEvent('empty-root-node', {\n 'mxl.type': 'ux.empty_root_node',\n });\n } else {\n this._diag.debug('no active session found to emit event on');\n }\n }\n }\n}\n"],"mappings":";;;AAOA,IAAa,2BAAb,cAA8CA,uEAAAA,uBAAuB;CACnE;CACA;CACA;CAEA,YAAmB,EACjB,MACA,MACA,UACA,oBAAoB,OACW;AAC/B,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,YAAY;AACjB,OAAK,qBAAqB;AAE1B,OAAK,YAAY,IAAI,kBAClB,cAAgC,cAAgC;AAC/D,QAAK,kBAAkB,aAAa;IAEvC;AAED,MAAI,KAAK,QAAQ,WAAW,KAAK,UAC/B,MAAK,QAAQ;WACJ,CAAC,KAAK,UACf,MAAK,MAAM,KACT,qEACD;;CAIL,UAAuB;AACrB,OAAK,UAAU,YAAY;;CAG7B,SAAsB;AACpB,MAAI,KAAK,UACP,MAAK,UAAU,QAAQ,KAAK,WAAW,EAAE,WAAW,MAAM,CAAC;;CAI/D,kBAA4B,cAAsC;EAChE,IAAI,uBAAuB;EAC3B,IAAI,mBAAmB;AAEvB,OAAK,MAAM,YAAY,aACrB,KAAI,SAAS,WAAW,KAAK,WAAW;AACtC,OAAI,SAAS,aAAa,SAAS,EACjC,wBAAuB;AAGzB,OAAI,SAAS,WAAW,SAAS,EAC/B,oBAAmB;;AAKzB,MAAI,wBAAwB,CAAC,kBAAkB;AAC7C,QAAK,MAAM,MACT,6FAC+B,KAAK,mBAAmB,IACxD;AAED,UAAO,iBAAiB;AACtB,SAAK,wBAAwB;MAC5B,KAAK,mBAAmB;;;CAI/B,yBAAyC;AACvC,MAAI,KAAK,WAAW,WAAW,WAAW,GAAG;AAC3C,QAAK,MAAM,MAAM,kCAAkC;GAEnD,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,OAAI,mBACF,oBAAmB,SAAS,mBAAmB,EAC7C,YAAY,sBACb,CAAC;OAEF,MAAK,MAAM,MAAM,2CAA2C"}
1
+ {"version":3,"file":"EmptyRootInstrumentation.cjs","names":["MXLInstrumentationBase"],"sources":["../../../../src/instrumentations/empty-root/EmptyRootInstrumentation/EmptyRootInstrumentation.ts"],"sourcesContent":["import { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport type { EmptyRootInstrumentationArgs } from './types';\n\n/*\n EmptyRootInstrumentation observes changes to what is considered the root node of the application and emits a span\n event on the session span if it ever finds it empty.\n */\nexport class EmptyRootInstrumentation extends MXLInstrumentationBase {\n private readonly _observer: MutationObserver;\n private readonly _emptyCheckDelayMs: number;\n private readonly _rootNode: Node | null;\n\n public constructor({\n diag,\n perf,\n rootNode,\n emptyCheckDelayMs = 500,\n }: EmptyRootInstrumentationArgs) {\n super({\n instrumentationName: 'EmptyRootInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n\n this._rootNode = rootNode;\n this._emptyCheckDelayMs = emptyCheckDelayMs;\n\n this._observer = new MutationObserver(\n (mutationList: MutationRecord[], _observer: MutationObserver) => {\n this._observerCallback(mutationList);\n },\n );\n\n if (this._config.enabled && this._rootNode) {\n this.enable();\n } else if (!this._rootNode) {\n this._diag.warn(\n \"supplied root node was null, this instrumentation won't be enabled\",\n );\n }\n }\n\n public disable(): void {\n this._observer.disconnect();\n }\n\n public enable(): void {\n if (this._rootNode) {\n this._observer.observe(this._rootNode, { childList: true });\n }\n }\n\n protected _observerCallback(mutationList: MutationRecord[]): void {\n let removedNodesFromRoot = false;\n let addedNodesToRoot = false;\n\n for (const mutation of mutationList) {\n if (mutation.target === this._rootNode) {\n if (mutation.removedNodes.length > 0) {\n removedNodesFromRoot = true;\n }\n\n if (mutation.addedNodes.length > 0) {\n addedNodesToRoot = true;\n }\n }\n }\n\n if (removedNodesFromRoot && !addedNodesToRoot) {\n this._diag.debug(\n 'root node had child nodes removed without new ones being added, ' +\n `checking if it's empty in ${this._emptyCheckDelayMs}ms`,\n );\n\n window.setTimeout(() => {\n this._checkForEmptyRootNode();\n }, this._emptyCheckDelayMs);\n }\n }\n\n protected _checkForEmptyRootNode(): void {\n if (this._rootNode?.childNodes.length === 0) {\n this._diag.debug('root node was found to be empty');\n\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n if (currentSessionSpan) {\n currentSessionSpan.addEvent('empty-root-node', {\n 'mxl.type': 'ux.empty_root_node',\n });\n } else {\n this._diag.debug('no active session found to emit event on');\n }\n }\n }\n}\n"],"mappings":";;;AAOA,IAAa,2BAAb,cAA8CA,uEAAAA,uBAAuB;CACnE;CACA;CACA;CAEA,YAAmB,EACjB,MACA,MACA,UACA,oBAAoB,OACW;AAC/B,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,YAAY;AACjB,OAAK,qBAAqB;AAE1B,OAAK,YAAY,IAAI,kBAClB,cAAgC,cAAgC;AAC/D,QAAK,kBAAkB,aAAa;IAEvC;AAED,MAAI,KAAK,QAAQ,WAAW,KAAK,UAC/B,MAAK,QAAQ;WACJ,CAAC,KAAK,UACf,MAAK,MAAM,KACT,qEACD;;CAIL,UAAuB;AACrB,OAAK,UAAU,YAAY;;CAG7B,SAAsB;AACpB,MAAI,KAAK,UACP,MAAK,UAAU,QAAQ,KAAK,WAAW,EAAE,WAAW,MAAM,CAAC;;CAI/D,kBAA4B,cAAsC;EAChE,IAAI,uBAAuB;EAC3B,IAAI,mBAAmB;AAEvB,OAAK,MAAM,YAAY,aACrB,KAAI,SAAS,WAAW,KAAK,WAAW;AACtC,OAAI,SAAS,aAAa,SAAS,EACjC,wBAAuB;AAGzB,OAAI,SAAS,WAAW,SAAS,EAC/B,oBAAmB;;AAKzB,MAAI,wBAAwB,CAAC,kBAAkB;AAC7C,QAAK,MAAM,MACT,6FAC+B,KAAK,mBAAmB,IACxD;AAED,UAAO,iBAAiB;AACtB,SAAK,wBAAwB;MAC5B,KAAK,mBAAmB;;;CAI/B,yBAAyC;AACvC,MAAI,KAAK,WAAW,WAAW,WAAW,GAAG;AAC3C,QAAK,MAAM,MAAM,kCAAkC;GAEnD,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,OAAI,mBACF,oBAAmB,SAAS,mBAAmB,EAC7C,YAAY,sBACb,CAAC;OAEF,MAAK,MAAM,MAAM,2CAA2C"}
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyRootInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/empty-root/EmptyRootInstrumentation/EmptyRootInstrumentation.ts"],"sourcesContent":["import { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport type { EmptyRootInstrumentationArgs } from './types.ts';\n\n/*\n EmptyRootInstrumentation observes changes to what is considered the root node of the application and emits a span\n event on the session span if it ever finds it empty.\n */\nexport class EmptyRootInstrumentation extends MXLInstrumentationBase {\n private readonly _observer: MutationObserver;\n private readonly _emptyCheckDelayMs: number;\n private readonly _rootNode: Node | null;\n\n public constructor({\n diag,\n perf,\n rootNode,\n emptyCheckDelayMs = 500,\n }: EmptyRootInstrumentationArgs) {\n super({\n instrumentationName: 'EmptyRootInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n\n this._rootNode = rootNode;\n this._emptyCheckDelayMs = emptyCheckDelayMs;\n\n this._observer = new MutationObserver(\n (mutationList: MutationRecord[], _observer: MutationObserver) => {\n this._observerCallback(mutationList);\n },\n );\n\n if (this._config.enabled && this._rootNode) {\n this.enable();\n } else if (!this._rootNode) {\n this._diag.warn(\n \"supplied root node was null, this instrumentation won't be enabled\",\n );\n }\n }\n\n public disable(): void {\n this._observer.disconnect();\n }\n\n public enable(): void {\n if (this._rootNode) {\n this._observer.observe(this._rootNode, { childList: true });\n }\n }\n\n protected _observerCallback(mutationList: MutationRecord[]): void {\n let removedNodesFromRoot = false;\n let addedNodesToRoot = false;\n\n for (const mutation of mutationList) {\n if (mutation.target === this._rootNode) {\n if (mutation.removedNodes.length > 0) {\n removedNodesFromRoot = true;\n }\n\n if (mutation.addedNodes.length > 0) {\n addedNodesToRoot = true;\n }\n }\n }\n\n if (removedNodesFromRoot && !addedNodesToRoot) {\n this._diag.debug(\n 'root node had child nodes removed without new ones being added, ' +\n `checking if it's empty in ${this._emptyCheckDelayMs}ms`,\n );\n\n window.setTimeout(() => {\n this._checkForEmptyRootNode();\n }, this._emptyCheckDelayMs);\n }\n }\n\n protected _checkForEmptyRootNode(): void {\n if (this._rootNode?.childNodes.length === 0) {\n this._diag.debug('root node was found to be empty');\n\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n if (currentSessionSpan) {\n currentSessionSpan.addEvent('empty-root-node', {\n 'mxl.type': 'ux.empty_root_node',\n });\n } else {\n this._diag.debug('no active session found to emit event on');\n }\n }\n }\n}\n"],"mappings":";;AAOA,IAAa,2BAAb,cAA8C,uBAAuB;CACnE;CACA;CACA;CAEA,YAAmB,EACjB,MACA,MACA,UACA,oBAAoB,OACW;AAC/B,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,YAAY;AACjB,OAAK,qBAAqB;AAE1B,OAAK,YAAY,IAAI,kBAClB,cAAgC,cAAgC;AAC/D,QAAK,kBAAkB,aAAa;IAEvC;AAED,MAAI,KAAK,QAAQ,WAAW,KAAK,UAC/B,MAAK,QAAQ;WACJ,CAAC,KAAK,UACf,MAAK,MAAM,KACT,qEACD;;CAIL,UAAuB;AACrB,OAAK,UAAU,YAAY;;CAG7B,SAAsB;AACpB,MAAI,KAAK,UACP,MAAK,UAAU,QAAQ,KAAK,WAAW,EAAE,WAAW,MAAM,CAAC;;CAI/D,kBAA4B,cAAsC;EAChE,IAAI,uBAAuB;EAC3B,IAAI,mBAAmB;AAEvB,OAAK,MAAM,YAAY,aACrB,KAAI,SAAS,WAAW,KAAK,WAAW;AACtC,OAAI,SAAS,aAAa,SAAS,EACjC,wBAAuB;AAGzB,OAAI,SAAS,WAAW,SAAS,EAC/B,oBAAmB;;AAKzB,MAAI,wBAAwB,CAAC,kBAAkB;AAC7C,QAAK,MAAM,MACT,6FAC+B,KAAK,mBAAmB,IACxD;AAED,UAAO,iBAAiB;AACtB,SAAK,wBAAwB;MAC5B,KAAK,mBAAmB;;;CAI/B,yBAAyC;AACvC,MAAI,KAAK,WAAW,WAAW,WAAW,GAAG;AAC3C,QAAK,MAAM,MAAM,kCAAkC;GAEnD,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,OAAI,mBACF,oBAAmB,SAAS,mBAAmB,EAC7C,YAAY,sBACb,CAAC;OAEF,MAAK,MAAM,MAAM,2CAA2C"}
1
+ {"version":3,"file":"EmptyRootInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/empty-root/EmptyRootInstrumentation/EmptyRootInstrumentation.ts"],"sourcesContent":["import { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport type { EmptyRootInstrumentationArgs } from './types';\n\n/*\n EmptyRootInstrumentation observes changes to what is considered the root node of the application and emits a span\n event on the session span if it ever finds it empty.\n */\nexport class EmptyRootInstrumentation extends MXLInstrumentationBase {\n private readonly _observer: MutationObserver;\n private readonly _emptyCheckDelayMs: number;\n private readonly _rootNode: Node | null;\n\n public constructor({\n diag,\n perf,\n rootNode,\n emptyCheckDelayMs = 500,\n }: EmptyRootInstrumentationArgs) {\n super({\n instrumentationName: 'EmptyRootInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n\n this._rootNode = rootNode;\n this._emptyCheckDelayMs = emptyCheckDelayMs;\n\n this._observer = new MutationObserver(\n (mutationList: MutationRecord[], _observer: MutationObserver) => {\n this._observerCallback(mutationList);\n },\n );\n\n if (this._config.enabled && this._rootNode) {\n this.enable();\n } else if (!this._rootNode) {\n this._diag.warn(\n \"supplied root node was null, this instrumentation won't be enabled\",\n );\n }\n }\n\n public disable(): void {\n this._observer.disconnect();\n }\n\n public enable(): void {\n if (this._rootNode) {\n this._observer.observe(this._rootNode, { childList: true });\n }\n }\n\n protected _observerCallback(mutationList: MutationRecord[]): void {\n let removedNodesFromRoot = false;\n let addedNodesToRoot = false;\n\n for (const mutation of mutationList) {\n if (mutation.target === this._rootNode) {\n if (mutation.removedNodes.length > 0) {\n removedNodesFromRoot = true;\n }\n\n if (mutation.addedNodes.length > 0) {\n addedNodesToRoot = true;\n }\n }\n }\n\n if (removedNodesFromRoot && !addedNodesToRoot) {\n this._diag.debug(\n 'root node had child nodes removed without new ones being added, ' +\n `checking if it's empty in ${this._emptyCheckDelayMs}ms`,\n );\n\n window.setTimeout(() => {\n this._checkForEmptyRootNode();\n }, this._emptyCheckDelayMs);\n }\n }\n\n protected _checkForEmptyRootNode(): void {\n if (this._rootNode?.childNodes.length === 0) {\n this._diag.debug('root node was found to be empty');\n\n const currentSessionSpan = this.sessionManager.getSessionSpan();\n if (currentSessionSpan) {\n currentSessionSpan.addEvent('empty-root-node', {\n 'mxl.type': 'ux.empty_root_node',\n });\n } else {\n this._diag.debug('no active session found to emit event on');\n }\n }\n }\n}\n"],"mappings":";;AAOA,IAAa,2BAAb,cAA8C,uBAAuB;CACnE;CACA;CACA;CAEA,YAAmB,EACjB,MACA,MACA,UACA,oBAAoB,OACW;AAC/B,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AAEF,OAAK,YAAY;AACjB,OAAK,qBAAqB;AAE1B,OAAK,YAAY,IAAI,kBAClB,cAAgC,cAAgC;AAC/D,QAAK,kBAAkB,aAAa;IAEvC;AAED,MAAI,KAAK,QAAQ,WAAW,KAAK,UAC/B,MAAK,QAAQ;WACJ,CAAC,KAAK,UACf,MAAK,MAAM,KACT,qEACD;;CAIL,UAAuB;AACrB,OAAK,UAAU,YAAY;;CAG7B,SAAsB;AACpB,MAAI,KAAK,UACP,MAAK,UAAU,QAAQ,KAAK,WAAW,EAAE,WAAW,MAAM,CAAC;;CAI/D,kBAA4B,cAAsC;EAChE,IAAI,uBAAuB;EAC3B,IAAI,mBAAmB;AAEvB,OAAK,MAAM,YAAY,aACrB,KAAI,SAAS,WAAW,KAAK,WAAW;AACtC,OAAI,SAAS,aAAa,SAAS,EACjC,wBAAuB;AAGzB,OAAI,SAAS,WAAW,SAAS,EAC/B,oBAAmB;;AAKzB,MAAI,wBAAwB,CAAC,kBAAkB;AAC7C,QAAK,MAAM,MACT,6FAC+B,KAAK,mBAAmB,IACxD;AAED,UAAO,iBAAiB;AACtB,SAAK,wBAAwB;MAC5B,KAAK,mBAAmB;;;CAI/B,yBAAyC;AACvC,MAAI,KAAK,WAAW,WAAW,WAAW,GAAG;AAC3C,QAAK,MAAM,MAAM,kCAAkC;GAEnD,MAAM,qBAAqB,KAAK,eAAe,gBAAgB;AAC/D,OAAI,mBACF,oBAAmB,SAAS,mBAAmB,EAC7C,YAAY,sBACb,CAAC;OAEF,MAAK,MAAM,MAAM,2CAA2C"}
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalExceptionInstrumentation.cjs","names":["MXLInstrumentationBase"],"sources":["../../../../src/instrumentations/exceptions/GlobalExceptionInstrumentation/GlobalExceptionInstrumentation.ts"],"sourcesContent":["import { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport type { GlobalExceptionInstrumentationArgs } from './types.ts';\n\nexport class GlobalExceptionInstrumentation extends MXLInstrumentationBase {\n private readonly _onErrorHandler: (event: ErrorEvent) => void;\n private readonly _onUnhandledRejectionHandler: (\n event: PromiseRejectionEvent,\n ) => void;\n\n public constructor({ diag, perf }: GlobalExceptionInstrumentationArgs = {}) {\n super({\n instrumentationName: 'GlobalExceptionInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n this._onErrorHandler = (event: ErrorEvent) => {\n this.logManager.logException(event.error || event.message, {\n handled: false,\n timestamp: this.perf.epochMillisFromOriginOffset(event.timeStamp),\n handler: 'global_exception',\n });\n };\n this._onUnhandledRejectionHandler = (event: PromiseRejectionEvent) => {\n this.logManager.logException(event.reason, {\n handled: false,\n timestamp: this.perf.epochMillisFromOriginOffset(event.timeStamp),\n handler: 'promise_rejection',\n });\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public disable(): void {\n window.removeEventListener('error', this._onErrorHandler);\n window.removeEventListener(\n 'unhandledrejection',\n this._onUnhandledRejectionHandler,\n );\n }\n\n public enable(): void {\n window.addEventListener('error', this._onErrorHandler);\n window.addEventListener(\n 'unhandledrejection',\n this._onUnhandledRejectionHandler,\n );\n }\n}\n"],"mappings":";;;AAGA,IAAa,iCAAb,cAAoDA,uEAAAA,uBAAuB;CACzE;CACA;CAIA,YAAmB,EAAE,MAAM,SAA6C,EAAE,EAAE;AAC1E,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AACF,OAAK,mBAAmB,UAAsB;AAC5C,QAAK,WAAW,aAAa,MAAM,SAAS,MAAM,SAAS;IACzD,SAAS;IACT,WAAW,KAAK,KAAK,4BAA4B,MAAM,UAAU;IACjE,SAAS;IACV,CAAC;;AAEJ,OAAK,gCAAgC,UAAiC;AACpE,QAAK,WAAW,aAAa,MAAM,QAAQ;IACzC,SAAS;IACT,WAAW,KAAK,KAAK,4BAA4B,MAAM,UAAU;IACjE,SAAS;IACV,CAAC;;AAGJ,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,SAAO,oBAAoB,SAAS,KAAK,gBAAgB;AACzD,SAAO,oBACL,sBACA,KAAK,6BACN;;CAGH,SAAsB;AACpB,SAAO,iBAAiB,SAAS,KAAK,gBAAgB;AACtD,SAAO,iBACL,sBACA,KAAK,6BACN"}
1
+ {"version":3,"file":"GlobalExceptionInstrumentation.cjs","names":["MXLInstrumentationBase"],"sources":["../../../../src/instrumentations/exceptions/GlobalExceptionInstrumentation/GlobalExceptionInstrumentation.ts"],"sourcesContent":["import { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport type { GlobalExceptionInstrumentationArgs } from './types';\n\nexport class GlobalExceptionInstrumentation extends MXLInstrumentationBase {\n private readonly _onErrorHandler: (event: ErrorEvent) => void;\n private readonly _onUnhandledRejectionHandler: (\n event: PromiseRejectionEvent,\n ) => void;\n\n public constructor({ diag, perf }: GlobalExceptionInstrumentationArgs = {}) {\n super({\n instrumentationName: 'GlobalExceptionInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n this._onErrorHandler = (event: ErrorEvent) => {\n this.logManager.logException(event.error || event.message, {\n handled: false,\n timestamp: this.perf.epochMillisFromOriginOffset(event.timeStamp),\n handler: 'global_exception',\n });\n };\n this._onUnhandledRejectionHandler = (event: PromiseRejectionEvent) => {\n this.logManager.logException(event.reason, {\n handled: false,\n timestamp: this.perf.epochMillisFromOriginOffset(event.timeStamp),\n handler: 'promise_rejection',\n });\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public disable(): void {\n window.removeEventListener('error', this._onErrorHandler);\n window.removeEventListener(\n 'unhandledrejection',\n this._onUnhandledRejectionHandler,\n );\n }\n\n public enable(): void {\n window.addEventListener('error', this._onErrorHandler);\n window.addEventListener(\n 'unhandledrejection',\n this._onUnhandledRejectionHandler,\n );\n }\n}\n"],"mappings":";;;AAGA,IAAa,iCAAb,cAAoDA,uEAAAA,uBAAuB;CACzE;CACA;CAIA,YAAmB,EAAE,MAAM,SAA6C,EAAE,EAAE;AAC1E,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AACF,OAAK,mBAAmB,UAAsB;AAC5C,QAAK,WAAW,aAAa,MAAM,SAAS,MAAM,SAAS;IACzD,SAAS;IACT,WAAW,KAAK,KAAK,4BAA4B,MAAM,UAAU;IACjE,SAAS;IACV,CAAC;;AAEJ,OAAK,gCAAgC,UAAiC;AACpE,QAAK,WAAW,aAAa,MAAM,QAAQ;IACzC,SAAS;IACT,WAAW,KAAK,KAAK,4BAA4B,MAAM,UAAU;IACjE,SAAS;IACV,CAAC;;AAGJ,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,SAAO,oBAAoB,SAAS,KAAK,gBAAgB;AACzD,SAAO,oBACL,sBACA,KAAK,6BACN;;CAGH,SAAsB;AACpB,SAAO,iBAAiB,SAAS,KAAK,gBAAgB;AACtD,SAAO,iBACL,sBACA,KAAK,6BACN"}
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalExceptionInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/exceptions/GlobalExceptionInstrumentation/GlobalExceptionInstrumentation.ts"],"sourcesContent":["import { MXLInstrumentationBase } from '../../MXLInstrumentationBase/index.ts';\nimport type { GlobalExceptionInstrumentationArgs } from './types.ts';\n\nexport class GlobalExceptionInstrumentation extends MXLInstrumentationBase {\n private readonly _onErrorHandler: (event: ErrorEvent) => void;\n private readonly _onUnhandledRejectionHandler: (\n event: PromiseRejectionEvent,\n ) => void;\n\n public constructor({ diag, perf }: GlobalExceptionInstrumentationArgs = {}) {\n super({\n instrumentationName: 'GlobalExceptionInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n this._onErrorHandler = (event: ErrorEvent) => {\n this.logManager.logException(event.error || event.message, {\n handled: false,\n timestamp: this.perf.epochMillisFromOriginOffset(event.timeStamp),\n handler: 'global_exception',\n });\n };\n this._onUnhandledRejectionHandler = (event: PromiseRejectionEvent) => {\n this.logManager.logException(event.reason, {\n handled: false,\n timestamp: this.perf.epochMillisFromOriginOffset(event.timeStamp),\n handler: 'promise_rejection',\n });\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public disable(): void {\n window.removeEventListener('error', this._onErrorHandler);\n window.removeEventListener(\n 'unhandledrejection',\n this._onUnhandledRejectionHandler,\n );\n }\n\n public enable(): void {\n window.addEventListener('error', this._onErrorHandler);\n window.addEventListener(\n 'unhandledrejection',\n this._onUnhandledRejectionHandler,\n );\n }\n}\n"],"mappings":";;AAGA,IAAa,iCAAb,cAAoD,uBAAuB;CACzE;CACA;CAIA,YAAmB,EAAE,MAAM,SAA6C,EAAE,EAAE;AAC1E,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AACF,OAAK,mBAAmB,UAAsB;AAC5C,QAAK,WAAW,aAAa,MAAM,SAAS,MAAM,SAAS;IACzD,SAAS;IACT,WAAW,KAAK,KAAK,4BAA4B,MAAM,UAAU;IACjE,SAAS;IACV,CAAC;;AAEJ,OAAK,gCAAgC,UAAiC;AACpE,QAAK,WAAW,aAAa,MAAM,QAAQ;IACzC,SAAS;IACT,WAAW,KAAK,KAAK,4BAA4B,MAAM,UAAU;IACjE,SAAS;IACV,CAAC;;AAGJ,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,SAAO,oBAAoB,SAAS,KAAK,gBAAgB;AACzD,SAAO,oBACL,sBACA,KAAK,6BACN;;CAGH,SAAsB;AACpB,SAAO,iBAAiB,SAAS,KAAK,gBAAgB;AACtD,SAAO,iBACL,sBACA,KAAK,6BACN"}
1
+ {"version":3,"file":"GlobalExceptionInstrumentation.js","names":[],"sources":["../../../../src/instrumentations/exceptions/GlobalExceptionInstrumentation/GlobalExceptionInstrumentation.ts"],"sourcesContent":["import { MXLInstrumentationBase } from '../../MXLInstrumentationBase';\nimport type { GlobalExceptionInstrumentationArgs } from './types';\n\nexport class GlobalExceptionInstrumentation extends MXLInstrumentationBase {\n private readonly _onErrorHandler: (event: ErrorEvent) => void;\n private readonly _onUnhandledRejectionHandler: (\n event: PromiseRejectionEvent,\n ) => void;\n\n public constructor({ diag, perf }: GlobalExceptionInstrumentationArgs = {}) {\n super({\n instrumentationName: 'GlobalExceptionInstrumentation',\n instrumentationVersion: '1.0.0',\n diag,\n perf,\n config: {},\n });\n this._onErrorHandler = (event: ErrorEvent) => {\n this.logManager.logException(event.error || event.message, {\n handled: false,\n timestamp: this.perf.epochMillisFromOriginOffset(event.timeStamp),\n handler: 'global_exception',\n });\n };\n this._onUnhandledRejectionHandler = (event: PromiseRejectionEvent) => {\n this.logManager.logException(event.reason, {\n handled: false,\n timestamp: this.perf.epochMillisFromOriginOffset(event.timeStamp),\n handler: 'promise_rejection',\n });\n };\n\n if (this._config.enabled) {\n this.enable();\n }\n }\n\n public disable(): void {\n window.removeEventListener('error', this._onErrorHandler);\n window.removeEventListener(\n 'unhandledrejection',\n this._onUnhandledRejectionHandler,\n );\n }\n\n public enable(): void {\n window.addEventListener('error', this._onErrorHandler);\n window.addEventListener(\n 'unhandledrejection',\n this._onUnhandledRejectionHandler,\n );\n }\n}\n"],"mappings":";;AAGA,IAAa,iCAAb,cAAoD,uBAAuB;CACzE;CACA;CAIA,YAAmB,EAAE,MAAM,SAA6C,EAAE,EAAE;AAC1E,QAAM;GACJ,qBAAqB;GACrB,wBAAwB;GACxB;GACA;GACA,QAAQ,EAAE;GACX,CAAC;AACF,OAAK,mBAAmB,UAAsB;AAC5C,QAAK,WAAW,aAAa,MAAM,SAAS,MAAM,SAAS;IACzD,SAAS;IACT,WAAW,KAAK,KAAK,4BAA4B,MAAM,UAAU;IACjE,SAAS;IACV,CAAC;;AAEJ,OAAK,gCAAgC,UAAiC;AACpE,QAAK,WAAW,aAAa,MAAM,QAAQ;IACzC,SAAS;IACT,WAAW,KAAK,KAAK,4BAA4B,MAAM,UAAU;IACjE,SAAS;IACV,CAAC;;AAGJ,MAAI,KAAK,QAAQ,QACf,MAAK,QAAQ;;CAIjB,UAAuB;AACrB,SAAO,oBAAoB,SAAS,KAAK,gBAAgB;AACzD,SAAO,oBACL,sBACA,KAAK,6BACN;;CAGH,SAAsB;AACpB,SAAO,iBAAiB,SAAS,KAAK,gBAAgB;AACtD,SAAO,iBACL,sBACA,KAAK,6BACN"}