🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@sentry/core

Package Overview
Dependencies
Maintainers
1
Versions
711
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sentry/core - npm Package Compare versions

Comparing version
10.56.0
to
10.57.0
+2
-1
build/cjs/checkin.js

@@ -5,6 +5,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const envelope = require('./utils/envelope.js');
const randomSafeContext = require('./utils/randomSafeContext.js');
function createCheckInEnvelope(checkIn, dynamicSamplingContext, metadata, tunnel, dsn$1) {
const headers = {
sent_at: (/* @__PURE__ */ new Date()).toISOString()
sent_at: new Date(randomSafeContext.safeDateNow()).toISOString()
};

@@ -11,0 +12,0 @@ if (metadata?.sdk) {

@@ -1,1 +0,1 @@

{"version":3,"file":"checkin.js","sources":["../../src/checkin.ts"],"sourcesContent":["import type { SerializedCheckIn } from './types/checkin';\nimport type { DsnComponents } from './types/dsn';\nimport type { CheckInEnvelope, CheckInItem, DynamicSamplingContext } from './types/envelope';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport { dsnToString } from './utils/dsn';\nimport { createEnvelope } from './utils/envelope';\n\n/**\n * Create envelope from check in item.\n */\nexport function createCheckInEnvelope(\n checkIn: SerializedCheckIn,\n dynamicSamplingContext?: Partial<DynamicSamplingContext>,\n metadata?: SdkMetadata,\n tunnel?: string,\n dsn?: DsnComponents,\n): CheckInEnvelope {\n const headers: CheckInEnvelope[0] = {\n sent_at: new Date().toISOString(),\n };\n\n if (metadata?.sdk) {\n headers.sdk = {\n name: metadata.sdk.name,\n version: metadata.sdk.version,\n };\n }\n\n if (!!tunnel && !!dsn) {\n headers.dsn = dsnToString(dsn);\n }\n\n if (dynamicSamplingContext) {\n headers.trace = dynamicSamplingContext as DynamicSamplingContext;\n }\n\n const item = createCheckInEnvelopeItem(checkIn);\n return createEnvelope<CheckInEnvelope>(headers, [item]);\n}\n\nfunction createCheckInEnvelopeItem(checkIn: SerializedCheckIn): CheckInItem {\n const checkInHeaders: CheckInItem[0] = {\n type: 'check_in',\n };\n return [checkInHeaders, checkIn];\n}\n"],"names":["dsn","dsnToString","createEnvelope"],"mappings":";;;;;AAUO,SAAS,qBAAA,CACd,OAAA,EACA,sBAAA,EACA,QAAA,EACA,QACAA,KAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAA8B;AAAA,IAClC,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GAClC;AAEA,EAAA,IAAI,UAAU,GAAA,EAAK;AACjB,IAAA,OAAA,CAAQ,GAAA,GAAM;AAAA,MACZ,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA;AAAA,MACnB,OAAA,EAAS,SAAS,GAAA,CAAI;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,CAAC,MAAA,IAAU,CAAC,CAACA,KAAA,EAAK;AACrB,IAAA,OAAA,CAAQ,GAAA,GAAMC,gBAAYD,KAAG,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,sBAAA,EAAwB;AAC1B,IAAA,OAAA,CAAQ,KAAA,GAAQ,sBAAA;AAAA,EAClB;AAEA,EAAA,MAAM,IAAA,GAAO,0BAA0B,OAAO,CAAA;AAC9C,EAAA,OAAOE,uBAAA,CAAgC,OAAA,EAAS,CAAC,IAAI,CAAC,CAAA;AACxD;AAEA,SAAS,0BAA0B,OAAA,EAAyC;AAC1E,EAAA,MAAM,cAAA,GAAiC;AAAA,IACrC,IAAA,EAAM;AAAA,GACR;AACA,EAAA,OAAO,CAAC,gBAAgB,OAAO,CAAA;AACjC;;;;"}
{"version":3,"file":"checkin.js","sources":["../../src/checkin.ts"],"sourcesContent":["import type { SerializedCheckIn } from './types/checkin';\nimport type { DsnComponents } from './types/dsn';\nimport type { CheckInEnvelope, CheckInItem, DynamicSamplingContext } from './types/envelope';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport { dsnToString } from './utils/dsn';\nimport { createEnvelope } from './utils/envelope';\nimport { safeDateNow } from './utils/randomSafeContext';\n\n/**\n * Create envelope from check in item.\n */\nexport function createCheckInEnvelope(\n checkIn: SerializedCheckIn,\n dynamicSamplingContext?: Partial<DynamicSamplingContext>,\n metadata?: SdkMetadata,\n tunnel?: string,\n dsn?: DsnComponents,\n): CheckInEnvelope {\n const headers: CheckInEnvelope[0] = {\n sent_at: new Date(safeDateNow()).toISOString(),\n };\n\n if (metadata?.sdk) {\n headers.sdk = {\n name: metadata.sdk.name,\n version: metadata.sdk.version,\n };\n }\n\n if (!!tunnel && !!dsn) {\n headers.dsn = dsnToString(dsn);\n }\n\n if (dynamicSamplingContext) {\n headers.trace = dynamicSamplingContext as DynamicSamplingContext;\n }\n\n const item = createCheckInEnvelopeItem(checkIn);\n return createEnvelope<CheckInEnvelope>(headers, [item]);\n}\n\nfunction createCheckInEnvelopeItem(checkIn: SerializedCheckIn): CheckInItem {\n const checkInHeaders: CheckInItem[0] = {\n type: 'check_in',\n };\n return [checkInHeaders, checkIn];\n}\n"],"names":["dsn","safeDateNow","dsnToString","createEnvelope"],"mappings":";;;;;;AAWO,SAAS,qBAAA,CACd,OAAA,EACA,sBAAA,EACA,QAAA,EACA,QACAA,KAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAA8B;AAAA,IAClC,SAAS,IAAI,IAAA,CAAKC,6BAAA,EAAa,EAAE,WAAA;AAAY,GAC/C;AAEA,EAAA,IAAI,UAAU,GAAA,EAAK;AACjB,IAAA,OAAA,CAAQ,GAAA,GAAM;AAAA,MACZ,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA;AAAA,MACnB,OAAA,EAAS,SAAS,GAAA,CAAI;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,CAAC,MAAA,IAAU,CAAC,CAACD,KAAA,EAAK;AACrB,IAAA,OAAA,CAAQ,GAAA,GAAME,gBAAYF,KAAG,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,sBAAA,EAAwB;AAC1B,IAAA,OAAA,CAAQ,KAAA,GAAQ,sBAAA;AAAA,EAClB;AAEA,EAAA,MAAM,IAAA,GAAO,0BAA0B,OAAO,CAAA;AAC9C,EAAA,OAAOG,uBAAA,CAAgC,OAAA,EAAS,CAAC,IAAI,CAAC,CAAA;AACxD;AAEA,SAAS,0BAA0B,OAAA,EAAyC;AAC1E,EAAA,MAAM,cAAA,GAAiC;AAAA,IACrC,IAAA,EAAM;AAAA,GACR;AACA,EAAA,OAAO,CAAC,gBAAgB,OAAO,CAAA;AACjC;;;;"}

@@ -7,2 +7,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const envelope = require('./utils/envelope.js');
const randomSafeContext = require('./utils/randomSafeContext.js');
const shouldIgnoreSpan = require('./utils/should-ignore-span.js');

@@ -32,3 +33,3 @@ const spanUtils = require('./utils/spanUtils.js');

const envelopeHeaders = {
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
sent_at: new Date(randomSafeContext.safeDateNow()).toISOString(),
...sdkInfo && { sdk: sdkInfo },

@@ -57,3 +58,3 @@ ...!!tunnel && dsn$1 && { dsn: dsn.dsnToString(dsn$1) }

const headers = {
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
sent_at: new Date(randomSafeContext.safeDateNow()).toISOString(),
...dscHasRequiredProps(dsc) && { trace: dsc },

@@ -60,0 +61,0 @@ ...!!tunnel && dsn$1 && { dsn: dsn.dsnToString(dsn$1) }

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.js","sources":["../../src/envelope.ts"],"sourcesContent":["import type { Client } from './client';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport { isStreamedBeforeSendSpanCallback } from './tracing/spans/beforeSendSpan';\nimport type { LegacyCSPReport } from './types/csp';\nimport type { DsnComponents } from './types/dsn';\nimport type {\n DynamicSamplingContext,\n EventEnvelope,\n EventItem,\n RawSecurityEnvelope,\n RawSecurityItem,\n SessionEnvelope,\n SessionItem,\n SpanEnvelope,\n SpanItem,\n} from './types/envelope';\nimport type { Event } from './types/event';\nimport type { SdkInfo } from './types/sdkinfo';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport type { Session, SessionAggregates } from './types/session';\nimport { dsnToString } from './utils/dsn';\nimport {\n createEnvelope,\n createEventEnvelopeHeaders,\n createSpanEnvelopeItem,\n getSdkMetadataForEnvelopeHeader,\n} from './utils/envelope';\nimport { uuid4 } from './utils/misc';\nimport { shouldIgnoreSpan } from './utils/should-ignore-span';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n *\n * @internal, exported only for testing\n **/\nexport function _enhanceEventWithSdkInfo(event: Event, newSdkInfo?: SdkInfo): Event {\n if (!newSdkInfo) {\n return event;\n }\n\n const eventSdkInfo = event.sdk || {};\n\n event.sdk = {\n ...eventSdkInfo,\n name: eventSdkInfo.name || newSdkInfo.name,\n version: eventSdkInfo.version || newSdkInfo.version,\n integrations: [...(event.sdk?.integrations || []), ...(newSdkInfo.integrations || [])],\n packages: [...(event.sdk?.packages || []), ...(newSdkInfo.packages || [])],\n settings:\n event.sdk?.settings || newSdkInfo.settings\n ? {\n ...event.sdk?.settings,\n ...newSdkInfo.settings,\n }\n : undefined,\n };\n\n return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n session: Session | SessionAggregates,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): SessionEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem: SessionItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n event: Event,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): EventEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n /*\n Note: Due to TS, event.type may be `replay_event`, theoretically.\n In practice, we never call `createEventEnvelope` with `replay_event` type,\n and we'd have to adjust a looot of types to make this work properly.\n We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n So the safe choice is to really guard against the replay_event type here.\n */\n const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n _enhanceEventWithSdkInfo(event, metadata?.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem: EventItem = [{ type: eventType }, event];\n return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n function dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n }\n\n // For the moment we'll obtain the DSC from the first span in the array\n // This might need to be changed if we permit sending multiple spans from\n // different segments in one envelope\n const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n const dsn = client?.getDsn();\n const tunnel = client?.getOptions().tunnel;\n\n const headers: SpanEnvelope[0] = {\n sent_at: new Date().toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const { beforeSendSpan, ignoreSpans } = client?.getOptions() || {};\n\n const filteredSpans = ignoreSpans?.length\n ? spans.filter(span => {\n const json = spanToJSON(span);\n return !shouldIgnoreSpan({ description: json.description, op: json.op, attributes: json.data }, ignoreSpans);\n })\n : spans;\n const droppedSpans = spans.length - filteredSpans.length;\n\n if (droppedSpans) {\n client?.recordDroppedEvent('before_send', 'span', droppedSpans);\n }\n\n const convertToSpanJSON = beforeSendSpan\n ? (span: SentrySpan) => {\n const spanJson = spanToJSON(span);\n const processedSpan = !isStreamedBeforeSendSpanCallback(beforeSendSpan) ? beforeSendSpan(spanJson) : spanJson;\n\n if (!processedSpan) {\n showSpanDropWarning();\n return spanJson;\n }\n\n return processedSpan;\n }\n : spanToJSON;\n\n const items: SpanItem[] = [];\n for (const span of filteredSpans) {\n const spanJson = convertToSpanJSON(span);\n if (spanJson) {\n items.push(createSpanEnvelopeItem(spanJson));\n }\n }\n\n return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n report: LegacyCSPReport,\n dsn: DsnComponents,\n tunnel?: string,\n release?: string,\n environment?: string,\n): RawSecurityEnvelope {\n const envelopeHeaders = {\n event_id: uuid4(),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const eventItem: RawSecurityItem = [\n { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n report,\n ];\n\n return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n"],"names":["dsn","getSdkMetadataForEnvelopeHeader","dsnToString","createEnvelope","createEventEnvelopeHeaders","dsc","getDynamicSamplingContextFromSpan","beforeSendSpan","spanToJSON","shouldIgnoreSpan","isStreamedBeforeSendSpanCallback","showSpanDropWarning","createSpanEnvelopeItem"],"mappings":";;;;;;;;;AAsCO,SAAS,wBAAA,CAAyB,OAAc,UAAA,EAA6B;AAClF,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,IAAO,EAAC;AAEnC,EAAA,KAAA,CAAM,GAAA,GAAM;AAAA,IACV,GAAG,YAAA;AAAA,IACH,IAAA,EAAM,YAAA,CAAa,IAAA,IAAQ,UAAA,CAAW,IAAA;AAAA,IACtC,OAAA,EAAS,YAAA,CAAa,OAAA,IAAW,UAAA,CAAW,OAAA;AAAA,IAC5C,YAAA,EAAc,CAAC,GAAI,KAAA,CAAM,GAAA,EAAK,YAAA,IAAgB,EAAC,EAAI,GAAI,UAAA,CAAW,YAAA,IAAgB,EAAG,CAAA;AAAA,IACrF,QAAA,EAAU,CAAC,GAAI,KAAA,CAAM,GAAA,EAAK,QAAA,IAAY,EAAC,EAAI,GAAI,UAAA,CAAW,QAAA,IAAY,EAAG,CAAA;AAAA,IACzE,QAAA,EACE,KAAA,CAAM,GAAA,EAAK,QAAA,IAAY,WAAW,QAAA,GAC9B;AAAA,MACE,GAAG,MAAM,GAAA,EAAK,QAAA;AAAA,MACd,GAAG,UAAA,CAAW;AAAA,KAChB,GACA;AAAA,GACR;AAEA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,qBAAA,CACd,OAAA,EACAA,KAAA,EACA,QAAA,EACA,MAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAAUC,yCAAgC,QAAQ,CAAA;AACxD,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAChC,GAAI,OAAA,IAAW,EAAE,GAAA,EAAK,OAAA,EAAQ;AAAA,IAC9B,GAAI,CAAC,CAAC,MAAA,IAAUD,SAAO,EAAE,GAAA,EAAKE,eAAA,CAAYF,KAAG,CAAA;AAAE,GACjD;AAEA,EAAA,MAAM,eACJ,YAAA,IAAgB,OAAA,GAAU,CAAC,EAAE,MAAM,UAAA,EAAW,EAAG,OAAO,CAAA,GAAI,CAAC,EAAE,IAAA,EAAM,WAAU,EAAG,OAAA,CAAQ,QAAQ,CAAA;AAEpG,EAAA,OAAOG,uBAAA,CAAgC,eAAA,EAAiB,CAAC,YAAY,CAAC,CAAA;AACxE;AAKO,SAAS,mBAAA,CACd,KAAA,EACA,GAAA,EACA,QAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,OAAA,GAAUF,yCAAgC,QAAQ,CAAA;AASxD,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA,IAAQ,MAAM,IAAA,KAAS,cAAA,GAAiB,MAAM,IAAA,GAAO,OAAA;AAE7E,EAAA,wBAAA,CAAyB,KAAA,EAAO,UAAU,GAAG,CAAA;AAE7C,EAAA,MAAM,eAAA,GAAkBG,mCAAA,CAA2B,KAAA,EAAO,OAAA,EAAS,QAAQ,GAAG,CAAA;AAM9E,EAAA,OAAO,KAAA,CAAM,qBAAA;AAEb,EAAA,MAAM,YAAuB,CAAC,EAAE,IAAA,EAAM,SAAA,IAAa,KAAK,CAAA;AACxD,EAAA,OAAOD,uBAAA,CAA8B,eAAA,EAAiB,CAAC,SAAS,CAAC,CAAA;AACnE;AAOO,SAAS,kBAAA,CAAmB,OAAsC,MAAA,EAA+B;AACtG,EAAA,SAAS,oBAAoBE,IAAAA,EAAqE;AAChG,IAAA,OAAO,CAAC,CAACA,IAAAA,CAAI,QAAA,IAAY,CAAC,CAACA,IAAAA,CAAI,UAAA;AAAA,EACjC;AAKA,EAAA,MAAM,GAAA,GAAMC,wDAAA,CAAkC,KAAA,CAAM,CAAC,CAAC,CAAA;AAEtD,EAAA,MAAMN,KAAA,GAAM,QAAQ,MAAA,EAAO;AAC3B,EAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,UAAA,EAAW,CAAE,MAAA;AAEpC,EAAA,MAAM,OAAA,GAA2B;AAAA,IAC/B,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAChC,GAAI,mBAAA,CAAoB,GAAG,CAAA,IAAK,EAAE,OAAO,GAAA,EAAI;AAAA,IAC7C,GAAI,CAAC,CAAC,MAAA,IAAUA,SAAO,EAAE,GAAA,EAAKE,eAAA,CAAYF,KAAG,CAAA;AAAE,GACjD;AAEA,EAAA,MAAM,kBAAEO,gBAAA,EAAgB,WAAA,KAAgB,MAAA,EAAQ,UAAA,MAAgB,EAAC;AAEjE,EAAA,MAAM,aAAA,GAAgB,WAAA,EAAa,MAAA,GAC/B,KAAA,CAAM,OAAO,CAAA,IAAA,KAAQ;AACnB,IAAA,MAAM,IAAA,GAAOC,qBAAW,IAAI,CAAA;AAC5B,IAAA,OAAO,CAACC,iCAAA,CAAiB,EAAE,WAAA,EAAa,IAAA,CAAK,WAAA,EAAa,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,UAAA,EAAY,IAAA,CAAK,IAAA,IAAQ,WAAW,CAAA;AAAA,EAC7G,CAAC,CAAA,GACD,KAAA;AACJ,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,GAAS,aAAA,CAAc,MAAA;AAElD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAA,EAAQ,kBAAA,CAAmB,aAAA,EAAe,MAAA,EAAQ,YAAY,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,iBAAA,GAAoBF,gBAAA,GACtB,CAAC,IAAA,KAAqB;AACpB,IAAA,MAAM,QAAA,GAAWC,qBAAW,IAAI,CAAA;AAChC,IAAA,MAAM,gBAAgB,CAACE,+CAAA,CAAiCH,gBAAc,CAAA,GAAIA,gBAAA,CAAe,QAAQ,CAAA,GAAI,QAAA;AAErG,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAAI,6BAAA,EAAoB;AACpB,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,OAAO,aAAA;AAAA,EACT,CAAA,GACAH,oBAAA;AAEJ,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,MAAM,QAAA,GAAW,kBAAkB,IAAI,CAAA;AACvC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,CAAM,IAAA,CAAKI,+BAAA,CAAuB,QAAQ,CAAC,CAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,OAAOT,uBAAA,CAA6B,SAAS,KAAK,CAAA;AACpD;;;;;;;"}
{"version":3,"file":"envelope.js","sources":["../../src/envelope.ts"],"sourcesContent":["import type { Client } from './client';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport { isStreamedBeforeSendSpanCallback } from './tracing/spans/beforeSendSpan';\nimport type { LegacyCSPReport } from './types/csp';\nimport type { DsnComponents } from './types/dsn';\nimport type {\n DynamicSamplingContext,\n EventEnvelope,\n EventItem,\n RawSecurityEnvelope,\n RawSecurityItem,\n SessionEnvelope,\n SessionItem,\n SpanEnvelope,\n SpanItem,\n} from './types/envelope';\nimport type { Event } from './types/event';\nimport type { SdkInfo } from './types/sdkinfo';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport type { Session, SessionAggregates } from './types/session';\nimport { dsnToString } from './utils/dsn';\nimport {\n createEnvelope,\n createEventEnvelopeHeaders,\n createSpanEnvelopeItem,\n getSdkMetadataForEnvelopeHeader,\n} from './utils/envelope';\nimport { uuid4 } from './utils/misc';\nimport { safeDateNow } from './utils/randomSafeContext';\nimport { shouldIgnoreSpan } from './utils/should-ignore-span';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n *\n * @internal, exported only for testing\n **/\nexport function _enhanceEventWithSdkInfo(event: Event, newSdkInfo?: SdkInfo): Event {\n if (!newSdkInfo) {\n return event;\n }\n\n const eventSdkInfo = event.sdk || {};\n\n event.sdk = {\n ...eventSdkInfo,\n name: eventSdkInfo.name || newSdkInfo.name,\n version: eventSdkInfo.version || newSdkInfo.version,\n integrations: [...(event.sdk?.integrations || []), ...(newSdkInfo.integrations || [])],\n packages: [...(event.sdk?.packages || []), ...(newSdkInfo.packages || [])],\n settings:\n event.sdk?.settings || newSdkInfo.settings\n ? {\n ...event.sdk?.settings,\n ...newSdkInfo.settings,\n }\n : undefined,\n };\n\n return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n session: Session | SessionAggregates,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): SessionEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date(safeDateNow()).toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem: SessionItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n event: Event,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): EventEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n /*\n Note: Due to TS, event.type may be `replay_event`, theoretically.\n In practice, we never call `createEventEnvelope` with `replay_event` type,\n and we'd have to adjust a looot of types to make this work properly.\n We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n So the safe choice is to really guard against the replay_event type here.\n */\n const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n _enhanceEventWithSdkInfo(event, metadata?.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem: EventItem = [{ type: eventType }, event];\n return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n function dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n }\n\n // For the moment we'll obtain the DSC from the first span in the array\n // This might need to be changed if we permit sending multiple spans from\n // different segments in one envelope\n const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n const dsn = client?.getDsn();\n const tunnel = client?.getOptions().tunnel;\n\n const headers: SpanEnvelope[0] = {\n sent_at: new Date(safeDateNow()).toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const { beforeSendSpan, ignoreSpans } = client?.getOptions() || {};\n\n const filteredSpans = ignoreSpans?.length\n ? spans.filter(span => {\n const json = spanToJSON(span);\n return !shouldIgnoreSpan({ description: json.description, op: json.op, attributes: json.data }, ignoreSpans);\n })\n : spans;\n const droppedSpans = spans.length - filteredSpans.length;\n\n if (droppedSpans) {\n client?.recordDroppedEvent('before_send', 'span', droppedSpans);\n }\n\n const convertToSpanJSON = beforeSendSpan\n ? (span: SentrySpan) => {\n const spanJson = spanToJSON(span);\n const processedSpan = !isStreamedBeforeSendSpanCallback(beforeSendSpan) ? beforeSendSpan(spanJson) : spanJson;\n\n if (!processedSpan) {\n showSpanDropWarning();\n return spanJson;\n }\n\n return processedSpan;\n }\n : spanToJSON;\n\n const items: SpanItem[] = [];\n for (const span of filteredSpans) {\n const spanJson = convertToSpanJSON(span);\n if (spanJson) {\n items.push(createSpanEnvelopeItem(spanJson));\n }\n }\n\n return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n report: LegacyCSPReport,\n dsn: DsnComponents,\n tunnel?: string,\n release?: string,\n environment?: string,\n): RawSecurityEnvelope {\n const envelopeHeaders = {\n event_id: uuid4(),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const eventItem: RawSecurityItem = [\n { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n report,\n ];\n\n return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n"],"names":["dsn","getSdkMetadataForEnvelopeHeader","safeDateNow","dsnToString","createEnvelope","createEventEnvelopeHeaders","dsc","getDynamicSamplingContextFromSpan","beforeSendSpan","spanToJSON","shouldIgnoreSpan","isStreamedBeforeSendSpanCallback","showSpanDropWarning","createSpanEnvelopeItem"],"mappings":"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"}

@@ -5,2 +5,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const debugBuild = require('../../debug-build.js');
const randomSafeContext = require('../../utils/randomSafeContext.js');
const timer = require('../../utils/timer.js');

@@ -21,3 +22,3 @@

debugBuild.DEBUG_BUILD && debugLogger.debug.log(`Recorded request session with status: ${requestSession.status}`);
const roundedDate = /* @__PURE__ */ new Date();
const roundedDate = new Date(randomSafeContext.safeDateNow());
roundedDate.setSeconds(0, 0);

@@ -24,0 +25,0 @@ const dateBucketKey = roundedDate.toISOString();

@@ -1,1 +0,1 @@

{"version":3,"file":"record-request-session.js","sources":["../../../../src/integrations/http/record-request-session.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport { debug } from '../../utils/debug-logger';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type { Scope } from '../../scope';\nimport type { HttpServerResponse } from './types';\nimport type { AggregationCounts } from '../../types/session';\nimport { safeUnref } from '../../utils/timer';\n\nconst clientToRequestSessionAggregatesMap = new WeakMap<\n Client,\n { [timestampRoundedToSeconds: string]: { exited: number; crashed: number; errored: number } }\n>();\n\n/**\n * Starts a session and tracks it in the context of a given isolation scope.\n * When the passed response is finished, the session is put into a task and\n * is aggregated with other sessions that may happen in a certain time window\n * (sessionFlushingDelayMs).\n *\n * The sessions are always aggregated by the client that is on the current\n * scope at the time of ending the response (if there is one).\n */\nexport function recordRequestSession(\n client: Client,\n {\n requestIsolationScope,\n response,\n sessionFlushingDelayMS,\n }: {\n requestIsolationScope: Scope;\n response: HttpServerResponse;\n sessionFlushingDelayMS?: number;\n },\n): void {\n requestIsolationScope.setSDKProcessingMetadata({\n requestSession: { status: 'ok' },\n });\n\n response.once('close', () => {\n const requestSession = requestIsolationScope.getScopeData().sdkProcessingMetadata.requestSession;\n\n if (client && requestSession) {\n DEBUG_BUILD && debug.log(`Recorded request session with status: ${requestSession.status}`);\n\n const roundedDate = new Date();\n roundedDate.setSeconds(0, 0);\n const dateBucketKey = roundedDate.toISOString();\n\n const existingClientAggregate = clientToRequestSessionAggregatesMap.get(client);\n const bucket = existingClientAggregate?.[dateBucketKey] || { exited: 0, crashed: 0, errored: 0 };\n bucket[({ ok: 'exited', crashed: 'crashed', errored: 'errored' } as const)[requestSession.status]]++;\n\n if (existingClientAggregate) {\n existingClientAggregate[dateBucketKey] = bucket;\n } else {\n DEBUG_BUILD && debug.log('Opened new request session aggregate.');\n const newClientAggregate = { [dateBucketKey]: bucket };\n clientToRequestSessionAggregatesMap.set(client, newClientAggregate);\n\n const flushPendingClientAggregates = (): void => {\n clearTimeout(timeout);\n unregisterClientFlushHook();\n clientToRequestSessionAggregatesMap.delete(client);\n\n const aggregatePayload: AggregationCounts[] = Object.entries(newClientAggregate).map(\n ([timestamp, value]) => ({\n started: timestamp,\n exited: value.exited,\n errored: value.errored,\n crashed: value.crashed,\n }),\n );\n client.sendSession({ aggregates: aggregatePayload });\n };\n\n const unregisterClientFlushHook = client.on('flush', () => {\n DEBUG_BUILD && debug.log('Sending request session aggregate due to client flush');\n flushPendingClientAggregates();\n });\n const timeout = setTimeout(() => {\n DEBUG_BUILD && debug.log('Sending request session aggregate due to flushing schedule');\n flushPendingClientAggregates();\n }, sessionFlushingDelayMS);\n safeUnref(timeout);\n }\n }\n });\n}\n"],"names":["DEBUG_BUILD","debug","safeUnref"],"mappings":";;;;;;AAQA,MAAM,mCAAA,uBAA0C,OAAA,EAG9C;AAWK,SAAS,qBACd,MAAA,EACA;AAAA,EACE,qBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKM;AACN,EAAA,qBAAA,CAAsB,wBAAA,CAAyB;AAAA,IAC7C,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA;AAAK,GAChC,CAAA;AAED,EAAA,QAAA,CAAS,IAAA,CAAK,SAAS,MAAM;AAC3B,IAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,YAAA,EAAa,CAAE,qBAAA,CAAsB,cAAA;AAElF,IAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,MAAAA,sBAAA,IAAeC,iBAAA,CAAM,GAAA,CAAI,CAAA,sCAAA,EAAyC,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAEzF,MAAA,MAAM,WAAA,uBAAkB,IAAA,EAAK;AAC7B,MAAA,WAAA,CAAY,UAAA,CAAW,GAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,aAAA,GAAgB,YAAY,WAAA,EAAY;AAE9C,MAAA,MAAM,uBAAA,GAA0B,mCAAA,CAAoC,GAAA,CAAI,MAAM,CAAA;AAC9E,MAAA,MAAM,MAAA,GAAS,uBAAA,GAA0B,aAAa,CAAA,IAAK,EAAE,QAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAC/F,MAAA,MAAA,CAAQ,EAAE,EAAA,EAAI,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,SAAS,SAAA,EAAU,CAAY,cAAA,CAAe,MAAM,CAAC,CAAA,EAAA;AAEjG,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,uBAAA,CAAwB,aAAa,CAAA,GAAI,MAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAAD,sBAAA,IAAeC,iBAAA,CAAM,IAAI,uCAAuC,CAAA;AAChE,QAAA,MAAM,kBAAA,GAAqB,EAAE,CAAC,aAAa,GAAG,MAAA,EAAO;AACrD,QAAA,mCAAA,CAAoC,GAAA,CAAI,QAAQ,kBAAkB,CAAA;AAElE,QAAA,MAAM,+BAA+B,MAAY;AAC/C,UAAA,YAAA,CAAa,OAAO,CAAA;AACpB,UAAA,yBAAA,EAA0B;AAC1B,UAAA,mCAAA,CAAoC,OAAO,MAAM,CAAA;AAEjD,UAAA,MAAM,gBAAA,GAAwC,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,CAAE,GAAA;AAAA,YAC/E,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,cACvB,OAAA,EAAS,SAAA;AAAA,cACT,QAAQ,KAAA,CAAM,MAAA;AAAA,cACd,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,SAAS,KAAA,CAAM;AAAA,aACjB;AAAA,WACF;AACA,UAAA,MAAA,CAAO,WAAA,CAAY,EAAE,UAAA,EAAY,gBAAA,EAAkB,CAAA;AAAA,QACrD,CAAA;AAEA,QAAA,MAAM,yBAAA,GAA4B,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM;AACzD,UAAAD,sBAAA,IAAeC,iBAAA,CAAM,IAAI,uDAAuD,CAAA;AAChF,UAAA,4BAAA,EAA6B;AAAA,QAC/B,CAAC,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,UAAAD,sBAAA,IAAeC,iBAAA,CAAM,IAAI,4DAA4D,CAAA;AACrF,UAAA,4BAAA,EAA6B;AAAA,QAC/B,GAAG,sBAAsB,CAAA;AACzB,QAAAC,eAAA,CAAU,OAAO,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;;;;"}
{"version":3,"file":"record-request-session.js","sources":["../../../../src/integrations/http/record-request-session.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport { debug } from '../../utils/debug-logger';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type { Scope } from '../../scope';\nimport type { HttpServerResponse } from './types';\nimport type { AggregationCounts } from '../../types/session';\nimport { safeDateNow } from '../../utils/randomSafeContext';\nimport { safeUnref } from '../../utils/timer';\n\nconst clientToRequestSessionAggregatesMap = new WeakMap<\n Client,\n { [timestampRoundedToSeconds: string]: { exited: number; crashed: number; errored: number } }\n>();\n\n/**\n * Starts a session and tracks it in the context of a given isolation scope.\n * When the passed response is finished, the session is put into a task and\n * is aggregated with other sessions that may happen in a certain time window\n * (sessionFlushingDelayMs).\n *\n * The sessions are always aggregated by the client that is on the current\n * scope at the time of ending the response (if there is one).\n */\nexport function recordRequestSession(\n client: Client,\n {\n requestIsolationScope,\n response,\n sessionFlushingDelayMS,\n }: {\n requestIsolationScope: Scope;\n response: HttpServerResponse;\n sessionFlushingDelayMS?: number;\n },\n): void {\n requestIsolationScope.setSDKProcessingMetadata({\n requestSession: { status: 'ok' },\n });\n\n response.once('close', () => {\n const requestSession = requestIsolationScope.getScopeData().sdkProcessingMetadata.requestSession;\n\n if (client && requestSession) {\n DEBUG_BUILD && debug.log(`Recorded request session with status: ${requestSession.status}`);\n\n const roundedDate = new Date(safeDateNow());\n roundedDate.setSeconds(0, 0);\n const dateBucketKey = roundedDate.toISOString();\n\n const existingClientAggregate = clientToRequestSessionAggregatesMap.get(client);\n const bucket = existingClientAggregate?.[dateBucketKey] || { exited: 0, crashed: 0, errored: 0 };\n bucket[({ ok: 'exited', crashed: 'crashed', errored: 'errored' } as const)[requestSession.status]]++;\n\n if (existingClientAggregate) {\n existingClientAggregate[dateBucketKey] = bucket;\n } else {\n DEBUG_BUILD && debug.log('Opened new request session aggregate.');\n const newClientAggregate = { [dateBucketKey]: bucket };\n clientToRequestSessionAggregatesMap.set(client, newClientAggregate);\n\n const flushPendingClientAggregates = (): void => {\n clearTimeout(timeout);\n unregisterClientFlushHook();\n clientToRequestSessionAggregatesMap.delete(client);\n\n const aggregatePayload: AggregationCounts[] = Object.entries(newClientAggregate).map(\n ([timestamp, value]) => ({\n started: timestamp,\n exited: value.exited,\n errored: value.errored,\n crashed: value.crashed,\n }),\n );\n client.sendSession({ aggregates: aggregatePayload });\n };\n\n const unregisterClientFlushHook = client.on('flush', () => {\n DEBUG_BUILD && debug.log('Sending request session aggregate due to client flush');\n flushPendingClientAggregates();\n });\n const timeout = setTimeout(() => {\n DEBUG_BUILD && debug.log('Sending request session aggregate due to flushing schedule');\n flushPendingClientAggregates();\n }, sessionFlushingDelayMS);\n safeUnref(timeout);\n }\n }\n });\n}\n"],"names":["DEBUG_BUILD","debug","safeDateNow","safeUnref"],"mappings":";;;;;;;AASA,MAAM,mCAAA,uBAA0C,OAAA,EAG9C;AAWK,SAAS,qBACd,MAAA,EACA;AAAA,EACE,qBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKM;AACN,EAAA,qBAAA,CAAsB,wBAAA,CAAyB;AAAA,IAC7C,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA;AAAK,GAChC,CAAA;AAED,EAAA,QAAA,CAAS,IAAA,CAAK,SAAS,MAAM;AAC3B,IAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,YAAA,EAAa,CAAE,qBAAA,CAAsB,cAAA;AAElF,IAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,MAAAA,sBAAA,IAAeC,iBAAA,CAAM,GAAA,CAAI,CAAA,sCAAA,EAAyC,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAEzF,MAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAKC,6BAAA,EAAa,CAAA;AAC1C,MAAA,WAAA,CAAY,UAAA,CAAW,GAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,aAAA,GAAgB,YAAY,WAAA,EAAY;AAE9C,MAAA,MAAM,uBAAA,GAA0B,mCAAA,CAAoC,GAAA,CAAI,MAAM,CAAA;AAC9E,MAAA,MAAM,MAAA,GAAS,uBAAA,GAA0B,aAAa,CAAA,IAAK,EAAE,QAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAC/F,MAAA,MAAA,CAAQ,EAAE,EAAA,EAAI,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,SAAS,SAAA,EAAU,CAAY,cAAA,CAAe,MAAM,CAAC,CAAA,EAAA;AAEjG,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,uBAAA,CAAwB,aAAa,CAAA,GAAI,MAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAAF,sBAAA,IAAeC,iBAAA,CAAM,IAAI,uCAAuC,CAAA;AAChE,QAAA,MAAM,kBAAA,GAAqB,EAAE,CAAC,aAAa,GAAG,MAAA,EAAO;AACrD,QAAA,mCAAA,CAAoC,GAAA,CAAI,QAAQ,kBAAkB,CAAA;AAElE,QAAA,MAAM,+BAA+B,MAAY;AAC/C,UAAA,YAAA,CAAa,OAAO,CAAA;AACpB,UAAA,yBAAA,EAA0B;AAC1B,UAAA,mCAAA,CAAoC,OAAO,MAAM,CAAA;AAEjD,UAAA,MAAM,gBAAA,GAAwC,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,CAAE,GAAA;AAAA,YAC/E,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,cACvB,OAAA,EAAS,SAAA;AAAA,cACT,QAAQ,KAAA,CAAM,MAAA;AAAA,cACd,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,SAAS,KAAA,CAAM;AAAA,aACjB;AAAA,WACF;AACA,UAAA,MAAA,CAAO,WAAA,CAAY,EAAE,UAAA,EAAY,gBAAA,EAAkB,CAAA;AAAA,QACrD,CAAA;AAEA,QAAA,MAAM,yBAAA,GAA4B,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM;AACzD,UAAAD,sBAAA,IAAeC,iBAAA,CAAM,IAAI,uDAAuD,CAAA;AAChF,UAAA,4BAAA,EAA6B;AAAA,QAC/B,CAAC,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,UAAAD,sBAAA,IAAeC,iBAAA,CAAM,IAAI,4DAA4D,CAAA;AACrF,UAAA,4BAAA,EAA6B;AAAA,QAC/B,GAAG,sBAAsB,CAAA;AACzB,QAAAE,eAAA,CAAU,OAAO,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;;;;"}

@@ -94,3 +94,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const wrappedHandle = async function(...args) {
if (!_shouldCreateSpans(options)) {
if (this.executed || !_shouldCreateSpans(options)) {
return originalHandle.apply(this, args);

@@ -97,0 +97,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"postgresjs.js","sources":["../../../src/integrations/postgresjs.ts"],"sourcesContent":["// Portable instrumentation for https://github.com/porsager/postgres\n// This can be used in any environment (Node.js, Cloudflare Workers, etc.)\n// without depending on OpenTelemetry module hooking.\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes';\nimport { SPAN_STATUS_ERROR, startSpanManual } from '../tracing';\nimport type { Span } from '../types/span';\nimport { debug } from '../utils/debug-logger';\nimport { getActiveSpan } from '../utils/spanUtils';\n\nconst SQL_OPERATION_REGEX = /^(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER)/i;\n\ntype PostgresConnectionContext = {\n ATTR_DB_NAMESPACE?: string;\n ATTR_SERVER_ADDRESS?: string;\n ATTR_SERVER_PORT?: string;\n};\n\ninterface PostgresJsSqlInstrumentationOptions {\n /**\n * Whether to require a parent span for the instrumentation.\n * If set to true, the instrumentation will only create spans if there is a parent span\n * available in the current scope.\n * @default true\n */\n requireParentSpan?: boolean;\n /**\n * Hook to modify the span before it is started.\n * This can be used to set additional attributes or modify the span in any way.\n */\n requestHook?: (span: Span, sanitizedSqlQuery: string, postgresConnectionContext?: PostgresConnectionContext) => void;\n}\n\nconst CONNECTION_CONTEXT_SYMBOL = Symbol('sentryPostgresConnectionContext');\n\n// Use the same Symbol.for() markers as the Node.js OTel instrumentation\n// so that both approaches recognize each other and prevent double-wrapping.\nconst INSTRUMENTED_MARKER = Symbol.for('sentry.instrumented.postgresjs');\n// Marker to track if a query was created from an instrumented sql instance.\n// This prevents double-spanning when both the wrapper and the Node.js Query.prototype\n// fallback patch are active simultaneously.\nconst QUERY_FROM_INSTRUMENTED_SQL = Symbol.for('sentry.query.from.instrumented.sql');\n\n/**\n * Instruments a postgres.js `sql` instance with Sentry tracing.\n *\n * This is a portable instrumentation function that works in any environment\n * (Node.js, Cloudflare Workers, etc.) without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import postgres from 'postgres';\n * import * as Sentry from '@sentry/cloudflare'; // or '@sentry/deno'\n *\n * const sql = Sentry.instrumentPostgresJsSql(\n * postgres({ host: 'localhost', database: 'mydb' })\n * );\n *\n * // All queries now create Sentry spans\n * await sql`SELECT * FROM users WHERE id = ${userId}`;\n * ```\n */\nexport function instrumentPostgresJsSql<T>(sql: T, options?: PostgresJsSqlInstrumentationOptions): T {\n if (!sql || typeof sql !== 'function') {\n DEBUG_BUILD && debug.warn('instrumentPostgresJsSql: provided value is not a valid postgres.js sql instance');\n return sql;\n }\n\n return _instrumentSqlInstance(sql, { requireParentSpan: true, ...options }) as T;\n}\n\n/**\n * Instruments a sql instance by wrapping its query execution methods.\n */\nfunction _instrumentSqlInstance(\n sql: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n parentConnectionContext?: PostgresConnectionContext,\n): unknown {\n // Check if already instrumented to prevent double-wrapping\n // Using Symbol.for() ensures the marker survives proxying\n if ((sql as Record<symbol, unknown>)[INSTRUMENTED_MARKER]) {\n return sql;\n }\n\n // Wrap the sql function to intercept query creation\n const proxiedSql: unknown = new Proxy(sql as (...args: unknown[]) => unknown, {\n apply(target, thisArg, argumentsList: unknown[]) {\n const query = Reflect.apply(target, thisArg, argumentsList);\n\n if (query && typeof query === 'object' && 'handle' in query) {\n _wrapSingleQueryHandle(query as { handle: unknown; strings?: string[] }, proxiedSql, options);\n }\n\n return query;\n },\n get(target, prop) {\n const original = (target as unknown as Record<string | symbol, unknown>)[prop];\n\n if (typeof prop !== 'string' || typeof original !== 'function') {\n return original;\n }\n\n // Wrap methods that return PendingQuery objects (unsafe, file)\n if (prop === 'unsafe' || prop === 'file') {\n return _wrapQueryMethod(original as (...args: unknown[]) => unknown, target, proxiedSql, options);\n }\n\n // Wrap begin and reserve (not savepoint to avoid duplicate spans)\n if (prop === 'begin' || prop === 'reserve') {\n return _wrapCallbackMethod(original as (...args: unknown[]) => unknown, target, proxiedSql, options);\n }\n\n return original;\n },\n });\n\n // Use provided parent context if available, otherwise extract from sql.options\n if (parentConnectionContext) {\n (proxiedSql as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] = parentConnectionContext;\n } else {\n _attachConnectionContext(sql, proxiedSql as Record<symbol, unknown>);\n }\n\n // Mark both the original and proxy as instrumented to prevent double-wrapping\n (sql as Record<symbol, unknown>)[INSTRUMENTED_MARKER] = true;\n (proxiedSql as Record<symbol, unknown>)[INSTRUMENTED_MARKER] = true;\n\n return proxiedSql;\n}\n\n/**\n * Wraps query-returning methods (unsafe, file) to ensure their queries are instrumented.\n */\nfunction _wrapQueryMethod(\n original: (...args: unknown[]) => unknown,\n target: unknown,\n proxiedSql: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): (...args: unknown[]) => unknown {\n return function (this: unknown, ...args: unknown[]): unknown {\n const query = Reflect.apply(original, target, args);\n\n if (query && typeof query === 'object' && 'handle' in query) {\n _wrapSingleQueryHandle(query as { handle: unknown; strings?: string[] }, proxiedSql, options);\n }\n\n return query;\n };\n}\n\n/**\n * Wraps callback-based methods (begin, reserve) to recursively instrument Sql instances.\n * Note: These methods can also be used as tagged templates, which we pass through unchanged.\n *\n * Savepoint is not wrapped to avoid complex nested transaction instrumentation issues.\n * Queries within savepoint callbacks are still instrumented through the parent transaction's Sql instance.\n */\nfunction _wrapCallbackMethod(\n original: (...args: unknown[]) => unknown,\n target: unknown,\n parentSqlInstance: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): (...args: unknown[]) => unknown {\n return function (this: unknown, ...args: unknown[]): unknown {\n // Extract parent context to propagate to child instances\n const parentContext = (parentSqlInstance as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] as\n | PostgresConnectionContext\n | undefined;\n\n // Check if this is a callback-based call by verifying the last argument is a function\n const isCallbackBased = typeof args[args.length - 1] === 'function';\n\n if (!isCallbackBased) {\n // Not a callback-based call - could be tagged template or promise-based\n const result = Reflect.apply(original, target, args);\n // If result is a Promise (e.g., reserve() without callback), instrument the resolved Sql instance\n if (result && typeof (result as Promise<unknown>).then === 'function') {\n return (result as Promise<unknown>).then((sqlInstance: unknown) => {\n return _instrumentSqlInstance(sqlInstance, options, parentContext);\n });\n }\n return result;\n }\n\n // Callback-based call: wrap the callback to instrument the Sql instance\n const callback = (args.length === 1 ? args[0] : args[1]) as (sql: unknown) => unknown;\n const wrappedCallback = function (sqlInstance: unknown): unknown {\n const instrumentedSql = _instrumentSqlInstance(sqlInstance, options, parentContext);\n return callback(instrumentedSql);\n };\n\n const newArgs = args.length === 1 ? [wrappedCallback] : [args[0], wrappedCallback];\n return Reflect.apply(original, target, newArgs);\n };\n}\n\n/**\n * Wraps a single query's handle method to create spans.\n */\nfunction _wrapSingleQueryHandle(\n query: { handle: unknown; strings?: string[]; __sentryWrapped?: boolean },\n sqlInstance: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): void {\n // Prevent double wrapping - check if the handle itself is already wrapped\n if ((query.handle as { __sentryWrapped?: boolean })?.__sentryWrapped) {\n return;\n }\n\n // Mark this query as coming from an instrumented sql instance.\n // This prevents the Node.js Query.prototype fallback patch from double-spanning.\n (query as Record<symbol, unknown>)[QUERY_FROM_INSTRUMENTED_SQL] = true;\n\n const originalHandle = query.handle as (...args: unknown[]) => Promise<unknown>;\n\n // IMPORTANT: We must replace the handle function directly, not use a Proxy,\n // because Query.then() internally calls this.handle(), which would bypass a Proxy wrapper.\n const wrappedHandle = async function (this: unknown, ...args: unknown[]): Promise<unknown> {\n if (!_shouldCreateSpans(options)) {\n return originalHandle.apply(this, args);\n }\n\n const fullQuery = _reconstructQuery(query.strings);\n const sanitizedSqlQuery = _sanitizeSqlQuery(fullQuery);\n\n return startSpanManual(\n {\n name: sanitizedSqlQuery || 'postgresjs.query',\n op: 'db',\n },\n (span: Span) => {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, 'auto.db.postgresjs');\n\n span.setAttributes({\n 'db.system.name': 'postgres',\n 'db.query.text': sanitizedSqlQuery,\n });\n\n const connectionContext = sqlInstance\n ? ((sqlInstance as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] as\n | PostgresConnectionContext\n | undefined)\n : undefined;\n\n _setConnectionAttributes(span, connectionContext);\n\n if (options.requestHook) {\n try {\n options.requestHook(span, sanitizedSqlQuery, connectionContext);\n } catch (e) {\n span.setAttribute('sentry.hook.error', 'requestHook failed');\n DEBUG_BUILD && debug.error('Error in requestHook for PostgresJs instrumentation:', e);\n }\n }\n\n const queryWithCallbacks = this as {\n resolve: unknown;\n reject: unknown;\n };\n\n queryWithCallbacks.resolve = new Proxy(queryWithCallbacks.resolve as (...args: unknown[]) => unknown, {\n apply: (resolveTarget, resolveThisArg, resolveArgs: [{ command?: string }]) => {\n try {\n _setOperationName(span, sanitizedSqlQuery, resolveArgs?.[0]?.command);\n span.end();\n } catch (e) {\n DEBUG_BUILD && debug.error('Error ending span in resolve callback:', e);\n }\n\n return Reflect.apply(resolveTarget, resolveThisArg, resolveArgs);\n },\n });\n\n queryWithCallbacks.reject = new Proxy(queryWithCallbacks.reject as (...args: unknown[]) => unknown, {\n apply: (rejectTarget, rejectThisArg, rejectArgs: { message?: string; code?: string; name?: string }[]) => {\n try {\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: rejectArgs?.[0]?.message || 'unknown_error',\n });\n\n span.setAttribute('db.response.status_code', rejectArgs?.[0]?.code || 'unknown');\n span.setAttribute('error.type', rejectArgs?.[0]?.name || 'unknown');\n\n _setOperationName(span, sanitizedSqlQuery);\n span.end();\n } catch (e) {\n DEBUG_BUILD && debug.error('Error ending span in reject callback:', e);\n }\n return Reflect.apply(rejectTarget, rejectThisArg, rejectArgs);\n },\n });\n\n // Handle synchronous errors that might occur before promise is created\n try {\n return originalHandle.apply(this, args);\n } catch (e) {\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: e instanceof Error ? e.message : 'unknown_error',\n });\n span.end();\n throw e;\n }\n },\n );\n };\n\n (wrappedHandle as { __sentryWrapped?: boolean }).__sentryWrapped = true;\n query.handle = wrappedHandle;\n}\n\n/**\n * Determines whether a span should be created based on the current context.\n * If `requireParentSpan` is set to true in the options, a span will\n * only be created if there is a parent span available.\n */\nfunction _shouldCreateSpans(options: PostgresJsSqlInstrumentationOptions): boolean {\n const hasParentSpan = getActiveSpan() !== undefined;\n return hasParentSpan || !options.requireParentSpan;\n}\n\n/**\n * Reconstructs the full SQL query from template strings with PostgreSQL placeholders.\n *\n * For sql`SELECT * FROM users WHERE id = ${123} AND name = ${'foo'}`:\n * strings = [\"SELECT * FROM users WHERE id = \", \" AND name = \", \"\"]\n * returns: \"SELECT * FROM users WHERE id = $1 AND name = $2\"\n *\n * @internal Exported for testing only\n */\nexport function _reconstructQuery(strings: string[] | undefined): string | undefined {\n if (!strings?.length) {\n return undefined;\n }\n if (strings.length === 1) {\n return strings[0] || undefined;\n }\n // Join template parts with PostgreSQL placeholders ($1, $2, etc.)\n return strings.reduce((acc, str, i) => (i === 0 ? str : `${acc}$${i}${str}`), '');\n}\n\nlet integerLiteralRE: RegExp | undefined;\n\n/**\n * Sanitize SQL query as per the OTEL semantic conventions\n * https://opentelemetry.io/docs/specs/semconv/database/database-spans/#sanitization-of-dbquerytext\n *\n * PostgreSQL $n placeholders are preserved per OTEL spec - they're parameterized queries,\n * not sensitive literals. Only actual values (strings, numbers, booleans) are sanitized.\n *\n * @internal Exported for testing only\n */\nexport function _sanitizeSqlQuery(sqlQuery: string | undefined): string {\n if (!sqlQuery) {\n return 'Unknown SQL Query';\n }\n\n // Lazy init: constructing this at module scope would evaluate the lookbehind\n // on import and crash Safari <16.4 browser bundles that reach this file via\n // the core barrel. Building it on first call keeps the cost off the import path.\n if (!integerLiteralRE) {\n integerLiteralRE = new RegExp('(?<!\\\\$)-?\\\\b\\\\d+\\\\b', 'g');\n }\n\n return (\n sqlQuery\n // Remove comments first (they may contain newlines and extra spaces)\n .replace(/--.*$/gm, '') // Single line comments (multiline mode)\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Multi-line comments\n .replace(/;\\s*$/, '') // Remove trailing semicolons\n // Collapse whitespace to a single space (after removing comments)\n .replace(/\\s+/g, ' ')\n .trim() // Remove extra spaces and trim\n // Sanitize hex/binary literals before string literals\n .replace(/\\bX'[0-9A-Fa-f]*'/gi, '?') // Hex string literals\n .replace(/\\bB'[01]*'/gi, '?') // Binary string literals\n // Sanitize string literals (handles escaped quotes)\n .replace(/'(?:[^']|'')*'/g, '?')\n // Sanitize hex numbers\n .replace(/\\b0x[0-9A-Fa-f]+/gi, '?')\n // Sanitize boolean literals\n .replace(/\\b(?:TRUE|FALSE)\\b/gi, '?')\n // Sanitize numeric literals (preserve $n placeholders via negative lookbehind)\n .replace(/-?\\b\\d+\\.?\\d*[eE][+-]?\\d+\\b/g, '?') // Scientific notation\n .replace(/-?\\b\\d+\\.\\d+\\b/g, '?') // Decimals\n .replace(/-?\\.\\d+\\b/g, '?') // Decimals starting with dot\n .replace(integerLiteralRE, '?') // Integers (NOT $n placeholders)\n // Collapse IN clauses for cardinality (both ? and $n variants)\n .replace(/\\bIN\\b\\s*\\(\\s*\\?(?:\\s*,\\s*\\?)*\\s*\\)/gi, 'IN (?)')\n .replace(/\\bIN\\b\\s*\\(\\s*\\$\\d+(?:\\s*,\\s*\\$\\d+)*\\s*\\)/gi, 'IN ($?)')\n );\n}\n\n/**\n * Sets connection context attributes on a span.\n */\nfunction _setConnectionAttributes(span: Span, connectionContext: PostgresConnectionContext | undefined): void {\n if (!connectionContext) {\n return;\n }\n if (connectionContext.ATTR_DB_NAMESPACE) {\n span.setAttribute('db.namespace', connectionContext.ATTR_DB_NAMESPACE);\n }\n if (connectionContext.ATTR_SERVER_ADDRESS) {\n span.setAttribute('server.address', connectionContext.ATTR_SERVER_ADDRESS);\n }\n if (connectionContext.ATTR_SERVER_PORT !== undefined) {\n // Port is stored as string in PostgresConnectionContext for requestHook backwards compatibility,\n // but semantic conventions expect port as a number for span attributes\n const portNumber = parseInt(connectionContext.ATTR_SERVER_PORT, 10);\n if (!isNaN(portNumber)) {\n span.setAttribute('server.port', portNumber);\n }\n }\n}\n\n/**\n * Extracts DB operation name from SQL query and sets it on the span.\n */\nfunction _setOperationName(span: Span, sanitizedQuery: string | undefined, command?: string): void {\n if (command) {\n span.setAttribute('db.operation.name', command);\n return;\n }\n // Fallback: extract operation from the SQL query\n const operationMatch = sanitizedQuery?.match(SQL_OPERATION_REGEX);\n if (operationMatch?.[1]) {\n span.setAttribute('db.operation.name', operationMatch[1].toUpperCase());\n }\n}\n\n/**\n * Extracts and stores connection context from sql.options.\n */\nfunction _attachConnectionContext(sql: unknown, proxiedSql: Record<symbol, unknown>): void {\n const sqlInstance = sql as { options?: { host?: string[]; port?: number[]; database?: string } };\n if (!sqlInstance.options || typeof sqlInstance.options !== 'object') {\n return;\n }\n\n const opts = sqlInstance.options;\n // postgres.js stores parsed options with host and port as arrays\n // The library defaults to 'localhost' and 5432 if not specified, but we're defensive here\n const host = opts.host?.[0] || 'localhost';\n const port = opts.port?.[0] || 5432;\n\n const connectionContext: PostgresConnectionContext = {\n ATTR_DB_NAMESPACE: typeof opts.database === 'string' && opts.database !== '' ? opts.database : undefined,\n ATTR_SERVER_ADDRESS: host,\n ATTR_SERVER_PORT: String(port),\n };\n\n proxiedSql[CONNECTION_CONTEXT_SYMBOL] = connectionContext;\n}\n"],"names":["DEBUG_BUILD","debug","startSpanManual","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SPAN_STATUS_ERROR","getActiveSpan"],"mappings":";;;;;;;;;AAWA,MAAM,mBAAA,GAAsB,mDAAA;AAuB5B,MAAM,yBAAA,0BAAmC,iCAAiC,CAAA;AAI1E,MAAM,mBAAA,mBAAsB,MAAA,CAAO,GAAA,CAAI,gCAAgC,CAAA;AAIvE,MAAM,2BAAA,mBAA8B,MAAA,CAAO,GAAA,CAAI,oCAAoC,CAAA;AAqB5E,SAAS,uBAAA,CAA2B,KAAQ,OAAA,EAAkD;AACnG,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAA,EAAY;AACrC,IAAAA,sBAAA,IAAeC,iBAAA,CAAM,KAAK,iFAAiF,CAAA;AAC3G,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,uBAAuB,GAAA,EAAK,EAAE,mBAAmB,IAAA,EAAM,GAAG,SAAS,CAAA;AAC5E;AAKA,SAAS,sBAAA,CACP,GAAA,EACA,OAAA,EACA,uBAAA,EACS;AAGT,EAAA,IAAK,GAAA,CAAgC,mBAAmB,CAAA,EAAG;AACzD,IAAA,OAAO,GAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAsB,IAAI,KAAA,CAAM,GAAA,EAAwC;AAAA,IAC5E,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAS,aAAA,EAA0B;AAC/C,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,aAAa,CAAA;AAE1D,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,YAAY,KAAA,EAAO;AAC3D,QAAA,sBAAA,CAAuB,KAAA,EAAkD,YAAY,OAAO,CAAA;AAAA,MAC9F;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,QAAA,GAAY,OAAuD,IAAI,CAAA;AAE7E,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,aAAa,UAAA,EAAY;AAC9D,QAAA,OAAO,QAAA;AAAA,MACT;AAGA,MAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,MAAA,EAAQ;AACxC,QAAA,OAAO,gBAAA,CAAiB,QAAA,EAA6C,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AAAA,MAClG;AAGA,MAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,SAAA,EAAW;AAC1C,QAAA,OAAO,mBAAA,CAAoB,QAAA,EAA6C,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AAAA,MACrG;AAEA,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,uBAAA,EAAyB;AAC3B,IAAC,UAAA,CAAuC,yBAAyB,CAAA,GAAI,uBAAA;AAAA,EACvE,CAAA,MAAO;AACL,IAAA,wBAAA,CAAyB,KAAK,UAAqC,CAAA;AAAA,EACrE;AAGA,EAAC,GAAA,CAAgC,mBAAmB,CAAA,GAAI,IAAA;AACxD,EAAC,UAAA,CAAuC,mBAAmB,CAAA,GAAI,IAAA;AAE/D,EAAA,OAAO,UAAA;AACT;AAKA,SAAS,gBAAA,CACP,QAAA,EACA,MAAA,EACA,UAAA,EACA,OAAA,EACiC;AACjC,EAAA,OAAO,YAA4B,IAAA,EAA0B;AAC3D,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AAElD,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,YAAY,KAAA,EAAO;AAC3D,MAAA,sBAAA,CAAuB,KAAA,EAAkD,YAAY,OAAO,CAAA;AAAA,IAC9F;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACF;AASA,SAAS,mBAAA,CACP,QAAA,EACA,MAAA,EACA,iBAAA,EACA,OAAA,EACiC;AACjC,EAAA,OAAO,YAA4B,IAAA,EAA0B;AAE3D,IAAA,MAAM,aAAA,GAAiB,kBAA8C,yBAAyB,CAAA;AAK9F,IAAA,MAAM,kBAAkB,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,KAAM,UAAA;AAEzD,IAAA,IAAI,CAAC,eAAA,EAAiB;AAEpB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AAEnD,MAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAA4B,IAAA,KAAS,UAAA,EAAY;AACrE,QAAA,OAAQ,MAAA,CAA4B,IAAA,CAAK,CAAC,WAAA,KAAyB;AACjE,UAAA,OAAO,sBAAA,CAAuB,WAAA,EAAa,OAAA,EAAS,aAAa,CAAA;AAAA,QACnE,CAAC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAY,KAAK,MAAA,KAAW,CAAA,GAAI,KAAK,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AACtD,IAAA,MAAM,eAAA,GAAkB,SAAU,WAAA,EAA+B;AAC/D,MAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,WAAA,EAAa,OAAA,EAAS,aAAa,CAAA;AAClF,MAAA,OAAO,SAAS,eAAe,CAAA;AAAA,IACjC,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAC,eAAe,CAAA,GAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG,eAAe,CAAA;AACjF,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChD,CAAA;AACF;AAKA,SAAS,sBAAA,CACP,KAAA,EACA,WAAA,EACA,OAAA,EACM;AAEN,EAAA,IAAK,KAAA,CAAM,QAA0C,eAAA,EAAiB;AACpE,IAAA;AAAA,EACF;AAIA,EAAC,KAAA,CAAkC,2BAA2B,CAAA,GAAI,IAAA;AAElE,EAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA;AAI7B,EAAA,MAAM,aAAA,GAAgB,kBAAkC,IAAA,EAAmC;AACzF,IAAA,IAAI,CAAC,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAChC,MAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,KAAA,CAAM,OAAO,CAAA;AACjD,IAAA,MAAM,iBAAA,GAAoB,kBAAkB,SAAS,CAAA;AAErD,IAAA,OAAOC,qBAAA;AAAA,MACL;AAAA,QACE,MAAM,iBAAA,IAAqB,kBAAA;AAAA,QAC3B,EAAA,EAAI;AAAA,OACN;AAAA,MACA,CAAC,IAAA,KAAe;AACd,QAAA,IAAA,CAAK,YAAA,CAAaC,qDAAkC,oBAAoB,CAAA;AAExE,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,gBAAA,EAAkB,UAAA;AAAA,UAClB,eAAA,EAAiB;AAAA,SAClB,CAAA;AAED,QAAA,MAAM,iBAAA,GAAoB,WAAA,GACpB,WAAA,CAAwC,yBAAyB,CAAA,GAGnE,MAAA;AAEJ,QAAA,wBAAA,CAAyB,MAAM,iBAAiB,CAAA;AAEhD,QAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,UAAA,IAAI;AACF,YAAA,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAM,iBAAA,EAAmB,iBAAiB,CAAA;AAAA,UAChE,SAAS,CAAA,EAAG;AACV,YAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,oBAAoB,CAAA;AAC3D,YAAAH,sBAAA,IAAeC,iBAAA,CAAM,KAAA,CAAM,sDAAA,EAAwD,CAAC,CAAA;AAAA,UACtF;AAAA,QACF;AAEA,QAAA,MAAM,kBAAA,GAAqB,IAAA;AAK3B,QAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,KAAA,CAAM,kBAAA,CAAmB,OAAA,EAA4C;AAAA,UACpG,KAAA,EAAO,CAAC,aAAA,EAAe,cAAA,EAAgB,WAAA,KAAwC;AAC7E,YAAA,IAAI;AACF,cAAA,iBAAA,CAAkB,IAAA,EAAM,iBAAA,EAAmB,WAAA,GAAc,CAAC,GAAG,OAAO,CAAA;AACpE,cAAA,IAAA,CAAK,GAAA,EAAI;AAAA,YACX,SAAS,CAAA,EAAG;AACV,cAAAD,sBAAA,IAAeC,iBAAA,CAAM,KAAA,CAAM,wCAAA,EAA0C,CAAC,CAAA;AAAA,YACxE;AAEA,YAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,aAAA,EAAe,cAAA,EAAgB,WAAW,CAAA;AAAA,UACjE;AAAA,SACD,CAAA;AAED,QAAA,kBAAA,CAAmB,MAAA,GAAS,IAAI,KAAA,CAAM,kBAAA,CAAmB,MAAA,EAA2C;AAAA,UAClG,KAAA,EAAO,CAAC,YAAA,EAAc,aAAA,EAAe,UAAA,KAAqE;AACxG,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;AAAA,gBACb,IAAA,EAAMG,4BAAA;AAAA,gBACN,OAAA,EAAS,UAAA,GAAa,CAAC,CAAA,EAAG,OAAA,IAAW;AAAA,eACtC,CAAA;AAED,cAAA,IAAA,CAAK,aAAa,yBAAA,EAA2B,UAAA,GAAa,CAAC,CAAA,EAAG,QAAQ,SAAS,CAAA;AAC/E,cAAA,IAAA,CAAK,aAAa,YAAA,EAAc,UAAA,GAAa,CAAC,CAAA,EAAG,QAAQ,SAAS,CAAA;AAElE,cAAA,iBAAA,CAAkB,MAAM,iBAAiB,CAAA;AACzC,cAAA,IAAA,CAAK,GAAA,EAAI;AAAA,YACX,SAAS,CAAA,EAAG;AACV,cAAAJ,sBAAA,IAAeC,iBAAA,CAAM,KAAA,CAAM,uCAAA,EAAyC,CAAC,CAAA;AAAA,YACvE;AACA,YAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,YAAA,EAAc,aAAA,EAAe,UAAU,CAAA;AAAA,UAC9D;AAAA,SACD,CAAA;AAGD,QAAA,IAAI;AACF,UAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,QACxC,SAAS,CAAA,EAAG;AACV,UAAA,IAAA,CAAK,SAAA,CAAU;AAAA,YACb,IAAA,EAAMG,4BAAA;AAAA,YACN,OAAA,EAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU;AAAA,WAC3C,CAAA;AACD,UAAA,IAAA,CAAK,GAAA,EAAI;AACT,UAAA,MAAM,CAAA;AAAA,QACR;AAAA,MACF;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAC,cAAgD,eAAA,GAAkB,IAAA;AACnE,EAAA,KAAA,CAAM,MAAA,GAAS,aAAA;AACjB;AAOA,SAAS,mBAAmB,OAAA,EAAuD;AACjF,EAAA,MAAM,aAAA,GAAgBC,yBAAc,KAAM,MAAA;AAC1C,EAAA,OAAO,aAAA,IAAiB,CAAC,OAAA,CAAQ,iBAAA;AACnC;AAWO,SAAS,kBAAkB,OAAA,EAAmD;AACnF,EAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,MAAA;AAAA,EACvB;AAEA,EAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,EAAK,MAAO,CAAA,KAAM,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,EAAG,GAAG,IAAK,EAAE,CAAA;AAClF;AAEA,IAAI,gBAAA;AAWG,SAAS,kBAAkB,QAAA,EAAsC;AACtE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,mBAAA;AAAA,EACT;AAKA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,gBAAA,GAAmB,IAAI,MAAA,CAAO,sBAAA,EAAwB,GAAG,CAAA;AAAA,EAC3D;AAEA,EAAA,OACE,QAAA,CAEG,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA,CAC/B,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAEnB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,IAAA,EAAK,CAEL,OAAA,CAAQ,qBAAA,EAAuB,GAAG,CAAA,CAClC,OAAA,CAAQ,cAAA,EAAgB,GAAG,CAAA,CAE3B,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA,CAE9B,OAAA,CAAQ,oBAAA,EAAsB,GAAG,CAAA,CAEjC,OAAA,CAAQ,sBAAA,EAAwB,GAAG,CAAA,CAEnC,OAAA,CAAQ,8BAAA,EAAgC,GAAG,CAAA,CAC3C,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA,CAC9B,OAAA,CAAQ,YAAA,EAAc,GAAG,CAAA,CACzB,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA,CAE7B,OAAA,CAAQ,uCAAA,EAAyC,QAAQ,CAAA,CACzD,OAAA,CAAQ,+CAA+C,SAAS,CAAA;AAEvE;AAKA,SAAS,wBAAA,CAAyB,MAAY,iBAAA,EAAgE;AAC5G,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,kBAAkB,iBAAA,EAAmB;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,iBAAA,CAAkB,iBAAiB,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,kBAAkB,mBAAA,EAAqB;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,EAAkB,iBAAA,CAAkB,mBAAmB,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,iBAAA,CAAkB,qBAAqB,MAAA,EAAW;AAGpD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,iBAAA,CAAkB,gBAAA,EAAkB,EAAE,CAAA;AAClE,IAAA,IAAI,CAAC,KAAA,CAAM,UAAU,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,YAAA,CAAa,eAAe,UAAU,CAAA;AAAA,IAC7C;AAAA,EACF;AACF;AAKA,SAAS,iBAAA,CAAkB,IAAA,EAAY,cAAA,EAAoC,OAAA,EAAwB;AACjG,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,OAAO,CAAA;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,cAAA,EAAgB,KAAA,CAAM,mBAAmB,CAAA;AAChE,EAAA,IAAI,cAAA,GAAiB,CAAC,CAAA,EAAG;AACvB,IAAA,IAAA,CAAK,aAAa,mBAAA,EAAqB,cAAA,CAAe,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,EACxE;AACF;AAKA,SAAS,wBAAA,CAAyB,KAAc,UAAA,EAA2C;AACzF,EAAA,MAAM,WAAA,GAAc,GAAA;AACpB,EAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,OAAO,WAAA,CAAY,YAAY,QAAA,EAAU;AACnE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,WAAA,CAAY,OAAA;AAGzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,IAAK,WAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,IAAK,IAAA;AAE/B,EAAA,MAAM,iBAAA,GAA+C;AAAA,IACnD,iBAAA,EAAmB,OAAO,IAAA,CAAK,QAAA,KAAa,YAAY,IAAA,CAAK,QAAA,KAAa,EAAA,GAAK,IAAA,CAAK,QAAA,GAAW,MAAA;AAAA,IAC/F,mBAAA,EAAqB,IAAA;AAAA,IACrB,gBAAA,EAAkB,OAAO,IAAI;AAAA,GAC/B;AAEA,EAAA,UAAA,CAAW,yBAAyB,CAAA,GAAI,iBAAA;AAC1C;;;;;;"}
{"version":3,"file":"postgresjs.js","sources":["../../../src/integrations/postgresjs.ts"],"sourcesContent":["// Portable instrumentation for https://github.com/porsager/postgres\n// This can be used in any environment (Node.js, Cloudflare Workers, etc.)\n// without depending on OpenTelemetry module hooking.\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes';\nimport { SPAN_STATUS_ERROR, startSpanManual } from '../tracing';\nimport type { Span } from '../types/span';\nimport { debug } from '../utils/debug-logger';\nimport { getActiveSpan } from '../utils/spanUtils';\n\nconst SQL_OPERATION_REGEX = /^(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER)/i;\n\ntype PostgresConnectionContext = {\n ATTR_DB_NAMESPACE?: string;\n ATTR_SERVER_ADDRESS?: string;\n ATTR_SERVER_PORT?: string;\n};\n\ninterface PostgresJsSqlInstrumentationOptions {\n /**\n * Whether to require a parent span for the instrumentation.\n * If set to true, the instrumentation will only create spans if there is a parent span\n * available in the current scope.\n * @default true\n */\n requireParentSpan?: boolean;\n /**\n * Hook to modify the span before it is started.\n * This can be used to set additional attributes or modify the span in any way.\n */\n requestHook?: (span: Span, sanitizedSqlQuery: string, postgresConnectionContext?: PostgresConnectionContext) => void;\n}\n\nconst CONNECTION_CONTEXT_SYMBOL = Symbol('sentryPostgresConnectionContext');\n\n// Use the same Symbol.for() markers as the Node.js OTel instrumentation\n// so that both approaches recognize each other and prevent double-wrapping.\nconst INSTRUMENTED_MARKER = Symbol.for('sentry.instrumented.postgresjs');\n// Marker to track if a query was created from an instrumented sql instance.\n// This prevents double-spanning when both the wrapper and the Node.js Query.prototype\n// fallback patch are active simultaneously.\nconst QUERY_FROM_INSTRUMENTED_SQL = Symbol.for('sentry.query.from.instrumented.sql');\n\n/**\n * Instruments a postgres.js `sql` instance with Sentry tracing.\n *\n * This is a portable instrumentation function that works in any environment\n * (Node.js, Cloudflare Workers, etc.) without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import postgres from 'postgres';\n * import * as Sentry from '@sentry/cloudflare'; // or '@sentry/deno'\n *\n * const sql = Sentry.instrumentPostgresJsSql(\n * postgres({ host: 'localhost', database: 'mydb' })\n * );\n *\n * // All queries now create Sentry spans\n * await sql`SELECT * FROM users WHERE id = ${userId}`;\n * ```\n */\nexport function instrumentPostgresJsSql<T>(sql: T, options?: PostgresJsSqlInstrumentationOptions): T {\n if (!sql || typeof sql !== 'function') {\n DEBUG_BUILD && debug.warn('instrumentPostgresJsSql: provided value is not a valid postgres.js sql instance');\n return sql;\n }\n\n return _instrumentSqlInstance(sql, { requireParentSpan: true, ...options }) as T;\n}\n\n/**\n * Instruments a sql instance by wrapping its query execution methods.\n */\nfunction _instrumentSqlInstance(\n sql: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n parentConnectionContext?: PostgresConnectionContext,\n): unknown {\n // Check if already instrumented to prevent double-wrapping\n // Using Symbol.for() ensures the marker survives proxying\n if ((sql as Record<symbol, unknown>)[INSTRUMENTED_MARKER]) {\n return sql;\n }\n\n // Wrap the sql function to intercept query creation\n const proxiedSql: unknown = new Proxy(sql as (...args: unknown[]) => unknown, {\n apply(target, thisArg, argumentsList: unknown[]) {\n const query = Reflect.apply(target, thisArg, argumentsList);\n\n if (query && typeof query === 'object' && 'handle' in query) {\n _wrapSingleQueryHandle(query as { handle: unknown; strings?: string[] }, proxiedSql, options);\n }\n\n return query;\n },\n get(target, prop) {\n const original = (target as unknown as Record<string | symbol, unknown>)[prop];\n\n if (typeof prop !== 'string' || typeof original !== 'function') {\n return original;\n }\n\n // Wrap methods that return PendingQuery objects (unsafe, file)\n if (prop === 'unsafe' || prop === 'file') {\n return _wrapQueryMethod(original as (...args: unknown[]) => unknown, target, proxiedSql, options);\n }\n\n // Wrap begin and reserve (not savepoint to avoid duplicate spans)\n if (prop === 'begin' || prop === 'reserve') {\n return _wrapCallbackMethod(original as (...args: unknown[]) => unknown, target, proxiedSql, options);\n }\n\n return original;\n },\n });\n\n // Use provided parent context if available, otherwise extract from sql.options\n if (parentConnectionContext) {\n (proxiedSql as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] = parentConnectionContext;\n } else {\n _attachConnectionContext(sql, proxiedSql as Record<symbol, unknown>);\n }\n\n // Mark both the original and proxy as instrumented to prevent double-wrapping\n (sql as Record<symbol, unknown>)[INSTRUMENTED_MARKER] = true;\n (proxiedSql as Record<symbol, unknown>)[INSTRUMENTED_MARKER] = true;\n\n return proxiedSql;\n}\n\n/**\n * Wraps query-returning methods (unsafe, file) to ensure their queries are instrumented.\n */\nfunction _wrapQueryMethod(\n original: (...args: unknown[]) => unknown,\n target: unknown,\n proxiedSql: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): (...args: unknown[]) => unknown {\n return function (this: unknown, ...args: unknown[]): unknown {\n const query = Reflect.apply(original, target, args);\n\n if (query && typeof query === 'object' && 'handle' in query) {\n _wrapSingleQueryHandle(query as { handle: unknown; strings?: string[] }, proxiedSql, options);\n }\n\n return query;\n };\n}\n\n/**\n * Wraps callback-based methods (begin, reserve) to recursively instrument Sql instances.\n * Note: These methods can also be used as tagged templates, which we pass through unchanged.\n *\n * Savepoint is not wrapped to avoid complex nested transaction instrumentation issues.\n * Queries within savepoint callbacks are still instrumented through the parent transaction's Sql instance.\n */\nfunction _wrapCallbackMethod(\n original: (...args: unknown[]) => unknown,\n target: unknown,\n parentSqlInstance: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): (...args: unknown[]) => unknown {\n return function (this: unknown, ...args: unknown[]): unknown {\n // Extract parent context to propagate to child instances\n const parentContext = (parentSqlInstance as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] as\n | PostgresConnectionContext\n | undefined;\n\n // Check if this is a callback-based call by verifying the last argument is a function\n const isCallbackBased = typeof args[args.length - 1] === 'function';\n\n if (!isCallbackBased) {\n // Not a callback-based call - could be tagged template or promise-based\n const result = Reflect.apply(original, target, args);\n // If result is a Promise (e.g., reserve() without callback), instrument the resolved Sql instance\n if (result && typeof (result as Promise<unknown>).then === 'function') {\n return (result as Promise<unknown>).then((sqlInstance: unknown) => {\n return _instrumentSqlInstance(sqlInstance, options, parentContext);\n });\n }\n return result;\n }\n\n // Callback-based call: wrap the callback to instrument the Sql instance\n const callback = (args.length === 1 ? args[0] : args[1]) as (sql: unknown) => unknown;\n const wrappedCallback = function (sqlInstance: unknown): unknown {\n const instrumentedSql = _instrumentSqlInstance(sqlInstance, options, parentContext);\n return callback(instrumentedSql);\n };\n\n const newArgs = args.length === 1 ? [wrappedCallback] : [args[0], wrappedCallback];\n return Reflect.apply(original, target, newArgs);\n };\n}\n\n/**\n * Wraps a single query's handle method to create spans.\n */\nfunction _wrapSingleQueryHandle(\n query: { handle: unknown; strings?: string[]; __sentryWrapped?: boolean },\n sqlInstance: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): void {\n // Prevent double wrapping - check if the handle itself is already wrapped\n if ((query.handle as { __sentryWrapped?: boolean })?.__sentryWrapped) {\n return;\n }\n\n // Mark this query as coming from an instrumented sql instance.\n // This prevents the Node.js Query.prototype fallback patch from double-spanning.\n (query as Record<symbol, unknown>)[QUERY_FROM_INSTRUMENTED_SQL] = true;\n\n const originalHandle = query.handle as (...args: unknown[]) => Promise<unknown>;\n\n // IMPORTANT: We must replace the handle function directly, not use a Proxy,\n // because Query.then() internally calls this.handle(), which would bypass a Proxy wrapper.\n const wrappedHandle = async function (this: { executed?: boolean }, ...args: unknown[]): Promise<unknown> {\n // postgres.js calls handle() from then/catch/finally — only the first call executes SQL,\n // subsequent calls are no-ops (guarded by this.executed). Skip span creation for no-ops.\n if (this.executed || !_shouldCreateSpans(options)) {\n return originalHandle.apply(this, args);\n }\n\n const fullQuery = _reconstructQuery(query.strings);\n const sanitizedSqlQuery = _sanitizeSqlQuery(fullQuery);\n\n return startSpanManual(\n {\n name: sanitizedSqlQuery || 'postgresjs.query',\n op: 'db',\n },\n (span: Span) => {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, 'auto.db.postgresjs');\n\n span.setAttributes({\n 'db.system.name': 'postgres',\n 'db.query.text': sanitizedSqlQuery,\n });\n\n const connectionContext = sqlInstance\n ? ((sqlInstance as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] as\n | PostgresConnectionContext\n | undefined)\n : undefined;\n\n _setConnectionAttributes(span, connectionContext);\n\n if (options.requestHook) {\n try {\n options.requestHook(span, sanitizedSqlQuery, connectionContext);\n } catch (e) {\n span.setAttribute('sentry.hook.error', 'requestHook failed');\n DEBUG_BUILD && debug.error('Error in requestHook for PostgresJs instrumentation:', e);\n }\n }\n\n const queryWithCallbacks = this as {\n resolve: unknown;\n reject: unknown;\n };\n\n queryWithCallbacks.resolve = new Proxy(queryWithCallbacks.resolve as (...args: unknown[]) => unknown, {\n apply: (resolveTarget, resolveThisArg, resolveArgs: [{ command?: string }]) => {\n try {\n _setOperationName(span, sanitizedSqlQuery, resolveArgs?.[0]?.command);\n span.end();\n } catch (e) {\n DEBUG_BUILD && debug.error('Error ending span in resolve callback:', e);\n }\n\n return Reflect.apply(resolveTarget, resolveThisArg, resolveArgs);\n },\n });\n\n queryWithCallbacks.reject = new Proxy(queryWithCallbacks.reject as (...args: unknown[]) => unknown, {\n apply: (rejectTarget, rejectThisArg, rejectArgs: { message?: string; code?: string; name?: string }[]) => {\n try {\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: rejectArgs?.[0]?.message || 'unknown_error',\n });\n\n span.setAttribute('db.response.status_code', rejectArgs?.[0]?.code || 'unknown');\n span.setAttribute('error.type', rejectArgs?.[0]?.name || 'unknown');\n\n _setOperationName(span, sanitizedSqlQuery);\n span.end();\n } catch (e) {\n DEBUG_BUILD && debug.error('Error ending span in reject callback:', e);\n }\n return Reflect.apply(rejectTarget, rejectThisArg, rejectArgs);\n },\n });\n\n // Handle synchronous errors that might occur before promise is created\n try {\n return originalHandle.apply(this, args);\n } catch (e) {\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: e instanceof Error ? e.message : 'unknown_error',\n });\n span.end();\n throw e;\n }\n },\n );\n };\n\n (wrappedHandle as { __sentryWrapped?: boolean }).__sentryWrapped = true;\n query.handle = wrappedHandle;\n}\n\n/**\n * Determines whether a span should be created based on the current context.\n * If `requireParentSpan` is set to true in the options, a span will\n * only be created if there is a parent span available.\n */\nfunction _shouldCreateSpans(options: PostgresJsSqlInstrumentationOptions): boolean {\n const hasParentSpan = getActiveSpan() !== undefined;\n return hasParentSpan || !options.requireParentSpan;\n}\n\n/**\n * Reconstructs the full SQL query from template strings with PostgreSQL placeholders.\n *\n * For sql`SELECT * FROM users WHERE id = ${123} AND name = ${'foo'}`:\n * strings = [\"SELECT * FROM users WHERE id = \", \" AND name = \", \"\"]\n * returns: \"SELECT * FROM users WHERE id = $1 AND name = $2\"\n *\n * @internal Exported for testing only\n */\nexport function _reconstructQuery(strings: string[] | undefined): string | undefined {\n if (!strings?.length) {\n return undefined;\n }\n if (strings.length === 1) {\n return strings[0] || undefined;\n }\n // Join template parts with PostgreSQL placeholders ($1, $2, etc.)\n return strings.reduce((acc, str, i) => (i === 0 ? str : `${acc}$${i}${str}`), '');\n}\n\nlet integerLiteralRE: RegExp | undefined;\n\n/**\n * Sanitize SQL query as per the OTEL semantic conventions\n * https://opentelemetry.io/docs/specs/semconv/database/database-spans/#sanitization-of-dbquerytext\n *\n * PostgreSQL $n placeholders are preserved per OTEL spec - they're parameterized queries,\n * not sensitive literals. Only actual values (strings, numbers, booleans) are sanitized.\n *\n * @internal Exported for testing only\n */\nexport function _sanitizeSqlQuery(sqlQuery: string | undefined): string {\n if (!sqlQuery) {\n return 'Unknown SQL Query';\n }\n\n // Lazy init: constructing this at module scope would evaluate the lookbehind\n // on import and crash Safari <16.4 browser bundles that reach this file via\n // the core barrel. Building it on first call keeps the cost off the import path.\n if (!integerLiteralRE) {\n integerLiteralRE = new RegExp('(?<!\\\\$)-?\\\\b\\\\d+\\\\b', 'g');\n }\n\n return (\n sqlQuery\n // Remove comments first (they may contain newlines and extra spaces)\n .replace(/--.*$/gm, '') // Single line comments (multiline mode)\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Multi-line comments\n .replace(/;\\s*$/, '') // Remove trailing semicolons\n // Collapse whitespace to a single space (after removing comments)\n .replace(/\\s+/g, ' ')\n .trim() // Remove extra spaces and trim\n // Sanitize hex/binary literals before string literals\n .replace(/\\bX'[0-9A-Fa-f]*'/gi, '?') // Hex string literals\n .replace(/\\bB'[01]*'/gi, '?') // Binary string literals\n // Sanitize string literals (handles escaped quotes)\n .replace(/'(?:[^']|'')*'/g, '?')\n // Sanitize hex numbers\n .replace(/\\b0x[0-9A-Fa-f]+/gi, '?')\n // Sanitize boolean literals\n .replace(/\\b(?:TRUE|FALSE)\\b/gi, '?')\n // Sanitize numeric literals (preserve $n placeholders via negative lookbehind)\n .replace(/-?\\b\\d+\\.?\\d*[eE][+-]?\\d+\\b/g, '?') // Scientific notation\n .replace(/-?\\b\\d+\\.\\d+\\b/g, '?') // Decimals\n .replace(/-?\\.\\d+\\b/g, '?') // Decimals starting with dot\n .replace(integerLiteralRE, '?') // Integers (NOT $n placeholders)\n // Collapse IN clauses for cardinality (both ? and $n variants)\n .replace(/\\bIN\\b\\s*\\(\\s*\\?(?:\\s*,\\s*\\?)*\\s*\\)/gi, 'IN (?)')\n .replace(/\\bIN\\b\\s*\\(\\s*\\$\\d+(?:\\s*,\\s*\\$\\d+)*\\s*\\)/gi, 'IN ($?)')\n );\n}\n\n/**\n * Sets connection context attributes on a span.\n */\nfunction _setConnectionAttributes(span: Span, connectionContext: PostgresConnectionContext | undefined): void {\n if (!connectionContext) {\n return;\n }\n if (connectionContext.ATTR_DB_NAMESPACE) {\n span.setAttribute('db.namespace', connectionContext.ATTR_DB_NAMESPACE);\n }\n if (connectionContext.ATTR_SERVER_ADDRESS) {\n span.setAttribute('server.address', connectionContext.ATTR_SERVER_ADDRESS);\n }\n if (connectionContext.ATTR_SERVER_PORT !== undefined) {\n // Port is stored as string in PostgresConnectionContext for requestHook backwards compatibility,\n // but semantic conventions expect port as a number for span attributes\n const portNumber = parseInt(connectionContext.ATTR_SERVER_PORT, 10);\n if (!isNaN(portNumber)) {\n span.setAttribute('server.port', portNumber);\n }\n }\n}\n\n/**\n * Extracts DB operation name from SQL query and sets it on the span.\n */\nfunction _setOperationName(span: Span, sanitizedQuery: string | undefined, command?: string): void {\n if (command) {\n span.setAttribute('db.operation.name', command);\n return;\n }\n // Fallback: extract operation from the SQL query\n const operationMatch = sanitizedQuery?.match(SQL_OPERATION_REGEX);\n if (operationMatch?.[1]) {\n span.setAttribute('db.operation.name', operationMatch[1].toUpperCase());\n }\n}\n\n/**\n * Extracts and stores connection context from sql.options.\n */\nfunction _attachConnectionContext(sql: unknown, proxiedSql: Record<symbol, unknown>): void {\n const sqlInstance = sql as { options?: { host?: string[]; port?: number[]; database?: string } };\n if (!sqlInstance.options || typeof sqlInstance.options !== 'object') {\n return;\n }\n\n const opts = sqlInstance.options;\n // postgres.js stores parsed options with host and port as arrays\n // The library defaults to 'localhost' and 5432 if not specified, but we're defensive here\n const host = opts.host?.[0] || 'localhost';\n const port = opts.port?.[0] || 5432;\n\n const connectionContext: PostgresConnectionContext = {\n ATTR_DB_NAMESPACE: typeof opts.database === 'string' && opts.database !== '' ? opts.database : undefined,\n ATTR_SERVER_ADDRESS: host,\n ATTR_SERVER_PORT: String(port),\n };\n\n proxiedSql[CONNECTION_CONTEXT_SYMBOL] = connectionContext;\n}\n"],"names":["DEBUG_BUILD","debug","startSpanManual","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SPAN_STATUS_ERROR","getActiveSpan"],"mappings":"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"}

@@ -6,2 +6,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const isBrowser = require('../../utils/isBrowser.js');
const randomSafeContext = require('../../utils/randomSafeContext.js');

@@ -14,3 +15,3 @@ function createStreamedSpanEnvelope(serializedSpans, dsc, client) {

const headers = {
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
sent_at: new Date(randomSafeContext.safeDateNow()).toISOString(),
...dscHasRequiredProps(dsc) && { trace: dsc },

@@ -17,0 +18,0 @@ ...sdk && { sdk },

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.js","sources":["../../../../src/tracing/spans/envelope.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport type { DynamicSamplingContext, SpanContainerItem, StreamedSpanEnvelope } from '../../types/envelope';\nimport type { SerializedStreamedSpan } from '../../types/span';\nimport { dsnToString } from '../../utils/dsn';\nimport { createEnvelope, getSdkMetadataForEnvelopeHeader } from '../../utils/envelope';\nimport { isBrowser } from '../../utils/isBrowser';\n\n/**\n * Creates a span v2 span streaming envelope\n */\nexport function createStreamedSpanEnvelope(\n serializedSpans: Array<SerializedStreamedSpan>,\n dsc: Partial<DynamicSamplingContext>,\n client: Client,\n): StreamedSpanEnvelope {\n const options = client.getOptions();\n const dsn = client.getDsn();\n const tunnel = options.tunnel;\n const sdk = getSdkMetadataForEnvelopeHeader(options._metadata);\n\n const headers: StreamedSpanEnvelope[0] = {\n sent_at: new Date().toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(sdk && { sdk }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const inferSetting = client.getDataCollectionOptions().userInfo ? 'auto' : 'never';\n\n const spanContainer: SpanContainerItem = [\n { type: 'span', item_count: serializedSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' },\n {\n version: 2,\n ...(isBrowser() && {\n ingest_settings: { infer_ip: inferSetting, infer_user_agent: inferSetting },\n }),\n items: serializedSpans,\n },\n ];\n\n return createEnvelope<StreamedSpanEnvelope>(headers, [spanContainer]);\n}\n\nfunction dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n}\n"],"names":["dsn","getSdkMetadataForEnvelopeHeader","dsnToString","isBrowser","createEnvelope"],"mappings":";;;;;;AAUO,SAAS,0BAAA,CACd,eAAA,EACA,GAAA,EACA,MAAA,EACsB;AACtB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,MAAMA,KAAA,GAAM,OAAO,MAAA,EAAO;AAC1B,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,GAAA,GAAMC,wCAAA,CAAgC,OAAA,CAAQ,SAAS,CAAA;AAE7D,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAChC,GAAI,mBAAA,CAAoB,GAAG,CAAA,IAAK,EAAE,OAAO,GAAA,EAAI;AAAA,IAC7C,GAAI,GAAA,IAAO,EAAE,GAAA,EAAI;AAAA,IACjB,GAAI,CAAC,CAAC,MAAA,IAAUD,SAAO,EAAE,GAAA,EAAKE,eAAA,CAAYF,KAAG,CAAA;AAAE,GACjD;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,wBAAA,EAAyB,CAAE,WAAW,MAAA,GAAS,OAAA;AAE3E,EAAA,MAAM,aAAA,GAAmC;AAAA,IACvC,EAAE,IAAA,EAAM,MAAA,EAAQ,YAAY,eAAA,CAAgB,MAAA,EAAQ,cAAc,2CAAA,EAA4C;AAAA,IAC9G;AAAA,MACE,OAAA,EAAS,CAAA;AAAA,MACT,GAAIG,qBAAU,IAAK;AAAA,QACjB,eAAA,EAAiB,EAAE,QAAA,EAAU,YAAA,EAAc,kBAAkB,YAAA;AAAa,OAC5E;AAAA,MACA,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,OAAOC,uBAAA,CAAqC,OAAA,EAAS,CAAC,aAAa,CAAC,CAAA;AACtE;AAEA,SAAS,oBAAoB,GAAA,EAAqE;AAChG,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,QAAA,IAAY,CAAC,CAAC,GAAA,CAAI,UAAA;AACjC;;;;"}
{"version":3,"file":"envelope.js","sources":["../../../../src/tracing/spans/envelope.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport type { DynamicSamplingContext, SpanContainerItem, StreamedSpanEnvelope } from '../../types/envelope';\nimport type { SerializedStreamedSpan } from '../../types/span';\nimport { dsnToString } from '../../utils/dsn';\nimport { createEnvelope, getSdkMetadataForEnvelopeHeader } from '../../utils/envelope';\nimport { isBrowser } from '../../utils/isBrowser';\nimport { safeDateNow } from '../../utils/randomSafeContext';\n\n/**\n * Creates a span v2 span streaming envelope\n */\nexport function createStreamedSpanEnvelope(\n serializedSpans: Array<SerializedStreamedSpan>,\n dsc: Partial<DynamicSamplingContext>,\n client: Client,\n): StreamedSpanEnvelope {\n const options = client.getOptions();\n const dsn = client.getDsn();\n const tunnel = options.tunnel;\n const sdk = getSdkMetadataForEnvelopeHeader(options._metadata);\n\n const headers: StreamedSpanEnvelope[0] = {\n sent_at: new Date(safeDateNow()).toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(sdk && { sdk }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const inferSetting = client.getDataCollectionOptions().userInfo ? 'auto' : 'never';\n\n const spanContainer: SpanContainerItem = [\n { type: 'span', item_count: serializedSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' },\n {\n version: 2,\n ...(isBrowser() && {\n ingest_settings: { infer_ip: inferSetting, infer_user_agent: inferSetting },\n }),\n items: serializedSpans,\n },\n ];\n\n return createEnvelope<StreamedSpanEnvelope>(headers, [spanContainer]);\n}\n\nfunction dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n}\n"],"names":["dsn","getSdkMetadataForEnvelopeHeader","safeDateNow","dsnToString","isBrowser","createEnvelope"],"mappings":";;;;;;;AAWO,SAAS,0BAAA,CACd,eAAA,EACA,GAAA,EACA,MAAA,EACsB;AACtB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,MAAMA,KAAA,GAAM,OAAO,MAAA,EAAO;AAC1B,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,GAAA,GAAMC,wCAAA,CAAgC,OAAA,CAAQ,SAAS,CAAA;AAE7D,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,SAAS,IAAI,IAAA,CAAKC,6BAAA,EAAa,EAAE,WAAA,EAAY;AAAA,IAC7C,GAAI,mBAAA,CAAoB,GAAG,CAAA,IAAK,EAAE,OAAO,GAAA,EAAI;AAAA,IAC7C,GAAI,GAAA,IAAO,EAAE,GAAA,EAAI;AAAA,IACjB,GAAI,CAAC,CAAC,MAAA,IAAUF,SAAO,EAAE,GAAA,EAAKG,eAAA,CAAYH,KAAG,CAAA;AAAE,GACjD;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,wBAAA,EAAyB,CAAE,WAAW,MAAA,GAAS,OAAA;AAE3E,EAAA,MAAM,aAAA,GAAmC;AAAA,IACvC,EAAE,IAAA,EAAM,MAAA,EAAQ,YAAY,eAAA,CAAgB,MAAA,EAAQ,cAAc,2CAAA,EAA4C;AAAA,IAC9G;AAAA,MACE,OAAA,EAAS,CAAA;AAAA,MACT,GAAII,qBAAU,IAAK;AAAA,QACjB,eAAA,EAAiB,EAAE,QAAA,EAAU,YAAA,EAAc,kBAAkB,YAAA;AAAa,OAC5E;AAAA,MACA,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,OAAOC,uBAAA,CAAqC,OAAA,EAAS,CAAC,aAAa,CAAC,CAAA;AACtE;AAEA,SAAS,oBAAoB,GAAA,EAAqE;AAChG,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,QAAA,IAAY,CAAC,CAAC,GAAA,CAAI,UAAA;AACjC;;;;"}

@@ -6,2 +6,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const envelope = require('../utils/envelope.js');
const randomSafeContext = require('../utils/randomSafeContext.js');
const ratelimit = require('../utils/ratelimit.js');

@@ -44,3 +45,3 @@ const timer = require('../utils/timer.js');

log("Attempting to send previously queued event");
found[0].sent_at = (/* @__PURE__ */ new Date()).toISOString();
found[0].sent_at = new Date(randomSafeContext.safeDateNow()).toISOString();
void send(found, true).catch((e) => {

@@ -47,0 +48,0 @@ log("Failed to retry sending", e);

@@ -1,1 +0,1 @@

{"version":3,"file":"offline.js","sources":["../../../src/transports/offline.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport type { Envelope } from '../types/envelope';\nimport type { InternalBaseTransportOptions, Transport, TransportMakeRequestResponse } from '../types/transport';\nimport { debug } from '../utils/debug-logger';\nimport { envelopeContainsItemType } from '../utils/envelope';\nimport { parseRetryAfterHeader } from '../utils/ratelimit';\nimport { safeUnref } from '../utils/timer';\n\nexport const MIN_DELAY = 100; // 100 ms\nexport const START_DELAY = 5_000; // 5 seconds\nconst MAX_DELAY = 3.6e6; // 1 hour\n\nexport interface OfflineStore {\n push(env: Envelope): Promise<void>;\n unshift(env: Envelope): Promise<void>;\n shift(): Promise<Envelope | undefined>;\n}\n\nexport type CreateOfflineStore = (options: OfflineTransportOptions) => OfflineStore;\n\nexport interface OfflineTransportOptions extends InternalBaseTransportOptions {\n /**\n * A function that creates the offline store instance.\n */\n createStore?: CreateOfflineStore;\n\n /**\n * Flush the offline store shortly after startup.\n *\n * Defaults: false\n */\n flushAtStartup?: boolean;\n\n /**\n * Called before an event is stored.\n *\n * Return false to drop the envelope rather than store it.\n *\n * @param envelope The envelope that failed to send.\n * @param error The error that occurred.\n * @param retryDelay The current retry delay in milliseconds.\n * @returns Whether the envelope should be stored.\n */\n shouldStore?: (envelope: Envelope, error: Error, retryDelay: number) => boolean | Promise<boolean>;\n\n /**\n * Should an attempt be made to send the envelope to Sentry.\n *\n * If this function is supplied and returns false, `shouldStore` will be called to determine if the envelope should be stored.\n *\n * @param envelope The envelope that will be sent.\n * @returns Whether we should attempt to send the envelope\n */\n shouldSend?: (envelope: Envelope) => boolean | Promise<boolean>;\n}\n\ntype Timer = number | { unref?: () => void };\n\n/**\n * Wraps a transport and stores and retries events when they fail to send.\n *\n * @param createTransport The transport to wrap.\n */\nexport function makeOfflineTransport<TO>(\n createTransport: (options: TO) => Transport,\n): (options: TO & OfflineTransportOptions) => Transport {\n function log(...args: unknown[]): void {\n DEBUG_BUILD && debug.log('[Offline]:', ...args);\n }\n\n return options => {\n const transport = createTransport(options);\n\n if (!options.createStore) {\n throw new Error('No `createStore` function was provided');\n }\n\n const store = options.createStore(options);\n\n let retryDelay = START_DELAY;\n let flushTimer: Timer | undefined;\n\n function shouldQueue(env: Envelope, error: Error, retryDelay: number): boolean | Promise<boolean> {\n // We want to drop client reports because they can be generated when we retry sending events while offline.\n if (envelopeContainsItemType(env, ['client_report'])) {\n return false;\n }\n\n if (options.shouldStore) {\n return options.shouldStore(env, error, retryDelay);\n }\n\n return true;\n }\n\n function flushIn(delay: number): void {\n if (flushTimer) {\n clearTimeout(flushTimer as ReturnType<typeof setTimeout>);\n }\n\n // We need to unref the timer in node.js, otherwise the node process never exit.\n flushTimer = safeUnref(\n setTimeout(async () => {\n flushTimer = undefined;\n\n const found = await store.shift();\n if (found) {\n log('Attempting to send previously queued event');\n\n // We should to update the sent_at timestamp to the current time.\n found[0].sent_at = new Date().toISOString();\n\n void send(found, true).catch(e => {\n log('Failed to retry sending', e);\n });\n }\n }, delay),\n ) as Timer;\n }\n\n function flushWithBackOff(): void {\n if (flushTimer) {\n return;\n }\n\n flushIn(retryDelay);\n\n retryDelay = Math.min(retryDelay * 2, MAX_DELAY);\n }\n\n async function send(envelope: Envelope, isRetry: boolean = false): Promise<TransportMakeRequestResponse> {\n // We queue all replay envelopes to avoid multiple replay envelopes being sent at the same time. If one fails, we\n // need to retry them in order.\n if (!isRetry && envelopeContainsItemType(envelope, ['replay_event', 'replay_recording'])) {\n await store.push(envelope);\n flushIn(MIN_DELAY);\n return {};\n }\n\n try {\n if (options.shouldSend && (await options.shouldSend(envelope)) === false) {\n throw new Error('Envelope not sent because `shouldSend` callback returned false');\n }\n\n const result = await transport.send(envelope);\n\n let delay = MIN_DELAY;\n\n if (result) {\n // If there's a retry-after header, use that as the next delay.\n if (result.headers?.['retry-after']) {\n delay = parseRetryAfterHeader(result.headers['retry-after']);\n } else if (result.headers?.['x-sentry-rate-limits']) {\n delay = 60_000; // 60 seconds\n } // If we have a server error, return now so we don't flush the queue.\n else if ((result.statusCode || 0) >= 400) {\n return result;\n }\n }\n\n flushIn(delay);\n retryDelay = START_DELAY;\n return result;\n } catch (e) {\n if (await shouldQueue(envelope, e as Error, retryDelay)) {\n // If this envelope was a retry, we want to add it to the front of the queue so it's retried again first.\n if (isRetry) {\n await store.unshift(envelope);\n } else {\n await store.push(envelope);\n }\n flushWithBackOff();\n log('Error sending. Event queued.', e as Error);\n return {};\n } else {\n throw e;\n }\n }\n }\n\n if (options.flushAtStartup) {\n flushWithBackOff();\n }\n\n return {\n send,\n flush: timeout => {\n // If there's no timeout, we should attempt to flush the offline queue.\n if (timeout === undefined) {\n retryDelay = START_DELAY;\n flushIn(MIN_DELAY);\n }\n\n return transport.flush(timeout);\n },\n };\n };\n}\n"],"names":["DEBUG_BUILD","debug","retryDelay","envelopeContainsItemType","safeUnref","envelope","parseRetryAfterHeader"],"mappings":"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"}
{"version":3,"file":"offline.js","sources":["../../../src/transports/offline.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport type { Envelope } from '../types/envelope';\nimport type { InternalBaseTransportOptions, Transport, TransportMakeRequestResponse } from '../types/transport';\nimport { debug } from '../utils/debug-logger';\nimport { envelopeContainsItemType } from '../utils/envelope';\nimport { safeDateNow } from '../utils/randomSafeContext';\nimport { parseRetryAfterHeader } from '../utils/ratelimit';\nimport { safeUnref } from '../utils/timer';\n\nexport const MIN_DELAY = 100; // 100 ms\nexport const START_DELAY = 5_000; // 5 seconds\nconst MAX_DELAY = 3.6e6; // 1 hour\n\nexport interface OfflineStore {\n push(env: Envelope): Promise<void>;\n unshift(env: Envelope): Promise<void>;\n shift(): Promise<Envelope | undefined>;\n}\n\nexport type CreateOfflineStore = (options: OfflineTransportOptions) => OfflineStore;\n\nexport interface OfflineTransportOptions extends InternalBaseTransportOptions {\n /**\n * A function that creates the offline store instance.\n */\n createStore?: CreateOfflineStore;\n\n /**\n * Flush the offline store shortly after startup.\n *\n * Defaults: false\n */\n flushAtStartup?: boolean;\n\n /**\n * Called before an event is stored.\n *\n * Return false to drop the envelope rather than store it.\n *\n * @param envelope The envelope that failed to send.\n * @param error The error that occurred.\n * @param retryDelay The current retry delay in milliseconds.\n * @returns Whether the envelope should be stored.\n */\n shouldStore?: (envelope: Envelope, error: Error, retryDelay: number) => boolean | Promise<boolean>;\n\n /**\n * Should an attempt be made to send the envelope to Sentry.\n *\n * If this function is supplied and returns false, `shouldStore` will be called to determine if the envelope should be stored.\n *\n * @param envelope The envelope that will be sent.\n * @returns Whether we should attempt to send the envelope\n */\n shouldSend?: (envelope: Envelope) => boolean | Promise<boolean>;\n}\n\ntype Timer = number | { unref?: () => void };\n\n/**\n * Wraps a transport and stores and retries events when they fail to send.\n *\n * @param createTransport The transport to wrap.\n */\nexport function makeOfflineTransport<TO>(\n createTransport: (options: TO) => Transport,\n): (options: TO & OfflineTransportOptions) => Transport {\n function log(...args: unknown[]): void {\n DEBUG_BUILD && debug.log('[Offline]:', ...args);\n }\n\n return options => {\n const transport = createTransport(options);\n\n if (!options.createStore) {\n throw new Error('No `createStore` function was provided');\n }\n\n const store = options.createStore(options);\n\n let retryDelay = START_DELAY;\n let flushTimer: Timer | undefined;\n\n function shouldQueue(env: Envelope, error: Error, retryDelay: number): boolean | Promise<boolean> {\n // We want to drop client reports because they can be generated when we retry sending events while offline.\n if (envelopeContainsItemType(env, ['client_report'])) {\n return false;\n }\n\n if (options.shouldStore) {\n return options.shouldStore(env, error, retryDelay);\n }\n\n return true;\n }\n\n function flushIn(delay: number): void {\n if (flushTimer) {\n clearTimeout(flushTimer as ReturnType<typeof setTimeout>);\n }\n\n // We need to unref the timer in node.js, otherwise the node process never exit.\n flushTimer = safeUnref(\n setTimeout(async () => {\n flushTimer = undefined;\n\n const found = await store.shift();\n if (found) {\n log('Attempting to send previously queued event');\n\n // We should to update the sent_at timestamp to the current time.\n found[0].sent_at = new Date(safeDateNow()).toISOString();\n\n void send(found, true).catch(e => {\n log('Failed to retry sending', e);\n });\n }\n }, delay),\n ) as Timer;\n }\n\n function flushWithBackOff(): void {\n if (flushTimer) {\n return;\n }\n\n flushIn(retryDelay);\n\n retryDelay = Math.min(retryDelay * 2, MAX_DELAY);\n }\n\n async function send(envelope: Envelope, isRetry: boolean = false): Promise<TransportMakeRequestResponse> {\n // We queue all replay envelopes to avoid multiple replay envelopes being sent at the same time. If one fails, we\n // need to retry them in order.\n if (!isRetry && envelopeContainsItemType(envelope, ['replay_event', 'replay_recording'])) {\n await store.push(envelope);\n flushIn(MIN_DELAY);\n return {};\n }\n\n try {\n if (options.shouldSend && (await options.shouldSend(envelope)) === false) {\n throw new Error('Envelope not sent because `shouldSend` callback returned false');\n }\n\n const result = await transport.send(envelope);\n\n let delay = MIN_DELAY;\n\n if (result) {\n // If there's a retry-after header, use that as the next delay.\n if (result.headers?.['retry-after']) {\n delay = parseRetryAfterHeader(result.headers['retry-after']);\n } else if (result.headers?.['x-sentry-rate-limits']) {\n delay = 60_000; // 60 seconds\n } // If we have a server error, return now so we don't flush the queue.\n else if ((result.statusCode || 0) >= 400) {\n return result;\n }\n }\n\n flushIn(delay);\n retryDelay = START_DELAY;\n return result;\n } catch (e) {\n if (await shouldQueue(envelope, e as Error, retryDelay)) {\n // If this envelope was a retry, we want to add it to the front of the queue so it's retried again first.\n if (isRetry) {\n await store.unshift(envelope);\n } else {\n await store.push(envelope);\n }\n flushWithBackOff();\n log('Error sending. Event queued.', e as Error);\n return {};\n } else {\n throw e;\n }\n }\n }\n\n if (options.flushAtStartup) {\n flushWithBackOff();\n }\n\n return {\n send,\n flush: timeout => {\n // If there's no timeout, we should attempt to flush the offline queue.\n if (timeout === undefined) {\n retryDelay = START_DELAY;\n flushIn(MIN_DELAY);\n }\n\n return transport.flush(timeout);\n },\n };\n };\n}\n"],"names":["DEBUG_BUILD","debug","retryDelay","envelopeContainsItemType","safeUnref","safeDateNow","envelope","parseRetryAfterHeader"],"mappings":";;;;;;;;;AASO,MAAM,SAAA,GAAY;AAClB,MAAM,WAAA,GAAc;AAC3B,MAAM,SAAA,GAAY,IAAA;AAqDX,SAAS,qBACd,eAAA,EACsD;AACtD,EAAA,SAAS,OAAO,IAAA,EAAuB;AACrC,IAAAA,sBAAA,IAAeC,iBAAA,CAAM,GAAA,CAAI,YAAA,EAAc,GAAG,IAAI,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,CAAA,OAAA,KAAW;AAChB,IAAA,MAAM,SAAA,GAAY,gBAAgB,OAAO,CAAA;AAEzC,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAEzC,IAAA,IAAI,UAAA,GAAa,WAAA;AACjB,IAAA,IAAI,UAAA;AAEJ,IAAA,SAAS,WAAA,CAAY,GAAA,EAAe,KAAA,EAAcC,WAAAA,EAAgD;AAEhG,MAAA,IAAIC,iCAAA,CAAyB,GAAA,EAAK,CAAC,eAAe,CAAC,CAAA,EAAG;AACpD,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,OAAO,OAAA,CAAQ,WAAA,CAAY,GAAA,EAAK,KAAA,EAAOD,WAAU,CAAA;AAAA,MACnD;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,SAAS,QAAQ,KAAA,EAAqB;AACpC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,YAAA,CAAa,UAA2C,CAAA;AAAA,MAC1D;AAGA,MAAA,UAAA,GAAaE,eAAA;AAAA,QACX,WAAW,YAAY;AACrB,UAAA,UAAA,GAAa,MAAA;AAEb,UAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,KAAA,EAAM;AAChC,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,GAAA,CAAI,4CAA4C,CAAA;AAGhD,YAAA,KAAA,CAAM,CAAC,EAAE,OAAA,GAAU,IAAI,KAAKC,6BAAA,EAAa,EAAE,WAAA,EAAY;AAEvD,YAAA,KAAK,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA,CAAE,MAAM,CAAA,CAAA,KAAK;AAChC,cAAA,GAAA,CAAI,2BAA2B,CAAC,CAAA;AAAA,YAClC,CAAC,CAAA;AAAA,UACH;AAAA,QACF,GAAG,KAAK;AAAA,OACV;AAAA,IACF;AAEA,IAAA,SAAS,gBAAA,GAAyB;AAChC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,UAAU,CAAA;AAElB,MAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,CAAA,EAAG,SAAS,CAAA;AAAA,IACjD;AAEA,IAAA,eAAe,IAAA,CAAKC,UAAA,EAAoB,OAAA,GAAmB,KAAA,EAA8C;AAGvG,MAAA,IAAI,CAAC,WAAWH,iCAAA,CAAyBG,UAAA,EAAU,CAAC,cAAA,EAAgB,kBAAkB,CAAC,CAAA,EAAG;AACxF,QAAA,MAAM,KAAA,CAAM,KAAKA,UAAQ,CAAA;AACzB,QAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,IAAI;AACF,QAAA,IAAI,QAAQ,UAAA,IAAe,MAAM,QAAQ,UAAA,CAAWA,UAAQ,MAAO,KAAA,EAAO;AACxE,UAAA,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAAA,QAClF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,IAAA,CAAKA,UAAQ,CAAA;AAE5C,QAAA,IAAI,KAAA,GAAQ,SAAA;AAEZ,QAAA,IAAI,MAAA,EAAQ;AAEV,UAAA,IAAI,MAAA,CAAO,OAAA,GAAU,aAAa,CAAA,EAAG;AACnC,YAAA,KAAA,GAAQC,+BAAA,CAAsB,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAC,CAAA;AAAA,UAC7D,CAAA,MAAA,IAAW,MAAA,CAAO,OAAA,GAAU,sBAAsB,CAAA,EAAG;AACnD,YAAA,KAAA,GAAQ,GAAA;AAAA,UACV,CAAA,MAAA,IAAA,CACU,MAAA,CAAO,UAAA,IAAc,CAAA,KAAM,GAAA,EAAK;AACxC,YAAA,OAAO,MAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA,UAAA,GAAa,WAAA;AACb,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,IAAI,MAAM,WAAA,CAAYD,UAAA,EAAU,CAAA,EAAY,UAAU,CAAA,EAAG;AAEvD,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,KAAA,CAAM,QAAQA,UAAQ,CAAA;AAAA,UAC9B,CAAA,MAAO;AACL,YAAA,MAAM,KAAA,CAAM,KAAKA,UAAQ,CAAA;AAAA,UAC3B;AACA,UAAA,gBAAA,EAAiB;AACjB,UAAA,GAAA,CAAI,gCAAgC,CAAU,CAAA;AAC9C,UAAA,OAAO,EAAC;AAAA,QACV,CAAA,MAAO;AACL,UAAA,MAAM,CAAA;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,gBAAA,EAAiB;AAAA,IACnB;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,OAAO,CAAA,OAAA,KAAW;AAEhB,QAAA,IAAI,YAAY,MAAA,EAAW;AACzB,UAAA,UAAA,GAAa,WAAA;AACb,UAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,QACnB;AAEA,QAAA,OAAO,SAAA,CAAU,MAAM,OAAO,CAAA;AAAA,MAChC;AAAA,KACF;AAAA,EACF,CAAA;AACF;;;;;;"}

@@ -14,3 +14,4 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

stackFrameVariables: true,
frameContextLines: 5
frameContextLines: 7
// default should be 5, but ContextLines integration uses 7
} : {

@@ -24,3 +25,4 @@ userInfo: false,

stackFrameVariables: true,
frameContextLines: 5
frameContextLines: 7
// default should be 5, but ContextLines integration uses 7
};

@@ -27,0 +29,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"defaultPiiToCollectionOptions.js","sources":["../../../../src/utils/data-collection/defaultPiiToCollectionOptions.ts"],"sourcesContent":["import { PII_HEADER_SNIPPETS } from './filtering-snippets';\nimport type { ResolvedDataCollection } from '../../types/datacollection';\n\n/**\n * Helper function that maps the `sendDefaultPii` boolean flag to the corresponding `DataCollection` configuration.\n */\nexport function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): ResolvedDataCollection {\n return sendDefaultPii === true\n ? {\n userInfo: true,\n cookies: true,\n httpHeaders: { request: true, response: true },\n httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'],\n queryParams: true,\n genAI: { inputs: true, outputs: true },\n stackFrameVariables: true,\n frameContextLines: 5,\n }\n : {\n userInfo: false,\n cookies: { deny: PII_HEADER_SNIPPETS },\n httpHeaders: { request: { deny: PII_HEADER_SNIPPETS }, response: { deny: PII_HEADER_SNIPPETS } },\n httpBodies: [],\n queryParams: { deny: PII_HEADER_SNIPPETS },\n genAI: { inputs: false, outputs: false },\n stackFrameVariables: true,\n frameContextLines: 5,\n };\n}\n"],"names":["PII_HEADER_SNIPPETS"],"mappings":";;;;AAMO,SAAS,8BAA8B,cAAA,EAAkD;AAC9F,EAAA,OAAO,mBAAmB,IAAA,GACtB;AAAA,IACE,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,IAC7C,UAAA,EAAY,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,oBAAoB,kBAAkB,CAAA;AAAA,IACzF,WAAA,EAAa,IAAA;AAAA,IACb,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,IACrC,mBAAA,EAAqB,IAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA,GACrB,GACA;AAAA,IACE,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,EAAE,IAAA,EAAMA,qCAAA,EAAoB;AAAA,IACrC,WAAA,EAAa,EAAE,OAAA,EAAS,EAAE,IAAA,EAAMA,qCAAA,EAAoB,EAAG,QAAA,EAAU,EAAE,IAAA,EAAMA,qCAAA,EAAoB,EAAE;AAAA,IAC/F,YAAY,EAAC;AAAA,IACb,WAAA,EAAa,EAAE,IAAA,EAAMA,qCAAA,EAAoB;AAAA,IACzC,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACvC,mBAAA,EAAqB,IAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA,GACrB;AACN;;;;"}
{"version":3,"file":"defaultPiiToCollectionOptions.js","sources":["../../../../src/utils/data-collection/defaultPiiToCollectionOptions.ts"],"sourcesContent":["import { PII_HEADER_SNIPPETS } from './filtering-snippets';\nimport type { ResolvedDataCollection } from '../../types/datacollection';\n\n/**\n * Helper function that maps the `sendDefaultPii` boolean flag to the corresponding `DataCollection` configuration.\n * Used as a backward-compatibility bridge when `dataCollection` is not set by the user.\n *\n * TODO(v11): Remove this function along with `sendDefaultPii`. Once `dataCollection` is the only API,\n * the DEFAULTS in `resolveDataCollectionOptions` (including `userInfo: true`) will always apply.\n */\nexport function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): ResolvedDataCollection {\n return sendDefaultPii === true\n ? {\n userInfo: true,\n cookies: true,\n httpHeaders: { request: true, response: true },\n httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'],\n queryParams: true,\n genAI: { inputs: true, outputs: true },\n stackFrameVariables: true,\n frameContextLines: 7, // default should be 5, but ContextLines integration uses 7\n }\n : {\n userInfo: false,\n cookies: { deny: PII_HEADER_SNIPPETS },\n httpHeaders: { request: { deny: PII_HEADER_SNIPPETS }, response: { deny: PII_HEADER_SNIPPETS } },\n httpBodies: [],\n queryParams: { deny: PII_HEADER_SNIPPETS },\n genAI: { inputs: false, outputs: false },\n stackFrameVariables: true,\n frameContextLines: 7, // default should be 5, but ContextLines integration uses 7\n };\n}\n"],"names":["PII_HEADER_SNIPPETS"],"mappings":";;;;AAUO,SAAS,8BAA8B,cAAA,EAAkD;AAC9F,EAAA,OAAO,mBAAmB,IAAA,GACtB;AAAA,IACE,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,IAC7C,UAAA,EAAY,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,oBAAoB,kBAAkB,CAAA;AAAA,IACzF,WAAA,EAAa,IAAA;AAAA,IACb,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,IACrC,mBAAA,EAAqB,IAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA;AAAA,GACrB,GACA;AAAA,IACE,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,EAAE,IAAA,EAAMA,qCAAA,EAAoB;AAAA,IACrC,WAAA,EAAa,EAAE,OAAA,EAAS,EAAE,IAAA,EAAMA,qCAAA,EAAoB,EAAG,QAAA,EAAU,EAAE,IAAA,EAAMA,qCAAA,EAAoB,EAAE;AAAA,IAC/F,YAAY,EAAC;AAAA,IACb,WAAA,EAAa,EAAE,IAAA,EAAMA,qCAAA,EAAoB;AAAA,IACzC,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACvC,mBAAA,EAAqB,IAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA;AAAA,GACrB;AACN;;;;"}

@@ -6,6 +6,6 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const DEFAULTS = {
userInfo: false,
userInfo: true,
cookies: true,
httpHeaders: { request: true, response: true },
httpBodies: [],
httpBodies: ["incomingRequest", "outgoingRequest", "incomingResponse", "outgoingResponse"],
queryParams: true,

@@ -12,0 +12,0 @@ genAI: { inputs: true, outputs: true },

@@ -1,1 +0,1 @@

{"version":3,"file":"resolveDataCollectionOptions.js","sources":["../../../../src/utils/data-collection/resolveDataCollectionOptions.ts"],"sourcesContent":["import type { DataCollection, ResolvedDataCollection } from '../../types/datacollection';\nimport { defaultPiiToCollectionOptions } from './defaultPiiToCollectionOptions';\n\nconst DEFAULTS: ResolvedDataCollection = {\n userInfo: false,\n cookies: true,\n httpHeaders: { request: true, response: true },\n httpBodies: [],\n queryParams: true,\n genAI: { inputs: true, outputs: true },\n stackFrameVariables: true,\n frameContextLines: 5,\n};\n\n/**\n * Resolves the effective `DataCollection` configuration from client options.\n *\n * Precedence:\n * 1. Fields explicitly set in `dataCollection`\n * 2. If `sendDefaultPii` is set and `dataCollection` is absent, bridge via `defaultPiiToCollectionOptions`\n * 3. Spec defaults\n */\nexport function resolveDataCollectionOptions(options: {\n dataCollection?: DataCollection;\n sendDefaultPii?: boolean;\n}): ResolvedDataCollection {\n const base = options.dataCollection != null ? DEFAULTS : defaultPiiToCollectionOptions(options.sendDefaultPii);\n\n const dc = options.dataCollection ?? {};\n\n return {\n userInfo: dc.userInfo ?? base.userInfo,\n cookies: dc.cookies ?? base.cookies,\n httpHeaders: {\n request: dc.httpHeaders?.request ?? base.httpHeaders.request,\n response: dc.httpHeaders?.response ?? base.httpHeaders.response,\n },\n httpBodies: dc.httpBodies ?? base.httpBodies,\n queryParams: dc.queryParams ?? base.queryParams,\n genAI: {\n inputs: dc.genAI?.inputs ?? base.genAI.inputs,\n outputs: dc.genAI?.outputs ?? base.genAI.outputs,\n },\n stackFrameVariables: dc.stackFrameVariables ?? base.stackFrameVariables,\n frameContextLines: dc.frameContextLines ?? base.frameContextLines,\n };\n}\n"],"names":["defaultPiiToCollectionOptions"],"mappings":";;;;AAGA,MAAM,QAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,KAAA;AAAA,EACV,OAAA,EAAS,IAAA;AAAA,EACT,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,EAC7C,YAAY,EAAC;AAAA,EACb,WAAA,EAAa,IAAA;AAAA,EACb,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,EACrC,mBAAA,EAAqB,IAAA;AAAA,EACrB,iBAAA,EAAmB;AACrB,CAAA;AAUO,SAAS,6BAA6B,OAAA,EAGlB;AACzB,EAAA,MAAM,OAAO,OAAA,CAAQ,cAAA,IAAkB,OAAO,QAAA,GAAWA,2DAAA,CAA8B,QAAQ,cAAc,CAAA;AAE7G,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,cAAA,IAAkB,EAAC;AAEtC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,EAAA,CAAG,QAAA,IAAY,IAAA,CAAK,QAAA;AAAA,IAC9B,OAAA,EAAS,EAAA,CAAG,OAAA,IAAW,IAAA,CAAK,OAAA;AAAA,IAC5B,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,EAAA,CAAG,WAAA,EAAa,OAAA,IAAW,KAAK,WAAA,CAAY,OAAA;AAAA,MACrD,QAAA,EAAU,EAAA,CAAG,WAAA,EAAa,QAAA,IAAY,KAAK,WAAA,CAAY;AAAA,KACzD;AAAA,IACA,UAAA,EAAY,EAAA,CAAG,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IAClC,WAAA,EAAa,EAAA,CAAG,WAAA,IAAe,IAAA,CAAK,WAAA;AAAA,IACpC,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,EAAA,CAAG,KAAA,EAAO,MAAA,IAAU,KAAK,KAAA,CAAM,MAAA;AAAA,MACvC,OAAA,EAAS,EAAA,CAAG,KAAA,EAAO,OAAA,IAAW,KAAK,KAAA,CAAM;AAAA,KAC3C;AAAA,IACA,mBAAA,EAAqB,EAAA,CAAG,mBAAA,IAAuB,IAAA,CAAK,mBAAA;AAAA,IACpD,iBAAA,EAAmB,EAAA,CAAG,iBAAA,IAAqB,IAAA,CAAK;AAAA,GAClD;AACF;;;;"}
{"version":3,"file":"resolveDataCollectionOptions.js","sources":["../../../../src/utils/data-collection/resolveDataCollectionOptions.ts"],"sourcesContent":["import type { DataCollection, ResolvedDataCollection } from '../../types/datacollection';\nimport { defaultPiiToCollectionOptions } from './defaultPiiToCollectionOptions';\n\nconst DEFAULTS: ResolvedDataCollection = {\n userInfo: true,\n cookies: true,\n httpHeaders: { request: true, response: true },\n httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'],\n queryParams: true,\n genAI: { inputs: true, outputs: true },\n stackFrameVariables: true,\n frameContextLines: 5,\n};\n\n/**\n * Resolves the effective `DataCollection` configuration from client options.\n *\n * Precedence:\n * 1. Fields explicitly set in `dataCollection`\n * 2. If `sendDefaultPii` is set and `dataCollection` is absent, bridge via `defaultPiiToCollectionOptions`\n * 3. Spec defaults\n *\n * TODO(v11): Remove `sendDefaultPii` support and always fall through to DEFAULTS so that `userInfo: true`\n * NOTE: In v10, DEFAULTS only apply when `dataCollection` is explicitly provided.\n * When `dataCollection` is absent, the legacy `sendDefaultPii` bridge is used, which defaults to\n * `userInfo: false` to preserve backward compatibility.\n */\nexport function resolveDataCollectionOptions(options: {\n dataCollection?: DataCollection;\n sendDefaultPii?: boolean;\n}): ResolvedDataCollection {\n // TODO(v11): Remove the sendDefaultPii bridge and always use DEFAULTS.\n const base = options.dataCollection != null ? DEFAULTS : defaultPiiToCollectionOptions(options.sendDefaultPii);\n\n const dc = options.dataCollection ?? {};\n\n return {\n userInfo: dc.userInfo ?? base.userInfo,\n cookies: dc.cookies ?? base.cookies,\n httpHeaders: {\n request: dc.httpHeaders?.request ?? base.httpHeaders.request,\n response: dc.httpHeaders?.response ?? base.httpHeaders.response,\n },\n httpBodies: dc.httpBodies ?? base.httpBodies,\n queryParams: dc.queryParams ?? base.queryParams,\n genAI: {\n inputs: dc.genAI?.inputs ?? base.genAI.inputs,\n outputs: dc.genAI?.outputs ?? base.genAI.outputs,\n },\n stackFrameVariables: dc.stackFrameVariables ?? base.stackFrameVariables,\n frameContextLines: dc.frameContextLines ?? base.frameContextLines,\n };\n}\n"],"names":["defaultPiiToCollectionOptions"],"mappings":";;;;AAGA,MAAM,QAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,IAAA;AAAA,EACV,OAAA,EAAS,IAAA;AAAA,EACT,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,EAC7C,UAAA,EAAY,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,oBAAoB,kBAAkB,CAAA;AAAA,EACzF,WAAA,EAAa,IAAA;AAAA,EACb,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,EACrC,mBAAA,EAAqB,IAAA;AAAA,EACrB,iBAAA,EAAmB;AACrB,CAAA;AAeO,SAAS,6BAA6B,OAAA,EAGlB;AAEzB,EAAA,MAAM,OAAO,OAAA,CAAQ,cAAA,IAAkB,OAAO,QAAA,GAAWA,2DAAA,CAA8B,QAAQ,cAAc,CAAA;AAE7G,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,cAAA,IAAkB,EAAC;AAEtC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,EAAA,CAAG,QAAA,IAAY,IAAA,CAAK,QAAA;AAAA,IAC9B,OAAA,EAAS,EAAA,CAAG,OAAA,IAAW,IAAA,CAAK,OAAA;AAAA,IAC5B,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,EAAA,CAAG,WAAA,EAAa,OAAA,IAAW,KAAK,WAAA,CAAY,OAAA;AAAA,MACrD,QAAA,EAAU,EAAA,CAAG,WAAA,EAAa,QAAA,IAAY,KAAK,WAAA,CAAY;AAAA,KACzD;AAAA,IACA,UAAA,EAAY,EAAA,CAAG,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IAClC,WAAA,EAAa,EAAA,CAAG,WAAA,IAAe,IAAA,CAAK,WAAA;AAAA,IACpC,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,EAAA,CAAG,KAAA,EAAO,MAAA,IAAU,KAAK,KAAA,CAAM,MAAA;AAAA,MACvC,OAAA,EAAS,EAAA,CAAG,KAAA,EAAO,OAAA,IAAW,KAAK,KAAA,CAAM;AAAA,KAC3C;AAAA,IACA,mBAAA,EAAqB,EAAA,CAAG,mBAAA,IAAuB,IAAA,CAAK,mBAAA;AAAA,IACpD,iBAAA,EAAmB,EAAA,CAAG,iBAAA,IAAqB,IAAA,CAAK;AAAA,GAClD;AACF;;;;"}

@@ -6,2 +6,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const normalize = require('./normalize.js');
const randomSafeContext = require('./randomSafeContext.js');
const worldwide = require('./worldwide.js');

@@ -149,3 +150,3 @@

event_id: event.event_id,
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
sent_at: new Date(randomSafeContext.safeDateNow()).toISOString(),
...sdkInfo && { sdk: sdkInfo },

@@ -152,0 +153,0 @@ ...!!tunnel && dsn$1 && { dsn: dsn.dsnToString(dsn$1) },

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.js","sources":["../../../src/utils/envelope.ts"],"sourcesContent":["import { getSentryCarrier } from '../carrier';\nimport type { Attachment } from '../types/attachment';\nimport type { DataCategory } from '../types/datacategory';\nimport type { DsnComponents } from '../types/dsn';\nimport type {\n AttachmentItem,\n BaseEnvelopeHeaders,\n BaseEnvelopeItemHeaders,\n Envelope,\n EnvelopeItemType,\n EventEnvelopeHeaders,\n SpanItem,\n} from '../types/envelope';\nimport type { Event } from '../types/event';\nimport type { SdkInfo } from '../types/sdkinfo';\nimport type { SdkMetadata } from '../types/sdkmetadata';\nimport type { SpanJSON } from '../types/span';\nimport { dsnToString } from './dsn';\nimport { normalize } from './normalize';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope<E extends Envelope>(headers: E[0], items: E[1] = []): E {\n return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope<E extends Envelope>(envelope: E, newItem: E[1][number]): E {\n const [headers, items] = envelope;\n return [headers, [...items, newItem]] as unknown as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nexport function forEachEnvelopeItem<E extends Envelope>(\n envelope: Envelope,\n callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => boolean | void,\n): boolean {\n const envelopeItems = envelope[1];\n\n for (const envelopeItem of envelopeItems) {\n const envelopeItemType = envelopeItem[0].type;\n const result = callback(envelopeItem, envelopeItemType);\n\n if (result) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nexport function envelopeContainsItemType(envelope: Envelope, types: EnvelopeItemType[]): boolean {\n return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8 array.\n */\nfunction encodeUTF8(input: string): Uint8Array {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.encodePolyfill ? carrier.encodePolyfill(input) : new TextEncoder().encode(input);\n}\n\n/**\n * Decode a UTF8 array to string.\n */\nfunction decodeUTF8(input: Uint8Array): string {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.decodePolyfill ? carrier.decodePolyfill(input) : new TextDecoder().decode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope): string | Uint8Array {\n const [envHeaders, items] = envelope;\n // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n function append(next: string | Uint8Array): void {\n if (typeof parts === 'string') {\n parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next];\n } else {\n parts.push(typeof next === 'string' ? encodeUTF8(next) : next);\n }\n }\n\n for (const item of items) {\n const [itemHeaders, payload] = item;\n\n append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n if (typeof payload === 'string' || payload instanceof Uint8Array) {\n append(payload);\n } else {\n let stringifiedPayload: string;\n try {\n stringifiedPayload = JSON.stringify(payload);\n } catch {\n // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.stringify()` still\n // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n // performance impact but in this case a performance hit is better than throwing.\n stringifiedPayload = JSON.stringify(normalize(payload));\n }\n append(stringifiedPayload);\n }\n }\n\n return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n merged.set(buffer, offset);\n offset += buffer.length;\n }\n\n return merged;\n}\n\n/**\n * Parses an envelope\n */\nexport function parseEnvelope(env: string | Uint8Array): Envelope {\n let buffer = typeof env === 'string' ? encodeUTF8(env) : env;\n\n function readBinary(length: number): Uint8Array {\n const bin = buffer.subarray(0, length);\n // Replace the buffer with the remaining data excluding trailing newline\n buffer = buffer.subarray(length + 1);\n return bin;\n }\n\n function readJson<T>(): T {\n let i = buffer.indexOf(0xa);\n // If we couldn't find a newline, we must have found the end of the buffer\n if (i < 0) {\n i = buffer.length;\n }\n\n return JSON.parse(decodeUTF8(readBinary(i))) as T;\n }\n\n const envelopeHeader = readJson<BaseEnvelopeHeaders>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items: [any, any][] = [];\n\n while (buffer.length) {\n const itemHeader = readJson<BaseEnvelopeItemHeaders>();\n const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n }\n\n return [envelopeHeader, items];\n}\n\n/**\n * Creates envelope item for a single span\n */\nexport function createSpanEnvelopeItem(spanJson: Partial<SpanJSON>): SpanItem {\n const spanHeaders: SpanItem[0] = {\n type: 'span',\n };\n\n return [spanHeaders, spanJson];\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(attachment: Attachment): AttachmentItem {\n const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data;\n\n return [\n {\n type: 'attachment',\n length: buffer.length,\n filename: attachment.filename,\n content_type: attachment.contentType,\n attachment_type: attachment.attachmentType,\n },\n buffer,\n ];\n}\n\ntype OverriddenItemType = Exclude<EnvelopeItemType, DataCategory>;\n\n// Map of envelope item types to data categories where the category differs from the type.\n// Types that map to themselves (session, attachment, transaction, profile, feedback, span, metric) fall through.\nconst DATA_CATEGORY_OVERRIDES: Record<OverriddenItemType, DataCategory> = {\n sessions: 'session',\n event: 'error',\n client_report: 'internal',\n user_report: 'default',\n profile_chunk: 'profile',\n replay_event: 'replay',\n replay_recording: 'replay',\n check_in: 'monitor',\n raw_security: 'security',\n log: 'log_item',\n trace_metric: 'metric',\n};\n\nfunction _isOverriddenType(type: EnvelopeItemType): type is OverriddenItemType {\n return type in DATA_CATEGORY_OVERRIDES;\n}\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n return _isOverriddenType(type) ? DATA_CATEGORY_OVERRIDES[type] : type;\n}\n\n/** Extracts the minimal SDK info from the metadata or an events */\nexport function getSdkMetadataForEnvelopeHeader(metadataOrEvent?: SdkMetadata | Event): SdkInfo | undefined {\n if (!metadataOrEvent?.sdk) {\n return;\n }\n const { name, version } = metadataOrEvent.sdk;\n return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nexport function createEventEnvelopeHeaders(\n event: Event,\n sdkInfo: SdkInfo | undefined,\n tunnel: string | undefined,\n dsn?: DsnComponents,\n): EventEnvelopeHeaders {\n const dynamicSamplingContext = event.sdkProcessingMetadata?.dynamicSamplingContext;\n return {\n event_id: event.event_id as string,\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n ...(dynamicSamplingContext && {\n trace: dynamicSamplingContext,\n }),\n };\n}\n"],"names":["carrier","getSentryCarrier","GLOBAL_OBJ","normalize","dsn","dsnToString"],"mappings":"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"}
{"version":3,"file":"envelope.js","sources":["../../../src/utils/envelope.ts"],"sourcesContent":["import { getSentryCarrier } from '../carrier';\nimport type { Attachment } from '../types/attachment';\nimport type { DataCategory } from '../types/datacategory';\nimport type { DsnComponents } from '../types/dsn';\nimport type {\n AttachmentItem,\n BaseEnvelopeHeaders,\n BaseEnvelopeItemHeaders,\n Envelope,\n EnvelopeItemType,\n EventEnvelopeHeaders,\n SpanItem,\n} from '../types/envelope';\nimport type { Event } from '../types/event';\nimport type { SdkInfo } from '../types/sdkinfo';\nimport type { SdkMetadata } from '../types/sdkmetadata';\nimport type { SpanJSON } from '../types/span';\nimport { dsnToString } from './dsn';\nimport { normalize } from './normalize';\nimport { safeDateNow } from './randomSafeContext';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope<E extends Envelope>(headers: E[0], items: E[1] = []): E {\n return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope<E extends Envelope>(envelope: E, newItem: E[1][number]): E {\n const [headers, items] = envelope;\n return [headers, [...items, newItem]] as unknown as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nexport function forEachEnvelopeItem<E extends Envelope>(\n envelope: Envelope,\n callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => boolean | void,\n): boolean {\n const envelopeItems = envelope[1];\n\n for (const envelopeItem of envelopeItems) {\n const envelopeItemType = envelopeItem[0].type;\n const result = callback(envelopeItem, envelopeItemType);\n\n if (result) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nexport function envelopeContainsItemType(envelope: Envelope, types: EnvelopeItemType[]): boolean {\n return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8 array.\n */\nfunction encodeUTF8(input: string): Uint8Array {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.encodePolyfill ? carrier.encodePolyfill(input) : new TextEncoder().encode(input);\n}\n\n/**\n * Decode a UTF8 array to string.\n */\nfunction decodeUTF8(input: Uint8Array): string {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.decodePolyfill ? carrier.decodePolyfill(input) : new TextDecoder().decode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope): string | Uint8Array {\n const [envHeaders, items] = envelope;\n // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n function append(next: string | Uint8Array): void {\n if (typeof parts === 'string') {\n parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next];\n } else {\n parts.push(typeof next === 'string' ? encodeUTF8(next) : next);\n }\n }\n\n for (const item of items) {\n const [itemHeaders, payload] = item;\n\n append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n if (typeof payload === 'string' || payload instanceof Uint8Array) {\n append(payload);\n } else {\n let stringifiedPayload: string;\n try {\n stringifiedPayload = JSON.stringify(payload);\n } catch {\n // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.stringify()` still\n // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n // performance impact but in this case a performance hit is better than throwing.\n stringifiedPayload = JSON.stringify(normalize(payload));\n }\n append(stringifiedPayload);\n }\n }\n\n return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n merged.set(buffer, offset);\n offset += buffer.length;\n }\n\n return merged;\n}\n\n/**\n * Parses an envelope\n */\nexport function parseEnvelope(env: string | Uint8Array): Envelope {\n let buffer = typeof env === 'string' ? encodeUTF8(env) : env;\n\n function readBinary(length: number): Uint8Array {\n const bin = buffer.subarray(0, length);\n // Replace the buffer with the remaining data excluding trailing newline\n buffer = buffer.subarray(length + 1);\n return bin;\n }\n\n function readJson<T>(): T {\n let i = buffer.indexOf(0xa);\n // If we couldn't find a newline, we must have found the end of the buffer\n if (i < 0) {\n i = buffer.length;\n }\n\n return JSON.parse(decodeUTF8(readBinary(i))) as T;\n }\n\n const envelopeHeader = readJson<BaseEnvelopeHeaders>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items: [any, any][] = [];\n\n while (buffer.length) {\n const itemHeader = readJson<BaseEnvelopeItemHeaders>();\n const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n }\n\n return [envelopeHeader, items];\n}\n\n/**\n * Creates envelope item for a single span\n */\nexport function createSpanEnvelopeItem(spanJson: Partial<SpanJSON>): SpanItem {\n const spanHeaders: SpanItem[0] = {\n type: 'span',\n };\n\n return [spanHeaders, spanJson];\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(attachment: Attachment): AttachmentItem {\n const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data;\n\n return [\n {\n type: 'attachment',\n length: buffer.length,\n filename: attachment.filename,\n content_type: attachment.contentType,\n attachment_type: attachment.attachmentType,\n },\n buffer,\n ];\n}\n\ntype OverriddenItemType = Exclude<EnvelopeItemType, DataCategory>;\n\n// Map of envelope item types to data categories where the category differs from the type.\n// Types that map to themselves (session, attachment, transaction, profile, feedback, span, metric) fall through.\nconst DATA_CATEGORY_OVERRIDES: Record<OverriddenItemType, DataCategory> = {\n sessions: 'session',\n event: 'error',\n client_report: 'internal',\n user_report: 'default',\n profile_chunk: 'profile',\n replay_event: 'replay',\n replay_recording: 'replay',\n check_in: 'monitor',\n raw_security: 'security',\n log: 'log_item',\n trace_metric: 'metric',\n};\n\nfunction _isOverriddenType(type: EnvelopeItemType): type is OverriddenItemType {\n return type in DATA_CATEGORY_OVERRIDES;\n}\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n return _isOverriddenType(type) ? DATA_CATEGORY_OVERRIDES[type] : type;\n}\n\n/** Extracts the minimal SDK info from the metadata or an events */\nexport function getSdkMetadataForEnvelopeHeader(metadataOrEvent?: SdkMetadata | Event): SdkInfo | undefined {\n if (!metadataOrEvent?.sdk) {\n return;\n }\n const { name, version } = metadataOrEvent.sdk;\n return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nexport function createEventEnvelopeHeaders(\n event: Event,\n sdkInfo: SdkInfo | undefined,\n tunnel: string | undefined,\n dsn?: DsnComponents,\n): EventEnvelopeHeaders {\n const dynamicSamplingContext = event.sdkProcessingMetadata?.dynamicSamplingContext;\n return {\n event_id: event.event_id as string,\n sent_at: new Date(safeDateNow()).toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n ...(dynamicSamplingContext && {\n trace: dynamicSamplingContext,\n }),\n };\n}\n"],"names":["carrier","getSentryCarrier","GLOBAL_OBJ","normalize","dsn","safeDateNow","dsnToString"],"mappings":"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"}
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const SDK_VERSION = "10.56.0" ;
const SDK_VERSION = "10.57.0" ;
exports.SDK_VERSION = SDK_VERSION;
//# sourceMappingURL=version.js.map
import { dsnToString } from './utils/dsn.js';
import { createEnvelope } from './utils/envelope.js';
import { safeDateNow } from './utils/randomSafeContext.js';
function createCheckInEnvelope(checkIn, dynamicSamplingContext, metadata, tunnel, dsn) {
const headers = {
sent_at: (/* @__PURE__ */ new Date()).toISOString()
sent_at: new Date(safeDateNow()).toISOString()
};

@@ -8,0 +9,0 @@ if (metadata?.sdk) {

@@ -1,1 +0,1 @@

{"version":3,"file":"checkin.js","sources":["../../src/checkin.ts"],"sourcesContent":["import type { SerializedCheckIn } from './types/checkin';\nimport type { DsnComponents } from './types/dsn';\nimport type { CheckInEnvelope, CheckInItem, DynamicSamplingContext } from './types/envelope';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport { dsnToString } from './utils/dsn';\nimport { createEnvelope } from './utils/envelope';\n\n/**\n * Create envelope from check in item.\n */\nexport function createCheckInEnvelope(\n checkIn: SerializedCheckIn,\n dynamicSamplingContext?: Partial<DynamicSamplingContext>,\n metadata?: SdkMetadata,\n tunnel?: string,\n dsn?: DsnComponents,\n): CheckInEnvelope {\n const headers: CheckInEnvelope[0] = {\n sent_at: new Date().toISOString(),\n };\n\n if (metadata?.sdk) {\n headers.sdk = {\n name: metadata.sdk.name,\n version: metadata.sdk.version,\n };\n }\n\n if (!!tunnel && !!dsn) {\n headers.dsn = dsnToString(dsn);\n }\n\n if (dynamicSamplingContext) {\n headers.trace = dynamicSamplingContext as DynamicSamplingContext;\n }\n\n const item = createCheckInEnvelopeItem(checkIn);\n return createEnvelope<CheckInEnvelope>(headers, [item]);\n}\n\nfunction createCheckInEnvelopeItem(checkIn: SerializedCheckIn): CheckInItem {\n const checkInHeaders: CheckInItem[0] = {\n type: 'check_in',\n };\n return [checkInHeaders, checkIn];\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,qBAAA,CACd,OAAA,EACA,sBAAA,EACA,QAAA,EACA,QACA,GAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAA8B;AAAA,IAClC,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GAClC;AAEA,EAAA,IAAI,UAAU,GAAA,EAAK;AACjB,IAAA,OAAA,CAAQ,GAAA,GAAM;AAAA,MACZ,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA;AAAA,MACnB,OAAA,EAAS,SAAS,GAAA,CAAI;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,CAAC,MAAA,IAAU,CAAC,CAAC,GAAA,EAAK;AACrB,IAAA,OAAA,CAAQ,GAAA,GAAM,YAAY,GAAG,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,sBAAA,EAAwB;AAC1B,IAAA,OAAA,CAAQ,KAAA,GAAQ,sBAAA;AAAA,EAClB;AAEA,EAAA,MAAM,IAAA,GAAO,0BAA0B,OAAO,CAAA;AAC9C,EAAA,OAAO,cAAA,CAAgC,OAAA,EAAS,CAAC,IAAI,CAAC,CAAA;AACxD;AAEA,SAAS,0BAA0B,OAAA,EAAyC;AAC1E,EAAA,MAAM,cAAA,GAAiC;AAAA,IACrC,IAAA,EAAM;AAAA,GACR;AACA,EAAA,OAAO,CAAC,gBAAgB,OAAO,CAAA;AACjC;;;;"}
{"version":3,"file":"checkin.js","sources":["../../src/checkin.ts"],"sourcesContent":["import type { SerializedCheckIn } from './types/checkin';\nimport type { DsnComponents } from './types/dsn';\nimport type { CheckInEnvelope, CheckInItem, DynamicSamplingContext } from './types/envelope';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport { dsnToString } from './utils/dsn';\nimport { createEnvelope } from './utils/envelope';\nimport { safeDateNow } from './utils/randomSafeContext';\n\n/**\n * Create envelope from check in item.\n */\nexport function createCheckInEnvelope(\n checkIn: SerializedCheckIn,\n dynamicSamplingContext?: Partial<DynamicSamplingContext>,\n metadata?: SdkMetadata,\n tunnel?: string,\n dsn?: DsnComponents,\n): CheckInEnvelope {\n const headers: CheckInEnvelope[0] = {\n sent_at: new Date(safeDateNow()).toISOString(),\n };\n\n if (metadata?.sdk) {\n headers.sdk = {\n name: metadata.sdk.name,\n version: metadata.sdk.version,\n };\n }\n\n if (!!tunnel && !!dsn) {\n headers.dsn = dsnToString(dsn);\n }\n\n if (dynamicSamplingContext) {\n headers.trace = dynamicSamplingContext as DynamicSamplingContext;\n }\n\n const item = createCheckInEnvelopeItem(checkIn);\n return createEnvelope<CheckInEnvelope>(headers, [item]);\n}\n\nfunction createCheckInEnvelopeItem(checkIn: SerializedCheckIn): CheckInItem {\n const checkInHeaders: CheckInItem[0] = {\n type: 'check_in',\n };\n return [checkInHeaders, checkIn];\n}\n"],"names":[],"mappings":";;;;AAWO,SAAS,qBAAA,CACd,OAAA,EACA,sBAAA,EACA,QAAA,EACA,QACA,GAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAA8B;AAAA,IAClC,SAAS,IAAI,IAAA,CAAK,WAAA,EAAa,EAAE,WAAA;AAAY,GAC/C;AAEA,EAAA,IAAI,UAAU,GAAA,EAAK;AACjB,IAAA,OAAA,CAAQ,GAAA,GAAM;AAAA,MACZ,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA;AAAA,MACnB,OAAA,EAAS,SAAS,GAAA,CAAI;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,CAAC,MAAA,IAAU,CAAC,CAAC,GAAA,EAAK;AACrB,IAAA,OAAA,CAAQ,GAAA,GAAM,YAAY,GAAG,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,sBAAA,EAAwB;AAC1B,IAAA,OAAA,CAAQ,KAAA,GAAQ,sBAAA;AAAA,EAClB;AAEA,EAAA,MAAM,IAAA,GAAO,0BAA0B,OAAO,CAAA;AAC9C,EAAA,OAAO,cAAA,CAAgC,OAAA,EAAS,CAAC,IAAI,CAAC,CAAA;AACxD;AAEA,SAAS,0BAA0B,OAAA,EAAyC;AAC1E,EAAA,MAAM,cAAA,GAAiC;AAAA,IACrC,IAAA,EAAM;AAAA,GACR;AACA,EAAA,OAAO,CAAC,gBAAgB,OAAO,CAAA;AACjC;;;;"}

@@ -5,2 +5,3 @@ import { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext.js';

import { getSdkMetadataForEnvelopeHeader, createEventEnvelopeHeaders, createEnvelope, createSpanEnvelopeItem } from './utils/envelope.js';
import { safeDateNow } from './utils/randomSafeContext.js';
import { shouldIgnoreSpan } from './utils/should-ignore-span.js';

@@ -30,3 +31,3 @@ import { spanToJSON, showSpanDropWarning } from './utils/spanUtils.js';

const envelopeHeaders = {
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
sent_at: new Date(safeDateNow()).toISOString(),
...sdkInfo && { sdk: sdkInfo },

@@ -55,3 +56,3 @@ ...!!tunnel && dsn && { dsn: dsnToString(dsn) }

const headers = {
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
sent_at: new Date(safeDateNow()).toISOString(),
...dscHasRequiredProps(dsc) && { trace: dsc },

@@ -58,0 +59,0 @@ ...!!tunnel && dsn && { dsn: dsnToString(dsn) }

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.js","sources":["../../src/envelope.ts"],"sourcesContent":["import type { Client } from './client';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport { isStreamedBeforeSendSpanCallback } from './tracing/spans/beforeSendSpan';\nimport type { LegacyCSPReport } from './types/csp';\nimport type { DsnComponents } from './types/dsn';\nimport type {\n DynamicSamplingContext,\n EventEnvelope,\n EventItem,\n RawSecurityEnvelope,\n RawSecurityItem,\n SessionEnvelope,\n SessionItem,\n SpanEnvelope,\n SpanItem,\n} from './types/envelope';\nimport type { Event } from './types/event';\nimport type { SdkInfo } from './types/sdkinfo';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport type { Session, SessionAggregates } from './types/session';\nimport { dsnToString } from './utils/dsn';\nimport {\n createEnvelope,\n createEventEnvelopeHeaders,\n createSpanEnvelopeItem,\n getSdkMetadataForEnvelopeHeader,\n} from './utils/envelope';\nimport { uuid4 } from './utils/misc';\nimport { shouldIgnoreSpan } from './utils/should-ignore-span';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n *\n * @internal, exported only for testing\n **/\nexport function _enhanceEventWithSdkInfo(event: Event, newSdkInfo?: SdkInfo): Event {\n if (!newSdkInfo) {\n return event;\n }\n\n const eventSdkInfo = event.sdk || {};\n\n event.sdk = {\n ...eventSdkInfo,\n name: eventSdkInfo.name || newSdkInfo.name,\n version: eventSdkInfo.version || newSdkInfo.version,\n integrations: [...(event.sdk?.integrations || []), ...(newSdkInfo.integrations || [])],\n packages: [...(event.sdk?.packages || []), ...(newSdkInfo.packages || [])],\n settings:\n event.sdk?.settings || newSdkInfo.settings\n ? {\n ...event.sdk?.settings,\n ...newSdkInfo.settings,\n }\n : undefined,\n };\n\n return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n session: Session | SessionAggregates,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): SessionEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem: SessionItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n event: Event,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): EventEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n /*\n Note: Due to TS, event.type may be `replay_event`, theoretically.\n In practice, we never call `createEventEnvelope` with `replay_event` type,\n and we'd have to adjust a looot of types to make this work properly.\n We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n So the safe choice is to really guard against the replay_event type here.\n */\n const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n _enhanceEventWithSdkInfo(event, metadata?.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem: EventItem = [{ type: eventType }, event];\n return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n function dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n }\n\n // For the moment we'll obtain the DSC from the first span in the array\n // This might need to be changed if we permit sending multiple spans from\n // different segments in one envelope\n const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n const dsn = client?.getDsn();\n const tunnel = client?.getOptions().tunnel;\n\n const headers: SpanEnvelope[0] = {\n sent_at: new Date().toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const { beforeSendSpan, ignoreSpans } = client?.getOptions() || {};\n\n const filteredSpans = ignoreSpans?.length\n ? spans.filter(span => {\n const json = spanToJSON(span);\n return !shouldIgnoreSpan({ description: json.description, op: json.op, attributes: json.data }, ignoreSpans);\n })\n : spans;\n const droppedSpans = spans.length - filteredSpans.length;\n\n if (droppedSpans) {\n client?.recordDroppedEvent('before_send', 'span', droppedSpans);\n }\n\n const convertToSpanJSON = beforeSendSpan\n ? (span: SentrySpan) => {\n const spanJson = spanToJSON(span);\n const processedSpan = !isStreamedBeforeSendSpanCallback(beforeSendSpan) ? beforeSendSpan(spanJson) : spanJson;\n\n if (!processedSpan) {\n showSpanDropWarning();\n return spanJson;\n }\n\n return processedSpan;\n }\n : spanToJSON;\n\n const items: SpanItem[] = [];\n for (const span of filteredSpans) {\n const spanJson = convertToSpanJSON(span);\n if (spanJson) {\n items.push(createSpanEnvelopeItem(spanJson));\n }\n }\n\n return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n report: LegacyCSPReport,\n dsn: DsnComponents,\n tunnel?: string,\n release?: string,\n environment?: string,\n): RawSecurityEnvelope {\n const envelopeHeaders = {\n event_id: uuid4(),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const eventItem: RawSecurityItem = [\n { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n report,\n ];\n\n return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n"],"names":["dsc"],"mappings":"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"}
{"version":3,"file":"envelope.js","sources":["../../src/envelope.ts"],"sourcesContent":["import type { Client } from './client';\nimport { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport { isStreamedBeforeSendSpanCallback } from './tracing/spans/beforeSendSpan';\nimport type { LegacyCSPReport } from './types/csp';\nimport type { DsnComponents } from './types/dsn';\nimport type {\n DynamicSamplingContext,\n EventEnvelope,\n EventItem,\n RawSecurityEnvelope,\n RawSecurityItem,\n SessionEnvelope,\n SessionItem,\n SpanEnvelope,\n SpanItem,\n} from './types/envelope';\nimport type { Event } from './types/event';\nimport type { SdkInfo } from './types/sdkinfo';\nimport type { SdkMetadata } from './types/sdkmetadata';\nimport type { Session, SessionAggregates } from './types/session';\nimport { dsnToString } from './utils/dsn';\nimport {\n createEnvelope,\n createEventEnvelopeHeaders,\n createSpanEnvelopeItem,\n getSdkMetadataForEnvelopeHeader,\n} from './utils/envelope';\nimport { uuid4 } from './utils/misc';\nimport { safeDateNow } from './utils/randomSafeContext';\nimport { shouldIgnoreSpan } from './utils/should-ignore-span';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n *\n * @internal, exported only for testing\n **/\nexport function _enhanceEventWithSdkInfo(event: Event, newSdkInfo?: SdkInfo): Event {\n if (!newSdkInfo) {\n return event;\n }\n\n const eventSdkInfo = event.sdk || {};\n\n event.sdk = {\n ...eventSdkInfo,\n name: eventSdkInfo.name || newSdkInfo.name,\n version: eventSdkInfo.version || newSdkInfo.version,\n integrations: [...(event.sdk?.integrations || []), ...(newSdkInfo.integrations || [])],\n packages: [...(event.sdk?.packages || []), ...(newSdkInfo.packages || [])],\n settings:\n event.sdk?.settings || newSdkInfo.settings\n ? {\n ...event.sdk?.settings,\n ...newSdkInfo.settings,\n }\n : undefined,\n };\n\n return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n session: Session | SessionAggregates,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): SessionEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n const envelopeHeaders = {\n sent_at: new Date(safeDateNow()).toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const envelopeItem: SessionItem =\n 'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n event: Event,\n dsn?: DsnComponents,\n metadata?: SdkMetadata,\n tunnel?: string,\n): EventEnvelope {\n const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n /*\n Note: Due to TS, event.type may be `replay_event`, theoretically.\n In practice, we never call `createEventEnvelope` with `replay_event` type,\n and we'd have to adjust a looot of types to make this work properly.\n We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n So the safe choice is to really guard against the replay_event type here.\n */\n const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n _enhanceEventWithSdkInfo(event, metadata?.sdk);\n\n const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n delete event.sdkProcessingMetadata;\n\n const eventItem: EventItem = [{ type: eventType }, event];\n return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n function dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n }\n\n // For the moment we'll obtain the DSC from the first span in the array\n // This might need to be changed if we permit sending multiple spans from\n // different segments in one envelope\n const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n const dsn = client?.getDsn();\n const tunnel = client?.getOptions().tunnel;\n\n const headers: SpanEnvelope[0] = {\n sent_at: new Date(safeDateNow()).toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const { beforeSendSpan, ignoreSpans } = client?.getOptions() || {};\n\n const filteredSpans = ignoreSpans?.length\n ? spans.filter(span => {\n const json = spanToJSON(span);\n return !shouldIgnoreSpan({ description: json.description, op: json.op, attributes: json.data }, ignoreSpans);\n })\n : spans;\n const droppedSpans = spans.length - filteredSpans.length;\n\n if (droppedSpans) {\n client?.recordDroppedEvent('before_send', 'span', droppedSpans);\n }\n\n const convertToSpanJSON = beforeSendSpan\n ? (span: SentrySpan) => {\n const spanJson = spanToJSON(span);\n const processedSpan = !isStreamedBeforeSendSpanCallback(beforeSendSpan) ? beforeSendSpan(spanJson) : spanJson;\n\n if (!processedSpan) {\n showSpanDropWarning();\n return spanJson;\n }\n\n return processedSpan;\n }\n : spanToJSON;\n\n const items: SpanItem[] = [];\n for (const span of filteredSpans) {\n const spanJson = convertToSpanJSON(span);\n if (spanJson) {\n items.push(createSpanEnvelopeItem(spanJson));\n }\n }\n\n return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n report: LegacyCSPReport,\n dsn: DsnComponents,\n tunnel?: string,\n release?: string,\n environment?: string,\n): RawSecurityEnvelope {\n const envelopeHeaders = {\n event_id: uuid4(),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const eventItem: RawSecurityItem = [\n { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n report,\n ];\n\n return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n"],"names":["dsc"],"mappings":"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"}
import { debug } from '../../utils/debug-logger.js';
import { DEBUG_BUILD } from '../../debug-build.js';
import { safeDateNow } from '../../utils/randomSafeContext.js';
import { safeUnref } from '../../utils/timer.js';

@@ -18,3 +19,3 @@

DEBUG_BUILD && debug.log(`Recorded request session with status: ${requestSession.status}`);
const roundedDate = /* @__PURE__ */ new Date();
const roundedDate = new Date(safeDateNow());
roundedDate.setSeconds(0, 0);

@@ -21,0 +22,0 @@ const dateBucketKey = roundedDate.toISOString();

@@ -1,1 +0,1 @@

{"version":3,"file":"record-request-session.js","sources":["../../../../src/integrations/http/record-request-session.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport { debug } from '../../utils/debug-logger';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type { Scope } from '../../scope';\nimport type { HttpServerResponse } from './types';\nimport type { AggregationCounts } from '../../types/session';\nimport { safeUnref } from '../../utils/timer';\n\nconst clientToRequestSessionAggregatesMap = new WeakMap<\n Client,\n { [timestampRoundedToSeconds: string]: { exited: number; crashed: number; errored: number } }\n>();\n\n/**\n * Starts a session and tracks it in the context of a given isolation scope.\n * When the passed response is finished, the session is put into a task and\n * is aggregated with other sessions that may happen in a certain time window\n * (sessionFlushingDelayMs).\n *\n * The sessions are always aggregated by the client that is on the current\n * scope at the time of ending the response (if there is one).\n */\nexport function recordRequestSession(\n client: Client,\n {\n requestIsolationScope,\n response,\n sessionFlushingDelayMS,\n }: {\n requestIsolationScope: Scope;\n response: HttpServerResponse;\n sessionFlushingDelayMS?: number;\n },\n): void {\n requestIsolationScope.setSDKProcessingMetadata({\n requestSession: { status: 'ok' },\n });\n\n response.once('close', () => {\n const requestSession = requestIsolationScope.getScopeData().sdkProcessingMetadata.requestSession;\n\n if (client && requestSession) {\n DEBUG_BUILD && debug.log(`Recorded request session with status: ${requestSession.status}`);\n\n const roundedDate = new Date();\n roundedDate.setSeconds(0, 0);\n const dateBucketKey = roundedDate.toISOString();\n\n const existingClientAggregate = clientToRequestSessionAggregatesMap.get(client);\n const bucket = existingClientAggregate?.[dateBucketKey] || { exited: 0, crashed: 0, errored: 0 };\n bucket[({ ok: 'exited', crashed: 'crashed', errored: 'errored' } as const)[requestSession.status]]++;\n\n if (existingClientAggregate) {\n existingClientAggregate[dateBucketKey] = bucket;\n } else {\n DEBUG_BUILD && debug.log('Opened new request session aggregate.');\n const newClientAggregate = { [dateBucketKey]: bucket };\n clientToRequestSessionAggregatesMap.set(client, newClientAggregate);\n\n const flushPendingClientAggregates = (): void => {\n clearTimeout(timeout);\n unregisterClientFlushHook();\n clientToRequestSessionAggregatesMap.delete(client);\n\n const aggregatePayload: AggregationCounts[] = Object.entries(newClientAggregate).map(\n ([timestamp, value]) => ({\n started: timestamp,\n exited: value.exited,\n errored: value.errored,\n crashed: value.crashed,\n }),\n );\n client.sendSession({ aggregates: aggregatePayload });\n };\n\n const unregisterClientFlushHook = client.on('flush', () => {\n DEBUG_BUILD && debug.log('Sending request session aggregate due to client flush');\n flushPendingClientAggregates();\n });\n const timeout = setTimeout(() => {\n DEBUG_BUILD && debug.log('Sending request session aggregate due to flushing schedule');\n flushPendingClientAggregates();\n }, sessionFlushingDelayMS);\n safeUnref(timeout);\n }\n }\n });\n}\n"],"names":[],"mappings":";;;;AAQA,MAAM,mCAAA,uBAA0C,OAAA,EAG9C;AAWK,SAAS,qBACd,MAAA,EACA;AAAA,EACE,qBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKM;AACN,EAAA,qBAAA,CAAsB,wBAAA,CAAyB;AAAA,IAC7C,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA;AAAK,GAChC,CAAA;AAED,EAAA,QAAA,CAAS,IAAA,CAAK,SAAS,MAAM;AAC3B,IAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,YAAA,EAAa,CAAE,qBAAA,CAAsB,cAAA;AAElF,IAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,MAAA,WAAA,IAAe,KAAA,CAAM,GAAA,CAAI,CAAA,sCAAA,EAAyC,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAEzF,MAAA,MAAM,WAAA,uBAAkB,IAAA,EAAK;AAC7B,MAAA,WAAA,CAAY,UAAA,CAAW,GAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,aAAA,GAAgB,YAAY,WAAA,EAAY;AAE9C,MAAA,MAAM,uBAAA,GAA0B,mCAAA,CAAoC,GAAA,CAAI,MAAM,CAAA;AAC9E,MAAA,MAAM,MAAA,GAAS,uBAAA,GAA0B,aAAa,CAAA,IAAK,EAAE,QAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAC/F,MAAA,MAAA,CAAQ,EAAE,EAAA,EAAI,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,SAAS,SAAA,EAAU,CAAY,cAAA,CAAe,MAAM,CAAC,CAAA,EAAA;AAEjG,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,uBAAA,CAAwB,aAAa,CAAA,GAAI,MAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,WAAA,IAAe,KAAA,CAAM,IAAI,uCAAuC,CAAA;AAChE,QAAA,MAAM,kBAAA,GAAqB,EAAE,CAAC,aAAa,GAAG,MAAA,EAAO;AACrD,QAAA,mCAAA,CAAoC,GAAA,CAAI,QAAQ,kBAAkB,CAAA;AAElE,QAAA,MAAM,+BAA+B,MAAY;AAC/C,UAAA,YAAA,CAAa,OAAO,CAAA;AACpB,UAAA,yBAAA,EAA0B;AAC1B,UAAA,mCAAA,CAAoC,OAAO,MAAM,CAAA;AAEjD,UAAA,MAAM,gBAAA,GAAwC,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,CAAE,GAAA;AAAA,YAC/E,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,cACvB,OAAA,EAAS,SAAA;AAAA,cACT,QAAQ,KAAA,CAAM,MAAA;AAAA,cACd,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,SAAS,KAAA,CAAM;AAAA,aACjB;AAAA,WACF;AACA,UAAA,MAAA,CAAO,WAAA,CAAY,EAAE,UAAA,EAAY,gBAAA,EAAkB,CAAA;AAAA,QACrD,CAAA;AAEA,QAAA,MAAM,yBAAA,GAA4B,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM;AACzD,UAAA,WAAA,IAAe,KAAA,CAAM,IAAI,uDAAuD,CAAA;AAChF,UAAA,4BAAA,EAA6B;AAAA,QAC/B,CAAC,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,UAAA,WAAA,IAAe,KAAA,CAAM,IAAI,4DAA4D,CAAA;AACrF,UAAA,4BAAA,EAA6B;AAAA,QAC/B,GAAG,sBAAsB,CAAA;AACzB,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;;;;"}
{"version":3,"file":"record-request-session.js","sources":["../../../../src/integrations/http/record-request-session.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport { debug } from '../../utils/debug-logger';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type { Scope } from '../../scope';\nimport type { HttpServerResponse } from './types';\nimport type { AggregationCounts } from '../../types/session';\nimport { safeDateNow } from '../../utils/randomSafeContext';\nimport { safeUnref } from '../../utils/timer';\n\nconst clientToRequestSessionAggregatesMap = new WeakMap<\n Client,\n { [timestampRoundedToSeconds: string]: { exited: number; crashed: number; errored: number } }\n>();\n\n/**\n * Starts a session and tracks it in the context of a given isolation scope.\n * When the passed response is finished, the session is put into a task and\n * is aggregated with other sessions that may happen in a certain time window\n * (sessionFlushingDelayMs).\n *\n * The sessions are always aggregated by the client that is on the current\n * scope at the time of ending the response (if there is one).\n */\nexport function recordRequestSession(\n client: Client,\n {\n requestIsolationScope,\n response,\n sessionFlushingDelayMS,\n }: {\n requestIsolationScope: Scope;\n response: HttpServerResponse;\n sessionFlushingDelayMS?: number;\n },\n): void {\n requestIsolationScope.setSDKProcessingMetadata({\n requestSession: { status: 'ok' },\n });\n\n response.once('close', () => {\n const requestSession = requestIsolationScope.getScopeData().sdkProcessingMetadata.requestSession;\n\n if (client && requestSession) {\n DEBUG_BUILD && debug.log(`Recorded request session with status: ${requestSession.status}`);\n\n const roundedDate = new Date(safeDateNow());\n roundedDate.setSeconds(0, 0);\n const dateBucketKey = roundedDate.toISOString();\n\n const existingClientAggregate = clientToRequestSessionAggregatesMap.get(client);\n const bucket = existingClientAggregate?.[dateBucketKey] || { exited: 0, crashed: 0, errored: 0 };\n bucket[({ ok: 'exited', crashed: 'crashed', errored: 'errored' } as const)[requestSession.status]]++;\n\n if (existingClientAggregate) {\n existingClientAggregate[dateBucketKey] = bucket;\n } else {\n DEBUG_BUILD && debug.log('Opened new request session aggregate.');\n const newClientAggregate = { [dateBucketKey]: bucket };\n clientToRequestSessionAggregatesMap.set(client, newClientAggregate);\n\n const flushPendingClientAggregates = (): void => {\n clearTimeout(timeout);\n unregisterClientFlushHook();\n clientToRequestSessionAggregatesMap.delete(client);\n\n const aggregatePayload: AggregationCounts[] = Object.entries(newClientAggregate).map(\n ([timestamp, value]) => ({\n started: timestamp,\n exited: value.exited,\n errored: value.errored,\n crashed: value.crashed,\n }),\n );\n client.sendSession({ aggregates: aggregatePayload });\n };\n\n const unregisterClientFlushHook = client.on('flush', () => {\n DEBUG_BUILD && debug.log('Sending request session aggregate due to client flush');\n flushPendingClientAggregates();\n });\n const timeout = setTimeout(() => {\n DEBUG_BUILD && debug.log('Sending request session aggregate due to flushing schedule');\n flushPendingClientAggregates();\n }, sessionFlushingDelayMS);\n safeUnref(timeout);\n }\n }\n });\n}\n"],"names":[],"mappings":";;;;;AASA,MAAM,mCAAA,uBAA0C,OAAA,EAG9C;AAWK,SAAS,qBACd,MAAA,EACA;AAAA,EACE,qBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAKM;AACN,EAAA,qBAAA,CAAsB,wBAAA,CAAyB;AAAA,IAC7C,cAAA,EAAgB,EAAE,MAAA,EAAQ,IAAA;AAAK,GAChC,CAAA;AAED,EAAA,QAAA,CAAS,IAAA,CAAK,SAAS,MAAM;AAC3B,IAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,YAAA,EAAa,CAAE,qBAAA,CAAsB,cAAA;AAElF,IAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,MAAA,WAAA,IAAe,KAAA,CAAM,GAAA,CAAI,CAAA,sCAAA,EAAyC,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAEzF,MAAA,MAAM,WAAA,GAAc,IAAI,IAAA,CAAK,WAAA,EAAa,CAAA;AAC1C,MAAA,WAAA,CAAY,UAAA,CAAW,GAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,aAAA,GAAgB,YAAY,WAAA,EAAY;AAE9C,MAAA,MAAM,uBAAA,GAA0B,mCAAA,CAAoC,GAAA,CAAI,MAAM,CAAA;AAC9E,MAAA,MAAM,MAAA,GAAS,uBAAA,GAA0B,aAAa,CAAA,IAAK,EAAE,QAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AAC/F,MAAA,MAAA,CAAQ,EAAE,EAAA,EAAI,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,SAAS,SAAA,EAAU,CAAY,cAAA,CAAe,MAAM,CAAC,CAAA,EAAA;AAEjG,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,uBAAA,CAAwB,aAAa,CAAA,GAAI,MAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,WAAA,IAAe,KAAA,CAAM,IAAI,uCAAuC,CAAA;AAChE,QAAA,MAAM,kBAAA,GAAqB,EAAE,CAAC,aAAa,GAAG,MAAA,EAAO;AACrD,QAAA,mCAAA,CAAoC,GAAA,CAAI,QAAQ,kBAAkB,CAAA;AAElE,QAAA,MAAM,+BAA+B,MAAY;AAC/C,UAAA,YAAA,CAAa,OAAO,CAAA;AACpB,UAAA,yBAAA,EAA0B;AAC1B,UAAA,mCAAA,CAAoC,OAAO,MAAM,CAAA;AAEjD,UAAA,MAAM,gBAAA,GAAwC,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,CAAE,GAAA;AAAA,YAC/E,CAAC,CAAC,SAAA,EAAW,KAAK,CAAA,MAAO;AAAA,cACvB,OAAA,EAAS,SAAA;AAAA,cACT,QAAQ,KAAA,CAAM,MAAA;AAAA,cACd,SAAS,KAAA,CAAM,OAAA;AAAA,cACf,SAAS,KAAA,CAAM;AAAA,aACjB;AAAA,WACF;AACA,UAAA,MAAA,CAAO,WAAA,CAAY,EAAE,UAAA,EAAY,gBAAA,EAAkB,CAAA;AAAA,QACrD,CAAA;AAEA,QAAA,MAAM,yBAAA,GAA4B,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM;AACzD,UAAA,WAAA,IAAe,KAAA,CAAM,IAAI,uDAAuD,CAAA;AAChF,UAAA,4BAAA,EAA6B;AAAA,QAC/B,CAAC,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,UAAA,WAAA,IAAe,KAAA,CAAM,IAAI,4DAA4D,CAAA;AACrF,UAAA,4BAAA,EAA6B;AAAA,QAC/B,GAAG,sBAAsB,CAAA;AACzB,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;;;;"}

@@ -92,3 +92,3 @@ import { DEBUG_BUILD } from '../debug-build.js';

const wrappedHandle = async function(...args) {
if (!_shouldCreateSpans(options)) {
if (this.executed || !_shouldCreateSpans(options)) {
return originalHandle.apply(this, args);

@@ -95,0 +95,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"postgresjs.js","sources":["../../../src/integrations/postgresjs.ts"],"sourcesContent":["// Portable instrumentation for https://github.com/porsager/postgres\n// This can be used in any environment (Node.js, Cloudflare Workers, etc.)\n// without depending on OpenTelemetry module hooking.\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes';\nimport { SPAN_STATUS_ERROR, startSpanManual } from '../tracing';\nimport type { Span } from '../types/span';\nimport { debug } from '../utils/debug-logger';\nimport { getActiveSpan } from '../utils/spanUtils';\n\nconst SQL_OPERATION_REGEX = /^(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER)/i;\n\ntype PostgresConnectionContext = {\n ATTR_DB_NAMESPACE?: string;\n ATTR_SERVER_ADDRESS?: string;\n ATTR_SERVER_PORT?: string;\n};\n\ninterface PostgresJsSqlInstrumentationOptions {\n /**\n * Whether to require a parent span for the instrumentation.\n * If set to true, the instrumentation will only create spans if there is a parent span\n * available in the current scope.\n * @default true\n */\n requireParentSpan?: boolean;\n /**\n * Hook to modify the span before it is started.\n * This can be used to set additional attributes or modify the span in any way.\n */\n requestHook?: (span: Span, sanitizedSqlQuery: string, postgresConnectionContext?: PostgresConnectionContext) => void;\n}\n\nconst CONNECTION_CONTEXT_SYMBOL = Symbol('sentryPostgresConnectionContext');\n\n// Use the same Symbol.for() markers as the Node.js OTel instrumentation\n// so that both approaches recognize each other and prevent double-wrapping.\nconst INSTRUMENTED_MARKER = Symbol.for('sentry.instrumented.postgresjs');\n// Marker to track if a query was created from an instrumented sql instance.\n// This prevents double-spanning when both the wrapper and the Node.js Query.prototype\n// fallback patch are active simultaneously.\nconst QUERY_FROM_INSTRUMENTED_SQL = Symbol.for('sentry.query.from.instrumented.sql');\n\n/**\n * Instruments a postgres.js `sql` instance with Sentry tracing.\n *\n * This is a portable instrumentation function that works in any environment\n * (Node.js, Cloudflare Workers, etc.) without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import postgres from 'postgres';\n * import * as Sentry from '@sentry/cloudflare'; // or '@sentry/deno'\n *\n * const sql = Sentry.instrumentPostgresJsSql(\n * postgres({ host: 'localhost', database: 'mydb' })\n * );\n *\n * // All queries now create Sentry spans\n * await sql`SELECT * FROM users WHERE id = ${userId}`;\n * ```\n */\nexport function instrumentPostgresJsSql<T>(sql: T, options?: PostgresJsSqlInstrumentationOptions): T {\n if (!sql || typeof sql !== 'function') {\n DEBUG_BUILD && debug.warn('instrumentPostgresJsSql: provided value is not a valid postgres.js sql instance');\n return sql;\n }\n\n return _instrumentSqlInstance(sql, { requireParentSpan: true, ...options }) as T;\n}\n\n/**\n * Instruments a sql instance by wrapping its query execution methods.\n */\nfunction _instrumentSqlInstance(\n sql: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n parentConnectionContext?: PostgresConnectionContext,\n): unknown {\n // Check if already instrumented to prevent double-wrapping\n // Using Symbol.for() ensures the marker survives proxying\n if ((sql as Record<symbol, unknown>)[INSTRUMENTED_MARKER]) {\n return sql;\n }\n\n // Wrap the sql function to intercept query creation\n const proxiedSql: unknown = new Proxy(sql as (...args: unknown[]) => unknown, {\n apply(target, thisArg, argumentsList: unknown[]) {\n const query = Reflect.apply(target, thisArg, argumentsList);\n\n if (query && typeof query === 'object' && 'handle' in query) {\n _wrapSingleQueryHandle(query as { handle: unknown; strings?: string[] }, proxiedSql, options);\n }\n\n return query;\n },\n get(target, prop) {\n const original = (target as unknown as Record<string | symbol, unknown>)[prop];\n\n if (typeof prop !== 'string' || typeof original !== 'function') {\n return original;\n }\n\n // Wrap methods that return PendingQuery objects (unsafe, file)\n if (prop === 'unsafe' || prop === 'file') {\n return _wrapQueryMethod(original as (...args: unknown[]) => unknown, target, proxiedSql, options);\n }\n\n // Wrap begin and reserve (not savepoint to avoid duplicate spans)\n if (prop === 'begin' || prop === 'reserve') {\n return _wrapCallbackMethod(original as (...args: unknown[]) => unknown, target, proxiedSql, options);\n }\n\n return original;\n },\n });\n\n // Use provided parent context if available, otherwise extract from sql.options\n if (parentConnectionContext) {\n (proxiedSql as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] = parentConnectionContext;\n } else {\n _attachConnectionContext(sql, proxiedSql as Record<symbol, unknown>);\n }\n\n // Mark both the original and proxy as instrumented to prevent double-wrapping\n (sql as Record<symbol, unknown>)[INSTRUMENTED_MARKER] = true;\n (proxiedSql as Record<symbol, unknown>)[INSTRUMENTED_MARKER] = true;\n\n return proxiedSql;\n}\n\n/**\n * Wraps query-returning methods (unsafe, file) to ensure their queries are instrumented.\n */\nfunction _wrapQueryMethod(\n original: (...args: unknown[]) => unknown,\n target: unknown,\n proxiedSql: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): (...args: unknown[]) => unknown {\n return function (this: unknown, ...args: unknown[]): unknown {\n const query = Reflect.apply(original, target, args);\n\n if (query && typeof query === 'object' && 'handle' in query) {\n _wrapSingleQueryHandle(query as { handle: unknown; strings?: string[] }, proxiedSql, options);\n }\n\n return query;\n };\n}\n\n/**\n * Wraps callback-based methods (begin, reserve) to recursively instrument Sql instances.\n * Note: These methods can also be used as tagged templates, which we pass through unchanged.\n *\n * Savepoint is not wrapped to avoid complex nested transaction instrumentation issues.\n * Queries within savepoint callbacks are still instrumented through the parent transaction's Sql instance.\n */\nfunction _wrapCallbackMethod(\n original: (...args: unknown[]) => unknown,\n target: unknown,\n parentSqlInstance: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): (...args: unknown[]) => unknown {\n return function (this: unknown, ...args: unknown[]): unknown {\n // Extract parent context to propagate to child instances\n const parentContext = (parentSqlInstance as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] as\n | PostgresConnectionContext\n | undefined;\n\n // Check if this is a callback-based call by verifying the last argument is a function\n const isCallbackBased = typeof args[args.length - 1] === 'function';\n\n if (!isCallbackBased) {\n // Not a callback-based call - could be tagged template or promise-based\n const result = Reflect.apply(original, target, args);\n // If result is a Promise (e.g., reserve() without callback), instrument the resolved Sql instance\n if (result && typeof (result as Promise<unknown>).then === 'function') {\n return (result as Promise<unknown>).then((sqlInstance: unknown) => {\n return _instrumentSqlInstance(sqlInstance, options, parentContext);\n });\n }\n return result;\n }\n\n // Callback-based call: wrap the callback to instrument the Sql instance\n const callback = (args.length === 1 ? args[0] : args[1]) as (sql: unknown) => unknown;\n const wrappedCallback = function (sqlInstance: unknown): unknown {\n const instrumentedSql = _instrumentSqlInstance(sqlInstance, options, parentContext);\n return callback(instrumentedSql);\n };\n\n const newArgs = args.length === 1 ? [wrappedCallback] : [args[0], wrappedCallback];\n return Reflect.apply(original, target, newArgs);\n };\n}\n\n/**\n * Wraps a single query's handle method to create spans.\n */\nfunction _wrapSingleQueryHandle(\n query: { handle: unknown; strings?: string[]; __sentryWrapped?: boolean },\n sqlInstance: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): void {\n // Prevent double wrapping - check if the handle itself is already wrapped\n if ((query.handle as { __sentryWrapped?: boolean })?.__sentryWrapped) {\n return;\n }\n\n // Mark this query as coming from an instrumented sql instance.\n // This prevents the Node.js Query.prototype fallback patch from double-spanning.\n (query as Record<symbol, unknown>)[QUERY_FROM_INSTRUMENTED_SQL] = true;\n\n const originalHandle = query.handle as (...args: unknown[]) => Promise<unknown>;\n\n // IMPORTANT: We must replace the handle function directly, not use a Proxy,\n // because Query.then() internally calls this.handle(), which would bypass a Proxy wrapper.\n const wrappedHandle = async function (this: unknown, ...args: unknown[]): Promise<unknown> {\n if (!_shouldCreateSpans(options)) {\n return originalHandle.apply(this, args);\n }\n\n const fullQuery = _reconstructQuery(query.strings);\n const sanitizedSqlQuery = _sanitizeSqlQuery(fullQuery);\n\n return startSpanManual(\n {\n name: sanitizedSqlQuery || 'postgresjs.query',\n op: 'db',\n },\n (span: Span) => {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, 'auto.db.postgresjs');\n\n span.setAttributes({\n 'db.system.name': 'postgres',\n 'db.query.text': sanitizedSqlQuery,\n });\n\n const connectionContext = sqlInstance\n ? ((sqlInstance as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] as\n | PostgresConnectionContext\n | undefined)\n : undefined;\n\n _setConnectionAttributes(span, connectionContext);\n\n if (options.requestHook) {\n try {\n options.requestHook(span, sanitizedSqlQuery, connectionContext);\n } catch (e) {\n span.setAttribute('sentry.hook.error', 'requestHook failed');\n DEBUG_BUILD && debug.error('Error in requestHook for PostgresJs instrumentation:', e);\n }\n }\n\n const queryWithCallbacks = this as {\n resolve: unknown;\n reject: unknown;\n };\n\n queryWithCallbacks.resolve = new Proxy(queryWithCallbacks.resolve as (...args: unknown[]) => unknown, {\n apply: (resolveTarget, resolveThisArg, resolveArgs: [{ command?: string }]) => {\n try {\n _setOperationName(span, sanitizedSqlQuery, resolveArgs?.[0]?.command);\n span.end();\n } catch (e) {\n DEBUG_BUILD && debug.error('Error ending span in resolve callback:', e);\n }\n\n return Reflect.apply(resolveTarget, resolveThisArg, resolveArgs);\n },\n });\n\n queryWithCallbacks.reject = new Proxy(queryWithCallbacks.reject as (...args: unknown[]) => unknown, {\n apply: (rejectTarget, rejectThisArg, rejectArgs: { message?: string; code?: string; name?: string }[]) => {\n try {\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: rejectArgs?.[0]?.message || 'unknown_error',\n });\n\n span.setAttribute('db.response.status_code', rejectArgs?.[0]?.code || 'unknown');\n span.setAttribute('error.type', rejectArgs?.[0]?.name || 'unknown');\n\n _setOperationName(span, sanitizedSqlQuery);\n span.end();\n } catch (e) {\n DEBUG_BUILD && debug.error('Error ending span in reject callback:', e);\n }\n return Reflect.apply(rejectTarget, rejectThisArg, rejectArgs);\n },\n });\n\n // Handle synchronous errors that might occur before promise is created\n try {\n return originalHandle.apply(this, args);\n } catch (e) {\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: e instanceof Error ? e.message : 'unknown_error',\n });\n span.end();\n throw e;\n }\n },\n );\n };\n\n (wrappedHandle as { __sentryWrapped?: boolean }).__sentryWrapped = true;\n query.handle = wrappedHandle;\n}\n\n/**\n * Determines whether a span should be created based on the current context.\n * If `requireParentSpan` is set to true in the options, a span will\n * only be created if there is a parent span available.\n */\nfunction _shouldCreateSpans(options: PostgresJsSqlInstrumentationOptions): boolean {\n const hasParentSpan = getActiveSpan() !== undefined;\n return hasParentSpan || !options.requireParentSpan;\n}\n\n/**\n * Reconstructs the full SQL query from template strings with PostgreSQL placeholders.\n *\n * For sql`SELECT * FROM users WHERE id = ${123} AND name = ${'foo'}`:\n * strings = [\"SELECT * FROM users WHERE id = \", \" AND name = \", \"\"]\n * returns: \"SELECT * FROM users WHERE id = $1 AND name = $2\"\n *\n * @internal Exported for testing only\n */\nexport function _reconstructQuery(strings: string[] | undefined): string | undefined {\n if (!strings?.length) {\n return undefined;\n }\n if (strings.length === 1) {\n return strings[0] || undefined;\n }\n // Join template parts with PostgreSQL placeholders ($1, $2, etc.)\n return strings.reduce((acc, str, i) => (i === 0 ? str : `${acc}$${i}${str}`), '');\n}\n\nlet integerLiteralRE: RegExp | undefined;\n\n/**\n * Sanitize SQL query as per the OTEL semantic conventions\n * https://opentelemetry.io/docs/specs/semconv/database/database-spans/#sanitization-of-dbquerytext\n *\n * PostgreSQL $n placeholders are preserved per OTEL spec - they're parameterized queries,\n * not sensitive literals. Only actual values (strings, numbers, booleans) are sanitized.\n *\n * @internal Exported for testing only\n */\nexport function _sanitizeSqlQuery(sqlQuery: string | undefined): string {\n if (!sqlQuery) {\n return 'Unknown SQL Query';\n }\n\n // Lazy init: constructing this at module scope would evaluate the lookbehind\n // on import and crash Safari <16.4 browser bundles that reach this file via\n // the core barrel. Building it on first call keeps the cost off the import path.\n if (!integerLiteralRE) {\n integerLiteralRE = new RegExp('(?<!\\\\$)-?\\\\b\\\\d+\\\\b', 'g');\n }\n\n return (\n sqlQuery\n // Remove comments first (they may contain newlines and extra spaces)\n .replace(/--.*$/gm, '') // Single line comments (multiline mode)\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Multi-line comments\n .replace(/;\\s*$/, '') // Remove trailing semicolons\n // Collapse whitespace to a single space (after removing comments)\n .replace(/\\s+/g, ' ')\n .trim() // Remove extra spaces and trim\n // Sanitize hex/binary literals before string literals\n .replace(/\\bX'[0-9A-Fa-f]*'/gi, '?') // Hex string literals\n .replace(/\\bB'[01]*'/gi, '?') // Binary string literals\n // Sanitize string literals (handles escaped quotes)\n .replace(/'(?:[^']|'')*'/g, '?')\n // Sanitize hex numbers\n .replace(/\\b0x[0-9A-Fa-f]+/gi, '?')\n // Sanitize boolean literals\n .replace(/\\b(?:TRUE|FALSE)\\b/gi, '?')\n // Sanitize numeric literals (preserve $n placeholders via negative lookbehind)\n .replace(/-?\\b\\d+\\.?\\d*[eE][+-]?\\d+\\b/g, '?') // Scientific notation\n .replace(/-?\\b\\d+\\.\\d+\\b/g, '?') // Decimals\n .replace(/-?\\.\\d+\\b/g, '?') // Decimals starting with dot\n .replace(integerLiteralRE, '?') // Integers (NOT $n placeholders)\n // Collapse IN clauses for cardinality (both ? and $n variants)\n .replace(/\\bIN\\b\\s*\\(\\s*\\?(?:\\s*,\\s*\\?)*\\s*\\)/gi, 'IN (?)')\n .replace(/\\bIN\\b\\s*\\(\\s*\\$\\d+(?:\\s*,\\s*\\$\\d+)*\\s*\\)/gi, 'IN ($?)')\n );\n}\n\n/**\n * Sets connection context attributes on a span.\n */\nfunction _setConnectionAttributes(span: Span, connectionContext: PostgresConnectionContext | undefined): void {\n if (!connectionContext) {\n return;\n }\n if (connectionContext.ATTR_DB_NAMESPACE) {\n span.setAttribute('db.namespace', connectionContext.ATTR_DB_NAMESPACE);\n }\n if (connectionContext.ATTR_SERVER_ADDRESS) {\n span.setAttribute('server.address', connectionContext.ATTR_SERVER_ADDRESS);\n }\n if (connectionContext.ATTR_SERVER_PORT !== undefined) {\n // Port is stored as string in PostgresConnectionContext for requestHook backwards compatibility,\n // but semantic conventions expect port as a number for span attributes\n const portNumber = parseInt(connectionContext.ATTR_SERVER_PORT, 10);\n if (!isNaN(portNumber)) {\n span.setAttribute('server.port', portNumber);\n }\n }\n}\n\n/**\n * Extracts DB operation name from SQL query and sets it on the span.\n */\nfunction _setOperationName(span: Span, sanitizedQuery: string | undefined, command?: string): void {\n if (command) {\n span.setAttribute('db.operation.name', command);\n return;\n }\n // Fallback: extract operation from the SQL query\n const operationMatch = sanitizedQuery?.match(SQL_OPERATION_REGEX);\n if (operationMatch?.[1]) {\n span.setAttribute('db.operation.name', operationMatch[1].toUpperCase());\n }\n}\n\n/**\n * Extracts and stores connection context from sql.options.\n */\nfunction _attachConnectionContext(sql: unknown, proxiedSql: Record<symbol, unknown>): void {\n const sqlInstance = sql as { options?: { host?: string[]; port?: number[]; database?: string } };\n if (!sqlInstance.options || typeof sqlInstance.options !== 'object') {\n return;\n }\n\n const opts = sqlInstance.options;\n // postgres.js stores parsed options with host and port as arrays\n // The library defaults to 'localhost' and 5432 if not specified, but we're defensive here\n const host = opts.host?.[0] || 'localhost';\n const port = opts.port?.[0] || 5432;\n\n const connectionContext: PostgresConnectionContext = {\n ATTR_DB_NAMESPACE: typeof opts.database === 'string' && opts.database !== '' ? opts.database : undefined,\n ATTR_SERVER_ADDRESS: host,\n ATTR_SERVER_PORT: String(port),\n };\n\n proxiedSql[CONNECTION_CONTEXT_SYMBOL] = connectionContext;\n}\n"],"names":[],"mappings":"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"}
{"version":3,"file":"postgresjs.js","sources":["../../../src/integrations/postgresjs.ts"],"sourcesContent":["// Portable instrumentation for https://github.com/porsager/postgres\n// This can be used in any environment (Node.js, Cloudflare Workers, etc.)\n// without depending on OpenTelemetry module hooking.\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../semanticAttributes';\nimport { SPAN_STATUS_ERROR, startSpanManual } from '../tracing';\nimport type { Span } from '../types/span';\nimport { debug } from '../utils/debug-logger';\nimport { getActiveSpan } from '../utils/spanUtils';\n\nconst SQL_OPERATION_REGEX = /^(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER)/i;\n\ntype PostgresConnectionContext = {\n ATTR_DB_NAMESPACE?: string;\n ATTR_SERVER_ADDRESS?: string;\n ATTR_SERVER_PORT?: string;\n};\n\ninterface PostgresJsSqlInstrumentationOptions {\n /**\n * Whether to require a parent span for the instrumentation.\n * If set to true, the instrumentation will only create spans if there is a parent span\n * available in the current scope.\n * @default true\n */\n requireParentSpan?: boolean;\n /**\n * Hook to modify the span before it is started.\n * This can be used to set additional attributes or modify the span in any way.\n */\n requestHook?: (span: Span, sanitizedSqlQuery: string, postgresConnectionContext?: PostgresConnectionContext) => void;\n}\n\nconst CONNECTION_CONTEXT_SYMBOL = Symbol('sentryPostgresConnectionContext');\n\n// Use the same Symbol.for() markers as the Node.js OTel instrumentation\n// so that both approaches recognize each other and prevent double-wrapping.\nconst INSTRUMENTED_MARKER = Symbol.for('sentry.instrumented.postgresjs');\n// Marker to track if a query was created from an instrumented sql instance.\n// This prevents double-spanning when both the wrapper and the Node.js Query.prototype\n// fallback patch are active simultaneously.\nconst QUERY_FROM_INSTRUMENTED_SQL = Symbol.for('sentry.query.from.instrumented.sql');\n\n/**\n * Instruments a postgres.js `sql` instance with Sentry tracing.\n *\n * This is a portable instrumentation function that works in any environment\n * (Node.js, Cloudflare Workers, etc.) without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import postgres from 'postgres';\n * import * as Sentry from '@sentry/cloudflare'; // or '@sentry/deno'\n *\n * const sql = Sentry.instrumentPostgresJsSql(\n * postgres({ host: 'localhost', database: 'mydb' })\n * );\n *\n * // All queries now create Sentry spans\n * await sql`SELECT * FROM users WHERE id = ${userId}`;\n * ```\n */\nexport function instrumentPostgresJsSql<T>(sql: T, options?: PostgresJsSqlInstrumentationOptions): T {\n if (!sql || typeof sql !== 'function') {\n DEBUG_BUILD && debug.warn('instrumentPostgresJsSql: provided value is not a valid postgres.js sql instance');\n return sql;\n }\n\n return _instrumentSqlInstance(sql, { requireParentSpan: true, ...options }) as T;\n}\n\n/**\n * Instruments a sql instance by wrapping its query execution methods.\n */\nfunction _instrumentSqlInstance(\n sql: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n parentConnectionContext?: PostgresConnectionContext,\n): unknown {\n // Check if already instrumented to prevent double-wrapping\n // Using Symbol.for() ensures the marker survives proxying\n if ((sql as Record<symbol, unknown>)[INSTRUMENTED_MARKER]) {\n return sql;\n }\n\n // Wrap the sql function to intercept query creation\n const proxiedSql: unknown = new Proxy(sql as (...args: unknown[]) => unknown, {\n apply(target, thisArg, argumentsList: unknown[]) {\n const query = Reflect.apply(target, thisArg, argumentsList);\n\n if (query && typeof query === 'object' && 'handle' in query) {\n _wrapSingleQueryHandle(query as { handle: unknown; strings?: string[] }, proxiedSql, options);\n }\n\n return query;\n },\n get(target, prop) {\n const original = (target as unknown as Record<string | symbol, unknown>)[prop];\n\n if (typeof prop !== 'string' || typeof original !== 'function') {\n return original;\n }\n\n // Wrap methods that return PendingQuery objects (unsafe, file)\n if (prop === 'unsafe' || prop === 'file') {\n return _wrapQueryMethod(original as (...args: unknown[]) => unknown, target, proxiedSql, options);\n }\n\n // Wrap begin and reserve (not savepoint to avoid duplicate spans)\n if (prop === 'begin' || prop === 'reserve') {\n return _wrapCallbackMethod(original as (...args: unknown[]) => unknown, target, proxiedSql, options);\n }\n\n return original;\n },\n });\n\n // Use provided parent context if available, otherwise extract from sql.options\n if (parentConnectionContext) {\n (proxiedSql as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] = parentConnectionContext;\n } else {\n _attachConnectionContext(sql, proxiedSql as Record<symbol, unknown>);\n }\n\n // Mark both the original and proxy as instrumented to prevent double-wrapping\n (sql as Record<symbol, unknown>)[INSTRUMENTED_MARKER] = true;\n (proxiedSql as Record<symbol, unknown>)[INSTRUMENTED_MARKER] = true;\n\n return proxiedSql;\n}\n\n/**\n * Wraps query-returning methods (unsafe, file) to ensure their queries are instrumented.\n */\nfunction _wrapQueryMethod(\n original: (...args: unknown[]) => unknown,\n target: unknown,\n proxiedSql: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): (...args: unknown[]) => unknown {\n return function (this: unknown, ...args: unknown[]): unknown {\n const query = Reflect.apply(original, target, args);\n\n if (query && typeof query === 'object' && 'handle' in query) {\n _wrapSingleQueryHandle(query as { handle: unknown; strings?: string[] }, proxiedSql, options);\n }\n\n return query;\n };\n}\n\n/**\n * Wraps callback-based methods (begin, reserve) to recursively instrument Sql instances.\n * Note: These methods can also be used as tagged templates, which we pass through unchanged.\n *\n * Savepoint is not wrapped to avoid complex nested transaction instrumentation issues.\n * Queries within savepoint callbacks are still instrumented through the parent transaction's Sql instance.\n */\nfunction _wrapCallbackMethod(\n original: (...args: unknown[]) => unknown,\n target: unknown,\n parentSqlInstance: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): (...args: unknown[]) => unknown {\n return function (this: unknown, ...args: unknown[]): unknown {\n // Extract parent context to propagate to child instances\n const parentContext = (parentSqlInstance as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] as\n | PostgresConnectionContext\n | undefined;\n\n // Check if this is a callback-based call by verifying the last argument is a function\n const isCallbackBased = typeof args[args.length - 1] === 'function';\n\n if (!isCallbackBased) {\n // Not a callback-based call - could be tagged template or promise-based\n const result = Reflect.apply(original, target, args);\n // If result is a Promise (e.g., reserve() without callback), instrument the resolved Sql instance\n if (result && typeof (result as Promise<unknown>).then === 'function') {\n return (result as Promise<unknown>).then((sqlInstance: unknown) => {\n return _instrumentSqlInstance(sqlInstance, options, parentContext);\n });\n }\n return result;\n }\n\n // Callback-based call: wrap the callback to instrument the Sql instance\n const callback = (args.length === 1 ? args[0] : args[1]) as (sql: unknown) => unknown;\n const wrappedCallback = function (sqlInstance: unknown): unknown {\n const instrumentedSql = _instrumentSqlInstance(sqlInstance, options, parentContext);\n return callback(instrumentedSql);\n };\n\n const newArgs = args.length === 1 ? [wrappedCallback] : [args[0], wrappedCallback];\n return Reflect.apply(original, target, newArgs);\n };\n}\n\n/**\n * Wraps a single query's handle method to create spans.\n */\nfunction _wrapSingleQueryHandle(\n query: { handle: unknown; strings?: string[]; __sentryWrapped?: boolean },\n sqlInstance: unknown,\n options: PostgresJsSqlInstrumentationOptions,\n): void {\n // Prevent double wrapping - check if the handle itself is already wrapped\n if ((query.handle as { __sentryWrapped?: boolean })?.__sentryWrapped) {\n return;\n }\n\n // Mark this query as coming from an instrumented sql instance.\n // This prevents the Node.js Query.prototype fallback patch from double-spanning.\n (query as Record<symbol, unknown>)[QUERY_FROM_INSTRUMENTED_SQL] = true;\n\n const originalHandle = query.handle as (...args: unknown[]) => Promise<unknown>;\n\n // IMPORTANT: We must replace the handle function directly, not use a Proxy,\n // because Query.then() internally calls this.handle(), which would bypass a Proxy wrapper.\n const wrappedHandle = async function (this: { executed?: boolean }, ...args: unknown[]): Promise<unknown> {\n // postgres.js calls handle() from then/catch/finally — only the first call executes SQL,\n // subsequent calls are no-ops (guarded by this.executed). Skip span creation for no-ops.\n if (this.executed || !_shouldCreateSpans(options)) {\n return originalHandle.apply(this, args);\n }\n\n const fullQuery = _reconstructQuery(query.strings);\n const sanitizedSqlQuery = _sanitizeSqlQuery(fullQuery);\n\n return startSpanManual(\n {\n name: sanitizedSqlQuery || 'postgresjs.query',\n op: 'db',\n },\n (span: Span) => {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, 'auto.db.postgresjs');\n\n span.setAttributes({\n 'db.system.name': 'postgres',\n 'db.query.text': sanitizedSqlQuery,\n });\n\n const connectionContext = sqlInstance\n ? ((sqlInstance as Record<symbol, unknown>)[CONNECTION_CONTEXT_SYMBOL] as\n | PostgresConnectionContext\n | undefined)\n : undefined;\n\n _setConnectionAttributes(span, connectionContext);\n\n if (options.requestHook) {\n try {\n options.requestHook(span, sanitizedSqlQuery, connectionContext);\n } catch (e) {\n span.setAttribute('sentry.hook.error', 'requestHook failed');\n DEBUG_BUILD && debug.error('Error in requestHook for PostgresJs instrumentation:', e);\n }\n }\n\n const queryWithCallbacks = this as {\n resolve: unknown;\n reject: unknown;\n };\n\n queryWithCallbacks.resolve = new Proxy(queryWithCallbacks.resolve as (...args: unknown[]) => unknown, {\n apply: (resolveTarget, resolveThisArg, resolveArgs: [{ command?: string }]) => {\n try {\n _setOperationName(span, sanitizedSqlQuery, resolveArgs?.[0]?.command);\n span.end();\n } catch (e) {\n DEBUG_BUILD && debug.error('Error ending span in resolve callback:', e);\n }\n\n return Reflect.apply(resolveTarget, resolveThisArg, resolveArgs);\n },\n });\n\n queryWithCallbacks.reject = new Proxy(queryWithCallbacks.reject as (...args: unknown[]) => unknown, {\n apply: (rejectTarget, rejectThisArg, rejectArgs: { message?: string; code?: string; name?: string }[]) => {\n try {\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: rejectArgs?.[0]?.message || 'unknown_error',\n });\n\n span.setAttribute('db.response.status_code', rejectArgs?.[0]?.code || 'unknown');\n span.setAttribute('error.type', rejectArgs?.[0]?.name || 'unknown');\n\n _setOperationName(span, sanitizedSqlQuery);\n span.end();\n } catch (e) {\n DEBUG_BUILD && debug.error('Error ending span in reject callback:', e);\n }\n return Reflect.apply(rejectTarget, rejectThisArg, rejectArgs);\n },\n });\n\n // Handle synchronous errors that might occur before promise is created\n try {\n return originalHandle.apply(this, args);\n } catch (e) {\n span.setStatus({\n code: SPAN_STATUS_ERROR,\n message: e instanceof Error ? e.message : 'unknown_error',\n });\n span.end();\n throw e;\n }\n },\n );\n };\n\n (wrappedHandle as { __sentryWrapped?: boolean }).__sentryWrapped = true;\n query.handle = wrappedHandle;\n}\n\n/**\n * Determines whether a span should be created based on the current context.\n * If `requireParentSpan` is set to true in the options, a span will\n * only be created if there is a parent span available.\n */\nfunction _shouldCreateSpans(options: PostgresJsSqlInstrumentationOptions): boolean {\n const hasParentSpan = getActiveSpan() !== undefined;\n return hasParentSpan || !options.requireParentSpan;\n}\n\n/**\n * Reconstructs the full SQL query from template strings with PostgreSQL placeholders.\n *\n * For sql`SELECT * FROM users WHERE id = ${123} AND name = ${'foo'}`:\n * strings = [\"SELECT * FROM users WHERE id = \", \" AND name = \", \"\"]\n * returns: \"SELECT * FROM users WHERE id = $1 AND name = $2\"\n *\n * @internal Exported for testing only\n */\nexport function _reconstructQuery(strings: string[] | undefined): string | undefined {\n if (!strings?.length) {\n return undefined;\n }\n if (strings.length === 1) {\n return strings[0] || undefined;\n }\n // Join template parts with PostgreSQL placeholders ($1, $2, etc.)\n return strings.reduce((acc, str, i) => (i === 0 ? str : `${acc}$${i}${str}`), '');\n}\n\nlet integerLiteralRE: RegExp | undefined;\n\n/**\n * Sanitize SQL query as per the OTEL semantic conventions\n * https://opentelemetry.io/docs/specs/semconv/database/database-spans/#sanitization-of-dbquerytext\n *\n * PostgreSQL $n placeholders are preserved per OTEL spec - they're parameterized queries,\n * not sensitive literals. Only actual values (strings, numbers, booleans) are sanitized.\n *\n * @internal Exported for testing only\n */\nexport function _sanitizeSqlQuery(sqlQuery: string | undefined): string {\n if (!sqlQuery) {\n return 'Unknown SQL Query';\n }\n\n // Lazy init: constructing this at module scope would evaluate the lookbehind\n // on import and crash Safari <16.4 browser bundles that reach this file via\n // the core barrel. Building it on first call keeps the cost off the import path.\n if (!integerLiteralRE) {\n integerLiteralRE = new RegExp('(?<!\\\\$)-?\\\\b\\\\d+\\\\b', 'g');\n }\n\n return (\n sqlQuery\n // Remove comments first (they may contain newlines and extra spaces)\n .replace(/--.*$/gm, '') // Single line comments (multiline mode)\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '') // Multi-line comments\n .replace(/;\\s*$/, '') // Remove trailing semicolons\n // Collapse whitespace to a single space (after removing comments)\n .replace(/\\s+/g, ' ')\n .trim() // Remove extra spaces and trim\n // Sanitize hex/binary literals before string literals\n .replace(/\\bX'[0-9A-Fa-f]*'/gi, '?') // Hex string literals\n .replace(/\\bB'[01]*'/gi, '?') // Binary string literals\n // Sanitize string literals (handles escaped quotes)\n .replace(/'(?:[^']|'')*'/g, '?')\n // Sanitize hex numbers\n .replace(/\\b0x[0-9A-Fa-f]+/gi, '?')\n // Sanitize boolean literals\n .replace(/\\b(?:TRUE|FALSE)\\b/gi, '?')\n // Sanitize numeric literals (preserve $n placeholders via negative lookbehind)\n .replace(/-?\\b\\d+\\.?\\d*[eE][+-]?\\d+\\b/g, '?') // Scientific notation\n .replace(/-?\\b\\d+\\.\\d+\\b/g, '?') // Decimals\n .replace(/-?\\.\\d+\\b/g, '?') // Decimals starting with dot\n .replace(integerLiteralRE, '?') // Integers (NOT $n placeholders)\n // Collapse IN clauses for cardinality (both ? and $n variants)\n .replace(/\\bIN\\b\\s*\\(\\s*\\?(?:\\s*,\\s*\\?)*\\s*\\)/gi, 'IN (?)')\n .replace(/\\bIN\\b\\s*\\(\\s*\\$\\d+(?:\\s*,\\s*\\$\\d+)*\\s*\\)/gi, 'IN ($?)')\n );\n}\n\n/**\n * Sets connection context attributes on a span.\n */\nfunction _setConnectionAttributes(span: Span, connectionContext: PostgresConnectionContext | undefined): void {\n if (!connectionContext) {\n return;\n }\n if (connectionContext.ATTR_DB_NAMESPACE) {\n span.setAttribute('db.namespace', connectionContext.ATTR_DB_NAMESPACE);\n }\n if (connectionContext.ATTR_SERVER_ADDRESS) {\n span.setAttribute('server.address', connectionContext.ATTR_SERVER_ADDRESS);\n }\n if (connectionContext.ATTR_SERVER_PORT !== undefined) {\n // Port is stored as string in PostgresConnectionContext for requestHook backwards compatibility,\n // but semantic conventions expect port as a number for span attributes\n const portNumber = parseInt(connectionContext.ATTR_SERVER_PORT, 10);\n if (!isNaN(portNumber)) {\n span.setAttribute('server.port', portNumber);\n }\n }\n}\n\n/**\n * Extracts DB operation name from SQL query and sets it on the span.\n */\nfunction _setOperationName(span: Span, sanitizedQuery: string | undefined, command?: string): void {\n if (command) {\n span.setAttribute('db.operation.name', command);\n return;\n }\n // Fallback: extract operation from the SQL query\n const operationMatch = sanitizedQuery?.match(SQL_OPERATION_REGEX);\n if (operationMatch?.[1]) {\n span.setAttribute('db.operation.name', operationMatch[1].toUpperCase());\n }\n}\n\n/**\n * Extracts and stores connection context from sql.options.\n */\nfunction _attachConnectionContext(sql: unknown, proxiedSql: Record<symbol, unknown>): void {\n const sqlInstance = sql as { options?: { host?: string[]; port?: number[]; database?: string } };\n if (!sqlInstance.options || typeof sqlInstance.options !== 'object') {\n return;\n }\n\n const opts = sqlInstance.options;\n // postgres.js stores parsed options with host and port as arrays\n // The library defaults to 'localhost' and 5432 if not specified, but we're defensive here\n const host = opts.host?.[0] || 'localhost';\n const port = opts.port?.[0] || 5432;\n\n const connectionContext: PostgresConnectionContext = {\n ATTR_DB_NAMESPACE: typeof opts.database === 'string' && opts.database !== '' ? opts.database : undefined,\n ATTR_SERVER_ADDRESS: host,\n ATTR_SERVER_PORT: String(port),\n };\n\n proxiedSql[CONNECTION_CONTEXT_SYMBOL] = connectionContext;\n}\n"],"names":[],"mappings":";;;;;;;AAWA,MAAM,mBAAA,GAAsB,mDAAA;AAuB5B,MAAM,yBAAA,0BAAmC,iCAAiC,CAAA;AAI1E,MAAM,mBAAA,mBAAsB,MAAA,CAAO,GAAA,CAAI,gCAAgC,CAAA;AAIvE,MAAM,2BAAA,mBAA8B,MAAA,CAAO,GAAA,CAAI,oCAAoC,CAAA;AAqB5E,SAAS,uBAAA,CAA2B,KAAQ,OAAA,EAAkD;AACnG,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAA,EAAY;AACrC,IAAA,WAAA,IAAe,KAAA,CAAM,KAAK,iFAAiF,CAAA;AAC3G,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,uBAAuB,GAAA,EAAK,EAAE,mBAAmB,IAAA,EAAM,GAAG,SAAS,CAAA;AAC5E;AAKA,SAAS,sBAAA,CACP,GAAA,EACA,OAAA,EACA,uBAAA,EACS;AAGT,EAAA,IAAK,GAAA,CAAgC,mBAAmB,CAAA,EAAG;AACzD,IAAA,OAAO,GAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAsB,IAAI,KAAA,CAAM,GAAA,EAAwC;AAAA,IAC5E,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAS,aAAA,EAA0B;AAC/C,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,aAAa,CAAA;AAE1D,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,YAAY,KAAA,EAAO;AAC3D,QAAA,sBAAA,CAAuB,KAAA,EAAkD,YAAY,OAAO,CAAA;AAAA,MAC9F;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,QAAA,GAAY,OAAuD,IAAI,CAAA;AAE7E,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,aAAa,UAAA,EAAY;AAC9D,QAAA,OAAO,QAAA;AAAA,MACT;AAGA,MAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,MAAA,EAAQ;AACxC,QAAA,OAAO,gBAAA,CAAiB,QAAA,EAA6C,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AAAA,MAClG;AAGA,MAAA,IAAI,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,SAAA,EAAW;AAC1C,QAAA,OAAO,mBAAA,CAAoB,QAAA,EAA6C,MAAA,EAAQ,UAAA,EAAY,OAAO,CAAA;AAAA,MACrG;AAEA,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,uBAAA,EAAyB;AAC3B,IAAC,UAAA,CAAuC,yBAAyB,CAAA,GAAI,uBAAA;AAAA,EACvE,CAAA,MAAO;AACL,IAAA,wBAAA,CAAyB,KAAK,UAAqC,CAAA;AAAA,EACrE;AAGA,EAAC,GAAA,CAAgC,mBAAmB,CAAA,GAAI,IAAA;AACxD,EAAC,UAAA,CAAuC,mBAAmB,CAAA,GAAI,IAAA;AAE/D,EAAA,OAAO,UAAA;AACT;AAKA,SAAS,gBAAA,CACP,QAAA,EACA,MAAA,EACA,UAAA,EACA,OAAA,EACiC;AACjC,EAAA,OAAO,YAA4B,IAAA,EAA0B;AAC3D,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AAElD,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,YAAY,KAAA,EAAO;AAC3D,MAAA,sBAAA,CAAuB,KAAA,EAAkD,YAAY,OAAO,CAAA;AAAA,IAC9F;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AACF;AASA,SAAS,mBAAA,CACP,QAAA,EACA,MAAA,EACA,iBAAA,EACA,OAAA,EACiC;AACjC,EAAA,OAAO,YAA4B,IAAA,EAA0B;AAE3D,IAAA,MAAM,aAAA,GAAiB,kBAA8C,yBAAyB,CAAA;AAK9F,IAAA,MAAM,kBAAkB,OAAO,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,KAAM,UAAA;AAEzD,IAAA,IAAI,CAAC,eAAA,EAAiB;AAEpB,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,QAAQ,IAAI,CAAA;AAEnD,MAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAA4B,IAAA,KAAS,UAAA,EAAY;AACrE,QAAA,OAAQ,MAAA,CAA4B,IAAA,CAAK,CAAC,WAAA,KAAyB;AACjE,UAAA,OAAO,sBAAA,CAAuB,WAAA,EAAa,OAAA,EAAS,aAAa,CAAA;AAAA,QACnE,CAAC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAY,KAAK,MAAA,KAAW,CAAA,GAAI,KAAK,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AACtD,IAAA,MAAM,eAAA,GAAkB,SAAU,WAAA,EAA+B;AAC/D,MAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,WAAA,EAAa,OAAA,EAAS,aAAa,CAAA;AAClF,MAAA,OAAO,SAAS,eAAe,CAAA;AAAA,IACjC,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,CAAC,eAAe,CAAA,GAAI,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG,eAAe,CAAA;AACjF,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AAAA,EAChD,CAAA;AACF;AAKA,SAAS,sBAAA,CACP,KAAA,EACA,WAAA,EACA,OAAA,EACM;AAEN,EAAA,IAAK,KAAA,CAAM,QAA0C,eAAA,EAAiB;AACpE,IAAA;AAAA,EACF;AAIA,EAAC,KAAA,CAAkC,2BAA2B,CAAA,GAAI,IAAA;AAElE,EAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA;AAI7B,EAAA,MAAM,aAAA,GAAgB,kBAAiD,IAAA,EAAmC;AAGxG,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,kBAAA,CAAmB,OAAO,CAAA,EAAG;AACjD,MAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,KAAA,CAAM,OAAO,CAAA;AACjD,IAAA,MAAM,iBAAA,GAAoB,kBAAkB,SAAS,CAAA;AAErD,IAAA,OAAO,eAAA;AAAA,MACL;AAAA,QACE,MAAM,iBAAA,IAAqB,kBAAA;AAAA,QAC3B,EAAA,EAAI;AAAA,OACN;AAAA,MACA,CAAC,IAAA,KAAe;AACd,QAAA,IAAA,CAAK,YAAA,CAAa,kCAAkC,oBAAoB,CAAA;AAExE,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,gBAAA,EAAkB,UAAA;AAAA,UAClB,eAAA,EAAiB;AAAA,SAClB,CAAA;AAED,QAAA,MAAM,iBAAA,GAAoB,WAAA,GACpB,WAAA,CAAwC,yBAAyB,CAAA,GAGnE,MAAA;AAEJ,QAAA,wBAAA,CAAyB,MAAM,iBAAiB,CAAA;AAEhD,QAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,UAAA,IAAI;AACF,YAAA,OAAA,CAAQ,WAAA,CAAY,IAAA,EAAM,iBAAA,EAAmB,iBAAiB,CAAA;AAAA,UAChE,SAAS,CAAA,EAAG;AACV,YAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,oBAAoB,CAAA;AAC3D,YAAA,WAAA,IAAe,KAAA,CAAM,KAAA,CAAM,sDAAA,EAAwD,CAAC,CAAA;AAAA,UACtF;AAAA,QACF;AAEA,QAAA,MAAM,kBAAA,GAAqB,IAAA;AAK3B,QAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,KAAA,CAAM,kBAAA,CAAmB,OAAA,EAA4C;AAAA,UACpG,KAAA,EAAO,CAAC,aAAA,EAAe,cAAA,EAAgB,WAAA,KAAwC;AAC7E,YAAA,IAAI;AACF,cAAA,iBAAA,CAAkB,IAAA,EAAM,iBAAA,EAAmB,WAAA,GAAc,CAAC,GAAG,OAAO,CAAA;AACpE,cAAA,IAAA,CAAK,GAAA,EAAI;AAAA,YACX,SAAS,CAAA,EAAG;AACV,cAAA,WAAA,IAAe,KAAA,CAAM,KAAA,CAAM,wCAAA,EAA0C,CAAC,CAAA;AAAA,YACxE;AAEA,YAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,aAAA,EAAe,cAAA,EAAgB,WAAW,CAAA;AAAA,UACjE;AAAA,SACD,CAAA;AAED,QAAA,kBAAA,CAAmB,MAAA,GAAS,IAAI,KAAA,CAAM,kBAAA,CAAmB,MAAA,EAA2C;AAAA,UAClG,KAAA,EAAO,CAAC,YAAA,EAAc,aAAA,EAAe,UAAA,KAAqE;AACxG,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,SAAA,CAAU;AAAA,gBACb,IAAA,EAAM,iBAAA;AAAA,gBACN,OAAA,EAAS,UAAA,GAAa,CAAC,CAAA,EAAG,OAAA,IAAW;AAAA,eACtC,CAAA;AAED,cAAA,IAAA,CAAK,aAAa,yBAAA,EAA2B,UAAA,GAAa,CAAC,CAAA,EAAG,QAAQ,SAAS,CAAA;AAC/E,cAAA,IAAA,CAAK,aAAa,YAAA,EAAc,UAAA,GAAa,CAAC,CAAA,EAAG,QAAQ,SAAS,CAAA;AAElE,cAAA,iBAAA,CAAkB,MAAM,iBAAiB,CAAA;AACzC,cAAA,IAAA,CAAK,GAAA,EAAI;AAAA,YACX,SAAS,CAAA,EAAG;AACV,cAAA,WAAA,IAAe,KAAA,CAAM,KAAA,CAAM,uCAAA,EAAyC,CAAC,CAAA;AAAA,YACvE;AACA,YAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,YAAA,EAAc,aAAA,EAAe,UAAU,CAAA;AAAA,UAC9D;AAAA,SACD,CAAA;AAGD,QAAA,IAAI;AACF,UAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,QACxC,SAAS,CAAA,EAAG;AACV,UAAA,IAAA,CAAK,SAAA,CAAU;AAAA,YACb,IAAA,EAAM,iBAAA;AAAA,YACN,OAAA,EAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU;AAAA,WAC3C,CAAA;AACD,UAAA,IAAA,CAAK,GAAA,EAAI;AACT,UAAA,MAAM,CAAA;AAAA,QACR;AAAA,MACF;AAAA,KACF;AAAA,EACF,CAAA;AAEA,EAAC,cAAgD,eAAA,GAAkB,IAAA;AACnE,EAAA,KAAA,CAAM,MAAA,GAAS,aAAA;AACjB;AAOA,SAAS,mBAAmB,OAAA,EAAuD;AACjF,EAAA,MAAM,aAAA,GAAgB,eAAc,KAAM,MAAA;AAC1C,EAAA,OAAO,aAAA,IAAiB,CAAC,OAAA,CAAQ,iBAAA;AACnC;AAWO,SAAS,kBAAkB,OAAA,EAAmD;AACnF,EAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,MAAA;AAAA,EACvB;AAEA,EAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,EAAK,MAAO,CAAA,KAAM,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,EAAG,GAAG,IAAK,EAAE,CAAA;AAClF;AAEA,IAAI,gBAAA;AAWG,SAAS,kBAAkB,QAAA,EAAsC;AACtE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,mBAAA;AAAA,EACT;AAKA,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,gBAAA,GAAmB,IAAI,MAAA,CAAO,sBAAA,EAAwB,GAAG,CAAA;AAAA,EAC3D;AAEA,EAAA,OACE,QAAA,CAEG,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CACrB,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA,CAC/B,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAEnB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,IAAA,EAAK,CAEL,OAAA,CAAQ,qBAAA,EAAuB,GAAG,CAAA,CAClC,OAAA,CAAQ,cAAA,EAAgB,GAAG,CAAA,CAE3B,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA,CAE9B,OAAA,CAAQ,oBAAA,EAAsB,GAAG,CAAA,CAEjC,OAAA,CAAQ,sBAAA,EAAwB,GAAG,CAAA,CAEnC,OAAA,CAAQ,8BAAA,EAAgC,GAAG,CAAA,CAC3C,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA,CAC9B,OAAA,CAAQ,YAAA,EAAc,GAAG,CAAA,CACzB,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA,CAE7B,OAAA,CAAQ,uCAAA,EAAyC,QAAQ,CAAA,CACzD,OAAA,CAAQ,+CAA+C,SAAS,CAAA;AAEvE;AAKA,SAAS,wBAAA,CAAyB,MAAY,iBAAA,EAAgE;AAC5G,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA;AAAA,EACF;AACA,EAAA,IAAI,kBAAkB,iBAAA,EAAmB;AACvC,IAAA,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,iBAAA,CAAkB,iBAAiB,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,kBAAkB,mBAAA,EAAqB;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,EAAkB,iBAAA,CAAkB,mBAAmB,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,iBAAA,CAAkB,qBAAqB,MAAA,EAAW;AAGpD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,iBAAA,CAAkB,gBAAA,EAAkB,EAAE,CAAA;AAClE,IAAA,IAAI,CAAC,KAAA,CAAM,UAAU,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,YAAA,CAAa,eAAe,UAAU,CAAA;AAAA,IAC7C;AAAA,EACF;AACF;AAKA,SAAS,iBAAA,CAAkB,IAAA,EAAY,cAAA,EAAoC,OAAA,EAAwB;AACjG,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,OAAO,CAAA;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,cAAA,EAAgB,KAAA,CAAM,mBAAmB,CAAA;AAChE,EAAA,IAAI,cAAA,GAAiB,CAAC,CAAA,EAAG;AACvB,IAAA,IAAA,CAAK,aAAa,mBAAA,EAAqB,cAAA,CAAe,CAAC,CAAA,CAAE,aAAa,CAAA;AAAA,EACxE;AACF;AAKA,SAAS,wBAAA,CAAyB,KAAc,UAAA,EAA2C;AACzF,EAAA,MAAM,WAAA,GAAc,GAAA;AACpB,EAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,OAAO,WAAA,CAAY,YAAY,QAAA,EAAU;AACnE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,WAAA,CAAY,OAAA;AAGzB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,IAAK,WAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,CAAC,CAAA,IAAK,IAAA;AAE/B,EAAA,MAAM,iBAAA,GAA+C;AAAA,IACnD,iBAAA,EAAmB,OAAO,IAAA,CAAK,QAAA,KAAa,YAAY,IAAA,CAAK,QAAA,KAAa,EAAA,GAAK,IAAA,CAAK,QAAA,GAAW,MAAA;AAAA,IAC/F,mBAAA,EAAqB,IAAA;AAAA,IACrB,gBAAA,EAAkB,OAAO,IAAI;AAAA,GAC/B;AAEA,EAAA,UAAA,CAAW,yBAAyB,CAAA,GAAI,iBAAA;AAC1C;;;;"}

@@ -1,1 +0,1 @@

{"type":"module","version":"10.56.0","sideEffects":false}
{"type":"module","version":"10.57.0","sideEffects":false}
import { dsnToString } from '../../utils/dsn.js';
import { getSdkMetadataForEnvelopeHeader, createEnvelope } from '../../utils/envelope.js';
import { isBrowser } from '../../utils/isBrowser.js';
import { safeDateNow } from '../../utils/randomSafeContext.js';

@@ -11,3 +12,3 @@ function createStreamedSpanEnvelope(serializedSpans, dsc, client) {

const headers = {
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
sent_at: new Date(safeDateNow()).toISOString(),
...dscHasRequiredProps(dsc) && { trace: dsc },

@@ -14,0 +15,0 @@ ...sdk && { sdk },

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.js","sources":["../../../../src/tracing/spans/envelope.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport type { DynamicSamplingContext, SpanContainerItem, StreamedSpanEnvelope } from '../../types/envelope';\nimport type { SerializedStreamedSpan } from '../../types/span';\nimport { dsnToString } from '../../utils/dsn';\nimport { createEnvelope, getSdkMetadataForEnvelopeHeader } from '../../utils/envelope';\nimport { isBrowser } from '../../utils/isBrowser';\n\n/**\n * Creates a span v2 span streaming envelope\n */\nexport function createStreamedSpanEnvelope(\n serializedSpans: Array<SerializedStreamedSpan>,\n dsc: Partial<DynamicSamplingContext>,\n client: Client,\n): StreamedSpanEnvelope {\n const options = client.getOptions();\n const dsn = client.getDsn();\n const tunnel = options.tunnel;\n const sdk = getSdkMetadataForEnvelopeHeader(options._metadata);\n\n const headers: StreamedSpanEnvelope[0] = {\n sent_at: new Date().toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(sdk && { sdk }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const inferSetting = client.getDataCollectionOptions().userInfo ? 'auto' : 'never';\n\n const spanContainer: SpanContainerItem = [\n { type: 'span', item_count: serializedSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' },\n {\n version: 2,\n ...(isBrowser() && {\n ingest_settings: { infer_ip: inferSetting, infer_user_agent: inferSetting },\n }),\n items: serializedSpans,\n },\n ];\n\n return createEnvelope<StreamedSpanEnvelope>(headers, [spanContainer]);\n}\n\nfunction dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n}\n"],"names":[],"mappings":";;;;AAUO,SAAS,0BAAA,CACd,eAAA,EACA,GAAA,EACA,MAAA,EACsB;AACtB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,EAAO;AAC1B,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,GAAA,GAAM,+BAAA,CAAgC,OAAA,CAAQ,SAAS,CAAA;AAE7D,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAChC,GAAI,mBAAA,CAAoB,GAAG,CAAA,IAAK,EAAE,OAAO,GAAA,EAAI;AAAA,IAC7C,GAAI,GAAA,IAAO,EAAE,GAAA,EAAI;AAAA,IACjB,GAAI,CAAC,CAAC,MAAA,IAAU,OAAO,EAAE,GAAA,EAAK,WAAA,CAAY,GAAG,CAAA;AAAE,GACjD;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,wBAAA,EAAyB,CAAE,WAAW,MAAA,GAAS,OAAA;AAE3E,EAAA,MAAM,aAAA,GAAmC;AAAA,IACvC,EAAE,IAAA,EAAM,MAAA,EAAQ,YAAY,eAAA,CAAgB,MAAA,EAAQ,cAAc,2CAAA,EAA4C;AAAA,IAC9G;AAAA,MACE,OAAA,EAAS,CAAA;AAAA,MACT,GAAI,WAAU,IAAK;AAAA,QACjB,eAAA,EAAiB,EAAE,QAAA,EAAU,YAAA,EAAc,kBAAkB,YAAA;AAAa,OAC5E;AAAA,MACA,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,OAAO,cAAA,CAAqC,OAAA,EAAS,CAAC,aAAa,CAAC,CAAA;AACtE;AAEA,SAAS,oBAAoB,GAAA,EAAqE;AAChG,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,QAAA,IAAY,CAAC,CAAC,GAAA,CAAI,UAAA;AACjC;;;;"}
{"version":3,"file":"envelope.js","sources":["../../../../src/tracing/spans/envelope.ts"],"sourcesContent":["import type { Client } from '../../client';\nimport type { DynamicSamplingContext, SpanContainerItem, StreamedSpanEnvelope } from '../../types/envelope';\nimport type { SerializedStreamedSpan } from '../../types/span';\nimport { dsnToString } from '../../utils/dsn';\nimport { createEnvelope, getSdkMetadataForEnvelopeHeader } from '../../utils/envelope';\nimport { isBrowser } from '../../utils/isBrowser';\nimport { safeDateNow } from '../../utils/randomSafeContext';\n\n/**\n * Creates a span v2 span streaming envelope\n */\nexport function createStreamedSpanEnvelope(\n serializedSpans: Array<SerializedStreamedSpan>,\n dsc: Partial<DynamicSamplingContext>,\n client: Client,\n): StreamedSpanEnvelope {\n const options = client.getOptions();\n const dsn = client.getDsn();\n const tunnel = options.tunnel;\n const sdk = getSdkMetadataForEnvelopeHeader(options._metadata);\n\n const headers: StreamedSpanEnvelope[0] = {\n sent_at: new Date(safeDateNow()).toISOString(),\n ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n ...(sdk && { sdk }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n };\n\n const inferSetting = client.getDataCollectionOptions().userInfo ? 'auto' : 'never';\n\n const spanContainer: SpanContainerItem = [\n { type: 'span', item_count: serializedSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' },\n {\n version: 2,\n ...(isBrowser() && {\n ingest_settings: { infer_ip: inferSetting, infer_user_agent: inferSetting },\n }),\n items: serializedSpans,\n },\n ];\n\n return createEnvelope<StreamedSpanEnvelope>(headers, [spanContainer]);\n}\n\nfunction dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n return !!dsc.trace_id && !!dsc.public_key;\n}\n"],"names":[],"mappings":";;;;;AAWO,SAAS,0BAAA,CACd,eAAA,EACA,GAAA,EACA,MAAA,EACsB;AACtB,EAAA,MAAM,OAAA,GAAU,OAAO,UAAA,EAAW;AAClC,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,EAAO;AAC1B,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,GAAA,GAAM,+BAAA,CAAgC,OAAA,CAAQ,SAAS,CAAA;AAE7D,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,SAAS,IAAI,IAAA,CAAK,WAAA,EAAa,EAAE,WAAA,EAAY;AAAA,IAC7C,GAAI,mBAAA,CAAoB,GAAG,CAAA,IAAK,EAAE,OAAO,GAAA,EAAI;AAAA,IAC7C,GAAI,GAAA,IAAO,EAAE,GAAA,EAAI;AAAA,IACjB,GAAI,CAAC,CAAC,MAAA,IAAU,OAAO,EAAE,GAAA,EAAK,WAAA,CAAY,GAAG,CAAA;AAAE,GACjD;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,wBAAA,EAAyB,CAAE,WAAW,MAAA,GAAS,OAAA;AAE3E,EAAA,MAAM,aAAA,GAAmC;AAAA,IACvC,EAAE,IAAA,EAAM,MAAA,EAAQ,YAAY,eAAA,CAAgB,MAAA,EAAQ,cAAc,2CAAA,EAA4C;AAAA,IAC9G;AAAA,MACE,OAAA,EAAS,CAAA;AAAA,MACT,GAAI,WAAU,IAAK;AAAA,QACjB,eAAA,EAAiB,EAAE,QAAA,EAAU,YAAA,EAAc,kBAAkB,YAAA;AAAa,OAC5E;AAAA,MACA,KAAA,EAAO;AAAA;AACT,GACF;AAEA,EAAA,OAAO,cAAA,CAAqC,OAAA,EAAS,CAAC,aAAa,CAAC,CAAA;AACtE;AAEA,SAAS,oBAAoB,GAAA,EAAqE;AAChG,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,QAAA,IAAY,CAAC,CAAC,GAAA,CAAI,UAAA;AACjC;;;;"}
import { DEBUG_BUILD } from '../debug-build.js';
import { debug } from '../utils/debug-logger.js';
import { envelopeContainsItemType } from '../utils/envelope.js';
import { safeDateNow } from '../utils/randomSafeContext.js';
import { parseRetryAfterHeader } from '../utils/ratelimit.js';

@@ -41,3 +42,3 @@ import { safeUnref } from '../utils/timer.js';

log("Attempting to send previously queued event");
found[0].sent_at = (/* @__PURE__ */ new Date()).toISOString();
found[0].sent_at = new Date(safeDateNow()).toISOString();
void send(found, true).catch((e) => {

@@ -44,0 +45,0 @@ log("Failed to retry sending", e);

@@ -1,1 +0,1 @@

{"version":3,"file":"offline.js","sources":["../../../src/transports/offline.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport type { Envelope } from '../types/envelope';\nimport type { InternalBaseTransportOptions, Transport, TransportMakeRequestResponse } from '../types/transport';\nimport { debug } from '../utils/debug-logger';\nimport { envelopeContainsItemType } from '../utils/envelope';\nimport { parseRetryAfterHeader } from '../utils/ratelimit';\nimport { safeUnref } from '../utils/timer';\n\nexport const MIN_DELAY = 100; // 100 ms\nexport const START_DELAY = 5_000; // 5 seconds\nconst MAX_DELAY = 3.6e6; // 1 hour\n\nexport interface OfflineStore {\n push(env: Envelope): Promise<void>;\n unshift(env: Envelope): Promise<void>;\n shift(): Promise<Envelope | undefined>;\n}\n\nexport type CreateOfflineStore = (options: OfflineTransportOptions) => OfflineStore;\n\nexport interface OfflineTransportOptions extends InternalBaseTransportOptions {\n /**\n * A function that creates the offline store instance.\n */\n createStore?: CreateOfflineStore;\n\n /**\n * Flush the offline store shortly after startup.\n *\n * Defaults: false\n */\n flushAtStartup?: boolean;\n\n /**\n * Called before an event is stored.\n *\n * Return false to drop the envelope rather than store it.\n *\n * @param envelope The envelope that failed to send.\n * @param error The error that occurred.\n * @param retryDelay The current retry delay in milliseconds.\n * @returns Whether the envelope should be stored.\n */\n shouldStore?: (envelope: Envelope, error: Error, retryDelay: number) => boolean | Promise<boolean>;\n\n /**\n * Should an attempt be made to send the envelope to Sentry.\n *\n * If this function is supplied and returns false, `shouldStore` will be called to determine if the envelope should be stored.\n *\n * @param envelope The envelope that will be sent.\n * @returns Whether we should attempt to send the envelope\n */\n shouldSend?: (envelope: Envelope) => boolean | Promise<boolean>;\n}\n\ntype Timer = number | { unref?: () => void };\n\n/**\n * Wraps a transport and stores and retries events when they fail to send.\n *\n * @param createTransport The transport to wrap.\n */\nexport function makeOfflineTransport<TO>(\n createTransport: (options: TO) => Transport,\n): (options: TO & OfflineTransportOptions) => Transport {\n function log(...args: unknown[]): void {\n DEBUG_BUILD && debug.log('[Offline]:', ...args);\n }\n\n return options => {\n const transport = createTransport(options);\n\n if (!options.createStore) {\n throw new Error('No `createStore` function was provided');\n }\n\n const store = options.createStore(options);\n\n let retryDelay = START_DELAY;\n let flushTimer: Timer | undefined;\n\n function shouldQueue(env: Envelope, error: Error, retryDelay: number): boolean | Promise<boolean> {\n // We want to drop client reports because they can be generated when we retry sending events while offline.\n if (envelopeContainsItemType(env, ['client_report'])) {\n return false;\n }\n\n if (options.shouldStore) {\n return options.shouldStore(env, error, retryDelay);\n }\n\n return true;\n }\n\n function flushIn(delay: number): void {\n if (flushTimer) {\n clearTimeout(flushTimer as ReturnType<typeof setTimeout>);\n }\n\n // We need to unref the timer in node.js, otherwise the node process never exit.\n flushTimer = safeUnref(\n setTimeout(async () => {\n flushTimer = undefined;\n\n const found = await store.shift();\n if (found) {\n log('Attempting to send previously queued event');\n\n // We should to update the sent_at timestamp to the current time.\n found[0].sent_at = new Date().toISOString();\n\n void send(found, true).catch(e => {\n log('Failed to retry sending', e);\n });\n }\n }, delay),\n ) as Timer;\n }\n\n function flushWithBackOff(): void {\n if (flushTimer) {\n return;\n }\n\n flushIn(retryDelay);\n\n retryDelay = Math.min(retryDelay * 2, MAX_DELAY);\n }\n\n async function send(envelope: Envelope, isRetry: boolean = false): Promise<TransportMakeRequestResponse> {\n // We queue all replay envelopes to avoid multiple replay envelopes being sent at the same time. If one fails, we\n // need to retry them in order.\n if (!isRetry && envelopeContainsItemType(envelope, ['replay_event', 'replay_recording'])) {\n await store.push(envelope);\n flushIn(MIN_DELAY);\n return {};\n }\n\n try {\n if (options.shouldSend && (await options.shouldSend(envelope)) === false) {\n throw new Error('Envelope not sent because `shouldSend` callback returned false');\n }\n\n const result = await transport.send(envelope);\n\n let delay = MIN_DELAY;\n\n if (result) {\n // If there's a retry-after header, use that as the next delay.\n if (result.headers?.['retry-after']) {\n delay = parseRetryAfterHeader(result.headers['retry-after']);\n } else if (result.headers?.['x-sentry-rate-limits']) {\n delay = 60_000; // 60 seconds\n } // If we have a server error, return now so we don't flush the queue.\n else if ((result.statusCode || 0) >= 400) {\n return result;\n }\n }\n\n flushIn(delay);\n retryDelay = START_DELAY;\n return result;\n } catch (e) {\n if (await shouldQueue(envelope, e as Error, retryDelay)) {\n // If this envelope was a retry, we want to add it to the front of the queue so it's retried again first.\n if (isRetry) {\n await store.unshift(envelope);\n } else {\n await store.push(envelope);\n }\n flushWithBackOff();\n log('Error sending. Event queued.', e as Error);\n return {};\n } else {\n throw e;\n }\n }\n }\n\n if (options.flushAtStartup) {\n flushWithBackOff();\n }\n\n return {\n send,\n flush: timeout => {\n // If there's no timeout, we should attempt to flush the offline queue.\n if (timeout === undefined) {\n retryDelay = START_DELAY;\n flushIn(MIN_DELAY);\n }\n\n return transport.flush(timeout);\n },\n };\n };\n}\n"],"names":["retryDelay"],"mappings":"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"}
{"version":3,"file":"offline.js","sources":["../../../src/transports/offline.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport type { Envelope } from '../types/envelope';\nimport type { InternalBaseTransportOptions, Transport, TransportMakeRequestResponse } from '../types/transport';\nimport { debug } from '../utils/debug-logger';\nimport { envelopeContainsItemType } from '../utils/envelope';\nimport { safeDateNow } from '../utils/randomSafeContext';\nimport { parseRetryAfterHeader } from '../utils/ratelimit';\nimport { safeUnref } from '../utils/timer';\n\nexport const MIN_DELAY = 100; // 100 ms\nexport const START_DELAY = 5_000; // 5 seconds\nconst MAX_DELAY = 3.6e6; // 1 hour\n\nexport interface OfflineStore {\n push(env: Envelope): Promise<void>;\n unshift(env: Envelope): Promise<void>;\n shift(): Promise<Envelope | undefined>;\n}\n\nexport type CreateOfflineStore = (options: OfflineTransportOptions) => OfflineStore;\n\nexport interface OfflineTransportOptions extends InternalBaseTransportOptions {\n /**\n * A function that creates the offline store instance.\n */\n createStore?: CreateOfflineStore;\n\n /**\n * Flush the offline store shortly after startup.\n *\n * Defaults: false\n */\n flushAtStartup?: boolean;\n\n /**\n * Called before an event is stored.\n *\n * Return false to drop the envelope rather than store it.\n *\n * @param envelope The envelope that failed to send.\n * @param error The error that occurred.\n * @param retryDelay The current retry delay in milliseconds.\n * @returns Whether the envelope should be stored.\n */\n shouldStore?: (envelope: Envelope, error: Error, retryDelay: number) => boolean | Promise<boolean>;\n\n /**\n * Should an attempt be made to send the envelope to Sentry.\n *\n * If this function is supplied and returns false, `shouldStore` will be called to determine if the envelope should be stored.\n *\n * @param envelope The envelope that will be sent.\n * @returns Whether we should attempt to send the envelope\n */\n shouldSend?: (envelope: Envelope) => boolean | Promise<boolean>;\n}\n\ntype Timer = number | { unref?: () => void };\n\n/**\n * Wraps a transport and stores and retries events when they fail to send.\n *\n * @param createTransport The transport to wrap.\n */\nexport function makeOfflineTransport<TO>(\n createTransport: (options: TO) => Transport,\n): (options: TO & OfflineTransportOptions) => Transport {\n function log(...args: unknown[]): void {\n DEBUG_BUILD && debug.log('[Offline]:', ...args);\n }\n\n return options => {\n const transport = createTransport(options);\n\n if (!options.createStore) {\n throw new Error('No `createStore` function was provided');\n }\n\n const store = options.createStore(options);\n\n let retryDelay = START_DELAY;\n let flushTimer: Timer | undefined;\n\n function shouldQueue(env: Envelope, error: Error, retryDelay: number): boolean | Promise<boolean> {\n // We want to drop client reports because they can be generated when we retry sending events while offline.\n if (envelopeContainsItemType(env, ['client_report'])) {\n return false;\n }\n\n if (options.shouldStore) {\n return options.shouldStore(env, error, retryDelay);\n }\n\n return true;\n }\n\n function flushIn(delay: number): void {\n if (flushTimer) {\n clearTimeout(flushTimer as ReturnType<typeof setTimeout>);\n }\n\n // We need to unref the timer in node.js, otherwise the node process never exit.\n flushTimer = safeUnref(\n setTimeout(async () => {\n flushTimer = undefined;\n\n const found = await store.shift();\n if (found) {\n log('Attempting to send previously queued event');\n\n // We should to update the sent_at timestamp to the current time.\n found[0].sent_at = new Date(safeDateNow()).toISOString();\n\n void send(found, true).catch(e => {\n log('Failed to retry sending', e);\n });\n }\n }, delay),\n ) as Timer;\n }\n\n function flushWithBackOff(): void {\n if (flushTimer) {\n return;\n }\n\n flushIn(retryDelay);\n\n retryDelay = Math.min(retryDelay * 2, MAX_DELAY);\n }\n\n async function send(envelope: Envelope, isRetry: boolean = false): Promise<TransportMakeRequestResponse> {\n // We queue all replay envelopes to avoid multiple replay envelopes being sent at the same time. If one fails, we\n // need to retry them in order.\n if (!isRetry && envelopeContainsItemType(envelope, ['replay_event', 'replay_recording'])) {\n await store.push(envelope);\n flushIn(MIN_DELAY);\n return {};\n }\n\n try {\n if (options.shouldSend && (await options.shouldSend(envelope)) === false) {\n throw new Error('Envelope not sent because `shouldSend` callback returned false');\n }\n\n const result = await transport.send(envelope);\n\n let delay = MIN_DELAY;\n\n if (result) {\n // If there's a retry-after header, use that as the next delay.\n if (result.headers?.['retry-after']) {\n delay = parseRetryAfterHeader(result.headers['retry-after']);\n } else if (result.headers?.['x-sentry-rate-limits']) {\n delay = 60_000; // 60 seconds\n } // If we have a server error, return now so we don't flush the queue.\n else if ((result.statusCode || 0) >= 400) {\n return result;\n }\n }\n\n flushIn(delay);\n retryDelay = START_DELAY;\n return result;\n } catch (e) {\n if (await shouldQueue(envelope, e as Error, retryDelay)) {\n // If this envelope was a retry, we want to add it to the front of the queue so it's retried again first.\n if (isRetry) {\n await store.unshift(envelope);\n } else {\n await store.push(envelope);\n }\n flushWithBackOff();\n log('Error sending. Event queued.', e as Error);\n return {};\n } else {\n throw e;\n }\n }\n }\n\n if (options.flushAtStartup) {\n flushWithBackOff();\n }\n\n return {\n send,\n flush: timeout => {\n // If there's no timeout, we should attempt to flush the offline queue.\n if (timeout === undefined) {\n retryDelay = START_DELAY;\n flushIn(MIN_DELAY);\n }\n\n return transport.flush(timeout);\n },\n };\n };\n}\n"],"names":["retryDelay"],"mappings":"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"}

@@ -12,3 +12,4 @@ import { PII_HEADER_SNIPPETS } from './filtering-snippets.js';

stackFrameVariables: true,
frameContextLines: 5
frameContextLines: 7
// default should be 5, but ContextLines integration uses 7
} : {

@@ -22,3 +23,4 @@ userInfo: false,

stackFrameVariables: true,
frameContextLines: 5
frameContextLines: 7
// default should be 5, but ContextLines integration uses 7
};

@@ -25,0 +27,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"defaultPiiToCollectionOptions.js","sources":["../../../../src/utils/data-collection/defaultPiiToCollectionOptions.ts"],"sourcesContent":["import { PII_HEADER_SNIPPETS } from './filtering-snippets';\nimport type { ResolvedDataCollection } from '../../types/datacollection';\n\n/**\n * Helper function that maps the `sendDefaultPii` boolean flag to the corresponding `DataCollection` configuration.\n */\nexport function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): ResolvedDataCollection {\n return sendDefaultPii === true\n ? {\n userInfo: true,\n cookies: true,\n httpHeaders: { request: true, response: true },\n httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'],\n queryParams: true,\n genAI: { inputs: true, outputs: true },\n stackFrameVariables: true,\n frameContextLines: 5,\n }\n : {\n userInfo: false,\n cookies: { deny: PII_HEADER_SNIPPETS },\n httpHeaders: { request: { deny: PII_HEADER_SNIPPETS }, response: { deny: PII_HEADER_SNIPPETS } },\n httpBodies: [],\n queryParams: { deny: PII_HEADER_SNIPPETS },\n genAI: { inputs: false, outputs: false },\n stackFrameVariables: true,\n frameContextLines: 5,\n };\n}\n"],"names":[],"mappings":";;AAMO,SAAS,8BAA8B,cAAA,EAAkD;AAC9F,EAAA,OAAO,mBAAmB,IAAA,GACtB;AAAA,IACE,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,IAC7C,UAAA,EAAY,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,oBAAoB,kBAAkB,CAAA;AAAA,IACzF,WAAA,EAAa,IAAA;AAAA,IACb,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,IACrC,mBAAA,EAAqB,IAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA,GACrB,GACA;AAAA,IACE,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,IACrC,WAAA,EAAa,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,mBAAA,EAAoB,EAAG,QAAA,EAAU,EAAE,IAAA,EAAM,mBAAA,EAAoB,EAAE;AAAA,IAC/F,YAAY,EAAC;AAAA,IACb,WAAA,EAAa,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,IACzC,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACvC,mBAAA,EAAqB,IAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA,GACrB;AACN;;;;"}
{"version":3,"file":"defaultPiiToCollectionOptions.js","sources":["../../../../src/utils/data-collection/defaultPiiToCollectionOptions.ts"],"sourcesContent":["import { PII_HEADER_SNIPPETS } from './filtering-snippets';\nimport type { ResolvedDataCollection } from '../../types/datacollection';\n\n/**\n * Helper function that maps the `sendDefaultPii` boolean flag to the corresponding `DataCollection` configuration.\n * Used as a backward-compatibility bridge when `dataCollection` is not set by the user.\n *\n * TODO(v11): Remove this function along with `sendDefaultPii`. Once `dataCollection` is the only API,\n * the DEFAULTS in `resolveDataCollectionOptions` (including `userInfo: true`) will always apply.\n */\nexport function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): ResolvedDataCollection {\n return sendDefaultPii === true\n ? {\n userInfo: true,\n cookies: true,\n httpHeaders: { request: true, response: true },\n httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'],\n queryParams: true,\n genAI: { inputs: true, outputs: true },\n stackFrameVariables: true,\n frameContextLines: 7, // default should be 5, but ContextLines integration uses 7\n }\n : {\n userInfo: false,\n cookies: { deny: PII_HEADER_SNIPPETS },\n httpHeaders: { request: { deny: PII_HEADER_SNIPPETS }, response: { deny: PII_HEADER_SNIPPETS } },\n httpBodies: [],\n queryParams: { deny: PII_HEADER_SNIPPETS },\n genAI: { inputs: false, outputs: false },\n stackFrameVariables: true,\n frameContextLines: 7, // default should be 5, but ContextLines integration uses 7\n };\n}\n"],"names":[],"mappings":";;AAUO,SAAS,8BAA8B,cAAA,EAAkD;AAC9F,EAAA,OAAO,mBAAmB,IAAA,GACtB;AAAA,IACE,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,IAC7C,UAAA,EAAY,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,oBAAoB,kBAAkB,CAAA;AAAA,IACzF,WAAA,EAAa,IAAA;AAAA,IACb,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,IACrC,mBAAA,EAAqB,IAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA;AAAA,GACrB,GACA;AAAA,IACE,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,IACrC,WAAA,EAAa,EAAE,OAAA,EAAS,EAAE,IAAA,EAAM,mBAAA,EAAoB,EAAG,QAAA,EAAU,EAAE,IAAA,EAAM,mBAAA,EAAoB,EAAE;AAAA,IAC/F,YAAY,EAAC;AAAA,IACb,WAAA,EAAa,EAAE,IAAA,EAAM,mBAAA,EAAoB;AAAA,IACzC,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACvC,mBAAA,EAAqB,IAAA;AAAA,IACrB,iBAAA,EAAmB;AAAA;AAAA,GACrB;AACN;;;;"}
import { defaultPiiToCollectionOptions } from './defaultPiiToCollectionOptions.js';
const DEFAULTS = {
userInfo: false,
userInfo: true,
cookies: true,
httpHeaders: { request: true, response: true },
httpBodies: [],
httpBodies: ["incomingRequest", "outgoingRequest", "incomingResponse", "outgoingResponse"],
queryParams: true,

@@ -9,0 +9,0 @@ genAI: { inputs: true, outputs: true },

@@ -1,1 +0,1 @@

{"version":3,"file":"resolveDataCollectionOptions.js","sources":["../../../../src/utils/data-collection/resolveDataCollectionOptions.ts"],"sourcesContent":["import type { DataCollection, ResolvedDataCollection } from '../../types/datacollection';\nimport { defaultPiiToCollectionOptions } from './defaultPiiToCollectionOptions';\n\nconst DEFAULTS: ResolvedDataCollection = {\n userInfo: false,\n cookies: true,\n httpHeaders: { request: true, response: true },\n httpBodies: [],\n queryParams: true,\n genAI: { inputs: true, outputs: true },\n stackFrameVariables: true,\n frameContextLines: 5,\n};\n\n/**\n * Resolves the effective `DataCollection` configuration from client options.\n *\n * Precedence:\n * 1. Fields explicitly set in `dataCollection`\n * 2. If `sendDefaultPii` is set and `dataCollection` is absent, bridge via `defaultPiiToCollectionOptions`\n * 3. Spec defaults\n */\nexport function resolveDataCollectionOptions(options: {\n dataCollection?: DataCollection;\n sendDefaultPii?: boolean;\n}): ResolvedDataCollection {\n const base = options.dataCollection != null ? DEFAULTS : defaultPiiToCollectionOptions(options.sendDefaultPii);\n\n const dc = options.dataCollection ?? {};\n\n return {\n userInfo: dc.userInfo ?? base.userInfo,\n cookies: dc.cookies ?? base.cookies,\n httpHeaders: {\n request: dc.httpHeaders?.request ?? base.httpHeaders.request,\n response: dc.httpHeaders?.response ?? base.httpHeaders.response,\n },\n httpBodies: dc.httpBodies ?? base.httpBodies,\n queryParams: dc.queryParams ?? base.queryParams,\n genAI: {\n inputs: dc.genAI?.inputs ?? base.genAI.inputs,\n outputs: dc.genAI?.outputs ?? base.genAI.outputs,\n },\n stackFrameVariables: dc.stackFrameVariables ?? base.stackFrameVariables,\n frameContextLines: dc.frameContextLines ?? base.frameContextLines,\n };\n}\n"],"names":[],"mappings":";;AAGA,MAAM,QAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,KAAA;AAAA,EACV,OAAA,EAAS,IAAA;AAAA,EACT,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,EAC7C,YAAY,EAAC;AAAA,EACb,WAAA,EAAa,IAAA;AAAA,EACb,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,EACrC,mBAAA,EAAqB,IAAA;AAAA,EACrB,iBAAA,EAAmB;AACrB,CAAA;AAUO,SAAS,6BAA6B,OAAA,EAGlB;AACzB,EAAA,MAAM,OAAO,OAAA,CAAQ,cAAA,IAAkB,OAAO,QAAA,GAAW,6BAAA,CAA8B,QAAQ,cAAc,CAAA;AAE7G,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,cAAA,IAAkB,EAAC;AAEtC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,EAAA,CAAG,QAAA,IAAY,IAAA,CAAK,QAAA;AAAA,IAC9B,OAAA,EAAS,EAAA,CAAG,OAAA,IAAW,IAAA,CAAK,OAAA;AAAA,IAC5B,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,EAAA,CAAG,WAAA,EAAa,OAAA,IAAW,KAAK,WAAA,CAAY,OAAA;AAAA,MACrD,QAAA,EAAU,EAAA,CAAG,WAAA,EAAa,QAAA,IAAY,KAAK,WAAA,CAAY;AAAA,KACzD;AAAA,IACA,UAAA,EAAY,EAAA,CAAG,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IAClC,WAAA,EAAa,EAAA,CAAG,WAAA,IAAe,IAAA,CAAK,WAAA;AAAA,IACpC,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,EAAA,CAAG,KAAA,EAAO,MAAA,IAAU,KAAK,KAAA,CAAM,MAAA;AAAA,MACvC,OAAA,EAAS,EAAA,CAAG,KAAA,EAAO,OAAA,IAAW,KAAK,KAAA,CAAM;AAAA,KAC3C;AAAA,IACA,mBAAA,EAAqB,EAAA,CAAG,mBAAA,IAAuB,IAAA,CAAK,mBAAA;AAAA,IACpD,iBAAA,EAAmB,EAAA,CAAG,iBAAA,IAAqB,IAAA,CAAK;AAAA,GAClD;AACF;;;;"}
{"version":3,"file":"resolveDataCollectionOptions.js","sources":["../../../../src/utils/data-collection/resolveDataCollectionOptions.ts"],"sourcesContent":["import type { DataCollection, ResolvedDataCollection } from '../../types/datacollection';\nimport { defaultPiiToCollectionOptions } from './defaultPiiToCollectionOptions';\n\nconst DEFAULTS: ResolvedDataCollection = {\n userInfo: true,\n cookies: true,\n httpHeaders: { request: true, response: true },\n httpBodies: ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse'],\n queryParams: true,\n genAI: { inputs: true, outputs: true },\n stackFrameVariables: true,\n frameContextLines: 5,\n};\n\n/**\n * Resolves the effective `DataCollection` configuration from client options.\n *\n * Precedence:\n * 1. Fields explicitly set in `dataCollection`\n * 2. If `sendDefaultPii` is set and `dataCollection` is absent, bridge via `defaultPiiToCollectionOptions`\n * 3. Spec defaults\n *\n * TODO(v11): Remove `sendDefaultPii` support and always fall through to DEFAULTS so that `userInfo: true`\n * NOTE: In v10, DEFAULTS only apply when `dataCollection` is explicitly provided.\n * When `dataCollection` is absent, the legacy `sendDefaultPii` bridge is used, which defaults to\n * `userInfo: false` to preserve backward compatibility.\n */\nexport function resolveDataCollectionOptions(options: {\n dataCollection?: DataCollection;\n sendDefaultPii?: boolean;\n}): ResolvedDataCollection {\n // TODO(v11): Remove the sendDefaultPii bridge and always use DEFAULTS.\n const base = options.dataCollection != null ? DEFAULTS : defaultPiiToCollectionOptions(options.sendDefaultPii);\n\n const dc = options.dataCollection ?? {};\n\n return {\n userInfo: dc.userInfo ?? base.userInfo,\n cookies: dc.cookies ?? base.cookies,\n httpHeaders: {\n request: dc.httpHeaders?.request ?? base.httpHeaders.request,\n response: dc.httpHeaders?.response ?? base.httpHeaders.response,\n },\n httpBodies: dc.httpBodies ?? base.httpBodies,\n queryParams: dc.queryParams ?? base.queryParams,\n genAI: {\n inputs: dc.genAI?.inputs ?? base.genAI.inputs,\n outputs: dc.genAI?.outputs ?? base.genAI.outputs,\n },\n stackFrameVariables: dc.stackFrameVariables ?? base.stackFrameVariables,\n frameContextLines: dc.frameContextLines ?? base.frameContextLines,\n };\n}\n"],"names":[],"mappings":";;AAGA,MAAM,QAAA,GAAmC;AAAA,EACvC,QAAA,EAAU,IAAA;AAAA,EACV,OAAA,EAAS,IAAA;AAAA,EACT,WAAA,EAAa,EAAE,OAAA,EAAS,IAAA,EAAM,UAAU,IAAA,EAAK;AAAA,EAC7C,UAAA,EAAY,CAAC,iBAAA,EAAmB,iBAAA,EAAmB,oBAAoB,kBAAkB,CAAA;AAAA,EACzF,WAAA,EAAa,IAAA;AAAA,EACb,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,IAAA,EAAK;AAAA,EACrC,mBAAA,EAAqB,IAAA;AAAA,EACrB,iBAAA,EAAmB;AACrB,CAAA;AAeO,SAAS,6BAA6B,OAAA,EAGlB;AAEzB,EAAA,MAAM,OAAO,OAAA,CAAQ,cAAA,IAAkB,OAAO,QAAA,GAAW,6BAAA,CAA8B,QAAQ,cAAc,CAAA;AAE7G,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,cAAA,IAAkB,EAAC;AAEtC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,EAAA,CAAG,QAAA,IAAY,IAAA,CAAK,QAAA;AAAA,IAC9B,OAAA,EAAS,EAAA,CAAG,OAAA,IAAW,IAAA,CAAK,OAAA;AAAA,IAC5B,WAAA,EAAa;AAAA,MACX,OAAA,EAAS,EAAA,CAAG,WAAA,EAAa,OAAA,IAAW,KAAK,WAAA,CAAY,OAAA;AAAA,MACrD,QAAA,EAAU,EAAA,CAAG,WAAA,EAAa,QAAA,IAAY,KAAK,WAAA,CAAY;AAAA,KACzD;AAAA,IACA,UAAA,EAAY,EAAA,CAAG,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IAClC,WAAA,EAAa,EAAA,CAAG,WAAA,IAAe,IAAA,CAAK,WAAA;AAAA,IACpC,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,EAAA,CAAG,KAAA,EAAO,MAAA,IAAU,KAAK,KAAA,CAAM,MAAA;AAAA,MACvC,OAAA,EAAS,EAAA,CAAG,KAAA,EAAO,OAAA,IAAW,KAAK,KAAA,CAAM;AAAA,KAC3C;AAAA,IACA,mBAAA,EAAqB,EAAA,CAAG,mBAAA,IAAuB,IAAA,CAAK,mBAAA;AAAA,IACpD,iBAAA,EAAmB,EAAA,CAAG,iBAAA,IAAqB,IAAA,CAAK;AAAA,GAClD;AACF;;;;"}
import { getSentryCarrier } from '../carrier.js';
import { dsnToString } from './dsn.js';
import { normalize } from './normalize.js';
import { safeDateNow } from './randomSafeContext.js';
import { GLOBAL_OBJ } from './worldwide.js';

@@ -146,3 +147,3 @@

event_id: event.event_id,
sent_at: (/* @__PURE__ */ new Date()).toISOString(),
sent_at: new Date(safeDateNow()).toISOString(),
...sdkInfo && { sdk: sdkInfo },

@@ -149,0 +150,0 @@ ...!!tunnel && dsn && { dsn: dsnToString(dsn) },

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.js","sources":["../../../src/utils/envelope.ts"],"sourcesContent":["import { getSentryCarrier } from '../carrier';\nimport type { Attachment } from '../types/attachment';\nimport type { DataCategory } from '../types/datacategory';\nimport type { DsnComponents } from '../types/dsn';\nimport type {\n AttachmentItem,\n BaseEnvelopeHeaders,\n BaseEnvelopeItemHeaders,\n Envelope,\n EnvelopeItemType,\n EventEnvelopeHeaders,\n SpanItem,\n} from '../types/envelope';\nimport type { Event } from '../types/event';\nimport type { SdkInfo } from '../types/sdkinfo';\nimport type { SdkMetadata } from '../types/sdkmetadata';\nimport type { SpanJSON } from '../types/span';\nimport { dsnToString } from './dsn';\nimport { normalize } from './normalize';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope<E extends Envelope>(headers: E[0], items: E[1] = []): E {\n return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope<E extends Envelope>(envelope: E, newItem: E[1][number]): E {\n const [headers, items] = envelope;\n return [headers, [...items, newItem]] as unknown as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nexport function forEachEnvelopeItem<E extends Envelope>(\n envelope: Envelope,\n callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => boolean | void,\n): boolean {\n const envelopeItems = envelope[1];\n\n for (const envelopeItem of envelopeItems) {\n const envelopeItemType = envelopeItem[0].type;\n const result = callback(envelopeItem, envelopeItemType);\n\n if (result) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nexport function envelopeContainsItemType(envelope: Envelope, types: EnvelopeItemType[]): boolean {\n return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8 array.\n */\nfunction encodeUTF8(input: string): Uint8Array {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.encodePolyfill ? carrier.encodePolyfill(input) : new TextEncoder().encode(input);\n}\n\n/**\n * Decode a UTF8 array to string.\n */\nfunction decodeUTF8(input: Uint8Array): string {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.decodePolyfill ? carrier.decodePolyfill(input) : new TextDecoder().decode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope): string | Uint8Array {\n const [envHeaders, items] = envelope;\n // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n function append(next: string | Uint8Array): void {\n if (typeof parts === 'string') {\n parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next];\n } else {\n parts.push(typeof next === 'string' ? encodeUTF8(next) : next);\n }\n }\n\n for (const item of items) {\n const [itemHeaders, payload] = item;\n\n append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n if (typeof payload === 'string' || payload instanceof Uint8Array) {\n append(payload);\n } else {\n let stringifiedPayload: string;\n try {\n stringifiedPayload = JSON.stringify(payload);\n } catch {\n // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.stringify()` still\n // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n // performance impact but in this case a performance hit is better than throwing.\n stringifiedPayload = JSON.stringify(normalize(payload));\n }\n append(stringifiedPayload);\n }\n }\n\n return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n merged.set(buffer, offset);\n offset += buffer.length;\n }\n\n return merged;\n}\n\n/**\n * Parses an envelope\n */\nexport function parseEnvelope(env: string | Uint8Array): Envelope {\n let buffer = typeof env === 'string' ? encodeUTF8(env) : env;\n\n function readBinary(length: number): Uint8Array {\n const bin = buffer.subarray(0, length);\n // Replace the buffer with the remaining data excluding trailing newline\n buffer = buffer.subarray(length + 1);\n return bin;\n }\n\n function readJson<T>(): T {\n let i = buffer.indexOf(0xa);\n // If we couldn't find a newline, we must have found the end of the buffer\n if (i < 0) {\n i = buffer.length;\n }\n\n return JSON.parse(decodeUTF8(readBinary(i))) as T;\n }\n\n const envelopeHeader = readJson<BaseEnvelopeHeaders>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items: [any, any][] = [];\n\n while (buffer.length) {\n const itemHeader = readJson<BaseEnvelopeItemHeaders>();\n const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n }\n\n return [envelopeHeader, items];\n}\n\n/**\n * Creates envelope item for a single span\n */\nexport function createSpanEnvelopeItem(spanJson: Partial<SpanJSON>): SpanItem {\n const spanHeaders: SpanItem[0] = {\n type: 'span',\n };\n\n return [spanHeaders, spanJson];\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(attachment: Attachment): AttachmentItem {\n const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data;\n\n return [\n {\n type: 'attachment',\n length: buffer.length,\n filename: attachment.filename,\n content_type: attachment.contentType,\n attachment_type: attachment.attachmentType,\n },\n buffer,\n ];\n}\n\ntype OverriddenItemType = Exclude<EnvelopeItemType, DataCategory>;\n\n// Map of envelope item types to data categories where the category differs from the type.\n// Types that map to themselves (session, attachment, transaction, profile, feedback, span, metric) fall through.\nconst DATA_CATEGORY_OVERRIDES: Record<OverriddenItemType, DataCategory> = {\n sessions: 'session',\n event: 'error',\n client_report: 'internal',\n user_report: 'default',\n profile_chunk: 'profile',\n replay_event: 'replay',\n replay_recording: 'replay',\n check_in: 'monitor',\n raw_security: 'security',\n log: 'log_item',\n trace_metric: 'metric',\n};\n\nfunction _isOverriddenType(type: EnvelopeItemType): type is OverriddenItemType {\n return type in DATA_CATEGORY_OVERRIDES;\n}\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n return _isOverriddenType(type) ? DATA_CATEGORY_OVERRIDES[type] : type;\n}\n\n/** Extracts the minimal SDK info from the metadata or an events */\nexport function getSdkMetadataForEnvelopeHeader(metadataOrEvent?: SdkMetadata | Event): SdkInfo | undefined {\n if (!metadataOrEvent?.sdk) {\n return;\n }\n const { name, version } = metadataOrEvent.sdk;\n return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nexport function createEventEnvelopeHeaders(\n event: Event,\n sdkInfo: SdkInfo | undefined,\n tunnel: string | undefined,\n dsn?: DsnComponents,\n): EventEnvelopeHeaders {\n const dynamicSamplingContext = event.sdkProcessingMetadata?.dynamicSamplingContext;\n return {\n event_id: event.event_id as string,\n sent_at: new Date().toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n ...(dynamicSamplingContext && {\n trace: dynamicSamplingContext,\n }),\n };\n}\n"],"names":[],"mappings":";;;;;AA0BO,SAAS,cAAA,CAAmC,OAAA,EAAe,KAAA,GAAc,EAAC,EAAM;AACrF,EAAA,OAAO,CAAC,SAAS,KAAK,CAAA;AACxB;AAOO,SAAS,iBAAA,CAAsC,UAAa,OAAA,EAA0B;AAC3F,EAAA,MAAM,CAAC,OAAA,EAAS,KAAK,CAAA,GAAI,QAAA;AACzB,EAAA,OAAO,CAAC,OAAA,EAAS,CAAC,GAAG,KAAA,EAAO,OAAO,CAAC,CAAA;AACtC;AAQO,SAAS,mBAAA,CACd,UACA,QAAA,EACS;AACT,EAAA,MAAM,aAAA,GAAgB,SAAS,CAAC,CAAA;AAEhC,EAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,IAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,CAAC,CAAA,CAAE,IAAA;AACzC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,YAAA,EAAc,gBAAgB,CAAA;AAEtD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,wBAAA,CAAyB,UAAoB,KAAA,EAAoC;AAC/F,EAAA,OAAO,mBAAA,CAAoB,UAAU,CAAC,CAAA,EAAG,SAAS,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA;AACxE;AAKA,SAAS,WAAW,KAAA,EAA2B;AAC7C,EAAA,MAAM,OAAA,GAAU,iBAAiB,UAAU,CAAA;AAC3C,EAAA,OAAO,OAAA,CAAQ,cAAA,GAAiB,OAAA,CAAQ,cAAA,CAAe,KAAK,IAAI,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,KAAK,CAAA;AAChG;AAKA,SAAS,WAAW,KAAA,EAA2B;AAC7C,EAAA,MAAM,OAAA,GAAU,iBAAiB,UAAU,CAAA;AAC3C,EAAA,OAAO,OAAA,CAAQ,cAAA,GAAiB,OAAA,CAAQ,cAAA,CAAe,KAAK,IAAI,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,KAAK,CAAA;AAChG;AAKO,SAAS,kBAAkB,QAAA,EAAyC;AACzE,EAAA,MAAM,CAAC,UAAA,EAAY,KAAK,CAAA,GAAI,QAAA;AAE5B,EAAA,IAAI,KAAA,GAA+B,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAE5D,EAAA,SAAS,OAAO,IAAA,EAAiC;AAC/C,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,KAAA,GAAQ,OAAO,SAAS,QAAA,GAAW,KAAA,GAAQ,OAAO,CAAC,UAAA,CAAW,KAAK,CAAA,EAAG,IAAI,CAAA;AAAA,IAC5E,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,OAAO,IAAA,KAAS,WAAW,UAAA,CAAW,IAAI,IAAI,IAAI,CAAA;AAAA,IAC/D;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,CAAC,WAAA,EAAa,OAAO,CAAA,GAAI,IAAA;AAE/B,IAAA,MAAA,CAAO;AAAA,EAAK,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC;AAAA,CAAI,CAAA;AAE3C,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,YAAmB,UAAA,EAAY;AAChE,MAAA,MAAA,CAAO,OAAO,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,IAAI,kBAAA;AACJ,MAAA,IAAI;AACF,QAAA,kBAAA,GAAqB,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,MAC7C,CAAA,CAAA,MAAQ;AAIN,QAAA,kBAAA,GAAqB,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,MACxD;AACA,MAAA,MAAA,CAAO,kBAAkB,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,cAAc,KAAK,CAAA;AAChE;AAEA,SAAS,cAAc,OAAA,EAAmC;AACxD,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ,GAAA,GAAM,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAEpE,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,CAAW,WAAW,CAAA;AACzC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,MAAM,CAAA;AACzB,IAAA,MAAA,IAAU,MAAA,CAAO,MAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cAAc,GAAA,EAAoC;AAChE,EAAA,IAAI,SAAS,OAAO,GAAA,KAAQ,QAAA,GAAW,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA;AAEzD,EAAA,SAAS,WAAW,MAAA,EAA4B;AAC9C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,QAAA,CAAS,CAAA,EAAG,MAAM,CAAA;AAErC,IAAA,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,SAAS,QAAA,GAAiB;AACxB,IAAA,IAAI,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,EAAG,CAAA;AAE1B,IAAA,IAAI,IAAI,CAAA,EAAG;AACT,MAAA,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,IACb;AAEA,IAAA,OAAO,KAAK,KAAA,CAAM,UAAA,CAAW,UAAA,CAAW,CAAC,CAAC,CAAC,CAAA;AAAA,EAC7C;AAEA,EAAA,MAAM,iBAAiB,QAAA,EAA8B;AAErD,EAAA,MAAM,QAAsB,EAAC;AAE7B,EAAA,OAAO,OAAO,MAAA,EAAQ;AACpB,IAAA,MAAM,aAAa,QAAA,EAAkC;AACrD,IAAA,MAAM,eAAe,OAAO,UAAA,CAAW,MAAA,KAAW,QAAA,GAAW,WAAW,MAAA,GAAS,MAAA;AAEjF,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,UAAA,EAAY,YAAA,GAAe,WAAW,YAAY,CAAA,GAAI,QAAA,EAAU,CAAC,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAO,CAAC,gBAAgB,KAAK,CAAA;AAC/B;AAKO,SAAS,uBAAuB,QAAA,EAAuC;AAC5E,EAAA,MAAM,WAAA,GAA2B;AAAA,IAC/B,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,OAAO,CAAC,aAAa,QAAQ,CAAA;AAC/B;AAKO,SAAS,6BAA6B,UAAA,EAAwC;AACnF,EAAA,MAAM,MAAA,GAAS,OAAO,UAAA,CAAW,IAAA,KAAS,WAAW,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,UAAA,CAAW,IAAA;AAE9F,EAAA,OAAO;AAAA,IACL;AAAA,MACE,IAAA,EAAM,YAAA;AAAA,MACN,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,cAAc,UAAA,CAAW,WAAA;AAAA,MACzB,iBAAiB,UAAA,CAAW;AAAA,KAC9B;AAAA,IACA;AAAA,GACF;AACF;AAMA,MAAM,uBAAA,GAAoE;AAAA,EACxE,QAAA,EAAU,SAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,aAAA,EAAe,UAAA;AAAA,EACf,WAAA,EAAa,SAAA;AAAA,EACb,aAAA,EAAe,SAAA;AAAA,EACf,YAAA,EAAc,QAAA;AAAA,EACd,gBAAA,EAAkB,QAAA;AAAA,EAClB,QAAA,EAAU,SAAA;AAAA,EACV,YAAA,EAAc,UAAA;AAAA,EACd,GAAA,EAAK,UAAA;AAAA,EACL,YAAA,EAAc;AAChB,CAAA;AAEA,SAAS,kBAAkB,IAAA,EAAoD;AAC7E,EAAA,OAAO,IAAA,IAAQ,uBAAA;AACjB;AAKO,SAAS,+BAA+B,IAAA,EAAsC;AACnF,EAAA,OAAO,iBAAA,CAAkB,IAAI,CAAA,GAAI,uBAAA,CAAwB,IAAI,CAAA,GAAI,IAAA;AACnE;AAGO,SAAS,gCAAgC,eAAA,EAA4D;AAC1G,EAAA,IAAI,CAAC,iBAAiB,GAAA,EAAK;AACzB,IAAA;AAAA,EACF;AACA,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,eAAA,CAAgB,GAAA;AAC1C,EAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AACzB;AAMO,SAAS,0BAAA,CACd,KAAA,EACA,OAAA,EACA,MAAA,EACA,GAAA,EACsB;AACtB,EAAA,MAAM,sBAAA,GAAyB,MAAM,qBAAA,EAAuB,sBAAA;AAC5D,EAAA,OAAO;AAAA,IACL,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAChC,GAAI,OAAA,IAAW,EAAE,GAAA,EAAK,OAAA,EAAQ;AAAA,IAC9B,GAAI,CAAC,CAAC,MAAA,IAAU,OAAO,EAAE,GAAA,EAAK,WAAA,CAAY,GAAG,CAAA,EAAE;AAAA,IAC/C,GAAI,sBAAA,IAA0B;AAAA,MAC5B,KAAA,EAAO;AAAA;AACT,GACF;AACF;;;;"}
{"version":3,"file":"envelope.js","sources":["../../../src/utils/envelope.ts"],"sourcesContent":["import { getSentryCarrier } from '../carrier';\nimport type { Attachment } from '../types/attachment';\nimport type { DataCategory } from '../types/datacategory';\nimport type { DsnComponents } from '../types/dsn';\nimport type {\n AttachmentItem,\n BaseEnvelopeHeaders,\n BaseEnvelopeItemHeaders,\n Envelope,\n EnvelopeItemType,\n EventEnvelopeHeaders,\n SpanItem,\n} from '../types/envelope';\nimport type { Event } from '../types/event';\nimport type { SdkInfo } from '../types/sdkinfo';\nimport type { SdkMetadata } from '../types/sdkmetadata';\nimport type { SpanJSON } from '../types/span';\nimport { dsnToString } from './dsn';\nimport { normalize } from './normalize';\nimport { safeDateNow } from './randomSafeContext';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope<E extends Envelope>(headers: E[0], items: E[1] = []): E {\n return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope<E extends Envelope>(envelope: E, newItem: E[1][number]): E {\n const [headers, items] = envelope;\n return [headers, [...items, newItem]] as unknown as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nexport function forEachEnvelopeItem<E extends Envelope>(\n envelope: Envelope,\n callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => boolean | void,\n): boolean {\n const envelopeItems = envelope[1];\n\n for (const envelopeItem of envelopeItems) {\n const envelopeItemType = envelopeItem[0].type;\n const result = callback(envelopeItem, envelopeItemType);\n\n if (result) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nexport function envelopeContainsItemType(envelope: Envelope, types: EnvelopeItemType[]): boolean {\n return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8 array.\n */\nfunction encodeUTF8(input: string): Uint8Array {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.encodePolyfill ? carrier.encodePolyfill(input) : new TextEncoder().encode(input);\n}\n\n/**\n * Decode a UTF8 array to string.\n */\nfunction decodeUTF8(input: Uint8Array): string {\n const carrier = getSentryCarrier(GLOBAL_OBJ);\n return carrier.decodePolyfill ? carrier.decodePolyfill(input) : new TextDecoder().decode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope): string | Uint8Array {\n const [envHeaders, items] = envelope;\n // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n function append(next: string | Uint8Array): void {\n if (typeof parts === 'string') {\n parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next];\n } else {\n parts.push(typeof next === 'string' ? encodeUTF8(next) : next);\n }\n }\n\n for (const item of items) {\n const [itemHeaders, payload] = item;\n\n append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n if (typeof payload === 'string' || payload instanceof Uint8Array) {\n append(payload);\n } else {\n let stringifiedPayload: string;\n try {\n stringifiedPayload = JSON.stringify(payload);\n } catch {\n // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.stringify()` still\n // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n // performance impact but in this case a performance hit is better than throwing.\n stringifiedPayload = JSON.stringify(normalize(payload));\n }\n append(stringifiedPayload);\n }\n }\n\n return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n const merged = new Uint8Array(totalLength);\n let offset = 0;\n for (const buffer of buffers) {\n merged.set(buffer, offset);\n offset += buffer.length;\n }\n\n return merged;\n}\n\n/**\n * Parses an envelope\n */\nexport function parseEnvelope(env: string | Uint8Array): Envelope {\n let buffer = typeof env === 'string' ? encodeUTF8(env) : env;\n\n function readBinary(length: number): Uint8Array {\n const bin = buffer.subarray(0, length);\n // Replace the buffer with the remaining data excluding trailing newline\n buffer = buffer.subarray(length + 1);\n return bin;\n }\n\n function readJson<T>(): T {\n let i = buffer.indexOf(0xa);\n // If we couldn't find a newline, we must have found the end of the buffer\n if (i < 0) {\n i = buffer.length;\n }\n\n return JSON.parse(decodeUTF8(readBinary(i))) as T;\n }\n\n const envelopeHeader = readJson<BaseEnvelopeHeaders>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const items: [any, any][] = [];\n\n while (buffer.length) {\n const itemHeader = readJson<BaseEnvelopeItemHeaders>();\n const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n }\n\n return [envelopeHeader, items];\n}\n\n/**\n * Creates envelope item for a single span\n */\nexport function createSpanEnvelopeItem(spanJson: Partial<SpanJSON>): SpanItem {\n const spanHeaders: SpanItem[0] = {\n type: 'span',\n };\n\n return [spanHeaders, spanJson];\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(attachment: Attachment): AttachmentItem {\n const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data;\n\n return [\n {\n type: 'attachment',\n length: buffer.length,\n filename: attachment.filename,\n content_type: attachment.contentType,\n attachment_type: attachment.attachmentType,\n },\n buffer,\n ];\n}\n\ntype OverriddenItemType = Exclude<EnvelopeItemType, DataCategory>;\n\n// Map of envelope item types to data categories where the category differs from the type.\n// Types that map to themselves (session, attachment, transaction, profile, feedback, span, metric) fall through.\nconst DATA_CATEGORY_OVERRIDES: Record<OverriddenItemType, DataCategory> = {\n sessions: 'session',\n event: 'error',\n client_report: 'internal',\n user_report: 'default',\n profile_chunk: 'profile',\n replay_event: 'replay',\n replay_recording: 'replay',\n check_in: 'monitor',\n raw_security: 'security',\n log: 'log_item',\n trace_metric: 'metric',\n};\n\nfunction _isOverriddenType(type: EnvelopeItemType): type is OverriddenItemType {\n return type in DATA_CATEGORY_OVERRIDES;\n}\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n return _isOverriddenType(type) ? DATA_CATEGORY_OVERRIDES[type] : type;\n}\n\n/** Extracts the minimal SDK info from the metadata or an events */\nexport function getSdkMetadataForEnvelopeHeader(metadataOrEvent?: SdkMetadata | Event): SdkInfo | undefined {\n if (!metadataOrEvent?.sdk) {\n return;\n }\n const { name, version } = metadataOrEvent.sdk;\n return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nexport function createEventEnvelopeHeaders(\n event: Event,\n sdkInfo: SdkInfo | undefined,\n tunnel: string | undefined,\n dsn?: DsnComponents,\n): EventEnvelopeHeaders {\n const dynamicSamplingContext = event.sdkProcessingMetadata?.dynamicSamplingContext;\n return {\n event_id: event.event_id as string,\n sent_at: new Date(safeDateNow()).toISOString(),\n ...(sdkInfo && { sdk: sdkInfo }),\n ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n ...(dynamicSamplingContext && {\n trace: dynamicSamplingContext,\n }),\n };\n}\n"],"names":[],"mappings":"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"}

@@ -1,4 +0,4 @@

const SDK_VERSION = "10.56.0" ;
const SDK_VERSION = "10.57.0" ;
export { SDK_VERSION };
//# sourceMappingURL=version.js.map

@@ -543,3 +543,3 @@ import { IntegrationIndex } from './integration';

/**
* Emit a hook event for browser tracing integrations to trigger aafter the pageload span was started.
* Emit a hook event for browser tracing integrations to trigger after the pageload span was started.
*/

@@ -546,0 +546,0 @@ emit(hook: 'afterStartPageLoadSpan', span: Span): void;

@@ -40,4 +40,5 @@ /**

/**
* Which HTTP body types to collect. An empty array disables body collection.
* @default []
* Which HTTP body types to collect. An omitted value collects all body types valid for the
* platform; an empty array (`[]`) disables body collection.
* @default ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse']
*/

@@ -44,0 +45,0 @@ httpBodies?: HttpBodyCollectionTarget[];

@@ -350,7 +350,7 @@ import { CaptureContext } from '../scope';

*
* NOTE: This option currently controls only a few data points in a selected
* set of SDKs. The goal for this option is to eventually control all sensitive
* data the SDK sets by default. However, this would be a breaking change so
* until the next major update this option only controls data points which were
* added in versions above `7.9.0`.
* @deprecated Use the {@link ClientOptions.dataCollection} option instead, which lets you control
* each category of collected data individually. `sendDefaultPii` will be removed in the next major
* version (v11). For backwards compatibility, setting `sendDefaultPii: true` currently behaves like
* enabling all `dataCollection` categories. If both `sendDefaultPii` and `dataCollection` are set,
* `sendDefaultPii` will be ignored.
*/

@@ -361,2 +361,6 @@ sendDefaultPii?: boolean;

* All fields are optional — omitted fields use the documented defaults.
*
* This replaces the deprecated {@link ClientOptions.sendDefaultPii} option and lets you control
* each category of collected data (user info, cookies, headers, query params, request/response
* bodies, gen AI inputs/outputs, etc.) individually.
*/

@@ -363,0 +367,0 @@ dataCollection?: DataCollection;

import { ResolvedDataCollection } from '../../types/datacollection';
/**
* Helper function that maps the `sendDefaultPii` boolean flag to the corresponding `DataCollection` configuration.
* Used as a backward-compatibility bridge when `dataCollection` is not set by the user.
*
* TODO(v11): Remove this function along with `sendDefaultPii`. Once `dataCollection` is the only API,
* the DEFAULTS in `resolveDataCollectionOptions` (including `userInfo: true`) will always apply.
*/
export declare function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): ResolvedDataCollection;
//# sourceMappingURL=defaultPiiToCollectionOptions.d.ts.map

@@ -9,2 +9,7 @@ import { DataCollection, ResolvedDataCollection } from '../../types/datacollection';

* 3. Spec defaults
*
* TODO(v11): Remove `sendDefaultPii` support and always fall through to DEFAULTS so that `userInfo: true`
* NOTE: In v10, DEFAULTS only apply when `dataCollection` is explicitly provided.
* When `dataCollection` is absent, the legacy `sendDefaultPii` bridge is used, which defaults to
* `userInfo: false` to preserve backward compatibility.
*/

@@ -11,0 +16,0 @@ export declare function resolveDataCollectionOptions(options: {

@@ -1,1 +0,1 @@

{"version":3,"file":"checkin.d.ts","sourceRoot":"","sources":["../../src/checkin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAe,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,EAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,EACxD,QAAQ,CAAC,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,aAAa,GAClB,eAAe,CAsBjB"}
{"version":3,"file":"checkin.d.ts","sourceRoot":"","sources":["../../src/checkin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAe,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,EAC1B,sBAAsB,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,EACxD,QAAQ,CAAC,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,aAAa,GAClB,eAAe,CAsBjB"}

@@ -543,3 +543,3 @@ import type { IntegrationIndex } from './integration';

/**
* Emit a hook event for browser tracing integrations to trigger aafter the pageload span was started.
* Emit a hook event for browser tracing integrations to trigger after the pageload span was started.
*/

@@ -546,0 +546,0 @@ emit(hook: 'afterStartPageLoadSpan', span: Span): void;

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAEV,aAAa,EAEb,mBAAmB,EAEnB,eAAe,EAEf,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAYlE;;;;;IAKI;AACJ,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,KAAK,CAuBlF;AAED,yCAAyC;AACzC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,GAAG,iBAAiB,EACpC,GAAG,CAAC,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,eAAe,CAYjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,GAAG,CAAC,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,CAwBf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAwDtG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,aAAa,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,mBAAmB,CAYrB"}
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAEV,aAAa,EAEb,mBAAmB,EAEnB,eAAe,EAEf,YAAY,EAEb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAalE;;;;;IAKI;AACJ,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,KAAK,CAuBlF;AAED,yCAAyC;AACzC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,GAAG,iBAAiB,EACpC,GAAG,CAAC,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,eAAe,CAYjB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,GAAG,CAAC,EAAE,aAAa,EACnB,QAAQ,CAAC,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,aAAa,CAwBf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAwDtG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,EACvB,GAAG,EAAE,aAAa,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,mBAAmB,CAYrB"}

@@ -1,1 +0,1 @@

{"version":3,"file":"record-request-session.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/record-request-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AASlD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,EACE,qBAAqB,EACrB,QAAQ,EACR,sBAAsB,GACvB,EAAE;IACD,qBAAqB,EAAE,KAAK,CAAC;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,GACA,IAAI,CAsDN"}
{"version":3,"file":"record-request-session.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/record-request-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAUlD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,EACE,qBAAqB,EACrB,QAAQ,EACR,sBAAsB,GACvB,EAAE;IACD,qBAAqB,EAAE,KAAK,CAAC;IAC7B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,GACA,IAAI,CAsDN"}

@@ -1,1 +0,1 @@

{"version":3,"file":"postgresjs.d.ts","sourceRoot":"","sources":["../../../src/integrations/postgresjs.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAM1C,KAAK,yBAAyB,GAAG;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,UAAU,mCAAmC;IAC3C;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,yBAAyB,CAAC,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACtH;AAYD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,mCAAmC,GAAG,CAAC,CAOnG;AA8PD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CASnF;AAID;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAuCtE"}
{"version":3,"file":"postgresjs.d.ts","sourceRoot":"","sources":["../../../src/integrations/postgresjs.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAM1C,KAAK,yBAAyB,GAAG;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,UAAU,mCAAmC;IAC3C;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,yBAAyB,CAAC,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACtH;AAYD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,mCAAmC,GAAG,CAAC,CAOnG;AAgQD;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CASnF;AAID;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAuCtE"}

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../../src/tracing/spans/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,sBAAsB,EAAqB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAK/D;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,KAAK,CAAC,sBAAsB,CAAC,EAC9C,GAAG,EAAE,OAAO,CAAC,sBAAsB,CAAC,EACpC,MAAM,EAAE,MAAM,GACb,oBAAoB,CA2BtB"}
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../../src/tracing/spans/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,sBAAsB,EAAqB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5G,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAM/D;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,KAAK,CAAC,sBAAsB,CAAC,EAC9C,GAAG,EAAE,OAAO,CAAC,sBAAsB,CAAC,EACpC,MAAM,EAAE,MAAM,GACb,oBAAoB,CA2BtB"}

@@ -1,1 +0,1 @@

{"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../../../src/transports/offline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,4BAA4B,EAAE,SAAS,EAAgC,MAAM,oBAAoB,CAAC;AAMhH,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,WAAW,OAAQ,CAAC;AAGjC,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,uBAAuB,KAAK,YAAY,CAAC;AAEpF,MAAM,WAAW,uBAAwB,SAAQ,4BAA4B;IAC3E;;OAEG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAEjC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnG;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjE;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EACrC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,SAAS,GAC1C,CAAC,OAAO,EAAE,EAAE,GAAG,uBAAuB,KAAK,SAAS,CAoItD"}
{"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../../../src/transports/offline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,4BAA4B,EAAE,SAAS,EAAgC,MAAM,oBAAoB,CAAC;AAOhH,eAAO,MAAM,SAAS,MAAM,CAAC;AAC7B,eAAO,MAAM,WAAW,OAAQ,CAAC;AAGjC,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,KAAK,IAAI,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC;CACxC;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,uBAAuB,KAAK,YAAY,CAAC;AAEpF,MAAM,WAAW,uBAAwB,SAAQ,4BAA4B;IAC3E;;OAEG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAEjC;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnG;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjE;AAID;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EACrC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,SAAS,GAC1C,CAAC,OAAO,EAAE,EAAE,GAAG,uBAAuB,KAAK,SAAS,CAoItD"}

@@ -40,4 +40,5 @@ /**

/**
* Which HTTP body types to collect. An empty array disables body collection.
* @default []
* Which HTTP body types to collect. An omitted value collects all body types valid for the
* platform; an empty array (`[]`) disables body collection.
* @default ['incomingRequest', 'outgoingRequest', 'incomingResponse', 'outgoingResponse']
*/

@@ -44,0 +45,0 @@ httpBodies?: HttpBodyCollectionTarget[];

@@ -1,1 +0,1 @@

{"version":3,"file":"datacollection.d.ts","sourceRoot":"","sources":["../../../src/types/datacollection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAEvH;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,eAAe,CAAC;QAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;KAC5B,CAAC;IAEF;;;OAGG;IACH,UAAU,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAExC;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IAEF;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG;IAC9D,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAClE,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CACvD,CAAC"}
{"version":3,"file":"datacollection.d.ts","sourceRoot":"","sources":["../../../src/types/datacollection.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;AAEvH;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,eAAe,CAAC;QAC1B,QAAQ,CAAC,EAAE,eAAe,CAAC;KAC5B,CAAC;IAEF;;;;OAIG;IACH,UAAU,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAExC;;;OAGG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B;;;OAGG;IACH,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IAEF;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG;IAC9D,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAClE,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CACvD,CAAC"}

@@ -350,7 +350,7 @@ import type { CaptureContext } from '../scope';

*
* NOTE: This option currently controls only a few data points in a selected
* set of SDKs. The goal for this option is to eventually control all sensitive
* data the SDK sets by default. However, this would be a breaking change so
* until the next major update this option only controls data points which were
* added in versions above `7.9.0`.
* @deprecated Use the {@link ClientOptions.dataCollection} option instead, which lets you control
* each category of collected data individually. `sendDefaultPii` will be removed in the next major
* version (v11). For backwards compatibility, setting `sendDefaultPii: true` currently behaves like
* enabling all `dataCollection` categories. If both `sendDefaultPii` and `dataCollection` are set,
* `sendDefaultPii` will be ignored.
*/

@@ -361,2 +361,6 @@ sendDefaultPii?: boolean;

* All fields are optional — omitted fields use the documented defaults.
*
* This replaces the deprecated {@link ClientOptions.sendDefaultPii} option and lets you control
* each category of collected data (user info, cookies, headers, query params, request/response
* bodies, gen AI inputs/outputs, etc.) individually.
*/

@@ -363,0 +367,0 @@ dataCollection?: DataCollection;

@@ -1,1 +0,1 @@

{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/types/options.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/types/options.ts"],"names":[],"mappings":"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"}
import type { ResolvedDataCollection } from '../../types/datacollection';
/**
* Helper function that maps the `sendDefaultPii` boolean flag to the corresponding `DataCollection` configuration.
* Used as a backward-compatibility bridge when `dataCollection` is not set by the user.
*
* TODO(v11): Remove this function along with `sendDefaultPii`. Once `dataCollection` is the only API,
* the DEFAULTS in `resolveDataCollectionOptions` (including `userInfo: true`) will always apply.
*/
export declare function defaultPiiToCollectionOptions(sendDefaultPii?: boolean): ResolvedDataCollection;
//# sourceMappingURL=defaultPiiToCollectionOptions.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"defaultPiiToCollectionOptions.d.ts","sourceRoot":"","sources":["../../../../src/utils/data-collection/defaultPiiToCollectionOptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAsB9F"}
{"version":3,"file":"defaultPiiToCollectionOptions.d.ts","sourceRoot":"","sources":["../../../../src/utils/data-collection/defaultPiiToCollectionOptions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAEzE;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,cAAc,CAAC,EAAE,OAAO,GAAG,sBAAsB,CAsB9F"}

@@ -9,2 +9,7 @@ import type { DataCollection, ResolvedDataCollection } from '../../types/datacollection';

* 3. Spec defaults
*
* TODO(v11): Remove `sendDefaultPii` support and always fall through to DEFAULTS so that `userInfo: true`
* NOTE: In v10, DEFAULTS only apply when `dataCollection` is explicitly provided.
* When `dataCollection` is absent, the legacy `sendDefaultPii` bridge is used, which defaults to
* `userInfo: false` to preserve backward compatibility.
*/

@@ -11,0 +16,0 @@ export declare function resolveDataCollectionOptions(options: {

@@ -1,1 +0,1 @@

{"version":3,"file":"resolveDataCollectionOptions.d.ts","sourceRoot":"","sources":["../../../../src/utils/data-collection/resolveDataCollectionOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAczF;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,sBAAsB,CAqBzB"}
{"version":3,"file":"resolveDataCollectionOptions.d.ts","sourceRoot":"","sources":["../../../../src/utils/data-collection/resolveDataCollectionOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAczF;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE;IACpD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,sBAAsB,CAsBzB"}

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../src/utils/envelope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EACV,cAAc,EAGd,QAAQ,EACR,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,GAAE,CAAC,CAAC,CAAC,CAAM,GAAG,CAAC,CAErF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAG3F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,QAAQ,EACpD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,OAAO,GAAG,IAAI,GAClG,OAAO,CAaT;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAE/F;AAkBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAmCzE;AAeD;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAgChE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAM5E;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,CAanF;AAwBD;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAEnF;AAED,mEAAmE;AACnE,wBAAgB,+BAA+B,CAAC,eAAe,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAM1G;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,CAAC,EAAE,aAAa,GAClB,oBAAoB,CAWtB"}
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../src/utils/envelope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EACV,cAAc,EAGd,QAAQ,EACR,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAM9C;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,GAAE,CAAC,CAAC,CAAC,CAAM,GAAG,CAAC,CAErF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAG3F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,QAAQ,EACpD,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,OAAO,GAAG,IAAI,GAClG,OAAO,CAaT;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAE/F;AAkBD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAmCzE;AAeD;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAgChE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAM5E;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,CAanF;AAwBD;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAEnF;AAED,mEAAmE;AACnE,wBAAgB,+BAA+B,CAAC,eAAe,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAM1G;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,GAAG,CAAC,EAAE,aAAa,GAClB,oBAAoB,CAWtB"}
{
"name": "@sentry/core",
"version": "10.56.0",
"version": "10.57.0",
"description": "Base implementation for all Sentry JavaScript SDKs",

@@ -5,0 +5,0 @@ "repository": "git://github.com/getsentry/sentry-javascript.git",

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display