@sentry/core 10.37.0 → 10.39.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/build/cjs/attributes.js.map +1 -1
  2. package/build/cjs/client.js +22 -12
  3. package/build/cjs/client.js.map +1 -1
  4. package/build/cjs/envelope.js +41 -7
  5. package/build/cjs/envelope.js.map +1 -1
  6. package/build/cjs/index.js +131 -79
  7. package/build/cjs/index.js.map +1 -1
  8. package/build/cjs/integration.js +12 -0
  9. package/build/cjs/integration.js.map +1 -1
  10. package/build/cjs/integrations/captureconsole.js +2 -2
  11. package/build/cjs/integrations/captureconsole.js.map +1 -1
  12. package/build/cjs/integrations/eventFilters.js +1 -1
  13. package/build/cjs/integrations/eventFilters.js.map +1 -1
  14. package/build/cjs/integrations/mcp-server/correlation.js +54 -10
  15. package/build/cjs/integrations/mcp-server/correlation.js.map +1 -1
  16. package/build/cjs/integrations/mcp-server/errorCapture.js +2 -2
  17. package/build/cjs/integrations/mcp-server/errorCapture.js.map +1 -1
  18. package/build/cjs/integrations/mcp-server/sessionManagement.js +50 -16
  19. package/build/cjs/integrations/mcp-server/sessionManagement.js.map +1 -1
  20. package/build/cjs/integrations/requestdata.js +72 -6
  21. package/build/cjs/integrations/requestdata.js.map +1 -1
  22. package/build/cjs/integrations/spanStreaming.js +54 -0
  23. package/build/cjs/integrations/spanStreaming.js.map +1 -0
  24. package/build/cjs/integrations/supabase.js +4 -4
  25. package/build/cjs/integrations/supabase.js.map +1 -1
  26. package/build/cjs/metrics/public-api.js +3 -3
  27. package/build/cjs/metrics/public-api.js.map +1 -1
  28. package/build/cjs/scope.js +1 -1
  29. package/build/cjs/scope.js.map +1 -1
  30. package/build/cjs/semanticAttributes.js +84 -0
  31. package/build/cjs/semanticAttributes.js.map +1 -1
  32. package/build/cjs/spans/captureSpan.js +104 -0
  33. package/build/cjs/spans/captureSpan.js.map +1 -0
  34. package/build/cjs/spans/spanBuffer.js +121 -0
  35. package/build/cjs/spans/spanBuffer.js.map +1 -0
  36. package/build/cjs/spans/spanFirstUtils.js +186 -0
  37. package/build/cjs/spans/spanFirstUtils.js.map +1 -0
  38. package/build/cjs/tracing/ai/gen-ai-attributes.js +6 -0
  39. package/build/cjs/tracing/ai/gen-ai-attributes.js.map +1 -1
  40. package/build/cjs/tracing/anthropic-ai/index.js +3 -3
  41. package/build/cjs/tracing/anthropic-ai/index.js.map +1 -1
  42. package/build/cjs/tracing/anthropic-ai/streaming.js +3 -3
  43. package/build/cjs/tracing/anthropic-ai/streaming.js.map +1 -1
  44. package/build/cjs/tracing/anthropic-ai/utils.js +2 -2
  45. package/build/cjs/tracing/anthropic-ai/utils.js.map +1 -1
  46. package/build/cjs/tracing/google-genai/index.js +3 -3
  47. package/build/cjs/tracing/google-genai/index.js.map +1 -1
  48. package/build/cjs/tracing/google-genai/streaming.js +2 -2
  49. package/build/cjs/tracing/google-genai/streaming.js.map +1 -1
  50. package/build/cjs/tracing/langchain/index.js +4 -4
  51. package/build/cjs/tracing/langchain/index.js.map +1 -1
  52. package/build/cjs/tracing/langgraph/index.js +3 -3
  53. package/build/cjs/tracing/langgraph/index.js.map +1 -1
  54. package/build/cjs/tracing/openai/index.js +136 -53
  55. package/build/cjs/tracing/openai/index.js.map +1 -1
  56. package/build/cjs/tracing/openai/streaming.js +2 -2
  57. package/build/cjs/tracing/openai/streaming.js.map +1 -1
  58. package/build/cjs/tracing/sentrySpan.js +32 -0
  59. package/build/cjs/tracing/sentrySpan.js.map +1 -1
  60. package/build/cjs/tracing/trace.js +1 -0
  61. package/build/cjs/tracing/trace.js.map +1 -1
  62. package/build/cjs/tracing/vercel-ai/constants.js +4 -0
  63. package/build/cjs/tracing/vercel-ai/constants.js.map +1 -1
  64. package/build/cjs/tracing/vercel-ai/index.js +14 -0
  65. package/build/cjs/tracing/vercel-ai/index.js.map +1 -1
  66. package/build/cjs/tracing/vercel-ai/utils.js +71 -22
  67. package/build/cjs/tracing/vercel-ai/utils.js.map +1 -1
  68. package/build/cjs/transports/base.js +18 -2
  69. package/build/cjs/transports/base.js.map +1 -1
  70. package/build/cjs/transports/offline.js +16 -17
  71. package/build/cjs/transports/offline.js.map +1 -1
  72. package/build/cjs/trpc.js +3 -3
  73. package/build/cjs/trpc.js.map +1 -1
  74. package/build/cjs/utils/aggregate-errors.js +13 -5
  75. package/build/cjs/utils/aggregate-errors.js.map +1 -1
  76. package/build/cjs/utils/beforeSendSpan.js +36 -0
  77. package/build/cjs/utils/beforeSendSpan.js.map +1 -0
  78. package/build/cjs/utils/envToBool.js +32 -0
  79. package/build/cjs/utils/envToBool.js.map +1 -0
  80. package/build/cjs/utils/exports.js +7 -7
  81. package/build/cjs/utils/exports.js.map +1 -1
  82. package/build/cjs/utils/featureFlags.js +1 -0
  83. package/build/cjs/utils/featureFlags.js.map +1 -1
  84. package/build/cjs/utils/flushIfServerless.js +2 -2
  85. package/build/cjs/utils/flushIfServerless.js.map +1 -1
  86. package/build/cjs/utils/hasSpanStreamingEnabled.js +21 -0
  87. package/build/cjs/utils/hasSpanStreamingEnabled.js.map +1 -0
  88. package/build/cjs/utils/prepareEvent.js +6 -1
  89. package/build/cjs/utils/prepareEvent.js.map +1 -1
  90. package/build/cjs/utils/promisebuffer.js +5 -3
  91. package/build/cjs/utils/promisebuffer.js.map +1 -1
  92. package/build/cjs/utils/scopeData.js +4 -0
  93. package/build/cjs/utils/scopeData.js.map +1 -1
  94. package/build/cjs/utils/sdkMetadata.js +7 -11
  95. package/build/cjs/utils/sdkMetadata.js.map +1 -1
  96. package/build/cjs/utils/should-ignore-span.js +31 -9
  97. package/build/cjs/utils/should-ignore-span.js.map +1 -1
  98. package/build/cjs/utils/spanUtils.js +90 -2
  99. package/build/cjs/utils/spanUtils.js.map +1 -1
  100. package/build/cjs/utils/timer.js +20 -0
  101. package/build/cjs/utils/timer.js.map +1 -0
  102. package/build/cjs/utils/traceData.js +2 -2
  103. package/build/cjs/utils/traceData.js.map +1 -1
  104. package/build/cjs/utils/tracePropagationTargets.js +38 -0
  105. package/build/cjs/utils/tracePropagationTargets.js.map +1 -0
  106. package/build/cjs/utils/version.js +1 -1
  107. package/build/cjs/utils/version.js.map +1 -1
  108. package/build/esm/attributes.js.map +1 -1
  109. package/build/esm/client.js +18 -8
  110. package/build/esm/client.js.map +1 -1
  111. package/build/esm/envelope.js +41 -8
  112. package/build/esm/envelope.js.map +1 -1
  113. package/build/esm/exports.js +2 -2
  114. package/build/esm/feedback.js +1 -1
  115. package/build/esm/index.js +12 -3
  116. package/build/esm/index.js.map +1 -1
  117. package/build/esm/integration.js +12 -1
  118. package/build/esm/integration.js.map +1 -1
  119. package/build/esm/integrations/eventFilters.js +1 -1
  120. package/build/esm/integrations/eventFilters.js.map +1 -1
  121. package/build/esm/integrations/mcp-server/correlation.js +54 -10
  122. package/build/esm/integrations/mcp-server/correlation.js.map +1 -1
  123. package/build/esm/integrations/mcp-server/sessionManagement.js +50 -16
  124. package/build/esm/integrations/mcp-server/sessionManagement.js.map +1 -1
  125. package/build/esm/integrations/moduleMetadata.js +1 -1
  126. package/build/esm/integrations/requestdata.js +72 -6
  127. package/build/esm/integrations/requestdata.js.map +1 -1
  128. package/build/esm/integrations/spanStreaming.js +52 -0
  129. package/build/esm/integrations/spanStreaming.js.map +1 -0
  130. package/build/esm/integrations/third-party-errors-filter.js +1 -1
  131. package/build/esm/logs/internal.js +1 -1
  132. package/build/esm/metrics/public-api.js +3 -3
  133. package/build/esm/metrics/public-api.js.map +1 -1
  134. package/build/esm/package.json +1 -1
  135. package/build/esm/scope.js +1 -1
  136. package/build/esm/scope.js.map +1 -1
  137. package/build/esm/semanticAttributes.js +57 -1
  138. package/build/esm/semanticAttributes.js.map +1 -1
  139. package/build/esm/spans/captureSpan.js +102 -0
  140. package/build/esm/spans/captureSpan.js.map +1 -0
  141. package/build/esm/spans/spanBuffer.js +119 -0
  142. package/build/esm/spans/spanBuffer.js.map +1 -0
  143. package/build/esm/spans/spanFirstUtils.js +182 -0
  144. package/build/esm/spans/spanFirstUtils.js.map +1 -0
  145. package/build/esm/tracing/ai/gen-ai-attributes.js +6 -1
  146. package/build/esm/tracing/ai/gen-ai-attributes.js.map +1 -1
  147. package/build/esm/tracing/measurement.js +1 -1
  148. package/build/esm/tracing/openai/index.js +134 -51
  149. package/build/esm/tracing/openai/index.js.map +1 -1
  150. package/build/esm/tracing/sentrySpan.js +33 -1
  151. package/build/esm/tracing/sentrySpan.js.map +1 -1
  152. package/build/esm/tracing/trace.js +4 -3
  153. package/build/esm/tracing/trace.js.map +1 -1
  154. package/build/esm/tracing/vercel-ai/constants.js +4 -1
  155. package/build/esm/tracing/vercel-ai/constants.js.map +1 -1
  156. package/build/esm/tracing/vercel-ai/index.js +15 -1
  157. package/build/esm/tracing/vercel-ai/index.js.map +1 -1
  158. package/build/esm/tracing/vercel-ai/utils.js +73 -24
  159. package/build/esm/tracing/vercel-ai/utils.js.map +1 -1
  160. package/build/esm/transports/base.js +18 -2
  161. package/build/esm/transports/base.js.map +1 -1
  162. package/build/esm/transports/offline.js +16 -17
  163. package/build/esm/transports/offline.js.map +1 -1
  164. package/build/esm/utils/aggregate-errors.js +13 -5
  165. package/build/esm/utils/aggregate-errors.js.map +1 -1
  166. package/build/esm/utils/beforeSendSpan.js +33 -0
  167. package/build/esm/utils/beforeSendSpan.js.map +1 -0
  168. package/build/esm/utils/envToBool.js +28 -0
  169. package/build/esm/utils/envToBool.js.map +1 -0
  170. package/build/esm/utils/exports.js +7 -7
  171. package/build/esm/utils/exports.js.map +1 -1
  172. package/build/esm/utils/featureFlags.js +1 -0
  173. package/build/esm/utils/featureFlags.js.map +1 -1
  174. package/build/esm/utils/flushIfServerless.js.map +1 -1
  175. package/build/esm/utils/hasSpanStreamingEnabled.js +19 -0
  176. package/build/esm/utils/hasSpanStreamingEnabled.js.map +1 -0
  177. package/build/esm/utils/prepareEvent.js +6 -1
  178. package/build/esm/utils/prepareEvent.js.map +1 -1
  179. package/build/esm/utils/promisebuffer.js +5 -3
  180. package/build/esm/utils/promisebuffer.js.map +1 -1
  181. package/build/esm/utils/scopeData.js +4 -0
  182. package/build/esm/utils/scopeData.js.map +1 -1
  183. package/build/esm/utils/sdkMetadata.js +7 -11
  184. package/build/esm/utils/sdkMetadata.js.map +1 -1
  185. package/build/esm/utils/should-ignore-span.js +31 -9
  186. package/build/esm/utils/should-ignore-span.js.map +1 -1
  187. package/build/esm/utils/spanUtils.js +87 -3
  188. package/build/esm/utils/spanUtils.js.map +1 -1
  189. package/build/esm/utils/timer.js +18 -0
  190. package/build/esm/utils/timer.js.map +1 -0
  191. package/build/esm/utils/tracePropagationTargets.js +36 -0
  192. package/build/esm/utils/tracePropagationTargets.js.map +1 -0
  193. package/build/esm/utils/version.js +1 -1
  194. package/build/esm/utils/version.js.map +1 -1
  195. package/build/types/attributes.d.ts +1 -1
  196. package/build/types/attributes.d.ts.map +1 -1
  197. package/build/types/client.d.ts +40 -2
  198. package/build/types/client.d.ts.map +1 -1
  199. package/build/types/envelope.d.ts +6 -1
  200. package/build/types/envelope.d.ts.map +1 -1
  201. package/build/types/index.d.ts +13 -4
  202. package/build/types/index.d.ts.map +1 -1
  203. package/build/types/integration.d.ts +4 -0
  204. package/build/types/integration.d.ts.map +1 -1
  205. package/build/types/integrations/mcp-server/correlation.d.ts +6 -2
  206. package/build/types/integrations/mcp-server/correlation.d.ts.map +1 -1
  207. package/build/types/integrations/mcp-server/sessionManagement.d.ts +8 -2
  208. package/build/types/integrations/mcp-server/sessionManagement.d.ts.map +1 -1
  209. package/build/types/integrations/requestdata.d.ts.map +1 -1
  210. package/build/types/integrations/spanStreaming.d.ts +11 -0
  211. package/build/types/integrations/spanStreaming.d.ts.map +1 -0
  212. package/build/types/metrics/public-api.d.ts +3 -3
  213. package/build/types/semanticAttributes.d.ts +38 -0
  214. package/build/types/semanticAttributes.d.ts.map +1 -1
  215. package/build/types/spans/captureSpan.d.ts +10 -0
  216. package/build/types/spans/captureSpan.d.ts.map +1 -0
  217. package/build/types/spans/spanBuffer.d.ts +35 -0
  218. package/build/types/spans/spanBuffer.d.ts.map +1 -0
  219. package/build/types/spans/spanFirstUtils.d.ts +20 -0
  220. package/build/types/spans/spanFirstUtils.d.ts.map +1 -0
  221. package/build/types/tracing/ai/gen-ai-attributes.d.ts +4 -0
  222. package/build/types/tracing/ai/gen-ai-attributes.d.ts.map +1 -1
  223. package/build/types/tracing/openai/index.d.ts.map +1 -1
  224. package/build/types/tracing/sentrySpan.d.ts +10 -1
  225. package/build/types/tracing/sentrySpan.d.ts.map +1 -1
  226. package/build/types/tracing/vercel-ai/constants.d.ts +1 -0
  227. package/build/types/tracing/vercel-ai/constants.d.ts.map +1 -1
  228. package/build/types/tracing/vercel-ai/index.d.ts.map +1 -1
  229. package/build/types/tracing/vercel-ai/utils.d.ts +2 -2
  230. package/build/types/tracing/vercel-ai/utils.d.ts.map +1 -1
  231. package/build/types/transports/base.d.ts.map +1 -1
  232. package/build/types/transports/offline.d.ts.map +1 -1
  233. package/build/types/types-hoist/attributes.d.ts +19 -0
  234. package/build/types/types-hoist/attributes.d.ts.map +1 -0
  235. package/build/types/types-hoist/envelope.d.ts +22 -2
  236. package/build/types/types-hoist/envelope.d.ts.map +1 -1
  237. package/build/types/types-hoist/feedback/index.d.ts.map +1 -1
  238. package/build/types/types-hoist/integration.d.ts +7 -0
  239. package/build/types/types-hoist/integration.d.ts.map +1 -1
  240. package/build/types/types-hoist/link.d.ts +2 -2
  241. package/build/types/types-hoist/link.d.ts.map +1 -1
  242. package/build/types/types-hoist/options.d.ts +18 -2
  243. package/build/types/types-hoist/options.d.ts.map +1 -1
  244. package/build/types/types-hoist/span.d.ts +27 -0
  245. package/build/types/types-hoist/span.d.ts.map +1 -1
  246. package/build/types/utils/beforeSendSpan.d.ts +22 -0
  247. package/build/types/utils/beforeSendSpan.d.ts.map +1 -0
  248. package/build/types/utils/envToBool.d.ts +13 -0
  249. package/build/types/utils/envToBool.d.ts.map +1 -0
  250. package/build/types/utils/featureFlags.d.ts.map +1 -1
  251. package/build/types/utils/flushIfServerless.d.ts.map +1 -1
  252. package/build/types/utils/hasSpanStreamingEnabled.d.ts +9 -0
  253. package/build/types/utils/hasSpanStreamingEnabled.d.ts.map +1 -0
  254. package/build/types/utils/prepareEvent.d.ts.map +1 -1
  255. package/build/types/utils/promisebuffer.d.ts.map +1 -1
  256. package/build/types/utils/scopeData.d.ts.map +1 -1
  257. package/build/types/utils/sdkMetadata.d.ts.map +1 -1
  258. package/build/types/utils/should-ignore-span.d.ts +3 -3
  259. package/build/types/utils/should-ignore-span.d.ts.map +1 -1
  260. package/build/types/utils/spanUtils.d.ts +22 -2
  261. package/build/types/utils/spanUtils.d.ts.map +1 -1
  262. package/build/types/utils/timer.d.ts +11 -0
  263. package/build/types/utils/timer.d.ts.map +1 -0
  264. package/build/types/utils/tracePropagationTargets.d.ts +9 -0
  265. package/build/types/utils/tracePropagationTargets.d.ts.map +1 -0
  266. package/build/types-ts3.8/attributes.d.ts +1 -1
  267. package/build/types-ts3.8/client.d.ts +40 -2
  268. package/build/types-ts3.8/envelope.d.ts +6 -1
  269. package/build/types-ts3.8/index.d.ts +13 -4
  270. package/build/types-ts3.8/integration.d.ts +4 -0
  271. package/build/types-ts3.8/integrations/mcp-server/correlation.d.ts +6 -2
  272. package/build/types-ts3.8/integrations/mcp-server/sessionManagement.d.ts +8 -2
  273. package/build/types-ts3.8/integrations/spanStreaming.d.ts +11 -0
  274. package/build/types-ts3.8/metrics/public-api.d.ts +3 -3
  275. package/build/types-ts3.8/semanticAttributes.d.ts +38 -0
  276. package/build/types-ts3.8/spans/captureSpan.d.ts +10 -0
  277. package/build/types-ts3.8/spans/spanBuffer.d.ts +35 -0
  278. package/build/types-ts3.8/spans/spanFirstUtils.d.ts +20 -0
  279. package/build/types-ts3.8/tracing/ai/gen-ai-attributes.d.ts +4 -0
  280. package/build/types-ts3.8/tracing/sentrySpan.d.ts +10 -1
  281. package/build/types-ts3.8/tracing/vercel-ai/constants.d.ts +1 -0
  282. package/build/types-ts3.8/tracing/vercel-ai/utils.d.ts +2 -2
  283. package/build/types-ts3.8/types-hoist/attributes.d.ts +19 -0
  284. package/build/types-ts3.8/types-hoist/envelope.d.ts +22 -2
  285. package/build/types-ts3.8/types-hoist/integration.d.ts +7 -0
  286. package/build/types-ts3.8/types-hoist/link.d.ts +2 -2
  287. package/build/types-ts3.8/types-hoist/options.d.ts +18 -2
  288. package/build/types-ts3.8/types-hoist/span.d.ts +27 -0
  289. package/build/types-ts3.8/utils/beforeSendSpan.d.ts +22 -0
  290. package/build/types-ts3.8/utils/envToBool.d.ts +13 -0
  291. package/build/types-ts3.8/utils/hasSpanStreamingEnabled.d.ts +9 -0
  292. package/build/types-ts3.8/utils/should-ignore-span.d.ts +3 -3
  293. package/build/types-ts3.8/utils/spanUtils.d.ts +22 -2
  294. package/build/types-ts3.8/utils/timer.d.ts +11 -0
  295. package/build/types-ts3.8/utils/tracePropagationTargets.d.ts +9 -0
  296. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"promisebuffer.js","sources":["../../../src/utils/promisebuffer.ts"],"sourcesContent":["import { rejectedSyncPromise, resolvedSyncPromise } from './syncpromise';\n\nexport interface PromiseBuffer<T> {\n // exposes the internal array so tests can assert on the state of it.\n // XXX: this really should not be public api.\n $: PromiseLike<T>[];\n add(taskProducer: () => PromiseLike<T>): PromiseLike<T>;\n drain(timeout?: number): PromiseLike<boolean>;\n}\n\nexport const SENTRY_BUFFER_FULL_ERROR = Symbol.for('SentryBufferFullError');\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer<T>(limit: number = 100): PromiseBuffer<T> {\n const buffer: Set<PromiseLike<T>> = new Set();\n\n function isReady(): boolean {\n return buffer.size < limit;\n }\n\n /**\n * Remove a promise from the queue.\n *\n * @param task Can be any PromiseLike<T>\n * @returns Removed promise.\n */\n function remove(task: PromiseLike<T>): void {\n buffer.delete(task);\n }\n\n /**\n * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n *\n * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n * PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n * limit check.\n * @returns The original promise.\n */\n function add(taskProducer: () => PromiseLike<T>): PromiseLike<T> {\n if (!isReady()) {\n return rejectedSyncPromise(SENTRY_BUFFER_FULL_ERROR);\n }\n\n // start the task and add its promise to the queue\n const task = taskProducer();\n buffer.add(task);\n void task.then(\n () => remove(task),\n () => remove(task),\n );\n return task;\n }\n\n /**\n * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n * `false` otherwise\n */\n function drain(timeout?: number): PromiseLike<boolean> {\n if (!buffer.size) {\n return resolvedSyncPromise(true);\n }\n\n // We want to resolve even if one of the promises rejects\n const drainPromise = Promise.allSettled(Array.from(buffer)).then(() => true);\n\n if (!timeout) {\n return drainPromise;\n }\n\n const promises = [drainPromise, new Promise<boolean>(resolve => setTimeout(() => resolve(false), timeout))];\n\n // Promise.race will resolve to the first promise that resolves or rejects\n // So if the drainPromise resolves, the timeout promise will be ignored\n return Promise.race(promises);\n }\n\n return {\n get $(): PromiseLike<T>[] {\n return Array.from(buffer);\n },\n add,\n drain,\n };\n}\n"],"names":[],"mappings":";;AAUO,MAAM,2BAA2B,MAAM,CAAC,GAAG,CAAC,uBAAuB;;AAE1E;AACA;AACA;AACA;AACO,SAAS,iBAAiB,CAAI,KAAK,GAAW,GAAG,EAAoB;AAC5E,EAAE,MAAM,MAAM,GAAwB,IAAI,GAAG,EAAE;;AAE/C,EAAE,SAAS,OAAO,GAAY;AAC9B,IAAI,OAAO,MAAM,CAAC,IAAA,GAAO,KAAK;AAC9B,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,MAAM,CAAC,IAAI,EAAwB;AAC9C,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AACvB,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,GAAG,CAAC,YAAY,EAAwC;AACnE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AACpB,MAAM,OAAO,mBAAmB,CAAC,wBAAwB,CAAC;AAC1D,IAAI;;AAEJ;AACA,IAAI,MAAM,IAAA,GAAO,YAAY,EAAE;AAC/B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,IAAI,KAAK,IAAI,CAAC,IAAI;AAClB,MAAM,MAAM,MAAM,CAAC,IAAI,CAAC;AACxB,MAAM,MAAM,MAAM,CAAC,IAAI,CAAC;AACxB,KAAK;AACL,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,KAAK,CAAC,OAAO,EAAiC;AACzD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACtB,MAAM,OAAO,mBAAmB,CAAC,IAAI,CAAC;AACtC,IAAI;;AAEJ;AACA,IAAI,MAAM,eAAe,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;;AAEhF,IAAI,IAAI,CAAC,OAAO,EAAE;AAClB,MAAM,OAAO,YAAY;AACzB,IAAI;;AAEJ,IAAI,MAAM,QAAA,GAAW,CAAC,YAAY,EAAE,IAAI,OAAO,CAAU,OAAA,IAAW,UAAU,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;;AAE/G;AACA;AACA,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AACjC,EAAE;;AAEF,EAAE,OAAO;AACT,IAAI,IAAI,CAAC,GAAqB;AAC9B,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/B,IAAI,CAAC;AACL,IAAI,GAAG;AACP,IAAI,KAAK;AACT,GAAG;AACH;;;;"}
