{"version":3,"file":"index.js","sources":["../../../src/sdk/index.ts"],"sourcesContent":["import type { Integration, Options } from '@sentry/core';\nimport { applySdkMetadata, hasSpansEnabled } from '@sentry/core';\nimport type { NodeClient } from '@sentry/node-core';\nimport {\n getDefaultIntegrations as getNodeCoreDefaultIntegrations,\n init as initNodeCore,\n validateOpenTelemetrySetup,\n} from '@sentry/node-core';\nimport { httpIntegration } from '../integrations/http';\nimport { nativeNodeFetchIntegration } from '../integrations/node-fetch';\nimport { getAutoPerformanceIntegrations } from '../integrations/tracing';\nimport type { NodeOptions } from '../types';\nimport {\n isDiagnosticsChannelInjectionEnabled,\n resolveDiagnosticsChannelInjection,\n} from './diagnosticsChannelInjection';\nimport { initOpenTelemetry } from './initOtel';\n\n/**\n * Get default integrations, excluding performance.\n */\nexport function getDefaultIntegrationsWithoutPerformance(): Integration[] {\n const nodeCoreIntegrations = getNodeCoreDefaultIntegrations();\n\n // Filter out the node-core HTTP and NodeFetch integrations and replace them with Node SDK's composite versions\n return nodeCoreIntegrations\n .filter(integration => integration.name !== 'Http' && integration.name !== 'NodeFetch')\n .concat(httpIntegration(), nativeNodeFetchIntegration());\n}\n\n/** Get the default integrations for the Node SDK. */\nexport function getDefaultIntegrations(options: Options): Integration[] {\n return [\n ...getDefaultIntegrationsWithoutPerformance(),\n // We only add performance integrations if tracing is enabled\n // Note that this means that without tracing enabled, e.g. `expressIntegration()` will not be added\n // This means that generally request isolation will work (because that is done by httpIntegration)\n // But `transactionName` will not be set automatically\n ...(hasSpansEnabled(options) ? getAutoPerformanceIntegrations() : []),\n ];\n}\n\n/**\n * When the app opted into diagnostics-channel injection (via\n * `experimentalUseDiagnosticsChannelInjection()`) AND span recording is enabled, drop the OTel\n * integrations that have a channel-based replacement and append the FULL channel-integration set,\n * so the two never both instrument the same library. Otherwise returns `integrations` unchanged.\n *\n * `_init` applies the same swap to `defaultIntegrations`, but SDKs that seed their integrations\n * through the user `integrations` option instead (e.g. the `@sentry/aws-serverless` Lambda layer\n * entry) never hit that path, so they call this directly from their own `getDefaultIntegrations`.\n *\n * Note the asymmetry: appended channel integrations are not limited to ones whose OTel counterpart\n * was in `integrations`. For `@sentry/node` that makes no difference (the incoming list carries the\n * whole OTel performance set), but a caller with a narrower list (e.g. `@sentry/aws-serverless`)\n * gains channel coverage for libraries it never shipped OTel integrations for. Channel integrations\n * produce nothing but spans, so this is gated on span recording. Exported so SDKs that build their\n * own default-integration set can apply the same logic instead of duplicating it.\n */\nexport function applyDiagnosticsChannelInjectionIntegrations(\n integrations: Integration[],\n options: Options,\n): Integration[] {\n if (isDiagnosticsChannelInjectionEnabled() && hasSpansEnabled(options)) {\n const diagnosticsChannelInjection = resolveDiagnosticsChannelInjection();\n if (diagnosticsChannelInjection) {\n const replaced = new Set(diagnosticsChannelInjection.replacedOtelIntegrationNames);\n return [...integrations.filter(i => !replaced.has(i.name)), ...diagnosticsChannelInjection.integrations];\n }\n }\n return integrations;\n}\n\n/**\n * Initialize Sentry for Node.\n */\nexport function init(options: NodeOptions | undefined = {}): NodeClient | undefined {\n return _init(options, getDefaultIntegrations);\n}\n\n/**\n * Internal initialization function.\n */\nfunction _init(\n options: NodeOptions | undefined = {},\n getDefaultIntegrationsImpl: (options: Options) => Integration[],\n): NodeClient | undefined {\n applySdkMetadata(options, 'node');\n\n // EXPERIMENTAL: diagnostics-channel injection, opted into via\n // `experimentalUseDiagnosticsChannelInjection()`. Gated on span recording to\n // match the OTel integrations it replaces. With tracing off there are no\n // channel subscribers, so injecting is pointless work.\n const diagnosticsChannelInjection =\n isDiagnosticsChannelInjectionEnabled() && hasSpansEnabled(options)\n ? resolveDiagnosticsChannelInjection()\n : undefined;\n\n // Install the channel-injection hooks as early as possible, before the app\n // imports its instrumented modules.\n if (diagnosticsChannelInjection) {\n diagnosticsChannelInjection.register();\n }\n\n // Only use Node SDK defaults if none provided.\n let defaultIntegrations = options.defaultIntegrations ?? getDefaultIntegrationsImpl(options);\n\n // When opted into diagnostics-channel injection, swap the channel-based\n // integrations in place of their OTel equivalents so the two don't both\n // instrument the same library. Done here (rather than in\n // `getDefaultIntegrations`) so it also covers framework SDKs (e.g.\n // `@sentry/nestjs`) that pass their own `defaultIntegrations` array.\n //\n // Only when there's a non-empty default set to swap:\n // `defaultIntegrations: false` (not an array) and `[]` /\n // `initWithoutDefaultIntegrations()` (explicitly no defaults) are left\n // untouched, as appending channel integrations there would resurrect\n // defaults the caller opted out of.\n if (diagnosticsChannelInjection && Array.isArray(defaultIntegrations) && defaultIntegrations.length > 0) {\n const replaced = new Set(diagnosticsChannelInjection.replacedOtelIntegrationNames);\n defaultIntegrations = [\n ...defaultIntegrations.filter(integration => !replaced.has(integration.name)),\n ...diagnosticsChannelInjection.integrations,\n ];\n }\n\n const client = initNodeCore({\n ...options,\n defaultIntegrations,\n });\n\n // Add Node SDK specific OpenTelemetry setup\n if (client && !options.skipOpenTelemetrySetup) {\n initOpenTelemetry(client, {\n spanProcessors: options.openTelemetrySpanProcessors,\n });\n validateOpenTelemetrySetup();\n }\n\n // Warn about missing or doubled channel injection. Runs after the client\n // is created so the debug logger is enabled and the warning is emitted.\n if (diagnosticsChannelInjection) {\n diagnosticsChannelInjection.detect();\n }\n\n return client;\n}\n\n/**\n * Initialize Sentry for Node, without any integrations added by default.\n */\nexport function initWithoutDefaultIntegrations(options: NodeOptions | undefined = {}): NodeClient | undefined {\n return _init(options, () => []);\n}\n"],"names":["getNodeCoreDefaultIntegrations","initNodeCore"],"mappings":";;;;;;;;AAqBO,SAAS,wCAAA,GAA0D;AACxE,EAAA,MAAM,uBAAuBA,wBAAA,EAA+B;AAG5D,EAAA,OAAO,oBAAA,CACJ,MAAA,CAAO,CAAA,WAAA,KAAe,WAAA,CAAY,SAAS,MAAA,IAAU,WAAA,CAAY,IAAA,KAAS,WAAW,CAAA,CACrF,MAAA,CAAO,eAAA,EAAgB,EAAG,4BAA4B,CAAA;AAC3D;AAGO,SAAS,uBAAuB,OAAA,EAAiC;AACtE,EAAA,OAAO;AAAA,IACL,GAAG,wCAAA,EAAyC;AAAA;AAAA;AAAA;AAAA;AAAA,IAK5C,GAAI,eAAA,CAAgB,OAAO,CAAA,GAAI,8BAAA,KAAmC;AAAC,GACrE;AACF;AAmBO,SAAS,4CAAA,CACd,cACA,OAAA,EACe;AACf,EAAA,IAAI,oCAAA,EAAqC,IAAK,eAAA,CAAgB,OAAO,CAAA,EAAG;AACtE,IAAA,MAAM,8BAA8B,kCAAA,EAAmC;AACvE,IAAA,IAAI,2BAAA,EAA6B;AAC/B,MAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,2BAAA,CAA4B,4BAA4B,CAAA;AACjF,MAAA,OAAO,CAAC,GAAG,YAAA,CAAa,MAAA,CAAO,OAAK,CAAC,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,GAAG,4BAA4B,YAAY,CAAA;AAAA,IACzG;AAAA,EACF;AACA,EAAA,OAAO,YAAA;AACT;AAKO,SAAS,IAAA,CAAK,OAAA,GAAmC,EAAC,EAA2B;AAClF,EAAA,OAAO,KAAA,CAAM,SAAS,sBAAsB,CAAA;AAC9C;AAKA,SAAS,KAAA,CACP,OAAA,GAAmC,EAAC,EACpC,0BAAA,EACwB;AACxB,EAAA,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAMhC,EAAA,MAAM,8BACJ,oCAAA,EAAqC,IAAK,gBAAgB,OAAO,CAAA,GAC7D,oCAAmC,GACnC,MAAA;AAIN,EAAA,IAAI,2BAAA,EAA6B;AAC/B,IAAA,2BAAA,CAA4B,QAAA,EAAS;AAAA,EACvC;AAGA,EAAA,IAAI,mBAAA,GAAsB,OAAA,CAAQ,mBAAA,IAAuB,0BAAA,CAA2B,OAAO,CAAA;AAa3F,EAAA,IAAI,+BAA+B,KAAA,CAAM,OAAA,CAAQ,mBAAmB,CAAA,IAAK,mBAAA,CAAoB,SAAS,CAAA,EAAG;AACvG,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,2BAAA,CAA4B,4BAA4B,CAAA;AACjF,IAAA,mBAAA,GAAsB;AAAA,MACpB,GAAG,oBAAoB,MAAA,CAAO,CAAA,WAAA,KAAe,CAAC,QAAA,CAAS,GAAA,CAAI,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,MAC5E,GAAG,2BAAA,CAA4B;AAAA,KACjC;AAAA,EACF;AAEA,EAAA,MAAM,SAASC,MAAA,CAAa;AAAA,IAC1B,GAAG,OAAA;AAAA,IACH;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,MAAA,IAAU,CAAC,OAAA,CAAQ,sBAAA,EAAwB;AAC7C,IAAA,iBAAA,CAAkB,MAAA,EAAQ;AAAA,MACxB,gBAAgB,OAAA,CAAQ;AAAA,KACzB,CAAA;AACD,IAAA,0BAAA,EAA2B;AAAA,EAC7B;AAIA,EAAA,IAAI,2BAAA,EAA6B;AAC/B,IAAA,2BAAA,CAA4B,MAAA,EAAO;AAAA,EACrC;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,8BAAA,CAA+B,OAAA,GAAmC,EAAC,EAA2B;AAC5G,EAAA,OAAO,KAAA,CAAM,OAAA,EAAS,MAAM,EAAE,CAAA;AAChC;;;;"}