@sentry/core 10.46.0 → 10.48.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 (381) hide show
  1. package/build/cjs/api.js +1 -0
  2. package/build/cjs/api.js.map +1 -1
  3. package/build/cjs/attributes.js +43 -0
  4. package/build/cjs/attributes.js.map +1 -1
  5. package/build/cjs/client.js +13 -6
  6. package/build/cjs/client.js.map +1 -1
  7. package/build/cjs/currentScopes.js +33 -0
  8. package/build/cjs/currentScopes.js.map +1 -1
  9. package/build/cjs/envelope.js +4 -3
  10. package/build/cjs/envelope.js.map +1 -1
  11. package/build/cjs/index.js +50 -13
  12. package/build/cjs/index.js.map +1 -1
  13. package/build/cjs/integration.js +6 -0
  14. package/build/cjs/integration.js.map +1 -1
  15. package/build/cjs/integrations/express/index.js +206 -0
  16. package/build/cjs/integrations/express/index.js.map +1 -0
  17. package/build/cjs/integrations/express/patch-layer.js +251 -0
  18. package/build/cjs/integrations/express/patch-layer.js.map +1 -0
  19. package/build/cjs/integrations/express/request-layer-store.js +25 -0
  20. package/build/cjs/integrations/express/request-layer-store.js.map +1 -0
  21. package/build/cjs/integrations/express/set-sdk-processing-metadata.js +17 -0
  22. package/build/cjs/integrations/express/set-sdk-processing-metadata.js.map +1 -0
  23. package/build/cjs/integrations/express/types.js +17 -0
  24. package/build/cjs/integrations/express/types.js.map +1 -0
  25. package/build/cjs/integrations/express/utils.js +238 -0
  26. package/build/cjs/integrations/express/utils.js.map +1 -0
  27. package/build/cjs/integrations/mcp-server/correlation.js +5 -1
  28. package/build/cjs/integrations/mcp-server/correlation.js.map +1 -1
  29. package/build/cjs/integrations/mcp-server/handlers.js +18 -10
  30. package/build/cjs/integrations/mcp-server/handlers.js.map +1 -1
  31. package/build/cjs/integrations/mcp-server/index.js +2 -1
  32. package/build/cjs/integrations/mcp-server/index.js.map +1 -1
  33. package/build/cjs/integrations/mcp-server/transport.js +1 -1
  34. package/build/cjs/integrations/mcp-server/transport.js.map +1 -1
  35. package/build/cjs/integrations/mcp-server/validation.js +7 -5
  36. package/build/cjs/integrations/mcp-server/validation.js.map +1 -1
  37. package/build/cjs/integrations/spanStreaming.js +48 -0
  38. package/build/cjs/integrations/spanStreaming.js.map +1 -0
  39. package/build/cjs/integrations/supabase.js +1 -1
  40. package/build/cjs/integrations/supabase.js.map +1 -1
  41. package/build/cjs/semanticAttributes.js +35 -3
  42. package/build/cjs/semanticAttributes.js.map +1 -1
  43. package/build/cjs/tracing/ai/gen-ai-attributes.js +9 -79
  44. package/build/cjs/tracing/ai/gen-ai-attributes.js.map +1 -1
  45. package/build/cjs/tracing/ai/utils.js +50 -35
  46. package/build/cjs/tracing/ai/utils.js.map +1 -1
  47. package/build/cjs/tracing/anthropic-ai/constants.js +10 -10
  48. package/build/cjs/tracing/anthropic-ai/constants.js.map +1 -1
  49. package/build/cjs/tracing/anthropic-ai/index.js +18 -20
  50. package/build/cjs/tracing/anthropic-ai/index.js.map +1 -1
  51. package/build/cjs/tracing/anthropic-ai/streaming.js +2 -100
  52. package/build/cjs/tracing/anthropic-ai/streaming.js.map +1 -1
  53. package/build/cjs/tracing/anthropic-ai/utils.js +0 -9
  54. package/build/cjs/tracing/anthropic-ai/utils.js.map +1 -1
  55. package/build/cjs/tracing/dynamicSamplingContext.js +2 -1
  56. package/build/cjs/tracing/dynamicSamplingContext.js.map +1 -1
  57. package/build/cjs/tracing/google-genai/constants.js +9 -12
  58. package/build/cjs/tracing/google-genai/constants.js.map +1 -1
  59. package/build/cjs/tracing/google-genai/index.js +49 -27
  60. package/build/cjs/tracing/google-genai/index.js.map +1 -1
  61. package/build/cjs/tracing/google-genai/streaming.js +2 -23
  62. package/build/cjs/tracing/google-genai/streaming.js.map +1 -1
  63. package/build/cjs/tracing/google-genai/utils.js +0 -25
  64. package/build/cjs/tracing/google-genai/utils.js.map +1 -1
  65. package/build/cjs/tracing/langchain/embeddings.js +132 -0
  66. package/build/cjs/tracing/langchain/embeddings.js.map +1 -0
  67. package/build/cjs/tracing/langchain/index.js.map +1 -1
  68. package/build/cjs/tracing/openai/constants.js +7 -7
  69. package/build/cjs/tracing/openai/constants.js.map +1 -1
  70. package/build/cjs/tracing/openai/index.js +19 -37
  71. package/build/cjs/tracing/openai/index.js.map +1 -1
  72. package/build/cjs/tracing/openai/streaming.js +3 -34
  73. package/build/cjs/tracing/openai/streaming.js.map +1 -1
  74. package/build/cjs/tracing/openai/utils.js +78 -243
  75. package/build/cjs/tracing/openai/utils.js.map +1 -1
  76. package/build/cjs/tracing/sentryNonRecordingSpan.js +7 -0
  77. package/build/cjs/tracing/sentryNonRecordingSpan.js.map +1 -1
  78. package/build/cjs/tracing/sentrySpan.js +39 -0
  79. package/build/cjs/tracing/sentrySpan.js.map +1 -1
  80. package/build/cjs/tracing/spans/beforeSendSpan.js +43 -0
  81. package/build/cjs/tracing/spans/beforeSendSpan.js.map +1 -0
  82. package/build/cjs/tracing/spans/captureSpan.js +126 -0
  83. package/build/cjs/tracing/spans/captureSpan.js.map +1 -0
  84. package/build/cjs/tracing/spans/envelope.js +38 -0
  85. package/build/cjs/tracing/spans/envelope.js.map +1 -0
  86. package/build/cjs/tracing/spans/estimateSize.js +41 -0
  87. package/build/cjs/tracing/spans/estimateSize.js.map +1 -0
  88. package/build/cjs/tracing/spans/hasSpanStreamingEnabled.js +11 -0
  89. package/build/cjs/tracing/spans/hasSpanStreamingEnabled.js.map +1 -0
  90. package/build/cjs/tracing/spans/spanBuffer.js +158 -0
  91. package/build/cjs/tracing/spans/spanBuffer.js.map +1 -0
  92. package/build/cjs/tracing/trace.js +88 -13
  93. package/build/cjs/tracing/trace.js.map +1 -1
  94. package/build/cjs/tracing/vercel-ai/utils.js +1 -4
  95. package/build/cjs/tracing/vercel-ai/utils.js.map +1 -1
  96. package/build/cjs/utils/featureFlags.js +6 -0
  97. package/build/cjs/utils/featureFlags.js.map +1 -1
  98. package/build/cjs/utils/object.js +33 -0
  99. package/build/cjs/utils/object.js.map +1 -1
  100. package/build/cjs/utils/spanUtils.js +116 -13
  101. package/build/cjs/utils/spanUtils.js.map +1 -1
  102. package/build/cjs/utils/stacktrace.js +3 -1
  103. package/build/cjs/utils/stacktrace.js.map +1 -1
  104. package/build/cjs/utils/string.js +3 -0
  105. package/build/cjs/utils/string.js.map +1 -1
  106. package/build/cjs/utils/traceData.js +11 -0
  107. package/build/cjs/utils/traceData.js.map +1 -1
  108. package/build/cjs/utils/version.js +1 -1
  109. package/build/esm/api.js +1 -1
  110. package/build/esm/api.js.map +1 -1
  111. package/build/esm/attributes.js +43 -1
  112. package/build/esm/attributes.js.map +1 -1
  113. package/build/esm/client.js +8 -1
  114. package/build/esm/client.js.map +1 -1
  115. package/build/esm/currentScopes.js +31 -1
  116. package/build/esm/currentScopes.js.map +1 -1
  117. package/build/esm/envelope.js +2 -1
  118. package/build/esm/envelope.js.map +1 -1
  119. package/build/esm/index.js +13 -4
  120. package/build/esm/index.js.map +1 -1
  121. package/build/esm/integration.js +6 -0
  122. package/build/esm/integration.js.map +1 -1
  123. package/build/esm/integrations/express/index.js +202 -0
  124. package/build/esm/integrations/express/index.js.map +1 -0
  125. package/build/esm/integrations/express/patch-layer.js +249 -0
  126. package/build/esm/integrations/express/patch-layer.js.map +1 -0
  127. package/build/esm/integrations/express/request-layer-store.js +22 -0
  128. package/build/esm/integrations/express/request-layer-store.js.map +1 -0
  129. package/build/esm/integrations/express/set-sdk-processing-metadata.js +15 -0
  130. package/build/esm/integrations/express/set-sdk-processing-metadata.js.map +1 -0
  131. package/build/esm/integrations/express/types.js +10 -0
  132. package/build/esm/integrations/express/types.js.map +1 -0
  133. package/build/esm/integrations/express/utils.js +225 -0
  134. package/build/esm/integrations/express/utils.js.map +1 -0
  135. package/build/esm/integrations/mcp-server/correlation.js +5 -1
  136. package/build/esm/integrations/mcp-server/correlation.js.map +1 -1
  137. package/build/esm/integrations/mcp-server/handlers.js +18 -10
  138. package/build/esm/integrations/mcp-server/handlers.js.map +1 -1
  139. package/build/esm/integrations/mcp-server/index.js +2 -1
  140. package/build/esm/integrations/mcp-server/index.js.map +1 -1
  141. package/build/esm/integrations/mcp-server/transport.js +1 -1
  142. package/build/esm/integrations/mcp-server/transport.js.map +1 -1
  143. package/build/esm/integrations/mcp-server/validation.js +7 -5
  144. package/build/esm/integrations/mcp-server/validation.js.map +1 -1
  145. package/build/esm/integrations/spanStreaming.js +46 -0
  146. package/build/esm/integrations/spanStreaming.js.map +1 -0
  147. package/build/esm/integrations/supabase.js +1 -1
  148. package/build/esm/integrations/supabase.js.map +1 -1
  149. package/build/esm/package.json +1 -1
  150. package/build/esm/semanticAttributes.js +26 -4
  151. package/build/esm/semanticAttributes.js.map +1 -1
  152. package/build/esm/tracing/ai/gen-ai-attributes.js +8 -69
  153. package/build/esm/tracing/ai/gen-ai-attributes.js.map +1 -1
  154. package/build/esm/tracing/ai/utils.js +51 -35
  155. package/build/esm/tracing/ai/utils.js.map +1 -1
  156. package/build/esm/tracing/anthropic-ai/constants.js +10 -10
  157. package/build/esm/tracing/anthropic-ai/constants.js.map +1 -1
  158. package/build/esm/tracing/anthropic-ai/index.js +21 -23
  159. package/build/esm/tracing/anthropic-ai/index.js.map +1 -1
  160. package/build/esm/tracing/anthropic-ai/streaming.js +3 -101
  161. package/build/esm/tracing/anthropic-ai/streaming.js.map +1 -1
  162. package/build/esm/tracing/anthropic-ai/utils.js +1 -9
  163. package/build/esm/tracing/anthropic-ai/utils.js.map +1 -1
  164. package/build/esm/tracing/dynamicSamplingContext.js +2 -1
  165. package/build/esm/tracing/dynamicSamplingContext.js.map +1 -1
  166. package/build/esm/tracing/google-genai/constants.js +9 -10
  167. package/build/esm/tracing/google-genai/constants.js.map +1 -1
  168. package/build/esm/tracing/google-genai/index.js +53 -31
  169. package/build/esm/tracing/google-genai/index.js.map +1 -1
  170. package/build/esm/tracing/google-genai/streaming.js +2 -23
  171. package/build/esm/tracing/google-genai/streaming.js.map +1 -1
  172. package/build/esm/tracing/google-genai/utils.js +1 -24
  173. package/build/esm/tracing/google-genai/utils.js.map +1 -1
  174. package/build/esm/tracing/langchain/embeddings.js +129 -0
  175. package/build/esm/tracing/langchain/embeddings.js.map +1 -0
  176. package/build/esm/tracing/langchain/index.js.map +1 -1
  177. package/build/esm/tracing/openai/constants.js +7 -7
  178. package/build/esm/tracing/openai/constants.js.map +1 -1
  179. package/build/esm/tracing/openai/index.js +21 -39
  180. package/build/esm/tracing/openai/index.js.map +1 -1
  181. package/build/esm/tracing/openai/streaming.js +4 -35
  182. package/build/esm/tracing/openai/streaming.js.map +1 -1
  183. package/build/esm/tracing/openai/utils.js +79 -232
  184. package/build/esm/tracing/openai/utils.js.map +1 -1
  185. package/build/esm/tracing/sentryNonRecordingSpan.js +7 -0
  186. package/build/esm/tracing/sentryNonRecordingSpan.js.map +1 -1
  187. package/build/esm/tracing/sentrySpan.js +40 -1
  188. package/build/esm/tracing/sentrySpan.js.map +1 -1
  189. package/build/esm/tracing/spans/beforeSendSpan.js +40 -0
  190. package/build/esm/tracing/spans/beforeSendSpan.js.map +1 -0
  191. package/build/esm/tracing/spans/captureSpan.js +122 -0
  192. package/build/esm/tracing/spans/captureSpan.js.map +1 -0
  193. package/build/esm/tracing/spans/envelope.js +36 -0
  194. package/build/esm/tracing/spans/envelope.js.map +1 -0
  195. package/build/esm/tracing/spans/estimateSize.js +39 -0
  196. package/build/esm/tracing/spans/estimateSize.js.map +1 -0
  197. package/build/esm/tracing/spans/hasSpanStreamingEnabled.js +9 -0
  198. package/build/esm/tracing/spans/hasSpanStreamingEnabled.js.map +1 -0
  199. package/build/esm/tracing/spans/spanBuffer.js +156 -0
  200. package/build/esm/tracing/spans/spanBuffer.js.map +1 -0
  201. package/build/esm/tracing/trace.js +89 -14
  202. package/build/esm/tracing/trace.js.map +1 -1
  203. package/build/esm/tracing/vercel-ai/utils.js +2 -5
  204. package/build/esm/tracing/vercel-ai/utils.js.map +1 -1
  205. package/build/esm/utils/featureFlags.js +6 -0
  206. package/build/esm/utils/featureFlags.js.map +1 -1
  207. package/build/esm/utils/object.js +33 -1
  208. package/build/esm/utils/object.js.map +1 -1
  209. package/build/esm/utils/spanUtils.js +112 -14
  210. package/build/esm/utils/spanUtils.js.map +1 -1
  211. package/build/esm/utils/stacktrace.js +3 -1
  212. package/build/esm/utils/stacktrace.js.map +1 -1
  213. package/build/esm/utils/string.js +3 -0
  214. package/build/esm/utils/string.js.map +1 -1
  215. package/build/esm/utils/traceData.js +12 -1
  216. package/build/esm/utils/traceData.js.map +1 -1
  217. package/build/esm/utils/version.js +1 -1
  218. package/build/types/api.d.ts +1 -0
  219. package/build/types/api.d.ts.map +1 -1
  220. package/build/types/asyncContext/types.d.ts +3 -1
  221. package/build/types/asyncContext/types.d.ts.map +1 -1
  222. package/build/types/attributes.d.ts +5 -0
  223. package/build/types/attributes.d.ts.map +1 -1
  224. package/build/types/client.d.ts +35 -1
  225. package/build/types/client.d.ts.map +1 -1
  226. package/build/types/currentScopes.d.ts +20 -0
  227. package/build/types/currentScopes.d.ts.map +1 -1
  228. package/build/types/envelope.d.ts.map +1 -1
  229. package/build/types/index.d.ts +15 -6
  230. package/build/types/index.d.ts.map +1 -1
  231. package/build/types/integration.d.ts.map +1 -1
  232. package/build/types/integrations/express/index.d.ts +75 -0
  233. package/build/types/integrations/express/index.d.ts.map +1 -0
  234. package/build/types/integrations/express/patch-layer.d.ts +32 -0
  235. package/build/types/integrations/express/patch-layer.d.ts.map +1 -0
  236. package/build/types/integrations/express/request-layer-store.d.ts +32 -0
  237. package/build/types/integrations/express/request-layer-store.d.ts.map +1 -0
  238. package/build/types/integrations/express/set-sdk-processing-metadata.d.ts +35 -0
  239. package/build/types/integrations/express/set-sdk-processing-metadata.d.ts.map +1 -0
  240. package/build/types/integrations/express/types.d.ts +154 -0
  241. package/build/types/integrations/express/types.d.ts.map +1 -0
  242. package/build/types/integrations/express/utils.d.ts +93 -0
  243. package/build/types/integrations/express/utils.d.ts.map +1 -0
  244. package/build/types/integrations/mcp-server/correlation.d.ts +2 -1
  245. package/build/types/integrations/mcp-server/correlation.d.ts.map +1 -1
  246. package/build/types/integrations/mcp-server/handlers.d.ts +9 -4
  247. package/build/types/integrations/mcp-server/handlers.d.ts.map +1 -1
  248. package/build/types/integrations/mcp-server/index.d.ts +2 -1
  249. package/build/types/integrations/mcp-server/index.d.ts.map +1 -1
  250. package/build/types/integrations/mcp-server/types.d.ts +40 -7
  251. package/build/types/integrations/mcp-server/types.d.ts.map +1 -1
  252. package/build/types/integrations/mcp-server/validation.d.ts +4 -1
  253. package/build/types/integrations/mcp-server/validation.d.ts.map +1 -1
  254. package/build/types/integrations/spanStreaming.d.ts +2 -0
  255. package/build/types/integrations/spanStreaming.d.ts.map +1 -0
  256. package/build/types/semanticAttributes.d.ts +23 -3
  257. package/build/types/semanticAttributes.d.ts.map +1 -1
  258. package/build/types/tracing/ai/gen-ai-attributes.d.ts +6 -46
  259. package/build/types/tracing/ai/gen-ai-attributes.d.ts.map +1 -1
  260. package/build/types/tracing/ai/utils.d.ts +34 -9
  261. package/build/types/tracing/ai/utils.d.ts.map +1 -1
  262. package/build/types/tracing/anthropic-ai/constants.d.ts +24 -1
  263. package/build/types/tracing/anthropic-ai/constants.d.ts.map +1 -1
  264. package/build/types/tracing/anthropic-ai/index.d.ts.map +1 -1
  265. package/build/types/tracing/anthropic-ai/streaming.d.ts.map +1 -1
  266. package/build/types/tracing/anthropic-ai/types.d.ts +5 -2
  267. package/build/types/tracing/anthropic-ai/types.d.ts.map +1 -1
  268. package/build/types/tracing/anthropic-ai/utils.d.ts +1 -5
  269. package/build/types/tracing/anthropic-ai/utils.d.ts.map +1 -1
  270. package/build/types/tracing/dynamicSamplingContext.d.ts.map +1 -1
  271. package/build/types/tracing/google-genai/constants.d.ts +22 -3
  272. package/build/types/tracing/google-genai/constants.d.ts.map +1 -1
  273. package/build/types/tracing/google-genai/index.d.ts.map +1 -1
  274. package/build/types/tracing/google-genai/streaming.d.ts.map +1 -1
  275. package/build/types/tracing/google-genai/types.d.ts +6 -2
  276. package/build/types/tracing/google-genai/types.d.ts.map +1 -1
  277. package/build/types/tracing/google-genai/utils.d.ts +0 -9
  278. package/build/types/tracing/google-genai/utils.d.ts.map +1 -1
  279. package/build/types/tracing/index.d.ts +1 -0
  280. package/build/types/tracing/index.d.ts.map +1 -1
  281. package/build/types/tracing/langchain/embeddings.d.ts +27 -0
  282. package/build/types/tracing/langchain/embeddings.d.ts.map +1 -0
  283. package/build/types/tracing/langchain/index.d.ts +1 -0
  284. package/build/types/tracing/langchain/index.d.ts.map +1 -1
  285. package/build/types/tracing/openai/constants.d.ts +14 -1
  286. package/build/types/tracing/openai/constants.d.ts.map +1 -1
  287. package/build/types/tracing/openai/index.d.ts.map +1 -1
  288. package/build/types/tracing/openai/streaming.d.ts.map +1 -1
  289. package/build/types/tracing/openai/types.d.ts +5 -2
  290. package/build/types/tracing/openai/types.d.ts.map +1 -1
  291. package/build/types/tracing/openai/utils.d.ts +4 -63
  292. package/build/types/tracing/openai/utils.d.ts.map +1 -1
  293. package/build/types/tracing/sentryNonRecordingSpan.d.ts +12 -1
  294. package/build/types/tracing/sentryNonRecordingSpan.d.ts.map +1 -1
  295. package/build/types/tracing/sentrySpan.d.ts +10 -1
  296. package/build/types/tracing/sentrySpan.d.ts.map +1 -1
  297. package/build/types/tracing/spans/beforeSendSpan.d.ts +35 -0
  298. package/build/types/tracing/spans/beforeSendSpan.d.ts.map +1 -0
  299. package/build/types/tracing/spans/captureSpan.d.ts +26 -0
  300. package/build/types/tracing/spans/captureSpan.d.ts.map +1 -0
  301. package/build/types/tracing/spans/envelope.d.ts +8 -0
  302. package/build/types/tracing/spans/envelope.d.ts.map +1 -0
  303. package/build/types/tracing/spans/estimateSize.d.ts +12 -0
  304. package/build/types/tracing/spans/estimateSize.d.ts.map +1 -0
  305. package/build/types/tracing/spans/hasSpanStreamingEnabled.d.ts +6 -0
  306. package/build/types/tracing/spans/hasSpanStreamingEnabled.d.ts.map +1 -0
  307. package/build/types/tracing/spans/spanBuffer.d.ts +60 -0
  308. package/build/types/tracing/spans/spanBuffer.d.ts.map +1 -0
  309. package/build/types/tracing/trace.d.ts.map +1 -1
  310. package/build/types/tracing/vercel-ai/utils.d.ts.map +1 -1
  311. package/build/types/types-hoist/envelope.d.ts +22 -2
  312. package/build/types/types-hoist/envelope.d.ts.map +1 -1
  313. package/build/types/types-hoist/integration.d.ts +8 -0
  314. package/build/types/types-hoist/integration.d.ts.map +1 -1
  315. package/build/types/types-hoist/link.d.ts +2 -2
  316. package/build/types/types-hoist/link.d.ts.map +1 -1
  317. package/build/types/types-hoist/options.d.ts +26 -2
  318. package/build/types/types-hoist/options.d.ts.map +1 -1
  319. package/build/types/types-hoist/span.d.ts +35 -0
  320. package/build/types/types-hoist/span.d.ts.map +1 -1
  321. package/build/types/utils/featureFlags.d.ts.map +1 -1
  322. package/build/types/utils/object.d.ts +10 -0
  323. package/build/types/utils/object.d.ts.map +1 -1
  324. package/build/types/utils/spanUtils.d.ts +27 -2
  325. package/build/types/utils/spanUtils.d.ts.map +1 -1
  326. package/build/types/utils/stacktrace.d.ts.map +1 -1
  327. package/build/types/utils/string.d.ts +2 -2
  328. package/build/types/utils/string.d.ts.map +1 -1
  329. package/build/types/utils/traceData.d.ts +4 -0
  330. package/build/types/utils/traceData.d.ts.map +1 -1
  331. package/build/types-ts3.8/api.d.ts +1 -0
  332. package/build/types-ts3.8/asyncContext/types.d.ts +3 -1
  333. package/build/types-ts3.8/attributes.d.ts +5 -0
  334. package/build/types-ts3.8/client.d.ts +35 -1
  335. package/build/types-ts3.8/currentScopes.d.ts +20 -0
  336. package/build/types-ts3.8/index.d.ts +15 -6
  337. package/build/types-ts3.8/integrations/express/index.d.ts +75 -0
  338. package/build/types-ts3.8/integrations/express/patch-layer.d.ts +32 -0
  339. package/build/types-ts3.8/integrations/express/request-layer-store.d.ts +32 -0
  340. package/build/types-ts3.8/integrations/express/set-sdk-processing-metadata.d.ts +35 -0
  341. package/build/types-ts3.8/integrations/express/types.d.ts +154 -0
  342. package/build/types-ts3.8/integrations/express/utils.d.ts +96 -0
  343. package/build/types-ts3.8/integrations/mcp-server/correlation.d.ts +2 -1
  344. package/build/types-ts3.8/integrations/mcp-server/handlers.d.ts +9 -4
  345. package/build/types-ts3.8/integrations/mcp-server/index.d.ts +2 -1
  346. package/build/types-ts3.8/integrations/mcp-server/types.d.ts +40 -7
  347. package/build/types-ts3.8/integrations/mcp-server/validation.d.ts +4 -1
  348. package/build/types-ts3.8/integrations/spanStreaming.d.ts +2 -0
  349. package/build/types-ts3.8/semanticAttributes.d.ts +23 -3
  350. package/build/types-ts3.8/tracing/ai/gen-ai-attributes.d.ts +6 -46
  351. package/build/types-ts3.8/tracing/ai/utils.d.ts +34 -9
  352. package/build/types-ts3.8/tracing/anthropic-ai/constants.d.ts +24 -9
  353. package/build/types-ts3.8/tracing/anthropic-ai/types.d.ts +5 -2
  354. package/build/types-ts3.8/tracing/anthropic-ai/utils.d.ts +1 -5
  355. package/build/types-ts3.8/tracing/google-genai/constants.d.ts +22 -9
  356. package/build/types-ts3.8/tracing/google-genai/types.d.ts +6 -2
  357. package/build/types-ts3.8/tracing/google-genai/utils.d.ts +0 -9
  358. package/build/types-ts3.8/tracing/index.d.ts +1 -0
  359. package/build/types-ts3.8/tracing/langchain/embeddings.d.ts +27 -0
  360. package/build/types-ts3.8/tracing/langchain/index.d.ts +1 -0
  361. package/build/types-ts3.8/tracing/openai/constants.d.ts +14 -6
  362. package/build/types-ts3.8/tracing/openai/types.d.ts +5 -2
  363. package/build/types-ts3.8/tracing/openai/utils.d.ts +4 -63
  364. package/build/types-ts3.8/tracing/sentryNonRecordingSpan.d.ts +12 -1
  365. package/build/types-ts3.8/tracing/sentrySpan.d.ts +10 -1
  366. package/build/types-ts3.8/tracing/spans/beforeSendSpan.d.ts +35 -0
  367. package/build/types-ts3.8/tracing/spans/captureSpan.d.ts +26 -0
  368. package/build/types-ts3.8/tracing/spans/envelope.d.ts +8 -0
  369. package/build/types-ts3.8/tracing/spans/estimateSize.d.ts +12 -0
  370. package/build/types-ts3.8/tracing/spans/hasSpanStreamingEnabled.d.ts +6 -0
  371. package/build/types-ts3.8/tracing/spans/spanBuffer.d.ts +60 -0
  372. package/build/types-ts3.8/types-hoist/envelope.d.ts +22 -2
  373. package/build/types-ts3.8/types-hoist/integration.d.ts +8 -0
  374. package/build/types-ts3.8/types-hoist/link.d.ts +2 -2
  375. package/build/types-ts3.8/types-hoist/options.d.ts +26 -2
  376. package/build/types-ts3.8/types-hoist/span.d.ts +35 -0
  377. package/build/types-ts3.8/utils/object.d.ts +10 -0
  378. package/build/types-ts3.8/utils/spanUtils.d.ts +27 -2
  379. package/build/types-ts3.8/utils/string.d.ts +2 -2
  380. package/build/types-ts3.8/utils/traceData.d.ts +4 -0
  381. package/package.json +1 -1