1
+ {"version":3,"file":"promisebuffer.js","sources":["../../../src/utils/promisebuffer.ts"],"sourcesContent":["import { rejectedSyncPromise, resolvedSyncPromise } from './syncpromise';\nimport { safeUnref } from './timer';\n\nexport interface PromiseBuffer<T> {\n // exposes the internal array so tests can assert on the state of it.\n // XXX: this really should not be public api.\n $: PromiseLike<T>[];\n add(taskProducer: () => PromiseLike<T>): PromiseLike<T>;\n drain(timeout?: number): PromiseLike<boolean>;\n}\n\nexport const SENTRY_BUFFER_FULL_ERROR = Symbol.for('SentryBufferFullError');\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer<T>(limit: number = 100): PromiseBuffer<T> {\n const buffer: Set<PromiseLike<T>> = new Set();\n\n function isReady(): boolean {\n return buffer.size < limit;\n }\n\n /**\n * Remove a promise from the queue.\n *\n * @param task Can be any PromiseLike<T>\n * @returns Removed promise.\n */\n function remove(task: PromiseLike<T>): void {\n buffer.delete(task);\n }\n\n /**\n * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n *\n * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n * PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n * functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n * requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n * limit check.\n * @returns The original promise.\n */\n function add(taskProducer: () => PromiseLike<T>): PromiseLike<T> {\n if (!isReady()) {\n return rejectedSyncPromise(SENTRY_BUFFER_FULL_ERROR);\n }\n\n // start the task and add its promise to the queue\n const task = taskProducer();\n buffer.add(task);\n void task.then(\n () => remove(task),\n () => remove(task),\n );\n return task;\n }\n\n /**\n * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n *\n * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n * `true`.\n * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n * `false` otherwise\n */\n function drain(timeout?: number): PromiseLike<boolean> {\n if (!buffer.size) {\n return resolvedSyncPromise(true);\n }\n\n // We want to resolve even if one of the promises rejects\n const drainPromise = Promise.allSettled(Array.from(buffer)).then(() => true);\n\n if (!timeout) {\n return drainPromise;\n }\n\n const promises = [\n drainPromise,\n new Promise<boolean>(resolve => safeUnref(setTimeout(() => resolve(false), timeout))),\n ];\n\n return Promise.race(promises);\n }\n\n return {\n get $(): PromiseLike<T>[] {\n return Array.from(buffer);\n },\n add,\n drain,\n };\n}\n"],"names":[],"mappings":";;;AAWO,MAAM,2BAA2B,MAAM,CAAC,GAAG,CAAC,uBAAuB;;AAE1E;AACA;AACA;AACA;AACO,SAAS,iBAAiB,CAAI,KAAK,GAAW,GAAG,EAAoB;AAC5E,EAAE,MAAM,MAAM,GAAwB,IAAI,GAAG,EAAE;;AAE/C,EAAE,SAAS,OAAO,GAAY;AAC9B,IAAI,OAAO,MAAM,CAAC,IAAA,GAAO,KAAK;AAC9B,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,MAAM,CAAC,IAAI,EAAwB;AAC9C,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;AACvB,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,GAAG,CAAC,YAAY,EAAwC;AACnE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AACpB,MAAM,OAAO,mBAAmB,CAAC,wBAAwB,CAAC;AAC1D,IAAI;;AAEJ;AACA,IAAI,MAAM,IAAA,GAAO,YAAY,EAAE;AAC/B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,IAAI,KAAK,IAAI,CAAC,IAAI;AAClB,MAAM,MAAM,MAAM,CAAC,IAAI,CAAC;AACxB,MAAM,MAAM,MAAM,CAAC,IAAI,CAAC;AACxB,KAAK;AACL,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,SAAS,KAAK,CAAC,OAAO,EAAiC;AACzD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACtB,MAAM,OAAO,mBAAmB,CAAC,IAAI,CAAC;AACtC,IAAI;;AAEJ;AACA,IAAI,MAAM,eAAe,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;;AAEhF,IAAI,IAAI,CAAC,OAAO,EAAE;AAClB,MAAM,OAAO,YAAY;AACzB,IAAI;;AAEJ,IAAI,MAAM,WAAW;AACrB,MAAM,YAAY;AAClB,MAAM,IAAI,OAAO,CAAU,OAAA,IAAW,SAAS,CAAC,UAAU,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3F,KAAK;;AAEL,IAAI,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AACjC,EAAE;;AAEF,EAAE,OAAO;AACT,IAAI,IAAI,CAAC,GAAqB;AAC9B,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/B,IAAI,CAAC;AACL,IAAI,GAAG;AACP,IAAI,KAAK;AACT,GAAG;AACH;;;;"}
@@ -79,6 +79,10 @@ function mergeScopeData(data, mergeData) {
79
79
  data.attachments = [...data.attachments, ...attachments];
80
80
  }
81
81
 
82
+ if (attributes) {
83
+ data.attributes = { ...data.attributes, ...attributes };
84
+ }
85
+
82
86
  data.propagationContext = { ...data.propagationContext, ...propagationContext };
83
87
  }
84
88
 
