@sentry/effect 11.3.0 → 11.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,11 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
 
3
+ const attributes = require('@sentry/conventions/attributes');
3
4
  const core = require('@sentry/core');
4
5
  const Logger = require('effect/Logger');
5
6
 
6
7
  const LOG_ATTRIBUTES = {
7
- [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.log.effect"
8
+ [attributes.SENTRY_ORIGIN]: "auto.log.effect"
8
9
  };
9
10
  function getLogLevelTag(logLevel) {
10
11
  if (typeof logLevel === "string") {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sources":["../../src/logger.ts"],"sourcesContent":["import { isObjectLike, logger as sentryLogger, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport * as Logger from 'effect/Logger';\nimport type * as LogLevel from 'effect/LogLevel';\n\nconst LOG_ATTRIBUTES = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.log.effect',\n};\n\nfunction getLogLevelTag(logLevel: LogLevel.LogLevel): LogLevel.LogLevel | 'Warning' {\n // Effect v4: logLevel is a string literal directly\n if (typeof logLevel === 'string') {\n return logLevel;\n }\n\n // Effect v3: logLevel has _tag property\n if (isObjectLike(logLevel) && '_tag' in logLevel) {\n return (logLevel as { _tag: LogLevel.LogLevel })._tag;\n }\n\n return 'Info';\n}\n\n/**\n * Effect Logger that sends logs to Sentry.\n */\nexport const SentryEffectLogger = Logger.make(({ logLevel, message }) => {\n let msg: string;\n if (typeof message === 'string') {\n msg = message;\n } else if (Array.isArray(message) && message.length === 1) {\n const firstElement = message[0];\n msg = typeof firstElement === 'string' ? firstElement : JSON.stringify(firstElement);\n } else {\n msg = JSON.stringify(message);\n }\n\n const tag = getLogLevelTag(logLevel);\n\n switch (tag) {\n case 'Fatal':\n sentryLogger.fatal(msg, LOG_ATTRIBUTES);\n break;\n case 'Error':\n sentryLogger.error(msg, LOG_ATTRIBUTES);\n break;\n case 'Warning': // Effect v3\n case 'Warn': // Effect v4\n sentryLogger.warn(msg, LOG_ATTRIBUTES);\n break;\n case 'Info':\n sentryLogger.info(msg, LOG_ATTRIBUTES);\n break;\n case 'Debug':\n sentryLogger.debug(msg, LOG_ATTRIBUTES);\n break;\n case 'Trace':\n sentryLogger.trace(msg, LOG_ATTRIBUTES);\n break;\n case 'All':\n case 'None':\n break;\n default:\n tag satisfies never;\n }\n});\n"],"names":["SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","isObjectLike","sentryLogger"],"mappings":";;;;;AAIA,MAAM,cAAA,GAAiB;AAAA,EACrB,CAACA,qCAAgC,GAAG;AACtC,CAAA;AAEA,SAAS,eAAe,QAAA,EAA4D;AAElF,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAIC,iBAAA,CAAa,QAAQ,CAAA,IAAK,MAAA,IAAU,QAAA,EAAU;AAChD,IAAA,OAAQ,QAAA,CAAyC,IAAA;AAAA,EACnD;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,MAAM,qBAAqB,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,QAAA,EAAU,SAAQ,KAAM;AACvE,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,GAAA,GAAM,OAAA;AAAA,EACR,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzD,IAAA,MAAM,YAAA,GAAe,QAAQ,CAAC,CAAA;AAC9B,IAAA,GAAA,GAAM,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,EACrF,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,GAAA,GAAM,eAAe,QAAQ,CAAA;AAEnC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAAC,WAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,WAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,SAAA;AAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAAA,WAAA,CAAa,IAAA,CAAK,KAAK,cAAc,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAAA,WAAA,CAAa,IAAA,CAAK,KAAK,cAAc,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,WAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,WAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAKA;AAEN,CAAC;;;;"}
1
+ {"version":3,"file":"logger.js","sources":["../../src/logger.ts"],"sourcesContent":["import { SENTRY_ORIGIN } from '@sentry/conventions/attributes';\nimport { isObjectLike, logger as sentryLogger } from '@sentry/core';\nimport * as Logger from 'effect/Logger';\nimport type * as LogLevel from 'effect/LogLevel';\n\nconst LOG_ATTRIBUTES = {\n [SENTRY_ORIGIN]: 'auto.log.effect',\n};\n\nfunction getLogLevelTag(logLevel: LogLevel.LogLevel): LogLevel.LogLevel | 'Warning' {\n // Effect v4: logLevel is a string literal directly\n if (typeof logLevel === 'string') {\n return logLevel;\n }\n\n // Effect v3: logLevel has _tag property\n if (isObjectLike(logLevel) && '_tag' in logLevel) {\n return (logLevel as { _tag: LogLevel.LogLevel })._tag;\n }\n\n return 'Info';\n}\n\n/**\n * Effect Logger that sends logs to Sentry.\n */\nexport const SentryEffectLogger = Logger.make(({ logLevel, message }) => {\n let msg: string;\n if (typeof message === 'string') {\n msg = message;\n } else if (Array.isArray(message) && message.length === 1) {\n const firstElement = message[0];\n msg = typeof firstElement === 'string' ? firstElement : JSON.stringify(firstElement);\n } else {\n msg = JSON.stringify(message);\n }\n\n const tag = getLogLevelTag(logLevel);\n\n switch (tag) {\n case 'Fatal':\n sentryLogger.fatal(msg, LOG_ATTRIBUTES);\n break;\n case 'Error':\n sentryLogger.error(msg, LOG_ATTRIBUTES);\n break;\n case 'Warning': // Effect v3\n case 'Warn': // Effect v4\n sentryLogger.warn(msg, LOG_ATTRIBUTES);\n break;\n case 'Info':\n sentryLogger.info(msg, LOG_ATTRIBUTES);\n break;\n case 'Debug':\n sentryLogger.debug(msg, LOG_ATTRIBUTES);\n break;\n case 'Trace':\n sentryLogger.trace(msg, LOG_ATTRIBUTES);\n break;\n case 'All':\n case 'None':\n break;\n default:\n tag satisfies never;\n }\n});\n"],"names":["SENTRY_ORIGIN","isObjectLike","sentryLogger"],"mappings":";;;;;;AAKA,MAAM,cAAA,GAAiB;AAAA,EACrB,CAACA,wBAAa,GAAG;AACnB,CAAA;AAEA,SAAS,eAAe,QAAA,EAA4D;AAElF,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAIC,iBAAA,CAAa,QAAQ,CAAA,IAAK,MAAA,IAAU,QAAA,EAAU;AAChD,IAAA,OAAQ,QAAA,CAAyC,IAAA;AAAA,EACnD;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,MAAM,qBAAqB,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,QAAA,EAAU,SAAQ,KAAM;AACvE,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,GAAA,GAAM,OAAA;AAAA,EACR,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzD,IAAA,MAAM,YAAA,GAAe,QAAQ,CAAC,CAAA;AAC9B,IAAA,GAAA,GAAM,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,EACrF,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,GAAA,GAAM,eAAe,QAAQ,CAAA;AAEnC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAAC,WAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,WAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,SAAA;AAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAAA,WAAA,CAAa,IAAA,CAAK,KAAK,cAAc,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAAA,WAAA,CAAa,IAAA,CAAK,KAAK,cAAc,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,WAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,WAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAKA;AAEN,CAAC;;;;"}
@@ -206,7 +206,7 @@ function createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent,
206
206
  // Setting these to `undefined` would strip the core defaults instead of leaving them in place.
207
207
  attributes: {
208
208
  ...op && { [attributes.SENTRY_OP]: op },
209
- ...origin && { [core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: origin }
209
+ ...origin && { [attributes.SENTRY_ORIGIN]: origin }
210
210
  }
211
211
  },
212
212
  parent,
@@ -1 +1 @@
1
- {"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport {\n _INTERNAL_safeMathRandom,\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n getDefaultCurrentScope,\n isObjectLike,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n startNewTrace,\n withActiveSpan,\n withScope,\n} from '@sentry/core';\nimport * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport type * as EffectLayer from 'effect/Layer';\nimport { succeed as succeedLayer } from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string | undefined {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return undefined;\n}\n\nconst EFFECT_SPAN_SYMBOL = Symbol.for('@sentry/effect.EffectSpan');\n\nfunction markEffectSpan(span: Span): void {\n addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);\n}\n\n/**\n * Whether this tracer created the span. A brand rather than an attribute check, because an unsampled\n * span keeps no attributes.\n */\nfunction isEffectSpan(span: Span): boolean {\n return (span as { [EFFECT_SPAN_SYMBOL]?: boolean })[EFFECT_SPAN_SYMBOL] === true;\n}\n\n/**\n * Effect span names are chosen by whoever calls `Effect.withSpan`, so the name is the only signal\n * available. `@effect/platform` names its HTTP spans `http.server`/`http.client`, which map onto the\n * matching Sentry ops. Every other name comes from user code or a third-party library, whose semantics\n * we cannot infer, so op and origin stay unset and the span keeps the core defaults: no op, and a\n * `manual` origin.\n */\nfunction deriveOp(name: string): string | undefined {\n if (name.startsWith('http.server')) {\n return HTTP_SERVER;\n }\n\n if (name.startsWith('http.client')) {\n return HTTP_CLIENT;\n }\n\n return undefined;\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (isObjectLike(cause) && 'reasons' in cause && Array.isArray((cause as { reasons: unknown }).reasons)) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (isObjectLike(cause) && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\n/**\n * The client and the server entry hand different `startInactiveSpan` functions to\n * {@link makeSentryTracer}: the browser one from `@sentry/core/browser`, which installs the span\n * streaming integration on first use, and the plain one from `@sentry/core`, which does not.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (isObjectLike(cause) && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst EXTERNAL_SPAN_KEY = '@sentry/effect/ExternalSpan';\n\ninterface ContextExports {\n Reference: typeof Context.Reference;\n /** Only Effect v3 exports it. */\n GenericTag<Identifier, Service>(key: string): Context.Key<Identifier, Service>;\n}\n\n// Effect v4 has no `Context.GenericTag` and Effect v3 before 3.11 has no `Context.Reference`. Both are read\n// through a separate binding because bundlers fail the build on a namespace member the installed version lacks.\nconst contextExports = Context as unknown as ContextExports;\n\n/**\n * Whether the tracer continues the trace of a `Tracer.externalSpan` parent. Effect v4 has no `FiberRef`\n * and v3 before 3.11 has no `Context.Reference`, so the flag is a plain service in both. The cast is safe:\n * the tracer reads it with `getRef` only on a v4 fiber, where it is a reference, and with\n * `Context.getOption` on v3.\n */\nconst ExternalSpanFlag = (\n isEffectV4\n ? contextExports.Reference<boolean>(EXTERNAL_SPAN_KEY, { defaultValue: () => false })\n : contextExports.GenericTag<never, boolean>(EXTERNAL_SPAN_KEY)\n) as Context.Reference<boolean>;\n\n/**\n * Makes the tracer continue the trace of a `Tracer.externalSpan` parent instead of ignoring it. Provide it\n * next to the tracer layer to continue every external span in the runtime, or provide it to a single\n * effect with `Effect.provide` to continue only that one.\n */\nexport const SentryEffectExternalSpanLayer: EffectLayer.Layer<never> = succeedLayer(ExternalSpanFlag, true);\n\ninterface FiberLike {\n /** The span the fiber runs in. Only Effect v3 fibers have it. */\n readonly currentSpan?: EffectTracer.AnySpan | undefined;\n /** Holds `span`, the span the fiber runs in. Only Effect v4 fibers have it. */\n readonly cache?: { readonly span?: EffectTracer.AnySpan | undefined };\n /** Reads a reference with its default. Only Effect v4 fibers have it. */\n readonly getRef?: <A>(ref: Context.Reference<A>) => A;\n /** The services of the fiber. Only Effect v3 fibers have it. */\n readonly currentContext?: Context.Context<never>;\n}\n\n/**\n * The fiber whose operation is being evaluated. Effect hands the fiber to the `context` hook but not to\n * `span`, which runs synchronously inside it, so the hook keeps the fiber here for that extent.\n */\nlet currentFiber: FiberLike | undefined;\n\nfunction continuesExternalSpans(fiber: FiberLike): boolean {\n if (fiber.getRef) {\n return fiber.getRef(ExternalSpanFlag);\n }\n\n return (\n fiber.currentContext !== undefined &&\n Option.getOrElse(Context.getOption(fiber.currentContext, ExternalSpanFlag), () => false)\n );\n}\n\nfunction getFiberSpan(fiber: FiberLike): EffectTracer.AnySpan | undefined {\n return isEffectV4 ? fiber.cache?.span : fiber.currentSpan;\n}\n\nfunction withFiberContext<X>(fiber: FiberLike, execution: () => X): X {\n const previousFiber = currentFiber;\n currentFiber = fiber;\n try {\n const currentSpan = getFiberSpan(fiber);\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n } finally {\n currentFiber = previousFiber;\n }\n}\n\n/**\n * Starts the Sentry span for an Effect span, rooted or parented the way Effect asked for.\n *\n * - A parent this tracer created becomes the Sentry parent.\n * - Any other parent (`Tracer.externalSpan` bridging a trace this SDK did not start, such as an\n * OpenTelemetry span of another app in the same process or persisted trace state) is ignored unless\n * {@link SentryEffectExternalSpanLayer} is provided, so a span joins a foreign trace only when the user\n * asked for it. The span then nests where Effect would have put it without the `parent` option: under\n * the fiber's current span, or parentless. With the layer, the span continues that trace: it is a root\n * span whose `parent_span_id` is the external span. No dynamic sampling context is frozen, so the SDK\n * builds one from the client the way it does for a head-of-trace span.\n * - Without a parent, the span nests under a foreign active Sentry span (an `http.server` span from the\n * Node SDK, a pageload in the browser) but never under a span this tracer created: Effect's own parent\n * tracking is authoritative for those, so an active one is an enclosing `root: true` span or a span\n * leaked from another fiber through the async context. Effect reports `root: true` for every\n * parentless span, so the flag adds nothing and is not consulted.\n * - A root span starts a new trace when `newTraceForRootSpans` is set, unless the user set up the\n * current scope (`Sentry.continueTrace`, `Sentry.withScope`, an HTTP request's isolation scope).\n */\nfunction startSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n options: StartSpanOptions,\n parent: Option.Option<EffectTracer.AnySpan>,\n newTraceForRootSpans: boolean,\n): Span {\n if (Option.isSome(parent)) {\n const parentSpan = parent.value;\n\n if (isSentrySpan(parentSpan)) {\n return startInactiveSpan({ ...options, parentSpan: parentSpan.sentrySpan });\n }\n\n if (currentFiber !== undefined && continuesExternalSpans(currentFiber)) {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: parentSpan.traceId,\n parentSpanId: parentSpan.spanId,\n sampled: parentSpan.sampled,\n sampleRand: _INTERNAL_safeMathRandom(),\n });\n return withActiveSpan(null, () => startInactiveSpan(options));\n });\n }\n\n const enclosingSpan = currentFiber && getFiberSpan(currentFiber);\n if (enclosingSpan !== undefined && isSentrySpan(enclosingSpan)) {\n return startInactiveSpan({ ...options, parentSpan: enclosingSpan.sentrySpan });\n }\n }\n\n const activeSpan = getActiveSpan();\n if (activeSpan && !isEffectSpan(activeSpan)) {\n return startInactiveSpan({ ...options, parentSpan: activeSpan });\n }\n\n // A scope the user forked (`continueTrace`, `withScope`, an isolation scope) carries its own trace id.\n // The scopes this tracer forks in `context()` clone the propagation context they were forked from, so\n // even when one leaks into another fiber through the async context it still carries the process-wide\n // trace id of the default scope.\n const isProcessTrace =\n getCurrentScope().getPropagationContext().traceId === getDefaultCurrentScope().getPropagationContext().traceId;\n if (newTraceForRootSpans && isProcessTrace) {\n return startNewTrace(() => startInactiveSpan(options));\n }\n\n return withActiveSpan(null, () => startInactiveSpan(options));\n}\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const op = deriveOp(name);\n const origin = deriveOrigin(name);\n\n const newSpan = startSentrySpan(\n startInactiveSpan,\n {\n name,\n startTime: nanosToHrTime(startTime),\n // Setting these to `undefined` would strip the core defaults instead of leaving them in place.\n attributes: {\n ...(op && { [SENTRY_OP]: op }),\n ...(origin && { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: origin }),\n },\n },\n parent,\n newTraceForRootSpans,\n );\n markEffectSpan(newSpan);\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\nconst makeSentryTracerV3 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: FiberLike) {\n return withFiberContext(fiber, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n startInactiveSpan,\n newTraceForRootSpans,\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n return withFiberContext(fiber, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Creates an Effect `Tracer` that records Effect spans as Sentry spans.\n *\n * Use the `SentryEffectTracer` exported from `@sentry/effect` rather than calling this directly — the\n * client and server entries each bind the right `startInactiveSpan` for their platform.\n *\n * `newTraceForRootSpans` is the one behavioural difference between the platforms: Effect gives every\n * parentless span a fresh trace id, and on a long-lived server nothing else forks the propagation\n * context, so the server tracer follows Effect and starts a new trace. In the browser the page trace is\n * the intended home of every span, so the client tracer keeps parentless spans in it.\n */\nexport function makeSentryTracer(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer {\n return isEffectV4\n ? makeSentryTracerV4(startInactiveSpan, newTraceForRootSpans)\n : makeSentryTracerV3(startInactiveSpan, newTraceForRootSpans);\n}\n"],"names":["addNonEnumerableProperty","HTTP_SERVER","HTTP_CLIENT","isObjectLike","succeedLayer","withActiveSpan","withScope","_INTERNAL_safeMathRandom","getActiveSpan","getCurrentScope","getDefaultCurrentScope","startNewTrace","SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN"],"mappings":"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"}
1
+ {"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { SENTRY_OP, SENTRY_ORIGIN } from '@sentry/conventions/attributes';\nimport { HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport {\n _INTERNAL_safeMathRandom,\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n getDefaultCurrentScope,\n isObjectLike,\n startNewTrace,\n withActiveSpan,\n withScope,\n} from '@sentry/core';\nimport * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport type * as EffectLayer from 'effect/Layer';\nimport { succeed as succeedLayer } from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string | undefined {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return undefined;\n}\n\nconst EFFECT_SPAN_SYMBOL = Symbol.for('@sentry/effect.EffectSpan');\n\nfunction markEffectSpan(span: Span): void {\n addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);\n}\n\n/**\n * Whether this tracer created the span. A brand rather than an attribute check, because an unsampled\n * span keeps no attributes.\n */\nfunction isEffectSpan(span: Span): boolean {\n return (span as { [EFFECT_SPAN_SYMBOL]?: boolean })[EFFECT_SPAN_SYMBOL] === true;\n}\n\n/**\n * Effect span names are chosen by whoever calls `Effect.withSpan`, so the name is the only signal\n * available. `@effect/platform` names its HTTP spans `http.server`/`http.client`, which map onto the\n * matching Sentry ops. Every other name comes from user code or a third-party library, whose semantics\n * we cannot infer, so op and origin stay unset and the span keeps the core defaults: no op, and a\n * `manual` origin.\n */\nfunction deriveOp(name: string): string | undefined {\n if (name.startsWith('http.server')) {\n return HTTP_SERVER;\n }\n\n if (name.startsWith('http.client')) {\n return HTTP_CLIENT;\n }\n\n return undefined;\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (isObjectLike(cause) && 'reasons' in cause && Array.isArray((cause as { reasons: unknown }).reasons)) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (isObjectLike(cause) && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\n/**\n * The client and the server entry hand different `startInactiveSpan` functions to\n * {@link makeSentryTracer}: the browser one from `@sentry/core/browser`, which installs the span\n * streaming integration on first use, and the plain one from `@sentry/core`, which does not.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (isObjectLike(cause) && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst EXTERNAL_SPAN_KEY = '@sentry/effect/ExternalSpan';\n\ninterface ContextExports {\n Reference: typeof Context.Reference;\n /** Only Effect v3 exports it. */\n GenericTag<Identifier, Service>(key: string): Context.Key<Identifier, Service>;\n}\n\n// Effect v4 has no `Context.GenericTag` and Effect v3 before 3.11 has no `Context.Reference`. Both are read\n// through a separate binding because bundlers fail the build on a namespace member the installed version lacks.\nconst contextExports = Context as unknown as ContextExports;\n\n/**\n * Whether the tracer continues the trace of a `Tracer.externalSpan` parent. Effect v4 has no `FiberRef`\n * and v3 before 3.11 has no `Context.Reference`, so the flag is a plain service in both. The cast is safe:\n * the tracer reads it with `getRef` only on a v4 fiber, where it is a reference, and with\n * `Context.getOption` on v3.\n */\nconst ExternalSpanFlag = (\n isEffectV4\n ? contextExports.Reference<boolean>(EXTERNAL_SPAN_KEY, { defaultValue: () => false })\n : contextExports.GenericTag<never, boolean>(EXTERNAL_SPAN_KEY)\n) as Context.Reference<boolean>;\n\n/**\n * Makes the tracer continue the trace of a `Tracer.externalSpan` parent instead of ignoring it. Provide it\n * next to the tracer layer to continue every external span in the runtime, or provide it to a single\n * effect with `Effect.provide` to continue only that one.\n */\nexport const SentryEffectExternalSpanLayer: EffectLayer.Layer<never> = succeedLayer(ExternalSpanFlag, true);\n\ninterface FiberLike {\n /** The span the fiber runs in. Only Effect v3 fibers have it. */\n readonly currentSpan?: EffectTracer.AnySpan | undefined;\n /** Holds `span`, the span the fiber runs in. Only Effect v4 fibers have it. */\n readonly cache?: { readonly span?: EffectTracer.AnySpan | undefined };\n /** Reads a reference with its default. Only Effect v4 fibers have it. */\n readonly getRef?: <A>(ref: Context.Reference<A>) => A;\n /** The services of the fiber. Only Effect v3 fibers have it. */\n readonly currentContext?: Context.Context<never>;\n}\n\n/**\n * The fiber whose operation is being evaluated. Effect hands the fiber to the `context` hook but not to\n * `span`, which runs synchronously inside it, so the hook keeps the fiber here for that extent.\n */\nlet currentFiber: FiberLike | undefined;\n\nfunction continuesExternalSpans(fiber: FiberLike): boolean {\n if (fiber.getRef) {\n return fiber.getRef(ExternalSpanFlag);\n }\n\n return (\n fiber.currentContext !== undefined &&\n Option.getOrElse(Context.getOption(fiber.currentContext, ExternalSpanFlag), () => false)\n );\n}\n\nfunction getFiberSpan(fiber: FiberLike): EffectTracer.AnySpan | undefined {\n return isEffectV4 ? fiber.cache?.span : fiber.currentSpan;\n}\n\nfunction withFiberContext<X>(fiber: FiberLike, execution: () => X): X {\n const previousFiber = currentFiber;\n currentFiber = fiber;\n try {\n const currentSpan = getFiberSpan(fiber);\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n } finally {\n currentFiber = previousFiber;\n }\n}\n\n/**\n * Starts the Sentry span for an Effect span, rooted or parented the way Effect asked for.\n *\n * - A parent this tracer created becomes the Sentry parent.\n * - Any other parent (`Tracer.externalSpan` bridging a trace this SDK did not start, such as an\n * OpenTelemetry span of another app in the same process or persisted trace state) is ignored unless\n * {@link SentryEffectExternalSpanLayer} is provided, so a span joins a foreign trace only when the user\n * asked for it. The span then nests where Effect would have put it without the `parent` option: under\n * the fiber's current span, or parentless. With the layer, the span continues that trace: it is a root\n * span whose `parent_span_id` is the external span. No dynamic sampling context is frozen, so the SDK\n * builds one from the client the way it does for a head-of-trace span.\n * - Without a parent, the span nests under a foreign active Sentry span (an `http.server` span from the\n * Node SDK, a pageload in the browser) but never under a span this tracer created: Effect's own parent\n * tracking is authoritative for those, so an active one is an enclosing `root: true` span or a span\n * leaked from another fiber through the async context. Effect reports `root: true` for every\n * parentless span, so the flag adds nothing and is not consulted.\n * - A root span starts a new trace when `newTraceForRootSpans` is set, unless the user set up the\n * current scope (`Sentry.continueTrace`, `Sentry.withScope`, an HTTP request's isolation scope).\n */\nfunction startSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n options: StartSpanOptions,\n parent: Option.Option<EffectTracer.AnySpan>,\n newTraceForRootSpans: boolean,\n): Span {\n if (Option.isSome(parent)) {\n const parentSpan = parent.value;\n\n if (isSentrySpan(parentSpan)) {\n return startInactiveSpan({ ...options, parentSpan: parentSpan.sentrySpan });\n }\n\n if (currentFiber !== undefined && continuesExternalSpans(currentFiber)) {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: parentSpan.traceId,\n parentSpanId: parentSpan.spanId,\n sampled: parentSpan.sampled,\n sampleRand: _INTERNAL_safeMathRandom(),\n });\n return withActiveSpan(null, () => startInactiveSpan(options));\n });\n }\n\n const enclosingSpan = currentFiber && getFiberSpan(currentFiber);\n if (enclosingSpan !== undefined && isSentrySpan(enclosingSpan)) {\n return startInactiveSpan({ ...options, parentSpan: enclosingSpan.sentrySpan });\n }\n }\n\n const activeSpan = getActiveSpan();\n if (activeSpan && !isEffectSpan(activeSpan)) {\n return startInactiveSpan({ ...options, parentSpan: activeSpan });\n }\n\n // A scope the user forked (`continueTrace`, `withScope`, an isolation scope) carries its own trace id.\n // The scopes this tracer forks in `context()` clone the propagation context they were forked from, so\n // even when one leaks into another fiber through the async context it still carries the process-wide\n // trace id of the default scope.\n const isProcessTrace =\n getCurrentScope().getPropagationContext().traceId === getDefaultCurrentScope().getPropagationContext().traceId;\n if (newTraceForRootSpans && isProcessTrace) {\n return startNewTrace(() => startInactiveSpan(options));\n }\n\n return withActiveSpan(null, () => startInactiveSpan(options));\n}\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const op = deriveOp(name);\n const origin = deriveOrigin(name);\n\n const newSpan = startSentrySpan(\n startInactiveSpan,\n {\n name,\n startTime: nanosToHrTime(startTime),\n // Setting these to `undefined` would strip the core defaults instead of leaving them in place.\n attributes: {\n ...(op && { [SENTRY_OP]: op }),\n ...(origin && { [SENTRY_ORIGIN]: origin }),\n },\n },\n parent,\n newTraceForRootSpans,\n );\n markEffectSpan(newSpan);\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\nconst makeSentryTracerV3 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: FiberLike) {\n return withFiberContext(fiber, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n startInactiveSpan,\n newTraceForRootSpans,\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n return withFiberContext(fiber, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Creates an Effect `Tracer` that records Effect spans as Sentry spans.\n *\n * Use the `SentryEffectTracer` exported from `@sentry/effect` rather than calling this directly — the\n * client and server entries each bind the right `startInactiveSpan` for their platform.\n *\n * `newTraceForRootSpans` is the one behavioural difference between the platforms: Effect gives every\n * parentless span a fresh trace id, and on a long-lived server nothing else forks the propagation\n * context, so the server tracer follows Effect and starts a new trace. In the browser the page trace is\n * the intended home of every span, so the client tracer keeps parentless spans in it.\n */\nexport function makeSentryTracer(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer {\n return isEffectV4\n ? makeSentryTracerV4(startInactiveSpan, newTraceForRootSpans)\n : makeSentryTracerV3(startInactiveSpan, newTraceForRootSpans);\n}\n"],"names":["addNonEnumerableProperty","HTTP_SERVER","HTTP_CLIENT","isObjectLike","succeedLayer","withActiveSpan","withScope","_INTERNAL_safeMathRandom","getActiveSpan","getCurrentScope","getDefaultCurrentScope","startNewTrace","SENTRY_OP","SENTRY_ORIGIN"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
- import { logger, isObjectLike, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
1
+ import { SENTRY_ORIGIN } from '@sentry/conventions/attributes';
2
+ import { logger, isObjectLike } from '@sentry/core';
2
3
  import * as Logger from 'effect/Logger';
3
4
 
4
5
  const LOG_ATTRIBUTES = {
5
- [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.log.effect"
6
+ [SENTRY_ORIGIN]: "auto.log.effect"
6
7
  };
7
8
  function getLogLevelTag(logLevel) {
8
9
  if (typeof logLevel === "string") {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sources":["../../src/logger.ts"],"sourcesContent":["import { isObjectLike, logger as sentryLogger, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';\nimport * as Logger from 'effect/Logger';\nimport type * as LogLevel from 'effect/LogLevel';\n\nconst LOG_ATTRIBUTES = {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.log.effect',\n};\n\nfunction getLogLevelTag(logLevel: LogLevel.LogLevel): LogLevel.LogLevel | 'Warning' {\n // Effect v4: logLevel is a string literal directly\n if (typeof logLevel === 'string') {\n return logLevel;\n }\n\n // Effect v3: logLevel has _tag property\n if (isObjectLike(logLevel) && '_tag' in logLevel) {\n return (logLevel as { _tag: LogLevel.LogLevel })._tag;\n }\n\n return 'Info';\n}\n\n/**\n * Effect Logger that sends logs to Sentry.\n */\nexport const SentryEffectLogger = Logger.make(({ logLevel, message }) => {\n let msg: string;\n if (typeof message === 'string') {\n msg = message;\n } else if (Array.isArray(message) && message.length === 1) {\n const firstElement = message[0];\n msg = typeof firstElement === 'string' ? firstElement : JSON.stringify(firstElement);\n } else {\n msg = JSON.stringify(message);\n }\n\n const tag = getLogLevelTag(logLevel);\n\n switch (tag) {\n case 'Fatal':\n sentryLogger.fatal(msg, LOG_ATTRIBUTES);\n break;\n case 'Error':\n sentryLogger.error(msg, LOG_ATTRIBUTES);\n break;\n case 'Warning': // Effect v3\n case 'Warn': // Effect v4\n sentryLogger.warn(msg, LOG_ATTRIBUTES);\n break;\n case 'Info':\n sentryLogger.info(msg, LOG_ATTRIBUTES);\n break;\n case 'Debug':\n sentryLogger.debug(msg, LOG_ATTRIBUTES);\n break;\n case 'Trace':\n sentryLogger.trace(msg, LOG_ATTRIBUTES);\n break;\n case 'All':\n case 'None':\n break;\n default:\n tag satisfies never;\n }\n});\n"],"names":["sentryLogger"],"mappings":";;;AAIA,MAAM,cAAA,GAAiB;AAAA,EACrB,CAAC,gCAAgC,GAAG;AACtC,CAAA;AAEA,SAAS,eAAe,QAAA,EAA4D;AAElF,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA,CAAa,QAAQ,CAAA,IAAK,MAAA,IAAU,QAAA,EAAU;AAChD,IAAA,OAAQ,QAAA,CAAyC,IAAA;AAAA,EACnD;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,MAAM,qBAAqB,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,QAAA,EAAU,SAAQ,KAAM;AACvE,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,GAAA,GAAM,OAAA;AAAA,EACR,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzD,IAAA,MAAM,YAAA,GAAe,QAAQ,CAAC,CAAA;AAC9B,IAAA,GAAA,GAAM,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,EACrF,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,GAAA,GAAM,eAAe,QAAQ,CAAA;AAEnC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,SAAA;AAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAAA,MAAA,CAAa,IAAA,CAAK,KAAK,cAAc,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAAA,MAAA,CAAa,IAAA,CAAK,KAAK,cAAc,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAKA;AAEN,CAAC;;;;"}
1
+ {"version":3,"file":"logger.js","sources":["../../src/logger.ts"],"sourcesContent":["import { SENTRY_ORIGIN } from '@sentry/conventions/attributes';\nimport { isObjectLike, logger as sentryLogger } from '@sentry/core';\nimport * as Logger from 'effect/Logger';\nimport type * as LogLevel from 'effect/LogLevel';\n\nconst LOG_ATTRIBUTES = {\n [SENTRY_ORIGIN]: 'auto.log.effect',\n};\n\nfunction getLogLevelTag(logLevel: LogLevel.LogLevel): LogLevel.LogLevel | 'Warning' {\n // Effect v4: logLevel is a string literal directly\n if (typeof logLevel === 'string') {\n return logLevel;\n }\n\n // Effect v3: logLevel has _tag property\n if (isObjectLike(logLevel) && '_tag' in logLevel) {\n return (logLevel as { _tag: LogLevel.LogLevel })._tag;\n }\n\n return 'Info';\n}\n\n/**\n * Effect Logger that sends logs to Sentry.\n */\nexport const SentryEffectLogger = Logger.make(({ logLevel, message }) => {\n let msg: string;\n if (typeof message === 'string') {\n msg = message;\n } else if (Array.isArray(message) && message.length === 1) {\n const firstElement = message[0];\n msg = typeof firstElement === 'string' ? firstElement : JSON.stringify(firstElement);\n } else {\n msg = JSON.stringify(message);\n }\n\n const tag = getLogLevelTag(logLevel);\n\n switch (tag) {\n case 'Fatal':\n sentryLogger.fatal(msg, LOG_ATTRIBUTES);\n break;\n case 'Error':\n sentryLogger.error(msg, LOG_ATTRIBUTES);\n break;\n case 'Warning': // Effect v3\n case 'Warn': // Effect v4\n sentryLogger.warn(msg, LOG_ATTRIBUTES);\n break;\n case 'Info':\n sentryLogger.info(msg, LOG_ATTRIBUTES);\n break;\n case 'Debug':\n sentryLogger.debug(msg, LOG_ATTRIBUTES);\n break;\n case 'Trace':\n sentryLogger.trace(msg, LOG_ATTRIBUTES);\n break;\n case 'All':\n case 'None':\n break;\n default:\n tag satisfies never;\n }\n});\n"],"names":["sentryLogger"],"mappings":";;;;AAKA,MAAM,cAAA,GAAiB;AAAA,EACrB,CAAC,aAAa,GAAG;AACnB,CAAA;AAEA,SAAS,eAAe,QAAA,EAA4D;AAElF,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA,CAAa,QAAQ,CAAA,IAAK,MAAA,IAAU,QAAA,EAAU;AAChD,IAAA,OAAQ,QAAA,CAAyC,IAAA;AAAA,EACnD;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,MAAM,qBAAqB,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,QAAA,EAAU,SAAQ,KAAM;AACvE,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,GAAA,GAAM,OAAA;AAAA,EACR,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzD,IAAA,MAAM,YAAA,GAAe,QAAQ,CAAC,CAAA;AAC9B,IAAA,GAAA,GAAM,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,EACrF,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,GAAA,GAAM,eAAe,QAAQ,CAAA;AAEnC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,SAAA;AAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAAA,MAAA,CAAa,IAAA,CAAK,KAAK,cAAc,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAAA,MAAA,CAAa,IAAA,CAAK,KAAK,cAAc,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,KAAA,CAAM,KAAK,cAAc,CAAA;AACtC,MAAA;AAKA;AAEN,CAAC;;;;"}
@@ -1 +1 @@
1
- {"type":"module","version":"11.3.0","sideEffects":false}
1
+ {"type":"module","version":"11.5.0","sideEffects":false}
@@ -1,6 +1,6 @@
1
- import { SENTRY_OP } from '@sentry/conventions/attributes';
1
+ import { SENTRY_ORIGIN, SENTRY_OP } from '@sentry/conventions/attributes';
2
2
  import { HTTP_SERVER, HTTP_CLIENT } from '@sentry/conventions/op';
3
- import { isObjectLike, withActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, withScope, _INTERNAL_safeMathRandom, getActiveSpan, getCurrentScope, getDefaultCurrentScope, addNonEnumerableProperty, startNewTrace } from '@sentry/core';
3
+ import { isObjectLike, withActiveSpan, withScope, _INTERNAL_safeMathRandom, getActiveSpan, getCurrentScope, getDefaultCurrentScope, addNonEnumerableProperty, startNewTrace } from '@sentry/core';
4
4
  import * as Context from 'effect/Context';
5
5
  import * as Exit from 'effect/Exit';
6
6
  import { succeed } from 'effect/Layer';
@@ -204,7 +204,7 @@ function createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent,
204
204
  // Setting these to `undefined` would strip the core defaults instead of leaving them in place.
205
205
  attributes: {
206
206
  ...op && { [SENTRY_OP]: op },
207
- ...origin && { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: origin }
207
+ ...origin && { [SENTRY_ORIGIN]: origin }
208
208
  }
209
209
  },
210
210
  parent,
@@ -1 +1 @@
1
- {"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport {\n _INTERNAL_safeMathRandom,\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n getDefaultCurrentScope,\n isObjectLike,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n startNewTrace,\n withActiveSpan,\n withScope,\n} from '@sentry/core';\nimport * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport type * as EffectLayer from 'effect/Layer';\nimport { succeed as succeedLayer } from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string | undefined {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return undefined;\n}\n\nconst EFFECT_SPAN_SYMBOL = Symbol.for('@sentry/effect.EffectSpan');\n\nfunction markEffectSpan(span: Span): void {\n addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);\n}\n\n/**\n * Whether this tracer created the span. A brand rather than an attribute check, because an unsampled\n * span keeps no attributes.\n */\nfunction isEffectSpan(span: Span): boolean {\n return (span as { [EFFECT_SPAN_SYMBOL]?: boolean })[EFFECT_SPAN_SYMBOL] === true;\n}\n\n/**\n * Effect span names are chosen by whoever calls `Effect.withSpan`, so the name is the only signal\n * available. `@effect/platform` names its HTTP spans `http.server`/`http.client`, which map onto the\n * matching Sentry ops. Every other name comes from user code or a third-party library, whose semantics\n * we cannot infer, so op and origin stay unset and the span keeps the core defaults: no op, and a\n * `manual` origin.\n */\nfunction deriveOp(name: string): string | undefined {\n if (name.startsWith('http.server')) {\n return HTTP_SERVER;\n }\n\n if (name.startsWith('http.client')) {\n return HTTP_CLIENT;\n }\n\n return undefined;\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (isObjectLike(cause) && 'reasons' in cause && Array.isArray((cause as { reasons: unknown }).reasons)) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (isObjectLike(cause) && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\n/**\n * The client and the server entry hand different `startInactiveSpan` functions to\n * {@link makeSentryTracer}: the browser one from `@sentry/core/browser`, which installs the span\n * streaming integration on first use, and the plain one from `@sentry/core`, which does not.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (isObjectLike(cause) && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst EXTERNAL_SPAN_KEY = '@sentry/effect/ExternalSpan';\n\ninterface ContextExports {\n Reference: typeof Context.Reference;\n /** Only Effect v3 exports it. */\n GenericTag<Identifier, Service>(key: string): Context.Key<Identifier, Service>;\n}\n\n// Effect v4 has no `Context.GenericTag` and Effect v3 before 3.11 has no `Context.Reference`. Both are read\n// through a separate binding because bundlers fail the build on a namespace member the installed version lacks.\nconst contextExports = Context as unknown as ContextExports;\n\n/**\n * Whether the tracer continues the trace of a `Tracer.externalSpan` parent. Effect v4 has no `FiberRef`\n * and v3 before 3.11 has no `Context.Reference`, so the flag is a plain service in both. The cast is safe:\n * the tracer reads it with `getRef` only on a v4 fiber, where it is a reference, and with\n * `Context.getOption` on v3.\n */\nconst ExternalSpanFlag = (\n isEffectV4\n ? contextExports.Reference<boolean>(EXTERNAL_SPAN_KEY, { defaultValue: () => false })\n : contextExports.GenericTag<never, boolean>(EXTERNAL_SPAN_KEY)\n) as Context.Reference<boolean>;\n\n/**\n * Makes the tracer continue the trace of a `Tracer.externalSpan` parent instead of ignoring it. Provide it\n * next to the tracer layer to continue every external span in the runtime, or provide it to a single\n * effect with `Effect.provide` to continue only that one.\n */\nexport const SentryEffectExternalSpanLayer: EffectLayer.Layer<never> = succeedLayer(ExternalSpanFlag, true);\n\ninterface FiberLike {\n /** The span the fiber runs in. Only Effect v3 fibers have it. */\n readonly currentSpan?: EffectTracer.AnySpan | undefined;\n /** Holds `span`, the span the fiber runs in. Only Effect v4 fibers have it. */\n readonly cache?: { readonly span?: EffectTracer.AnySpan | undefined };\n /** Reads a reference with its default. Only Effect v4 fibers have it. */\n readonly getRef?: <A>(ref: Context.Reference<A>) => A;\n /** The services of the fiber. Only Effect v3 fibers have it. */\n readonly currentContext?: Context.Context<never>;\n}\n\n/**\n * The fiber whose operation is being evaluated. Effect hands the fiber to the `context` hook but not to\n * `span`, which runs synchronously inside it, so the hook keeps the fiber here for that extent.\n */\nlet currentFiber: FiberLike | undefined;\n\nfunction continuesExternalSpans(fiber: FiberLike): boolean {\n if (fiber.getRef) {\n return fiber.getRef(ExternalSpanFlag);\n }\n\n return (\n fiber.currentContext !== undefined &&\n Option.getOrElse(Context.getOption(fiber.currentContext, ExternalSpanFlag), () => false)\n );\n}\n\nfunction getFiberSpan(fiber: FiberLike): EffectTracer.AnySpan | undefined {\n return isEffectV4 ? fiber.cache?.span : fiber.currentSpan;\n}\n\nfunction withFiberContext<X>(fiber: FiberLike, execution: () => X): X {\n const previousFiber = currentFiber;\n currentFiber = fiber;\n try {\n const currentSpan = getFiberSpan(fiber);\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n } finally {\n currentFiber = previousFiber;\n }\n}\n\n/**\n * Starts the Sentry span for an Effect span, rooted or parented the way Effect asked for.\n *\n * - A parent this tracer created becomes the Sentry parent.\n * - Any other parent (`Tracer.externalSpan` bridging a trace this SDK did not start, such as an\n * OpenTelemetry span of another app in the same process or persisted trace state) is ignored unless\n * {@link SentryEffectExternalSpanLayer} is provided, so a span joins a foreign trace only when the user\n * asked for it. The span then nests where Effect would have put it without the `parent` option: under\n * the fiber's current span, or parentless. With the layer, the span continues that trace: it is a root\n * span whose `parent_span_id` is the external span. No dynamic sampling context is frozen, so the SDK\n * builds one from the client the way it does for a head-of-trace span.\n * - Without a parent, the span nests under a foreign active Sentry span (an `http.server` span from the\n * Node SDK, a pageload in the browser) but never under a span this tracer created: Effect's own parent\n * tracking is authoritative for those, so an active one is an enclosing `root: true` span or a span\n * leaked from another fiber through the async context. Effect reports `root: true` for every\n * parentless span, so the flag adds nothing and is not consulted.\n * - A root span starts a new trace when `newTraceForRootSpans` is set, unless the user set up the\n * current scope (`Sentry.continueTrace`, `Sentry.withScope`, an HTTP request's isolation scope).\n */\nfunction startSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n options: StartSpanOptions,\n parent: Option.Option<EffectTracer.AnySpan>,\n newTraceForRootSpans: boolean,\n): Span {\n if (Option.isSome(parent)) {\n const parentSpan = parent.value;\n\n if (isSentrySpan(parentSpan)) {\n return startInactiveSpan({ ...options, parentSpan: parentSpan.sentrySpan });\n }\n\n if (currentFiber !== undefined && continuesExternalSpans(currentFiber)) {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: parentSpan.traceId,\n parentSpanId: parentSpan.spanId,\n sampled: parentSpan.sampled,\n sampleRand: _INTERNAL_safeMathRandom(),\n });\n return withActiveSpan(null, () => startInactiveSpan(options));\n });\n }\n\n const enclosingSpan = currentFiber && getFiberSpan(currentFiber);\n if (enclosingSpan !== undefined && isSentrySpan(enclosingSpan)) {\n return startInactiveSpan({ ...options, parentSpan: enclosingSpan.sentrySpan });\n }\n }\n\n const activeSpan = getActiveSpan();\n if (activeSpan && !isEffectSpan(activeSpan)) {\n return startInactiveSpan({ ...options, parentSpan: activeSpan });\n }\n\n // A scope the user forked (`continueTrace`, `withScope`, an isolation scope) carries its own trace id.\n // The scopes this tracer forks in `context()` clone the propagation context they were forked from, so\n // even when one leaks into another fiber through the async context it still carries the process-wide\n // trace id of the default scope.\n const isProcessTrace =\n getCurrentScope().getPropagationContext().traceId === getDefaultCurrentScope().getPropagationContext().traceId;\n if (newTraceForRootSpans && isProcessTrace) {\n return startNewTrace(() => startInactiveSpan(options));\n }\n\n return withActiveSpan(null, () => startInactiveSpan(options));\n}\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const op = deriveOp(name);\n const origin = deriveOrigin(name);\n\n const newSpan = startSentrySpan(\n startInactiveSpan,\n {\n name,\n startTime: nanosToHrTime(startTime),\n // Setting these to `undefined` would strip the core defaults instead of leaving them in place.\n attributes: {\n ...(op && { [SENTRY_OP]: op }),\n ...(origin && { [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: origin }),\n },\n },\n parent,\n newTraceForRootSpans,\n );\n markEffectSpan(newSpan);\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\nconst makeSentryTracerV3 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: FiberLike) {\n return withFiberContext(fiber, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n startInactiveSpan,\n newTraceForRootSpans,\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n return withFiberContext(fiber, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Creates an Effect `Tracer` that records Effect spans as Sentry spans.\n *\n * Use the `SentryEffectTracer` exported from `@sentry/effect` rather than calling this directly — the\n * client and server entries each bind the right `startInactiveSpan` for their platform.\n *\n * `newTraceForRootSpans` is the one behavioural difference between the platforms: Effect gives every\n * parentless span a fresh trace id, and on a long-lived server nothing else forks the propagation\n * context, so the server tracer follows Effect and starts a new trace. In the browser the page trace is\n * the intended home of every span, so the client tracer keeps parentless spans in it.\n */\nexport function makeSentryTracer(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer {\n return isEffectV4\n ? makeSentryTracerV4(startInactiveSpan, newTraceForRootSpans)\n : makeSentryTracerV3(startInactiveSpan, newTraceForRootSpans);\n}\n"],"names":["succeedLayer"],"mappings":"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"}
1
+ {"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { SENTRY_OP, SENTRY_ORIGIN } from '@sentry/conventions/attributes';\nimport { HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport {\n _INTERNAL_safeMathRandom,\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n getDefaultCurrentScope,\n isObjectLike,\n startNewTrace,\n withActiveSpan,\n withScope,\n} from '@sentry/core';\nimport * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport type * as EffectLayer from 'effect/Layer';\nimport { succeed as succeedLayer } from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string | undefined {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return undefined;\n}\n\nconst EFFECT_SPAN_SYMBOL = Symbol.for('@sentry/effect.EffectSpan');\n\nfunction markEffectSpan(span: Span): void {\n addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);\n}\n\n/**\n * Whether this tracer created the span. A brand rather than an attribute check, because an unsampled\n * span keeps no attributes.\n */\nfunction isEffectSpan(span: Span): boolean {\n return (span as { [EFFECT_SPAN_SYMBOL]?: boolean })[EFFECT_SPAN_SYMBOL] === true;\n}\n\n/**\n * Effect span names are chosen by whoever calls `Effect.withSpan`, so the name is the only signal\n * available. `@effect/platform` names its HTTP spans `http.server`/`http.client`, which map onto the\n * matching Sentry ops. Every other name comes from user code or a third-party library, whose semantics\n * we cannot infer, so op and origin stay unset and the span keeps the core defaults: no op, and a\n * `manual` origin.\n */\nfunction deriveOp(name: string): string | undefined {\n if (name.startsWith('http.server')) {\n return HTTP_SERVER;\n }\n\n if (name.startsWith('http.client')) {\n return HTTP_CLIENT;\n }\n\n return undefined;\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (isObjectLike(cause) && 'reasons' in cause && Array.isArray((cause as { reasons: unknown }).reasons)) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (isObjectLike(cause) && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\n/**\n * The client and the server entry hand different `startInactiveSpan` functions to\n * {@link makeSentryTracer}: the browser one from `@sentry/core/browser`, which installs the span\n * streaming integration on first use, and the plain one from `@sentry/core`, which does not.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (isObjectLike(cause) && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst EXTERNAL_SPAN_KEY = '@sentry/effect/ExternalSpan';\n\ninterface ContextExports {\n Reference: typeof Context.Reference;\n /** Only Effect v3 exports it. */\n GenericTag<Identifier, Service>(key: string): Context.Key<Identifier, Service>;\n}\n\n// Effect v4 has no `Context.GenericTag` and Effect v3 before 3.11 has no `Context.Reference`. Both are read\n// through a separate binding because bundlers fail the build on a namespace member the installed version lacks.\nconst contextExports = Context as unknown as ContextExports;\n\n/**\n * Whether the tracer continues the trace of a `Tracer.externalSpan` parent. Effect v4 has no `FiberRef`\n * and v3 before 3.11 has no `Context.Reference`, so the flag is a plain service in both. The cast is safe:\n * the tracer reads it with `getRef` only on a v4 fiber, where it is a reference, and with\n * `Context.getOption` on v3.\n */\nconst ExternalSpanFlag = (\n isEffectV4\n ? contextExports.Reference<boolean>(EXTERNAL_SPAN_KEY, { defaultValue: () => false })\n : contextExports.GenericTag<never, boolean>(EXTERNAL_SPAN_KEY)\n) as Context.Reference<boolean>;\n\n/**\n * Makes the tracer continue the trace of a `Tracer.externalSpan` parent instead of ignoring it. Provide it\n * next to the tracer layer to continue every external span in the runtime, or provide it to a single\n * effect with `Effect.provide` to continue only that one.\n */\nexport const SentryEffectExternalSpanLayer: EffectLayer.Layer<never> = succeedLayer(ExternalSpanFlag, true);\n\ninterface FiberLike {\n /** The span the fiber runs in. Only Effect v3 fibers have it. */\n readonly currentSpan?: EffectTracer.AnySpan | undefined;\n /** Holds `span`, the span the fiber runs in. Only Effect v4 fibers have it. */\n readonly cache?: { readonly span?: EffectTracer.AnySpan | undefined };\n /** Reads a reference with its default. Only Effect v4 fibers have it. */\n readonly getRef?: <A>(ref: Context.Reference<A>) => A;\n /** The services of the fiber. Only Effect v3 fibers have it. */\n readonly currentContext?: Context.Context<never>;\n}\n\n/**\n * The fiber whose operation is being evaluated. Effect hands the fiber to the `context` hook but not to\n * `span`, which runs synchronously inside it, so the hook keeps the fiber here for that extent.\n */\nlet currentFiber: FiberLike | undefined;\n\nfunction continuesExternalSpans(fiber: FiberLike): boolean {\n if (fiber.getRef) {\n return fiber.getRef(ExternalSpanFlag);\n }\n\n return (\n fiber.currentContext !== undefined &&\n Option.getOrElse(Context.getOption(fiber.currentContext, ExternalSpanFlag), () => false)\n );\n}\n\nfunction getFiberSpan(fiber: FiberLike): EffectTracer.AnySpan | undefined {\n return isEffectV4 ? fiber.cache?.span : fiber.currentSpan;\n}\n\nfunction withFiberContext<X>(fiber: FiberLike, execution: () => X): X {\n const previousFiber = currentFiber;\n currentFiber = fiber;\n try {\n const currentSpan = getFiberSpan(fiber);\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n } finally {\n currentFiber = previousFiber;\n }\n}\n\n/**\n * Starts the Sentry span for an Effect span, rooted or parented the way Effect asked for.\n *\n * - A parent this tracer created becomes the Sentry parent.\n * - Any other parent (`Tracer.externalSpan` bridging a trace this SDK did not start, such as an\n * OpenTelemetry span of another app in the same process or persisted trace state) is ignored unless\n * {@link SentryEffectExternalSpanLayer} is provided, so a span joins a foreign trace only when the user\n * asked for it. The span then nests where Effect would have put it without the `parent` option: under\n * the fiber's current span, or parentless. With the layer, the span continues that trace: it is a root\n * span whose `parent_span_id` is the external span. No dynamic sampling context is frozen, so the SDK\n * builds one from the client the way it does for a head-of-trace span.\n * - Without a parent, the span nests under a foreign active Sentry span (an `http.server` span from the\n * Node SDK, a pageload in the browser) but never under a span this tracer created: Effect's own parent\n * tracking is authoritative for those, so an active one is an enclosing `root: true` span or a span\n * leaked from another fiber through the async context. Effect reports `root: true` for every\n * parentless span, so the flag adds nothing and is not consulted.\n * - A root span starts a new trace when `newTraceForRootSpans` is set, unless the user set up the\n * current scope (`Sentry.continueTrace`, `Sentry.withScope`, an HTTP request's isolation scope).\n */\nfunction startSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n options: StartSpanOptions,\n parent: Option.Option<EffectTracer.AnySpan>,\n newTraceForRootSpans: boolean,\n): Span {\n if (Option.isSome(parent)) {\n const parentSpan = parent.value;\n\n if (isSentrySpan(parentSpan)) {\n return startInactiveSpan({ ...options, parentSpan: parentSpan.sentrySpan });\n }\n\n if (currentFiber !== undefined && continuesExternalSpans(currentFiber)) {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: parentSpan.traceId,\n parentSpanId: parentSpan.spanId,\n sampled: parentSpan.sampled,\n sampleRand: _INTERNAL_safeMathRandom(),\n });\n return withActiveSpan(null, () => startInactiveSpan(options));\n });\n }\n\n const enclosingSpan = currentFiber && getFiberSpan(currentFiber);\n if (enclosingSpan !== undefined && isSentrySpan(enclosingSpan)) {\n return startInactiveSpan({ ...options, parentSpan: enclosingSpan.sentrySpan });\n }\n }\n\n const activeSpan = getActiveSpan();\n if (activeSpan && !isEffectSpan(activeSpan)) {\n return startInactiveSpan({ ...options, parentSpan: activeSpan });\n }\n\n // A scope the user forked (`continueTrace`, `withScope`, an isolation scope) carries its own trace id.\n // The scopes this tracer forks in `context()` clone the propagation context they were forked from, so\n // even when one leaks into another fiber through the async context it still carries the process-wide\n // trace id of the default scope.\n const isProcessTrace =\n getCurrentScope().getPropagationContext().traceId === getDefaultCurrentScope().getPropagationContext().traceId;\n if (newTraceForRootSpans && isProcessTrace) {\n return startNewTrace(() => startInactiveSpan(options));\n }\n\n return withActiveSpan(null, () => startInactiveSpan(options));\n}\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const op = deriveOp(name);\n const origin = deriveOrigin(name);\n\n const newSpan = startSentrySpan(\n startInactiveSpan,\n {\n name,\n startTime: nanosToHrTime(startTime),\n // Setting these to `undefined` would strip the core defaults instead of leaving them in place.\n attributes: {\n ...(op && { [SENTRY_OP]: op }),\n ...(origin && { [SENTRY_ORIGIN]: origin }),\n },\n },\n parent,\n newTraceForRootSpans,\n );\n markEffectSpan(newSpan);\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\nconst makeSentryTracerV3 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: FiberLike) {\n return withFiberContext(fiber, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n startInactiveSpan,\n newTraceForRootSpans,\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n return withFiberContext(fiber, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Creates an Effect `Tracer` that records Effect spans as Sentry spans.\n *\n * Use the `SentryEffectTracer` exported from `@sentry/effect` rather than calling this directly — the\n * client and server entries each bind the right `startInactiveSpan` for their platform.\n *\n * `newTraceForRootSpans` is the one behavioural difference between the platforms: Effect gives every\n * parentless span a fresh trace id, and on a long-lived server nothing else forks the propagation\n * context, so the server tracer follows Effect and starts a new trace. In the browser the page trace is\n * the intended home of every span, so the client tracer keeps parentless spans in it.\n */\nexport function makeSentryTracer(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer {\n return isEffectV4\n ? makeSentryTracerV4(startInactiveSpan, newTraceForRootSpans)\n : makeSentryTracerV3(startInactiveSpan, newTraceForRootSpans);\n}\n"],"names":["succeedLayer"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAqBxC;;GAEG;AACH,eAAO,MAAM,kBAAkB,8BAuC7B,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAqBxC;;GAEG;AACH,eAAO,MAAM,kBAAkB,8BAuC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAe3D,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAqL9C;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;AA2CpE;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAwC,CAAC;AAmM5G;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,iBAAiB,EAAE,iBAAiB,EACpC,oBAAoB,EAAE,OAAO,GAC5B,YAAY,CAAC,MAAM,CAIrB"}
1
+ {"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAc3D,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAqL9C;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;AA2CpE;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAwC,CAAC;AAmM5G;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,iBAAiB,EAAE,iBAAiB,EACpC,oBAAoB,EAAE,OAAO,GAC5B,YAAY,CAAC,MAAM,CAIrB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/effect",
3
- "version": "11.3.0",
3
+ "version": "11.5.0",
4
4
  "description": "Official Sentry SDK for Effect",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/effect",
@@ -44,10 +44,10 @@
44
44
  "access": "public"
45
45
  },
46
46
  "dependencies": {
47
- "@sentry/browser": "11.3.0",
48
- "@sentry/conventions": "^0.25.0",
49
- "@sentry/core": "11.3.0",
50
- "@sentry/node": "11.3.0"
47
+ "@sentry/browser": "11.5.0",
48
+ "@sentry/conventions": "^0.26.0",
49
+ "@sentry/core": "11.5.0",
50
+ "@sentry/node": "11.5.0"
51
51
  },
52
52
  "peerDependencies": {
53
53
  "effect": "^3.0.0 || ^4.0.0"