@sentry/core
Advanced tools
| Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| const currentScopes = require('../currentScopes.js'); | ||
| const ADD_LISTENER_METHODS = [ | ||
| "addListener", | ||
| "on", | ||
| "once", | ||
| "prependListener", | ||
| "prependOnceListener", | ||
| "addEventListener" | ||
| ]; | ||
| const REMOVE_LISTENER_METHODS = ["removeListener", "off", "removeEventListener"]; | ||
| const SCOPE_BOUND_LISTENERS = /* @__PURE__ */ Symbol("SentryScopeBoundListeners"); | ||
| let registeringWrapper; | ||
| function isReentrantWrapperRegistration(listener) { | ||
| return registeringWrapper !== void 0 && (listener === registeringWrapper || listener.listener === registeringWrapper); | ||
| } | ||
| function bindScopeToEmitter(emitter, scope = currentScopes.getCurrentScope()) { | ||
| const ee = emitter; | ||
| if (getPatchMap(ee)) { | ||
| return emitter; | ||
| } | ||
| createPatchMap(ee); | ||
| for (const methodName of ADD_LISTENER_METHODS) { | ||
| if (typeof ee[methodName] !== "function") { | ||
| continue; | ||
| } | ||
| ee[methodName] = patchAddListener(ee, ee[methodName], scope); | ||
| } | ||
| for (const methodName of REMOVE_LISTENER_METHODS) { | ||
| if (typeof ee[methodName] !== "function") { | ||
| continue; | ||
| } | ||
| ee[methodName] = patchRemoveListener(ee, ee[methodName]); | ||
| } | ||
| if (typeof ee.removeAllListeners === "function") { | ||
| ee.removeAllListeners = patchRemoveAllListeners(ee, ee.removeAllListeners); | ||
| } | ||
| return emitter; | ||
| } | ||
| function bindListenerToScope(listener, scope) { | ||
| return function(...args) { | ||
| return currentScopes.withScope(scope, () => listener.apply(this, args)); | ||
| }; | ||
| } | ||
| function isBoundListener(listener) { | ||
| return typeof listener === "function"; | ||
| } | ||
| function patchAddListener(ee, original, scope) { | ||
| return function(...args) { | ||
| const event = args[0]; | ||
| const listener = args[1]; | ||
| const rest = args.slice(2); | ||
| if (!isBoundListener(listener) || isReentrantWrapperRegistration(listener)) { | ||
| return original.apply(this, args); | ||
| } | ||
| const map = getPatchMap(ee) || createPatchMap(ee); | ||
| let listeners = map.get(event); | ||
| if (!listeners) { | ||
| listeners = /* @__PURE__ */ new WeakMap(); | ||
| map.set(event, listeners); | ||
| } | ||
| let boundListener = listeners.get(listener); | ||
| if (!boundListener) { | ||
| boundListener = bindListenerToScope(listener, scope); | ||
| listeners.set(listener, boundListener); | ||
| } | ||
| const previous = registeringWrapper; | ||
| registeringWrapper = boundListener; | ||
| try { | ||
| return original.call(this, event, boundListener, ...rest); | ||
| } finally { | ||
| registeringWrapper = previous; | ||
| } | ||
| }; | ||
| } | ||
| function patchRemoveListener(ee, original) { | ||
| return function(...args) { | ||
| const event = args[0]; | ||
| const listener = args[1]; | ||
| const rest = args.slice(2); | ||
| const boundListener = isBoundListener(listener) ? getPatchMap(ee)?.get(event)?.get(listener) : void 0; | ||
| if (!boundListener) { | ||
| return original.apply(this, args); | ||
| } | ||
| return original.call(this, event, boundListener, ...rest); | ||
| }; | ||
| } | ||
| function patchRemoveAllListeners(ee, original) { | ||
| return function(...args) { | ||
| const map = getPatchMap(ee); | ||
| if (map) { | ||
| if (args.length === 0) { | ||
| createPatchMap(ee); | ||
| } else { | ||
| const event = args[0]; | ||
| map.delete(event); | ||
| } | ||
| } | ||
| return original.apply(this, args); | ||
| }; | ||
| } | ||
| function createPatchMap(ee) { | ||
| const map = /* @__PURE__ */ new Map(); | ||
| ee[SCOPE_BOUND_LISTENERS] = map; | ||
| return map; | ||
| } | ||
| function getPatchMap(ee) { | ||
| return ee[SCOPE_BOUND_LISTENERS]; | ||
| } | ||
| exports.bindScopeToEmitter = bindScopeToEmitter; | ||
| //# sourceMappingURL=bindScopeToEmitter.js.map |
| {"version":3,"file":"bindScopeToEmitter.js","sources":["../../../src/tracing/bindScopeToEmitter.ts"],"sourcesContent":["import { getCurrentScope, withScope } from '../currentScopes';\nimport type { Scope } from '../scope';\n\ntype BoundListener = (...args: unknown[]) => unknown;\n\n/**\n * Per-event map from a user-provided listener to its single scope-bound wrapper. We reuse one stable\n * wrapper per listener (rather than minting a new one per registration) and let the underlying\n * emitter/target handle repeat registrations:\n * - Node's `EventEmitter` allows duplicates and counts them, so registering the same wrapper N times\n * fires N times and `removeListener` removes one instance per call — no orphaned wrappers.\n * - the DOM `EventTarget` dedupes by `(type, callback, capture)`, so reusing the wrapper preserves\n * that idempotency; a fresh wrapper per call would defeat it and fire the listener repeatedly.\n */\ntype ListenerPatchMap = Map<string, WeakMap<BoundListener, BoundListener>>;\n\n// We patch both Node.js `EventEmitter` registration methods (`on`, `addListener`, ...) and the DOM\n// `EventTarget.addEventListener`, so this works for Node emitters and browser-native event targets.\n\n/** Listener-registration methods we patch so listeners inherit the bound scope. */\nconst ADD_LISTENER_METHODS = [\n 'addListener',\n 'on',\n 'once',\n 'prependListener',\n 'prependOnceListener',\n 'addEventListener',\n] as const;\n/** Listener-removal methods we patch so removals find the scope-bound wrapper. */\nconst REMOVE_LISTENER_METHODS = ['removeListener', 'off', 'removeEventListener'] as const;\n\n/** Symbol under which the patch map is stashed on a bound emitter. */\nconst SCOPE_BOUND_LISTENERS = Symbol('SentryScopeBoundListeners');\n\n/**\n * Minimal structural type for a Node.js-style `EventEmitter` or DOM `EventTarget`. We intentionally\n * avoid importing `node:events` so this stays usable in non-Node environments — objects without any\n * of these methods simply pass through untouched.\n */\ntype EventEmitterLike = Record<string, unknown>;\n\n// Tracks the scope-bound wrapper currently being registered. Node's `once`/`prependOnceListener`\n// synchronously re-enter `on`/`prependListener`, passing an internal \"once wrapper\" whose `.listener`\n// is our wrapper; that re-entry must not be wrapped again. We scope the guard to that exact wrapper\n// rather than using a blanket flag for the whole registration, so unrelated listeners added in the same\n// synchronous window — e.g. from a Node `newListener` handler, or on another bound emitter — are still\n// wrapped and keep their scope. Binding is synchronous, so a module-level value (with save/restore for\n// nesting) is safe here.\nlet registeringWrapper: BoundListener | undefined;\n\n// True when `listener` is the wrapper we're mid-registering, or a Node once-wrapper around it (Node sets\n// `.listener` on the once-wrapper to the function we passed). These are the only re-entrant adds to skip.\nfunction isReentrantWrapperRegistration(listener: BoundListener): boolean {\n return (\n registeringWrapper !== undefined &&\n (listener === registeringWrapper || (listener as { listener?: unknown }).listener === registeringWrapper)\n );\n}\n\n/**\n * Binds a scope to the given event emitter, so that any listener added to it runs with that scope\n * (and therefore the active span) active — even if the listener fires later, in a different async\n * context.\n *\n * By default the currently active scope is bound, captured at the time this function is called.\n * Pass an explicit `scope` to bind a different one.\n *\n * This is useful when instrumenting APIs that hand back an event emitter (e.g. a streamed database\n * query) whose `'data'` / `'error'` / `'end'` listeners would otherwise lose the trace context.\n *\n * Works with both Node.js `EventEmitter`s (`on`, `addListener`, ...) and DOM `EventTarget`s\n * (`addEventListener`). Objects exposing none of these methods are returned untouched.\n *\n * The isolation scope is intentionally not captured — it is carried along by the active async\n * context. This mirrors the event-emitter behavior of OpenTelemetry's `ContextManager.bind`.\n */\nexport function bindScopeToEmitter<T extends object>(emitter: T, scope: Scope = getCurrentScope()): T {\n const ee = emitter as EventEmitterLike;\n\n // Already bound -> nothing to do.\n if (getPatchMap(ee)) {\n return emitter;\n }\n\n createPatchMap(ee);\n\n for (const methodName of ADD_LISTENER_METHODS) {\n if (typeof ee[methodName] !== 'function') {\n continue;\n }\n ee[methodName] = patchAddListener(ee, ee[methodName] as BoundListener, scope);\n }\n\n for (const methodName of REMOVE_LISTENER_METHODS) {\n if (typeof ee[methodName] !== 'function') {\n continue;\n }\n ee[methodName] = patchRemoveListener(ee, ee[methodName] as BoundListener);\n }\n\n if (typeof ee.removeAllListeners === 'function') {\n ee.removeAllListeners = patchRemoveAllListeners(ee, ee.removeAllListeners as BoundListener);\n }\n\n return emitter;\n}\n\n/** Wraps a listener so it runs with the given scope active. */\nfunction bindListenerToScope(listener: BoundListener, scope: Scope): BoundListener {\n return function (this: unknown, ...args: unknown[]) {\n return withScope(scope, () => listener.apply(this, args));\n };\n}\n\nfunction isBoundListener(listener: unknown): listener is BoundListener {\n return typeof listener === 'function';\n}\n\nfunction patchAddListener(ee: EventEmitterLike, original: BoundListener, scope: Scope): BoundListener {\n return function (this: unknown, ...args: unknown[]) {\n const event = args[0] as string;\n const listener = args[1];\n // Extra args (e.g. the `options` argument of `addEventListener`) must be forwarded verbatim.\n const rest = args.slice(2);\n\n // Pass through what we must not wrap: non-function listeners (e.g. `EventListener` objects passed to\n // `addEventListener`) and the re-entrant once-wrapper registration. Anything else is wrapped, even\n // when added synchronously mid-registration.\n if (!isBoundListener(listener) || isReentrantWrapperRegistration(listener)) {\n return original.apply(this, args);\n }\n\n const map = getPatchMap(ee) || createPatchMap(ee);\n let listeners = map.get(event);\n if (!listeners) {\n listeners = new WeakMap();\n map.set(event, listeners);\n }\n\n // Reuse one stable wrapper per listener so repeat registrations are handled correctly by the\n // underlying emitter/target (Node counts duplicates; the DOM dedupes by `(callback, capture)`).\n let boundListener = listeners.get(listener);\n if (!boundListener) {\n boundListener = bindListenerToScope(listener, scope);\n listeners.set(listener, boundListener);\n }\n\n const previous = registeringWrapper;\n registeringWrapper = boundListener;\n try {\n return original.call(this, event, boundListener, ...rest);\n } finally {\n registeringWrapper = previous;\n }\n };\n}\n\n// Unlike `patchRemoveAllListeners`, this intentionally leaves the map entry in place: Node counts\n// duplicate registrations, so the same wrapper may still be registered after removing one instance,\n// and later `removeListener` calls need the mapping to find it. The entry is in a `WeakMap` keyed by\n// the user listener, so it is GC'd once the user drops their reference — no manual cleanup needed.\nfunction patchRemoveListener(ee: EventEmitterLike, original: BoundListener): BoundListener {\n return function (this: unknown, ...args: unknown[]) {\n const event = args[0] as string;\n const listener = args[1];\n const rest = args.slice(2);\n\n const boundListener = isBoundListener(listener) ? getPatchMap(ee)?.get(event)?.get(listener) : undefined;\n if (!boundListener) {\n return original.apply(this, args);\n }\n // Pass the same stable wrapper and forward the caller's extra args (e.g. the `capture` option of\n // `removeEventListener`) unchanged, so the emitter/target matches the right registration itself.\n return original.call(this, event, boundListener, ...rest);\n };\n}\n\n// Safe to drop map entries here (unlike `patchRemoveListener`): this removes *every* listener for the\n// event at once, so no registration referencing those wrappers remains. It also reclaims keys from the\n// strong outer `Map` (keyed by event-name strings), which would otherwise accumulate indefinitely.\nfunction patchRemoveAllListeners(ee: EventEmitterLike, original: BoundListener): BoundListener {\n return function (this: unknown, ...args: unknown[]) {\n const map = getPatchMap(ee);\n if (map) {\n if (args.length === 0) {\n // `removeAllListeners()` with no event clears everything -> reset the map.\n createPatchMap(ee);\n } else {\n const event = args[0] as string;\n map.delete(event);\n }\n }\n return original.apply(this, args);\n };\n}\n\nfunction createPatchMap(ee: EventEmitterLike): ListenerPatchMap {\n const map: ListenerPatchMap = new Map();\n (ee as Record<symbol, ListenerPatchMap>)[SCOPE_BOUND_LISTENERS] = map;\n return map;\n}\n\nfunction getPatchMap(ee: EventEmitterLike): ListenerPatchMap | undefined {\n return (ee as Record<symbol, ListenerPatchMap | undefined>)[SCOPE_BOUND_LISTENERS];\n}\n"],"names":["getCurrentScope","withScope"],"mappings":";;;;AAoBA,MAAM,oBAAA,GAAuB;AAAA,EAC3B,aAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,uBAAA,GAA0B,CAAC,gBAAA,EAAkB,KAAA,EAAO,qBAAqB,CAAA;AAG/E,MAAM,qBAAA,0BAA+B,2BAA2B,CAAA;AAgBhE,IAAI,kBAAA;AAIJ,SAAS,+BAA+B,QAAA,EAAkC;AACxE,EAAA,OACE,kBAAA,KAAuB,MAAA,KACtB,QAAA,KAAa,kBAAA,IAAuB,SAAoC,QAAA,KAAa,kBAAA,CAAA;AAE1F;AAmBO,SAAS,kBAAA,CAAqC,OAAA,EAAY,KAAA,GAAeA,6BAAA,EAAgB,EAAM;AACpG,EAAA,MAAM,EAAA,GAAK,OAAA;AAGX,EAAA,IAAI,WAAA,CAAY,EAAE,CAAA,EAAG;AACnB,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,cAAA,CAAe,EAAE,CAAA;AAEjB,EAAA,KAAA,MAAW,cAAc,oBAAA,EAAsB;AAC7C,IAAA,IAAI,OAAO,EAAA,CAAG,UAAU,CAAA,KAAM,UAAA,EAAY;AACxC,MAAA;AAAA,IACF;AACA,IAAA,EAAA,CAAG,UAAU,CAAA,GAAI,gBAAA,CAAiB,IAAI,EAAA,CAAG,UAAU,GAAoB,KAAK,CAAA;AAAA,EAC9E;AAEA,EAAA,KAAA,MAAW,cAAc,uBAAA,EAAyB;AAChD,IAAA,IAAI,OAAO,EAAA,CAAG,UAAU,CAAA,KAAM,UAAA,EAAY;AACxC,MAAA;AAAA,IACF;AACA,IAAA,EAAA,CAAG,UAAU,CAAA,GAAI,mBAAA,CAAoB,EAAA,EAAI,EAAA,CAAG,UAAU,CAAkB,CAAA;AAAA,EAC1E;AAEA,EAAA,IAAI,OAAO,EAAA,CAAG,kBAAA,KAAuB,UAAA,EAAY;AAC/C,IAAA,EAAA,CAAG,kBAAA,GAAqB,uBAAA,CAAwB,EAAA,EAAI,EAAA,CAAG,kBAAmC,CAAA;AAAA,EAC5F;AAEA,EAAA,OAAO,OAAA;AACT;AAGA,SAAS,mBAAA,CAAoB,UAAyB,KAAA,EAA6B;AACjF,EAAA,OAAO,YAA4B,IAAA,EAAiB;AAClD,IAAA,OAAOC,wBAAU,KAAA,EAAO,MAAM,SAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,EAC1D,CAAA;AACF;AAEA,SAAS,gBAAgB,QAAA,EAA8C;AACrE,EAAA,OAAO,OAAO,QAAA,KAAa,UAAA;AAC7B;AAEA,SAAS,gBAAA,CAAiB,EAAA,EAAsB,QAAA,EAAyB,KAAA,EAA6B;AACpG,EAAA,OAAO,YAA4B,IAAA,EAAiB;AAClD,IAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,IAAA,MAAM,QAAA,GAAW,KAAK,CAAC,CAAA;AAEvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAKzB,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,IAAK,8BAAA,CAA+B,QAAQ,CAAA,EAAG;AAC1E,MAAA,OAAO,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,EAAE,CAAA,IAAK,eAAe,EAAE,CAAA;AAChD,IAAA,IAAI,SAAA,GAAY,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAC7B,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,SAAA,uBAAgB,OAAA,EAAQ;AACxB,MAAA,GAAA,CAAI,GAAA,CAAI,OAAO,SAAS,CAAA;AAAA,IAC1B;AAIA,IAAA,IAAI,aAAA,GAAgB,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AAC1C,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,aAAA,GAAgB,mBAAA,CAAoB,UAAU,KAAK,CAAA;AACnD,MAAA,SAAA,CAAU,GAAA,CAAI,UAAU,aAAa,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,QAAA,GAAW,kBAAA;AACjB,IAAA,kBAAA,GAAqB,aAAA;AACrB,IAAA,IAAI;AACF,MAAA,OAAO,SAAS,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,aAAA,EAAe,GAAG,IAAI,CAAA;AAAA,IAC1D,CAAA,SAAE;AACA,MAAA,kBAAA,GAAqB,QAAA;AAAA,IACvB;AAAA,EACF,CAAA;AACF;AAMA,SAAS,mBAAA,CAAoB,IAAsB,QAAA,EAAwC;AACzF,EAAA,OAAO,YAA4B,IAAA,EAAiB;AAClD,IAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,IAAA,MAAM,QAAA,GAAW,KAAK,CAAC,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAEzB,IAAA,MAAM,aAAA,GAAgB,eAAA,CAAgB,QAAQ,CAAA,GAAI,WAAA,CAAY,EAAE,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAC/F,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,OAAO,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAClC;AAGA,IAAA,OAAO,SAAS,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,aAAA,EAAe,GAAG,IAAI,CAAA;AAAA,EAC1D,CAAA;AACF;AAKA,SAAS,uBAAA,CAAwB,IAAsB,QAAA,EAAwC;AAC7F,EAAA,OAAO,YAA4B,IAAA,EAAiB;AAClD,IAAA,MAAM,GAAA,GAAM,YAAY,EAAE,CAAA;AAC1B,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAErB,QAAA,cAAA,CAAe,EAAE,CAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,QAAA,GAAA,CAAI,OAAO,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AACA,IAAA,OAAO,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,EAClC,CAAA;AACF;AAEA,SAAS,eAAe,EAAA,EAAwC;AAC9D,EAAA,MAAM,GAAA,uBAA4B,GAAA,EAAI;AACtC,EAAC,EAAA,CAAwC,qBAAqB,CAAA,GAAI,GAAA;AAClE,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY,EAAA,EAAoD;AACvE,EAAA,OAAQ,GAAoD,qBAAqB,CAAA;AACnF;;;;"} |
| import { getCurrentScope, withScope } from '../currentScopes.js'; | ||
| const ADD_LISTENER_METHODS = [ | ||
| "addListener", | ||
| "on", | ||
| "once", | ||
| "prependListener", | ||
| "prependOnceListener", | ||
| "addEventListener" | ||
| ]; | ||
| const REMOVE_LISTENER_METHODS = ["removeListener", "off", "removeEventListener"]; | ||
| const SCOPE_BOUND_LISTENERS = /* @__PURE__ */ Symbol("SentryScopeBoundListeners"); | ||
| let registeringWrapper; | ||
| function isReentrantWrapperRegistration(listener) { | ||
| return registeringWrapper !== void 0 && (listener === registeringWrapper || listener.listener === registeringWrapper); | ||
| } | ||
| function bindScopeToEmitter(emitter, scope = getCurrentScope()) { | ||
| const ee = emitter; | ||
| if (getPatchMap(ee)) { | ||
| return emitter; | ||
| } | ||
| createPatchMap(ee); | ||
| for (const methodName of ADD_LISTENER_METHODS) { | ||
| if (typeof ee[methodName] !== "function") { | ||
| continue; | ||
| } | ||
| ee[methodName] = patchAddListener(ee, ee[methodName], scope); | ||
| } | ||
| for (const methodName of REMOVE_LISTENER_METHODS) { | ||
| if (typeof ee[methodName] !== "function") { | ||
| continue; | ||
| } | ||
| ee[methodName] = patchRemoveListener(ee, ee[methodName]); | ||
| } | ||
| if (typeof ee.removeAllListeners === "function") { | ||
| ee.removeAllListeners = patchRemoveAllListeners(ee, ee.removeAllListeners); | ||
| } | ||
| return emitter; | ||
| } | ||
| function bindListenerToScope(listener, scope) { | ||
| return function(...args) { | ||
| return withScope(scope, () => listener.apply(this, args)); | ||
| }; | ||
| } | ||
| function isBoundListener(listener) { | ||
| return typeof listener === "function"; | ||
| } | ||
| function patchAddListener(ee, original, scope) { | ||
| return function(...args) { | ||
| const event = args[0]; | ||
| const listener = args[1]; | ||
| const rest = args.slice(2); | ||
| if (!isBoundListener(listener) || isReentrantWrapperRegistration(listener)) { | ||
| return original.apply(this, args); | ||
| } | ||
| const map = getPatchMap(ee) || createPatchMap(ee); | ||
| let listeners = map.get(event); | ||
| if (!listeners) { | ||
| listeners = /* @__PURE__ */ new WeakMap(); | ||
| map.set(event, listeners); | ||
| } | ||
| let boundListener = listeners.get(listener); | ||
| if (!boundListener) { | ||
| boundListener = bindListenerToScope(listener, scope); | ||
| listeners.set(listener, boundListener); | ||
| } | ||
| const previous = registeringWrapper; | ||
| registeringWrapper = boundListener; | ||
| try { | ||
| return original.call(this, event, boundListener, ...rest); | ||
| } finally { | ||
| registeringWrapper = previous; | ||
| } | ||
| }; | ||
| } | ||
| function patchRemoveListener(ee, original) { | ||
| return function(...args) { | ||
| const event = args[0]; | ||
| const listener = args[1]; | ||
| const rest = args.slice(2); | ||
| const boundListener = isBoundListener(listener) ? getPatchMap(ee)?.get(event)?.get(listener) : void 0; | ||
| if (!boundListener) { | ||
| return original.apply(this, args); | ||
| } | ||
| return original.call(this, event, boundListener, ...rest); | ||
| }; | ||
| } | ||
| function patchRemoveAllListeners(ee, original) { | ||
| return function(...args) { | ||
| const map = getPatchMap(ee); | ||
| if (map) { | ||
| if (args.length === 0) { | ||
| createPatchMap(ee); | ||
| } else { | ||
| const event = args[0]; | ||
| map.delete(event); | ||
| } | ||
| } | ||
| return original.apply(this, args); | ||
| }; | ||
| } | ||
| function createPatchMap(ee) { | ||
| const map = /* @__PURE__ */ new Map(); | ||
| ee[SCOPE_BOUND_LISTENERS] = map; | ||
| return map; | ||
| } | ||
| function getPatchMap(ee) { | ||
| return ee[SCOPE_BOUND_LISTENERS]; | ||
| } | ||
| export { bindScopeToEmitter }; | ||
| //# sourceMappingURL=bindScopeToEmitter.js.map |
| {"version":3,"file":"bindScopeToEmitter.js","sources":["../../../src/tracing/bindScopeToEmitter.ts"],"sourcesContent":["import { getCurrentScope, withScope } from '../currentScopes';\nimport type { Scope } from '../scope';\n\ntype BoundListener = (...args: unknown[]) => unknown;\n\n/**\n * Per-event map from a user-provided listener to its single scope-bound wrapper. We reuse one stable\n * wrapper per listener (rather than minting a new one per registration) and let the underlying\n * emitter/target handle repeat registrations:\n * - Node's `EventEmitter` allows duplicates and counts them, so registering the same wrapper N times\n * fires N times and `removeListener` removes one instance per call — no orphaned wrappers.\n * - the DOM `EventTarget` dedupes by `(type, callback, capture)`, so reusing the wrapper preserves\n * that idempotency; a fresh wrapper per call would defeat it and fire the listener repeatedly.\n */\ntype ListenerPatchMap = Map<string, WeakMap<BoundListener, BoundListener>>;\n\n// We patch both Node.js `EventEmitter` registration methods (`on`, `addListener`, ...) and the DOM\n// `EventTarget.addEventListener`, so this works for Node emitters and browser-native event targets.\n\n/** Listener-registration methods we patch so listeners inherit the bound scope. */\nconst ADD_LISTENER_METHODS = [\n 'addListener',\n 'on',\n 'once',\n 'prependListener',\n 'prependOnceListener',\n 'addEventListener',\n] as const;\n/** Listener-removal methods we patch so removals find the scope-bound wrapper. */\nconst REMOVE_LISTENER_METHODS = ['removeListener', 'off', 'removeEventListener'] as const;\n\n/** Symbol under which the patch map is stashed on a bound emitter. */\nconst SCOPE_BOUND_LISTENERS = Symbol('SentryScopeBoundListeners');\n\n/**\n * Minimal structural type for a Node.js-style `EventEmitter` or DOM `EventTarget`. We intentionally\n * avoid importing `node:events` so this stays usable in non-Node environments — objects without any\n * of these methods simply pass through untouched.\n */\ntype EventEmitterLike = Record<string, unknown>;\n\n// Tracks the scope-bound wrapper currently being registered. Node's `once`/`prependOnceListener`\n// synchronously re-enter `on`/`prependListener`, passing an internal \"once wrapper\" whose `.listener`\n// is our wrapper; that re-entry must not be wrapped again. We scope the guard to that exact wrapper\n// rather than using a blanket flag for the whole registration, so unrelated listeners added in the same\n// synchronous window — e.g. from a Node `newListener` handler, or on another bound emitter — are still\n// wrapped and keep their scope. Binding is synchronous, so a module-level value (with save/restore for\n// nesting) is safe here.\nlet registeringWrapper: BoundListener | undefined;\n\n// True when `listener` is the wrapper we're mid-registering, or a Node once-wrapper around it (Node sets\n// `.listener` on the once-wrapper to the function we passed). These are the only re-entrant adds to skip.\nfunction isReentrantWrapperRegistration(listener: BoundListener): boolean {\n return (\n registeringWrapper !== undefined &&\n (listener === registeringWrapper || (listener as { listener?: unknown }).listener === registeringWrapper)\n );\n}\n\n/**\n * Binds a scope to the given event emitter, so that any listener added to it runs with that scope\n * (and therefore the active span) active — even if the listener fires later, in a different async\n * context.\n *\n * By default the currently active scope is bound, captured at the time this function is called.\n * Pass an explicit `scope` to bind a different one.\n *\n * This is useful when instrumenting APIs that hand back an event emitter (e.g. a streamed database\n * query) whose `'data'` / `'error'` / `'end'` listeners would otherwise lose the trace context.\n *\n * Works with both Node.js `EventEmitter`s (`on`, `addListener`, ...) and DOM `EventTarget`s\n * (`addEventListener`). Objects exposing none of these methods are returned untouched.\n *\n * The isolation scope is intentionally not captured — it is carried along by the active async\n * context. This mirrors the event-emitter behavior of OpenTelemetry's `ContextManager.bind`.\n */\nexport function bindScopeToEmitter<T extends object>(emitter: T, scope: Scope = getCurrentScope()): T {\n const ee = emitter as EventEmitterLike;\n\n // Already bound -> nothing to do.\n if (getPatchMap(ee)) {\n return emitter;\n }\n\n createPatchMap(ee);\n\n for (const methodName of ADD_LISTENER_METHODS) {\n if (typeof ee[methodName] !== 'function') {\n continue;\n }\n ee[methodName] = patchAddListener(ee, ee[methodName] as BoundListener, scope);\n }\n\n for (const methodName of REMOVE_LISTENER_METHODS) {\n if (typeof ee[methodName] !== 'function') {\n continue;\n }\n ee[methodName] = patchRemoveListener(ee, ee[methodName] as BoundListener);\n }\n\n if (typeof ee.removeAllListeners === 'function') {\n ee.removeAllListeners = patchRemoveAllListeners(ee, ee.removeAllListeners as BoundListener);\n }\n\n return emitter;\n}\n\n/** Wraps a listener so it runs with the given scope active. */\nfunction bindListenerToScope(listener: BoundListener, scope: Scope): BoundListener {\n return function (this: unknown, ...args: unknown[]) {\n return withScope(scope, () => listener.apply(this, args));\n };\n}\n\nfunction isBoundListener(listener: unknown): listener is BoundListener {\n return typeof listener === 'function';\n}\n\nfunction patchAddListener(ee: EventEmitterLike, original: BoundListener, scope: Scope): BoundListener {\n return function (this: unknown, ...args: unknown[]) {\n const event = args[0] as string;\n const listener = args[1];\n // Extra args (e.g. the `options` argument of `addEventListener`) must be forwarded verbatim.\n const rest = args.slice(2);\n\n // Pass through what we must not wrap: non-function listeners (e.g. `EventListener` objects passed to\n // `addEventListener`) and the re-entrant once-wrapper registration. Anything else is wrapped, even\n // when added synchronously mid-registration.\n if (!isBoundListener(listener) || isReentrantWrapperRegistration(listener)) {\n return original.apply(this, args);\n }\n\n const map = getPatchMap(ee) || createPatchMap(ee);\n let listeners = map.get(event);\n if (!listeners) {\n listeners = new WeakMap();\n map.set(event, listeners);\n }\n\n // Reuse one stable wrapper per listener so repeat registrations are handled correctly by the\n // underlying emitter/target (Node counts duplicates; the DOM dedupes by `(callback, capture)`).\n let boundListener = listeners.get(listener);\n if (!boundListener) {\n boundListener = bindListenerToScope(listener, scope);\n listeners.set(listener, boundListener);\n }\n\n const previous = registeringWrapper;\n registeringWrapper = boundListener;\n try {\n return original.call(this, event, boundListener, ...rest);\n } finally {\n registeringWrapper = previous;\n }\n };\n}\n\n// Unlike `patchRemoveAllListeners`, this intentionally leaves the map entry in place: Node counts\n// duplicate registrations, so the same wrapper may still be registered after removing one instance,\n// and later `removeListener` calls need the mapping to find it. The entry is in a `WeakMap` keyed by\n// the user listener, so it is GC'd once the user drops their reference — no manual cleanup needed.\nfunction patchRemoveListener(ee: EventEmitterLike, original: BoundListener): BoundListener {\n return function (this: unknown, ...args: unknown[]) {\n const event = args[0] as string;\n const listener = args[1];\n const rest = args.slice(2);\n\n const boundListener = isBoundListener(listener) ? getPatchMap(ee)?.get(event)?.get(listener) : undefined;\n if (!boundListener) {\n return original.apply(this, args);\n }\n // Pass the same stable wrapper and forward the caller's extra args (e.g. the `capture` option of\n // `removeEventListener`) unchanged, so the emitter/target matches the right registration itself.\n return original.call(this, event, boundListener, ...rest);\n };\n}\n\n// Safe to drop map entries here (unlike `patchRemoveListener`): this removes *every* listener for the\n// event at once, so no registration referencing those wrappers remains. It also reclaims keys from the\n// strong outer `Map` (keyed by event-name strings), which would otherwise accumulate indefinitely.\nfunction patchRemoveAllListeners(ee: EventEmitterLike, original: BoundListener): BoundListener {\n return function (this: unknown, ...args: unknown[]) {\n const map = getPatchMap(ee);\n if (map) {\n if (args.length === 0) {\n // `removeAllListeners()` with no event clears everything -> reset the map.\n createPatchMap(ee);\n } else {\n const event = args[0] as string;\n map.delete(event);\n }\n }\n return original.apply(this, args);\n };\n}\n\nfunction createPatchMap(ee: EventEmitterLike): ListenerPatchMap {\n const map: ListenerPatchMap = new Map();\n (ee as Record<symbol, ListenerPatchMap>)[SCOPE_BOUND_LISTENERS] = map;\n return map;\n}\n\nfunction getPatchMap(ee: EventEmitterLike): ListenerPatchMap | undefined {\n return (ee as Record<symbol, ListenerPatchMap | undefined>)[SCOPE_BOUND_LISTENERS];\n}\n"],"names":[],"mappings":"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"} |
| import { Scope } from '../scope'; | ||
| /** | ||
| * Binds a scope to the given event emitter, so that any listener added to it runs with that scope | ||
| * (and therefore the active span) active — even if the listener fires later, in a different async | ||
| * context. | ||
| * | ||
| * By default the currently active scope is bound, captured at the time this function is called. | ||
| * Pass an explicit `scope` to bind a different one. | ||
| * | ||
| * This is useful when instrumenting APIs that hand back an event emitter (e.g. a streamed database | ||
| * query) whose `'data'` / `'error'` / `'end'` listeners would otherwise lose the trace context. | ||
| * | ||
| * Works with both Node.js `EventEmitter`s (`on`, `addListener`, ...) and DOM `EventTarget`s | ||
| * (`addEventListener`). Objects exposing none of these methods are returned untouched. | ||
| * | ||
| * The isolation scope is intentionally not captured — it is carried along by the active async | ||
| * context. This mirrors the event-emitter behavior of OpenTelemetry's `ContextManager.bind`. | ||
| */ | ||
| export declare function bindScopeToEmitter<T extends object>(emitter: T, scope?: Scope): T; | ||
| //# sourceMappingURL=bindScopeToEmitter.d.ts.map |
| import type { Scope } from '../scope'; | ||
| /** | ||
| * Binds a scope to the given event emitter, so that any listener added to it runs with that scope | ||
| * (and therefore the active span) active — even if the listener fires later, in a different async | ||
| * context. | ||
| * | ||
| * By default the currently active scope is bound, captured at the time this function is called. | ||
| * Pass an explicit `scope` to bind a different one. | ||
| * | ||
| * This is useful when instrumenting APIs that hand back an event emitter (e.g. a streamed database | ||
| * query) whose `'data'` / `'error'` / `'end'` listeners would otherwise lose the trace context. | ||
| * | ||
| * Works with both Node.js `EventEmitter`s (`on`, `addListener`, ...) and DOM `EventTarget`s | ||
| * (`addEventListener`). Objects exposing none of these methods are returned untouched. | ||
| * | ||
| * The isolation scope is intentionally not captured — it is carried along by the active async | ||
| * context. This mirrors the event-emitter behavior of OpenTelemetry's `ContextManager.bind`. | ||
| */ | ||
| export declare function bindScopeToEmitter<T extends object>(emitter: T, scope?: Scope): T; | ||
| //# sourceMappingURL=bindScopeToEmitter.d.ts.map |
| {"version":3,"file":"bindScopeToEmitter.d.ts","sourceRoot":"","sources":["../../../src/tracing/bindScopeToEmitter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AA0DtC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,GAAE,KAAyB,GAAG,CAAC,CA6BpG"} |
@@ -10,2 +10,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| const trace = require('./tracing/trace.js'); | ||
| const bindScopeToEmitter = require('./tracing/bindScopeToEmitter.js'); | ||
| const dynamicSamplingContext = require('./tracing/dynamicSamplingContext.js'); | ||
@@ -152,3 +153,5 @@ const measurement = require('./tracing/measurement.js'); | ||
| exports.getCapturedScopesOnSpan = utils$2.getCapturedScopesOnSpan; | ||
| exports.markSpanForOtelSourceInference = utils$2.markSpanForOtelSourceInference; | ||
| exports.setCapturedScopesOnSpan = utils$2.setCapturedScopesOnSpan; | ||
| exports.spanShouldInferOtelSource = utils$2.spanShouldInferOtelSource; | ||
| exports.TRACING_DEFAULTS = idleSpan.TRACING_DEFAULTS; | ||
@@ -171,2 +174,3 @@ exports.startIdleSpan = idleSpan.startIdleSpan; | ||
| exports.withActiveSpan = trace.withActiveSpan; | ||
| exports.bindScopeToEmitter = bindScopeToEmitter.bindScopeToEmitter; | ||
| exports.getDynamicSamplingContextFromClient = dynamicSamplingContext.getDynamicSamplingContextFromClient; | ||
@@ -173,0 +177,0 @@ exports.getDynamicSamplingContextFromScope = dynamicSamplingContext.getDynamicSamplingContextFromScope; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} | ||
| {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} |
@@ -13,4 +13,4 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| const trace = require('./tracing/trace.js'); | ||
| const traceData = require('./utils/traceData.js'); | ||
| const url = require('./utils/url.js'); | ||
| const traceData = require('./utils/traceData.js'); | ||
@@ -17,0 +17,0 @@ function instrumentFetchRequest(handlerData, shouldCreateSpan, shouldAttachHeaders, spans, spanOriginOrOptions) { |
@@ -10,2 +10,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| const trace = require('./tracing/trace.js'); | ||
| const bindScopeToEmitter = require('./tracing/bindScopeToEmitter.js'); | ||
| const dynamicSamplingContext = require('./tracing/dynamicSamplingContext.js'); | ||
@@ -170,3 +171,5 @@ const measurement = require('./tracing/measurement.js'); | ||
| exports.getCapturedScopesOnSpan = utils$2.getCapturedScopesOnSpan; | ||
| exports.markSpanForOtelSourceInference = utils$2.markSpanForOtelSourceInference; | ||
| exports.setCapturedScopesOnSpan = utils$2.setCapturedScopesOnSpan; | ||
| exports.spanShouldInferOtelSource = utils$2.spanShouldInferOtelSource; | ||
| exports.TRACING_DEFAULTS = idleSpan.TRACING_DEFAULTS; | ||
@@ -189,2 +192,3 @@ exports.startIdleSpan = idleSpan.startIdleSpan; | ||
| exports.withActiveSpan = trace.withActiveSpan; | ||
| exports.bindScopeToEmitter = bindScopeToEmitter.bindScopeToEmitter; | ||
| exports.getDynamicSamplingContextFromClient = dynamicSamplingContext.getDynamicSamplingContextFromClient; | ||
@@ -191,0 +195,0 @@ exports.getDynamicSamplingContextFromScope = dynamicSamplingContext.getDynamicSamplingContextFromScope; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} | ||
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} |
@@ -10,2 +10,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| const trace = require('./tracing/trace.js'); | ||
| const bindScopeToEmitter = require('./tracing/bindScopeToEmitter.js'); | ||
| const dynamicSamplingContext = require('./tracing/dynamicSamplingContext.js'); | ||
@@ -169,3 +170,5 @@ const measurement = require('./tracing/measurement.js'); | ||
| exports.getCapturedScopesOnSpan = utils$2.getCapturedScopesOnSpan; | ||
| exports.markSpanForOtelSourceInference = utils$2.markSpanForOtelSourceInference; | ||
| exports.setCapturedScopesOnSpan = utils$2.setCapturedScopesOnSpan; | ||
| exports.spanShouldInferOtelSource = utils$2.spanShouldInferOtelSource; | ||
| exports.TRACING_DEFAULTS = idleSpan.TRACING_DEFAULTS; | ||
@@ -188,2 +191,3 @@ exports.startIdleSpan = idleSpan.startIdleSpan; | ||
| exports.withActiveSpan = trace.withActiveSpan; | ||
| exports.bindScopeToEmitter = bindScopeToEmitter.bindScopeToEmitter; | ||
| exports.getDynamicSamplingContextFromClient = dynamicSamplingContext.getDynamicSamplingContextFromClient; | ||
@@ -190,0 +194,0 @@ exports.getDynamicSamplingContextFromScope = dynamicSamplingContext.getDynamicSamplingContextFromScope; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} | ||
| {"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} |
@@ -126,3 +126,5 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| this._name = name; | ||
| this.setAttribute(semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "custom"); | ||
| if (!utils.spanShouldInferOtelSource(this)) { | ||
| this.setAttribute(semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "custom"); | ||
| } | ||
| return this; | ||
@@ -129,0 +131,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sentrySpan.js","sources":["../../../src/tracing/sentrySpan.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport { getClient, getCurrentScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { createSpanEnvelope } from '../envelope';\nimport {\n SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n SEMANTIC_ATTRIBUTE_PROFILE_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { SpanEnvelope } from '../types/envelope';\nimport type { TransactionEvent } from '../types/event';\nimport type { SpanLink } from '../types/link';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributes,\n SpanAttributeValue,\n SpanContextData,\n SpanJSON,\n SpanOrigin,\n SpanTimeInput,\n StreamedSpanJSON,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport type { TimedEvent } from '../types/timedEvent';\nimport { debug } from '../utils/debug-logger';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport {\n convertSpanLinksForEnvelope,\n getRootSpan,\n getSimpleStatusMessage,\n getSpanDescendants,\n getStatusMessage,\n getStreamedSpanLinks,\n spanTimeInputToSeconds,\n spanToJSON,\n spanToTransactionTraceContext,\n TRACE_FLAG_NONE,\n TRACE_FLAG_SAMPLED,\n} from '../utils/spanUtils';\nimport { timestampInSeconds } from '../utils/time';\nimport { getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanEnd } from './logSpans';\nimport { timedEventsToMeasurements } from './measurement';\nimport { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled';\nimport { getCapturedScopesOnSpan } from './utils';\n\nconst MAX_SPAN_COUNT = 1000;\n\n/**\n * Span contains all data about a span\n */\nexport class SentrySpan implements Span {\n protected _traceId: string;\n protected _spanId: string;\n protected _parentSpanId?: string | undefined;\n protected _sampled: boolean | undefined;\n protected _name?: string | undefined;\n protected _attributes: SpanAttributes;\n protected _links?: SpanLink[];\n /** Epoch timestamp in seconds when the span started. */\n protected _startTime: number;\n /** Epoch timestamp in seconds when the span ended. */\n protected _endTime?: number | undefined;\n /** Internal keeper of the status */\n protected _status?: SpanStatus;\n /** The timed events added to this span. */\n protected _events: TimedEvent[];\n\n /** if true, treat span as a standalone span (not part of a transaction) */\n private _isStandaloneSpan?: boolean;\n\n /**\n * You should never call the constructor manually, always use `Sentry.startSpan()`\n * or other span methods.\n * @internal\n * @hideconstructor\n * @hidden\n */\n public constructor(spanContext: SentrySpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this._startTime = spanContext.startTimestamp || timestampInSeconds();\n this._links = spanContext.links;\n\n this._attributes = {};\n this.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: spanContext.op,\n ...spanContext.attributes,\n });\n\n this._name = spanContext.name;\n\n if (spanContext.parentSpanId) {\n this._parentSpanId = spanContext.parentSpanId;\n }\n // We want to include booleans as well here\n if ('sampled' in spanContext) {\n this._sampled = spanContext.sampled;\n }\n if (spanContext.endTimestamp) {\n this._endTime = spanContext.endTimestamp;\n }\n\n this._events = [];\n\n this._isStandaloneSpan = spanContext.isStandalone;\n\n // If the span is already ended, ensure we finalize the span immediately\n if (this._endTime) {\n this._onSpanEnded();\n }\n }\n\n /** @inheritDoc */\n public addLink(link: SpanLink): this {\n if (this._links) {\n this._links.push(link);\n } else {\n this._links = [link];\n }\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(links: SpanLink[]): this {\n if (this._links) {\n this._links.push(...links);\n } else {\n this._links = links;\n }\n return this;\n }\n\n /**\n * This should generally not be used,\n * but it is needed for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: number | undefined): void {\n // noop\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this;\n return {\n spanId,\n traceId,\n traceFlags: sampled ? TRACE_FLAG_SAMPLED : TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public setAttribute(key: string, value: SpanAttributeValue | undefined): this {\n if (value === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._attributes[key];\n } else {\n this._attributes[key] = value;\n }\n\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(attributes: SpanAttributes): this {\n Object.keys(attributes).forEach(key => this.setAttribute(key, attributes[key]));\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for browser tracing where we want to adjust the start time afterwards.\n * USE THIS WITH CAUTION!\n *\n * @hidden\n * @internal\n */\n public updateStartTime(timeInput: SpanTimeInput): void {\n this._startTime = spanTimeInputToSeconds(timeInput);\n }\n\n /**\n * @inheritDoc\n */\n public setStatus(value: SpanStatus): this {\n this._status = value;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public updateName(name: string): this {\n this._name = name;\n this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'custom');\n return this;\n }\n\n /** @inheritdoc */\n public end(endTimestamp?: SpanTimeInput): void {\n // If already ended, skip\n if (this._endTime) {\n return;\n }\n\n this._endTime = spanTimeInputToSeconds(endTimestamp);\n logSpanEnd(this);\n\n this._onSpanEnded();\n }\n\n /**\n * Get JSON representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToJSON(span)` instead.\n */\n public getSpanJSON(): SpanJSON {\n return {\n data: this._attributes,\n description: this._name,\n op: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n parent_span_id: this._parentSpanId,\n span_id: this._spanId,\n start_timestamp: this._startTime,\n status: getStatusMessage(this._status),\n timestamp: this._endTime,\n trace_id: this._traceId,\n origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n profile_id: this._attributes[SEMANTIC_ATTRIBUTE_PROFILE_ID] as string | undefined,\n exclusive_time: this._attributes[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] as number | undefined,\n measurements: timedEventsToMeasurements(this._events),\n is_segment: (this._isStandaloneSpan && getRootSpan(this) === this) || undefined,\n segment_id: this._isStandaloneSpan ? getRootSpan(this).spanContext().spanId : undefined,\n links: convertSpanLinksForEnvelope(this._links),\n };\n }\n\n /**\n * Get {@link StreamedSpanJSON} representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToStreamedSpanJSON(span)` instead.\n */\n public getStreamedSpanJSON(): StreamedSpanJSON {\n return {\n name: this._name ?? '',\n span_id: this._spanId,\n trace_id: this._traceId,\n parent_span_id: this._parentSpanId,\n start_timestamp: this._startTime,\n // just in case _endTime is not set, we use the start time (i.e. duration 0)\n end_timestamp: this._endTime ?? this._startTime,\n is_segment: this._isStandaloneSpan || this === getRootSpan(this),\n status: getSimpleStatusMessage(this._status),\n attributes: this._attributes,\n links: getStreamedSpanLinks(this._links),\n };\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return !this._endTime && !!this._sampled;\n }\n\n /**\n * @inheritdoc\n */\n public addEvent(\n name: string,\n attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n startTime?: SpanTimeInput,\n ): this {\n DEBUG_BUILD && debug.log('[Tracing] Adding an event to span:', name);\n\n const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || timestampInSeconds();\n const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {};\n\n const event: TimedEvent = {\n name,\n time: spanTimeInputToSeconds(time),\n attributes,\n };\n\n this._events.push(event);\n\n return this;\n }\n\n /**\n * This method should generally not be used,\n * but for now we need a way to publicly check if the `_isStandaloneSpan` flag is set.\n * USE THIS WITH CAUTION!\n * @internal\n * @hidden\n * @experimental\n */\n public isStandaloneSpan(): boolean {\n return !!this._isStandaloneSpan;\n }\n\n /** Emit `spanEnd` when the span is ended. */\n private _onSpanEnded(): void {\n const client = getClient();\n if (client) {\n client.emit('spanEnd', this);\n // Guarding sending standalone v1 spans as v2 streamed spans for now.\n // Otherwise they'd be sent once as v1 spans and again as streamed spans.\n // We'll migrate CLS and LCP spans to streamed spans in a later PR and\n // INP spans in the next major of the SDK. At that point, we can fully remove\n // standalone v1 spans <3\n if (!this._isStandaloneSpan) {\n client.emit('afterSpanEnd', this);\n }\n }\n\n // A segment span is basically the root span of a local span tree.\n // So for now, this is either what we previously refer to as the root span,\n // or a standalone span.\n const isSegmentSpan = this._isStandaloneSpan || this === getRootSpan(this);\n\n if (!isSegmentSpan) {\n return;\n }\n\n // if this is a standalone span, we send it immediately\n if (this._isStandaloneSpan) {\n if (this._sampled) {\n sendSpanEnvelope(createSpanEnvelope([this], client));\n } else {\n DEBUG_BUILD &&\n debug.log('[Tracing] Discarding standalone span because its trace was not chosen to be sampled.');\n if (client) {\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n return;\n } else if (client && hasSpanStreamingEnabled(client)) {\n // TODO (spans): Remove standalone span custom logic in favor of sending simple v2 web vital spans\n client.emit('afterSegmentSpanEnd', this);\n return;\n }\n\n const transactionEvent = this._convertSpanToTransaction();\n if (transactionEvent) {\n const scope = getCapturedScopesOnSpan(this).scope || getCurrentScope();\n scope.captureEvent(transactionEvent);\n }\n }\n\n /**\n * Finish the transaction & prepare the event to send to Sentry.\n */\n private _convertSpanToTransaction(): TransactionEvent | undefined {\n // We can only convert finished spans\n if (!isFullFinishedSpan(spanToJSON(this))) {\n return undefined;\n }\n\n if (!this._name) {\n DEBUG_BUILD && debug.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n this._name = '<unlabeled transaction>';\n }\n\n const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = getCapturedScopesOnSpan(this);\n\n const normalizedRequest = capturedSpanScope?.getScopeData().sdkProcessingMetadata?.normalizedRequest;\n\n if (this._sampled !== true) {\n return undefined;\n }\n\n // The transaction span itself as well as any potential standalone spans should be filtered out\n const finishedSpans = getSpanDescendants(this).filter(span => span !== this && !isStandaloneSpan(span));\n\n const spans = finishedSpans.map(span => spanToJSON(span)).filter(isFullFinishedSpan);\n\n const source = this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n // remove internal root span attributes we don't need to send.\n /* eslint-disable @typescript-eslint/no-dynamic-delete */\n delete this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n let hasGenAiSpans = false;\n spans.forEach(span => {\n delete span.data[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (span.op?.startsWith('gen_ai.')) {\n hasGenAiSpans = true;\n }\n });\n // eslint-enabled-next-line @typescript-eslint/no-dynamic-delete\n\n const transaction: TransactionEvent = {\n contexts: {\n trace: spanToTransactionTraceContext(this),\n },\n spans:\n // spans.sort() mutates the array, but `spans` is already a copy so we can safely do this here\n // we do not use spans anymore after this point\n spans.length > MAX_SPAN_COUNT\n ? spans.sort((a, b) => a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT)\n : spans,\n start_timestamp: this._startTime,\n timestamp: this._endTime,\n transaction: this._name,\n type: 'transaction',\n sdkProcessingMetadata: {\n capturedSpanScope,\n capturedSpanIsolationScope,\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(this),\n hasGenAiSpans,\n },\n request: normalizedRequest,\n ...(source && {\n transaction_info: {\n source,\n },\n }),\n };\n\n const measurements = timedEventsToMeasurements(this._events);\n const hasMeasurements = measurements && Object.keys(measurements).length;\n\n if (hasMeasurements) {\n DEBUG_BUILD &&\n debug.log(\n '[Measurements] Adding measurements to transaction event',\n JSON.stringify(measurements, undefined, 2),\n );\n transaction.measurements = measurements;\n }\n\n return transaction;\n }\n}\n\nfunction isSpanTimeInput(value: undefined | SpanAttributes | SpanTimeInput): value is SpanTimeInput {\n return (value && typeof value === 'number') || value instanceof Date || Array.isArray(value);\n}\n\n// We want to filter out any incomplete SpanJSON objects\nfunction isFullFinishedSpan(input: Partial<SpanJSON>): input is SpanJSON {\n return !!input.start_timestamp && !!input.timestamp && !!input.span_id && !!input.trace_id;\n}\n\n/** `SentrySpan`s can be sent as a standalone span rather than belonging to a transaction */\nfunction isStandaloneSpan(span: Span): boolean {\n return span instanceof SentrySpan && span.isStandaloneSpan();\n}\n\n/**\n * Sends a `SpanEnvelope`.\n *\n * Note: If the envelope's spans are dropped, e.g. via `beforeSendSpan`,\n * the envelope will not be sent either.\n */\nfunction sendSpanEnvelope(envelope: SpanEnvelope): void {\n const client = getClient();\n if (!client) {\n return;\n }\n\n const spanItems = envelope[1];\n if (!spanItems || spanItems.length === 0) {\n client.recordDroppedEvent('before_send', 'span');\n return;\n }\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n"],"names":["generateTraceId","generateSpanId","timestampInSeconds","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_OP","TRACE_FLAG_SAMPLED","TRACE_FLAG_NONE","spanTimeInputToSeconds","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","logSpanEnd","getStatusMessage","SEMANTIC_ATTRIBUTE_PROFILE_ID","SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME","timedEventsToMeasurements","getRootSpan","convertSpanLinksForEnvelope","getSimpleStatusMessage","getStreamedSpanLinks","DEBUG_BUILD","debug","time","getClient","createSpanEnvelope","hasSpanStreamingEnabled","getCapturedScopesOnSpan","getCurrentScope","spanToJSON","getSpanDescendants","SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME","spanToTransactionTraceContext","getDynamicSamplingContextFromSpan"],"mappings":"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"} | ||
| {"version":3,"file":"sentrySpan.js","sources":["../../../src/tracing/sentrySpan.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport { getClient, getCurrentScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { createSpanEnvelope } from '../envelope';\nimport {\n SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n SEMANTIC_ATTRIBUTE_PROFILE_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { SpanEnvelope } from '../types/envelope';\nimport type { TransactionEvent } from '../types/event';\nimport type { SpanLink } from '../types/link';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributes,\n SpanAttributeValue,\n SpanContextData,\n SpanJSON,\n SpanOrigin,\n SpanTimeInput,\n StreamedSpanJSON,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport type { TimedEvent } from '../types/timedEvent';\nimport { debug } from '../utils/debug-logger';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport {\n convertSpanLinksForEnvelope,\n getRootSpan,\n getSimpleStatusMessage,\n getSpanDescendants,\n getStatusMessage,\n getStreamedSpanLinks,\n spanTimeInputToSeconds,\n spanToJSON,\n spanToTransactionTraceContext,\n TRACE_FLAG_NONE,\n TRACE_FLAG_SAMPLED,\n} from '../utils/spanUtils';\nimport { timestampInSeconds } from '../utils/time';\nimport { getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanEnd } from './logSpans';\nimport { timedEventsToMeasurements } from './measurement';\nimport { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled';\nimport { getCapturedScopesOnSpan, spanShouldInferOtelSource } from './utils';\n\nconst MAX_SPAN_COUNT = 1000;\n\n/**\n * Span contains all data about a span\n */\nexport class SentrySpan implements Span {\n protected _traceId: string;\n protected _spanId: string;\n protected _parentSpanId?: string | undefined;\n protected _sampled: boolean | undefined;\n protected _name?: string | undefined;\n protected _attributes: SpanAttributes;\n protected _links?: SpanLink[];\n /** Epoch timestamp in seconds when the span started. */\n protected _startTime: number;\n /** Epoch timestamp in seconds when the span ended. */\n protected _endTime?: number | undefined;\n /** Internal keeper of the status */\n protected _status?: SpanStatus;\n /** The timed events added to this span. */\n protected _events: TimedEvent[];\n\n /** if true, treat span as a standalone span (not part of a transaction) */\n private _isStandaloneSpan?: boolean;\n\n /**\n * You should never call the constructor manually, always use `Sentry.startSpan()`\n * or other span methods.\n * @internal\n * @hideconstructor\n * @hidden\n */\n public constructor(spanContext: SentrySpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this._startTime = spanContext.startTimestamp || timestampInSeconds();\n this._links = spanContext.links;\n\n this._attributes = {};\n this.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: spanContext.op,\n ...spanContext.attributes,\n });\n\n this._name = spanContext.name;\n\n if (spanContext.parentSpanId) {\n this._parentSpanId = spanContext.parentSpanId;\n }\n // We want to include booleans as well here\n if ('sampled' in spanContext) {\n this._sampled = spanContext.sampled;\n }\n if (spanContext.endTimestamp) {\n this._endTime = spanContext.endTimestamp;\n }\n\n this._events = [];\n\n this._isStandaloneSpan = spanContext.isStandalone;\n\n // If the span is already ended, ensure we finalize the span immediately\n if (this._endTime) {\n this._onSpanEnded();\n }\n }\n\n /** @inheritDoc */\n public addLink(link: SpanLink): this {\n if (this._links) {\n this._links.push(link);\n } else {\n this._links = [link];\n }\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(links: SpanLink[]): this {\n if (this._links) {\n this._links.push(...links);\n } else {\n this._links = links;\n }\n return this;\n }\n\n /**\n * This should generally not be used,\n * but it is needed for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: number | undefined): void {\n // noop\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this;\n return {\n spanId,\n traceId,\n traceFlags: sampled ? TRACE_FLAG_SAMPLED : TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public setAttribute(key: string, value: SpanAttributeValue | undefined): this {\n if (value === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._attributes[key];\n } else {\n this._attributes[key] = value;\n }\n\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(attributes: SpanAttributes): this {\n Object.keys(attributes).forEach(key => this.setAttribute(key, attributes[key]));\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for browser tracing where we want to adjust the start time afterwards.\n * USE THIS WITH CAUTION!\n *\n * @hidden\n * @internal\n */\n public updateStartTime(timeInput: SpanTimeInput): void {\n this._startTime = spanTimeInputToSeconds(timeInput);\n }\n\n /**\n * @inheritDoc\n */\n public setStatus(value: SpanStatus): this {\n this._status = value;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public updateName(name: string): this {\n this._name = name;\n // Renaming a span marks its name as explicitly chosen, so we stamp `custom`.\n // The exception is spans created by SentryTraceProvider: those are branded for\n // OTel-style source inference at span end (mirroring OTel SDK spans, which have\n // no Sentry source concept), so instrumentations renaming them must not pin\n // `custom` — applyOtelSpanData infers the correct source (e.g. 'route', 'task').\n if (!spanShouldInferOtelSource(this)) {\n this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'custom');\n }\n return this;\n }\n\n /** @inheritdoc */\n public end(endTimestamp?: SpanTimeInput): void {\n // If already ended, skip\n if (this._endTime) {\n return;\n }\n\n this._endTime = spanTimeInputToSeconds(endTimestamp);\n logSpanEnd(this);\n\n this._onSpanEnded();\n }\n\n /**\n * Get JSON representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToJSON(span)` instead.\n */\n public getSpanJSON(): SpanJSON {\n return {\n data: this._attributes,\n description: this._name,\n op: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n parent_span_id: this._parentSpanId,\n span_id: this._spanId,\n start_timestamp: this._startTime,\n status: getStatusMessage(this._status),\n timestamp: this._endTime,\n trace_id: this._traceId,\n origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n profile_id: this._attributes[SEMANTIC_ATTRIBUTE_PROFILE_ID] as string | undefined,\n exclusive_time: this._attributes[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] as number | undefined,\n measurements: timedEventsToMeasurements(this._events),\n is_segment: (this._isStandaloneSpan && getRootSpan(this) === this) || undefined,\n segment_id: this._isStandaloneSpan ? getRootSpan(this).spanContext().spanId : undefined,\n links: convertSpanLinksForEnvelope(this._links),\n };\n }\n\n /**\n * Get {@link StreamedSpanJSON} representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToStreamedSpanJSON(span)` instead.\n */\n public getStreamedSpanJSON(): StreamedSpanJSON {\n return {\n name: this._name ?? '',\n span_id: this._spanId,\n trace_id: this._traceId,\n parent_span_id: this._parentSpanId,\n start_timestamp: this._startTime,\n // just in case _endTime is not set, we use the start time (i.e. duration 0)\n end_timestamp: this._endTime ?? this._startTime,\n is_segment: this._isStandaloneSpan || this === getRootSpan(this),\n status: getSimpleStatusMessage(this._status),\n attributes: this._attributes,\n links: getStreamedSpanLinks(this._links),\n };\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return !this._endTime && !!this._sampled;\n }\n\n /**\n * @inheritdoc\n */\n public addEvent(\n name: string,\n attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n startTime?: SpanTimeInput,\n ): this {\n DEBUG_BUILD && debug.log('[Tracing] Adding an event to span:', name);\n\n const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || timestampInSeconds();\n const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {};\n\n const event: TimedEvent = {\n name,\n time: spanTimeInputToSeconds(time),\n attributes,\n };\n\n this._events.push(event);\n\n return this;\n }\n\n /**\n * This method should generally not be used,\n * but for now we need a way to publicly check if the `_isStandaloneSpan` flag is set.\n * USE THIS WITH CAUTION!\n * @internal\n * @hidden\n * @experimental\n */\n public isStandaloneSpan(): boolean {\n return !!this._isStandaloneSpan;\n }\n\n /** Emit `spanEnd` when the span is ended. */\n private _onSpanEnded(): void {\n const client = getClient();\n if (client) {\n client.emit('spanEnd', this);\n // Guarding sending standalone v1 spans as v2 streamed spans for now.\n // Otherwise they'd be sent once as v1 spans and again as streamed spans.\n // We'll migrate CLS and LCP spans to streamed spans in a later PR and\n // INP spans in the next major of the SDK. At that point, we can fully remove\n // standalone v1 spans <3\n if (!this._isStandaloneSpan) {\n client.emit('afterSpanEnd', this);\n }\n }\n\n // A segment span is basically the root span of a local span tree.\n // So for now, this is either what we previously refer to as the root span,\n // or a standalone span.\n const isSegmentSpan = this._isStandaloneSpan || this === getRootSpan(this);\n\n if (!isSegmentSpan) {\n return;\n }\n\n // if this is a standalone span, we send it immediately\n if (this._isStandaloneSpan) {\n if (this._sampled) {\n sendSpanEnvelope(createSpanEnvelope([this], client));\n } else {\n DEBUG_BUILD &&\n debug.log('[Tracing] Discarding standalone span because its trace was not chosen to be sampled.');\n if (client) {\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n return;\n } else if (client && hasSpanStreamingEnabled(client)) {\n // TODO (spans): Remove standalone span custom logic in favor of sending simple v2 web vital spans\n client.emit('afterSegmentSpanEnd', this);\n return;\n }\n\n const transactionEvent = this._convertSpanToTransaction();\n if (transactionEvent) {\n const scope = getCapturedScopesOnSpan(this).scope || getCurrentScope();\n scope.captureEvent(transactionEvent);\n }\n }\n\n /**\n * Finish the transaction & prepare the event to send to Sentry.\n */\n private _convertSpanToTransaction(): TransactionEvent | undefined {\n // We can only convert finished spans\n if (!isFullFinishedSpan(spanToJSON(this))) {\n return undefined;\n }\n\n if (!this._name) {\n DEBUG_BUILD && debug.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n this._name = '<unlabeled transaction>';\n }\n\n const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = getCapturedScopesOnSpan(this);\n\n const normalizedRequest = capturedSpanScope?.getScopeData().sdkProcessingMetadata?.normalizedRequest;\n\n if (this._sampled !== true) {\n return undefined;\n }\n\n // The transaction span itself as well as any potential standalone spans should be filtered out\n const finishedSpans = getSpanDescendants(this).filter(span => span !== this && !isStandaloneSpan(span));\n\n const spans = finishedSpans.map(span => spanToJSON(span)).filter(isFullFinishedSpan);\n\n const source = this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n // remove internal root span attributes we don't need to send.\n /* eslint-disable @typescript-eslint/no-dynamic-delete */\n delete this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n let hasGenAiSpans = false;\n spans.forEach(span => {\n delete span.data[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (span.op?.startsWith('gen_ai.')) {\n hasGenAiSpans = true;\n }\n });\n // eslint-enabled-next-line @typescript-eslint/no-dynamic-delete\n\n const transaction: TransactionEvent = {\n contexts: {\n trace: spanToTransactionTraceContext(this),\n },\n spans:\n // spans.sort() mutates the array, but `spans` is already a copy so we can safely do this here\n // we do not use spans anymore after this point\n spans.length > MAX_SPAN_COUNT\n ? spans.sort((a, b) => a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT)\n : spans,\n start_timestamp: this._startTime,\n timestamp: this._endTime,\n transaction: this._name,\n type: 'transaction',\n sdkProcessingMetadata: {\n capturedSpanScope,\n capturedSpanIsolationScope,\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(this),\n hasGenAiSpans,\n },\n request: normalizedRequest,\n ...(source && {\n transaction_info: {\n source,\n },\n }),\n };\n\n const measurements = timedEventsToMeasurements(this._events);\n const hasMeasurements = measurements && Object.keys(measurements).length;\n\n if (hasMeasurements) {\n DEBUG_BUILD &&\n debug.log(\n '[Measurements] Adding measurements to transaction event',\n JSON.stringify(measurements, undefined, 2),\n );\n transaction.measurements = measurements;\n }\n\n return transaction;\n }\n}\n\nfunction isSpanTimeInput(value: undefined | SpanAttributes | SpanTimeInput): value is SpanTimeInput {\n return (value && typeof value === 'number') || value instanceof Date || Array.isArray(value);\n}\n\n// We want to filter out any incomplete SpanJSON objects\nfunction isFullFinishedSpan(input: Partial<SpanJSON>): input is SpanJSON {\n return !!input.start_timestamp && !!input.timestamp && !!input.span_id && !!input.trace_id;\n}\n\n/** `SentrySpan`s can be sent as a standalone span rather than belonging to a transaction */\nfunction isStandaloneSpan(span: Span): boolean {\n return span instanceof SentrySpan && span.isStandaloneSpan();\n}\n\n/**\n * Sends a `SpanEnvelope`.\n *\n * Note: If the envelope's spans are dropped, e.g. via `beforeSendSpan`,\n * the envelope will not be sent either.\n */\nfunction sendSpanEnvelope(envelope: SpanEnvelope): void {\n const client = getClient();\n if (!client) {\n return;\n }\n\n const spanItems = envelope[1];\n if (!spanItems || spanItems.length === 0) {\n client.recordDroppedEvent('before_send', 'span');\n return;\n }\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n"],"names":["generateTraceId","generateSpanId","timestampInSeconds","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_OP","TRACE_FLAG_SAMPLED","TRACE_FLAG_NONE","spanTimeInputToSeconds","spanShouldInferOtelSource","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","logSpanEnd","getStatusMessage","SEMANTIC_ATTRIBUTE_PROFILE_ID","SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME","timedEventsToMeasurements","getRootSpan","convertSpanLinksForEnvelope","getSimpleStatusMessage","getStreamedSpanLinks","DEBUG_BUILD","debug","time","getClient","createSpanEnvelope","hasSpanStreamingEnabled","getCapturedScopesOnSpan","getCurrentScope","spanToJSON","getSpanDescendants","SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME","spanToTransactionTraceContext","getDynamicSamplingContextFromSpan"],"mappings":"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"} |
@@ -5,3 +5,2 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| const scopeData = require('../../utils/scopeData.js'); | ||
| const url = require('../../utils/url.js'); | ||
| const spanUtils = require('../../utils/spanUtils.js'); | ||
@@ -21,3 +20,3 @@ const utils = require('../utils.js'); | ||
| const spanKind = span.kind; | ||
| inferSpanDataFromOtelAttributes(spanJSON, spanKind); | ||
| client.emit("preprocessSpan", spanJSON, { spanKind }); | ||
| if (spanJSON.is_segment) { | ||
@@ -88,103 +87,6 @@ applyScopeToSegmentSpan(spanJSON, finalScopeData); | ||
| } | ||
| const SPAN_KIND_SERVER = 1; | ||
| const SPAN_KIND_CLIENT = 2; | ||
| function inferSpanDataFromOtelAttributes(spanJSON, spanKind) { | ||
| const attributes = spanJSON.attributes; | ||
| if (!attributes) { | ||
| return; | ||
| } | ||
| const httpMethod = attributes["http.request.method"] || attributes["http.method"]; | ||
| if (httpMethod) { | ||
| inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod); | ||
| return; | ||
| } | ||
| const dbSystem = attributes["db.system.name"] || attributes["db.system"]; | ||
| const opIsCache = typeof attributes[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP] === "string" && `${attributes[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP]}`.startsWith("cache."); | ||
| if (dbSystem && !opIsCache) { | ||
| inferDbSpanData(spanJSON, attributes); | ||
| return; | ||
| } | ||
| if (attributes["rpc.service"]) { | ||
| safeSetSpanJSONAttributes(spanJSON, { [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "rpc" }); | ||
| return; | ||
| } | ||
| if (attributes["messaging.system"]) { | ||
| safeSetSpanJSONAttributes(spanJSON, { [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "message" }); | ||
| return; | ||
| } | ||
| const faasTrigger = attributes["faas.trigger"]; | ||
| if (faasTrigger) { | ||
| safeSetSpanJSONAttributes(spanJSON, { [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${faasTrigger}` }); | ||
| } | ||
| } | ||
| function inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod) { | ||
| const opParts = ["http"]; | ||
| if (spanKind === SPAN_KIND_CLIENT) { | ||
| opParts.push("client"); | ||
| } else if (spanKind === SPAN_KIND_SERVER) { | ||
| opParts.push("server"); | ||
| } | ||
| if (attributes["sentry.http.prefetch"]) { | ||
| opParts.push("prefetch"); | ||
| } | ||
| safeSetSpanJSONAttributes(spanJSON, { [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP]: opParts.join(".") }); | ||
| const customName = attributes[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]; | ||
| if (typeof customName === "string") { | ||
| spanJSON.name = customName; | ||
| return; | ||
| } | ||
| if (attributes[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === "custom") { | ||
| return; | ||
| } | ||
| const httpRoute = attributes["http.route"]; | ||
| if (typeof httpRoute === "string") { | ||
| spanJSON.name = `${httpMethod} ${httpRoute}`; | ||
| safeSetSpanJSONAttributes(spanJSON, { [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "route" }); | ||
| } else { | ||
| if (spanKind === SPAN_KIND_CLIENT || spanKind === SPAN_KIND_SERVER) { | ||
| const urlPath = getUrlPath(attributes, spanKind); | ||
| if (urlPath) { | ||
| spanJSON.name = `${httpMethod} ${urlPath}`; | ||
| } | ||
| } | ||
| safeSetSpanJSONAttributes(spanJSON, { [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "url" }); | ||
| } | ||
| } | ||
| function getUrlPath(attributes, spanKind) { | ||
| const httpUrl = attributes["http.url"] || attributes["url.full"]; | ||
| const httpTarget = attributes["http.target"]; | ||
| const parsedUrl = typeof httpUrl === "string" ? url.parseUrl(httpUrl) : void 0; | ||
| const sanitizedUrl = parsedUrl ? url.getSanitizedUrlString(parsedUrl) : void 0; | ||
| if (spanKind === SPAN_KIND_SERVER && typeof httpTarget === "string") { | ||
| return url.stripUrlQueryAndFragment(httpTarget); | ||
| } | ||
| if (sanitizedUrl) { | ||
| return sanitizedUrl; | ||
| } | ||
| if (typeof httpTarget === "string") { | ||
| return url.stripUrlQueryAndFragment(httpTarget); | ||
| } | ||
| return void 0; | ||
| } | ||
| function inferDbSpanData(spanJSON, attributes) { | ||
| safeSetSpanJSONAttributes(spanJSON, { [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "db" }); | ||
| const customName = attributes[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]; | ||
| if (typeof customName === "string") { | ||
| spanJSON.name = customName; | ||
| return; | ||
| } | ||
| if (attributes[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === "custom") { | ||
| return; | ||
| } | ||
| const statement = attributes["db.statement"]; | ||
| if (statement) { | ||
| spanJSON.name = `${statement}`; | ||
| safeSetSpanJSONAttributes(spanJSON, { [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "task" }); | ||
| } | ||
| } | ||
| exports.applyBeforeSendSpanCallback = applyBeforeSendSpanCallback; | ||
| exports.captureSpan = captureSpan; | ||
| exports.inferSpanDataFromOtelAttributes = inferSpanDataFromOtelAttributes; | ||
| exports.safeSetSpanJSONAttributes = safeSetSpanJSONAttributes; | ||
| //# sourceMappingURL=captureSpan.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"captureSpan.js","sources":["../../../../src/tracing/spans/captureSpan.ts"],"sourcesContent":["import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport { getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment } from '../../utils/url';\nimport {\n INTERNAL_getSegmentSpan,\n showSpanDropWarning,\n spanToStreamedSpanJSON,\n streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\nimport { DEFAULT_ENVIRONMENT } from '../../constants';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n // Convert to JSON FIRST - we cannot write to an already-ended span\n const spanJSON = spanToStreamedSpanJSON(span);\n\n const segmentSpan = INTERNAL_getSegmentSpan(span);\n const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n // Backfill span data from OTel semantic conventions when not explicitly set.\n // OTel-originated spans don't have sentry.op, description, etc. — the non-streamed path\n // infers these in the SentrySpanExporter, but streamed spans skip the exporter entirely.\n // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n // This must run before all hooks and beforeSendSpan so that user callbacks can see and override inferred values.\n const spanKind = (span as { kind?: number }).kind;\n inferSpanDataFromOtelAttributes(spanJSON, spanKind);\n\n if (spanJSON.is_segment) {\n applyScopeToSegmentSpan(spanJSON, finalScopeData);\n applySdkMetadataToSegmentSpan(spanJSON, client);\n // Allow hook subscribers to mutate the segment span JSON\n // This also invokes the `processSegmentSpan` hook of all integrations\n client.emit('processSegmentSpan', spanJSON);\n }\n\n // This allows hook subscribers to mutate the span JSON\n // This also invokes the `processSpan` hook of all integrations\n client.emit('processSpan', spanJSON);\n\n const { beforeSendSpan } = client.getOptions();\n const processedSpan =\n beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n : spanJSON;\n\n // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (spanNameSource) {\n safeSetSpanJSONAttributes(processedSpan, {\n // Purposefully not using a constant defined here like in other attributes:\n // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n 'sentry.span.source': spanNameSource,\n });\n }\n\n return {\n ...streamedSpanJsonToSerializedSpan(processedSpan),\n _segmentSpan: segmentSpan,\n };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n spanJSON: StreamedSpanJSON,\n newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n Object.entries(newAttributes).forEach(([key, value]) => {\n if (value != null && !(key in originalAttributes)) {\n originalAttributes[key] = value;\n }\n });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n const integrationNames = client.getIntegrationNames();\n if (!integrationNames.length) return;\n\n safeSetSpanJSONAttributes(segmentSpanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n });\n}\n\nfunction applyCommonSpanAttributes(\n spanJSON: StreamedSpanJSON,\n serializedSegmentSpan: StreamedSpanJSON,\n client: Client,\n scopeData: ScopeData,\n): void {\n const sdk = client.getSdkMetadata();\n const { release, environment } = client.getOptions();\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n safeSetSpanJSONAttributes(spanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n ...scopeData.attributes,\n });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n span: StreamedSpanJSON,\n beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\n// OTel SpanKind values (numeric to avoid importing from @opentelemetry/api)\nconst SPAN_KIND_SERVER = 1;\nconst SPAN_KIND_CLIENT = 2;\n\n/**\n * Infer and backfill span data from OTel semantic conventions.\n * This mirrors what the `SentrySpanExporter` does for non-streamed spans via `getSpanData`/`inferSpanData`.\n * Streamed spans skip the exporter, so we do the inference here during capture.\n *\n * Backfills: `sentry.op`, `sentry.source`, and `name` (description).\n * Uses `safeSetSpanJSONAttributes` so explicitly set attributes are never overwritten.\n */\n/** Exported only for tests. */\nexport function inferSpanDataFromOtelAttributes(spanJSON: StreamedSpanJSON, spanKind?: number): void {\n const attributes = spanJSON.attributes;\n if (!attributes) {\n return;\n }\n\n const httpMethod = attributes['http.request.method'] || attributes['http.method'];\n if (httpMethod) {\n inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod);\n return;\n }\n\n const dbSystem = attributes['db.system.name'] || attributes['db.system'];\n const opIsCache =\n typeof attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] === 'string' &&\n `${attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP]}`.startsWith('cache.');\n if (dbSystem && !opIsCache) {\n inferDbSpanData(spanJSON, attributes);\n return;\n }\n\n if (attributes['rpc.service']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'rpc' });\n return;\n }\n\n if (attributes['messaging.system']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'message' });\n return;\n }\n\n const faasTrigger = attributes['faas.trigger'];\n if (faasTrigger) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${faasTrigger}` });\n }\n}\n\nfunction inferHttpSpanData(\n spanJSON: StreamedSpanJSON,\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n httpMethod: unknown,\n): void {\n // Infer op: http.client, http.server, or just http\n const opParts = ['http'];\n if (spanKind === SPAN_KIND_CLIENT) {\n opParts.push('client');\n } else if (spanKind === SPAN_KIND_SERVER) {\n opParts.push('server');\n }\n if (attributes['sentry.http.prefetch']) {\n opParts.push('prefetch');\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: opParts.join('.') });\n\n // If the user set a custom span name via updateSpanName(), apply it — OTel instrumentation\n // may have overwritten span.name after the user set it, so we restore from the attribute.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const httpRoute = attributes['http.route'];\n if (typeof httpRoute === 'string') {\n spanJSON.name = `${httpMethod} ${httpRoute}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route' });\n } else {\n // Infer span name from URL attributes, matching the non-streamed exporter's behavior.\n // Only overwrite the name for OTel spans (known spanKind)\n if (spanKind === SPAN_KIND_CLIENT || spanKind === SPAN_KIND_SERVER) {\n const urlPath = getUrlPath(attributes, spanKind);\n if (urlPath) {\n spanJSON.name = `${httpMethod} ${urlPath}`;\n }\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url' });\n }\n}\n\n/**\n * Extract a URL path from span attributes for use in the span name.\n * Mirrors the logic in the non-streamed exporter's `getSanitizedUrl`.\n */\nfunction getUrlPath(\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n): string | undefined {\n const httpUrl = attributes['http.url'] || attributes['url.full'];\n const httpTarget = attributes['http.target'];\n\n const parsedUrl = typeof httpUrl === 'string' ? parseUrl(httpUrl) : undefined;\n const sanitizedUrl = parsedUrl ? getSanitizedUrlString(parsedUrl) : undefined;\n\n // For server spans, prefer the relative target path\n if (spanKind === SPAN_KIND_SERVER && typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n // For client spans (and others), use the full sanitized URL\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Fall back to target if no full URL is available\n if (typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n return undefined;\n}\n\nfunction inferDbSpanData(spanJSON: StreamedSpanJSON, attributes: RawAttributes<Record<string, unknown>>): void {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db' });\n\n // If the user set a custom span name via updateSpanName(), apply it.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const statement = attributes['db.statement'];\n if (statement) {\n spanJSON.name = `${statement}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'task' });\n }\n}\n"],"names":["spanToStreamedSpanJSON","INTERNAL_getSegmentSpan","getCapturedScopesOnSpan","getCombinedScopeData","beforeSendSpan","isStreamedBeforeSendSpanCallback","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","streamedSpanJsonToSerializedSpan","scopeContextsToSpanAttributes","SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS","SEMANTIC_ATTRIBUTE_SENTRY_RELEASE","SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT","DEFAULT_ENVIRONMENT","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID","SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION","SEMANTIC_ATTRIBUTE_USER_ID","SEMANTIC_ATTRIBUTE_USER_EMAIL","SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS","SEMANTIC_ATTRIBUTE_USER_USERNAME","showSpanDropWarning","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME","parseUrl","getSanitizedUrlString","stripUrlQueryAndFragment"],"mappings":"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"} | ||
| {"version":3,"file":"captureSpan.js","sources":["../../../../src/tracing/spans/captureSpan.ts"],"sourcesContent":["import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport {\n INTERNAL_getSegmentSpan,\n showSpanDropWarning,\n spanToStreamedSpanJSON,\n streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\nimport { DEFAULT_ENVIRONMENT } from '../../constants';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n // Convert to JSON FIRST - we cannot write to an already-ended span\n const spanJSON = spanToStreamedSpanJSON(span);\n\n const segmentSpan = INTERNAL_getSegmentSpan(span);\n const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n // It is forwarded to `preprocessSpan` subscribers (e.g. the OpenTelemetry SDK backfills op/source/name from it).\n const spanKind = (span as { kind?: number }).kind;\n\n // Preprocess the span JSON before any other hooks run, so that `processSpan`/`processSegmentSpan`\n // subscribers (incl. integrations) and `beforeSendSpan` see fully inferred span data.\n client.emit('preprocessSpan', spanJSON, { spanKind });\n\n if (spanJSON.is_segment) {\n applyScopeToSegmentSpan(spanJSON, finalScopeData);\n applySdkMetadataToSegmentSpan(spanJSON, client);\n // Allow hook subscribers to mutate the segment span JSON\n // This also invokes the `processSegmentSpan` hook of all integrations\n client.emit('processSegmentSpan', spanJSON);\n }\n\n // This allows hook subscribers to mutate the span JSON\n // This also invokes the `processSpan` hook of all integrations\n client.emit('processSpan', spanJSON);\n\n const { beforeSendSpan } = client.getOptions();\n const processedSpan =\n beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n : spanJSON;\n\n // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (spanNameSource) {\n safeSetSpanJSONAttributes(processedSpan, {\n // Purposefully not using a constant defined here like in other attributes:\n // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n 'sentry.span.source': spanNameSource,\n });\n }\n\n return {\n ...streamedSpanJsonToSerializedSpan(processedSpan),\n _segmentSpan: segmentSpan,\n };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n spanJSON: StreamedSpanJSON,\n newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n Object.entries(newAttributes).forEach(([key, value]) => {\n if (value != null && !(key in originalAttributes)) {\n originalAttributes[key] = value;\n }\n });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n const integrationNames = client.getIntegrationNames();\n if (!integrationNames.length) return;\n\n safeSetSpanJSONAttributes(segmentSpanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n });\n}\n\nfunction applyCommonSpanAttributes(\n spanJSON: StreamedSpanJSON,\n serializedSegmentSpan: StreamedSpanJSON,\n client: Client,\n scopeData: ScopeData,\n): void {\n const sdk = client.getSdkMetadata();\n const { release, environment } = client.getOptions();\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n safeSetSpanJSONAttributes(spanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n ...scopeData.attributes,\n });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n span: StreamedSpanJSON,\n beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n"],"names":["spanToStreamedSpanJSON","INTERNAL_getSegmentSpan","getCapturedScopesOnSpan","getCombinedScopeData","beforeSendSpan","isStreamedBeforeSendSpanCallback","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","streamedSpanJsonToSerializedSpan","scopeContextsToSpanAttributes","SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS","SEMANTIC_ATTRIBUTE_SENTRY_RELEASE","SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT","DEFAULT_ENVIRONMENT","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID","SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION","SEMANTIC_ATTRIBUTE_USER_ID","SEMANTIC_ATTRIBUTE_USER_EMAIL","SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS","SEMANTIC_ATTRIBUTE_USER_USERNAME","showSpanDropWarning"],"mappings":"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"} |
@@ -8,2 +8,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| const ISOLATION_SCOPE_ON_START_SPAN_FIELD = "_sentryIsolationScope"; | ||
| const OTEL_SOURCE_INFERENCE_SPAN_FIELD = /* @__PURE__ */ Symbol.for("sentry.otelSourceInference"); | ||
| function setCapturedScopesOnSpan(span, scope, isolationScope) { | ||
@@ -22,5 +23,13 @@ if (span) { | ||
| } | ||
| function markSpanForOtelSourceInference(span) { | ||
| object.addNonEnumerableProperty(span, OTEL_SOURCE_INFERENCE_SPAN_FIELD, true); | ||
| } | ||
| function spanShouldInferOtelSource(span) { | ||
| return span[OTEL_SOURCE_INFERENCE_SPAN_FIELD] === true; | ||
| } | ||
| exports.getCapturedScopesOnSpan = getCapturedScopesOnSpan; | ||
| exports.markSpanForOtelSourceInference = markSpanForOtelSourceInference; | ||
| exports.setCapturedScopesOnSpan = setCapturedScopesOnSpan; | ||
| exports.spanShouldInferOtelSource = spanShouldInferOtelSource; | ||
| //# sourceMappingURL=utils.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"utils.js","sources":["../../../src/tracing/utils.ts"],"sourcesContent":["import type { Scope } from '../scope';\nimport type { Span } from '../types/span';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { derefWeakRef, makeWeakRef, type MaybeWeakRef } from '../utils/weakRef';\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\ntype SpanWithScopes = Span & {\n [SCOPE_ON_START_SPAN_FIELD]?: Scope;\n [ISOLATION_SCOPE_ON_START_SPAN_FIELD]?: MaybeWeakRef<Scope>;\n};\n\n/** Store the scope & isolation scope for a span, which can the be used when it is finished. */\nexport function setCapturedScopesOnSpan(span: Span | undefined, scope: Scope, isolationScope: Scope): void {\n if (span) {\n addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, makeWeakRef(isolationScope));\n // We don't wrap the scope with a WeakRef here because webkit aggressively garbage collects\n // and scopes are not held in memory for long periods of time.\n addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n * If WeakRef was used and scopes have been garbage collected, returns undefined for those scopes.\n */\nexport function getCapturedScopesOnSpan(span: Span): { scope?: Scope; isolationScope?: Scope } {\n const spanWithScopes = span as SpanWithScopes;\n\n return {\n scope: spanWithScopes[SCOPE_ON_START_SPAN_FIELD],\n isolationScope: derefWeakRef(spanWithScopes[ISOLATION_SCOPE_ON_START_SPAN_FIELD]),\n };\n}\n"],"names":["addNonEnumerableProperty","makeWeakRef","derefWeakRef"],"mappings":";;;;;AAKA,MAAM,yBAAA,GAA4B,cAAA;AAClC,MAAM,mCAAA,GAAsC,uBAAA;AAQrC,SAAS,uBAAA,CAAwB,IAAA,EAAwB,KAAA,EAAc,cAAA,EAA6B;AACzG,EAAA,IAAI,IAAA,EAAM;AACR,IAAAA,+BAAA,CAAyB,IAAA,EAAM,mCAAA,EAAqCC,mBAAA,CAAY,cAAc,CAAC,CAAA;AAG/F,IAAAD,+BAAA,CAAyB,IAAA,EAAM,2BAA2B,KAAK,CAAA;AAAA,EACjE;AACF;AAMO,SAAS,wBAAwB,IAAA,EAAuD;AAC7F,EAAA,MAAM,cAAA,GAAiB,IAAA;AAEvB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,eAAe,yBAAyB,CAAA;AAAA,IAC/C,cAAA,EAAgBE,oBAAA,CAAa,cAAA,CAAe,mCAAmC,CAAC;AAAA,GAClF;AACF;;;;;"} | ||
| {"version":3,"file":"utils.js","sources":["../../../src/tracing/utils.ts"],"sourcesContent":["import type { Scope } from '../scope';\nimport type { Span } from '../types/span';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { derefWeakRef, makeWeakRef, type MaybeWeakRef } from '../utils/weakRef';\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\n// Brand marking a span whose `sentry.source` should be inferred OTel-style at span end (by\n// `applyOtelSpanData`) rather than pinned. `SentryTraceProvider` sets it on the spans it creates\n// so they behave like OTel SDK spans, which carry no Sentry source concept. We use `Symbol.for`\n// so the key is shared across duplicated copies of `@sentry/core`.\nconst OTEL_SOURCE_INFERENCE_SPAN_FIELD = Symbol.for('sentry.otelSourceInference');\n\ntype SpanWithScopes = Span & {\n [SCOPE_ON_START_SPAN_FIELD]?: Scope;\n [ISOLATION_SCOPE_ON_START_SPAN_FIELD]?: MaybeWeakRef<Scope>;\n};\n\ntype SpanWithOtelSourceInference = Span & {\n [OTEL_SOURCE_INFERENCE_SPAN_FIELD]?: boolean;\n};\n\n/** Store the scope & isolation scope for a span, which can the be used when it is finished. */\nexport function setCapturedScopesOnSpan(span: Span | undefined, scope: Scope, isolationScope: Scope): void {\n if (span) {\n addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, makeWeakRef(isolationScope));\n // We don't wrap the scope with a WeakRef here because webkit aggressively garbage collects\n // and scopes are not held in memory for long periods of time.\n addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n * If WeakRef was used and scopes have been garbage collected, returns undefined for those scopes.\n */\nexport function getCapturedScopesOnSpan(span: Span): { scope?: Scope; isolationScope?: Scope } {\n const spanWithScopes = span as SpanWithScopes;\n\n return {\n scope: spanWithScopes[SCOPE_ON_START_SPAN_FIELD],\n isolationScope: derefWeakRef(spanWithScopes[ISOLATION_SCOPE_ON_START_SPAN_FIELD]),\n };\n}\n\n/**\n * Mark a span as eligible for OTel-style `sentry.source` inference at span end.\n * Set by `SentryTraceProvider` on the spans it creates; read by `SentrySpan.updateName()` and\n * `applyOtelSpanData()`.\n */\nexport function markSpanForOtelSourceInference(span: Span): void {\n addNonEnumerableProperty(span, OTEL_SOURCE_INFERENCE_SPAN_FIELD, true);\n}\n\n/** Whether a span is marked for OTel-style `sentry.source` inference (see {@link markSpanForOtelSourceInference}). */\nexport function spanShouldInferOtelSource(span: Span): boolean {\n return (span as SpanWithOtelSourceInference)[OTEL_SOURCE_INFERENCE_SPAN_FIELD] === true;\n}\n"],"names":["addNonEnumerableProperty","makeWeakRef","derefWeakRef"],"mappings":";;;;;AAKA,MAAM,yBAAA,GAA4B,cAAA;AAClC,MAAM,mCAAA,GAAsC,uBAAA;AAM5C,MAAM,gCAAA,mBAAmC,MAAA,CAAO,GAAA,CAAI,4BAA4B,CAAA;AAYzE,SAAS,uBAAA,CAAwB,IAAA,EAAwB,KAAA,EAAc,cAAA,EAA6B;AACzG,EAAA,IAAI,IAAA,EAAM;AACR,IAAAA,+BAAA,CAAyB,IAAA,EAAM,mCAAA,EAAqCC,mBAAA,CAAY,cAAc,CAAC,CAAA;AAG/F,IAAAD,+BAAA,CAAyB,IAAA,EAAM,2BAA2B,KAAK,CAAA;AAAA,EACjE;AACF;AAMO,SAAS,wBAAwB,IAAA,EAAuD;AAC7F,EAAA,MAAM,cAAA,GAAiB,IAAA;AAEvB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,eAAe,yBAAyB,CAAA;AAAA,IAC/C,cAAA,EAAgBE,oBAAA,CAAa,cAAA,CAAe,mCAAmC,CAAC;AAAA,GAClF;AACF;AAOO,SAAS,+BAA+B,IAAA,EAAkB;AAC/D,EAAAF,+BAAA,CAAyB,IAAA,EAAM,kCAAkC,IAAI,CAAA;AACvE;AAGO,SAAS,0BAA0B,IAAA,EAAqB;AAC7D,EAAA,OAAQ,IAAA,CAAqC,gCAAgC,CAAA,KAAM,IAAA;AACrF;;;;;;;"} |
| Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
| const SDK_VERSION = "10.59.0" ; | ||
| const SDK_VERSION = "10.60.0" ; | ||
| exports.SDK_VERSION = SDK_VERSION; | ||
| //# sourceMappingURL=version.js.map |
| export { registerSpanErrorInstrumentation } from './tracing/errors.js'; | ||
| export { getCapturedScopesOnSpan, setCapturedScopesOnSpan } from './tracing/utils.js'; | ||
| export { getCapturedScopesOnSpan, markSpanForOtelSourceInference, setCapturedScopesOnSpan, spanShouldInferOtelSource } from './tracing/utils.js'; | ||
| export { TRACING_DEFAULTS, startIdleSpan } from './tracing/idleSpan.js'; | ||
@@ -8,2 +8,3 @@ export { SentrySpan } from './tracing/sentrySpan.js'; | ||
| export { SUPPRESS_TRACING_KEY, continueTrace, startInactiveSpan, startNewTrace, startSpan, startSpanManual, suppressTracing, withActiveSpan } from './tracing/trace.js'; | ||
| export { bindScopeToEmitter } from './tracing/bindScopeToEmitter.js'; | ||
| export { getDynamicSamplingContextFromClient, getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan, spanToBaggageHeader } from './tracing/dynamicSamplingContext.js'; | ||
@@ -10,0 +11,0 @@ export { setMeasurement, timedEventsToMeasurements } from './tracing/measurement.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} | ||
| {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} |
@@ -11,4 +11,4 @@ import { getClient } from './currentScopes.js'; | ||
| import { startInactiveSpan } from './tracing/trace.js'; | ||
| import { getTraceData } from './utils/traceData.js'; | ||
| import { stripDataUrlContent, parseStringToURLObject, getSanitizedUrlStringFromUrlObject, isURLObjectRelative } from './utils/url.js'; | ||
| import { getTraceData } from './utils/traceData.js'; | ||
@@ -15,0 +15,0 @@ function instrumentFetchRequest(handlerData, shouldCreateSpan, shouldAttachHeaders, spans, spanOriginOrOptions) { |
| export { registerSpanErrorInstrumentation } from './tracing/errors.js'; | ||
| export { getCapturedScopesOnSpan, setCapturedScopesOnSpan } from './tracing/utils.js'; | ||
| export { getCapturedScopesOnSpan, markSpanForOtelSourceInference, setCapturedScopesOnSpan, spanShouldInferOtelSource } from './tracing/utils.js'; | ||
| export { TRACING_DEFAULTS, startIdleSpan } from './tracing/idleSpan.js'; | ||
@@ -8,2 +8,3 @@ export { SentrySpan } from './tracing/sentrySpan.js'; | ||
| export { SUPPRESS_TRACING_KEY, continueTrace, startInactiveSpan, startNewTrace, startSpan, startSpanManual, suppressTracing, withActiveSpan } from './tracing/trace.js'; | ||
| export { bindScopeToEmitter } from './tracing/bindScopeToEmitter.js'; | ||
| export { getDynamicSamplingContextFromClient, getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan, spanToBaggageHeader } from './tracing/dynamicSamplingContext.js'; | ||
@@ -10,0 +11,0 @@ export { setMeasurement, timedEventsToMeasurements } from './tracing/measurement.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} | ||
| {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} |
@@ -1,1 +0,1 @@ | ||
| {"type":"module","version":"10.59.0","sideEffects":false} | ||
| {"type":"module","version":"10.60.0","sideEffects":false} |
| export { registerSpanErrorInstrumentation } from './tracing/errors.js'; | ||
| export { getCapturedScopesOnSpan, setCapturedScopesOnSpan } from './tracing/utils.js'; | ||
| export { getCapturedScopesOnSpan, markSpanForOtelSourceInference, setCapturedScopesOnSpan, spanShouldInferOtelSource } from './tracing/utils.js'; | ||
| export { TRACING_DEFAULTS, startIdleSpan } from './tracing/idleSpan.js'; | ||
@@ -8,2 +8,3 @@ export { SentrySpan } from './tracing/sentrySpan.js'; | ||
| export { SUPPRESS_TRACING_KEY, continueTrace, startInactiveSpan, startNewTrace, startSpan, startSpanManual, suppressTracing, withActiveSpan } from './tracing/trace.js'; | ||
| export { bindScopeToEmitter } from './tracing/bindScopeToEmitter.js'; | ||
| export { getDynamicSamplingContextFromClient, getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan, spanToBaggageHeader } from './tracing/dynamicSamplingContext.js'; | ||
@@ -10,0 +11,0 @@ export { setMeasurement, timedEventsToMeasurements } from './tracing/measurement.js'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} | ||
| {"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"} |
@@ -13,3 +13,3 @@ import { getClient, getCurrentScope } from '../currentScopes.js'; | ||
| import { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled.js'; | ||
| import { getCapturedScopesOnSpan } from './utils.js'; | ||
| import { spanShouldInferOtelSource, getCapturedScopesOnSpan } from './utils.js'; | ||
@@ -125,3 +125,5 @@ const MAX_SPAN_COUNT = 1e3; | ||
| this._name = name; | ||
| this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "custom"); | ||
| if (!spanShouldInferOtelSource(this)) { | ||
| this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, "custom"); | ||
| } | ||
| return this; | ||
@@ -128,0 +130,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sentrySpan.js","sources":["../../../src/tracing/sentrySpan.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport { getClient, getCurrentScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { createSpanEnvelope } from '../envelope';\nimport {\n SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n SEMANTIC_ATTRIBUTE_PROFILE_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { SpanEnvelope } from '../types/envelope';\nimport type { TransactionEvent } from '../types/event';\nimport type { SpanLink } from '../types/link';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributes,\n SpanAttributeValue,\n SpanContextData,\n SpanJSON,\n SpanOrigin,\n SpanTimeInput,\n StreamedSpanJSON,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport type { TimedEvent } from '../types/timedEvent';\nimport { debug } from '../utils/debug-logger';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport {\n convertSpanLinksForEnvelope,\n getRootSpan,\n getSimpleStatusMessage,\n getSpanDescendants,\n getStatusMessage,\n getStreamedSpanLinks,\n spanTimeInputToSeconds,\n spanToJSON,\n spanToTransactionTraceContext,\n TRACE_FLAG_NONE,\n TRACE_FLAG_SAMPLED,\n} from '../utils/spanUtils';\nimport { timestampInSeconds } from '../utils/time';\nimport { getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanEnd } from './logSpans';\nimport { timedEventsToMeasurements } from './measurement';\nimport { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled';\nimport { getCapturedScopesOnSpan } from './utils';\n\nconst MAX_SPAN_COUNT = 1000;\n\n/**\n * Span contains all data about a span\n */\nexport class SentrySpan implements Span {\n protected _traceId: string;\n protected _spanId: string;\n protected _parentSpanId?: string | undefined;\n protected _sampled: boolean | undefined;\n protected _name?: string | undefined;\n protected _attributes: SpanAttributes;\n protected _links?: SpanLink[];\n /** Epoch timestamp in seconds when the span started. */\n protected _startTime: number;\n /** Epoch timestamp in seconds when the span ended. */\n protected _endTime?: number | undefined;\n /** Internal keeper of the status */\n protected _status?: SpanStatus;\n /** The timed events added to this span. */\n protected _events: TimedEvent[];\n\n /** if true, treat span as a standalone span (not part of a transaction) */\n private _isStandaloneSpan?: boolean;\n\n /**\n * You should never call the constructor manually, always use `Sentry.startSpan()`\n * or other span methods.\n * @internal\n * @hideconstructor\n * @hidden\n */\n public constructor(spanContext: SentrySpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this._startTime = spanContext.startTimestamp || timestampInSeconds();\n this._links = spanContext.links;\n\n this._attributes = {};\n this.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: spanContext.op,\n ...spanContext.attributes,\n });\n\n this._name = spanContext.name;\n\n if (spanContext.parentSpanId) {\n this._parentSpanId = spanContext.parentSpanId;\n }\n // We want to include booleans as well here\n if ('sampled' in spanContext) {\n this._sampled = spanContext.sampled;\n }\n if (spanContext.endTimestamp) {\n this._endTime = spanContext.endTimestamp;\n }\n\n this._events = [];\n\n this._isStandaloneSpan = spanContext.isStandalone;\n\n // If the span is already ended, ensure we finalize the span immediately\n if (this._endTime) {\n this._onSpanEnded();\n }\n }\n\n /** @inheritDoc */\n public addLink(link: SpanLink): this {\n if (this._links) {\n this._links.push(link);\n } else {\n this._links = [link];\n }\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(links: SpanLink[]): this {\n if (this._links) {\n this._links.push(...links);\n } else {\n this._links = links;\n }\n return this;\n }\n\n /**\n * This should generally not be used,\n * but it is needed for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: number | undefined): void {\n // noop\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this;\n return {\n spanId,\n traceId,\n traceFlags: sampled ? TRACE_FLAG_SAMPLED : TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public setAttribute(key: string, value: SpanAttributeValue | undefined): this {\n if (value === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._attributes[key];\n } else {\n this._attributes[key] = value;\n }\n\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(attributes: SpanAttributes): this {\n Object.keys(attributes).forEach(key => this.setAttribute(key, attributes[key]));\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for browser tracing where we want to adjust the start time afterwards.\n * USE THIS WITH CAUTION!\n *\n * @hidden\n * @internal\n */\n public updateStartTime(timeInput: SpanTimeInput): void {\n this._startTime = spanTimeInputToSeconds(timeInput);\n }\n\n /**\n * @inheritDoc\n */\n public setStatus(value: SpanStatus): this {\n this._status = value;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public updateName(name: string): this {\n this._name = name;\n this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'custom');\n return this;\n }\n\n /** @inheritdoc */\n public end(endTimestamp?: SpanTimeInput): void {\n // If already ended, skip\n if (this._endTime) {\n return;\n }\n\n this._endTime = spanTimeInputToSeconds(endTimestamp);\n logSpanEnd(this);\n\n this._onSpanEnded();\n }\n\n /**\n * Get JSON representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToJSON(span)` instead.\n */\n public getSpanJSON(): SpanJSON {\n return {\n data: this._attributes,\n description: this._name,\n op: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n parent_span_id: this._parentSpanId,\n span_id: this._spanId,\n start_timestamp: this._startTime,\n status: getStatusMessage(this._status),\n timestamp: this._endTime,\n trace_id: this._traceId,\n origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n profile_id: this._attributes[SEMANTIC_ATTRIBUTE_PROFILE_ID] as string | undefined,\n exclusive_time: this._attributes[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] as number | undefined,\n measurements: timedEventsToMeasurements(this._events),\n is_segment: (this._isStandaloneSpan && getRootSpan(this) === this) || undefined,\n segment_id: this._isStandaloneSpan ? getRootSpan(this).spanContext().spanId : undefined,\n links: convertSpanLinksForEnvelope(this._links),\n };\n }\n\n /**\n * Get {@link StreamedSpanJSON} representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToStreamedSpanJSON(span)` instead.\n */\n public getStreamedSpanJSON(): StreamedSpanJSON {\n return {\n name: this._name ?? '',\n span_id: this._spanId,\n trace_id: this._traceId,\n parent_span_id: this._parentSpanId,\n start_timestamp: this._startTime,\n // just in case _endTime is not set, we use the start time (i.e. duration 0)\n end_timestamp: this._endTime ?? this._startTime,\n is_segment: this._isStandaloneSpan || this === getRootSpan(this),\n status: getSimpleStatusMessage(this._status),\n attributes: this._attributes,\n links: getStreamedSpanLinks(this._links),\n };\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return !this._endTime && !!this._sampled;\n }\n\n /**\n * @inheritdoc\n */\n public addEvent(\n name: string,\n attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n startTime?: SpanTimeInput,\n ): this {\n DEBUG_BUILD && debug.log('[Tracing] Adding an event to span:', name);\n\n const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || timestampInSeconds();\n const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {};\n\n const event: TimedEvent = {\n name,\n time: spanTimeInputToSeconds(time),\n attributes,\n };\n\n this._events.push(event);\n\n return this;\n }\n\n /**\n * This method should generally not be used,\n * but for now we need a way to publicly check if the `_isStandaloneSpan` flag is set.\n * USE THIS WITH CAUTION!\n * @internal\n * @hidden\n * @experimental\n */\n public isStandaloneSpan(): boolean {\n return !!this._isStandaloneSpan;\n }\n\n /** Emit `spanEnd` when the span is ended. */\n private _onSpanEnded(): void {\n const client = getClient();\n if (client) {\n client.emit('spanEnd', this);\n // Guarding sending standalone v1 spans as v2 streamed spans for now.\n // Otherwise they'd be sent once as v1 spans and again as streamed spans.\n // We'll migrate CLS and LCP spans to streamed spans in a later PR and\n // INP spans in the next major of the SDK. At that point, we can fully remove\n // standalone v1 spans <3\n if (!this._isStandaloneSpan) {\n client.emit('afterSpanEnd', this);\n }\n }\n\n // A segment span is basically the root span of a local span tree.\n // So for now, this is either what we previously refer to as the root span,\n // or a standalone span.\n const isSegmentSpan = this._isStandaloneSpan || this === getRootSpan(this);\n\n if (!isSegmentSpan) {\n return;\n }\n\n // if this is a standalone span, we send it immediately\n if (this._isStandaloneSpan) {\n if (this._sampled) {\n sendSpanEnvelope(createSpanEnvelope([this], client));\n } else {\n DEBUG_BUILD &&\n debug.log('[Tracing] Discarding standalone span because its trace was not chosen to be sampled.');\n if (client) {\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n return;\n } else if (client && hasSpanStreamingEnabled(client)) {\n // TODO (spans): Remove standalone span custom logic in favor of sending simple v2 web vital spans\n client.emit('afterSegmentSpanEnd', this);\n return;\n }\n\n const transactionEvent = this._convertSpanToTransaction();\n if (transactionEvent) {\n const scope = getCapturedScopesOnSpan(this).scope || getCurrentScope();\n scope.captureEvent(transactionEvent);\n }\n }\n\n /**\n * Finish the transaction & prepare the event to send to Sentry.\n */\n private _convertSpanToTransaction(): TransactionEvent | undefined {\n // We can only convert finished spans\n if (!isFullFinishedSpan(spanToJSON(this))) {\n return undefined;\n }\n\n if (!this._name) {\n DEBUG_BUILD && debug.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n this._name = '<unlabeled transaction>';\n }\n\n const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = getCapturedScopesOnSpan(this);\n\n const normalizedRequest = capturedSpanScope?.getScopeData().sdkProcessingMetadata?.normalizedRequest;\n\n if (this._sampled !== true) {\n return undefined;\n }\n\n // The transaction span itself as well as any potential standalone spans should be filtered out\n const finishedSpans = getSpanDescendants(this).filter(span => span !== this && !isStandaloneSpan(span));\n\n const spans = finishedSpans.map(span => spanToJSON(span)).filter(isFullFinishedSpan);\n\n const source = this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n // remove internal root span attributes we don't need to send.\n /* eslint-disable @typescript-eslint/no-dynamic-delete */\n delete this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n let hasGenAiSpans = false;\n spans.forEach(span => {\n delete span.data[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (span.op?.startsWith('gen_ai.')) {\n hasGenAiSpans = true;\n }\n });\n // eslint-enabled-next-line @typescript-eslint/no-dynamic-delete\n\n const transaction: TransactionEvent = {\n contexts: {\n trace: spanToTransactionTraceContext(this),\n },\n spans:\n // spans.sort() mutates the array, but `spans` is already a copy so we can safely do this here\n // we do not use spans anymore after this point\n spans.length > MAX_SPAN_COUNT\n ? spans.sort((a, b) => a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT)\n : spans,\n start_timestamp: this._startTime,\n timestamp: this._endTime,\n transaction: this._name,\n type: 'transaction',\n sdkProcessingMetadata: {\n capturedSpanScope,\n capturedSpanIsolationScope,\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(this),\n hasGenAiSpans,\n },\n request: normalizedRequest,\n ...(source && {\n transaction_info: {\n source,\n },\n }),\n };\n\n const measurements = timedEventsToMeasurements(this._events);\n const hasMeasurements = measurements && Object.keys(measurements).length;\n\n if (hasMeasurements) {\n DEBUG_BUILD &&\n debug.log(\n '[Measurements] Adding measurements to transaction event',\n JSON.stringify(measurements, undefined, 2),\n );\n transaction.measurements = measurements;\n }\n\n return transaction;\n }\n}\n\nfunction isSpanTimeInput(value: undefined | SpanAttributes | SpanTimeInput): value is SpanTimeInput {\n return (value && typeof value === 'number') || value instanceof Date || Array.isArray(value);\n}\n\n// We want to filter out any incomplete SpanJSON objects\nfunction isFullFinishedSpan(input: Partial<SpanJSON>): input is SpanJSON {\n return !!input.start_timestamp && !!input.timestamp && !!input.span_id && !!input.trace_id;\n}\n\n/** `SentrySpan`s can be sent as a standalone span rather than belonging to a transaction */\nfunction isStandaloneSpan(span: Span): boolean {\n return span instanceof SentrySpan && span.isStandaloneSpan();\n}\n\n/**\n * Sends a `SpanEnvelope`.\n *\n * Note: If the envelope's spans are dropped, e.g. via `beforeSendSpan`,\n * the envelope will not be sent either.\n */\nfunction sendSpanEnvelope(envelope: SpanEnvelope): void {\n const client = getClient();\n if (!client) {\n return;\n }\n\n const spanItems = envelope[1];\n if (!spanItems || spanItems.length === 0) {\n client.recordDroppedEvent('before_send', 'span');\n return;\n }\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"sentrySpan.js","sources":["../../../src/tracing/sentrySpan.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport { getClient, getCurrentScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { createSpanEnvelope } from '../envelope';\nimport {\n SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n SEMANTIC_ATTRIBUTE_PROFILE_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { SpanEnvelope } from '../types/envelope';\nimport type { TransactionEvent } from '../types/event';\nimport type { SpanLink } from '../types/link';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributes,\n SpanAttributeValue,\n SpanContextData,\n SpanJSON,\n SpanOrigin,\n SpanTimeInput,\n StreamedSpanJSON,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport type { TimedEvent } from '../types/timedEvent';\nimport { debug } from '../utils/debug-logger';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport {\n convertSpanLinksForEnvelope,\n getRootSpan,\n getSimpleStatusMessage,\n getSpanDescendants,\n getStatusMessage,\n getStreamedSpanLinks,\n spanTimeInputToSeconds,\n spanToJSON,\n spanToTransactionTraceContext,\n TRACE_FLAG_NONE,\n TRACE_FLAG_SAMPLED,\n} from '../utils/spanUtils';\nimport { timestampInSeconds } from '../utils/time';\nimport { getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanEnd } from './logSpans';\nimport { timedEventsToMeasurements } from './measurement';\nimport { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled';\nimport { getCapturedScopesOnSpan, spanShouldInferOtelSource } from './utils';\n\nconst MAX_SPAN_COUNT = 1000;\n\n/**\n * Span contains all data about a span\n */\nexport class SentrySpan implements Span {\n protected _traceId: string;\n protected _spanId: string;\n protected _parentSpanId?: string | undefined;\n protected _sampled: boolean | undefined;\n protected _name?: string | undefined;\n protected _attributes: SpanAttributes;\n protected _links?: SpanLink[];\n /** Epoch timestamp in seconds when the span started. */\n protected _startTime: number;\n /** Epoch timestamp in seconds when the span ended. */\n protected _endTime?: number | undefined;\n /** Internal keeper of the status */\n protected _status?: SpanStatus;\n /** The timed events added to this span. */\n protected _events: TimedEvent[];\n\n /** if true, treat span as a standalone span (not part of a transaction) */\n private _isStandaloneSpan?: boolean;\n\n /**\n * You should never call the constructor manually, always use `Sentry.startSpan()`\n * or other span methods.\n * @internal\n * @hideconstructor\n * @hidden\n */\n public constructor(spanContext: SentrySpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this._startTime = spanContext.startTimestamp || timestampInSeconds();\n this._links = spanContext.links;\n\n this._attributes = {};\n this.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: spanContext.op,\n ...spanContext.attributes,\n });\n\n this._name = spanContext.name;\n\n if (spanContext.parentSpanId) {\n this._parentSpanId = spanContext.parentSpanId;\n }\n // We want to include booleans as well here\n if ('sampled' in spanContext) {\n this._sampled = spanContext.sampled;\n }\n if (spanContext.endTimestamp) {\n this._endTime = spanContext.endTimestamp;\n }\n\n this._events = [];\n\n this._isStandaloneSpan = spanContext.isStandalone;\n\n // If the span is already ended, ensure we finalize the span immediately\n if (this._endTime) {\n this._onSpanEnded();\n }\n }\n\n /** @inheritDoc */\n public addLink(link: SpanLink): this {\n if (this._links) {\n this._links.push(link);\n } else {\n this._links = [link];\n }\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(links: SpanLink[]): this {\n if (this._links) {\n this._links.push(...links);\n } else {\n this._links = links;\n }\n return this;\n }\n\n /**\n * This should generally not be used,\n * but it is needed for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: number | undefined): void {\n // noop\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this;\n return {\n spanId,\n traceId,\n traceFlags: sampled ? TRACE_FLAG_SAMPLED : TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public setAttribute(key: string, value: SpanAttributeValue | undefined): this {\n if (value === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete this._attributes[key];\n } else {\n this._attributes[key] = value;\n }\n\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(attributes: SpanAttributes): this {\n Object.keys(attributes).forEach(key => this.setAttribute(key, attributes[key]));\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for browser tracing where we want to adjust the start time afterwards.\n * USE THIS WITH CAUTION!\n *\n * @hidden\n * @internal\n */\n public updateStartTime(timeInput: SpanTimeInput): void {\n this._startTime = spanTimeInputToSeconds(timeInput);\n }\n\n /**\n * @inheritDoc\n */\n public setStatus(value: SpanStatus): this {\n this._status = value;\n return this;\n }\n\n /**\n * @inheritDoc\n */\n public updateName(name: string): this {\n this._name = name;\n // Renaming a span marks its name as explicitly chosen, so we stamp `custom`.\n // The exception is spans created by SentryTraceProvider: those are branded for\n // OTel-style source inference at span end (mirroring OTel SDK spans, which have\n // no Sentry source concept), so instrumentations renaming them must not pin\n // `custom` — applyOtelSpanData infers the correct source (e.g. 'route', 'task').\n if (!spanShouldInferOtelSource(this)) {\n this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'custom');\n }\n return this;\n }\n\n /** @inheritdoc */\n public end(endTimestamp?: SpanTimeInput): void {\n // If already ended, skip\n if (this._endTime) {\n return;\n }\n\n this._endTime = spanTimeInputToSeconds(endTimestamp);\n logSpanEnd(this);\n\n this._onSpanEnded();\n }\n\n /**\n * Get JSON representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToJSON(span)` instead.\n */\n public getSpanJSON(): SpanJSON {\n return {\n data: this._attributes,\n description: this._name,\n op: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n parent_span_id: this._parentSpanId,\n span_id: this._spanId,\n start_timestamp: this._startTime,\n status: getStatusMessage(this._status),\n timestamp: this._endTime,\n trace_id: this._traceId,\n origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n profile_id: this._attributes[SEMANTIC_ATTRIBUTE_PROFILE_ID] as string | undefined,\n exclusive_time: this._attributes[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] as number | undefined,\n measurements: timedEventsToMeasurements(this._events),\n is_segment: (this._isStandaloneSpan && getRootSpan(this) === this) || undefined,\n segment_id: this._isStandaloneSpan ? getRootSpan(this).spanContext().spanId : undefined,\n links: convertSpanLinksForEnvelope(this._links),\n };\n }\n\n /**\n * Get {@link StreamedSpanJSON} representation of this span.\n *\n * @hidden\n * @internal This method is purely for internal purposes and should not be used outside\n * of SDK code. If you need to get a JSON representation of a span,\n * use `spanToStreamedSpanJSON(span)` instead.\n */\n public getStreamedSpanJSON(): StreamedSpanJSON {\n return {\n name: this._name ?? '',\n span_id: this._spanId,\n trace_id: this._traceId,\n parent_span_id: this._parentSpanId,\n start_timestamp: this._startTime,\n // just in case _endTime is not set, we use the start time (i.e. duration 0)\n end_timestamp: this._endTime ?? this._startTime,\n is_segment: this._isStandaloneSpan || this === getRootSpan(this),\n status: getSimpleStatusMessage(this._status),\n attributes: this._attributes,\n links: getStreamedSpanLinks(this._links),\n };\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return !this._endTime && !!this._sampled;\n }\n\n /**\n * @inheritdoc\n */\n public addEvent(\n name: string,\n attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n startTime?: SpanTimeInput,\n ): this {\n DEBUG_BUILD && debug.log('[Tracing] Adding an event to span:', name);\n\n const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || timestampInSeconds();\n const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {};\n\n const event: TimedEvent = {\n name,\n time: spanTimeInputToSeconds(time),\n attributes,\n };\n\n this._events.push(event);\n\n return this;\n }\n\n /**\n * This method should generally not be used,\n * but for now we need a way to publicly check if the `_isStandaloneSpan` flag is set.\n * USE THIS WITH CAUTION!\n * @internal\n * @hidden\n * @experimental\n */\n public isStandaloneSpan(): boolean {\n return !!this._isStandaloneSpan;\n }\n\n /** Emit `spanEnd` when the span is ended. */\n private _onSpanEnded(): void {\n const client = getClient();\n if (client) {\n client.emit('spanEnd', this);\n // Guarding sending standalone v1 spans as v2 streamed spans for now.\n // Otherwise they'd be sent once as v1 spans and again as streamed spans.\n // We'll migrate CLS and LCP spans to streamed spans in a later PR and\n // INP spans in the next major of the SDK. At that point, we can fully remove\n // standalone v1 spans <3\n if (!this._isStandaloneSpan) {\n client.emit('afterSpanEnd', this);\n }\n }\n\n // A segment span is basically the root span of a local span tree.\n // So for now, this is either what we previously refer to as the root span,\n // or a standalone span.\n const isSegmentSpan = this._isStandaloneSpan || this === getRootSpan(this);\n\n if (!isSegmentSpan) {\n return;\n }\n\n // if this is a standalone span, we send it immediately\n if (this._isStandaloneSpan) {\n if (this._sampled) {\n sendSpanEnvelope(createSpanEnvelope([this], client));\n } else {\n DEBUG_BUILD &&\n debug.log('[Tracing] Discarding standalone span because its trace was not chosen to be sampled.');\n if (client) {\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n return;\n } else if (client && hasSpanStreamingEnabled(client)) {\n // TODO (spans): Remove standalone span custom logic in favor of sending simple v2 web vital spans\n client.emit('afterSegmentSpanEnd', this);\n return;\n }\n\n const transactionEvent = this._convertSpanToTransaction();\n if (transactionEvent) {\n const scope = getCapturedScopesOnSpan(this).scope || getCurrentScope();\n scope.captureEvent(transactionEvent);\n }\n }\n\n /**\n * Finish the transaction & prepare the event to send to Sentry.\n */\n private _convertSpanToTransaction(): TransactionEvent | undefined {\n // We can only convert finished spans\n if (!isFullFinishedSpan(spanToJSON(this))) {\n return undefined;\n }\n\n if (!this._name) {\n DEBUG_BUILD && debug.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n this._name = '<unlabeled transaction>';\n }\n\n const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = getCapturedScopesOnSpan(this);\n\n const normalizedRequest = capturedSpanScope?.getScopeData().sdkProcessingMetadata?.normalizedRequest;\n\n if (this._sampled !== true) {\n return undefined;\n }\n\n // The transaction span itself as well as any potential standalone spans should be filtered out\n const finishedSpans = getSpanDescendants(this).filter(span => span !== this && !isStandaloneSpan(span));\n\n const spans = finishedSpans.map(span => spanToJSON(span)).filter(isFullFinishedSpan);\n\n const source = this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n // remove internal root span attributes we don't need to send.\n /* eslint-disable @typescript-eslint/no-dynamic-delete */\n delete this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n let hasGenAiSpans = false;\n spans.forEach(span => {\n delete span.data[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (span.op?.startsWith('gen_ai.')) {\n hasGenAiSpans = true;\n }\n });\n // eslint-enabled-next-line @typescript-eslint/no-dynamic-delete\n\n const transaction: TransactionEvent = {\n contexts: {\n trace: spanToTransactionTraceContext(this),\n },\n spans:\n // spans.sort() mutates the array, but `spans` is already a copy so we can safely do this here\n // we do not use spans anymore after this point\n spans.length > MAX_SPAN_COUNT\n ? spans.sort((a, b) => a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT)\n : spans,\n start_timestamp: this._startTime,\n timestamp: this._endTime,\n transaction: this._name,\n type: 'transaction',\n sdkProcessingMetadata: {\n capturedSpanScope,\n capturedSpanIsolationScope,\n dynamicSamplingContext: getDynamicSamplingContextFromSpan(this),\n hasGenAiSpans,\n },\n request: normalizedRequest,\n ...(source && {\n transaction_info: {\n source,\n },\n }),\n };\n\n const measurements = timedEventsToMeasurements(this._events);\n const hasMeasurements = measurements && Object.keys(measurements).length;\n\n if (hasMeasurements) {\n DEBUG_BUILD &&\n debug.log(\n '[Measurements] Adding measurements to transaction event',\n JSON.stringify(measurements, undefined, 2),\n );\n transaction.measurements = measurements;\n }\n\n return transaction;\n }\n}\n\nfunction isSpanTimeInput(value: undefined | SpanAttributes | SpanTimeInput): value is SpanTimeInput {\n return (value && typeof value === 'number') || value instanceof Date || Array.isArray(value);\n}\n\n// We want to filter out any incomplete SpanJSON objects\nfunction isFullFinishedSpan(input: Partial<SpanJSON>): input is SpanJSON {\n return !!input.start_timestamp && !!input.timestamp && !!input.span_id && !!input.trace_id;\n}\n\n/** `SentrySpan`s can be sent as a standalone span rather than belonging to a transaction */\nfunction isStandaloneSpan(span: Span): boolean {\n return span instanceof SentrySpan && span.isStandaloneSpan();\n}\n\n/**\n * Sends a `SpanEnvelope`.\n *\n * Note: If the envelope's spans are dropped, e.g. via `beforeSendSpan`,\n * the envelope will not be sent either.\n */\nfunction sendSpanEnvelope(envelope: SpanEnvelope): void {\n const client = getClient();\n if (!client) {\n return;\n }\n\n const spanItems = envelope[1];\n if (!spanItems || spanItems.length === 0) {\n client.recordDroppedEvent('before_send', 'span');\n return;\n }\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n"],"names":[],"mappings":"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"} |
@@ -1,4 +0,3 @@ | ||
| import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_USER_USERNAME, SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS, SEMANTIC_ATTRIBUTE_USER_EMAIL, SEMANTIC_ATTRIBUTE_USER_ID, SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT, SEMANTIC_ATTRIBUTE_SENTRY_RELEASE, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS, SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME } from '../../semanticAttributes.js'; | ||
| import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_USER_USERNAME, SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS, SEMANTIC_ATTRIBUTE_USER_EMAIL, SEMANTIC_ATTRIBUTE_USER_ID, SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT, SEMANTIC_ATTRIBUTE_SENTRY_RELEASE, SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS } from '../../semanticAttributes.js'; | ||
| import { getCombinedScopeData } from '../../utils/scopeData.js'; | ||
| import { parseUrl, getSanitizedUrlString, stripUrlQueryAndFragment } from '../../utils/url.js'; | ||
| import { spanToStreamedSpanJSON, INTERNAL_getSegmentSpan, streamedSpanJsonToSerializedSpan, showSpanDropWarning } from '../../utils/spanUtils.js'; | ||
@@ -18,3 +17,3 @@ import { getCapturedScopesOnSpan } from '../utils.js'; | ||
| const spanKind = span.kind; | ||
| inferSpanDataFromOtelAttributes(spanJSON, spanKind); | ||
| client.emit("preprocessSpan", spanJSON, { spanKind }); | ||
| if (spanJSON.is_segment) { | ||
@@ -85,100 +84,4 @@ applyScopeToSegmentSpan(spanJSON, finalScopeData); | ||
| } | ||
| const SPAN_KIND_SERVER = 1; | ||
| const SPAN_KIND_CLIENT = 2; | ||
| function inferSpanDataFromOtelAttributes(spanJSON, spanKind) { | ||
| const attributes = spanJSON.attributes; | ||
| if (!attributes) { | ||
| return; | ||
| } | ||
| const httpMethod = attributes["http.request.method"] || attributes["http.method"]; | ||
| if (httpMethod) { | ||
| inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod); | ||
| return; | ||
| } | ||
| const dbSystem = attributes["db.system.name"] || attributes["db.system"]; | ||
| const opIsCache = typeof attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] === "string" && `${attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP]}`.startsWith("cache."); | ||
| if (dbSystem && !opIsCache) { | ||
| inferDbSpanData(spanJSON, attributes); | ||
| return; | ||
| } | ||
| if (attributes["rpc.service"]) { | ||
| safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: "rpc" }); | ||
| return; | ||
| } | ||
| if (attributes["messaging.system"]) { | ||
| safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: "message" }); | ||
| return; | ||
| } | ||
| const faasTrigger = attributes["faas.trigger"]; | ||
| if (faasTrigger) { | ||
| safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${faasTrigger}` }); | ||
| } | ||
| } | ||
| function inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod) { | ||
| const opParts = ["http"]; | ||
| if (spanKind === SPAN_KIND_CLIENT) { | ||
| opParts.push("client"); | ||
| } else if (spanKind === SPAN_KIND_SERVER) { | ||
| opParts.push("server"); | ||
| } | ||
| if (attributes["sentry.http.prefetch"]) { | ||
| opParts.push("prefetch"); | ||
| } | ||
| safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: opParts.join(".") }); | ||
| const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]; | ||
| if (typeof customName === "string") { | ||
| spanJSON.name = customName; | ||
| return; | ||
| } | ||
| if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === "custom") { | ||
| return; | ||
| } | ||
| const httpRoute = attributes["http.route"]; | ||
| if (typeof httpRoute === "string") { | ||
| spanJSON.name = `${httpMethod} ${httpRoute}`; | ||
| safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "route" }); | ||
| } else { | ||
| if (spanKind === SPAN_KIND_CLIENT || spanKind === SPAN_KIND_SERVER) { | ||
| const urlPath = getUrlPath(attributes, spanKind); | ||
| if (urlPath) { | ||
| spanJSON.name = `${httpMethod} ${urlPath}`; | ||
| } | ||
| } | ||
| safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "url" }); | ||
| } | ||
| } | ||
| function getUrlPath(attributes, spanKind) { | ||
| const httpUrl = attributes["http.url"] || attributes["url.full"]; | ||
| const httpTarget = attributes["http.target"]; | ||
| const parsedUrl = typeof httpUrl === "string" ? parseUrl(httpUrl) : void 0; | ||
| const sanitizedUrl = parsedUrl ? getSanitizedUrlString(parsedUrl) : void 0; | ||
| if (spanKind === SPAN_KIND_SERVER && typeof httpTarget === "string") { | ||
| return stripUrlQueryAndFragment(httpTarget); | ||
| } | ||
| if (sanitizedUrl) { | ||
| return sanitizedUrl; | ||
| } | ||
| if (typeof httpTarget === "string") { | ||
| return stripUrlQueryAndFragment(httpTarget); | ||
| } | ||
| return void 0; | ||
| } | ||
| function inferDbSpanData(spanJSON, attributes) { | ||
| safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: "db" }); | ||
| const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]; | ||
| if (typeof customName === "string") { | ||
| spanJSON.name = customName; | ||
| return; | ||
| } | ||
| if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === "custom") { | ||
| return; | ||
| } | ||
| const statement = attributes["db.statement"]; | ||
| if (statement) { | ||
| spanJSON.name = `${statement}`; | ||
| safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "task" }); | ||
| } | ||
| } | ||
| export { applyBeforeSendSpanCallback, captureSpan, inferSpanDataFromOtelAttributes, safeSetSpanJSONAttributes }; | ||
| export { applyBeforeSendSpanCallback, captureSpan, safeSetSpanJSONAttributes }; | ||
| //# sourceMappingURL=captureSpan.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"captureSpan.js","sources":["../../../../src/tracing/spans/captureSpan.ts"],"sourcesContent":["import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport { getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment } from '../../utils/url';\nimport {\n INTERNAL_getSegmentSpan,\n showSpanDropWarning,\n spanToStreamedSpanJSON,\n streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\nimport { DEFAULT_ENVIRONMENT } from '../../constants';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n // Convert to JSON FIRST - we cannot write to an already-ended span\n const spanJSON = spanToStreamedSpanJSON(span);\n\n const segmentSpan = INTERNAL_getSegmentSpan(span);\n const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n // Backfill span data from OTel semantic conventions when not explicitly set.\n // OTel-originated spans don't have sentry.op, description, etc. — the non-streamed path\n // infers these in the SentrySpanExporter, but streamed spans skip the exporter entirely.\n // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n // This must run before all hooks and beforeSendSpan so that user callbacks can see and override inferred values.\n const spanKind = (span as { kind?: number }).kind;\n inferSpanDataFromOtelAttributes(spanJSON, spanKind);\n\n if (spanJSON.is_segment) {\n applyScopeToSegmentSpan(spanJSON, finalScopeData);\n applySdkMetadataToSegmentSpan(spanJSON, client);\n // Allow hook subscribers to mutate the segment span JSON\n // This also invokes the `processSegmentSpan` hook of all integrations\n client.emit('processSegmentSpan', spanJSON);\n }\n\n // This allows hook subscribers to mutate the span JSON\n // This also invokes the `processSpan` hook of all integrations\n client.emit('processSpan', spanJSON);\n\n const { beforeSendSpan } = client.getOptions();\n const processedSpan =\n beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n : spanJSON;\n\n // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (spanNameSource) {\n safeSetSpanJSONAttributes(processedSpan, {\n // Purposefully not using a constant defined here like in other attributes:\n // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n 'sentry.span.source': spanNameSource,\n });\n }\n\n return {\n ...streamedSpanJsonToSerializedSpan(processedSpan),\n _segmentSpan: segmentSpan,\n };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n spanJSON: StreamedSpanJSON,\n newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n Object.entries(newAttributes).forEach(([key, value]) => {\n if (value != null && !(key in originalAttributes)) {\n originalAttributes[key] = value;\n }\n });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n const integrationNames = client.getIntegrationNames();\n if (!integrationNames.length) return;\n\n safeSetSpanJSONAttributes(segmentSpanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n });\n}\n\nfunction applyCommonSpanAttributes(\n spanJSON: StreamedSpanJSON,\n serializedSegmentSpan: StreamedSpanJSON,\n client: Client,\n scopeData: ScopeData,\n): void {\n const sdk = client.getSdkMetadata();\n const { release, environment } = client.getOptions();\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n safeSetSpanJSONAttributes(spanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n ...scopeData.attributes,\n });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n span: StreamedSpanJSON,\n beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\n// OTel SpanKind values (numeric to avoid importing from @opentelemetry/api)\nconst SPAN_KIND_SERVER = 1;\nconst SPAN_KIND_CLIENT = 2;\n\n/**\n * Infer and backfill span data from OTel semantic conventions.\n * This mirrors what the `SentrySpanExporter` does for non-streamed spans via `getSpanData`/`inferSpanData`.\n * Streamed spans skip the exporter, so we do the inference here during capture.\n *\n * Backfills: `sentry.op`, `sentry.source`, and `name` (description).\n * Uses `safeSetSpanJSONAttributes` so explicitly set attributes are never overwritten.\n */\n/** Exported only for tests. */\nexport function inferSpanDataFromOtelAttributes(spanJSON: StreamedSpanJSON, spanKind?: number): void {\n const attributes = spanJSON.attributes;\n if (!attributes) {\n return;\n }\n\n const httpMethod = attributes['http.request.method'] || attributes['http.method'];\n if (httpMethod) {\n inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod);\n return;\n }\n\n const dbSystem = attributes['db.system.name'] || attributes['db.system'];\n const opIsCache =\n typeof attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] === 'string' &&\n `${attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP]}`.startsWith('cache.');\n if (dbSystem && !opIsCache) {\n inferDbSpanData(spanJSON, attributes);\n return;\n }\n\n if (attributes['rpc.service']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'rpc' });\n return;\n }\n\n if (attributes['messaging.system']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'message' });\n return;\n }\n\n const faasTrigger = attributes['faas.trigger'];\n if (faasTrigger) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${faasTrigger}` });\n }\n}\n\nfunction inferHttpSpanData(\n spanJSON: StreamedSpanJSON,\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n httpMethod: unknown,\n): void {\n // Infer op: http.client, http.server, or just http\n const opParts = ['http'];\n if (spanKind === SPAN_KIND_CLIENT) {\n opParts.push('client');\n } else if (spanKind === SPAN_KIND_SERVER) {\n opParts.push('server');\n }\n if (attributes['sentry.http.prefetch']) {\n opParts.push('prefetch');\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: opParts.join('.') });\n\n // If the user set a custom span name via updateSpanName(), apply it — OTel instrumentation\n // may have overwritten span.name after the user set it, so we restore from the attribute.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const httpRoute = attributes['http.route'];\n if (typeof httpRoute === 'string') {\n spanJSON.name = `${httpMethod} ${httpRoute}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route' });\n } else {\n // Infer span name from URL attributes, matching the non-streamed exporter's behavior.\n // Only overwrite the name for OTel spans (known spanKind)\n if (spanKind === SPAN_KIND_CLIENT || spanKind === SPAN_KIND_SERVER) {\n const urlPath = getUrlPath(attributes, spanKind);\n if (urlPath) {\n spanJSON.name = `${httpMethod} ${urlPath}`;\n }\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url' });\n }\n}\n\n/**\n * Extract a URL path from span attributes for use in the span name.\n * Mirrors the logic in the non-streamed exporter's `getSanitizedUrl`.\n */\nfunction getUrlPath(\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n): string | undefined {\n const httpUrl = attributes['http.url'] || attributes['url.full'];\n const httpTarget = attributes['http.target'];\n\n const parsedUrl = typeof httpUrl === 'string' ? parseUrl(httpUrl) : undefined;\n const sanitizedUrl = parsedUrl ? getSanitizedUrlString(parsedUrl) : undefined;\n\n // For server spans, prefer the relative target path\n if (spanKind === SPAN_KIND_SERVER && typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n // For client spans (and others), use the full sanitized URL\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Fall back to target if no full URL is available\n if (typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n return undefined;\n}\n\nfunction inferDbSpanData(spanJSON: StreamedSpanJSON, attributes: RawAttributes<Record<string, unknown>>): void {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db' });\n\n // If the user set a custom span name via updateSpanName(), apply it.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const statement = attributes['db.statement'];\n if (statement) {\n spanJSON.name = `${statement}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'task' });\n }\n}\n"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"captureSpan.js","sources":["../../../../src/tracing/spans/captureSpan.ts"],"sourcesContent":["import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport {\n INTERNAL_getSegmentSpan,\n showSpanDropWarning,\n spanToStreamedSpanJSON,\n streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\nimport { DEFAULT_ENVIRONMENT } from '../../constants';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n // Convert to JSON FIRST - we cannot write to an already-ended span\n const spanJSON = spanToStreamedSpanJSON(span);\n\n const segmentSpan = INTERNAL_getSegmentSpan(span);\n const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n // It is forwarded to `preprocessSpan` subscribers (e.g. the OpenTelemetry SDK backfills op/source/name from it).\n const spanKind = (span as { kind?: number }).kind;\n\n // Preprocess the span JSON before any other hooks run, so that `processSpan`/`processSegmentSpan`\n // subscribers (incl. integrations) and `beforeSendSpan` see fully inferred span data.\n client.emit('preprocessSpan', spanJSON, { spanKind });\n\n if (spanJSON.is_segment) {\n applyScopeToSegmentSpan(spanJSON, finalScopeData);\n applySdkMetadataToSegmentSpan(spanJSON, client);\n // Allow hook subscribers to mutate the segment span JSON\n // This also invokes the `processSegmentSpan` hook of all integrations\n client.emit('processSegmentSpan', spanJSON);\n }\n\n // This allows hook subscribers to mutate the span JSON\n // This also invokes the `processSpan` hook of all integrations\n client.emit('processSpan', spanJSON);\n\n const { beforeSendSpan } = client.getOptions();\n const processedSpan =\n beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n : spanJSON;\n\n // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (spanNameSource) {\n safeSetSpanJSONAttributes(processedSpan, {\n // Purposefully not using a constant defined here like in other attributes:\n // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n 'sentry.span.source': spanNameSource,\n });\n }\n\n return {\n ...streamedSpanJsonToSerializedSpan(processedSpan),\n _segmentSpan: segmentSpan,\n };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n spanJSON: StreamedSpanJSON,\n newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n Object.entries(newAttributes).forEach(([key, value]) => {\n if (value != null && !(key in originalAttributes)) {\n originalAttributes[key] = value;\n }\n });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n const integrationNames = client.getIntegrationNames();\n if (!integrationNames.length) return;\n\n safeSetSpanJSONAttributes(segmentSpanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n });\n}\n\nfunction applyCommonSpanAttributes(\n spanJSON: StreamedSpanJSON,\n serializedSegmentSpan: StreamedSpanJSON,\n client: Client,\n scopeData: ScopeData,\n): void {\n const sdk = client.getSdkMetadata();\n const { release, environment } = client.getOptions();\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n safeSetSpanJSONAttributes(spanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n ...scopeData.attributes,\n });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n span: StreamedSpanJSON,\n beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n"],"names":[],"mappings":"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"} |
@@ -6,2 +6,3 @@ import { addNonEnumerableProperty } from '../utils/object.js'; | ||
| const ISOLATION_SCOPE_ON_START_SPAN_FIELD = "_sentryIsolationScope"; | ||
| const OTEL_SOURCE_INFERENCE_SPAN_FIELD = /* @__PURE__ */ Symbol.for("sentry.otelSourceInference"); | ||
| function setCapturedScopesOnSpan(span, scope, isolationScope) { | ||
@@ -20,4 +21,10 @@ if (span) { | ||
| } | ||
| function markSpanForOtelSourceInference(span) { | ||
| addNonEnumerableProperty(span, OTEL_SOURCE_INFERENCE_SPAN_FIELD, true); | ||
| } | ||
| function spanShouldInferOtelSource(span) { | ||
| return span[OTEL_SOURCE_INFERENCE_SPAN_FIELD] === true; | ||
| } | ||
| export { getCapturedScopesOnSpan, setCapturedScopesOnSpan }; | ||
| export { getCapturedScopesOnSpan, markSpanForOtelSourceInference, setCapturedScopesOnSpan, spanShouldInferOtelSource }; | ||
| //# sourceMappingURL=utils.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"utils.js","sources":["../../../src/tracing/utils.ts"],"sourcesContent":["import type { Scope } from '../scope';\nimport type { Span } from '../types/span';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { derefWeakRef, makeWeakRef, type MaybeWeakRef } from '../utils/weakRef';\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\ntype SpanWithScopes = Span & {\n [SCOPE_ON_START_SPAN_FIELD]?: Scope;\n [ISOLATION_SCOPE_ON_START_SPAN_FIELD]?: MaybeWeakRef<Scope>;\n};\n\n/** Store the scope & isolation scope for a span, which can the be used when it is finished. */\nexport function setCapturedScopesOnSpan(span: Span | undefined, scope: Scope, isolationScope: Scope): void {\n if (span) {\n addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, makeWeakRef(isolationScope));\n // We don't wrap the scope with a WeakRef here because webkit aggressively garbage collects\n // and scopes are not held in memory for long periods of time.\n addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n * If WeakRef was used and scopes have been garbage collected, returns undefined for those scopes.\n */\nexport function getCapturedScopesOnSpan(span: Span): { scope?: Scope; isolationScope?: Scope } {\n const spanWithScopes = span as SpanWithScopes;\n\n return {\n scope: spanWithScopes[SCOPE_ON_START_SPAN_FIELD],\n isolationScope: derefWeakRef(spanWithScopes[ISOLATION_SCOPE_ON_START_SPAN_FIELD]),\n };\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,yBAAA,GAA4B,cAAA;AAClC,MAAM,mCAAA,GAAsC,uBAAA;AAQrC,SAAS,uBAAA,CAAwB,IAAA,EAAwB,KAAA,EAAc,cAAA,EAA6B;AACzG,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,wBAAA,CAAyB,IAAA,EAAM,mCAAA,EAAqC,WAAA,CAAY,cAAc,CAAC,CAAA;AAG/F,IAAA,wBAAA,CAAyB,IAAA,EAAM,2BAA2B,KAAK,CAAA;AAAA,EACjE;AACF;AAMO,SAAS,wBAAwB,IAAA,EAAuD;AAC7F,EAAA,MAAM,cAAA,GAAiB,IAAA;AAEvB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,eAAe,yBAAyB,CAAA;AAAA,IAC/C,cAAA,EAAgB,YAAA,CAAa,cAAA,CAAe,mCAAmC,CAAC;AAAA,GAClF;AACF;;;;"} | ||
| {"version":3,"file":"utils.js","sources":["../../../src/tracing/utils.ts"],"sourcesContent":["import type { Scope } from '../scope';\nimport type { Span } from '../types/span';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { derefWeakRef, makeWeakRef, type MaybeWeakRef } from '../utils/weakRef';\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\n// Brand marking a span whose `sentry.source` should be inferred OTel-style at span end (by\n// `applyOtelSpanData`) rather than pinned. `SentryTraceProvider` sets it on the spans it creates\n// so they behave like OTel SDK spans, which carry no Sentry source concept. We use `Symbol.for`\n// so the key is shared across duplicated copies of `@sentry/core`.\nconst OTEL_SOURCE_INFERENCE_SPAN_FIELD = Symbol.for('sentry.otelSourceInference');\n\ntype SpanWithScopes = Span & {\n [SCOPE_ON_START_SPAN_FIELD]?: Scope;\n [ISOLATION_SCOPE_ON_START_SPAN_FIELD]?: MaybeWeakRef<Scope>;\n};\n\ntype SpanWithOtelSourceInference = Span & {\n [OTEL_SOURCE_INFERENCE_SPAN_FIELD]?: boolean;\n};\n\n/** Store the scope & isolation scope for a span, which can the be used when it is finished. */\nexport function setCapturedScopesOnSpan(span: Span | undefined, scope: Scope, isolationScope: Scope): void {\n if (span) {\n addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, makeWeakRef(isolationScope));\n // We don't wrap the scope with a WeakRef here because webkit aggressively garbage collects\n // and scopes are not held in memory for long periods of time.\n addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n * If WeakRef was used and scopes have been garbage collected, returns undefined for those scopes.\n */\nexport function getCapturedScopesOnSpan(span: Span): { scope?: Scope; isolationScope?: Scope } {\n const spanWithScopes = span as SpanWithScopes;\n\n return {\n scope: spanWithScopes[SCOPE_ON_START_SPAN_FIELD],\n isolationScope: derefWeakRef(spanWithScopes[ISOLATION_SCOPE_ON_START_SPAN_FIELD]),\n };\n}\n\n/**\n * Mark a span as eligible for OTel-style `sentry.source` inference at span end.\n * Set by `SentryTraceProvider` on the spans it creates; read by `SentrySpan.updateName()` and\n * `applyOtelSpanData()`.\n */\nexport function markSpanForOtelSourceInference(span: Span): void {\n addNonEnumerableProperty(span, OTEL_SOURCE_INFERENCE_SPAN_FIELD, true);\n}\n\n/** Whether a span is marked for OTel-style `sentry.source` inference (see {@link markSpanForOtelSourceInference}). */\nexport function spanShouldInferOtelSource(span: Span): boolean {\n return (span as SpanWithOtelSourceInference)[OTEL_SOURCE_INFERENCE_SPAN_FIELD] === true;\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,yBAAA,GAA4B,cAAA;AAClC,MAAM,mCAAA,GAAsC,uBAAA;AAM5C,MAAM,gCAAA,mBAAmC,MAAA,CAAO,GAAA,CAAI,4BAA4B,CAAA;AAYzE,SAAS,uBAAA,CAAwB,IAAA,EAAwB,KAAA,EAAc,cAAA,EAA6B;AACzG,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,wBAAA,CAAyB,IAAA,EAAM,mCAAA,EAAqC,WAAA,CAAY,cAAc,CAAC,CAAA;AAG/F,IAAA,wBAAA,CAAyB,IAAA,EAAM,2BAA2B,KAAK,CAAA;AAAA,EACjE;AACF;AAMO,SAAS,wBAAwB,IAAA,EAAuD;AAC7F,EAAA,MAAM,cAAA,GAAiB,IAAA;AAEvB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,eAAe,yBAAyB,CAAA;AAAA,IAC/C,cAAA,EAAgB,YAAA,CAAa,cAAA,CAAe,mCAAmC,CAAC;AAAA,GAClF;AACF;AAOO,SAAS,+BAA+B,IAAA,EAAkB;AAC/D,EAAA,wBAAA,CAAyB,IAAA,EAAM,kCAAkC,IAAI,CAAA;AACvE;AAGO,SAAS,0BAA0B,IAAA,EAAqB;AAC7D,EAAA,OAAQ,IAAA,CAAqC,gCAAgC,CAAA,KAAM,IAAA;AACrF;;;;"} |
@@ -1,4 +0,4 @@ | ||
| const SDK_VERSION = "10.59.0" ; | ||
| const SDK_VERSION = "10.60.0" ; | ||
| export { SDK_VERSION }; | ||
| //# sourceMappingURL=version.js.map |
@@ -235,2 +235,10 @@ import { IntegrationIndex } from './integration'; | ||
| /** | ||
| * Register a callback to preprocess a span JSON _before_ it is passed to the `processSpan` and | ||
| * `processSegmentSpan` hooks. Use this to backfill data that subsequent hooks rely on. | ||
| * The optional `hint` exposes additional context about the originating span (e.g. the OTel `spanKind`). | ||
| */ | ||
| on(hook: 'preprocessSpan', callback: (streamedSpanJSON: StreamedSpanJSON, hint?: { | ||
| spanKind?: number; | ||
| }) => void): () => void; | ||
| /** | ||
| * Register a callback for when a span JSON is processed, to add some data to the span JSON. | ||
@@ -458,2 +466,8 @@ */ | ||
| /** | ||
| * Fire a hook event to preprocess a span JSON before the `processSpan` and `processSegmentSpan` hooks run. | ||
| */ | ||
| emit(hook: 'preprocessSpan', streamedSpanJSON: StreamedSpanJSON, hint?: { | ||
| spanKind?: number; | ||
| }): void; | ||
| /** | ||
| * Fire a hook event when a span JSON is processed, to add some data to the span JSON. | ||
@@ -460,0 +474,0 @@ */ |
| export { registerSpanErrorInstrumentation } from './errors'; | ||
| export { setCapturedScopesOnSpan, getCapturedScopesOnSpan } from './utils'; | ||
| export { setCapturedScopesOnSpan, getCapturedScopesOnSpan, markSpanForOtelSourceInference, spanShouldInferOtelSource, } from './utils'; | ||
| export { startIdleSpan, TRACING_DEFAULTS } from './idleSpan'; | ||
@@ -9,2 +9,3 @@ export { SentrySpan } from './sentrySpan'; | ||
| export { startSpan, startInactiveSpan, startSpanManual, continueTrace, withActiveSpan, suppressTracing, startNewTrace, SUPPRESS_TRACING_KEY, } from './trace'; | ||
| export { bindScopeToEmitter } from './bindScopeToEmitter'; | ||
| export { getDynamicSamplingContextFromClient, getDynamicSamplingContextFromSpan, getDynamicSamplingContextFromScope, spanToBaggageHeader, } from './dynamicSamplingContext'; | ||
@@ -11,0 +12,0 @@ export { setMeasurement, timedEventsToMeasurements } from './measurement'; |
@@ -26,12 +26,2 @@ import { RawAttributes } from '../../attributes'; | ||
| export declare function applyBeforeSendSpanCallback(span: StreamedSpanJSON, beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON): StreamedSpanJSON; | ||
| /** | ||
| * Infer and backfill span data from OTel semantic conventions. | ||
| * This mirrors what the `SentrySpanExporter` does for non-streamed spans via `getSpanData`/`inferSpanData`. | ||
| * Streamed spans skip the exporter, so we do the inference here during capture. | ||
| * | ||
| * Backfills: `sentry.op`, `sentry.source`, and `name` (description). | ||
| * Uses `safeSetSpanJSONAttributes` so explicitly set attributes are never overwritten. | ||
| */ | ||
| /** Exported only for tests. */ | ||
| export declare function inferSpanDataFromOtelAttributes(spanJSON: StreamedSpanJSON, spanKind?: number): void; | ||
| //# sourceMappingURL=captureSpan.d.ts.map |
@@ -13,2 +13,10 @@ import { Scope } from '../scope'; | ||
| }; | ||
| /** | ||
| * Mark a span as eligible for OTel-style `sentry.source` inference at span end. | ||
| * Set by `SentryTraceProvider` on the spans it creates; read by `SentrySpan.updateName()` and | ||
| * `applyOtelSpanData()`. | ||
| */ | ||
| export declare function markSpanForOtelSourceInference(span: Span): void; | ||
| /** Whether a span is marked for OTel-style `sentry.source` inference (see {@link markSpanForOtelSourceInference}). */ | ||
| export declare function spanShouldInferOtelSource(span: Span): boolean; | ||
| //# sourceMappingURL=utils.d.ts.map |
@@ -235,2 +235,10 @@ import type { IntegrationIndex } from './integration'; | ||
| /** | ||
| * Register a callback to preprocess a span JSON _before_ it is passed to the `processSpan` and | ||
| * `processSegmentSpan` hooks. Use this to backfill data that subsequent hooks rely on. | ||
| * The optional `hint` exposes additional context about the originating span (e.g. the OTel `spanKind`). | ||
| */ | ||
| on(hook: 'preprocessSpan', callback: (streamedSpanJSON: StreamedSpanJSON, hint?: { | ||
| spanKind?: number; | ||
| }) => void): () => void; | ||
| /** | ||
| * Register a callback for when a span JSON is processed, to add some data to the span JSON. | ||
@@ -458,2 +466,8 @@ */ | ||
| /** | ||
| * Fire a hook event to preprocess a span JSON before the `processSpan` and `processSegmentSpan` hooks run. | ||
| */ | ||
| emit(hook: 'preprocessSpan', streamedSpanJSON: StreamedSpanJSON, hint?: { | ||
| spanKind?: number; | ||
| }): void; | ||
| /** | ||
| * Fire a hook event when a span JSON is processed, to add some data to the span JSON. | ||
@@ -460,0 +474,0 @@ */ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAMrC,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC7G,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAc,KAAK,EAAE,SAAS,EAA+B,MAAM,eAAe,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAY,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACtG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAWrE,OAAO,EAAqB,KAAK,aAAa,EAA4B,MAAM,uBAAuB,CAAC;AAkHxG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,8BAAsB,MAAM,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IAClE,iCAAiC;IACjC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAE/B,2FAA2F;IAC3F,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;IAExC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC;IAE1C,oCAAoC;IACpC,SAAS,CAAC,aAAa,EAAE,gBAAgB,CAAC;IAE1C,sCAAsC;IACtC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IAEjC,SAAS,CAAC,gBAAgB,EAAE,cAAc,EAAE,CAAC;IAE7C,uBAAuB;IACvB,SAAS,CAAC,SAAS,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;IAG/C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEhD,SAAS,CAAC,cAAc,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAEjD,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,sBAAsB,CAAC;IAE3D;;;;OAIG;IACH,SAAS,aAAa,OAAO,EAAE,CAAC;IAwDhC;;;;OAIG;IACI,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM;IAyBpF;;;;OAIG;IACI,cAAc,CACnB,OAAO,EAAE,mBAAmB,EAC5B,KAAK,CAAC,EAAE,aAAa,EACrB,IAAI,CAAC,EAAE,SAAS,EAChB,YAAY,CAAC,EAAE,KAAK,GACnB,MAAM;IAoBT;;;;OAIG;IACI,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,KAAK,GAAG,MAAM;IA2BjF;;OAEG;IACI,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAM7C;;;;;;;;OAQG;IACI,cAAc,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM;IAE9F;;OAEG;IACI,MAAM,IAAI,aAAa,GAAG,SAAS;IAI1C;;OAEG;IACI,UAAU,IAAI,CAAC;IAItB;;OAEG;IACI,wBAAwB,IAAI,sBAAsB;IAIzD;;;OAGG;IACI,cAAc,IAAI,WAAW,GAAG,SAAS;IAIhD;;;OAGG;IACI,YAAY,IAAI,SAAS,GAAG,SAAS;IAI5C;;;;;;;OAOG;IAEU,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC;IAkB1D;;;;;;;OAOG;IAEU,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC;IAQ1D;;OAEG;IACI,kBAAkB,IAAI,cAAc,EAAE;IAI7C;;OAEG;IACI,iBAAiB,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI;IAI9D;;;OAGG;IACI,IAAI,IAAI,IAAI;IAcnB;;;;OAIG;IACI,oBAAoB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAAE,eAAe,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIxG;;OAEG;IACI,mBAAmB,IAAI,MAAM,EAAE;IAItC;;;;;;OAMG;IACI,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAerD;;OAEG;IACI,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,SAAc,GAAG,IAAI;IAsB1D;;OAEG;IACI,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI;IA8B9D;;OAEG;IACI,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,GAAE,MAAU,GAAG,IAAI;IAenG;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAExE;;;;OAIG;IACI,EAAE,CACP,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,CACR,YAAY,EAAE;QACZ,cAAc,EAAE,cAAc,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,eAAe,CAAC;KACjC,EACD,gBAAgB,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,KACpC,IAAI,GACR,IAAI;IAEP;;;;;OAKG;IACI,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAEtE;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAErG;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAE5G;;OAEG;IACI,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAElG;;OAEG;IACI,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAEzG;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,0BAA0B,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAEvF;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAErF;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;IAEnF;;;;;OAKG;IACI,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAE9G;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;IAE1G;;;;;OAKG;IACI,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAE9G;;;;;OAKG;IACI,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAE/G;;;OAGG;IACI,EAAE,CACP,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,4BAA4B,KAAK,IAAI,GAC3E,MAAM,IAAI;IAEb;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAErH;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,sBAAsB,EAAE,QAAQ,CAAC,EAAE,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAE1G;;;;;OAKG;IACI,EAAE,CACP,IAAI,EAAE,oBAAoB,EAC1B,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GACjF,MAAM,IAAI;IAEb;;OAEG;IACI,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAEvE;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI;IAEvF;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAEnF;;;OAGG;IACI,EAAE,CACP,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,CACR,OAAO,EAAE,gBAAgB,EACzB,YAAY,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,KAC9E,IAAI,GACR,MAAM,IAAI;IAEb;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAEpE;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI;IAErF;;;OAGG;IACI,EAAE,CACP,IAAI,EAAE,2BAA2B,EACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAC1F,MAAM,IAAI;IAEb;;;OAGG;IACI,EAAE,CACP,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAC1F,MAAM,IAAI;IAEb;;;OAGG;IACI,EAAE,CACP,IAAI,EAAE,2BAA2B,EACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,KAAK,IAAI,GAC5E,MAAM,IAAI;IAEb;;;OAGG;IACI,EAAE,CACP,IAAI,EAAE,iCAAiC,EACvC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,KAAK,IAAI,GACxF,MAAM,IAAI;IAEb;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAE1D;;;OAGG;IACI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAE1D;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAE7E;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAE5E;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAE9D;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAErF;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAEjE;;;;OAIG;IACI,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAEhF;;;;;OAKG;IACI,EAAE,CACP,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,KAAK,IAAI,GAC3F,MAAM,IAAI;IAEb;;;;;;OAMG;IACI,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAEpE;;;;;;OAMG;IACI,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IA0BnE,0CAA0C;IACnC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAEhD,iEAAiE;IAC1D,IAAI,CACT,IAAI,EAAE,gBAAgB,EACtB,YAAY,EAAE;QACZ,cAAc,EAAE,cAAc,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,eAAe,CAAC;KACjC,EACD,gBAAgB,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,GACtC,IAAI;IAEP,wCAAwC;IACjC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAE9C;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI;IAEtE;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI;IAEpF;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,IAAI;IAE1E;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,IAAI;IAEjF;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAE/D;;;OAGG;IACI,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAE7D;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAE3D;;;;OAIG;IACI,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI;IAE1E;;;OAGG;IACI,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,GAAG,IAAI;IAElF;;;OAGG;IACI,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI;IAE1E;;;OAGG;IACI,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI;IAE3E;;;OAGG;IACI,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,4BAA4B,GAAG,IAAI;IAEnG;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,qBAAqB,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI;IAE7F;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,sBAAsB,EAAE,QAAQ,CAAC,EAAE,IAAI,GAAG,IAAI;IAElF;;;;OAIG;IACI,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAE7G;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAE7C;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAE/D;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAE3D;;OAEG;IACI,IAAI,CACT,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,gBAAgB,EACzB,YAAY,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAChF,IAAI;IAEP;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAE1C;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAE7D;;OAEG;IACI,IAAI,CACT,IAAI,EAAE,2BAA2B,EACjC,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3C,IAAI;IAEP;;OAEG;IACI,IAAI,CACT,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3C,IAAI;IAEP;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,IAAI;IAE/G;;OAEG;IACI,IAAI,CACT,IAAI,EAAE,iCAAiC,EACvC,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,GAC5C,IAAI;IAEP;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAEhC;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAEhC;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;IAErD;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;IAEpD;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAEpC;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAE7D;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAEvC;;;;OAIG;IACI,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAExD;;;OAGG;IACI,IAAI,CACT,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EACjB,iBAAiB,EAAE,gBAAgB,GAClC,IAAI;IAEP;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAE1C;;OAEG;IACI,IAAI,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAYzC;;OAEG;IAEU,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC,4BAA4B,CAAC;IAgBxF;;;;;;OAMG;IAEI,eAAe,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlD;;;;;;;;OAQG;IACI,OAAO,IAAI,IAAI;IAMtB,0CAA0C;IAC1C,SAAS,CAAC,kBAAkB,IAAI,IAAI;IAMpC,2DAA2D;IAC3D,SAAS,CAAC,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAkCvE;;;;;;;;;OASG;cACa,uBAAuB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe3E,yEAAyE;IACzE,SAAS,CAAC,UAAU,IAAI,OAAO;IAI/B;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,aAAa,CACrB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,SAAS,EACf,YAAY,EAAE,KAAK,EACnB,cAAc,EAAE,KAAK,GACpB,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;IAoC5B;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CACrB,KAAK,EAAE,KAAK,EACZ,IAAI,GAAE,SAAc,EACpB,YAAY,QAAoB,EAChC,cAAc,QAAsB,GACnC,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;IAwBlC;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,aAAa,CACrB,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,SAAS,EACf,YAAY,EAAE,KAAK,EACnB,cAAc,EAAE,KAAK,GACpB,WAAW,CAAC,KAAK,CAAC;IAsGrB;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,GAAG,IAAI;IAoB3F;;OAEG;IACH,SAAS,CAAC,cAAc,IAAI,OAAO,EAAE;IAarC;;OAEG;IACH,SAAS,CAAC,cAAc,IAAI,IAAI;IAyBhC;;OAEG;aACa,kBAAkB,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IAE9F;;OAEG;aACa,gBAAgB,CAC9B,QAAQ,EAAE,mBAAmB,EAC7B,MAAM,CAAC,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,SAAS,GAChB,WAAW,CAAC,KAAK,CAAC;CACtB"} | ||
| {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"} |
| export { registerSpanErrorInstrumentation } from './errors'; | ||
| export { setCapturedScopesOnSpan, getCapturedScopesOnSpan } from './utils'; | ||
| export { setCapturedScopesOnSpan, getCapturedScopesOnSpan, markSpanForOtelSourceInference, spanShouldInferOtelSource, } from './utils'; | ||
| export { startIdleSpan, TRACING_DEFAULTS } from './idleSpan'; | ||
@@ -9,2 +9,3 @@ export { SentrySpan } from './sentrySpan'; | ||
| export { startSpan, startInactiveSpan, startSpanManual, continueTrace, withActiveSpan, suppressTracing, startNewTrace, SUPPRESS_TRACING_KEY, } from './trace'; | ||
| export { bindScopeToEmitter } from './bindScopeToEmitter'; | ||
| export { getDynamicSamplingContextFromClient, getDynamicSamplingContextFromSpan, getDynamicSamplingContextFromScope, spanToBaggageHeader, } from './dynamicSamplingContext'; | ||
@@ -11,0 +12,0 @@ export { setMeasurement, timedEventsToMeasurements } from './measurement'; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tracing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,mCAAmC,EACnC,iCAAiC,EACjC,kCAAkC,EAClC,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tracing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,mCAAmC,EACnC,iCAAiC,EACjC,kCAAkC,EAClC,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"} |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sentrySpan.d.ts","sourceRoot":"","sources":["../../../src/tracing/sentrySpan.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EACV,mBAAmB,EACnB,IAAI,EACJ,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,QAAQ,EAER,aAAa,EACb,gBAAgB,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAyBtD;;GAEG;AACH,qBAAa,UAAW,YAAW,IAAI;IACrC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC;IACtC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC9B,wDAAwD;IACxD,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,sDAAsD;IACtD,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,oCAAoC;IACpC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAC/B,2CAA2C;IAC3C,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;IAEhC,2EAA2E;IAC3E,OAAO,CAAC,iBAAiB,CAAC,CAAU;IAEpC;;;;;;OAMG;gBACgB,WAAW,GAAE,mBAAwB;IAoCxD,kBAAkB;IACX,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IASpC,kBAAkB;IACX,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IASxC;;;;;;OAMG;IACI,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAI7E,kBAAkB;IACX,WAAW,IAAI,eAAe;IASrC,kBAAkB;IACX,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI;IAW7E,kBAAkB;IACX,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI;IAKtD;;;;;;;OAOG;IACI,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAItD;;OAEG;IACI,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAKzC;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMrC,kBAAkB;IACX,GAAG,CAAC,YAAY,CAAC,EAAE,aAAa,GAAG,IAAI;IAY9C;;;;;;;OAOG;IACI,WAAW,IAAI,QAAQ;IAqB9B;;;;;;;OAOG;IACI,mBAAmB,IAAI,gBAAgB;IAgB9C,kBAAkB;IACX,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACI,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,qBAAqB,CAAC,EAAE,cAAc,GAAG,aAAa,EACtD,SAAS,CAAC,EAAE,aAAa,GACxB,IAAI;IAiBP;;;;;;;OAOG;IACI,gBAAgB,IAAI,OAAO;IAIlC,6CAA6C;IAC7C,OAAO,CAAC,YAAY;IAgDpB;;OAEG;IACH,OAAO,CAAC,yBAAyB;CAgFlC"} | ||
| {"version":3,"file":"sentrySpan.d.ts","sourceRoot":"","sources":["../../../src/tracing/sentrySpan.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EACV,mBAAmB,EACnB,IAAI,EACJ,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,QAAQ,EAER,aAAa,EACb,gBAAgB,EACjB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAyBtD;;GAEG;AACH,qBAAa,UAAW,YAAW,IAAI;IACrC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC;IACtC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC9B,wDAAwD;IACxD,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,sDAAsD;IACtD,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,oCAAoC;IACpC,SAAS,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAC/B,2CAA2C;IAC3C,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;IAEhC,2EAA2E;IAC3E,OAAO,CAAC,iBAAiB,CAAC,CAAU;IAEpC;;;;;;OAMG;gBACgB,WAAW,GAAE,mBAAwB;IAoCxD,kBAAkB;IACX,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IASpC,kBAAkB;IACX,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IASxC;;;;;;OAMG;IACI,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAI7E,kBAAkB;IACX,WAAW,IAAI,eAAe;IASrC,kBAAkB;IACX,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI;IAW7E,kBAAkB;IACX,aAAa,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI;IAKtD;;;;;;;OAOG;IACI,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAItD;;OAEG;IACI,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAKzC;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAarC,kBAAkB;IACX,GAAG,CAAC,YAAY,CAAC,EAAE,aAAa,GAAG,IAAI;IAY9C;;;;;;;OAOG;IACI,WAAW,IAAI,QAAQ;IAqB9B;;;;;;;OAOG;IACI,mBAAmB,IAAI,gBAAgB;IAgB9C,kBAAkB;IACX,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACI,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,qBAAqB,CAAC,EAAE,cAAc,GAAG,aAAa,EACtD,SAAS,CAAC,EAAE,aAAa,GACxB,IAAI;IAiBP;;;;;;;OAOG;IACI,gBAAgB,IAAI,OAAO;IAIlC,6CAA6C;IAC7C,OAAO,CAAC,YAAY;IAgDpB;;OAEG;IACH,OAAO,CAAC,yBAAyB;CAgFlC"} |
@@ -26,12 +26,2 @@ import type { RawAttributes } from '../../attributes'; | ||
| export declare function applyBeforeSendSpanCallback(span: StreamedSpanJSON, beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON): StreamedSpanJSON; | ||
| /** | ||
| * Infer and backfill span data from OTel semantic conventions. | ||
| * This mirrors what the `SentrySpanExporter` does for non-streamed spans via `getSpanData`/`inferSpanData`. | ||
| * Streamed spans skip the exporter, so we do the inference here during capture. | ||
| * | ||
| * Backfills: `sentry.op`, `sentry.source`, and `name` (description). | ||
| * Uses `safeSetSpanJSONAttributes` so explicitly set attributes are never overwritten. | ||
| */ | ||
| /** Exported only for tests. */ | ||
| export declare function inferSpanDataFromOtelAttributes(spanJSON: StreamedSpanJSON, spanKind?: number): void; | ||
| //# sourceMappingURL=captureSpan.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"captureSpan.d.ts","sourceRoot":"","sources":["../../../../src/tracing/spans/captureSpan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAkB3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAcvF,MAAM,MAAM,qCAAqC,GAAG,sBAAsB,GAAG;IAC3E,YAAY,EAAE,IAAI,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,qCAAqC,CAsD7F;AAOD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACpD,IAAI,CAQN;AAoCD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,gBAAgB,EACtB,cAAc,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,gBAAgB,GAC3D,gBAAgB,CAOlB;AAMD;;;;;;;GAOG;AACH,+BAA+B;AAC/B,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAmCnG"} | ||
| {"version":3,"file":"captureSpan.d.ts","sourceRoot":"","sources":["../../../../src/tracing/spans/captureSpan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAgB3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAavF,MAAM,MAAM,qCAAqC,GAAG,sBAAsB,GAAG;IAC3E,YAAY,EAAE,IAAI,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,qCAAqC,CAsD7F;AAOD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACpD,IAAI,CAQN;AAoCD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,gBAAgB,EACtB,cAAc,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,gBAAgB,GAC3D,gBAAgB,CAOlB"} |
@@ -13,2 +13,10 @@ import type { Scope } from '../scope'; | ||
| }; | ||
| /** | ||
| * Mark a span as eligible for OTel-style `sentry.source` inference at span end. | ||
| * Set by `SentryTraceProvider` on the spans it creates; read by `SentrySpan.updateName()` and | ||
| * `applyOtelSpanData()`. | ||
| */ | ||
| export declare function markSpanForOtelSourceInference(span: Span): void; | ||
| /** Whether a span is marked for OTel-style `sentry.source` inference (see {@link markSpanForOtelSourceInference}). */ | ||
| export declare function spanShouldInferOtelSource(span: Span): boolean; | ||
| //# sourceMappingURL=utils.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tracing/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAY1C,+FAA+F;AAC/F,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,GAAG,IAAI,CAOzG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,cAAc,CAAC,EAAE,KAAK,CAAA;CAAE,CAO7F"} | ||
| {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tracing/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAsB1C,+FAA+F;AAC/F,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,GAAG,IAAI,CAOzG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,cAAc,CAAC,EAAE,KAAK,CAAA;CAAE,CAO7F;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAE/D;AAED,sHAAsH;AACtH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE7D"} |
+1
-1
| { | ||
| "name": "@sentry/core", | ||
| "version": "10.59.0", | ||
| "version": "10.60.0", | ||
| "description": "Base implementation for all Sentry JavaScript SDKs", | ||
@@ -5,0 +5,0 @@ "repository": "git://github.com/getsentry/sentry-javascript.git", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
6569896
0.3%1804
0.39%67171
0.19%