@@ -1 +1 @@
1
- {"version":3,"file":"scopeData.js","sources":["../../../src/utils/scopeData.ts"],"sourcesContent":["import { getGlobalScope } from '../currentScopes';\nimport type { Scope, ScopeData } from '../scope';\nimport { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext';\nimport type { Breadcrumb } from '../types-hoist/breadcrumb';\nimport type { Event } from '../types-hoist/event';\nimport type { Span } from '../types-hoist/span';\nimport { merge } from './merge';\nimport { getRootSpan, spanToJSON, spanToTraceContext } from './spanUtils';\n\n/**\n * Applies data from the scope to the event and runs all event processors on it.\n */\nexport function applyScopeDataToEvent(event: Event, data: ScopeData): void {\n const { fingerprint, span, breadcrumbs, sdkProcessingMetadata } = data;\n\n // Apply general data\n applyDataToEvent(event, data);\n\n // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relies on that.\n if (span) {\n applySpanToEvent(event, span);\n }\n\n applyFingerprintToEvent(event, fingerprint);\n applyBreadcrumbsToEvent(event, breadcrumbs);\n applySdkMetadataToEvent(event, sdkProcessingMetadata);\n}\n\n/** Merge data of two scopes together. */\nexport function mergeScopeData(data: ScopeData, mergeData: ScopeData): void {\n const {\n extra,\n tags,\n attributes,\n user,\n contexts,\n level,\n sdkProcessingMetadata,\n breadcrumbs,\n fingerprint,\n eventProcessors,\n attachments,\n propagationContext,\n transactionName,\n span,\n } = mergeData;\n\n mergeAndOverwriteScopeData(data, 'extra', extra);\n mergeAndOverwriteScopeData(data, 'tags', tags);\n mergeAndOverwriteScopeData(data, 'attributes', attributes);\n mergeAndOverwriteScopeData(data, 'user', user);\n mergeAndOverwriteScopeData(data, 'contexts', contexts);\n\n data.sdkProcessingMetadata = merge(data.sdkProcessingMetadata, sdkProcessingMetadata, 2);\n\n if (level) {\n data.level = level;\n }\n\n if (transactionName) {\n data.transactionName = transactionName;\n }\n\n if (span) {\n data.span = span;\n }\n\n if (breadcrumbs.length) {\n data.breadcrumbs = [...data.breadcrumbs, ...breadcrumbs];\n }\n\n if (fingerprint.length) {\n data.fingerprint = [...data.fingerprint, ...fingerprint];\n }\n\n if (eventProcessors.length) {\n data.eventProcessors = [...data.eventProcessors, ...eventProcessors];\n }\n\n if (attachments.length) {\n data.attachments = [...data.attachments, ...attachments];\n }\n\n data.propagationContext = { ...data.propagationContext, ...propagationContext };\n}\n\n/**\n * Merges certain scope data. Undefined values will overwrite any existing values.\n * Exported only for tests.\n */\nexport function mergeAndOverwriteScopeData<\n Prop extends 'extra' | 'tags' | 'attributes' | 'user' | 'contexts' | 'sdkProcessingMetadata',\n Data extends ScopeData,\n>(data: Data, prop: Prop, mergeVal: Data[Prop]): void {\n data[prop] = merge(data[prop], mergeVal, 1);\n}\n\n/** Exported only for tests */\nexport function mergeArray<Prop extends 'breadcrumbs' | 'fingerprint'>(\n event: Event,\n prop: Prop,\n mergeVal: ScopeData[Prop],\n): void {\n const prevVal = event[prop];\n // If we are not merging any new values,\n // we only need to proceed if there was an empty array before (as we want to replace it with undefined)\n if (!mergeVal.length && (!prevVal || prevVal.length)) {\n return;\n }\n\n const merged = [...(prevVal || []), ...mergeVal] as ScopeData[Prop];\n event[prop] = merged.length ? merged : undefined;\n}\n\n/**\n * Get the scope data for the current scope after merging with the\n * global scope and isolation scope.\n *\n * @param currentScope - The current scope.\n * @returns The scope data.\n */\nexport function getCombinedScopeData(isolationScope: Scope | undefined, currentScope: Scope | undefined): ScopeData {\n const scopeData = getGlobalScope().getScopeData();\n isolationScope && mergeScopeData(scopeData, isolationScope.getScopeData());\n currentScope && mergeScopeData(scopeData, currentScope.getScopeData());\n return scopeData;\n}\n\nfunction applyDataToEvent(event: Event, data: ScopeData): void {\n const { extra, tags, user, contexts, level, transactionName } = data;\n\n if (Object.keys(extra).length) {\n event.extra = { ...extra, ...event.extra };\n }\n\n if (Object.keys(tags).length) {\n event.tags = { ...tags, ...event.tags };\n }\n\n if (Object.keys(user).length) {\n event.user = { ...user, ...event.user };\n }\n\n if (Object.keys(contexts).length) {\n event.contexts = { ...contexts, ...event.contexts };\n }\n\n if (level) {\n event.level = level;\n }\n\n // transaction events get their `transaction` from the root span name\n if (transactionName && event.type !== 'transaction') {\n event.transaction = transactionName;\n }\n}\n\nfunction applyBreadcrumbsToEvent(event: Event, breadcrumbs: Breadcrumb[]): void {\n const mergedBreadcrumbs = [...(event.breadcrumbs || []), ...breadcrumbs];\n event.breadcrumbs = mergedBreadcrumbs.length ? mergedBreadcrumbs : undefined;\n}\n\nfunction applySdkMetadataToEvent(event: Event, sdkProcessingMetadata: ScopeData['sdkProcessingMetadata']): void {\n event.sdkProcessingMetadata = {\n ...event.sdkProcessingMetadata,\n ...sdkProcessingMetadata,\n };\n}\n\nfunction applySpanToEvent(event: Event, span: Span): void {\n event.contexts = {\n trace: spanToTraceContext(span),\n ...event.contexts,\n };\n\n event.sdkProcessingMetadata = {\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(span),\n ...event.sdkProcessingMetadata,\n };\n\n const rootSpan = getRootSpan(span);\n const transactionName = spanToJSON(rootSpan).description;\n if (transactionName && !event.transaction && event.type === 'transaction') {\n event.transaction = transactionName;\n }\n}\n\n/**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\nfunction applyFingerprintToEvent(event: Event, fingerprint: ScopeData['fingerprint'] | undefined): void {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint\n ? Array.isArray(event.fingerprint)\n ? event.fingerprint\n : [event.fingerprint]\n : [];\n\n // If we have something on the scope, then merge it with event\n if (fingerprint) {\n event.fingerprint = event.fingerprint.concat(fingerprint);\n }\n\n // If we have no data at all, remove empty array default\n if (!event.fingerprint.length) {\n delete event.fingerprint;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scopeData.js","sources":["../../../src/utils/scopeData.ts"],"sourcesContent":["import { getGlobalScope } from '../currentScopes';\nimport type { Scope, ScopeData } from '../scope';\nimport { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext';\nimport type { Breadcrumb } from '../types-hoist/breadcrumb';\nimport type { Event } from '../types-hoist/event';\nimport type { Span } from '../types-hoist/span';\nimport { merge } from './merge';\nimport { getRootSpan, spanToJSON, spanToTraceContext } from './spanUtils';\n\n/**\n * Applies data from the scope to the event and runs all event processors on it.\n */\nexport function applyScopeDataToEvent(event: Event, data: ScopeData): void {\n const { fingerprint, span, breadcrumbs, sdkProcessingMetadata } = data;\n\n // Apply general data\n applyDataToEvent(event, data);\n\n // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relies on that.\n if (span) {\n applySpanToEvent(event, span);\n }\n\n applyFingerprintToEvent(event, fingerprint);\n applyBreadcrumbsToEvent(event, breadcrumbs);\n applySdkMetadataToEvent(event, sdkProcessingMetadata);\n}\n\n/** Merge data of two scopes together. */\nexport function mergeScopeData(data: ScopeData, mergeData: ScopeData): void {\n const {\n extra,\n tags,\n attributes,\n user,\n contexts,\n level,\n sdkProcessingMetadata,\n breadcrumbs,\n fingerprint,\n eventProcessors,\n attachments,\n propagationContext,\n transactionName,\n span,\n } = mergeData;\n\n mergeAndOverwriteScopeData(data, 'extra', extra);\n mergeAndOverwriteScopeData(data, 'tags', tags);\n mergeAndOverwriteScopeData(data, 'attributes', attributes);\n mergeAndOverwriteScopeData(data, 'user', user);\n mergeAndOverwriteScopeData(data, 'contexts', contexts);\n\n data.sdkProcessingMetadata = merge(data.sdkProcessingMetadata, sdkProcessingMetadata, 2);\n\n if (level) {\n data.level = level;\n }\n\n if (transactionName) {\n data.transactionName = transactionName;\n }\n\n if (span) {\n data.span = span;\n }\n\n if (breadcrumbs.length) {\n data.breadcrumbs = [...data.breadcrumbs, ...breadcrumbs];\n }\n\n if (fingerprint.length) {\n data.fingerprint = [...data.fingerprint, ...fingerprint];\n }\n\n if (eventProcessors.length) {\n data.eventProcessors = [...data.eventProcessors, ...eventProcessors];\n }\n\n if (attachments.length) {\n data.attachments = [...data.attachments, ...attachments];\n }\n\n if (attributes) {\n data.attributes = { ...data.attributes, ...attributes };\n }\n\n data.propagationContext = { ...data.propagationContext, ...propagationContext };\n}\n\n/**\n * Merges certain scope data. Undefined values will overwrite any existing values.\n * Exported only for tests.\n */\nexport function mergeAndOverwriteScopeData<\n Prop extends 'extra' | 'tags' | 'attributes' | 'user' | 'contexts' | 'sdkProcessingMetadata',\n Data extends ScopeData,\n>(data: Data, prop: Prop, mergeVal: Data[Prop]): void {\n data[prop] = merge(data[prop], mergeVal, 1);\n}\n\n/** Exported only for tests */\nexport function mergeArray<Prop extends 'breadcrumbs' | 'fingerprint'>(\n event: Event,\n prop: Prop,\n mergeVal: ScopeData[Prop],\n): void {\n const prevVal = event[prop];\n // If we are not merging any new values,\n // we only need to proceed if there was an empty array before (as we want to replace it with undefined)\n if (!mergeVal.length && (!prevVal || prevVal.length)) {\n return;\n }\n\n const merged = [...(prevVal || []), ...mergeVal] as ScopeData[Prop];\n event[prop] = merged.length ? merged : undefined;\n}\n\n/**\n * Get the scope data for the current scope after merging with the\n * global scope and isolation scope.\n *\n * @param currentScope - The current scope.\n * @returns The scope data.\n */\nexport function getCombinedScopeData(isolationScope: Scope | undefined, currentScope: Scope | undefined): ScopeData {\n const scopeData = getGlobalScope().getScopeData();\n isolationScope && mergeScopeData(scopeData, isolationScope.getScopeData());\n currentScope && mergeScopeData(scopeData, currentScope.getScopeData());\n return scopeData;\n}\n\nfunction applyDataToEvent(event: Event, data: ScopeData): void {\n const { extra, tags, user, contexts, level, transactionName } = data;\n\n if (Object.keys(extra).length) {\n event.extra = { ...extra, ...event.extra };\n }\n\n if (Object.keys(tags).length) {\n event.tags = { ...tags, ...event.tags };\n }\n\n if (Object.keys(user).length) {\n event.user = { ...user, ...event.user };\n }\n\n if (Object.keys(contexts).length) {\n event.contexts = { ...contexts, ...event.contexts };\n }\n\n if (level) {\n event.level = level;\n }\n\n // transaction events get their `transaction` from the root span name\n if (transactionName && event.type !== 'transaction') {\n event.transaction = transactionName;\n }\n}\n\nfunction applyBreadcrumbsToEvent(event: Event, breadcrumbs: Breadcrumb[]): void {\n const mergedBreadcrumbs = [...(event.breadcrumbs || []), ...breadcrumbs];\n event.breadcrumbs = mergedBreadcrumbs.length ? mergedBreadcrumbs : undefined;\n}\n\nfunction applySdkMetadataToEvent(event: Event, sdkProcessingMetadata: ScopeData['sdkProcessingMetadata']): void {\n event.sdkProcessingMetadata = {\n ...event.sdkProcessingMetadata,\n ...sdkProcessingMetadata,\n };\n}\n\nfunction applySpanToEvent(event: Event, span: Span): void {\n event.contexts = {\n trace: spanToTraceContext(span),\n ...event.contexts,\n };\n\n event.sdkProcessingMetadata = {\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(span),\n ...event.sdkProcessingMetadata,\n };\n\n const rootSpan = getRootSpan(span);\n const transactionName = spanToJSON(rootSpan).description;\n if (transactionName && !event.transaction && event.type === 'transaction') {\n event.transaction = transactionName;\n }\n}\n\n/**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\nfunction applyFingerprintToEvent(event: Event, fingerprint: ScopeData['fingerprint'] | undefined): void {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint\n ? Array.isArray(event.fingerprint)\n ? event.fingerprint\n : [event.fingerprint]\n : [];\n\n // If we have something on the scope, then merge it with event\n if (fingerprint) {\n event.fingerprint = event.fingerprint.concat(fingerprint);\n }\n\n // If we have no data at all, remove empty array default\n if (!event.fingerprint.length) {\n delete event.fingerprint;\n }\n}\n"],"names":[],"mappings":";;;;;AASA;AACA;AACA;AACO,SAAS,qBAAqB,CAAC,KAAK,EAAS,IAAI,EAAmB;AAC3E,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,qBAAA,EAAsB,GAAI,IAAI;;AAExE;AACA,EAAE,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC;;AAE/B;AACA;AACA;AACA,EAAE,IAAI,IAAI,EAAE;AACZ,IAAI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC;AACjC,EAAE;;AAEF,EAAE,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC;AAC7C,EAAE,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC;AAC7C,EAAE,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,CAAC;AACvD;;AAEA;AACO,SAAS,cAAc,CAAC,IAAI,EAAa,SAAS,EAAmB;AAC5E,EAAE,MAAM;AACR,IAAI,KAAK;AACT,IAAI,IAAI;AACR,IAAI,UAAU;AACd,IAAI,IAAI;AACR,IAAI,QAAQ;AACZ,IAAI,KAAK;AACT,IAAI,qBAAqB;AACzB,IAAI,WAAW;AACf,IAAI,WAAW;AACf,IAAI,eAAe;AACnB,IAAI,WAAW;AACf,IAAI,kBAAkB;AACtB,IAAI,eAAe;AACnB,IAAI,IAAI;AACR,GAAE,GAAI,SAAS;;AAEf,EAAE,0BAA0B,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC;AAClD,EAAE,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC;AAChD,EAAE,0BAA0B,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC;AAC5D,EAAE,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC;AAChD,EAAE,0BAA0B,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;;AAExD,EAAE,IAAI,CAAC,qBAAA,GAAwB,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,CAAC,CAAC;;AAE1F,EAAE,IAAI,KAAK,EAAE;AACb,IAAI,IAAI,CAAC,KAAA,GAAQ,KAAK;AACtB,EAAE;;AAEF,EAAE,IAAI,eAAe,EAAE;AACvB,IAAI,IAAI,CAAC,eAAA,GAAkB,eAAe;AAC1C,EAAE;;AAEF,EAAE,IAAI,IAAI,EAAE;AACZ,IAAI,IAAI,CAAC,IAAA,GAAO,IAAI;AACpB,EAAE;;AAEF,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE;AAC1B,IAAI,IAAI,CAAC,WAAA,GAAc,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;AAC5D,EAAE;;AAEF,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE;AAC1B,IAAI,IAAI,CAAC,WAAA,GAAc,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;AAC5D,EAAE;;AAEF,EAAE,IAAI,eAAe,CAAC,MAAM,EAAE;AAC9B,IAAI,IAAI,CAAC,eAAA,GAAkB,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,eAAe,CAAC;AACxE,EAAE;;AAEF,EAAE,IAAI,WAAW,CAAC,MAAM,EAAE;AAC1B,IAAI,IAAI,CAAC,WAAA,GAAc,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC;AAC5D,EAAE;;AAEF,EAAE,IAAI,UAAU,EAAE;AAClB,IAAI,IAAI,CAAC,UAAA,GAAa,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,UAAA,EAAY;AAC3D,EAAE;;AAEF,EAAE,IAAI,CAAC,kBAAA,GAAqB,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,kBAAA,EAAoB;AACjF;;AAEA;AACA;AACA;AACA;AACO,SAAS;;AAGhB,CAAE,IAAI,EAAQ,IAAI,EAAQ,QAAQ,EAAoB;AACtD,EAAE,IAAI,CAAC,IAAI,CAAA,GAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC7C;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,oBAAoB,CAAC,cAAc,EAAqB,YAAY,EAAgC;AACpH,EAAE,MAAM,YAAY,cAAc,EAAE,CAAC,YAAY,EAAE;AACnD,EAAE,cAAA,IAAkB,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,YAAY,EAAE,CAAC;AAC5E,EAAE,YAAA,IAAgB,cAAc,CAAC,SAAS,EAAE,YAAY,CAAC,YAAY,EAAE,CAAC;AACxE,EAAE,OAAO,SAAS;AAClB;;AAEA,SAAS,gBAAgB,CAAC,KAAK,EAAS,IAAI,EAAmB;AAC/D,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAA,EAAgB,GAAI,IAAI;;AAEtE,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE;AACjC,IAAI,KAAK,CAAC,KAAA,GAAQ,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,KAAA,EAAO;AAC9C,EAAE;;AAEF,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;AAChC,IAAI,KAAK,CAAC,IAAA,GAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,IAAA,EAAM;AAC3C,EAAE;;AAEF,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;AAChC,IAAI,KAAK,CAAC,IAAA,GAAO,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,IAAA,EAAM;AAC3C,EAAE;;AAEF,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE;AACpC,IAAI,KAAK,CAAC,QAAA,GAAW,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC,QAAA,EAAU;AACvD,EAAE;;AAEF,EAAE,IAAI,KAAK,EAAE;AACb,IAAI,KAAK,CAAC,KAAA,GAAQ,KAAK;AACvB,EAAE;;AAEF;AACA,EAAE,IAAI,eAAA,IAAmB,KAAK,CAAC,IAAA,KAAS,aAAa,EAAE;AACvD,IAAI,KAAK,CAAC,WAAA,GAAc,eAAe;AACvC,EAAE;AACF;;AAEA,SAAS,uBAAuB,CAAC,KAAK,EAAS,WAAW,EAAsB;AAChF,EAAE,MAAM,iBAAA,GAAoB,CAAC,IAAI,KAAK,CAAC,WAAA,IAAe,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC;AAC1E,EAAE,KAAK,CAAC,WAAA,GAAc,iBAAiB,CAAC,MAAA,GAAS,iBAAA,GAAoB,SAAS;AAC9E;;AAEA,SAAS,uBAAuB,CAAC,KAAK,EAAS,qBAAqB,EAA4C;AAChH,EAAE,KAAK,CAAC,qBAAA,GAAwB;AAChC,IAAI,GAAG,KAAK,CAAC,qBAAqB;AAClC,IAAI,GAAG,qBAAqB;AAC5B,GAAG;AACH;;AAEA,SAAS,gBAAgB,CAAC,KAAK,EAAS,IAAI,EAAc;AAC1D,EAAE,KAAK,CAAC,QAAA,GAAW;AACnB,IAAI,KAAK,EAAE,kBAAkB,CAAC,IAAI,CAAC;AACnC,IAAI,GAAG,KAAK,CAAC,QAAQ;AACrB,GAAG;;AAEH,EAAE,KAAK,CAAC,qBAAA,GAAwB;AAChC,IAAI,sBAAsB,EAAE,iCAAiC,CAAC,IAAI,CAAC;AACnE,IAAI,GAAG,KAAK,CAAC,qBAAqB;AAClC,GAAG;;AAEH,EAAE,MAAM,QAAA,GAAW,WAAW,CAAC,IAAI,CAAC;AACpC,EAAE,MAAM,kBAAkB,UAAU,CAAC,QAAQ,CAAC,CAAC,WAAW;AAC1D,EAAE,IAAI,eAAA,IAAmB,CAAC,KAAK,CAAC,WAAA,IAAe,KAAK,CAAC,IAAA,KAAS,aAAa,EAAE;AAC7E,IAAI,KAAK,CAAC,WAAA,GAAc,eAAe;AACvC,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA,SAAS,uBAAuB,CAAC,KAAK,EAAS,WAAW,EAA8C;AACxG;AACA,EAAE,KAAK,CAAC,WAAA,GAAc,KAAK,CAAC;AAC5B,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW;AACrC,QAAQ,KAAK,CAAC;AACd,QAAQ,CAAC,KAAK,CAAC,WAAW;AAC1B,MAAM,EAAE;;AAER;AACA,EAAE,IAAI,WAAW,EAAE;AACnB,IAAI,KAAK,CAAC,WAAA,GAAc,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC;AAC7D,EAAE;;AAEF;AACA,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE;AACjC,IAAI,OAAO,KAAK,CAAC,WAAW;AAC5B,EAAE;AACF;;;;"}
@@ -14,20 +14,16 @@ import { SDK_VERSION } from './version.js';
14
14
  * @param names list of package names
15
15
  */
16
16
  function applySdkMetadata(options, name, names = [name], source = 'npm') {
17
- const metadata = options._metadata || {};
17
+ const sdk = ((options._metadata = options._metadata || {}).sdk = options._metadata.sdk || {});
18
18
 
19
- if (!metadata.sdk) {
20
- metadata.sdk = {
21
- name: `sentry.javascript.${name}`,
22
- packages: names.map(name => ({
23
- name: `${source}:@sentry/${name}`,
24
- version: SDK_VERSION,
25
- })),
19
+ if (!sdk.name) {
20
+ sdk.name = `sentry.javascript.${name}`;
21
+ sdk.packages = names.map(name => ({
22
+ name: `${source}:@sentry/${name}`,
26
23
  version: SDK_VERSION,
27
- };
24
+ }));
25
+ sdk.version = SDK_VERSION;
28
26
  }
29
-
30
- options._metadata = metadata;
31
27
  }
32
28
 
33
29
  export { applySdkMetadata };
@@ -1 +1 @@
1
- {"version":3,"file":"sdkMetadata.js","sources":["../../../src/utils/sdkMetadata.ts"],"sourcesContent":["import type { CoreOptions } from '../types-hoist/options';\nimport { SDK_VERSION } from '../utils/version';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nexport function applySdkMetadata(options: CoreOptions, name: string, names = [name], source = 'npm'): void {\n const metadata = options._metadata || {};\n\n if (!metadata.sdk) {\n metadata.sdk = {\n name: `sentry.javascript.${name}`,\n packages: names.map(name => ({\n name: `${source}:@sentry/${name}`,\n version: SDK_VERSION,\n })),\n version: SDK_VERSION,\n };\n }\n\n options._metadata = metadata;\n}\n"],"names":[],"mappings":";;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,CAAC,OAAO,EAAe,IAAI,EAAU,KAAA,GAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,KAAK,EAAQ;AAC3G,EAAE,MAAM,WAAW,OAAO,CAAC,SAAA,IAAa,EAAE;;AAE1C,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;AACrB,IAAI,QAAQ,CAAC,GAAA,GAAM;AACnB,MAAM,IAAI,EAAE,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;AACA,MAAA,QAAA,EAAA,KAAA,CAAA,GAAA,CAAA,IAAA,KAAA;AACA,QAAA,IAAA,EAAA,CAAA,EAAA,MAAA,CAAA,SAAA,EAAA,IAAA,CAAA,CAAA;AACA,QAAA,OAAA,EAAA,WAAA;AACA,OAAA,CAAA,CAAA;AACA,MAAA,OAAA,EAAA,WAAA;AACA,KAAA;AACA,EAAA;;AAEA,EAAA,OAAA,CAAA,SAAA,GAAA,QAAA;AACA;;;;"}
1
+ {"version":3,"file":"sdkMetadata.js","sources":["../../../src/utils/sdkMetadata.ts"],"sourcesContent":["import type { CoreOptions } from '../types-hoist/options';\nimport { SDK_VERSION } from '../utils/version';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nexport function applySdkMetadata(options: CoreOptions, name: string, names = [name], source = 'npm'): void {\n const sdk = ((options._metadata = options._metadata || {}).sdk = options._metadata.sdk || {});\n\n if (!sdk.name) {\n sdk.name = `sentry.javascript.${name}`;\n sdk.packages = names.map(name => ({\n name: `${source}:@sentry/${name}`,\n version: SDK_VERSION,\n }));\n sdk.version = SDK_VERSION;\n }\n}\n"],"names":[],"mappings":";;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,CAAC,OAAO,EAAe,IAAI,EAAU,KAAA,GAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,KAAK,EAAQ;AAC3G,EAAE,MAAM,GAAA,IAAO,CAAC,OAAO,CAAC,SAAA,GAAY,OAAO,CAAC,SAAA,IAAa,EAAE,EAAE,GAAA,GAAM,OAAO,CAAC,SAAS,CAAC,GAAA,IAAO,EAAE,CAAC;;AAE/F,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;AACjB,IAAI,GAAG,CAAC,IAAA,GAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;AACA,IAAA,GAAA,CAAA,QAAA,GAAA,KAAA,CAAA,GAAA,CAAA,IAAA,KAAA;AACA,MAAA,IAAA,EAAA,CAAA,EAAA,MAAA,CAAA,SAAA,EAAA,IAAA,CAAA,CAAA;AACA,MAAA,OAAA,EAAA,WAAA;AACA,KAAA,CAAA,CAAA;AACA,IAAA,GAAA,CAAA,OAAA,GAAA,WAAA;AACA,EAAA;AACA;;;;"}
@@ -1,9 +1,10 @@
1
1
  import { DEBUG_BUILD } from '../debug-build.js';
2
+ import { SEMANTIC_ATTRIBUTE_SENTRY_OP } from '../semanticAttributes.js';
2
3
  import { debug } from './debug-logger.js';
3
4
  import { isMatchingPattern } from './string.js';
4
5
 
5
- function logIgnoredSpan(droppedSpan) {
6
- debug.log(`Ignoring span ${droppedSpan.op} - ${droppedSpan.description} because it matches \`ignoreSpans\`.`);
6
+ function logIgnoredSpan(spanName, spanOp) {
7
+ debug.log(`Ignoring span ${spanOp ? `${spanOp} - ` : ''}${spanName} because it matches \`ignoreSpans\`.`);
7
8
  }
8
9
 
9
10
  /**
@@ -13,14 +14,32 @@ function shouldIgnoreSpan(
13
14
  span,
14
15
  ignoreSpans,
15
16
  ) {
16
- if (!ignoreSpans?.length || !span.description) {
17
+ if (!ignoreSpans?.length) {
18
+ return false;
19
+ }
20
+
21
+ const { spanName, spanOp: spanOpAttributeOrString } =
22
+ 'description' in span
23
+ ? { spanName: span.description, spanOp: span.op }
24
+ : 'name' in span
25
+ ? { spanName: span.name, spanOp: span.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP] }
26
+ : { spanName: '', spanOp: '' };
27
+
28
+ const spanOp =
29
+ typeof spanOpAttributeOrString === 'string'
30
+ ? spanOpAttributeOrString
31
+ : spanOpAttributeOrString?.type === 'string'
32
+ ? spanOpAttributeOrString.value
33
+ : undefined;
34
+
35
+ if (!spanName) {
17
36
  return false;
18
37
  }
19
38
 
20
39
  for (const pattern of ignoreSpans) {
21
40
  if (isStringOrRegExp(pattern)) {
22
- if (isMatchingPattern(span.description, pattern)) {
23
- DEBUG_BUILD && logIgnoredSpan(span);
41
+ if (isMatchingPattern(spanName, pattern)) {
42
+ DEBUG_BUILD && logIgnoredSpan(spanName, spanOp);
24
43
  return true;
25
44
  }
26
45
  continue;
@@ -30,15 +49,15 @@ function shouldIgnoreSpan(
30
49
  continue;
31
50
  }
32
51
 
33
- const nameMatches = pattern.name ? isMatchingPattern(span.description, pattern.name) : true;
34
- const opMatches = pattern.op ? span.op && isMatchingPattern(span.op, pattern.op) : true;
52
+ const nameMatches = pattern.name ? isMatchingPattern(spanName, pattern.name) : true;
53
+ const opMatches = pattern.op ? spanOp && isMatchingPattern(spanOp, pattern.op) : true;
35
54
 
36
55
  // This check here is only correct because we can guarantee that we ran `isMatchingPattern`
37
56
  // for at least one of `nameMatches` and `opMatches`. So in contrary to how this looks,
38
57
  // not both op and name actually have to match. This is the most efficient way to check
39
58
  // for all combinations of name and op patterns.
40
59
  if (nameMatches && opMatches) {
41
- DEBUG_BUILD && logIgnoredSpan(span);
60
+ DEBUG_BUILD && logIgnoredSpan(spanName, spanOp);
42
61
  return true;
43
62
  }
44
63
  }
@@ -50,7 +69,10 @@ function shouldIgnoreSpan(
50
69
  * Takes a list of spans, and a span that was dropped, and re-parents the child spans of the dropped span to the parent of the dropped span, if possible.
51
70
  * This mutates the spans array in place!
52
71
  */
53
- function reparentChildSpans(spans, dropSpan) {
72
+ function reparentChildSpans(
73
+ spans,
74
+ dropSpan,
75
+ ) {
54
76
  const droppedSpanParentId = dropSpan.parent_span_id;
55
77
  const droppedSpanId = dropSpan.span_id;
56
78
 
@@ -1 +1 @@
1
- {"version":3,"file":"should-ignore-span.js","sources":["../../../src/utils/should-ignore-span.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport type { ClientOptions } from '../types-hoist/options';\nimport type { SpanJSON } from '../types-hoist/span';\nimport { debug } from './debug-logger';\nimport { isMatchingPattern } from './string';\n\nfunction logIgnoredSpan(droppedSpan: Pick<SpanJSON, 'description' | 'op'>): void {\n debug.log(`Ignoring span ${droppedSpan.op} - ${droppedSpan.description} because it matches \\`ignoreSpans\\`.`);\n}\n\n/**\n * Check if a span should be ignored based on the ignoreSpans configuration.\n */\nexport function shouldIgnoreSpan(\n span: Pick<SpanJSON, 'description' | 'op'>,\n ignoreSpans: Required<ClientOptions>['ignoreSpans'],\n): boolean {\n if (!ignoreSpans?.length || !span.description) {\n return false;\n }\n\n for (const pattern of ignoreSpans) {\n if (isStringOrRegExp(pattern)) {\n if (isMatchingPattern(span.description, pattern)) {\n DEBUG_BUILD && logIgnoredSpan(span);\n return true;\n }\n continue;\n }\n\n if (!pattern.name && !pattern.op) {\n continue;\n }\n\n const nameMatches = pattern.name ? isMatchingPattern(span.description, pattern.name) : true;\n const opMatches = pattern.op ? span.op && isMatchingPattern(span.op, pattern.op) : true;\n\n // This check here is only correct because we can guarantee that we ran `isMatchingPattern`\n // for at least one of `nameMatches` and `opMatches`. So in contrary to how this looks,\n // not both op and name actually have to match. This is the most efficient way to check\n // for all combinations of name and op patterns.\n if (nameMatches && opMatches) {\n DEBUG_BUILD && logIgnoredSpan(span);\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Takes a list of spans, and a span that was dropped, and re-parents the child spans of the dropped span to the parent of the dropped span, if possible.\n * This mutates the spans array in place!\n */\nexport function reparentChildSpans(spans: SpanJSON[], dropSpan: SpanJSON): void {\n const droppedSpanParentId = dropSpan.parent_span_id;\n const droppedSpanId = dropSpan.span_id;\n\n // This should generally not happen, as we do not apply this on root spans\n // but to be safe, we just bail in this case\n if (!droppedSpanParentId) {\n return;\n }\n\n for (const span of spans) {\n if (span.parent_span_id === droppedSpanId) {\n span.parent_span_id = droppedSpanParentId;\n }\n }\n}\n\nfunction isStringOrRegExp(value: unknown): value is string | RegExp {\n return typeof value === 'string' || value instanceof RegExp;\n}\n"],"names":[],"mappings":";;;;AAMA,SAAS,cAAc,CAAC,WAAW,EAA8C;AACjF,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC;AAC/G;;AAEA;AACA;AACA;AACO,SAAS,gBAAgB;AAChC,EAAE,IAAI;AACN,EAAE,WAAW;AACb,EAAW;AACX,EAAE,IAAI,CAAC,WAAW,EAAE,MAAA,IAAU,CAAC,IAAI,CAAC,WAAW,EAAE;AACjD,IAAI,OAAO,KAAK;AAChB,EAAE;;AAEF,EAAE,KAAK,MAAM,OAAA,IAAW,WAAW,EAAE;AACrC,IAAI,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE;AACnC,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE;AACxD,QAAQ,WAAA,IAAe,cAAc,CAAC,IAAI,CAAC;AAC3C,QAAQ,OAAO,IAAI;AACnB,MAAM;AACN,MAAM;AACN,IAAI;;AAEJ,IAAI,IAAI,CAAC,OAAO,CAAC,IAAA,IAAQ,CAAC,OAAO,CAAC,EAAE,EAAE;AACtC,MAAM;AACN,IAAI;;AAEJ,IAAI,MAAM,WAAA,GAAc,OAAO,CAAC,IAAA,GAAO,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAA,GAAI,IAAI;AAC/F,IAAI,MAAM,YAAY,OAAO,CAAC,EAAA,GAAK,IAAI,CAAC,EAAA,IAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAA,GAAI,IAAI;;AAE3F;AACA;AACA;AACA;AACA,IAAI,IAAI,WAAA,IAAe,SAAS,EAAE;AAClC,MAAM,WAAA,IAAe,cAAc,CAAC,IAAI,CAAC;AACzC,MAAM,OAAO,IAAI;AACjB,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,KAAK,EAAc,QAAQ,EAAkB;AAChF,EAAE,MAAM,mBAAA,GAAsB,QAAQ,CAAC,cAAc;AACrD,EAAE,MAAM,aAAA,GAAgB,QAAQ,CAAC,OAAO;;AAExC;AACA;AACA,EAAE,IAAI,CAAC,mBAAmB,EAAE;AAC5B,IAAI;AACJ,EAAE;;AAEF,EAAE,KAAK,MAAM,IAAA,IAAQ,KAAK,EAAE;AAC5B,IAAI,IAAI,IAAI,CAAC,cAAA,KAAmB,aAAa,EAAE;AAC/C,MAAM,IAAI,CAAC,cAAA,GAAiB,mBAAmB;AAC/C,IAAI;AACJ,EAAE;AACF;;AAEA,SAAS,gBAAgB,CAAC,KAAK,EAAqC;AACpE,EAAE,OAAO,OAAO,KAAA,KAAU,YAAY,KAAA,YAAiB,MAAM;AAC7D;;;;"}
1
+ {"version":3,"file":"should-ignore-span.js","sources":["../../../src/utils/should-ignore-span.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP } from '../semanticAttributes';\nimport type { ClientOptions } from '../types-hoist/options';\nimport type { SpanJSON, SpanV2JSON } from '../types-hoist/span';\nimport { debug } from './debug-logger';\nimport { isMatchingPattern } from './string';\n\nfunction logIgnoredSpan(spanName: string, spanOp: string | undefined): void {\n debug.log(`Ignoring span ${spanOp ? `${spanOp} - ` : ''}${spanName} because it matches \\`ignoreSpans\\`.`);\n}\n\n/**\n * Check if a span should be ignored based on the ignoreSpans configuration.\n */\nexport function shouldIgnoreSpan(\n span: Pick<SpanJSON, 'description' | 'op'> | Pick<SpanV2JSON, 'name' | 'attributes'>,\n ignoreSpans: Required<ClientOptions>['ignoreSpans'],\n): boolean {\n if (!ignoreSpans?.length) {\n return false;\n }\n\n const { spanName, spanOp: spanOpAttributeOrString } =\n 'description' in span\n ? { spanName: span.description, spanOp: span.op }\n : 'name' in span\n ? { spanName: span.name, spanOp: span.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP] }\n : { spanName: '', spanOp: '' };\n\n const spanOp =\n typeof spanOpAttributeOrString === 'string'\n ? spanOpAttributeOrString\n : spanOpAttributeOrString?.type === 'string'\n ? spanOpAttributeOrString.value\n : undefined;\n\n if (!spanName) {\n return false;\n }\n\n for (const pattern of ignoreSpans) {\n if (isStringOrRegExp(pattern)) {\n if (isMatchingPattern(spanName, pattern)) {\n DEBUG_BUILD && logIgnoredSpan(spanName, spanOp);\n return true;\n }\n continue;\n }\n\n if (!pattern.name && !pattern.op) {\n continue;\n }\n\n const nameMatches = pattern.name ? isMatchingPattern(spanName, pattern.name) : true;\n const opMatches = pattern.op ? spanOp && isMatchingPattern(spanOp, pattern.op) : true;\n\n // This check here is only correct because we can guarantee that we ran `isMatchingPattern`\n // for at least one of `nameMatches` and `opMatches`. So in contrary to how this looks,\n // not both op and name actually have to match. This is the most efficient way to check\n // for all combinations of name and op patterns.\n if (nameMatches && opMatches) {\n DEBUG_BUILD && logIgnoredSpan(spanName, spanOp);\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Takes a list of spans, and a span that was dropped, and re-parents the child spans of the dropped span to the parent of the dropped span, if possible.\n * This mutates the spans array in place!\n */\nexport function reparentChildSpans(\n spans: Pick<SpanV2JSON, 'parent_span_id' | 'span_id'>[],\n dropSpan: Pick<SpanV2JSON, 'parent_span_id' | 'span_id'>,\n): void {\n const droppedSpanParentId = dropSpan.parent_span_id;\n const droppedSpanId = dropSpan.span_id;\n\n // This should generally not happen, as we do not apply this on root spans\n // but to be safe, we just bail in this case\n if (!droppedSpanParentId) {\n return;\n }\n\n for (const span of spans) {\n if (span.parent_span_id === droppedSpanId) {\n span.parent_span_id = droppedSpanParentId;\n }\n }\n}\n\nfunction isStringOrRegExp(value: unknown): value is string | RegExp {\n return typeof value === 'string' || value instanceof RegExp;\n}\n"],"names":[],"mappings":";;;;;AAOA,SAAS,cAAc,CAAC,QAAQ,EAAU,MAAM,EAA4B;AAC5E,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,MAAA,GAAS,CAAC,EAAA,MAAA,CAAA,GAAA,CAAA,GAAA,EAAA,CAAA,EAAA,QAAA,CAAA,oCAAA,CAAA,CAAA;AACA;;AAEA;AACA;AACA;AACA,SAAA,gBAAA;AACA,EAAA,IAAA;AACA,EAAA,WAAA;AACA,EAAA;AACA,EAAA,IAAA,CAAA,WAAA,EAAA,MAAA,EAAA;AACA,IAAA,OAAA,KAAA;AACA,EAAA;;AAEA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,uBAAA,EAAA;AACA,IAAA,aAAA,IAAA;AACA,QAAA,EAAA,QAAA,EAAA,IAAA,CAAA,WAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA;AACA,QAAA,MAAA,IAAA;AACA,UAAA,EAAA,QAAA,EAAA,IAAA,CAAA,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA,UAAA,GAAA,4BAAA,CAAA;AACA,UAAA,EAAA,QAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,EAAA;;AAEA,EAAA,MAAA,MAAA;AACA,IAAA,OAAA,uBAAA,KAAA;AACA,QAAA;AACA,QAAA,uBAAA,EAAA,IAAA,KAAA;AACA,UAAA,uBAAA,CAAA;AACA,UAAA,SAAA;;AAEA,EAAA,IAAA,CAAA,QAAA,EAAA;AACA,IAAA,OAAA,KAAA;AACA,EAAA;;AAEA,EAAA,KAAA,MAAA,OAAA,IAAA,WAAA,EAAA;AACA,IAAA,IAAA,gBAAA,CAAA,OAAA,CAAA,EAAA;AACA,MAAA,IAAA,iBAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA;AACA,QAAA,WAAA,IAAA,cAAA,CAAA,QAAA,EAAA,MAAA,CAAA;AACA,QAAA,OAAA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;;AAEA,IAAA,IAAA,CAAA,OAAA,CAAA,IAAA,IAAA,CAAA,OAAA,CAAA,EAAA,EAAA;AACA,MAAA;AACA,IAAA;;AAEA,IAAA,MAAA,WAAA,GAAA,OAAA,CAAA,IAAA,GAAA,iBAAA,CAAA,QAAA,EAAA,OAAA,CAAA,IAAA,CAAA,GAAA,IAAA;AACA,IAAA,MAAA,SAAA,GAAA,OAAA,CAAA,EAAA,GAAA,MAAA,IAAA,iBAAA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,CAAA,GAAA,IAAA;;AAEA;AACA;AACA;AACA;AACA,IAAA,IAAA,WAAA,IAAA,SAAA,EAAA;AACA,MAAA,WAAA,IAAA,cAAA,CAAA,QAAA,EAAA,MAAA,CAAA;AACA,MAAA,OAAA,IAAA;AACA,IAAA;AACA,EAAA;;AAEA,EAAA,OAAA,KAAA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAAA,kBAAA;AACA,EAAA,KAAA;AACA,EAAA,QAAA;AACA,EAAA;AACA,EAAA,MAAA,mBAAA,GAAA,QAAA,CAAA,cAAA;AACA,EAAA,MAAA,aAAA,GAAA,QAAA,CAAA,OAAA;;AAEA;AACA;AACA,EAAA,IAAA,CAAA,mBAAA,EAAA;AACA,IAAA;AACA,EAAA;;AAEA,EAAA,KAAA,MAAA,IAAA,IAAA,KAAA,EAAA;AACA,IAAA,IAAA,IAAA,CAAA,cAAA,KAAA,aAAA,EAAA;AACA,MAAA,IAAA,CAAA,cAAA,GAAA,mBAAA;AACA,IAAA;AACA,EAAA;AACA;;AAEA,SAAA,gBAAA,CAAA,KAAA,EAAA;AACA,EAAA,OAAA,OAAA,KAAA,KAAA,QAAA,IAAA,KAAA,YAAA,MAAA;AACA;;;;"}
@@ -1,4 +1,5 @@
1
1
  import { getAsyncContextStrategy } from '../asyncContext/index.js';
2
+ import { serializeAttributes } from '../attributes.js';
2
3
  import { getMainCarrier } from '../carrier.js';
3
4
  import { getCurrentScope } from '../currentScopes.js';
4
5
  import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes.js';
@@ -82,7 +83,7 @@ function spanToTraceparentHeader(span) {
82
83
  * If the links array is empty, it returns `undefined` so the empty value can be dropped before it's sent.
83
84
  */
84
85
  function convertSpanLinksForEnvelope(links) {
85
- if (links && links.length > 0) {
86
+ if (links?.length) {
86
87
  return links.map(({ context: { spanId, traceId, traceFlags, ...restContext }, attributes }) => ({
87
88
  span_id: spanId,
88
89
  trace_id: traceId,
@@ -94,6 +95,24 @@ function convertSpanLinksForEnvelope(links) {
94
95
  return undefined;
95
96
  }
96
97
  }
98
+ /**
99
+ *
100
+ * @param links
101
+ * @returns
102
+ */
103
+ function getV2SpanLinks(links) {
104
+ if (links?.length) {
105
+ return links.map(({ context: { spanId, traceId, traceFlags, ...restContext }, attributes }) => ({
106
+ span_id: spanId,
107
+ trace_id: traceId,
108
+ sampled: traceFlags === TRACE_FLAG_SAMPLED,
109
+ ...(attributes && { attributes: serializeAttributes(attributes) }),
110
+ ...restContext,
111
+ }));
112
+ } else {
113
+ return undefined;
114
+ }
115
+ }
97
116
 
98
117
  /**
99
118
  * Convert a span time input into a timestamp in seconds.
@@ -177,6 +196,59 @@ function spanToJSON(span) {
177
196
  };
178
197
  }
179
198
 
199
+ /**
200
+ * Convert a span to a SpanV2JSON representation.
201
+ * @returns
202
+ */
203
+ function spanToV2JSON(span) {
204
+ if (spanIsSentrySpan(span)) {
205
+ return span.getSpanV2JSON();
206
+ }
207
+
208
+ const { spanId: span_id, traceId: trace_id } = span.spanContext();
209
+
210
+ // Handle a span from @opentelemetry/sdk-base-trace's `Span` class
211
+ if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {
212
+ const { attributes, startTime, name, endTime, status, links } = span;
213
+
214
+ // In preparation for the next major of OpenTelemetry, we want to support
215
+ // looking up the parent span id according to the new API
216
+ // In OTel v1, the parent span id is accessed as `parentSpanId`
217
+ // In OTel v2, the parent span id is accessed as `spanId` on the `parentSpanContext`
218
+ const parentSpanId =
219
+ 'parentSpanId' in span
220
+ ? span.parentSpanId
221
+ : 'parentSpanContext' in span
222
+ ? (span.parentSpanContext )?.spanId
223
+ : undefined;
224
+
225
+ return {
226
+ name,
227
+ span_id,
228
+ trace_id,
229
+ parent_span_id: parentSpanId,
230
+ start_timestamp: spanTimeInputToSeconds(startTime),
231
+ end_timestamp: spanTimeInputToSeconds(endTime),
232
+ is_segment: span === INTERNAL_getSegmentSpan(span),
233
+ status: getV2StatusMessage(status),
234
+ attributes: serializeAttributes(attributes),
235
+ links: getV2SpanLinks(links),
236
+ };
237
+ }
238
+
239
+ // Finally, as a fallback, at least we have `spanContext()`....
240
+ // This should not actually happen in reality, but we need to handle it for type safety.
241
+ return {
242
+ span_id,
243
+ trace_id,
244
+ start_timestamp: 0,
245
+ name: '',
246
+ end_timestamp: 0,
247
+ status: 'ok',
248
+ is_segment: span === INTERNAL_getSegmentSpan(span),
249
+ };
250
+ }
251
+
180
252
  function spanIsOpenTelemetrySdkTraceBaseSpan(span) {
181
253
  const castSpan = span ;
182
254
  return !!castSpan.attributes && !!castSpan.startTime && !!castSpan.name && !!castSpan.endTime && !!castSpan.status;
@@ -218,6 +290,13 @@ function getStatusMessage(status) {
218
290
  return status.message || 'internal_error';
219
291
  }
220
292
 
293
+ /**
294
+ * Convert the various statuses to the ones expected by Sentry ('ok' is default)
295
+ */
296
+ function getV2StatusMessage(status) {
297
+ return !status || status.code === SPAN_STATUS_OK || status.code === SPAN_STATUS_UNSET ? 'ok' : 'error';
298
+ }
299
+
221
300
  const CHILD_SPANS_FIELD = '_sentryChildSpans';
222
301
  const ROOT_SPAN_FIELD = '_sentryRootSpan';
223
302
 
@@ -274,7 +353,12 @@ function getSpanDescendants(span) {
274
353
  /**
275
354
  * Returns the root span of a given span.
276
355
  */
277
- function getRootSpan(span) {
356
+ const getRootSpan = INTERNAL_getSegmentSpan;
357
+
358
+ /**
359
+ * Returns the segment span of a given span.
360
+ */
361
+ function INTERNAL_getSegmentSpan(span) {
278
362
  return span[ROOT_SPAN_FIELD] || span;
279
363
  }
280
364
 
@@ -330,5 +414,5 @@ function updateSpanName(span, name) {
330
414
  });
331
415
  }
332
416
 
333
- export { TRACE_FLAG_NONE, TRACE_FLAG_SAMPLED, addChildSpanToSpan, convertSpanLinksForEnvelope, getActiveSpan, getRootSpan, getSpanDescendants, getStatusMessage, removeChildSpanFromSpan, showSpanDropWarning, spanIsSampled, spanTimeInputToSeconds, spanToJSON, spanToTraceContext, spanToTraceHeader, spanToTraceparentHeader, spanToTransactionTraceContext, updateSpanName };
417
+ export { INTERNAL_getSegmentSpan, TRACE_FLAG_NONE, TRACE_FLAG_SAMPLED, addChildSpanToSpan, convertSpanLinksForEnvelope, getActiveSpan, getRootSpan, getSpanDescendants, getStatusMessage, getV2SpanLinks, getV2StatusMessage, removeChildSpanFromSpan, showSpanDropWarning, spanIsSampled, spanTimeInputToSeconds, spanToJSON, spanToTraceContext, spanToTraceHeader, spanToTraceparentHeader, spanToTransactionTraceContext, spanToV2JSON, updateSpanName };
334
418
  //# sourceMappingURL=spanUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spanUtils.js","sources":["../../../src/utils/spanUtils.ts"],"sourcesContent":["import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport { getCurrentScope } from '../currentScopes';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { SentrySpan } from '../tracing/sentrySpan';\nimport { SPAN_STATUS_OK, SPAN_STATUS_UNSET } from '../tracing/spanstatus';\nimport { getCapturedScopesOnSpan } from '../tracing/utils';\nimport type { TraceContext } from '../types-hoist/context';\nimport type { SpanLink, SpanLinkJSON } from '../types-hoist/link';\nimport type { Span, SpanAttributes, SpanJSON, SpanOrigin, SpanTimeInput } from '../types-hoist/span';\nimport type { SpanStatus } from '../types-hoist/spanStatus';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { generateSpanId } from '../utils/propagationContext';\nimport { timestampInSeconds } from '../utils/time';\nimport { generateSentryTraceHeader, generateTraceparentHeader } from '../utils/tracing';\nimport { consoleSandbox } from './debug-logger';\nimport { _getSpanForScope } from './spanOnScope';\n\n// These are aligned with OpenTelemetry trace flags\nexport const TRACE_FLAG_NONE = 0x0;\nexport const TRACE_FLAG_SAMPLED = 0x1;\n\nlet hasShownSpanDropWarning = false;\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in an event.\n * By default, this will only include trace_id, span_id & parent_span_id.\n * If `includeAllData` is true, it will also include data, op, status & origin.\n */\nexport function spanToTransactionTraceContext(span: Span): TraceContext {\n const { spanId: span_id, traceId: trace_id } = span.spanContext();\n const { data, op, parent_span_id, status, origin, links } = spanToJSON(span);\n\n return {\n parent_span_id,\n span_id,\n trace_id,\n data,\n op,\n status,\n origin,\n links,\n };\n}\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in a non-transaction event.\n */\nexport function spanToTraceContext(span: Span): TraceContext {\n const { spanId, traceId: trace_id, isRemote } = span.spanContext();\n\n // If the span is remote, we use a random/virtual span as span_id to the trace context,\n // and the remote span as parent_span_id\n const parent_span_id = isRemote ? spanId : spanToJSON(span).parent_span_id;\n const scope = getCapturedScopesOnSpan(span).scope;\n\n const span_id = isRemote ? scope?.getPropagationContext().propagationSpanId || generateSpanId() : spanId;\n\n return {\n parent_span_id,\n span_id,\n trace_id,\n };\n}\n\n/**\n * Convert a Span to a Sentry trace header.\n */\nexport function spanToTraceHeader(span: Span): string {\n const { traceId, spanId } = span.spanContext();\n const sampled = spanIsSampled(span);\n return generateSentryTraceHeader(traceId, spanId, sampled);\n}\n\n/**\n * Convert a Span to a W3C traceparent header.\n */\nexport function spanToTraceparentHeader(span: Span): string {\n const { traceId, spanId } = span.spanContext();\n const sampled = spanIsSampled(span);\n return generateTraceparentHeader(traceId, spanId, sampled);\n}\n\n/**\n * Converts the span links array to a flattened version to be sent within an envelope.\n *\n * If the links array is empty, it returns `undefined` so the empty value can be dropped before it's sent.\n */\nexport function convertSpanLinksForEnvelope(links?: SpanLink[]): SpanLinkJSON[] | undefined {\n if (links && links.length > 0) {\n return links.map(({ context: { spanId, traceId, traceFlags, ...restContext }, attributes }) => ({\n span_id: spanId,\n trace_id: traceId,\n sampled: traceFlags === TRACE_FLAG_SAMPLED,\n attributes,\n ...restContext,\n }));\n } else {\n return undefined;\n }\n}\n\n/**\n * Convert a span time input into a timestamp in seconds.\n */\nexport function spanTimeInputToSeconds(input: SpanTimeInput | undefined): number {\n if (typeof input === 'number') {\n return ensureTimestampInSeconds(input);\n }\n\n if (Array.isArray(input)) {\n // See {@link HrTime} for the array-based time format\n return input[0] + input[1] / 1e9;\n }\n\n if (input instanceof Date) {\n return ensureTimestampInSeconds(input.getTime());\n }\n\n return timestampInSeconds();\n}\n\n/**\n * Converts a timestamp to second, if it was in milliseconds, or keeps it as second.\n */\nfunction ensureTimestampInSeconds(timestamp: number): number {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Convert a span to a JSON representation.\n */\n// Note: Because of this, we currently have a circular type dependency (which we opted out of in package.json).\n// This is not avoidable as we need `spanToJSON` in `spanUtils.ts`, which in turn is needed by `span.ts` for backwards compatibility.\n// And `spanToJSON` needs the Span class from `span.ts` to check here.\nexport function spanToJSON(span: Span): SpanJSON {\n if (spanIsSentrySpan(span)) {\n return span.getSpanJSON();\n }\n\n const { spanId: span_id, traceId: trace_id } = span.spanContext();\n\n // Handle a span from @opentelemetry/sdk-base-trace's `Span` class\n if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {\n const { attributes, startTime, name, endTime, status, links } = span;\n\n // In preparation for the next major of OpenTelemetry, we want to support\n // looking up the parent span id according to the new API\n // In OTel v1, the parent span id is accessed as `parentSpanId`\n // In OTel v2, the parent span id is accessed as `spanId` on the `parentSpanContext`\n const parentSpanId =\n 'parentSpanId' in span\n ? span.parentSpanId\n : 'parentSpanContext' in span\n ? (span.parentSpanContext as { spanId?: string } | undefined)?.spanId\n : undefined;\n\n return {\n span_id,\n trace_id,\n data: attributes,\n description: name,\n parent_span_id: parentSpanId,\n start_timestamp: spanTimeInputToSeconds(startTime),\n // This is [0,0] by default in OTEL, in which case we want to interpret this as no end time\n timestamp: spanTimeInputToSeconds(endTime) || undefined,\n status: getStatusMessage(status),\n op: attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n origin: attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n links: convertSpanLinksForEnvelope(links),\n };\n }\n\n // Finally, at least we have `spanContext()`....\n // This should not actually happen in reality, but we need to handle it for type safety.\n return {\n span_id,\n trace_id,\n start_timestamp: 0,\n data: {},\n };\n}\n\nfunction spanIsOpenTelemetrySdkTraceBaseSpan(span: Span): span is OpenTelemetrySdkTraceBaseSpan {\n const castSpan = span as Partial<OpenTelemetrySdkTraceBaseSpan>;\n return !!castSpan.attributes && !!castSpan.startTime && !!castSpan.name && !!castSpan.endTime && !!castSpan.status;\n}\n\n/** Exported only for tests. */\nexport interface OpenTelemetrySdkTraceBaseSpan extends Span {\n attributes: SpanAttributes;\n startTime: SpanTimeInput;\n name: string;\n status: SpanStatus;\n endTime: SpanTimeInput;\n parentSpanId?: string;\n links?: SpanLink[];\n}\n\n/**\n * Sadly, due to circular dependency checks we cannot actually import the Span class here and check for instanceof.\n * :( So instead we approximate this by checking if it has the `getSpanJSON` method.\n */\nfunction spanIsSentrySpan(span: Span): span is SentrySpan {\n return typeof (span as SentrySpan).getSpanJSON === 'function';\n}\n\n/**\n * Returns true if a span is sampled.\n * In most cases, you should just use `span.isRecording()` instead.\n * However, this has a slightly different semantic, as it also returns false if the span is finished.\n * So in the case where this distinction is important, use this method.\n */\nexport function spanIsSampled(span: Span): boolean {\n // We align our trace flags with the ones OpenTelemetry use\n // So we also check for sampled the same way they do.\n const { traceFlags } = span.spanContext();\n return traceFlags === TRACE_FLAG_SAMPLED;\n}\n\n/** Get the status message to use for a JSON representation of a span. */\nexport function getStatusMessage(status: SpanStatus | undefined): string | undefined {\n if (!status || status.code === SPAN_STATUS_UNSET) {\n return undefined;\n }\n\n if (status.code === SPAN_STATUS_OK) {\n return 'ok';\n }\n\n return status.message || 'internal_error';\n}\n\nconst CHILD_SPANS_FIELD = '_sentryChildSpans';\nconst ROOT_SPAN_FIELD = '_sentryRootSpan';\n\ntype SpanWithPotentialChildren = Span & {\n [CHILD_SPANS_FIELD]?: Set<Span>;\n [ROOT_SPAN_FIELD]?: Span;\n};\n\n/**\n * Adds an opaque child span reference to a span.\n */\nexport function addChildSpanToSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n // We store the root span reference on the child span\n // We need this for `getRootSpan()` to work\n const rootSpan = span[ROOT_SPAN_FIELD] || span;\n addNonEnumerableProperty(childSpan as SpanWithPotentialChildren, ROOT_SPAN_FIELD, rootSpan);\n\n // We store a list of child spans on the parent span\n // We need this for `getSpanDescendants()` to work\n if (span[CHILD_SPANS_FIELD]) {\n span[CHILD_SPANS_FIELD].add(childSpan);\n } else {\n addNonEnumerableProperty(span, CHILD_SPANS_FIELD, new Set([childSpan]));\n }\n}\n\n/** This is only used internally by Idle Spans. */\nexport function removeChildSpanFromSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n if (span[CHILD_SPANS_FIELD]) {\n span[CHILD_SPANS_FIELD].delete(childSpan);\n }\n}\n\n/**\n * Returns an array of the given span and all of its descendants.\n */\nexport function getSpanDescendants(span: SpanWithPotentialChildren): Span[] {\n const resultSet = new Set<Span>();\n\n function addSpanChildren(span: SpanWithPotentialChildren): void {\n // This exit condition is required to not infinitely loop in case of a circular dependency.\n if (resultSet.has(span)) {\n return;\n // We want to ignore unsampled spans (e.g. non recording spans)\n } else if (spanIsSampled(span)) {\n resultSet.add(span);\n const childSpans = span[CHILD_SPANS_FIELD] ? Array.from(span[CHILD_SPANS_FIELD]) : [];\n for (const childSpan of childSpans) {\n addSpanChildren(childSpan);\n }\n }\n }\n\n addSpanChildren(span);\n\n return Array.from(resultSet);\n}\n\n/**\n * Returns the root span of a given span.\n */\nexport function getRootSpan(span: SpanWithPotentialChildren): Span {\n return span[ROOT_SPAN_FIELD] || span;\n}\n\n/**\n * Returns the currently active span.\n */\nexport function getActiveSpan(): Span | undefined {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.getActiveSpan) {\n return acs.getActiveSpan();\n }\n\n return _getSpanForScope(getCurrentScope());\n}\n\n/**\n * Logs a warning once if `beforeSendSpan` is used to drop spans.\n */\nexport function showSpanDropWarning(): void {\n if (!hasShownSpanDropWarning) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Returning null from `beforeSendSpan` is disallowed. To drop certain spans, configure the respective integrations directly or use `ignoreSpans`.',\n );\n });\n hasShownSpanDropWarning = true;\n }\n}\n\n/**\n * Updates the name of the given span and ensures that the span name is not\n * overwritten by the Sentry SDK.\n *\n * Use this function instead of `span.updateName()` if you want to make sure that\n * your name is kept. For some spans, for example root `http.server` spans the\n * Sentry SDK would otherwise overwrite the span name with a high-quality name\n * it infers when the span ends.\n *\n * Use this function in server code or when your span is started on the server\n * and on the client (browser). If you only update a span name on the client,\n * you can also use `span.updateName()` the SDK does not overwrite the name.\n *\n * @param span - The span to update the name of.\n * @param name - The name to set on the span.\n */\nexport function updateSpanName(span: Span, name: string): void {\n span.updateName(name);\n span.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]: name,\n });\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAuBA;AACO,MAAM,eAAA,GAAkB;AACxB,MAAM,kBAAA,GAAqB;;AAElC,IAAI,uBAAA,GAA0B,KAAK;;AAEnC;AACA;AACA;AACA;AACA;AACO,SAAS,6BAA6B,CAAC,IAAI,EAAsB;AACxE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAA,KAAa,IAAI,CAAC,WAAW,EAAE;AACnE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAA,EAAM,GAAI,UAAU,CAAC,IAAI,CAAC;;AAE9E,EAAE,OAAO;AACT,IAAI,cAAc;AAClB,IAAI,OAAO;AACX,IAAI,QAAQ;AACZ,IAAI,IAAI;AACR,IAAI,EAAE;AACN,IAAI,MAAM;AACV,IAAI,MAAM;AACV,IAAI,KAAK;AACT,GAAG;AACH;;AAEA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,IAAI,EAAsB;AAC7D,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAA,KAAa,IAAI,CAAC,WAAW,EAAE;;AAEpE;AACA;AACA,EAAE,MAAM,cAAA,GAAiB,QAAA,GAAW,MAAA,GAAS,UAAU,CAAC,IAAI,CAAC,CAAC,cAAc;AAC5E,EAAE,MAAM,QAAQ,uBAAuB,CAAC,IAAI,CAAC,CAAC,KAAK;;AAEnD,EAAE,MAAM,OAAA,GAAU,QAAA,GAAW,KAAK,EAAE,qBAAqB,EAAE,CAAC,iBAAA,IAAqB,cAAc,EAAC,GAAI,MAAM;;AAE1G,EAAE,OAAO;AACT,IAAI,cAAc;AAClB,IAAI,OAAO;AACX,IAAI,QAAQ;AACZ,GAAG;AACH;;AAEA;AACA;AACA;AACO,SAAS,iBAAiB,CAAC,IAAI,EAAgB;AACtD,EAAE,MAAM,EAAE,OAAO,EAAE,MAAA,EAAO,GAAI,IAAI,CAAC,WAAW,EAAE;AAChD,EAAE,MAAM,OAAA,GAAU,aAAa,CAAC,IAAI,CAAC;AACrC,EAAE,OAAO,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAC5D;;AAEA;AACA;AACA;AACO,SAAS,uBAAuB,CAAC,IAAI,EAAgB;AAC5D,EAAE,MAAM,EAAE,OAAO,EAAE,MAAA,EAAO,GAAI,IAAI,CAAC,WAAW,EAAE;AAChD,EAAE,MAAM,OAAA,GAAU,aAAa,CAAC,IAAI,CAAC;AACrC,EAAE,OAAO,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,KAAK,EAA2C;AAC5F,EAAE,IAAI,KAAA,IAAS,KAAK,CAAC,MAAA,GAAS,CAAC,EAAE;AACjC,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,WAAA,EAAa,EAAE,UAAA,EAAY,MAAM;AACpG,MAAM,OAAO,EAAE,MAAM;AACrB,MAAM,QAAQ,EAAE,OAAO;AACvB,MAAM,OAAO,EAAE,UAAA,KAAe,kBAAkB;AAChD,MAAM,UAAU;AAChB,MAAM,GAAG,WAAW;AACpB,KAAK,CAAC,CAAC;AACP,EAAE,OAAO;AACT,IAAI,OAAO,SAAS;AACpB,EAAE;AACF;;AAEA;AACA;AACA;AACO,SAAS,sBAAsB,CAAC,KAAK,EAAqC;AACjF,EAAE,IAAI,OAAO,KAAA,KAAU,QAAQ,EAAE;AACjC,IAAI,OAAO,wBAAwB,CAAC,KAAK,CAAC;AAC1C,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC5B;AACA,IAAI,OAAO,KAAK,CAAC,CAAC,CAAA,GAAI,KAAK,CAAC,CAAC,CAAA,GAAI,GAAG;AACpC,EAAE;;AAEF,EAAE,IAAI,KAAA,YAAiB,IAAI,EAAE;AAC7B,IAAI,OAAO,wBAAwB,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;AACpD,EAAE;;AAEF,EAAE,OAAO,kBAAkB,EAAE;AAC7B;;AAEA;AACA;AACA;AACA,SAAS,wBAAwB,CAAC,SAAS,EAAkB;AAC7D,EAAE,MAAM,IAAA,GAAO,SAAA,GAAY,UAAU;AACrC,EAAE,OAAO,IAAA,GAAO,YAAY,IAAA,GAAO,SAAS;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,UAAU,CAAC,IAAI,EAAkB;AACjD,EAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE;AAC9B,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE;AAC7B,EAAE;;AAEF,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAA,KAAa,IAAI,CAAC,WAAW,EAAE;;AAEnE;AACA,EAAE,IAAI,mCAAmC,CAAC,IAAI,CAAC,EAAE;AACjD,IAAI,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAA,EAAM,GAAI,IAAI;;AAExE;AACA;AACA;AACA;AACA,IAAI,MAAM,YAAA;AACV,MAAM,kBAAkB;AACxB,UAAU,IAAI,CAAC;AACf,UAAU,uBAAuB;AACjC,YAAY,CAAC,IAAI,CAAC,iBAAA,IAAuD;AACzE,YAAY,SAAS;;AAErB,IAAI,OAAO;AACX,MAAM,OAAO;AACb,MAAM,QAAQ;AACd,MAAM,IAAI,EAAE,UAAU;AACtB,MAAM,WAAW,EAAE,IAAI;AACvB,MAAM,cAAc,EAAE,YAAY;AAClC,MAAM,eAAe,EAAE,sBAAsB,CAAC,SAAS,CAAC;AACxD;AACA,MAAM,SAAS,EAAE,sBAAsB,CAAC,OAAO,CAAA,IAAK,SAAS;AAC7D,MAAM,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC;AACtC,MAAM,EAAE,EAAE,UAAU,CAAC,4BAA4B,CAAC;AAClD,MAAM,MAAM,EAAE,UAAU,CAAC,gCAAgC,CAAA;AACzD,MAAM,KAAK,EAAE,2BAA2B,CAAC,KAAK,CAAC;AAC/C,KAAK;AACL,EAAE;;AAEF;AACA;AACA,EAAE,OAAO;AACT,IAAI,OAAO;AACX,IAAI,QAAQ;AACZ,IAAI,eAAe,EAAE,CAAC;AACtB,IAAI,IAAI,EAAE,EAAE;AACZ,GAAG;AACH;;AAEA,SAAS,mCAAmC,CAAC,IAAI,EAA+C;AAChG,EAAE,MAAM,QAAA,GAAW,IAAA;AACnB,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAA,IAAc,CAAC,CAAC,QAAQ,CAAC,SAAA,IAAa,CAAC,CAAC,QAAQ,CAAC,IAAA,IAAQ,CAAC,CAAC,QAAQ,CAAC,OAAA,IAAW,CAAC,CAAC,QAAQ,CAAC,MAAM;AACpH;;AAEA;;AAWA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,IAAI,EAA4B;AAC1D,EAAE,OAAO,OAAO,CAAC,IAAA,GAAoB,WAAA,KAAgB,UAAU;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,aAAa,CAAC,IAAI,EAAiB;AACnD;AACA;AACA,EAAE,MAAM,EAAE,UAAA,EAAW,GAAI,IAAI,CAAC,WAAW,EAAE;AAC3C,EAAE,OAAO,UAAA,KAAe,kBAAkB;AAC1C;;AAEA;AACO,SAAS,gBAAgB,CAAC,MAAM,EAA8C;AACrF,EAAE,IAAI,CAAC,MAAA,IAAU,MAAM,CAAC,IAAA,KAAS,iBAAiB,EAAE;AACpD,IAAI,OAAO,SAAS;AACpB,EAAE;;AAEF,EAAE,IAAI,MAAM,CAAC,IAAA,KAAS,cAAc,EAAE;AACtC,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,OAAO,MAAM,CAAC,OAAA,IAAW,gBAAgB;AAC3C;;AAEA,MAAM,iBAAA,GAAoB,mBAAmB;AAC7C,MAAM,eAAA,GAAkB,iBAAiB;;AAOzC;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,IAAI,EAA6B,SAAS,EAAc;AAC3F;AACA;AACA,EAAE,MAAM,WAAW,IAAI,CAAC,eAAe,CAAA,IAAK,IAAI;AAChD,EAAE,wBAAwB,CAAC,SAAA,GAAwC,eAAe,EAAE,QAAQ,CAAC;;AAE7F;AACA;AACA,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAC/B,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1C,EAAE,OAAO;AACT,IAAI,wBAAwB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3E,EAAE;AACF;;AAEA;AACO,SAAS,uBAAuB,CAAC,IAAI,EAA6B,SAAS,EAAc;AAChG,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAC/B,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;AAC7C,EAAE;AACF;;AAEA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,IAAI,EAAqC;AAC5E,EAAE,MAAM,SAAA,GAAY,IAAI,GAAG,EAAQ;;AAEnC,EAAE,SAAS,eAAe,CAAC,IAAI,EAAmC;AAClE;AACA,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC7B,MAAM;AACN;AACA,IAAI,CAAA,MAAO,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;AACpC,MAAM,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,MAAM,MAAM,UAAA,GAAa,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA,GAAI,EAAE;AAC3F,MAAM,KAAK,MAAM,SAAA,IAAa,UAAU,EAAE;AAC1C,QAAQ,eAAe,CAAC,SAAS,CAAC;AAClC,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,eAAe,CAAC,IAAI,CAAC;;AAEvB,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AAC9B;;AAEA;AACA;AACA;AACO,SAAS,WAAW,CAAC,IAAI,EAAmC;AACnE,EAAE,OAAO,IAAI,CAAC,eAAe,CAAA,IAAK,IAAI;AACtC;;AAEA;AACA;AACA;AACO,SAAS,aAAa,GAAqB;AAClD,EAAE,MAAM,OAAA,GAAU,cAAc,EAAE;AAClC,EAAE,MAAM,GAAA,GAAM,uBAAuB,CAAC,OAAO,CAAC;AAC9C,EAAE,IAAI,GAAG,CAAC,aAAa,EAAE;AACzB,IAAI,OAAO,GAAG,CAAC,aAAa,EAAE;AAC9B,EAAE;;AAEF,EAAE,OAAO,gBAAgB,CAAC,eAAe,EAAE,CAAC;AAC5C;;AAEA;AACA;AACA;AACO,SAAS,mBAAmB,GAAS;AAC5C,EAAE,IAAI,CAAC,uBAAuB,EAAE;AAChC,IAAI,cAAc,CAAC,MAAM;AACzB;AACA,MAAM,OAAO,CAAC,IAAI;AAClB,QAAQ,0JAA0J;AAClK,OAAO;AACP,IAAI,CAAC,CAAC;AACN,IAAI,uBAAA,GAA0B,IAAI;AAClC,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,IAAI,EAAQ,IAAI,EAAgB;AAC/D,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACvB,EAAE,IAAI,CAAC,aAAa,CAAC;AACrB,IAAI,CAAC,gCAAgC,GAAG,QAAQ;AAChD,IAAI,CAAC,0CAA0C,GAAG,IAAI;AACtD,GAAG,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"spanUtils.js","sources":["../../../src/utils/spanUtils.ts"],"sourcesContent":["import { getAsyncContextStrategy } from '../asyncContext';\nimport type { Attributes } from '../attributes';\nimport { serializeAttributes } from '../attributes';\nimport { getMainCarrier } from '../carrier';\nimport { getCurrentScope } from '../currentScopes';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { SentrySpan } from '../tracing/sentrySpan';\nimport { SPAN_STATUS_OK, SPAN_STATUS_UNSET } from '../tracing/spanstatus';\nimport { getCapturedScopesOnSpan } from '../tracing/utils';\nimport type { TraceContext } from '../types-hoist/context';\nimport type { SpanLink, SpanLinkJSON } from '../types-hoist/link';\nimport type { Span, SpanAttributes, SpanJSON, SpanOrigin, SpanTimeInput, SpanV2JSON } from '../types-hoist/span';\nimport type { SpanStatus } from '../types-hoist/spanStatus';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { generateSpanId } from '../utils/propagationContext';\nimport { timestampInSeconds } from '../utils/time';\nimport { generateSentryTraceHeader, generateTraceparentHeader } from '../utils/tracing';\nimport { consoleSandbox } from './debug-logger';\nimport { _getSpanForScope } from './spanOnScope';\n\n// These are aligned with OpenTelemetry trace flags\nexport const TRACE_FLAG_NONE = 0x0;\nexport const TRACE_FLAG_SAMPLED = 0x1;\n\nlet hasShownSpanDropWarning = false;\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in an event.\n * By default, this will only include trace_id, span_id & parent_span_id.\n * If `includeAllData` is true, it will also include data, op, status & origin.\n */\nexport function spanToTransactionTraceContext(span: Span): TraceContext {\n const { spanId: span_id, traceId: trace_id } = span.spanContext();\n const { data, op, parent_span_id, status, origin, links } = spanToJSON(span);\n\n return {\n parent_span_id,\n span_id,\n trace_id,\n data,\n op,\n status,\n origin,\n links,\n };\n}\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in a non-transaction event.\n */\nexport function spanToTraceContext(span: Span): TraceContext {\n const { spanId, traceId: trace_id, isRemote } = span.spanContext();\n\n // If the span is remote, we use a random/virtual span as span_id to the trace context,\n // and the remote span as parent_span_id\n const parent_span_id = isRemote ? spanId : spanToJSON(span).parent_span_id;\n const scope = getCapturedScopesOnSpan(span).scope;\n\n const span_id = isRemote ? scope?.getPropagationContext().propagationSpanId || generateSpanId() : spanId;\n\n return {\n parent_span_id,\n span_id,\n trace_id,\n };\n}\n\n/**\n * Convert a Span to a Sentry trace header.\n */\nexport function spanToTraceHeader(span: Span): string {\n const { traceId, spanId } = span.spanContext();\n const sampled = spanIsSampled(span);\n return generateSentryTraceHeader(traceId, spanId, sampled);\n}\n\n/**\n * Convert a Span to a W3C traceparent header.\n */\nexport function spanToTraceparentHeader(span: Span): string {\n const { traceId, spanId } = span.spanContext();\n const sampled = spanIsSampled(span);\n return generateTraceparentHeader(traceId, spanId, sampled);\n}\n\n/**\n * Converts the span links array to a flattened version to be sent within an envelope.\n *\n * If the links array is empty, it returns `undefined` so the empty value can be dropped before it's sent.\n */\nexport function convertSpanLinksForEnvelope(links?: SpanLink[]): SpanLinkJSON[] | undefined {\n if (links?.length) {\n return links.map(({ context: { spanId, traceId, traceFlags, ...restContext }, attributes }) => ({\n span_id: spanId,\n trace_id: traceId,\n sampled: traceFlags === TRACE_FLAG_SAMPLED,\n attributes,\n ...restContext,\n }));\n } else {\n return undefined;\n }\n}\n/**\n *\n * @param links\n * @returns\n */\nexport function getV2SpanLinks(links?: SpanLink[]): SpanLinkJSON<Attributes>[] | undefined {\n if (links?.length) {\n return links.map(({ context: { spanId, traceId, traceFlags, ...restContext }, attributes }) => ({\n span_id: spanId,\n trace_id: traceId,\n sampled: traceFlags === TRACE_FLAG_SAMPLED,\n ...(attributes && { attributes: serializeAttributes(attributes) }),\n ...restContext,\n }));\n } else {\n return undefined;\n }\n}\n\n/**\n * Convert a span time input into a timestamp in seconds.\n */\nexport function spanTimeInputToSeconds(input: SpanTimeInput | undefined): number {\n if (typeof input === 'number') {\n return ensureTimestampInSeconds(input);\n }\n\n if (Array.isArray(input)) {\n // See {@link HrTime} for the array-based time format\n return input[0] + input[1] / 1e9;\n }\n\n if (input instanceof Date) {\n return ensureTimestampInSeconds(input.getTime());\n }\n\n return timestampInSeconds();\n}\n\n/**\n * Converts a timestamp to second, if it was in milliseconds, or keeps it as second.\n */\nfunction ensureTimestampInSeconds(timestamp: number): number {\n const isMs = timestamp > 9999999999;\n return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Convert a span to a JSON representation.\n */\n// Note: Because of this, we currently have a circular type dependency (which we opted out of in package.json).\n// This is not avoidable as we need `spanToJSON` in `spanUtils.ts`, which in turn is needed by `span.ts` for backwards compatibility.\n// And `spanToJSON` needs the Span class from `span.ts` to check here.\nexport function spanToJSON(span: Span): SpanJSON {\n if (spanIsSentrySpan(span)) {\n return span.getSpanJSON();\n }\n\n const { spanId: span_id, traceId: trace_id } = span.spanContext();\n\n // Handle a span from @opentelemetry/sdk-base-trace's `Span` class\n if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {\n const { attributes, startTime, name, endTime, status, links } = span;\n\n // In preparation for the next major of OpenTelemetry, we want to support\n // looking up the parent span id according to the new API\n // In OTel v1, the parent span id is accessed as `parentSpanId`\n // In OTel v2, the parent span id is accessed as `spanId` on the `parentSpanContext`\n const parentSpanId =\n 'parentSpanId' in span\n ? span.parentSpanId\n : 'parentSpanContext' in span\n ? (span.parentSpanContext as { spanId?: string } | undefined)?.spanId\n : undefined;\n\n return {\n span_id,\n trace_id,\n data: attributes,\n description: name,\n parent_span_id: parentSpanId,\n start_timestamp: spanTimeInputToSeconds(startTime),\n // This is [0,0] by default in OTEL, in which case we want to interpret this as no end time\n timestamp: spanTimeInputToSeconds(endTime) || undefined,\n status: getStatusMessage(status),\n op: attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n origin: attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n links: convertSpanLinksForEnvelope(links),\n };\n }\n\n // Finally, at least we have `spanContext()`....\n // This should not actually happen in reality, but we need to handle it for type safety.\n return {\n span_id,\n trace_id,\n start_timestamp: 0,\n data: {},\n };\n}\n\n/**\n * Convert a span to a SpanV2JSON representation.\n * @returns\n */\nexport function spanToV2JSON(span: Span): SpanV2JSON {\n if (spanIsSentrySpan(span)) {\n return span.getSpanV2JSON();\n }\n\n const { spanId: span_id, traceId: trace_id } = span.spanContext();\n\n // Handle a span from @opentelemetry/sdk-base-trace's `Span` class\n if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {\n const { attributes, startTime, name, endTime, status, links } = span;\n\n // In preparation for the next major of OpenTelemetry, we want to support\n // looking up the parent span id according to the new API\n // In OTel v1, the parent span id is accessed as `parentSpanId`\n // In OTel v2, the parent span id is accessed as `spanId` on the `parentSpanContext`\n const parentSpanId =\n 'parentSpanId' in span\n ? span.parentSpanId\n : 'parentSpanContext' in span\n ? (span.parentSpanContext as { spanId?: string } | undefined)?.spanId\n : undefined;\n\n return {\n name,\n span_id,\n trace_id,\n parent_span_id: parentSpanId,\n start_timestamp: spanTimeInputToSeconds(startTime),\n end_timestamp: spanTimeInputToSeconds(endTime),\n is_segment: span === INTERNAL_getSegmentSpan(span),\n status: getV2StatusMessage(status),\n attributes: serializeAttributes(attributes),\n links: getV2SpanLinks(links),\n };\n }\n\n // Finally, as a fallback, at least we have `spanContext()`....\n // This should not actually happen in reality, but we need to handle it for type safety.\n return {\n span_id,\n trace_id,\n start_timestamp: 0,\n name: '',\n end_timestamp: 0,\n status: 'ok',\n is_segment: span === INTERNAL_getSegmentSpan(span),\n };\n}\n\nfunction spanIsOpenTelemetrySdkTraceBaseSpan(span: Span): span is OpenTelemetrySdkTraceBaseSpan {\n const castSpan = span as Partial<OpenTelemetrySdkTraceBaseSpan>;\n return !!castSpan.attributes && !!castSpan.startTime && !!castSpan.name && !!castSpan.endTime && !!castSpan.status;\n}\n\n/** Exported only for tests. */\nexport interface OpenTelemetrySdkTraceBaseSpan extends Span {\n attributes: SpanAttributes;\n startTime: SpanTimeInput;\n name: string;\n status: SpanStatus;\n endTime: SpanTimeInput;\n parentSpanId?: string;\n links?: SpanLink[];\n}\n\n/**\n * Sadly, due to circular dependency checks we cannot actually import the Span class here and check for instanceof.\n * :( So instead we approximate this by checking if it has the `getSpanJSON` method.\n */\nfunction spanIsSentrySpan(span: Span): span is SentrySpan {\n return typeof (span as SentrySpan).getSpanJSON === 'function';\n}\n\n/**\n * Returns true if a span is sampled.\n * In most cases, you should just use `span.isRecording()` instead.\n * However, this has a slightly different semantic, as it also returns false if the span is finished.\n * So in the case where this distinction is important, use this method.\n */\nexport function spanIsSampled(span: Span): boolean {\n // We align our trace flags with the ones OpenTelemetry use\n // So we also check for sampled the same way they do.\n const { traceFlags } = span.spanContext();\n return traceFlags === TRACE_FLAG_SAMPLED;\n}\n\n/** Get the status message to use for a JSON representation of a span. */\nexport function getStatusMessage(status: SpanStatus | undefined): string | undefined {\n if (!status || status.code === SPAN_STATUS_UNSET) {\n return undefined;\n }\n\n if (status.code === SPAN_STATUS_OK) {\n return 'ok';\n }\n\n return status.message || 'internal_error';\n}\n\n/**\n * Convert the various statuses to the ones expected by Sentry ('ok' is default)\n */\nexport function getV2StatusMessage(status: SpanStatus | undefined): 'ok' | 'error' {\n return !status || status.code === SPAN_STATUS_OK || status.code === SPAN_STATUS_UNSET ? 'ok' : 'error';\n}\n\nconst CHILD_SPANS_FIELD = '_sentryChildSpans';\nconst ROOT_SPAN_FIELD = '_sentryRootSpan';\n\ntype SpanWithPotentialChildren = Span & {\n [CHILD_SPANS_FIELD]?: Set<Span>;\n [ROOT_SPAN_FIELD]?: Span;\n};\n\n/**\n * Adds an opaque child span reference to a span.\n */\nexport function addChildSpanToSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n // We store the root span reference on the child span\n // We need this for `getRootSpan()` to work\n const rootSpan = span[ROOT_SPAN_FIELD] || span;\n addNonEnumerableProperty(childSpan as SpanWithPotentialChildren, ROOT_SPAN_FIELD, rootSpan);\n\n // We store a list of child spans on the parent span\n // We need this for `getSpanDescendants()` to work\n if (span[CHILD_SPANS_FIELD]) {\n span[CHILD_SPANS_FIELD].add(childSpan);\n } else {\n addNonEnumerableProperty(span, CHILD_SPANS_FIELD, new Set([childSpan]));\n }\n}\n\n/** This is only used internally by Idle Spans. */\nexport function removeChildSpanFromSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n if (span[CHILD_SPANS_FIELD]) {\n span[CHILD_SPANS_FIELD].delete(childSpan);\n }\n}\n\n/**\n * Returns an array of the given span and all of its descendants.\n */\nexport function getSpanDescendants(span: SpanWithPotentialChildren): Span[] {\n const resultSet = new Set<Span>();\n\n function addSpanChildren(span: SpanWithPotentialChildren): void {\n // This exit condition is required to not infinitely loop in case of a circular dependency.\n if (resultSet.has(span)) {\n return;\n // We want to ignore unsampled spans (e.g. non recording spans)\n } else if (spanIsSampled(span)) {\n resultSet.add(span);\n const childSpans = span[CHILD_SPANS_FIELD] ? Array.from(span[CHILD_SPANS_FIELD]) : [];\n for (const childSpan of childSpans) {\n addSpanChildren(childSpan);\n }\n }\n }\n\n addSpanChildren(span);\n\n return Array.from(resultSet);\n}\n\n/**\n * Returns the root span of a given span.\n */\nexport const getRootSpan = INTERNAL_getSegmentSpan;\n\n/**\n * Returns the segment span of a given span.\n */\nexport function INTERNAL_getSegmentSpan(span: SpanWithPotentialChildren): Span {\n return span[ROOT_SPAN_FIELD] || span;\n}\n\n/**\n * Returns the currently active span.\n */\nexport function getActiveSpan(): Span | undefined {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.getActiveSpan) {\n return acs.getActiveSpan();\n }\n\n return _getSpanForScope(getCurrentScope());\n}\n\n/**\n * Logs a warning once if `beforeSendSpan` is used to drop spans.\n */\nexport function showSpanDropWarning(): void {\n if (!hasShownSpanDropWarning) {\n consoleSandbox(() => {\n // eslint-disable-next-line no-console\n console.warn(\n '[Sentry] Returning null from `beforeSendSpan` is disallowed. To drop certain spans, configure the respective integrations directly or use `ignoreSpans`.',\n );\n });\n hasShownSpanDropWarning = true;\n }\n}\n\n/**\n * Updates the name of the given span and ensures that the span name is not\n * overwritten by the Sentry SDK.\n *\n * Use this function instead of `span.updateName()` if you want to make sure that\n * your name is kept. For some spans, for example root `http.server` spans the\n * Sentry SDK would otherwise overwrite the span name with a high-quality name\n * it infers when the span ends.\n *\n * Use this function in server code or when your span is started on the server\n * and on the client (browser). If you only update a span name on the client,\n * you can also use `span.updateName()` the SDK does not overwrite the name.\n *\n * @param span - The span to update the name of.\n * @param name - The name to set on the span.\n */\nexport function updateSpanName(span: Span, name: string): void {\n span.updateName(name);\n span.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]: name,\n });\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAyBA;AACO,MAAM,eAAA,GAAkB;AACxB,MAAM,kBAAA,GAAqB;;AAElC,IAAI,uBAAA,GAA0B,KAAK;;AAEnC;AACA;AACA;AACA;AACA;AACO,SAAS,6BAA6B,CAAC,IAAI,EAAsB;AACxE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAA,KAAa,IAAI,CAAC,WAAW,EAAE;AACnE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAA,EAAM,GAAI,UAAU,CAAC,IAAI,CAAC;;AAE9E,EAAE,OAAO;AACT,IAAI,cAAc;AAClB,IAAI,OAAO;AACX,IAAI,QAAQ;AACZ,IAAI,IAAI;AACR,IAAI,EAAE;AACN,IAAI,MAAM;AACV,IAAI,MAAM;AACV,IAAI,KAAK;AACT,GAAG;AACH;;AAEA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,IAAI,EAAsB;AAC7D,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAA,KAAa,IAAI,CAAC,WAAW,EAAE;;AAEpE;AACA;AACA,EAAE,MAAM,cAAA,GAAiB,QAAA,GAAW,MAAA,GAAS,UAAU,CAAC,IAAI,CAAC,CAAC,cAAc;AAC5E,EAAE,MAAM,QAAQ,uBAAuB,CAAC,IAAI,CAAC,CAAC,KAAK;;AAEnD,EAAE,MAAM,OAAA,GAAU,QAAA,GAAW,KAAK,EAAE,qBAAqB,EAAE,CAAC,iBAAA,IAAqB,cAAc,EAAC,GAAI,MAAM;;AAE1G,EAAE,OAAO;AACT,IAAI,cAAc;AAClB,IAAI,OAAO;AACX,IAAI,QAAQ;AACZ,GAAG;AACH;;AAEA;AACA;AACA;AACO,SAAS,iBAAiB,CAAC,IAAI,EAAgB;AACtD,EAAE,MAAM,EAAE,OAAO,EAAE,MAAA,EAAO,GAAI,IAAI,CAAC,WAAW,EAAE;AAChD,EAAE,MAAM,OAAA,GAAU,aAAa,CAAC,IAAI,CAAC;AACrC,EAAE,OAAO,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAC5D;;AAEA;AACA;AACA;AACO,SAAS,uBAAuB,CAAC,IAAI,EAAgB;AAC5D,EAAE,MAAM,EAAE,OAAO,EAAE,MAAA,EAAO,GAAI,IAAI,CAAC,WAAW,EAAE;AAChD,EAAE,MAAM,OAAA,GAAU,aAAa,CAAC,IAAI,CAAC;AACrC,EAAE,OAAO,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAC5D;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,2BAA2B,CAAC,KAAK,EAA2C;AAC5F,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE;AACrB,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,WAAA,EAAa,EAAE,UAAA,EAAY,MAAM;AACpG,MAAM,OAAO,EAAE,MAAM;AACrB,MAAM,QAAQ,EAAE,OAAO;AACvB,MAAM,OAAO,EAAE,UAAA,KAAe,kBAAkB;AAChD,MAAM,UAAU;AAChB,MAAM,GAAG,WAAW;AACpB,KAAK,CAAC,CAAC;AACP,EAAE,OAAO;AACT,IAAI,OAAO,SAAS;AACpB,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,KAAK,EAAuD;AAC3F,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE;AACrB,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,WAAA,EAAa,EAAE,UAAA,EAAY,MAAM;AACpG,MAAM,OAAO,EAAE,MAAM;AACrB,MAAM,QAAQ,EAAE,OAAO;AACvB,MAAM,OAAO,EAAE,UAAA,KAAe,kBAAkB;AAChD,MAAM,IAAI,UAAA,IAAc,EAAE,UAAU,EAAE,mBAAmB,CAAC,UAAU,CAAA,EAAG,CAAC;AACxE,MAAM,GAAG,WAAW;AACpB,KAAK,CAAC,CAAC;AACP,EAAE,OAAO;AACT,IAAI,OAAO,SAAS;AACpB,EAAE;AACF;;AAEA;AACA;AACA;AACO,SAAS,sBAAsB,CAAC,KAAK,EAAqC;AACjF,EAAE,IAAI,OAAO,KAAA,KAAU,QAAQ,EAAE;AACjC,IAAI,OAAO,wBAAwB,CAAC,KAAK,CAAC;AAC1C,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC5B;AACA,IAAI,OAAO,KAAK,CAAC,CAAC,CAAA,GAAI,KAAK,CAAC,CAAC,CAAA,GAAI,GAAG;AACpC,EAAE;;AAEF,EAAE,IAAI,KAAA,YAAiB,IAAI,EAAE;AAC7B,IAAI,OAAO,wBAAwB,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;AACpD,EAAE;;AAEF,EAAE,OAAO,kBAAkB,EAAE;AAC7B;;AAEA;AACA;AACA;AACA,SAAS,wBAAwB,CAAC,SAAS,EAAkB;AAC7D,EAAE,MAAM,IAAA,GAAO,SAAA,GAAY,UAAU;AACrC,EAAE,OAAO,IAAA,GAAO,YAAY,IAAA,GAAO,SAAS;AAC5C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,UAAU,CAAC,IAAI,EAAkB;AACjD,EAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE;AAC9B,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE;AAC7B,EAAE;;AAEF,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAA,KAAa,IAAI,CAAC,WAAW,EAAE;;AAEnE;AACA,EAAE,IAAI,mCAAmC,CAAC,IAAI,CAAC,EAAE;AACjD,IAAI,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAA,EAAM,GAAI,IAAI;;AAExE;AACA;AACA;AACA;AACA,IAAI,MAAM,YAAA;AACV,MAAM,kBAAkB;AACxB,UAAU,IAAI,CAAC;AACf,UAAU,uBAAuB;AACjC,YAAY,CAAC,IAAI,CAAC,iBAAA,IAAuD;AACzE,YAAY,SAAS;;AAErB,IAAI,OAAO;AACX,MAAM,OAAO;AACb,MAAM,QAAQ;AACd,MAAM,IAAI,EAAE,UAAU;AACtB,MAAM,WAAW,EAAE,IAAI;AACvB,MAAM,cAAc,EAAE,YAAY;AAClC,MAAM,eAAe,EAAE,sBAAsB,CAAC,SAAS,CAAC;AACxD;AACA,MAAM,SAAS,EAAE,sBAAsB,CAAC,OAAO,CAAA,IAAK,SAAS;AAC7D,MAAM,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC;AACtC,MAAM,EAAE,EAAE,UAAU,CAAC,4BAA4B,CAAC;AAClD,MAAM,MAAM,EAAE,UAAU,CAAC,gCAAgC,CAAA;AACzD,MAAM,KAAK,EAAE,2BAA2B,CAAC,KAAK,CAAC;AAC/C,KAAK;AACL,EAAE;;AAEF;AACA;AACA,EAAE,OAAO;AACT,IAAI,OAAO;AACX,IAAI,QAAQ;AACZ,IAAI,eAAe,EAAE,CAAC;AACtB,IAAI,IAAI,EAAE,EAAE;AACZ,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACO,SAAS,YAAY,CAAC,IAAI,EAAoB;AACrD,EAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE;AAC9B,IAAI,OAAO,IAAI,CAAC,aAAa,EAAE;AAC/B,EAAE;;AAEF,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAA,KAAa,IAAI,CAAC,WAAW,EAAE;;AAEnE;AACA,EAAE,IAAI,mCAAmC,CAAC,IAAI,CAAC,EAAE;AACjD,IAAI,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAA,EAAM,GAAI,IAAI;;AAExE;AACA;AACA;AACA;AACA,IAAI,MAAM,YAAA;AACV,MAAM,kBAAkB;AACxB,UAAU,IAAI,CAAC;AACf,UAAU,uBAAuB;AACjC,YAAY,CAAC,IAAI,CAAC,iBAAA,IAAuD;AACzE,YAAY,SAAS;;AAErB,IAAI,OAAO;AACX,MAAM,IAAI;AACV,MAAM,OAAO;AACb,MAAM,QAAQ;AACd,MAAM,cAAc,EAAE,YAAY;AAClC,MAAM,eAAe,EAAE,sBAAsB,CAAC,SAAS,CAAC;AACxD,MAAM,aAAa,EAAE,sBAAsB,CAAC,OAAO,CAAC;AACpD,MAAM,UAAU,EAAE,IAAA,KAAS,uBAAuB,CAAC,IAAI,CAAC;AACxD,MAAM,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC;AACxC,MAAM,UAAU,EAAE,mBAAmB,CAAC,UAAU,CAAC;AACjD,MAAM,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC;AAClC,KAAK;AACL,EAAE;;AAEF;AACA;AACA,EAAE,OAAO;AACT,IAAI,OAAO;AACX,IAAI,QAAQ;AACZ,IAAI,eAAe,EAAE,CAAC;AACtB,IAAI,IAAI,EAAE,EAAE;AACZ,IAAI,aAAa,EAAE,CAAC;AACpB,IAAI,MAAM,EAAE,IAAI;AAChB,IAAI,UAAU,EAAE,IAAA,KAAS,uBAAuB,CAAC,IAAI,CAAC;AACtD,GAAG;AACH;;AAEA,SAAS,mCAAmC,CAAC,IAAI,EAA+C;AAChG,EAAE,MAAM,QAAA,GAAW,IAAA;AACnB,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAA,IAAc,CAAC,CAAC,QAAQ,CAAC,SAAA,IAAa,CAAC,CAAC,QAAQ,CAAC,IAAA,IAAQ,CAAC,CAAC,QAAQ,CAAC,OAAA,IAAW,CAAC,CAAC,QAAQ,CAAC,MAAM;AACpH;;AAEA;;AAWA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,IAAI,EAA4B;AAC1D,EAAE,OAAO,OAAO,CAAC,IAAA,GAAoB,WAAA,KAAgB,UAAU;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,aAAa,CAAC,IAAI,EAAiB;AACnD;AACA;AACA,EAAE,MAAM,EAAE,UAAA,EAAW,GAAI,IAAI,CAAC,WAAW,EAAE;AAC3C,EAAE,OAAO,UAAA,KAAe,kBAAkB;AAC1C;;AAEA;AACO,SAAS,gBAAgB,CAAC,MAAM,EAA8C;AACrF,EAAE,IAAI,CAAC,MAAA,IAAU,MAAM,CAAC,IAAA,KAAS,iBAAiB,EAAE;AACpD,IAAI,OAAO,SAAS;AACpB,EAAE;;AAEF,EAAE,IAAI,MAAM,CAAC,IAAA,KAAS,cAAc,EAAE;AACtC,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,OAAO,MAAM,CAAC,OAAA,IAAW,gBAAgB;AAC3C;;AAEA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,MAAM,EAA0C;AACnF,EAAE,OAAO,CAAC,MAAA,IAAU,MAAM,CAAC,SAAS,cAAA,IAAkB,MAAM,CAAC,IAAA,KAAS,oBAAoB,IAAA,GAAO,OAAO;AACxG;;AAEA,MAAM,iBAAA,GAAoB,mBAAmB;AAC7C,MAAM,eAAA,GAAkB,iBAAiB;;AAOzC;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,IAAI,EAA6B,SAAS,EAAc;AAC3F;AACA;AACA,EAAE,MAAM,WAAW,IAAI,CAAC,eAAe,CAAA,IAAK,IAAI;AAChD,EAAE,wBAAwB,CAAC,SAAA,GAAwC,eAAe,EAAE,QAAQ,CAAC;;AAE7F;AACA;AACA,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAC/B,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1C,EAAE,OAAO;AACT,IAAI,wBAAwB,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3E,EAAE;AACF;;AAEA;AACO,SAAS,uBAAuB,CAAC,IAAI,EAA6B,SAAS,EAAc;AAChG,EAAE,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE;AAC/B,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;AAC7C,EAAE;AACF;;AAEA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,IAAI,EAAqC;AAC5E,EAAE,MAAM,SAAA,GAAY,IAAI,GAAG,EAAQ;;AAEnC,EAAE,SAAS,eAAe,CAAC,IAAI,EAAmC;AAClE;AACA,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC7B,MAAM;AACN;AACA,IAAI,CAAA,MAAO,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;AACpC,MAAM,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,MAAM,MAAM,UAAA,GAAa,IAAI,CAAC,iBAAiB,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA,GAAI,EAAE;AAC3F,MAAM,KAAK,MAAM,SAAA,IAAa,UAAU,EAAE;AAC1C,QAAQ,eAAe,CAAC,SAAS,CAAC;AAClC,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,eAAe,CAAC,IAAI,CAAC;;AAEvB,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AAC9B;;AAEA;AACA;AACA;AACO,MAAM,WAAA,GAAc;;AAE3B;AACA;AACA;AACO,SAAS,uBAAuB,CAAC,IAAI,EAAmC;AAC/E,EAAE,OAAO,IAAI,CAAC,eAAe,CAAA,IAAK,IAAI;AACtC;;AAEA;AACA;AACA;AACO,SAAS,aAAa,GAAqB;AAClD,EAAE,MAAM,OAAA,GAAU,cAAc,EAAE;AAClC,EAAE,MAAM,GAAA,GAAM,uBAAuB,CAAC,OAAO,CAAC;AAC9C,EAAE,IAAI,GAAG,CAAC,aAAa,EAAE;AACzB,IAAI,OAAO,GAAG,CAAC,aAAa,EAAE;AAC9B,EAAE;;AAEF,EAAE,OAAO,gBAAgB,CAAC,eAAe,EAAE,CAAC;AAC5C;;AAEA;AACA;AACA;AACO,SAAS,mBAAmB,GAAS;AAC5C,EAAE,IAAI,CAAC,uBAAuB,EAAE;AAChC,IAAI,cAAc,CAAC,MAAM;AACzB;AACA,MAAM,OAAO,CAAC,IAAI;AAClB,QAAQ,0JAA0J;AAClK,OAAO;AACP,IAAI,CAAC,CAAC;AACN,IAAI,uBAAA,GAA0B,IAAI;AAClC,EAAE;AACF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,cAAc,CAAC,IAAI,EAAQ,IAAI,EAAgB;AAC/D,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACvB,EAAE,IAAI,CAAC,aAAa,CAAC;AACrB,IAAI,CAAC,gCAAgC,GAAG,QAAQ;AAChD,IAAI,CAAC,0CAA0C,GAAG,IAAI;AACtD,GAAG,CAAC;AACJ;;;;"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Calls `unref` on a timer, if the method is available on @param timer.
3
+ *
4
+ * `unref()` is used to allow processes to exit immediately, even if the timer
5
+ * is still running and hasn't resolved yet.
6
+ *
7
+ * Use this in places where code can run on browser or server, since browsers
8
+ * do not support `unref`.
9
+ */
10
+ function safeUnref(timer) {
11
+ if (typeof timer === 'object' && typeof timer.unref === 'function') {
12
+ timer.unref();
13
+ }
14
+ return timer;
15
+ }
16
+
17
+ export { safeUnref };
18
+ //# sourceMappingURL=timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.js","sources":["../../../src/utils/timer.ts"],"sourcesContent":["/**\n * Calls `unref` on a timer, if the method is available on @param timer.\n *\n * `unref()` is used to allow processes to exit immediately, even if the timer\n * is still running and hasn't resolved yet.\n *\n * Use this in places where code can run on browser or server, since browsers\n * do not support `unref`.\n */\nexport function safeUnref(timer: ReturnType<typeof setTimeout>): ReturnType<typeof setTimeout> {\n if (typeof timer === 'object' && typeof timer.unref === 'function') {\n timer.unref();\n }\n return timer;\n}\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,SAAS,CAAC,KAAK,EAAgE;AAC/F,EAAE,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAK,CAAC,KAAA,KAAU,UAAU,EAAE;AACtE,IAAI,KAAK,CAAC,KAAK,EAAE;AACjB,EAAE;AACF,EAAE,OAAO,KAAK;AACd;;;;"}
@@ -0,0 +1,36 @@
1
+ import { DEBUG_BUILD } from '../debug-build.js';
2
+ import { debug } from './debug-logger.js';
3
+ import { stringMatchesSomePattern } from './string.js';
4
+
5
+ const NOT_PROPAGATED_MESSAGE =
6
+ '[Tracing] Not injecting trace data for url because it does not match tracePropagationTargets:';
7
+
8
+ /**
9
+ * Check if a given URL should be propagated to or not.
10
+ * If no url is defined, or no trace propagation targets are defined, this will always return `true`.
11
+ * You can also optionally provide a decision map, to cache decisions and avoid repeated regex lookups.
12
+ */
13
+ function shouldPropagateTraceForUrl(
14
+ url,
15
+ tracePropagationTargets,
16
+ decisionMap,
17
+ ) {
18
+ if (typeof url !== 'string' || !tracePropagationTargets) {
19
+ return true;
20
+ }
21
+
22
+ const cachedDecision = decisionMap?.get(url);
23
+ if (cachedDecision !== undefined) {
24
+ DEBUG_BUILD && !cachedDecision && debug.log(NOT_PROPAGATED_MESSAGE, url);
25
+ return cachedDecision;
26
+ }
27
+
28
+ const decision = stringMatchesSomePattern(url, tracePropagationTargets);
29
+ decisionMap?.set(url, decision);
30
+
31
+ DEBUG_BUILD && !decision && debug.log(NOT_PROPAGATED_MESSAGE, url);
32
+ return decision;
33
+ }
34
+
35
+ export { shouldPropagateTraceForUrl };
36
+ //# sourceMappingURL=tracePropagationTargets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracePropagationTargets.js","sources":["../../../src/utils/tracePropagationTargets.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport type { CoreOptions as Options } from '../types-hoist/options';\nimport { debug } from './debug-logger';\nimport type { LRUMap } from './lru';\nimport { stringMatchesSomePattern } from './string';\n\nconst NOT_PROPAGATED_MESSAGE =\n '[Tracing] Not injecting trace data for url because it does not match tracePropagationTargets:';\n\n/**\n * Check if a given URL should be propagated to or not.\n * If no url is defined, or no trace propagation targets are defined, this will always return `true`.\n * You can also optionally provide a decision map, to cache decisions and avoid repeated regex lookups.\n */\nexport function shouldPropagateTraceForUrl(\n url: string | undefined,\n tracePropagationTargets: Options['tracePropagationTargets'],\n decisionMap?: LRUMap<string, boolean>,\n): boolean {\n if (typeof url !== 'string' || !tracePropagationTargets) {\n return true;\n }\n\n const cachedDecision = decisionMap?.get(url);\n if (cachedDecision !== undefined) {\n DEBUG_BUILD && !cachedDecision && debug.log(NOT_PROPAGATED_MESSAGE, url);\n return cachedDecision;\n }\n\n const decision = stringMatchesSomePattern(url, tracePropagationTargets);\n decisionMap?.set(url, decision);\n\n DEBUG_BUILD && !decision && debug.log(NOT_PROPAGATED_MESSAGE, url);\n return decision;\n}\n"],"names":[],"mappings":";;;;AAMA,MAAM,sBAAA;AACN,EAAE,+FAA+F;;AAEjG;AACA;AACA;AACA;AACA;AACO,SAAS,0BAA0B;AAC1C,EAAE,GAAG;AACL,EAAE,uBAAuB;AACzB,EAAE,WAAW;AACb,EAAW;AACX,EAAE,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,uBAAuB,EAAE;AAC3D,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,MAAM,iBAAiB,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC;AAC9C,EAAE,IAAI,cAAA,KAAmB,SAAS,EAAE;AACpC,IAAI,WAAA,IAAe,CAAC,cAAA,IAAkB,KAAK,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC;AAC5E,IAAI,OAAO,cAAc;AACzB,EAAE;;AAEF,EAAE,MAAM,WAAW,wBAAwB,CAAC,GAAG,EAAE,uBAAuB,CAAC;AACzE,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;;AAEjC,EAAE,WAAA,IAAe,CAAC,QAAA,IAAY,KAAK,CAAC,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC;AACpE,EAAE,OAAO,QAAQ;AACjB;;;;"}
@@ -1,6 +1,6 @@
1
1
  // This is a magic string replaced by rollup
2
2
 
3
- const SDK_VERSION = "10.37.0" ;
3
+ const SDK_VERSION = "10.39.0-alpha.0" ;
4
4
 
5
5
  export { SDK_VERSION };
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sources":["../../../src/utils/version.ts"],"sourcesContent":["// This is a magic string replaced by rollup\ndeclare const __SENTRY_SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SENTRY_SDK_VERSION__ === 'string' ? __SENTRY_SDK_VERSION__ : '0.0.0-unknown.0';\n"],"names":[],"mappings":"AAAA;;AAGO,MAAM,WAAA,GAA2D,SAAA;;;;"}
1
+ {"version":3,"file":"version.js","sources":["../../../src/utils/version.ts"],"sourcesContent":["// This is a magic string replaced by rollup\ndeclare const __SENTRY_SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SENTRY_SDK_VERSION__ === 'string' ? __SENTRY_SDK_VERSION__ : '0.0.0-unknown.0';\n"],"names":[],"mappings":"AAAA;;AAGO,MAAM,WAAA,GAA2D,iBAAA;;;;"}
@@ -30,7 +30,7 @@ export type AttributeObject = {
30
30
  value: unknown;
31
31
  unit?: AttributeUnit;
32
32
  };
33
- type AttributeUnit = DurationUnit | InformationUnit | FractionUnit;
33
+ export type AttributeUnit = DurationUnit | InformationUnit | FractionUnit;
34
34
  export type ValidatedAttributes<T> = {
35
35
  [K in keyof T]: T[K] extends {
36
36
  value: any;
@@ -1 +1 @@
1
- {"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/attributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE7F,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAE1D,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,KAAK,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,GAAG,eAAe,GAAG,CAAC,CAAC;AAE7F,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AAE5G,KAAK,gBAAgB,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;CAC7B,CAAC;AAOF,KAAK,cAAc,GAAG;KACnB,CAAC,IAAI,MAAM,gBAAgB,GAAG;QAC7B,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC;KACT;CACF,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAE1B,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAAE,IAAI,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,CAAC;AAIF,KAAK,aAAa,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,CAAC;AAGnE,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;KAElC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,eAAe,GAAG,OAAO;CACxF,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,eAAe,CAOhF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,OAAO,GAAG,gBAAgB,GACvC,mBAAmB,GAAG,IAAI,CA0B5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,EACxC,QAAQ,GAAE,OAAO,GAAG,gBAAwB,GAC3C,UAAU,CASZ"}
1
+ {"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/attributes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE7F,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAE1D,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,KAAK,EAAE,GAAG,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,GAAG,CAAA;CAAE,GAAG,eAAe,GAAG,CAAC,CAAC;AAE7F,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AAE5G,KAAK,gBAAgB,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;CAC7B,CAAC;AAOF,KAAK,cAAc,GAAG;KACnB,CAAC,IAAI,MAAM,gBAAgB,GAAG;QAC7B,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC;KACT;CACF,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAE1B,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG;IAAE,IAAI,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AAE5E,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,CAAC;AAIF,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,eAAe,GAAG,YAAY,CAAC;AAG1E,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;KAElC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,KAAK,EAAE,GAAG,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,GAAG,CAAA;KAAE,GAAG,eAAe,GAAG,OAAO;CACxF,CAAC;AAEF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,eAAe,CAOhF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,OAAO,EACjB,WAAW,CAAC,EAAE,OAAO,GAAG,gBAAgB,GACvC,mBAAmB,GAAG,IAAI,CA0B5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,EACxC,QAAQ,GAAE,OAAO,GAAG,gBAAwB,GAC3C,UAAU,CASZ"}