@@ -82,19 +82,23 @@ function storeSpanForRequest(transport, requestId, span, method) {
82
82
  * @param requestId - Request identifier
83
83
  * @param result - Execution result for attribute extraction
84
84
  * @param options - Resolved MCP options
85
+ * @param hasError - Whether the JSON-RPC response contained an error
85
86
  */
86
87
  function completeSpanWithResults(
87
88
  transport,
88
89
  requestId,
89
90
  result,
90
91
  options,
92
+ hasError = false,
91
93
  ) {
92
94
  const spanMap = getOrCreateSpanMap(transport);
93
95
  const spanData = spanMap.get(requestId);
94
96
  if (spanData) {
95
97
  const { span, method } = spanData;
96
98
 
97
- if (method === 'initialize') {
99
+ if (hasError) {
100
+ span.setStatus({ code: spanstatus.SPAN_STATUS_ERROR, message: 'internal_error' });
101
+ } else if (method === 'initialize') {
98
102
  const sessionData = sessionExtraction.extractSessionDataFromInitializeResponse(result);
99
103
  const serverAttributes = sessionExtraction.buildServerAttributesFromInfo(sessionData.serverInfo);
100
104
 
@@ -1 +1 @@
1
- {"version":3,"file":"correlation.js","sources":["../../../../src/integrations/mcp-server/correlation.ts"],"sourcesContent":["/**\n * Request-span correlation system for MCP server instrumentation\n *\n * Handles mapping requestId to span data for correlation with handler execution.\n *\n * Uses sessionId as the primary key for stateful transports. This handles the wrapper\n * transport pattern (e.g., NodeStreamableHTTPServerTransport wrapping WebStandardStreamableHTTPServerTransport)\n * where onmessage and send may receive different `this` values but share the same sessionId.\n *\n * Falls back to WeakMap by transport instance for stateless transports (no sessionId).\n */\n\nimport { SPAN_STATUS_ERROR } from '../../tracing';\nimport type { Span } from '../../types-hoist/span';\nimport { MCP_PROTOCOL_VERSION_ATTRIBUTE } from './attributes';\nimport { extractPromptResultAttributes, extractToolResultAttributes } from './resultExtraction';\nimport { buildServerAttributesFromInfo, extractSessionDataFromInitializeResponse } from './sessionExtraction';\nimport type { MCPTransport, RequestId, RequestSpanMapValue, ResolvedMcpOptions } from './types';\n\n/**\n * Session-scoped correlation for stateful transports (with sessionId)\n * @internal Using sessionId as key handles wrapper transport patterns where\n * different transport objects share the same logical session\n */\nconst sessionToSpanMap = new Map<string, Map<RequestId, RequestSpanMapValue>>();\n\n/**\n * Transport-scoped correlation fallback for stateless transports (no sessionId)\n * @internal WeakMap allows automatic cleanup when transport is garbage collected\n */\nconst statelessSpanMap = new WeakMap<MCPTransport, Map<RequestId, RequestSpanMapValue>>();\n\n/**\n * Gets or creates the span map for a transport, using sessionId when available\n * @internal\n * @param transport - MCP transport instance\n * @returns Span map for the transport/session\n */\nfunction getOrCreateSpanMap(transport: MCPTransport): Map<RequestId, RequestSpanMapValue> {\n const sessionId = transport.sessionId;\n\n if (sessionId) {\n // Stateful transport - use sessionId as key (handles wrapper pattern)\n let spanMap = sessionToSpanMap.get(sessionId);\n if (!spanMap) {\n spanMap = new Map();\n sessionToSpanMap.set(sessionId, spanMap);\n }\n return spanMap;\n }\n\n // Stateless fallback - use transport instance as key\n let spanMap = statelessSpanMap.get(transport);\n if (!spanMap) {\n spanMap = new Map();\n statelessSpanMap.set(transport, spanMap);\n }\n return spanMap;\n}\n\n/**\n * Stores span context for later correlation with handler execution\n * @param transport - MCP transport instance\n * @param requestId - Request identifier\n * @param span - Active span to correlate\n * @param method - MCP method name\n */\nexport function storeSpanForRequest(transport: MCPTransport, requestId: RequestId, span: Span, method: string): void {\n const spanMap = getOrCreateSpanMap(transport);\n spanMap.set(requestId, {\n span,\n method,\n // oxlint-disable-next-line sdk/no-unsafe-random-apis\n startTime: Date.now(),\n });\n}\n\n/**\n * Completes span with results and cleans up correlation\n * @param transport - MCP transport instance\n * @param requestId - Request identifier\n * @param result - Execution result for attribute extraction\n * @param options - Resolved MCP options\n */\nexport function completeSpanWithResults(\n transport: MCPTransport,\n requestId: RequestId,\n result: unknown,\n options: ResolvedMcpOptions,\n): void {\n const spanMap = getOrCreateSpanMap(transport);\n const spanData = spanMap.get(requestId);\n if (spanData) {\n const { span, method } = spanData;\n\n if (method === 'initialize') {\n const sessionData = extractSessionDataFromInitializeResponse(result);\n const serverAttributes = buildServerAttributesFromInfo(sessionData.serverInfo);\n\n const initAttributes: Record<string, string | number> = {\n ...serverAttributes,\n };\n if (sessionData.protocolVersion) {\n initAttributes[MCP_PROTOCOL_VERSION_ATTRIBUTE] = sessionData.protocolVersion;\n }\n\n span.setAttributes(initAttributes);\n } else if (method === 'tools/call') {\n const toolAttributes = extractToolResultAttributes(result, options.recordOutputs);\n span.setAttributes(toolAttributes);\n } else if (method === 'prompts/get') {\n const promptAttributes = extractPromptResultAttributes(result, options.recordOutputs);\n span.setAttributes(promptAttributes);\n }\n\n span.end();\n spanMap.delete(requestId);\n }\n}\n\n/**\n * Cleans up pending spans for a specific transport (when that transport closes)\n * @param transport - MCP transport instance\n */\nexport function cleanupPendingSpansForTransport(transport: MCPTransport): void {\n const sessionId = transport.sessionId;\n\n // Try sessionId-based cleanup first (for stateful transports)\n if (sessionId) {\n const spanMap = sessionToSpanMap.get(sessionId);\n if (spanMap) {\n for (const [, spanData] of spanMap) {\n spanData.span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: 'cancelled',\n });\n spanData.span.end();\n }\n sessionToSpanMap.delete(sessionId);\n }\n return;\n }\n\n // Fallback to transport-based cleanup (for stateless transports)\n const spanMap = statelessSpanMap.get(transport);\n if (spanMap) {\n for (const [, spanData] of spanMap) {\n spanData.span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: 'cancelled',\n });\n spanData.span.end();\n }\n spanMap.clear();\n // Note: WeakMap entries are automatically cleaned up when transport is GC'd\n }\n}\n"],"names":["extractSessionDataFromInitializeResponse","buildServerAttributesFromInfo","MCP_PROTOCOL_VERSION_ATTRIBUTE","extractToolResultAttributes","extractPromptResultAttributes","SPAN_STATUS_ERROR"],"mappings":"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"}
1
+ {"version":3,"file":"correlation.js","sources":["../../../../src/integrations/mcp-server/correlation.ts"],"sourcesContent":["/**\n * Request-span correlation system for MCP server instrumentation\n *\n * Handles mapping requestId to span data for correlation with handler execution.\n *\n * Uses sessionId as the primary key for stateful transports. This handles the wrapper\n * transport pattern (e.g., NodeStreamableHTTPServerTransport wrapping WebStandardStreamableHTTPServerTransport)\n * where onmessage and send may receive different `this` values but share the same sessionId.\n *\n * Falls back to WeakMap by transport instance for stateless transports (no sessionId).\n */\n\nimport { SPAN_STATUS_ERROR } from '../../tracing';\nimport type { Span } from '../../types-hoist/span';\nimport { MCP_PROTOCOL_VERSION_ATTRIBUTE } from './attributes';\nimport { extractPromptResultAttributes, extractToolResultAttributes } from './resultExtraction';\nimport { buildServerAttributesFromInfo, extractSessionDataFromInitializeResponse } from './sessionExtraction';\nimport type { MCPTransport, RequestId, RequestSpanMapValue, ResolvedMcpOptions } from './types';\n\n/**\n * Session-scoped correlation for stateful transports (with sessionId)\n * @internal Using sessionId as key handles wrapper transport patterns where\n * different transport objects share the same logical session\n */\nconst sessionToSpanMap = new Map<string, Map<RequestId, RequestSpanMapValue>>();\n\n/**\n * Transport-scoped correlation fallback for stateless transports (no sessionId)\n * @internal WeakMap allows automatic cleanup when transport is garbage collected\n */\nconst statelessSpanMap = new WeakMap<MCPTransport, Map<RequestId, RequestSpanMapValue>>();\n\n/**\n * Gets or creates the span map for a transport, using sessionId when available\n * @internal\n * @param transport - MCP transport instance\n * @returns Span map for the transport/session\n */\nfunction getOrCreateSpanMap(transport: MCPTransport): Map<RequestId, RequestSpanMapValue> {\n const sessionId = transport.sessionId;\n\n if (sessionId) {\n // Stateful transport - use sessionId as key (handles wrapper pattern)\n let spanMap = sessionToSpanMap.get(sessionId);\n if (!spanMap) {\n spanMap = new Map();\n sessionToSpanMap.set(sessionId, spanMap);\n }\n return spanMap;\n }\n\n // Stateless fallback - use transport instance as key\n let spanMap = statelessSpanMap.get(transport);\n if (!spanMap) {\n spanMap = new Map();\n statelessSpanMap.set(transport, spanMap);\n }\n return spanMap;\n}\n\n/**\n * Stores span context for later correlation with handler execution\n * @param transport - MCP transport instance\n * @param requestId - Request identifier\n * @param span - Active span to correlate\n * @param method - MCP method name\n */\nexport function storeSpanForRequest(transport: MCPTransport, requestId: RequestId, span: Span, method: string): void {\n const spanMap = getOrCreateSpanMap(transport);\n spanMap.set(requestId, {\n span,\n method,\n // oxlint-disable-next-line sdk/no-unsafe-random-apis\n startTime: Date.now(),\n });\n}\n\n/**\n * Completes span with results and cleans up correlation\n * @param transport - MCP transport instance\n * @param requestId - Request identifier\n * @param result - Execution result for attribute extraction\n * @param options - Resolved MCP options\n * @param hasError - Whether the JSON-RPC response contained an error\n */\nexport function completeSpanWithResults(\n transport: MCPTransport,\n requestId: RequestId,\n result: unknown,\n options: ResolvedMcpOptions,\n hasError = false,\n): void {\n const spanMap = getOrCreateSpanMap(transport);\n const spanData = spanMap.get(requestId);\n if (spanData) {\n const { span, method } = spanData;\n\n if (hasError) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n } else if (method === 'initialize') {\n const sessionData = extractSessionDataFromInitializeResponse(result);\n const serverAttributes = buildServerAttributesFromInfo(sessionData.serverInfo);\n\n const initAttributes: Record<string, string | number> = {\n ...serverAttributes,\n };\n if (sessionData.protocolVersion) {\n initAttributes[MCP_PROTOCOL_VERSION_ATTRIBUTE] = sessionData.protocolVersion;\n }\n\n span.setAttributes(initAttributes);\n } else if (method === 'tools/call') {\n const toolAttributes = extractToolResultAttributes(result, options.recordOutputs);\n span.setAttributes(toolAttributes);\n } else if (method === 'prompts/get') {\n const promptAttributes = extractPromptResultAttributes(result, options.recordOutputs);\n span.setAttributes(promptAttributes);\n }\n\n span.end();\n spanMap.delete(requestId);\n }\n}\n\n/**\n * Cleans up pending spans for a specific transport (when that transport closes)\n * @param transport - MCP transport instance\n */\nexport function cleanupPendingSpansForTransport(transport: MCPTransport): void {\n const sessionId = transport.sessionId;\n\n // Try sessionId-based cleanup first (for stateful transports)\n if (sessionId) {\n const spanMap = sessionToSpanMap.get(sessionId);\n if (spanMap) {\n for (const [, spanData] of spanMap) {\n spanData.span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: 'cancelled',\n });\n spanData.span.end();\n }\n sessionToSpanMap.delete(sessionId);\n }\n return;\n }\n\n // Fallback to transport-based cleanup (for stateless transports)\n const spanMap = statelessSpanMap.get(transport);\n if (spanMap) {\n for (const [, spanData] of spanMap) {\n spanData.span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: 'cancelled',\n });\n spanData.span.end();\n }\n spanMap.clear();\n // Note: WeakMap entries are automatically cleaned up when transport is GC'd\n }\n}\n"],"names":["SPAN_STATUS_ERROR","extractSessionDataFromInitializeResponse","buildServerAttributesFromInfo","MCP_PROTOCOL_VERSION_ATTRIBUTE","extractToolResultAttributes","extractPromptResultAttributes"],"mappings":"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"}
@@ -98,7 +98,7 @@ function captureHandlerError(error, methodName, handlerName) {
98
98
  try {
99
99
  const extraData = {};
100
100
 
101
- if (methodName === 'tool') {
101
+ if (methodName === 'tool' || methodName === 'registerTool') {
102
102
  extraData.tool_name = handlerName;
103
103
 
104
104
  if (
@@ -116,10 +116,10 @@ function captureHandlerError(error, methodName, handlerName) {
116
116
  } else {
117
117
  errorCapture.captureError(error, 'tool_execution', extraData);
118
118
  }
119
- } else if (methodName === 'resource') {
119
+ } else if (methodName === 'resource' || methodName === 'registerResource') {
120
120
  extraData.resource_uri = handlerName;
121
121
  errorCapture.captureError(error, 'resource_execution', extraData);
122
- } else if (methodName === 'prompt') {
122
+ } else if (methodName === 'prompt' || methodName === 'registerPrompt') {
123
123
  extraData.prompt_name = handlerName;
124
124
  errorCapture.captureError(error, 'prompt_execution', extraData);
125
125
  }
@@ -129,31 +129,39 @@ function captureHandlerError(error, methodName, handlerName) {
129
129
  }
130
130
 
131
131
  /**
132
- * Wraps tool handlers to associate them with request spans
132
+ * Wraps tool handlers to associate them with request spans.
133
+ * Instruments both `tool` (legacy API) and `registerTool` (new API) if present.
133
134
  * @param serverInstance - MCP server instance
134
135
  */
135
136
  function wrapToolHandlers(serverInstance) {
136
- wrapMethodHandler(serverInstance, 'tool');
137
+ if (typeof serverInstance.tool === 'function') wrapMethodHandler(serverInstance, 'tool');
138
+ if (typeof serverInstance.registerTool === 'function') wrapMethodHandler(serverInstance, 'registerTool');
137
139
  }
138
140
 
139
141
  /**
140
- * Wraps resource handlers to associate them with request spans
142
+ * Wraps resource handlers to associate them with request spans.
143
+ * Instruments both `resource` (legacy API) and `registerResource` (new API) if present.
141
144
  * @param serverInstance - MCP server instance
142
145
  */
143
146
  function wrapResourceHandlers(serverInstance) {
144
- wrapMethodHandler(serverInstance, 'resource');
147
+ if (typeof serverInstance.resource === 'function') wrapMethodHandler(serverInstance, 'resource');
148
+ if (typeof serverInstance.registerResource === 'function') wrapMethodHandler(serverInstance, 'registerResource');
145
149
  }
146
150
 
147
151
  /**
148
- * Wraps prompt handlers to associate them with request spans
152
+ * Wraps prompt handlers to associate them with request spans.
153
+ * Instruments both `prompt` (legacy API) and `registerPrompt` (new API) if present.
149
154
  * @param serverInstance - MCP server instance
150
155
  */
151
156
  function wrapPromptHandlers(serverInstance) {
152
- wrapMethodHandler(serverInstance, 'prompt');
157
+ if (typeof serverInstance.prompt === 'function') wrapMethodHandler(serverInstance, 'prompt');
158
+ if (typeof serverInstance.registerPrompt === 'function') wrapMethodHandler(serverInstance, 'registerPrompt');
153
159
  }
154
160
 
155
161
  /**
156
- * Wraps all MCP handler types (tool, resource, prompt) for span correlation
162
+ * Wraps all MCP handler types for span correlation.
163
+ * Supports both the legacy API (`tool`, `resource`, `prompt`) and the newer API
164
+ * (`registerTool`, `registerResource`, `registerPrompt`), instrumenting whichever methods are present.
157
165
  * @param serverInstance - MCP server instance
158
166
  */
159
167
  function wrapAllMCPHandlers(serverInstance) {
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sources":["../../../../src/integrations/mcp-server/handlers.ts"],"sourcesContent":["/**\n * Handler method wrapping for MCP server instrumentation\n *\n * Provides automatic error capture and span correlation for tool, resource,\n * and prompt handlers.\n */\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { debug } from '../../utils/debug-logger';\nimport { fill } from '../../utils/object';\nimport { captureError } from './errorCapture';\nimport type { MCPHandler, MCPServerInstance } from './types';\n\n/**\n * Generic function to wrap MCP server method handlers\n * @internal\n * @param serverInstance - MCP server instance\n * @param methodName - Method name to wrap (tool, resource, prompt)\n */\nfunction wrapMethodHandler(serverInstance: MCPServerInstance, methodName: keyof MCPServerInstance): void {\n fill(serverInstance, methodName, originalMethod => {\n return function (this: MCPServerInstance, name: string, ...args: unknown[]) {\n const handler = args[args.length - 1];\n\n if (typeof handler !== 'function') {\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args);\n }\n\n const wrappedHandler = createWrappedHandler(handler as MCPHandler, methodName, name);\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args.slice(0, -1), wrappedHandler);\n };\n });\n}\n\n/**\n * Creates a wrapped handler with span correlation and error capture\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @returns Wrapped handler function\n */\nfunction createWrappedHandler(originalHandler: MCPHandler, methodName: keyof MCPServerInstance, handlerName: string) {\n return function (this: unknown, ...handlerArgs: unknown[]): unknown {\n try {\n return createErrorCapturingHandler.call(this, originalHandler, methodName, handlerName, handlerArgs);\n } catch (error) {\n DEBUG_BUILD && debug.warn('MCP handler wrapping failed:', error);\n return originalHandler.apply(this, handlerArgs);\n }\n };\n}\n\n/**\n * Creates an error-capturing wrapper for handler execution\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @param handlerArgs - Handler arguments\n * @param extraHandlerData - Additional handler context\n * @returns Handler execution result\n */\nfunction createErrorCapturingHandler(\n this: MCPServerInstance,\n originalHandler: MCPHandler,\n methodName: keyof MCPServerInstance,\n handlerName: string,\n handlerArgs: unknown[],\n): unknown {\n try {\n const result = originalHandler.apply(this, handlerArgs);\n\n if (result && typeof result === 'object' && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).catch(error => {\n captureHandlerError(error, methodName, handlerName);\n throw error;\n });\n }\n\n return result;\n } catch (error) {\n captureHandlerError(error as Error, methodName, handlerName);\n throw error;\n }\n}\n\n/**\n * Captures handler execution errors based on handler type\n * @internal\n * @param error - Error to capture\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n */\nfunction captureHandlerError(error: Error, methodName: keyof MCPServerInstance, handlerName: string): void {\n try {\n const extraData: Record<string, unknown> = {};\n\n if (methodName === 'tool') {\n extraData.tool_name = handlerName;\n\n if (\n error.name === 'ProtocolValidationError' ||\n error.message.includes('validation') ||\n error.message.includes('protocol')\n ) {\n captureError(error, 'validation', extraData);\n } else if (\n error.name === 'ServerTimeoutError' ||\n error.message.includes('timed out') ||\n error.message.includes('timeout')\n ) {\n captureError(error, 'timeout', extraData);\n } else {\n captureError(error, 'tool_execution', extraData);\n }\n } else if (methodName === 'resource') {\n extraData.resource_uri = handlerName;\n captureError(error, 'resource_execution', extraData);\n } else if (methodName === 'prompt') {\n extraData.prompt_name = handlerName;\n captureError(error, 'prompt_execution', extraData);\n }\n } catch (_captureErr) {\n // noop\n }\n}\n\n/**\n * Wraps tool handlers to associate them with request spans\n * @param serverInstance - MCP server instance\n */\nexport function wrapToolHandlers(serverInstance: MCPServerInstance): void {\n wrapMethodHandler(serverInstance, 'tool');\n}\n\n/**\n * Wraps resource handlers to associate them with request spans\n * @param serverInstance - MCP server instance\n */\nexport function wrapResourceHandlers(serverInstance: MCPServerInstance): void {\n wrapMethodHandler(serverInstance, 'resource');\n}\n\n/**\n * Wraps prompt handlers to associate them with request spans\n * @param serverInstance - MCP server instance\n */\nexport function wrapPromptHandlers(serverInstance: MCPServerInstance): void {\n wrapMethodHandler(serverInstance, 'prompt');\n}\n\n/**\n * Wraps all MCP handler types (tool, resource, prompt) for span correlation\n * @param serverInstance - MCP server instance\n */\nexport function wrapAllMCPHandlers(serverInstance: MCPServerInstance): void {\n wrapToolHandlers(serverInstance);\n wrapResourceHandlers(serverInstance);\n wrapPromptHandlers(serverInstance);\n}\n"],"names":["fill","DEBUG_BUILD","debug","captureError"],"mappings":"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"}
1
+ {"version":3,"file":"handlers.js","sources":["../../../../src/integrations/mcp-server/handlers.ts"],"sourcesContent":["/**\n * Handler method wrapping for MCP server instrumentation\n *\n * Provides automatic error capture and span correlation for tool, resource,\n * and prompt handlers.\n */\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { debug } from '../../utils/debug-logger';\nimport { fill } from '../../utils/object';\nimport { captureError } from './errorCapture';\nimport type { MCPHandler, MCPServerInstance } from './types';\n\n/**\n * Generic function to wrap MCP server method handlers\n * @internal\n * @param serverInstance - MCP server instance\n * @param methodName - Method name to wrap (tool, resource, prompt)\n */\nfunction wrapMethodHandler(serverInstance: MCPServerInstance, methodName: keyof MCPServerInstance): void {\n fill(serverInstance, methodName, originalMethod => {\n return function (this: MCPServerInstance, name: string, ...args: unknown[]) {\n const handler = args[args.length - 1];\n\n if (typeof handler !== 'function') {\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args);\n }\n\n const wrappedHandler = createWrappedHandler(handler as MCPHandler, methodName, name);\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args.slice(0, -1), wrappedHandler);\n };\n });\n}\n\n/**\n * Creates a wrapped handler with span correlation and error capture\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @returns Wrapped handler function\n */\nfunction createWrappedHandler(originalHandler: MCPHandler, methodName: keyof MCPServerInstance, handlerName: string) {\n return function (this: unknown, ...handlerArgs: unknown[]): unknown {\n try {\n return createErrorCapturingHandler.call(this, originalHandler, methodName, handlerName, handlerArgs);\n } catch (error) {\n DEBUG_BUILD && debug.warn('MCP handler wrapping failed:', error);\n return originalHandler.apply(this, handlerArgs);\n }\n };\n}\n\n/**\n * Creates an error-capturing wrapper for handler execution\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @param handlerArgs - Handler arguments\n * @param extraHandlerData - Additional handler context\n * @returns Handler execution result\n */\nfunction createErrorCapturingHandler(\n this: MCPServerInstance,\n originalHandler: MCPHandler,\n methodName: keyof MCPServerInstance,\n handlerName: string,\n handlerArgs: unknown[],\n): unknown {\n try {\n const result = originalHandler.apply(this, handlerArgs);\n\n if (result && typeof result === 'object' && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).catch(error => {\n captureHandlerError(error, methodName, handlerName);\n throw error;\n });\n }\n\n return result;\n } catch (error) {\n captureHandlerError(error as Error, methodName, handlerName);\n throw error;\n }\n}\n\n/**\n * Captures handler execution errors based on handler type\n * @internal\n * @param error - Error to capture\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n */\nfunction captureHandlerError(error: Error, methodName: keyof MCPServerInstance, handlerName: string): void {\n try {\n const extraData: Record<string, unknown> = {};\n\n if (methodName === 'tool' || methodName === 'registerTool') {\n extraData.tool_name = handlerName;\n\n if (\n error.name === 'ProtocolValidationError' ||\n error.message.includes('validation') ||\n error.message.includes('protocol')\n ) {\n captureError(error, 'validation', extraData);\n } else if (\n error.name === 'ServerTimeoutError' ||\n error.message.includes('timed out') ||\n error.message.includes('timeout')\n ) {\n captureError(error, 'timeout', extraData);\n } else {\n captureError(error, 'tool_execution', extraData);\n }\n } else if (methodName === 'resource' || methodName === 'registerResource') {\n extraData.resource_uri = handlerName;\n captureError(error, 'resource_execution', extraData);\n } else if (methodName === 'prompt' || methodName === 'registerPrompt') {\n extraData.prompt_name = handlerName;\n captureError(error, 'prompt_execution', extraData);\n }\n } catch (_captureErr) {\n // noop\n }\n}\n\n/**\n * Wraps tool handlers to associate them with request spans.\n * Instruments both `tool` (legacy API) and `registerTool` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapToolHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.tool === 'function') wrapMethodHandler(serverInstance, 'tool');\n if (typeof serverInstance.registerTool === 'function') wrapMethodHandler(serverInstance, 'registerTool');\n}\n\n/**\n * Wraps resource handlers to associate them with request spans.\n * Instruments both `resource` (legacy API) and `registerResource` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapResourceHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.resource === 'function') wrapMethodHandler(serverInstance, 'resource');\n if (typeof serverInstance.registerResource === 'function') wrapMethodHandler(serverInstance, 'registerResource');\n}\n\n/**\n * Wraps prompt handlers to associate them with request spans.\n * Instruments both `prompt` (legacy API) and `registerPrompt` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapPromptHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.prompt === 'function') wrapMethodHandler(serverInstance, 'prompt');\n if (typeof serverInstance.registerPrompt === 'function') wrapMethodHandler(serverInstance, 'registerPrompt');\n}\n\n/**\n * Wraps all MCP handler types for span correlation.\n * Supports both the legacy API (`tool`, `resource`, `prompt`) and the newer API\n * (`registerTool`, `registerResource`, `registerPrompt`), instrumenting whichever methods are present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapAllMCPHandlers(serverInstance: MCPServerInstance): void {\n wrapToolHandlers(serverInstance);\n wrapResourceHandlers(serverInstance);\n wrapPromptHandlers(serverInstance);\n}\n"],"names":["fill","DEBUG_BUILD","debug","captureError"],"mappings":"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"}
@@ -15,7 +15,8 @@ const wrappedMcpServerInstances = new WeakSet();
15
15
  /**
16
16
  * Wraps a MCP Server instance from the `@modelcontextprotocol/sdk` package with Sentry instrumentation.
17
17
  *
18
- * Compatible with versions `^1.9.0` of the `@modelcontextprotocol/sdk` package.
18
+ * Compatible with versions `^1.9.0` of the `@modelcontextprotocol/sdk` package (legacy `tool`/`resource`/`prompt` API)
19
+ * and versions that expose the newer `registerTool`/`registerResource`/`registerPrompt` API (introduced in 1.x, sole API in 2.x).
19
20
  * Automatically instruments transport methods and handler functions for comprehensive monitoring.
20
21
  *
21
22
  * @example
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/integrations/mcp-server/index.ts"],"sourcesContent":["import { getClient } from '../../currentScopes';\nimport { fill } from '../../utils/object';\nimport { wrapAllMCPHandlers } from './handlers';\nimport { wrapTransportError, wrapTransportOnClose, wrapTransportOnMessage, wrapTransportSend } from './transport';\nimport type { MCPServerInstance, McpServerWrapperOptions, MCPTransport, ResolvedMcpOptions } from './types';\nimport { validateMcpServerInstance } from './validation';\n\n/**\n * Tracks wrapped MCP server instances to prevent double-wrapping\n * @internal\n */\nconst wrappedMcpServerInstances = new WeakSet();\n\n/**\n * Wraps a MCP Server instance from the `@modelcontextprotocol/sdk` package with Sentry instrumentation.\n *\n * Compatible with versions `^1.9.0` of the `@modelcontextprotocol/sdk` package.\n * Automatically instruments transport methods and handler functions for comprehensive monitoring.\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/core';\n * import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n * import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\n *\n * // Default: inputs/outputs captured based on sendDefaultPii option\n * const server = Sentry.wrapMcpServerWithSentry(\n * new McpServer({ name: \"my-server\", version: \"1.0.0\" })\n * );\n *\n * // Explicitly control input/output capture\n * const server = Sentry.wrapMcpServerWithSentry(\n * new McpServer({ name: \"my-server\", version: \"1.0.0\" }),\n * { recordInputs: true, recordOutputs: false }\n * );\n *\n * const transport = new StreamableHTTPServerTransport();\n * await server.connect(transport);\n * ```\n *\n * @param mcpServerInstance - MCP server instance to instrument\n * @param options - Optional configuration for recording inputs and outputs\n * @returns Instrumented server instance (same reference)\n */\nexport function wrapMcpServerWithSentry<S extends object>(mcpServerInstance: S, options?: McpServerWrapperOptions): S {\n if (wrappedMcpServerInstances.has(mcpServerInstance)) {\n return mcpServerInstance;\n }\n\n if (!validateMcpServerInstance(mcpServerInstance)) {\n return mcpServerInstance;\n }\n\n const serverInstance = mcpServerInstance as MCPServerInstance;\n const client = getClient();\n const sendDefaultPii = Boolean(client?.getOptions().sendDefaultPii);\n\n const resolvedOptions: ResolvedMcpOptions = {\n recordInputs: options?.recordInputs ?? sendDefaultPii,\n recordOutputs: options?.recordOutputs ?? sendDefaultPii,\n };\n\n fill(serverInstance, 'connect', originalConnect => {\n return async function (this: MCPServerInstance, transport: MCPTransport, ...restArgs: unknown[]) {\n const result = await (originalConnect as (...args: unknown[]) => Promise<unknown>).call(\n this,\n transport,\n ...restArgs,\n );\n\n wrapTransportOnMessage(transport, resolvedOptions);\n wrapTransportSend(transport, resolvedOptions);\n wrapTransportOnClose(transport);\n wrapTransportError(transport);\n\n return result;\n };\n });\n\n wrapAllMCPHandlers(serverInstance);\n\n wrappedMcpServerInstances.add(mcpServerInstance);\n return mcpServerInstance;\n}\n"],"names":["validateMcpServerInstance","getClient","fill","transport","wrapTransportOnMessage","wrapTransportSend","wrapTransportOnClose","wrapTransportError","wrapAllMCPHandlers"],"mappings":";;;;;;;;AAOA;AACA;AACA;AACA;AACA,MAAM,yBAAA,GAA4B,IAAI,OAAO,EAAE;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,uBAAuB,CAAmB,iBAAiB,EAAK,OAAO,EAA+B;AACtH,EAAE,IAAI,yBAAyB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;AACxD,IAAI,OAAO,iBAAiB;AAC5B,EAAE;;AAEF,EAAE,IAAI,CAACA,oCAAyB,CAAC,iBAAiB,CAAC,EAAE;AACrD,IAAI,OAAO,iBAAiB;AAC5B,EAAE;;AAEF,EAAE,MAAM,cAAA,GAAiB,iBAAA;AACzB,EAAE,MAAM,MAAA,GAASC,uBAAS,EAAE;AAC5B,EAAE,MAAM,cAAA,GAAiB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,cAAc,CAAC;;AAErE,EAAE,MAAM,eAAe,GAAuB;AAC9C,IAAI,YAAY,EAAE,OAAO,EAAE,YAAA,IAAgB,cAAc;AACzD,IAAI,aAAa,EAAE,OAAO,EAAE,aAAA,IAAiB,cAAc;AAC3D,GAAG;;AAEH,EAAEC,WAAI,CAAC,cAAc,EAAE,SAAS,EAAE,mBAAmB;AACrD,IAAI,OAAO,iBAAyCC,WAAS,EAAgB,GAAG,QAAQ,EAAa;AACrG,MAAM,MAAM,SAAS,MAAM,CAAC,eAAA,GAA6D,IAAI;AAC7F,QAAQ,IAAI;AACZ,QAAQA,WAAS;AACjB,QAAQ,GAAG,QAAQ;AACnB,OAAO;;AAEP,MAAMC,gCAAsB,CAACD,WAAS,EAAE,eAAe,CAAC;AACxD,MAAME,2BAAiB,CAACF,WAAS,EAAE,eAAe,CAAC;AACnD,MAAMG,8BAAoB,CAACH,WAAS,CAAC;AACrC,MAAMI,4BAAkB,CAACJ,WAAS,CAAC;;AAEnC,MAAM,OAAO,MAAM;AACnB,IAAI,CAAC;AACL,EAAE,CAAC,CAAC;;AAEJ,EAAEK,2BAAkB,CAAC,cAAc,CAAC;;AAEpC,EAAE,yBAAyB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAClD,EAAE,OAAO,iBAAiB;AAC1B;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../src/integrations/mcp-server/index.ts"],"sourcesContent":["import { getClient } from '../../currentScopes';\nimport { fill } from '../../utils/object';\nimport { wrapAllMCPHandlers } from './handlers';\nimport { wrapTransportError, wrapTransportOnClose, wrapTransportOnMessage, wrapTransportSend } from './transport';\nimport type { MCPServerInstance, McpServerWrapperOptions, MCPTransport, ResolvedMcpOptions } from './types';\nimport { validateMcpServerInstance } from './validation';\n\n/**\n * Tracks wrapped MCP server instances to prevent double-wrapping\n * @internal\n */\nconst wrappedMcpServerInstances = new WeakSet();\n\n/**\n * Wraps a MCP Server instance from the `@modelcontextprotocol/sdk` package with Sentry instrumentation.\n *\n * Compatible with versions `^1.9.0` of the `@modelcontextprotocol/sdk` package (legacy `tool`/`resource`/`prompt` API)\n * and versions that expose the newer `registerTool`/`registerResource`/`registerPrompt` API (introduced in 1.x, sole API in 2.x).\n * Automatically instruments transport methods and handler functions for comprehensive monitoring.\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/core';\n * import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n * import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\n *\n * // Default: inputs/outputs captured based on sendDefaultPii option\n * const server = Sentry.wrapMcpServerWithSentry(\n * new McpServer({ name: \"my-server\", version: \"1.0.0\" })\n * );\n *\n * // Explicitly control input/output capture\n * const server = Sentry.wrapMcpServerWithSentry(\n * new McpServer({ name: \"my-server\", version: \"1.0.0\" }),\n * { recordInputs: true, recordOutputs: false }\n * );\n *\n * const transport = new StreamableHTTPServerTransport();\n * await server.connect(transport);\n * ```\n *\n * @param mcpServerInstance - MCP server instance to instrument\n * @param options - Optional configuration for recording inputs and outputs\n * @returns Instrumented server instance (same reference)\n */\nexport function wrapMcpServerWithSentry<S extends object>(mcpServerInstance: S, options?: McpServerWrapperOptions): S {\n if (wrappedMcpServerInstances.has(mcpServerInstance)) {\n return mcpServerInstance;\n }\n\n if (!validateMcpServerInstance(mcpServerInstance)) {\n return mcpServerInstance;\n }\n\n const serverInstance = mcpServerInstance as MCPServerInstance;\n const client = getClient();\n const sendDefaultPii = Boolean(client?.getOptions().sendDefaultPii);\n\n const resolvedOptions: ResolvedMcpOptions = {\n recordInputs: options?.recordInputs ?? sendDefaultPii,\n recordOutputs: options?.recordOutputs ?? sendDefaultPii,\n };\n\n fill(serverInstance, 'connect', originalConnect => {\n return async function (this: MCPServerInstance, transport: MCPTransport, ...restArgs: unknown[]) {\n const result = await (originalConnect as (...args: unknown[]) => Promise<unknown>).call(\n this,\n transport,\n ...restArgs,\n );\n\n wrapTransportOnMessage(transport, resolvedOptions);\n wrapTransportSend(transport, resolvedOptions);\n wrapTransportOnClose(transport);\n wrapTransportError(transport);\n\n return result;\n };\n });\n\n wrapAllMCPHandlers(serverInstance);\n\n wrappedMcpServerInstances.add(mcpServerInstance);\n return mcpServerInstance;\n}\n"],"names":["validateMcpServerInstance","getClient","fill","transport","wrapTransportOnMessage","wrapTransportSend","wrapTransportOnClose","wrapTransportError","wrapAllMCPHandlers"],"mappings":";;;;;;;;AAOA;AACA;AACA;AACA;AACA,MAAM,yBAAA,GAA4B,IAAI,OAAO,EAAE;;AAE/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,uBAAuB,CAAmB,iBAAiB,EAAK,OAAO,EAA+B;AACtH,EAAE,IAAI,yBAAyB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;AACxD,IAAI,OAAO,iBAAiB;AAC5B,EAAE;;AAEF,EAAE,IAAI,CAACA,oCAAyB,CAAC,iBAAiB,CAAC,EAAE;AACrD,IAAI,OAAO,iBAAiB;AAC5B,EAAE;;AAEF,EAAE,MAAM,cAAA,GAAiB,iBAAA;AACzB,EAAE,MAAM,MAAA,GAASC,uBAAS,EAAE;AAC5B,EAAE,MAAM,cAAA,GAAiB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,cAAc,CAAC;;AAErE,EAAE,MAAM,eAAe,GAAuB;AAC9C,IAAI,YAAY,EAAE,OAAO,EAAE,YAAA,IAAgB,cAAc;AACzD,IAAI,aAAa,EAAE,OAAO,EAAE,aAAA,IAAiB,cAAc;AAC3D,GAAG;;AAEH,EAAEC,WAAI,CAAC,cAAc,EAAE,SAAS,EAAE,mBAAmB;AACrD,IAAI,OAAO,iBAAyCC,WAAS,EAAgB,GAAG,QAAQ,EAAa;AACrG,MAAM,MAAM,SAAS,MAAM,CAAC,eAAA,GAA6D,IAAI;AAC7F,QAAQ,IAAI;AACZ,QAAQA,WAAS;AACjB,QAAQ,GAAG,QAAQ;AACnB,OAAO;;AAEP,MAAMC,gCAAsB,CAACD,WAAS,EAAE,eAAe,CAAC;AACxD,MAAME,2BAAiB,CAACF,WAAS,EAAE,eAAe,CAAC;AACnD,MAAMG,8BAAoB,CAACH,WAAS,CAAC;AACrC,MAAMI,4BAAkB,CAACJ,WAAS,CAAC;;AAEnC,MAAM,OAAO,MAAM;AACnB,IAAI,CAAC;AACL,EAAE,CAAC,CAAC;;AAEJ,EAAEK,2BAAkB,CAAC,cAAc,CAAC;;AAEpC,EAAE,yBAAyB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAClD,EAAE,OAAO,iBAAiB;AAC1B;;;;"}
@@ -115,7 +115,7 @@ function wrapTransportSend(transport, options) {
115
115
  }
116
116
  }
117
117
 
118
- correlation.completeSpanWithResults(this, message.id, message.result, options);
118
+ correlation.completeSpanWithResults(this, message.id, message.result, options, !!message.error);
119
119
  }
120
120
  }
121
121
 
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sources":["../../../../src/integrations/mcp-server/transport.ts"],"sourcesContent":["/**\n * Transport layer instrumentation for MCP server\n *\n * Handles message interception and response correlation.\n * @see https://modelcontextprotocol.io/specification/2025-06-18/basic/transports\n */\n\nimport { getIsolationScope, withIsolationScope } from '../../currentScopes';\nimport { startInactiveSpan, withActiveSpan } from '../../tracing';\nimport { fill } from '../../utils/object';\nimport { MCP_PROTOCOL_VERSION_ATTRIBUTE } from './attributes';\nimport { cleanupPendingSpansForTransport, completeSpanWithResults, storeSpanForRequest } from './correlation';\nimport { captureError } from './errorCapture';\nimport {\n buildClientAttributesFromInfo,\n extractSessionDataFromInitializeRequest,\n extractSessionDataFromInitializeResponse,\n} from './sessionExtraction';\nimport {\n cleanupSessionDataForTransport,\n storeSessionDataForTransport,\n updateSessionDataForTransport,\n} from './sessionManagement';\nimport { buildMcpServerSpanConfig, createMcpNotificationSpan, createMcpOutgoingNotificationSpan } from './spans';\nimport type { ExtraHandlerData, MCPTransport, ResolvedMcpOptions, SessionData } from './types';\nimport { isJsonRpcNotification, isJsonRpcRequest, isJsonRpcResponse, isValidContentItem } from './validation';\n\n/**\n * Wraps transport.onmessage to create spans for incoming messages.\n * For \"initialize\" requests, extracts and stores client info and protocol version\n * in the session data for the transport.\n * @param transport - MCP transport instance to wrap\n * @param options - Resolved MCP options\n */\nexport function wrapTransportOnMessage(transport: MCPTransport, options: ResolvedMcpOptions): void {\n if (transport.onmessage) {\n fill(transport, 'onmessage', originalOnMessage => {\n return function (this: MCPTransport, message: unknown, extra?: unknown) {\n if (isJsonRpcRequest(message)) {\n const isInitialize = message.method === 'initialize';\n let initSessionData: SessionData | undefined;\n\n if (isInitialize) {\n try {\n initSessionData = extractSessionDataFromInitializeRequest(message);\n storeSessionDataForTransport(this, initSessionData);\n } catch {\n // noop\n }\n }\n\n const isolationScope = getIsolationScope().clone();\n\n return withIsolationScope(isolationScope, () => {\n const spanConfig = buildMcpServerSpanConfig(message, this, extra as ExtraHandlerData, options);\n const span = startInactiveSpan(spanConfig);\n\n // For initialize requests, add client info directly to span (works even for stateless transports)\n if (isInitialize && initSessionData) {\n span.setAttributes({\n ...buildClientAttributesFromInfo(initSessionData.clientInfo),\n ...(initSessionData.protocolVersion && {\n [MCP_PROTOCOL_VERSION_ATTRIBUTE]: initSessionData.protocolVersion,\n }),\n });\n }\n\n storeSpanForRequest(this, message.id, span, message.method);\n\n return withActiveSpan(span, () => {\n return (originalOnMessage as (...args: unknown[]) => unknown).call(this, message, extra);\n });\n });\n }\n\n if (isJsonRpcNotification(message)) {\n return createMcpNotificationSpan(message, this, extra as ExtraHandlerData, options, () => {\n return (originalOnMessage as (...args: unknown[]) => unknown).call(this, message, extra);\n });\n }\n\n return (originalOnMessage as (...args: unknown[]) => unknown).call(this, message, extra);\n };\n });\n }\n}\n\n/**\n * Wraps transport.send to handle outgoing messages and response correlation.\n * For \"initialize\" responses, extracts and stores protocol version and server info\n * in the session data for the transport.\n * @param transport - MCP transport instance to wrap\n * @param options - Resolved MCP options\n */\nexport function wrapTransportSend(transport: MCPTransport, options: ResolvedMcpOptions): void {\n if (transport.send) {\n fill(transport, 'send', originalSend => {\n return async function (this: MCPTransport, ...args: unknown[]) {\n const [message] = args;\n\n if (isJsonRpcNotification(message)) {\n return createMcpOutgoingNotificationSpan(message, this, options, () => {\n return (originalSend as (...args: unknown[]) => unknown).call(this, ...args);\n });\n }\n\n if (isJsonRpcResponse(message)) {\n if (message.id !== null && message.id !== undefined) {\n if (message.error) {\n captureJsonRpcErrorResponse(message.error);\n }\n\n if (isValidContentItem(message.result)) {\n if (message.result.protocolVersion || message.result.serverInfo) {\n try {\n const serverData = extractSessionDataFromInitializeResponse(message.result);\n updateSessionDataForTransport(this, serverData);\n } catch {\n // noop\n }\n }\n }\n\n completeSpanWithResults(this, message.id, message.result, options);\n }\n }\n\n return (originalSend as (...args: unknown[]) => unknown).call(this, ...args);\n };\n });\n }\n}\n\n/**\n * Wraps transport.onclose to clean up pending spans for this transport only\n * @param transport - MCP transport instance to wrap\n */\nexport function wrapTransportOnClose(transport: MCPTransport): void {\n if (transport.onclose) {\n fill(transport, 'onclose', originalOnClose => {\n return function (this: MCPTransport, ...args: unknown[]) {\n cleanupPendingSpansForTransport(this);\n cleanupSessionDataForTransport(this);\n return (originalOnClose as (...args: unknown[]) => unknown).call(this, ...args);\n };\n });\n }\n}\n\n/**\n * Wraps transport error handlers to capture connection errors\n * @param transport - MCP transport instance to wrap\n */\nexport function wrapTransportError(transport: MCPTransport): void {\n if (transport.onerror) {\n fill(transport, 'onerror', (originalOnError: (error: Error) => void) => {\n return function (this: MCPTransport, error: Error) {\n captureTransportError(error);\n return originalOnError.call(this, error);\n };\n });\n }\n}\n\n/**\n * Captures JSON-RPC error responses for server-side errors.\n * @see https://www.jsonrpc.org/specification#error_object\n * @internal\n * @param errorResponse - JSON-RPC error response\n */\nfunction captureJsonRpcErrorResponse(errorResponse: unknown): void {\n try {\n if (errorResponse && typeof errorResponse === 'object' && 'code' in errorResponse && 'message' in errorResponse) {\n const jsonRpcError = errorResponse as { code: number; message: string; data?: unknown };\n\n const isServerError =\n jsonRpcError.code === -32603 || (jsonRpcError.code >= -32099 && jsonRpcError.code <= -32000);\n\n if (isServerError) {\n const error = new Error(jsonRpcError.message);\n error.name = `JsonRpcError_${jsonRpcError.code}`;\n\n captureError(error, 'protocol');\n }\n }\n } catch {\n // noop\n }\n}\n\n/**\n * Captures transport connection errors\n * @internal\n * @param error - Transport error\n */\nfunction captureTransportError(error: Error): void {\n try {\n captureError(error, 'transport');\n } catch {\n // noop\n }\n}\n"],"names":["fill","isJsonRpcRequest","extractSessionDataFromInitializeRequest","storeSessionDataForTransport","getIsolationScope","withIsolationScope","buildMcpServerSpanConfig","startInactiveSpan","buildClientAttributesFromInfo","MCP_PROTOCOL_VERSION_ATTRIBUTE","storeSpanForRequest","withActiveSpan","isJsonRpcNotification","createMcpNotificationSpan","createMcpOutgoingNotificationSpan","isJsonRpcResponse","isValidContentItem","extractSessionDataFromInitializeResponse","updateSessionDataForTransport","completeSpanWithResults","cleanupPendingSpansForTransport","cleanupSessionDataForTransport","captureError"],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","sources":["../../../../src/integrations/mcp-server/transport.ts"],"sourcesContent":["/**\n * Transport layer instrumentation for MCP server\n *\n * Handles message interception and response correlation.\n * @see https://modelcontextprotocol.io/specification/2025-06-18/basic/transports\n */\n\nimport { getIsolationScope, withIsolationScope } from '../../currentScopes';\nimport { startInactiveSpan, withActiveSpan } from '../../tracing';\nimport { fill } from '../../utils/object';\nimport { MCP_PROTOCOL_VERSION_ATTRIBUTE } from './attributes';\nimport { cleanupPendingSpansForTransport, completeSpanWithResults, storeSpanForRequest } from './correlation';\nimport { captureError } from './errorCapture';\nimport {\n buildClientAttributesFromInfo,\n extractSessionDataFromInitializeRequest,\n extractSessionDataFromInitializeResponse,\n} from './sessionExtraction';\nimport {\n cleanupSessionDataForTransport,\n storeSessionDataForTransport,\n updateSessionDataForTransport,\n} from './sessionManagement';\nimport { buildMcpServerSpanConfig, createMcpNotificationSpan, createMcpOutgoingNotificationSpan } from './spans';\nimport type { ExtraHandlerData, MCPTransport, ResolvedMcpOptions, SessionData } from './types';\nimport { isJsonRpcNotification, isJsonRpcRequest, isJsonRpcResponse, isValidContentItem } from './validation';\n\n/**\n * Wraps transport.onmessage to create spans for incoming messages.\n * For \"initialize\" requests, extracts and stores client info and protocol version\n * in the session data for the transport.\n * @param transport - MCP transport instance to wrap\n * @param options - Resolved MCP options\n */\nexport function wrapTransportOnMessage(transport: MCPTransport, options: ResolvedMcpOptions): void {\n if (transport.onmessage) {\n fill(transport, 'onmessage', originalOnMessage => {\n return function (this: MCPTransport, message: unknown, extra?: unknown) {\n if (isJsonRpcRequest(message)) {\n const isInitialize = message.method === 'initialize';\n let initSessionData: SessionData | undefined;\n\n if (isInitialize) {\n try {\n initSessionData = extractSessionDataFromInitializeRequest(message);\n storeSessionDataForTransport(this, initSessionData);\n } catch {\n // noop\n }\n }\n\n const isolationScope = getIsolationScope().clone();\n\n return withIsolationScope(isolationScope, () => {\n const spanConfig = buildMcpServerSpanConfig(message, this, extra as ExtraHandlerData, options);\n const span = startInactiveSpan(spanConfig);\n\n // For initialize requests, add client info directly to span (works even for stateless transports)\n if (isInitialize && initSessionData) {\n span.setAttributes({\n ...buildClientAttributesFromInfo(initSessionData.clientInfo),\n ...(initSessionData.protocolVersion && {\n [MCP_PROTOCOL_VERSION_ATTRIBUTE]: initSessionData.protocolVersion,\n }),\n });\n }\n\n storeSpanForRequest(this, message.id, span, message.method);\n\n return withActiveSpan(span, () => {\n return (originalOnMessage as (...args: unknown[]) => unknown).call(this, message, extra);\n });\n });\n }\n\n if (isJsonRpcNotification(message)) {\n return createMcpNotificationSpan(message, this, extra as ExtraHandlerData, options, () => {\n return (originalOnMessage as (...args: unknown[]) => unknown).call(this, message, extra);\n });\n }\n\n return (originalOnMessage as (...args: unknown[]) => unknown).call(this, message, extra);\n };\n });\n }\n}\n\n/**\n * Wraps transport.send to handle outgoing messages and response correlation.\n * For \"initialize\" responses, extracts and stores protocol version and server info\n * in the session data for the transport.\n * @param transport - MCP transport instance to wrap\n * @param options - Resolved MCP options\n */\nexport function wrapTransportSend(transport: MCPTransport, options: ResolvedMcpOptions): void {\n if (transport.send) {\n fill(transport, 'send', originalSend => {\n return async function (this: MCPTransport, ...args: unknown[]) {\n const [message] = args;\n\n if (isJsonRpcNotification(message)) {\n return createMcpOutgoingNotificationSpan(message, this, options, () => {\n return (originalSend as (...args: unknown[]) => unknown).call(this, ...args);\n });\n }\n\n if (isJsonRpcResponse(message)) {\n if (message.id !== null && message.id !== undefined) {\n if (message.error) {\n captureJsonRpcErrorResponse(message.error);\n }\n\n if (isValidContentItem(message.result)) {\n if (message.result.protocolVersion || message.result.serverInfo) {\n try {\n const serverData = extractSessionDataFromInitializeResponse(message.result);\n updateSessionDataForTransport(this, serverData);\n } catch {\n // noop\n }\n }\n }\n\n completeSpanWithResults(this, message.id, message.result, options, !!message.error);\n }\n }\n\n return (originalSend as (...args: unknown[]) => unknown).call(this, ...args);\n };\n });\n }\n}\n\n/**\n * Wraps transport.onclose to clean up pending spans for this transport only\n * @param transport - MCP transport instance to wrap\n */\nexport function wrapTransportOnClose(transport: MCPTransport): void {\n if (transport.onclose) {\n fill(transport, 'onclose', originalOnClose => {\n return function (this: MCPTransport, ...args: unknown[]) {\n cleanupPendingSpansForTransport(this);\n cleanupSessionDataForTransport(this);\n return (originalOnClose as (...args: unknown[]) => unknown).call(this, ...args);\n };\n });\n }\n}\n\n/**\n * Wraps transport error handlers to capture connection errors\n * @param transport - MCP transport instance to wrap\n */\nexport function wrapTransportError(transport: MCPTransport): void {\n if (transport.onerror) {\n fill(transport, 'onerror', (originalOnError: (error: Error) => void) => {\n return function (this: MCPTransport, error: Error) {\n captureTransportError(error);\n return originalOnError.call(this, error);\n };\n });\n }\n}\n\n/**\n * Captures JSON-RPC error responses for server-side errors.\n * @see https://www.jsonrpc.org/specification#error_object\n * @internal\n * @param errorResponse - JSON-RPC error response\n */\nfunction captureJsonRpcErrorResponse(errorResponse: unknown): void {\n try {\n if (errorResponse && typeof errorResponse === 'object' && 'code' in errorResponse && 'message' in errorResponse) {\n const jsonRpcError = errorResponse as { code: number; message: string; data?: unknown };\n\n const isServerError =\n jsonRpcError.code === -32603 || (jsonRpcError.code >= -32099 && jsonRpcError.code <= -32000);\n\n if (isServerError) {\n const error = new Error(jsonRpcError.message);\n error.name = `JsonRpcError_${jsonRpcError.code}`;\n\n captureError(error, 'protocol');\n }\n }\n } catch {\n // noop\n }\n}\n\n/**\n * Captures transport connection errors\n * @internal\n * @param error - Transport error\n */\nfunction captureTransportError(error: Error): void {\n try {\n captureError(error, 'transport');\n } catch {\n // noop\n }\n}\n"],"names":["fill","isJsonRpcRequest","extractSessionDataFromInitializeRequest","storeSessionDataForTransport","getIsolationScope","withIsolationScope","buildMcpServerSpanConfig","startInactiveSpan","buildClientAttributesFromInfo","MCP_PROTOCOL_VERSION_ATTRIBUTE","storeSpanForRequest","withActiveSpan","isJsonRpcNotification","createMcpNotificationSpan","createMcpOutgoingNotificationSpan","isJsonRpcResponse","isValidContentItem","extractSessionDataFromInitializeResponse","updateSessionDataForTransport","completeSpanWithResults","cleanupPendingSpansForTransport","cleanupSessionDataForTransport","captureError"],"mappings":"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"}
@@ -59,7 +59,10 @@ function isJsonRpcResponse(message) {
59
59
  }
60
60
 
61
61
  /**
62
- * Validates MCP server instance with type checking
62
+ * Validates MCP server instance with type checking.
63
+ * Accepts both the legacy API (`tool`, `resource`, `prompt`) used in SDK 1.x
64
+ * and the newer API (`registerTool`, `registerResource`, `registerPrompt`) introduced
65
+ * alongside the legacy API in SDK 1.x and made the only option in SDK 2.x.
63
66
  * @param instance - Object to validate as MCP server instance
64
67
  * @returns True if instance has required MCP server methods
65
68
  */
@@ -67,10 +70,9 @@ function validateMcpServerInstance(instance) {
67
70
  if (
68
71
  typeof instance === 'object' &&
69
72
  instance !== null &&
70
- 'resource' in instance &&
71
- 'tool' in instance &&
72
- 'prompt' in instance &&
73
- 'connect' in instance
73
+ 'connect' in instance &&
74
+ (('tool' in instance && 'resource' in instance && 'prompt' in instance) ||
75
+ ('registerTool' in instance && 'registerResource' in instance && 'registerPrompt' in instance))
74
76
  ) {
75
77
  return true;
76
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sources":["../../../../src/integrations/mcp-server/validation.ts"],"sourcesContent":["/**\n * Message validation functions for MCP server instrumentation\n *\n * Provides JSON-RPC 2.0 message type validation and MCP server instance validation.\n */\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { debug } from '../../utils/debug-logger';\nimport type { JsonRpcNotification, JsonRpcRequest, JsonRpcResponse } from './types';\n\n/**\n * Validates if a message is a JSON-RPC request\n * @param message - Message to validate\n * @returns True if message is a JSON-RPC request\n */\nexport function isJsonRpcRequest(message: unknown): message is JsonRpcRequest {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n (message as JsonRpcRequest).jsonrpc === '2.0' &&\n 'method' in message &&\n 'id' in message\n );\n}\n\n/**\n * Validates if a message is a JSON-RPC notification\n * @param message - Message to validate\n * @returns True if message is a JSON-RPC notification\n */\nexport function isJsonRpcNotification(message: unknown): message is JsonRpcNotification {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n (message as JsonRpcNotification).jsonrpc === '2.0' &&\n 'method' in message &&\n !('id' in message)\n );\n}\n\n/**\n * Validates if a message is a JSON-RPC response\n * @param message - Message to validate\n * @returns True if message is a JSON-RPC response\n */\nexport function isJsonRpcResponse(message: unknown): message is JsonRpcResponse {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n (message as { jsonrpc: string }).jsonrpc === '2.0' &&\n 'id' in message &&\n ('result' in message || 'error' in message)\n );\n}\n\n/**\n * Validates MCP server instance with type checking\n * @param instance - Object to validate as MCP server instance\n * @returns True if instance has required MCP server methods\n */\nexport function validateMcpServerInstance(instance: unknown): boolean {\n if (\n typeof instance === 'object' &&\n instance !== null &&\n 'resource' in instance &&\n 'tool' in instance &&\n 'prompt' in instance &&\n 'connect' in instance\n ) {\n return true;\n }\n DEBUG_BUILD && debug.warn('Did not patch MCP server. Interface is incompatible.');\n return false;\n}\n\n/**\n * Check if the item is a valid content item\n * @param item - The item to check\n * @returns True if the item is a valid content item, false otherwise\n */\nexport function isValidContentItem(item: unknown): item is Record<string, unknown> {\n return item != null && typeof item === 'object';\n}\n"],"names":["DEBUG_BUILD","debug"],"mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;;;AAMA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,CAAC,OAAO,EAAsC;AAC9E,EAAE;AACF,IAAI,OAAO,OAAA,KAAY,QAAA;AACvB,IAAI,OAAA,KAAY,IAAA;AAChB,IAAI,SAAA,IAAa,OAAA;AACjB,IAAI,CAAC,OAAA,GAA2B,OAAA,KAAY,KAAA;AAC5C,IAAI,QAAA,IAAY,OAAA;AAChB,IAAI,QAAQ;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,qBAAqB,CAAC,OAAO,EAA2C;AACxF,EAAE;AACF,IAAI,OAAO,OAAA,KAAY,QAAA;AACvB,IAAI,OAAA,KAAY,IAAA;AAChB,IAAI,SAAA,IAAa,OAAA;AACjB,IAAI,CAAC,OAAA,GAAgC,OAAA,KAAY,KAAA;AACjD,IAAI,QAAA,IAAY,OAAA;AAChB,IAAI,EAAE,IAAA,IAAQ,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB,CAAC,OAAO,EAAuC;AAChF,EAAE;AACF,IAAI,OAAO,OAAA,KAAY,QAAA;AACvB,IAAI,OAAA,KAAY,IAAA;AAChB,IAAI,SAAA,IAAa,OAAA;AACjB,IAAI,CAAC,OAAA,GAAgC,OAAA,KAAY,KAAA;AACjD,IAAI,IAAA,IAAQ,OAAA;AACZ,KAAK,QAAA,IAAY,WAAW,OAAA,IAAW,OAAO;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,yBAAyB,CAAC,QAAQ,EAAoB;AACtE,EAAE;AACF,IAAI,OAAO,QAAA,KAAa,QAAA;AACxB,IAAI,QAAA,KAAa,IAAA;AACjB,IAAI,UAAA,IAAc,QAAA;AAClB,IAAI,MAAA,IAAU,QAAA;AACd,IAAI,QAAA,IAAY,QAAA;AAChB,IAAI,aAAa;AACjB,IAAI;AACJ,IAAI,OAAO,IAAI;AACf,EAAE;AACF,EAAEA,0BAAeC,iBAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC;AACnF,EAAE,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,IAAI,EAA4C;AACnF,EAAE,OAAO,QAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAQ;AACjD;;;;;;;;"}
1
+ {"version":3,"file":"validation.js","sources":["../../../../src/integrations/mcp-server/validation.ts"],"sourcesContent":["/**\n * Message validation functions for MCP server instrumentation\n *\n * Provides JSON-RPC 2.0 message type validation and MCP server instance validation.\n */\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { debug } from '../../utils/debug-logger';\nimport type { JsonRpcNotification, JsonRpcRequest, JsonRpcResponse } from './types';\n\n/**\n * Validates if a message is a JSON-RPC request\n * @param message - Message to validate\n * @returns True if message is a JSON-RPC request\n */\nexport function isJsonRpcRequest(message: unknown): message is JsonRpcRequest {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n (message as JsonRpcRequest).jsonrpc === '2.0' &&\n 'method' in message &&\n 'id' in message\n );\n}\n\n/**\n * Validates if a message is a JSON-RPC notification\n * @param message - Message to validate\n * @returns True if message is a JSON-RPC notification\n */\nexport function isJsonRpcNotification(message: unknown): message is JsonRpcNotification {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n (message as JsonRpcNotification).jsonrpc === '2.0' &&\n 'method' in message &&\n !('id' in message)\n );\n}\n\n/**\n * Validates if a message is a JSON-RPC response\n * @param message - Message to validate\n * @returns True if message is a JSON-RPC response\n */\nexport function isJsonRpcResponse(message: unknown): message is JsonRpcResponse {\n return (\n typeof message === 'object' &&\n message !== null &&\n 'jsonrpc' in message &&\n (message as { jsonrpc: string }).jsonrpc === '2.0' &&\n 'id' in message &&\n ('result' in message || 'error' in message)\n );\n}\n\n/**\n * Validates MCP server instance with type checking.\n * Accepts both the legacy API (`tool`, `resource`, `prompt`) used in SDK 1.x\n * and the newer API (`registerTool`, `registerResource`, `registerPrompt`) introduced\n * alongside the legacy API in SDK 1.x and made the only option in SDK 2.x.\n * @param instance - Object to validate as MCP server instance\n * @returns True if instance has required MCP server methods\n */\nexport function validateMcpServerInstance(instance: unknown): boolean {\n if (\n typeof instance === 'object' &&\n instance !== null &&\n 'connect' in instance &&\n (('tool' in instance && 'resource' in instance && 'prompt' in instance) ||\n ('registerTool' in instance && 'registerResource' in instance && 'registerPrompt' in instance))\n ) {\n return true;\n }\n DEBUG_BUILD && debug.warn('Did not patch MCP server. Interface is incompatible.');\n return false;\n}\n\n/**\n * Check if the item is a valid content item\n * @param item - The item to check\n * @returns True if the item is a valid content item, false otherwise\n */\nexport function isValidContentItem(item: unknown): item is Record<string, unknown> {\n return item != null && typeof item === 'object';\n}\n"],"names":["DEBUG_BUILD","debug"],"mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;;;AAMA;AACA;AACA;AACA;AACA;AACO,SAAS,gBAAgB,CAAC,OAAO,EAAsC;AAC9E,EAAE;AACF,IAAI,OAAO,OAAA,KAAY,QAAA;AACvB,IAAI,OAAA,KAAY,IAAA;AAChB,IAAI,SAAA,IAAa,OAAA;AACjB,IAAI,CAAC,OAAA,GAA2B,OAAA,KAAY,KAAA;AAC5C,IAAI,QAAA,IAAY,OAAA;AAChB,IAAI,QAAQ;AACZ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,qBAAqB,CAAC,OAAO,EAA2C;AACxF,EAAE;AACF,IAAI,OAAO,OAAA,KAAY,QAAA;AACvB,IAAI,OAAA,KAAY,IAAA;AAChB,IAAI,SAAA,IAAa,OAAA;AACjB,IAAI,CAAC,OAAA,GAAgC,OAAA,KAAY,KAAA;AACjD,IAAI,QAAA,IAAY,OAAA;AAChB,IAAI,EAAE,IAAA,IAAQ,OAAO;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,iBAAiB,CAAC,OAAO,EAAuC;AAChF,EAAE;AACF,IAAI,OAAO,OAAA,KAAY,QAAA;AACvB,IAAI,OAAA,KAAY,IAAA;AAChB,IAAI,SAAA,IAAa,OAAA;AACjB,IAAI,CAAC,OAAA,GAAgC,OAAA,KAAY,KAAA;AACjD,IAAI,IAAA,IAAQ,OAAA;AACZ,KAAK,QAAA,IAAY,WAAW,OAAA,IAAW,OAAO;AAC9C;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAAS,yBAAyB,CAAC,QAAQ,EAAoB;AACtE,EAAE;AACF,IAAI,OAAO,QAAA,KAAa,QAAA;AACxB,IAAI,QAAA,KAAa,IAAA;AACjB,IAAI,SAAA,IAAa,QAAA;AACjB,KAAK,CAAC,MAAA,IAAU,QAAA,IAAY,UAAA,IAAc,QAAA,IAAY,QAAA,IAAY,QAAQ;AAC1E,OAAO,cAAA,IAAkB,QAAA,IAAY,kBAAA,IAAsB,QAAA,IAAY,gBAAA,IAAoB,QAAQ,CAAC;AACpG,IAAI;AACJ,IAAI,OAAO,IAAI;AACf,EAAE;AACF,EAAEA,0BAAeC,iBAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC;AACnF,EAAE,OAAO,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACO,SAAS,kBAAkB,CAAC,IAAI,EAA4C;AACnF,EAAE,OAAO,QAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAQ;AACjD;;;;;;;;"}
@@ -0,0 +1,48 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ const debugBuild = require('../debug-build.js');
4
+ const integration = require('../integration.js');
5
+ const beforeSendSpan = require('../tracing/spans/beforeSendSpan.js');
6
+ const captureSpan = require('../tracing/spans/captureSpan.js');
7
+ const hasSpanStreamingEnabled = require('../tracing/spans/hasSpanStreamingEnabled.js');
8
+ const spanBuffer = require('../tracing/spans/spanBuffer.js');
9
+ const debugLogger = require('../utils/debug-logger.js');
10
+ const spanUtils = require('../utils/spanUtils.js');
11
+
12
+ const spanStreamingIntegration = integration.defineIntegration(() => {
13
+ return {
14
+ name: 'SpanStreaming',
15
+
16
+ setup(client) {
17
+ const initialMessage = 'SpanStreaming integration requires';
18
+ const fallbackMsg = 'Falling back to static trace lifecycle.';
19
+ const clientOptions = client.getOptions();
20
+
21
+ if (!hasSpanStreamingEnabled.hasSpanStreamingEnabled(client)) {
22
+ clientOptions.traceLifecycle = 'static';
23
+ debugBuild.DEBUG_BUILD && debugLogger.debug.warn(`${initialMessage} \`traceLifecycle\` to be set to "stream"! ${fallbackMsg}`);
24
+ return;
25
+ }
26
+
27
+ const beforeSendSpan$1 = clientOptions.beforeSendSpan;
28
+ if (beforeSendSpan$1 && !beforeSendSpan.isStreamedBeforeSendSpanCallback(beforeSendSpan$1)) {
29
+ clientOptions.traceLifecycle = 'static';
30
+ debugBuild.DEBUG_BUILD &&
31
+ debugLogger.debug.warn(`${initialMessage} a beforeSendSpan callback using \`withStreamedSpan\`! ${fallbackMsg}`);
32
+ return;
33
+ }
34
+
35
+ const buffer = new spanBuffer.SpanBuffer(client);
36
+
37
+ client.on('afterSpanEnd', span => {
38
+ if (!spanUtils.spanIsSampled(span)) {
39
+ return;
40
+ }
41
+ buffer.add(captureSpan.captureSpan(span, client));
42
+ });
43
+ },
44
+ };
45
+ }) ;
46
+
47
+ exports.spanStreamingIntegration = spanStreamingIntegration;
48
+ //# sourceMappingURL=spanStreaming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spanStreaming.js","sources":["../../../src/integrations/spanStreaming.ts"],"sourcesContent":["import type { IntegrationFn } from '../types-hoist/integration';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { defineIntegration } from '../integration';\nimport { isStreamedBeforeSendSpanCallback } from '../tracing/spans/beforeSendSpan';\nimport { captureSpan } from '../tracing/spans/captureSpan';\nimport { hasSpanStreamingEnabled } from '../tracing/spans/hasSpanStreamingEnabled';\nimport { SpanBuffer } from '../tracing/spans/spanBuffer';\nimport { debug } from '../utils/debug-logger';\nimport { spanIsSampled } from '../utils/spanUtils';\n\nexport const spanStreamingIntegration = defineIntegration(() => {\n return {\n name: 'SpanStreaming',\n\n setup(client) {\n const initialMessage = 'SpanStreaming integration requires';\n const fallbackMsg = 'Falling back to static trace lifecycle.';\n const clientOptions = client.getOptions();\n\n if (!hasSpanStreamingEnabled(client)) {\n clientOptions.traceLifecycle = 'static';\n DEBUG_BUILD && debug.warn(`${initialMessage} \\`traceLifecycle\\` to be set to \"stream\"! ${fallbackMsg}`);\n return;\n }\n\n const beforeSendSpan = clientOptions.beforeSendSpan;\n if (beforeSendSpan && !isStreamedBeforeSendSpanCallback(beforeSendSpan)) {\n clientOptions.traceLifecycle = 'static';\n DEBUG_BUILD &&\n debug.warn(`${initialMessage} a beforeSendSpan callback using \\`withStreamedSpan\\`! ${fallbackMsg}`);\n return;\n }\n\n const buffer = new SpanBuffer(client);\n\n client.on('afterSpanEnd', span => {\n if (!spanIsSampled(span)) {\n return;\n }\n buffer.add(captureSpan(span, client));\n });\n },\n };\n}) satisfies IntegrationFn;\n"],"names":["defineIntegration","hasSpanStreamingEnabled","DEBUG_BUILD","debug","beforeSendSpan","isStreamedBeforeSendSpanCallback","SpanBuffer","spanIsSampled","captureSpan"],"mappings":";;;;;;;;;;;MAUa,wBAAA,GAA2BA,6BAAiB,CAAC,MAAM;AAChE,EAAE,OAAO;AACT,IAAI,IAAI,EAAE,eAAe;;AAEzB,IAAI,KAAK,CAAC,MAAM,EAAE;AAClB,MAAM,MAAM,cAAA,GAAiB,oCAAoC;AACjE,MAAM,MAAM,WAAA,GAAc,yCAAyC;AACnE,MAAM,MAAM,aAAA,GAAgB,MAAM,CAAC,UAAU,EAAE;;AAE/C,MAAM,IAAI,CAACC,+CAAuB,CAAC,MAAM,CAAC,EAAE;AAC5C,QAAQ,aAAa,CAAC,cAAA,GAAiB,QAAQ;AAC/C,QAAQC,0BAAeC,iBAAK,CAAC,IAAI,CAAC,CAAC,EAAA,cAAA,CAAA,2CAAA,EAAA,WAAA,CAAA,CAAA,CAAA;AACA,QAAA;AACA,MAAA;;AAEA,MAAA,MAAAC,gBAAA,GAAA,aAAA,CAAA,cAAA;AACA,MAAA,IAAAA,gBAAA,IAAA,CAAAC,+CAAA,CAAAD,gBAAA,CAAA,EAAA;AACA,QAAA,aAAA,CAAA,cAAA,GAAA,QAAA;AACA,QAAAF,sBAAA;AACA,UAAAC,iBAAA,CAAA,IAAA,CAAA,CAAA,EAAA,cAAA,CAAA,uDAAA,EAAA,WAAA,CAAA,CAAA,CAAA;AACA,QAAA;AACA,MAAA;;AAEA,MAAA,MAAA,MAAA,GAAA,IAAAG,qBAAA,CAAA,MAAA,CAAA;;AAEA,MAAA,MAAA,CAAA,EAAA,CAAA,cAAA,EAAA,IAAA,IAAA;AACA,QAAA,IAAA,CAAAC,uBAAA,CAAA,IAAA,CAAA,EAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA,MAAA,CAAA,GAAA,CAAAC,uBAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AACA,MAAA,CAAA,CAAA;AACA,IAAA,CAAA;AACA,GAAA;AACA,CAAA,CAAA;;;;"}
@@ -340,7 +340,7 @@ function instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder) {
340
340
  span.end();
341
341
  }
342
342
 
343
- if (res.error) {
343
+ if (res?.error) {
344
344
  const err = new Error(res.error.message) ;
345
345
  if (res.error.code) {
346
346
  err.code = res.error.code;
@@ -1 +1 @@
1
- {"version":3,"file":"supabase.js","sources":["../../../src/integrations/supabase.ts"],"sourcesContent":["// Based on Kamil Ogórek's work on:\n// https://github.com/supabase-community/sentry-integration-js\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable max-lines */\nimport { addBreadcrumb } from '../breadcrumbs';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { captureException } from '../exports';\nimport { defineIntegration } from '../integration';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes';\nimport { setHttpStatus, SPAN_STATUS_ERROR, SPAN_STATUS_OK, startSpan } from '../tracing';\nimport type { IntegrationFn } from '../types-hoist/integration';\nimport { debug } from '../utils/debug-logger';\nimport { isPlainObject } from '../utils/is';\nimport { addExceptionMechanism } from '../utils/misc';\n\nconst AUTH_OPERATIONS_TO_INSTRUMENT = [\n 'reauthenticate',\n 'signInAnonymously',\n 'signInWithOAuth',\n 'signInWithIdToken',\n 'signInWithOtp',\n 'signInWithPassword',\n 'signInWithSSO',\n 'signOut',\n 'signUp',\n 'verifyOtp',\n];\n\nconst AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT = [\n 'createUser',\n 'deleteUser',\n 'listUsers',\n 'getUserById',\n 'updateUserById',\n 'inviteUserByEmail',\n];\n\nexport const FILTER_MAPPINGS = {\n eq: 'eq',\n neq: 'neq',\n gt: 'gt',\n gte: 'gte',\n lt: 'lt',\n lte: 'lte',\n like: 'like',\n 'like(all)': 'likeAllOf',\n 'like(any)': 'likeAnyOf',\n ilike: 'ilike',\n 'ilike(all)': 'ilikeAllOf',\n 'ilike(any)': 'ilikeAnyOf',\n is: 'is',\n in: 'in',\n cs: 'contains',\n cd: 'containedBy',\n sr: 'rangeGt',\n nxl: 'rangeGte',\n sl: 'rangeLt',\n nxr: 'rangeLte',\n adj: 'rangeAdjacent',\n ov: 'overlaps',\n fts: '',\n plfts: 'plain',\n phfts: 'phrase',\n wfts: 'websearch',\n not: 'not',\n};\n\nexport const DB_OPERATIONS_TO_INSTRUMENT = ['select', 'insert', 'upsert', 'update', 'delete'];\n\ntype AuthOperationFn = (...args: unknown[]) => Promise<unknown>;\ntype AuthOperationName = (typeof AUTH_OPERATIONS_TO_INSTRUMENT)[number];\ntype AuthAdminOperationName = (typeof AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT)[number];\ntype PostgRESTQueryOperationFn = (...args: unknown[]) => PostgRESTFilterBuilder;\n\nexport interface SupabaseClientInstance {\n auth: {\n admin: Record<AuthAdminOperationName, AuthOperationFn>;\n } & Record<AuthOperationName, AuthOperationFn>;\n}\n\nexport interface PostgRESTQueryBuilder {\n [key: string]: PostgRESTQueryOperationFn;\n}\n\nexport interface PostgRESTFilterBuilder {\n method: string;\n headers: Record<string, string>;\n url: URL;\n schema: string;\n body: any;\n}\n\nexport interface SupabaseResponse {\n status?: number;\n error?: {\n message: string;\n code?: string;\n details?: unknown;\n };\n}\n\nexport interface SupabaseError extends Error {\n code?: string;\n details?: unknown;\n}\n\nexport interface SupabaseBreadcrumb {\n type: string;\n category: string;\n message: string;\n data?: {\n query?: string[];\n body?: Record<string, unknown>;\n };\n}\n\nexport interface SupabaseClientConstructor {\n prototype: {\n from: (table: string) => PostgRESTQueryBuilder;\n };\n}\n\nexport interface PostgRESTProtoThenable {\n then: <T>(\n onfulfilled?: ((value: T) => T | PromiseLike<T>) | null,\n onrejected?: ((reason: any) => T | PromiseLike<T>) | null,\n ) => Promise<T>;\n}\n\ntype SentryInstrumented<T> = T & {\n __SENTRY_INSTRUMENTED__?: boolean;\n};\n\nfunction markAsInstrumented<T>(fn: T): void {\n try {\n (fn as SentryInstrumented<T>).__SENTRY_INSTRUMENTED__ = true;\n } catch {\n // ignore errors here\n }\n}\n\nfunction isInstrumented<T>(fn: T): boolean | undefined {\n try {\n return (fn as SentryInstrumented<T>).__SENTRY_INSTRUMENTED__;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts the database operation type from the HTTP method and headers\n * @param method - The HTTP method of the request\n * @param headers - The request headers\n * @returns The database operation type ('select', 'insert', 'upsert', 'update', or 'delete')\n */\nexport function extractOperation(method: string, headers: Record<string, string> = {}): string {\n switch (method) {\n case 'GET': {\n return 'select';\n }\n case 'POST': {\n if (headers['Prefer']?.includes('resolution=')) {\n return 'upsert';\n } else {\n return 'insert';\n }\n }\n case 'PATCH': {\n return 'update';\n }\n case 'DELETE': {\n return 'delete';\n }\n default: {\n return '<unknown-op>';\n }\n }\n}\n\n/**\n * Translates Supabase filter parameters into readable method names for tracing\n * @param key - The filter key from the URL search parameters\n * @param query - The filter value from the URL search parameters\n * @returns A string representation of the filter as a method call\n */\nexport function translateFiltersIntoMethods(key: string, query: string): string {\n if (query === '' || query === '*') {\n return 'select(*)';\n }\n\n if (key === 'select') {\n return `select(${query})`;\n }\n\n if (key === 'or' || key.endsWith('.or')) {\n return `${key}${query}`;\n }\n\n const [filter, ...value] = query.split('.');\n\n let method;\n // Handle optional `configPart` of the filter\n if (filter?.startsWith('fts')) {\n method = 'textSearch';\n } else if (filter?.startsWith('plfts')) {\n method = 'textSearch[plain]';\n } else if (filter?.startsWith('phfts')) {\n method = 'textSearch[phrase]';\n } else if (filter?.startsWith('wfts')) {\n method = 'textSearch[websearch]';\n } else {\n method = (filter && FILTER_MAPPINGS[filter as keyof typeof FILTER_MAPPINGS]) || 'filter';\n }\n\n return `${method}(${key}, ${value.join('.')})`;\n}\n\nfunction instrumentAuthOperation(operation: AuthOperationFn, isAdmin = false): AuthOperationFn {\n return new Proxy(operation, {\n apply(target, thisArg, argumentsList) {\n return startSpan(\n {\n name: `auth ${isAdmin ? '(admin) ' : ''}${operation.name}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.db.supabase',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db',\n 'db.system': 'postgresql',\n 'db.operation': `auth.${isAdmin ? 'admin.' : ''}${operation.name}`,\n },\n },\n span => {\n return Reflect.apply(target, thisArg, argumentsList)\n .then((res: unknown) => {\n if (res && typeof res === 'object' && 'error' in res && res.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n\n captureException(res.error, {\n mechanism: {\n handled: false,\n type: 'auto.db.supabase.auth',\n },\n });\n } else {\n span.setStatus({ code: SPAN_STATUS_OK });\n }\n\n span.end();\n return res;\n })\n .catch((err: unknown) => {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n span.end();\n\n captureException(err, {\n mechanism: {\n handled: false,\n type: 'auto.db.supabase.auth',\n },\n });\n\n throw err;\n })\n .then(...argumentsList);\n },\n );\n },\n });\n}\n\nfunction instrumentSupabaseAuthClient(supabaseClientInstance: SupabaseClientInstance): void {\n const auth = supabaseClientInstance.auth;\n\n if (!auth || isInstrumented(supabaseClientInstance.auth)) {\n return;\n }\n\n for (const operation of AUTH_OPERATIONS_TO_INSTRUMENT) {\n const authOperation = auth[operation];\n\n if (!authOperation) {\n continue;\n }\n\n if (typeof supabaseClientInstance.auth[operation] === 'function') {\n supabaseClientInstance.auth[operation] = instrumentAuthOperation(authOperation);\n }\n }\n\n for (const operation of AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT) {\n const authOperation = auth.admin[operation];\n\n if (!authOperation) {\n continue;\n }\n\n if (typeof supabaseClientInstance.auth.admin[operation] === 'function') {\n supabaseClientInstance.auth.admin[operation] = instrumentAuthOperation(authOperation, true);\n }\n }\n\n markAsInstrumented(supabaseClientInstance.auth);\n}\n\nfunction instrumentSupabaseClientConstructor(SupabaseClient: unknown): void {\n if (isInstrumented((SupabaseClient as SupabaseClientConstructor).prototype.from)) {\n return;\n }\n\n (SupabaseClient as SupabaseClientConstructor).prototype.from = new Proxy(\n (SupabaseClient as SupabaseClientConstructor).prototype.from,\n {\n apply(target, thisArg, argumentsList) {\n const rv = Reflect.apply(target, thisArg, argumentsList);\n const PostgRESTQueryBuilder = (rv as PostgRESTQueryBuilder).constructor;\n\n instrumentPostgRESTQueryBuilder(PostgRESTQueryBuilder as unknown as new () => PostgRESTQueryBuilder);\n\n return rv;\n },\n },\n );\n\n markAsInstrumented((SupabaseClient as SupabaseClientConstructor).prototype.from);\n}\n\nfunction instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder: PostgRESTFilterBuilder['constructor']): void {\n if (isInstrumented((PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then)) {\n return;\n }\n\n (PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then = new Proxy(\n (PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then,\n {\n apply(target, thisArg, argumentsList) {\n const operations = DB_OPERATIONS_TO_INSTRUMENT;\n const typedThis = thisArg as PostgRESTFilterBuilder;\n const operation = extractOperation(typedThis.method, typedThis.headers);\n\n if (!operations.includes(operation)) {\n return Reflect.apply(target, thisArg, argumentsList);\n }\n\n if (!typedThis?.url?.pathname || typeof typedThis.url.pathname !== 'string') {\n return Reflect.apply(target, thisArg, argumentsList);\n }\n\n const pathParts = typedThis.url.pathname.split('/');\n const table = pathParts.length > 0 ? pathParts[pathParts.length - 1] : '';\n\n const queryItems: string[] = [];\n for (const [key, value] of typedThis.url.searchParams.entries()) {\n // It's possible to have multiple entries for the same key, eg. `id=eq.7&id=eq.3`,\n // so we need to use array instead of object to collect them.\n queryItems.push(translateFiltersIntoMethods(key, value));\n }\n const body: Record<string, unknown> = Object.create(null);\n if (isPlainObject(typedThis.body)) {\n for (const [key, value] of Object.entries(typedThis.body)) {\n body[key] = value;\n }\n }\n\n // Adding operation to the beginning of the description if it's not a `select` operation\n // For example, it can be an `insert` or `update` operation but the query can be `select(...)`\n // For `select` operations, we don't need repeat it in the description\n const description = `${operation === 'select' ? '' : `${operation}${body ? '(...) ' : ''}`}${queryItems.join(\n ' ',\n )} from(${table})`;\n\n const attributes: Record<string, any> = {\n 'db.table': table,\n 'db.schema': typedThis.schema,\n 'db.url': typedThis.url.origin,\n 'db.sdk': typedThis.headers['X-Client-Info'],\n 'db.system': 'postgresql',\n 'db.operation': operation,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.db.supabase',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db',\n };\n\n if (queryItems.length) {\n attributes['db.query'] = queryItems;\n }\n\n if (Object.keys(body).length) {\n attributes['db.body'] = body;\n }\n\n return startSpan(\n {\n name: description,\n attributes,\n },\n span => {\n return (Reflect.apply(target, thisArg, []) as Promise<SupabaseResponse>)\n .then(\n (res: SupabaseResponse) => {\n if (span) {\n if (res && typeof res === 'object' && 'status' in res) {\n setHttpStatus(span, res.status || 500);\n }\n span.end();\n }\n\n if (res.error) {\n const err = new Error(res.error.message) as SupabaseError;\n if (res.error.code) {\n err.code = res.error.code;\n }\n if (res.error.details) {\n err.details = res.error.details;\n }\n\n const supabaseContext: Record<string, any> = {};\n if (queryItems.length) {\n supabaseContext.query = queryItems;\n }\n if (Object.keys(body).length) {\n supabaseContext.body = body;\n }\n\n captureException(err, scope => {\n scope.addEventProcessor(e => {\n addExceptionMechanism(e, {\n handled: false,\n type: 'auto.db.supabase.postgres',\n });\n\n return e;\n });\n\n scope.setContext('supabase', supabaseContext);\n\n return scope;\n });\n }\n\n const breadcrumb: SupabaseBreadcrumb = {\n type: 'supabase',\n category: `db.${operation}`,\n message: description,\n };\n\n const data: Record<string, unknown> = {};\n\n if (queryItems.length) {\n data.query = queryItems;\n }\n\n if (Object.keys(body).length) {\n data.body = body;\n }\n\n if (Object.keys(data).length) {\n breadcrumb.data = data;\n }\n\n addBreadcrumb(breadcrumb);\n\n return res;\n },\n (err: Error) => {\n // TODO: shouldn't we capture this error?\n if (span) {\n setHttpStatus(span, 500);\n span.end();\n }\n throw err;\n },\n )\n .then(...argumentsList);\n },\n );\n },\n },\n );\n\n markAsInstrumented((PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then);\n}\n\nfunction instrumentPostgRESTQueryBuilder(PostgRESTQueryBuilder: new () => PostgRESTQueryBuilder): void {\n // We need to wrap _all_ operations despite them sharing the same `PostgRESTFilterBuilder`\n // constructor, as we don't know which method will be called first, and we don't want to miss any calls.\n for (const operation of DB_OPERATIONS_TO_INSTRUMENT) {\n if (isInstrumented((PostgRESTQueryBuilder.prototype as Record<string, any>)[operation])) {\n continue;\n }\n\n type PostgRESTOperation = keyof Pick<PostgRESTQueryBuilder, 'select' | 'insert' | 'upsert' | 'update' | 'delete'>;\n (PostgRESTQueryBuilder.prototype as Record<string, any>)[operation as PostgRESTOperation] = new Proxy(\n (PostgRESTQueryBuilder.prototype as Record<string, any>)[operation as PostgRESTOperation],\n {\n apply(target, thisArg, argumentsList) {\n const rv = Reflect.apply(target, thisArg, argumentsList);\n const PostgRESTFilterBuilder = (rv as PostgRESTFilterBuilder).constructor;\n\n DEBUG_BUILD && debug.log(`Instrumenting ${operation} operation's PostgRESTFilterBuilder`);\n\n instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder);\n\n return rv;\n },\n },\n );\n\n markAsInstrumented((PostgRESTQueryBuilder.prototype as Record<string, any>)[operation]);\n }\n}\n\nexport const instrumentSupabaseClient = (supabaseClient: unknown): void => {\n if (!supabaseClient) {\n DEBUG_BUILD && debug.warn('Supabase integration was not installed because no Supabase client was provided.');\n return;\n }\n const SupabaseClientConstructor =\n supabaseClient.constructor === Function ? supabaseClient : supabaseClient.constructor;\n\n instrumentSupabaseClientConstructor(SupabaseClientConstructor);\n instrumentSupabaseAuthClient(supabaseClient as SupabaseClientInstance);\n};\n\nconst INTEGRATION_NAME = 'Supabase';\n\nconst _supabaseIntegration = ((supabaseClient: unknown) => {\n return {\n setupOnce() {\n instrumentSupabaseClient(supabaseClient);\n },\n name: INTEGRATION_NAME,\n };\n}) satisfies IntegrationFn;\n\nexport const supabaseIntegration = defineIntegration((options: { supabaseClient: any }) => {\n return _supabaseIntegration(options.supabaseClient);\n}) satisfies IntegrationFn;\n"],"names":["startSpan","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_OP","SPAN_STATUS_ERROR","captureException","SPAN_STATUS_OK","isPlainObject","setHttpStatus","addExceptionMechanism","addBreadcrumb","DEBUG_BUILD","debug","defineIntegration"],"mappings":"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"}
1
+ {"version":3,"file":"supabase.js","sources":["../../../src/integrations/supabase.ts"],"sourcesContent":["// Based on Kamil Ogórek's work on:\n// https://github.com/supabase-community/sentry-integration-js\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable max-lines */\nimport { addBreadcrumb } from '../breadcrumbs';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { captureException } from '../exports';\nimport { defineIntegration } from '../integration';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes';\nimport { setHttpStatus, SPAN_STATUS_ERROR, SPAN_STATUS_OK, startSpan } from '../tracing';\nimport type { IntegrationFn } from '../types-hoist/integration';\nimport { debug } from '../utils/debug-logger';\nimport { isPlainObject } from '../utils/is';\nimport { addExceptionMechanism } from '../utils/misc';\n\nconst AUTH_OPERATIONS_TO_INSTRUMENT = [\n 'reauthenticate',\n 'signInAnonymously',\n 'signInWithOAuth',\n 'signInWithIdToken',\n 'signInWithOtp',\n 'signInWithPassword',\n 'signInWithSSO',\n 'signOut',\n 'signUp',\n 'verifyOtp',\n];\n\nconst AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT = [\n 'createUser',\n 'deleteUser',\n 'listUsers',\n 'getUserById',\n 'updateUserById',\n 'inviteUserByEmail',\n];\n\nexport const FILTER_MAPPINGS = {\n eq: 'eq',\n neq: 'neq',\n gt: 'gt',\n gte: 'gte',\n lt: 'lt',\n lte: 'lte',\n like: 'like',\n 'like(all)': 'likeAllOf',\n 'like(any)': 'likeAnyOf',\n ilike: 'ilike',\n 'ilike(all)': 'ilikeAllOf',\n 'ilike(any)': 'ilikeAnyOf',\n is: 'is',\n in: 'in',\n cs: 'contains',\n cd: 'containedBy',\n sr: 'rangeGt',\n nxl: 'rangeGte',\n sl: 'rangeLt',\n nxr: 'rangeLte',\n adj: 'rangeAdjacent',\n ov: 'overlaps',\n fts: '',\n plfts: 'plain',\n phfts: 'phrase',\n wfts: 'websearch',\n not: 'not',\n};\n\nexport const DB_OPERATIONS_TO_INSTRUMENT = ['select', 'insert', 'upsert', 'update', 'delete'];\n\ntype AuthOperationFn = (...args: unknown[]) => Promise<unknown>;\ntype AuthOperationName = (typeof AUTH_OPERATIONS_TO_INSTRUMENT)[number];\ntype AuthAdminOperationName = (typeof AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT)[number];\ntype PostgRESTQueryOperationFn = (...args: unknown[]) => PostgRESTFilterBuilder;\n\nexport interface SupabaseClientInstance {\n auth: {\n admin: Record<AuthAdminOperationName, AuthOperationFn>;\n } & Record<AuthOperationName, AuthOperationFn>;\n}\n\nexport interface PostgRESTQueryBuilder {\n [key: string]: PostgRESTQueryOperationFn;\n}\n\nexport interface PostgRESTFilterBuilder {\n method: string;\n headers: Record<string, string>;\n url: URL;\n schema: string;\n body: any;\n}\n\nexport interface SupabaseResponse {\n status?: number;\n error?: {\n message: string;\n code?: string;\n details?: unknown;\n };\n}\n\nexport interface SupabaseError extends Error {\n code?: string;\n details?: unknown;\n}\n\nexport interface SupabaseBreadcrumb {\n type: string;\n category: string;\n message: string;\n data?: {\n query?: string[];\n body?: Record<string, unknown>;\n };\n}\n\nexport interface SupabaseClientConstructor {\n prototype: {\n from: (table: string) => PostgRESTQueryBuilder;\n };\n}\n\nexport interface PostgRESTProtoThenable {\n then: <T>(\n onfulfilled?: ((value: T) => T | PromiseLike<T>) | null,\n onrejected?: ((reason: any) => T | PromiseLike<T>) | null,\n ) => Promise<T>;\n}\n\ntype SentryInstrumented<T> = T & {\n __SENTRY_INSTRUMENTED__?: boolean;\n};\n\nfunction markAsInstrumented<T>(fn: T): void {\n try {\n (fn as SentryInstrumented<T>).__SENTRY_INSTRUMENTED__ = true;\n } catch {\n // ignore errors here\n }\n}\n\nfunction isInstrumented<T>(fn: T): boolean | undefined {\n try {\n return (fn as SentryInstrumented<T>).__SENTRY_INSTRUMENTED__;\n } catch {\n return false;\n }\n}\n\n/**\n * Extracts the database operation type from the HTTP method and headers\n * @param method - The HTTP method of the request\n * @param headers - The request headers\n * @returns The database operation type ('select', 'insert', 'upsert', 'update', or 'delete')\n */\nexport function extractOperation(method: string, headers: Record<string, string> = {}): string {\n switch (method) {\n case 'GET': {\n return 'select';\n }\n case 'POST': {\n if (headers['Prefer']?.includes('resolution=')) {\n return 'upsert';\n } else {\n return 'insert';\n }\n }\n case 'PATCH': {\n return 'update';\n }\n case 'DELETE': {\n return 'delete';\n }\n default: {\n return '<unknown-op>';\n }\n }\n}\n\n/**\n * Translates Supabase filter parameters into readable method names for tracing\n * @param key - The filter key from the URL search parameters\n * @param query - The filter value from the URL search parameters\n * @returns A string representation of the filter as a method call\n */\nexport function translateFiltersIntoMethods(key: string, query: string): string {\n if (query === '' || query === '*') {\n return 'select(*)';\n }\n\n if (key === 'select') {\n return `select(${query})`;\n }\n\n if (key === 'or' || key.endsWith('.or')) {\n return `${key}${query}`;\n }\n\n const [filter, ...value] = query.split('.');\n\n let method;\n // Handle optional `configPart` of the filter\n if (filter?.startsWith('fts')) {\n method = 'textSearch';\n } else if (filter?.startsWith('plfts')) {\n method = 'textSearch[plain]';\n } else if (filter?.startsWith('phfts')) {\n method = 'textSearch[phrase]';\n } else if (filter?.startsWith('wfts')) {\n method = 'textSearch[websearch]';\n } else {\n method = (filter && FILTER_MAPPINGS[filter as keyof typeof FILTER_MAPPINGS]) || 'filter';\n }\n\n return `${method}(${key}, ${value.join('.')})`;\n}\n\nfunction instrumentAuthOperation(operation: AuthOperationFn, isAdmin = false): AuthOperationFn {\n return new Proxy(operation, {\n apply(target, thisArg, argumentsList) {\n return startSpan(\n {\n name: `auth ${isAdmin ? '(admin) ' : ''}${operation.name}`,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.db.supabase',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db',\n 'db.system': 'postgresql',\n 'db.operation': `auth.${isAdmin ? 'admin.' : ''}${operation.name}`,\n },\n },\n span => {\n return Reflect.apply(target, thisArg, argumentsList)\n .then((res: unknown) => {\n if (res && typeof res === 'object' && 'error' in res && res.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n\n captureException(res.error, {\n mechanism: {\n handled: false,\n type: 'auto.db.supabase.auth',\n },\n });\n } else {\n span.setStatus({ code: SPAN_STATUS_OK });\n }\n\n span.end();\n return res;\n })\n .catch((err: unknown) => {\n span.setStatus({ code: SPAN_STATUS_ERROR });\n span.end();\n\n captureException(err, {\n mechanism: {\n handled: false,\n type: 'auto.db.supabase.auth',\n },\n });\n\n throw err;\n })\n .then(...argumentsList);\n },\n );\n },\n });\n}\n\nfunction instrumentSupabaseAuthClient(supabaseClientInstance: SupabaseClientInstance): void {\n const auth = supabaseClientInstance.auth;\n\n if (!auth || isInstrumented(supabaseClientInstance.auth)) {\n return;\n }\n\n for (const operation of AUTH_OPERATIONS_TO_INSTRUMENT) {\n const authOperation = auth[operation];\n\n if (!authOperation) {\n continue;\n }\n\n if (typeof supabaseClientInstance.auth[operation] === 'function') {\n supabaseClientInstance.auth[operation] = instrumentAuthOperation(authOperation);\n }\n }\n\n for (const operation of AUTH_ADMIN_OPERATIONS_TO_INSTRUMENT) {\n const authOperation = auth.admin[operation];\n\n if (!authOperation) {\n continue;\n }\n\n if (typeof supabaseClientInstance.auth.admin[operation] === 'function') {\n supabaseClientInstance.auth.admin[operation] = instrumentAuthOperation(authOperation, true);\n }\n }\n\n markAsInstrumented(supabaseClientInstance.auth);\n}\n\nfunction instrumentSupabaseClientConstructor(SupabaseClient: unknown): void {\n if (isInstrumented((SupabaseClient as SupabaseClientConstructor).prototype.from)) {\n return;\n }\n\n (SupabaseClient as SupabaseClientConstructor).prototype.from = new Proxy(\n (SupabaseClient as SupabaseClientConstructor).prototype.from,\n {\n apply(target, thisArg, argumentsList) {\n const rv = Reflect.apply(target, thisArg, argumentsList);\n const PostgRESTQueryBuilder = (rv as PostgRESTQueryBuilder).constructor;\n\n instrumentPostgRESTQueryBuilder(PostgRESTQueryBuilder as unknown as new () => PostgRESTQueryBuilder);\n\n return rv;\n },\n },\n );\n\n markAsInstrumented((SupabaseClient as SupabaseClientConstructor).prototype.from);\n}\n\nfunction instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder: PostgRESTFilterBuilder['constructor']): void {\n if (isInstrumented((PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then)) {\n return;\n }\n\n (PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then = new Proxy(\n (PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then,\n {\n apply(target, thisArg, argumentsList) {\n const operations = DB_OPERATIONS_TO_INSTRUMENT;\n const typedThis = thisArg as PostgRESTFilterBuilder;\n const operation = extractOperation(typedThis.method, typedThis.headers);\n\n if (!operations.includes(operation)) {\n return Reflect.apply(target, thisArg, argumentsList);\n }\n\n if (!typedThis?.url?.pathname || typeof typedThis.url.pathname !== 'string') {\n return Reflect.apply(target, thisArg, argumentsList);\n }\n\n const pathParts = typedThis.url.pathname.split('/');\n const table = pathParts.length > 0 ? pathParts[pathParts.length - 1] : '';\n\n const queryItems: string[] = [];\n for (const [key, value] of typedThis.url.searchParams.entries()) {\n // It's possible to have multiple entries for the same key, eg. `id=eq.7&id=eq.3`,\n // so we need to use array instead of object to collect them.\n queryItems.push(translateFiltersIntoMethods(key, value));\n }\n const body: Record<string, unknown> = Object.create(null);\n if (isPlainObject(typedThis.body)) {\n for (const [key, value] of Object.entries(typedThis.body)) {\n body[key] = value;\n }\n }\n\n // Adding operation to the beginning of the description if it's not a `select` operation\n // For example, it can be an `insert` or `update` operation but the query can be `select(...)`\n // For `select` operations, we don't need repeat it in the description\n const description = `${operation === 'select' ? '' : `${operation}${body ? '(...) ' : ''}`}${queryItems.join(\n ' ',\n )} from(${table})`;\n\n const attributes: Record<string, any> = {\n 'db.table': table,\n 'db.schema': typedThis.schema,\n 'db.url': typedThis.url.origin,\n 'db.sdk': typedThis.headers['X-Client-Info'],\n 'db.system': 'postgresql',\n 'db.operation': operation,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.db.supabase',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db',\n };\n\n if (queryItems.length) {\n attributes['db.query'] = queryItems;\n }\n\n if (Object.keys(body).length) {\n attributes['db.body'] = body;\n }\n\n return startSpan(\n {\n name: description,\n attributes,\n },\n span => {\n return (Reflect.apply(target, thisArg, []) as Promise<SupabaseResponse>)\n .then(\n (res: SupabaseResponse) => {\n if (span) {\n if (res && typeof res === 'object' && 'status' in res) {\n setHttpStatus(span, res.status || 500);\n }\n span.end();\n }\n\n if (res?.error) {\n const err = new Error(res.error.message) as SupabaseError;\n if (res.error.code) {\n err.code = res.error.code;\n }\n if (res.error.details) {\n err.details = res.error.details;\n }\n\n const supabaseContext: Record<string, any> = {};\n if (queryItems.length) {\n supabaseContext.query = queryItems;\n }\n if (Object.keys(body).length) {\n supabaseContext.body = body;\n }\n\n captureException(err, scope => {\n scope.addEventProcessor(e => {\n addExceptionMechanism(e, {\n handled: false,\n type: 'auto.db.supabase.postgres',\n });\n\n return e;\n });\n\n scope.setContext('supabase', supabaseContext);\n\n return scope;\n });\n }\n\n const breadcrumb: SupabaseBreadcrumb = {\n type: 'supabase',\n category: `db.${operation}`,\n message: description,\n };\n\n const data: Record<string, unknown> = {};\n\n if (queryItems.length) {\n data.query = queryItems;\n }\n\n if (Object.keys(body).length) {\n data.body = body;\n }\n\n if (Object.keys(data).length) {\n breadcrumb.data = data;\n }\n\n addBreadcrumb(breadcrumb);\n\n return res;\n },\n (err: Error) => {\n // TODO: shouldn't we capture this error?\n if (span) {\n setHttpStatus(span, 500);\n span.end();\n }\n throw err;\n },\n )\n .then(...argumentsList);\n },\n );\n },\n },\n );\n\n markAsInstrumented((PostgRESTFilterBuilder.prototype as unknown as PostgRESTProtoThenable).then);\n}\n\nfunction instrumentPostgRESTQueryBuilder(PostgRESTQueryBuilder: new () => PostgRESTQueryBuilder): void {\n // We need to wrap _all_ operations despite them sharing the same `PostgRESTFilterBuilder`\n // constructor, as we don't know which method will be called first, and we don't want to miss any calls.\n for (const operation of DB_OPERATIONS_TO_INSTRUMENT) {\n if (isInstrumented((PostgRESTQueryBuilder.prototype as Record<string, any>)[operation])) {\n continue;\n }\n\n type PostgRESTOperation = keyof Pick<PostgRESTQueryBuilder, 'select' | 'insert' | 'upsert' | 'update' | 'delete'>;\n (PostgRESTQueryBuilder.prototype as Record<string, any>)[operation as PostgRESTOperation] = new Proxy(\n (PostgRESTQueryBuilder.prototype as Record<string, any>)[operation as PostgRESTOperation],\n {\n apply(target, thisArg, argumentsList) {\n const rv = Reflect.apply(target, thisArg, argumentsList);\n const PostgRESTFilterBuilder = (rv as PostgRESTFilterBuilder).constructor;\n\n DEBUG_BUILD && debug.log(`Instrumenting ${operation} operation's PostgRESTFilterBuilder`);\n\n instrumentPostgRESTFilterBuilder(PostgRESTFilterBuilder);\n\n return rv;\n },\n },\n );\n\n markAsInstrumented((PostgRESTQueryBuilder.prototype as Record<string, any>)[operation]);\n }\n}\n\nexport const instrumentSupabaseClient = (supabaseClient: unknown): void => {\n if (!supabaseClient) {\n DEBUG_BUILD && debug.warn('Supabase integration was not installed because no Supabase client was provided.');\n return;\n }\n const SupabaseClientConstructor =\n supabaseClient.constructor === Function ? supabaseClient : supabaseClient.constructor;\n\n instrumentSupabaseClientConstructor(SupabaseClientConstructor);\n instrumentSupabaseAuthClient(supabaseClient as SupabaseClientInstance);\n};\n\nconst INTEGRATION_NAME = 'Supabase';\n\nconst _supabaseIntegration = ((supabaseClient: unknown) => {\n return {\n setupOnce() {\n instrumentSupabaseClient(supabaseClient);\n },\n name: INTEGRATION_NAME,\n };\n}) satisfies IntegrationFn;\n\nexport const supabaseIntegration = defineIntegration((options: { supabaseClient: any }) => {\n return _supabaseIntegration(options.supabaseClient);\n}) satisfies IntegrationFn;\n"],"names":["startSpan","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_OP","SPAN_STATUS_ERROR","captureException","SPAN_STATUS_OK","isPlainObject","setHttpStatus","addExceptionMechanism","addBreadcrumb","DEBUG_BUILD","debug","defineIntegration"],"mappings":"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"}