{"version":3,"file":"index.cjs","names":["version","wrappedConfig: NextConfig","externalsMapping: Record<string, string>","OtSpanKind","PbSpanKind","fields: Record<string, Value>","Struct","Value","yaml","globalLogger: Logger","version","module","exports","hookFn: HookFn","HookRequire","HookImport","expiredTraces: string[]","context","trace","SpanKind","spanInfo: SpanInfo | null","attributes: Attributes","normalized: Record<string, any>","buffers: Buffer[]","CONTENT_TYPE_MAPPING: Record<string, DecodedType>","DecodedType","EventEmitter","JsonSchemaType","merged: JsonSchema","schema: JsonSchema","sortedObj: any","EncodingType","DecodedType","StatusCode","ClientRequest: any","EventEmitter","IncomingMessage","events","emptyResponse: HttpClientOutputValue","rawInputValue: HttpClientInputValue","PackageType","SpanKind","EncodingType","callback: ((res: any) => void) | undefined","mockOptions: TdMockClientRequestOptions","SpanKind","SpanExportService","isWrapped","testSpan: HttpSpanData","SpanKind","actions: TransformAction[]","checks: MatcherFunction[]","path","jp","context","SpanKind","PackageType","completeInputValue: any","responseChunks: (string | Buffer)[]","outputValue: HttpServerOutputValue","spanData: HttpSpanData","EncodingType","SpanStatusCode","StatusCode","error","requestBodyChunks: Buffer[]","streamConsumptionMode: \"NOT_CONSUMING\" | \"READ\" | \"PIPE\"","updatedInputValue: HttpServerInputValue","requestBodyChunks: (string | Buffer)[]","chunk","updatedInputValue: HttpClientInputValue","outputValue: HttpClientOutputValue","responseChunks: Buffer[]","errorOutputValue: HttpClientOutputValue","headers: Record<string, string>","requestOptions: RequestOptions","inputValue: HttpClientInputValue","currentSpanInfo: SpanInfo | null","SpanKind","context","currentSpanInfo: SpanInfo | null","PackageType","EventEmitter","queryConfig: QueryConfig | null","inputValue: PgClientInputValue","SpanKind","PackageType","config: QueryConfig","SpanStatusCode","error","context","fieldTypeMap: Record<string, number>","error: any","SpanKind","PackageType","SpanStatusCode","inputValue: PostgresClientInputValue","error","outputValue: PostgresOutputValueType","EventEmitter","EventEmitter","storedRows: any","storedFields: any","SpanKind","SpanKind","isWrapped","queryConfig: Mysql2QueryConfig | null","inputValue: Mysql2InputValue","SpanKind","PackageType","SpanStatusCode","error","context","config: Mysql2QueryConfig","streamResults: any[]","streamFields: any","outputValue: any","SpanKind","verifyConfig: VerifyQueryConfig | null","rawInputValue: JwtVerifyInputValue","inputValue: JwtVerifyInputValue","SpanKind","signConfig: SignQueryConfig | null","inputValue: JwtSignInputValue","config: VerifyQueryConfig","config: SignQueryConfig","SpanStatusCode","error","context","error: any","actions: TransformAction[]","checks: MatcherFunction[]","SpanKind","jp","encodedBody: any","inputValue: FetchInputValue","SpanKind","PackageType","EncodingType","spanData: FetchSpanData","SpanStatusCode","error","result: Record<string, string>","bodyBuffer: Buffer","chunks: Uint8Array[]","isUtf8","isWrapped","sanitizedArgs: any[]","argsMetadata: BufferMetadata[]","inputValue: IORedisInputValue","SpanKind","PackageType","inputValue: IORedisConnectInputValue","SpanStatusCode","values: any[]","metadata: BufferMetadata[]","readableMetadata: ReadableMetadata","readableBuffer: ReadableMetadataValue","path","bufferMap: Record<string, { value: string; encoding: string }>","jsonableStringMap: Record<string, string>","cloned: any","version","parsedParams: {\n          method: string;\n          serialize: Function;\n          deserialize: Function;\n          argument: any;\n          metadata: any;\n          options: any;\n          callback: Function;\n        }","path","method: string","service: string","readableBody: any","bufferMap: Record<\n          string,\n          {\n            value: string;\n            encoding: string;\n          }\n        >","jsonableStringMap: Record<string, string>","readableMetadata: ReadableMetadata","inputValue: GrpcClientInputValue","SpanKind","PackageType","parsedParams: {\n          method: string;\n          serialize: Function;\n          deserialize: Function;\n          argument: any;\n          metadata: any;\n          options: any;\n        }","stream","Readable","metadata: any","options: any","readableResponseBody: any","responseBufferMap: Record<string, { value: string; encoding: string }>","responseJsonableStringMap: Record<string, any>","status: {\n      code: number;\n      details: string;\n      metadata: Record<string, any>;\n    }","responseMetadataInitial: any","serviceError: any","SpanStatusCode","errorOutput: GrpcErrorOutput","context","EventEmitter","mockResult: GrpcOutputValue | GrpcErrorOutput","status: any","streamResponses: any[]","inputValue: FirestoreInputValue","SpanKind","PackageType","context","documentResult: FirestoreDocumentResult","SpanStatusCode","emptyWriteResult: FirestoreWriteResult","result: FirestoreWriteResult","queryResult: FirestoreQueryResult","inputValue: NextjsServerInputValue","context","SpanKind","PackageType","completeInputValue: NextjsServerInputValue","capturedStatusCode: number | undefined","capturedStatusMessage: string | undefined","capturedHeaders: Record<string, string>","responseChunks: (string | Buffer)[]","SpanStatusCode","outputValue: NextjsServerOutputValue","EncodingType","StatusCode","requestBodyChunks: Buffer[]","streamConsumptionMode: \"NOT_CONSUMING\" | \"READ\" | \"PIPE\"","updatedInputValue: NextjsServerInputValue","normalized: Record<string, string>","inputValue: PrismaInputValue","SpanKind","PackageType","outputValue: PrismaOutputValue","SpanStatusCode","error: any","errorWithClassName: PrismaErrorWithClassName","cloned: PrismaErrorWithClassName","context","api_1","constants_1","api_1","suppress_tracing_1","utils_1","context","api_1","api_1","api_1","sampling_1","environment_1","hex_to_binary_1","version_1","environment_1","platform_1","api_1","context","api_1","suppress_tracing_1","TraceState_1","context","context","api_1","api_1","api_1","global_error_handler_1","AlwaysOffSampler_1","AlwaysOnSampler_1","context","api_1","suppress_tracing_1","OtSpanKind","outputData: unknown","outputSchema: JsonSchema","JsonSchemaType","outputValueHash: string","outputSchemaHash: string","metadata: MetadataObject | undefined","StatusCode","ExportResultCode","TwirpFetchTransport","SpanExportServiceClient","protoSpans: Span[]","request: ExportSpansRequest","ExportResultCode","PackageType","OtelSpanKind","DriftSpanKind","filteredSpansBasedOnLibraryName: ReadableSpan[]","filteredBlockedSpans: ReadableSpan[]","cleanSpans: CleanSpanData[]","ExportResultCode","context","ConnectRequest","SDKMessage","MessageType","GetMockRequest","sdkMessage: SDKMessage","connectionConfig: any","CLIMessage","error: any","EnvVarRequest","envVars: Record<string, string>","Span","SendInboundSpanForReplayRequest","SendAlertRequest","InstrumentationVersionMismatchAlert","UnpatchedDependencyAlert","Value","cleaned: any","NodeTracerProvider","Resource","ATTR_SERVICE_NAME","BatchSpanProcessor","connectionInfo: { socketPath: string } | { host: string; port: number }","trace","TuskDrift: TuskDriftPublicAPI"],"sources":["../src/nextjs/utils.ts","../src/nextjs/withTuskDrift.ts","../src/instrumentation/core/baseClasses/TdInstrumentationAbstract.ts","../src/core/utils/dataNormalizationUtils.ts","../src/core/utils/samplingUtils.ts","../src/core/utils/protobufUtils.ts","../src/core/utils/OriginalGlobalUtils.ts","../src/core/utils/configUtils.ts","../src/core/utils/runtimeDetectionUtils.ts","../src/core/utils/logger.ts","../src/core/analytics/analyticsUtils.ts","../src/instrumentation/core/baseClasses/TdInstrumentationBase.ts","../src/instrumentation/core/baseClasses/TdInstrumentationNodeModule.ts","../src/core/types.ts","../src/core/tracing/TraceBlockingManager.ts","../src/core/tracing/SpanUtils.ts","../src/instrumentation/libraries/http/utils/bodyDecompression.ts","../src/instrumentation/libraries/http/utils/binaryDataHandler.ts","../src/instrumentation/libraries/http/utils/httpBodyEncoder.ts","../src/instrumentation/libraries/http/mocks/TdHttpMockSocket.ts","../src/instrumentation/core/trackers/EnvVarTracker.ts","../src/instrumentation/core/trackers/DateTracker.ts","../src/core/tracing/JsonSchemaHelper.ts","../src/instrumentation/core/utils/mockResponseUtils.ts","../src/instrumentation/libraries/http/mocks/TdMockClientRequest.ts","../src/instrumentation/libraries/http/HttpReplayHooks.ts","../src/instrumentation/core/utils/modeUtils.ts","../src/instrumentation/core/utils/selfExclusion.ts","../src/instrumentation/core/utils/shimmerUtils.ts","../src/instrumentation/core/utils/stackTraceUtils.ts","../src/instrumentation/libraries/http/HttpTransformEngine.ts","../src/instrumentation/libraries/http/Instrumentation.ts","../src/instrumentation/libraries/env/Instrumentation.ts","../src/instrumentation/libraries/date/Instrumentation.ts","../src/instrumentation/core/baseClasses/TdInstrumentationNodeModuleFile.ts","../src/instrumentation/libraries/graphql/utils.ts","../src/instrumentation/libraries/graphql/Instrumentation.ts","../src/instrumentation/libraries/pg/mocks/TdPgClientMock.ts","../src/instrumentation/libraries/pg/Instrumentation.ts","../src/instrumentation/libraries/postgres/types.ts","../src/instrumentation/libraries/postgres/Instrumentation.ts","../src/instrumentation/libraries/mysql2/mocks/TdMysql2ConnectionMock.ts","../src/instrumentation/libraries/mysql2/mocks/TdMysql2QueryMock.ts","../src/instrumentation/libraries/mysql2/mocks/TdMysql2ConnectionEventMock.ts","../src/instrumentation/libraries/mysql2/Instrumentation.ts","../src/instrumentation/libraries/tcp/Instrumentation.ts","../src/instrumentation/libraries/jsonwebtoken/Instrumentation.ts","../src/instrumentation/libraries/jwks-rsa/Instrumentation.ts","../src/instrumentation/libraries/fetch/FetchTransformEngine.ts","../src/instrumentation/libraries/fetch/Instrumentation.ts","../src/instrumentation/libraries/ioredis/types.ts","../src/instrumentation/libraries/ioredis/utils.ts","../src/instrumentation/libraries/ioredis/Instrumentation.ts","../src/instrumentation/libraries/grpc/utils.ts","../src/instrumentation/libraries/grpc/Instrumentation.ts","../src/instrumentation/libraries/firestore/mocks/TdFirestoreDocumentMock.ts","../src/instrumentation/libraries/firestore/mocks/TdFirestoreQueryMock.ts","../src/instrumentation/libraries/firestore/mocks/TdFirestoreWriteResultMock.ts","../src/instrumentation/libraries/firestore/Instrumentation.ts","../src/instrumentation/libraries/nextjs/Instrumentation.ts","../src/instrumentation/libraries/prisma/types.ts","../src/instrumentation/libraries/prisma/Instrumentation.ts","../node_modules/@opentelemetry/core/build/src/trace/suppress-tracing.js","../node_modules/@opentelemetry/core/build/src/baggage/constants.js","../node_modules/@opentelemetry/core/build/src/baggage/utils.js","../node_modules/@opentelemetry/core/build/src/baggage/propagation/W3CBaggagePropagator.js","../node_modules/@opentelemetry/core/build/src/common/anchored-clock.js","../node_modules/@opentelemetry/core/build/src/common/attributes.js","../node_modules/@opentelemetry/core/build/src/common/logging-error-handler.js","../node_modules/@opentelemetry/core/build/src/common/global-error-handler.js","../node_modules/@opentelemetry/core/build/src/utils/sampling.js","../node_modules/@opentelemetry/core/build/src/utils/environment.js","../node_modules/@opentelemetry/core/build/src/platform/node/environment.js","../node_modules/@opentelemetry/core/build/src/platform/node/globalThis.js","../node_modules/@opentelemetry/core/build/src/common/hex-to-binary.js","../node_modules/@opentelemetry/core/build/src/platform/node/hex-to-base64.js","../node_modules/@opentelemetry/core/build/src/platform/node/RandomIdGenerator.js","../node_modules/@opentelemetry/core/build/src/platform/node/performance.js","../node_modules/@opentelemetry/core/build/src/version.js","../node_modules/@opentelemetry/core/build/src/platform/node/sdk-info.js","../node_modules/@opentelemetry/core/build/src/platform/node/timer-util.js","../node_modules/@opentelemetry/core/build/src/platform/node/index.js","../node_modules/@opentelemetry/core/build/src/platform/index.js","../node_modules/@opentelemetry/core/build/src/common/time.js","../node_modules/@opentelemetry/core/build/src/ExportResult.js","../node_modules/@opentelemetry/core/build/src/propagation/composite.js","../node_modules/@opentelemetry/core/build/src/internal/validators.js","../node_modules/@opentelemetry/core/build/src/trace/TraceState.js","../node_modules/@opentelemetry/core/build/src/trace/W3CTraceContextPropagator.js","../node_modules/@opentelemetry/core/build/src/trace/rpc-metadata.js","../node_modules/@opentelemetry/core/build/src/trace/sampler/AlwaysOffSampler.js","../node_modules/@opentelemetry/core/build/src/trace/sampler/AlwaysOnSampler.js","../node_modules/@opentelemetry/core/build/src/trace/sampler/ParentBasedSampler.js","../node_modules/@opentelemetry/core/build/src/trace/sampler/TraceIdRatioBasedSampler.js","../node_modules/@opentelemetry/core/build/src/utils/lodash.merge.js","../node_modules/@opentelemetry/core/build/src/utils/merge.js","../node_modules/@opentelemetry/core/build/src/utils/timeout.js","../node_modules/@opentelemetry/core/build/src/utils/url.js","../node_modules/@opentelemetry/core/build/src/utils/wrap.js","../node_modules/@opentelemetry/core/build/src/utils/promise.js","../node_modules/@opentelemetry/core/build/src/utils/callback.js","../node_modules/@opentelemetry/core/build/src/internal/exporter.js","../node_modules/@opentelemetry/core/build/src/index.js","../src/core/tracing/SpanTransformer.ts","../src/core/tracing/adapters/FilesystemSpanAdapter.ts","../src/core/tracing/adapters/ApiSpanAdapter.ts","../src/core/tracing/TdSpanExporter.ts","../package.json","../src/version.ts","../src/core/ProtobufCommunicator.ts","../src/core/TuskDriftInstrumentationModuleNames.ts","../src/core/TuskDrift.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { parse as parseSemver } from \"semver\";\nimport type { ParsedVersion } from \"./types\";\n\n/**\n * Get the installed Next.js version by reading package.json from node_modules.\n *\n * @returns The Next.js version string, or undefined if not found\n */\nexport function getNextjsVersion(): string | undefined {\n  try {\n    // Try to read from node_modules/next/package.json\n    const nextPackageJsonPath = path.join(process.cwd(), \"node_modules\", \"next\", \"package.json\");\n\n    if (fs.existsSync(nextPackageJsonPath)) {\n      const packageJson = JSON.parse(fs.readFileSync(nextPackageJsonPath, \"utf-8\"));\n      return packageJson.version;\n    }\n  } catch (error) {\n    // Silent failure - we'll warn the user in the main function\n  }\n\n  return undefined;\n}\n\n/**\n * Parse a semantic version string into its components.\n *\n * @param version - The version string to parse (e.g., \"15.0.0-canary.124\")\n * @returns Parsed version object with major, minor, patch, and prerelease\n */\nexport function parseVersion(version: string): ParsedVersion {\n  try {\n    const parsed = parseSemver(version);\n\n    if (!parsed) {\n      return {\n        major: undefined,\n        minor: undefined,\n        patch: undefined,\n        prerelease: undefined,\n      };\n    }\n\n    return {\n      major: parsed.major,\n      minor: parsed.minor,\n      patch: parsed.patch,\n      prerelease: parsed.prerelease.length > 0 ? parsed.prerelease.join(\".\") : undefined,\n    };\n  } catch {\n    return {\n      major: undefined,\n      minor: undefined,\n      patch: undefined,\n      prerelease: undefined,\n    };\n  }\n}\n\n/**\n * Check if the Next.js version requires the instrumentationHook to be set.\n * From Next.js 15.0.0-rc.1 onwards, the instrumentationHook is no longer needed\n * and Next.js will warn if it's set.\n *\n * @param version - The Next.js version string\n * @returns true if instrumentationHook should be set, false otherwise\n */\nexport function shouldSetInstrumentationHook(version: string | undefined): boolean {\n  if (!version) {\n    // If we can't detect the version, err on the side of setting it\n    // (better to have a warning than broken instrumentation)\n    return true;\n  }\n\n  const { major, minor, patch, prerelease } = parseVersion(version);\n\n  // Unable to parse version\n  if (major === undefined || minor === undefined || patch === undefined) {\n    return true;\n  }\n\n  // Next.js 16+ definitely doesn't need it\n  if (major >= 16) {\n    return false;\n  }\n\n  // Next.js 14 and below need it\n  if (major < 15) {\n    return true;\n  }\n\n  // Next.js 15.x.x - check specific versions\n  if (major === 15) {\n    // 15.0.0 stable and higher don't need it\n    if (minor > 0 || patch > 0) {\n      return false;\n    }\n\n    // Check if it's 15.0.0 with no prerelease (stable)\n    if (minor === 0 && patch === 0 && prerelease === undefined) {\n      return false;\n    }\n\n    // Check for RC versions (rc.1 and higher don't need it)\n    if (prerelease?.startsWith(\"rc.\")) {\n      const rcNumber = parseInt(prerelease.split(\".\")[1] || \"0\", 10);\n      if (rcNumber >= 1) {\n        return false;\n      }\n    }\n\n    // Check for canary versions (canary.124 and higher don't need it)\n    if (prerelease?.startsWith(\"canary.\")) {\n      const canaryNumber = parseInt(prerelease.split(\".\")[1] || \"0\", 10);\n      if (canaryNumber >= 124) {\n        return false;\n      }\n    }\n\n    // All other 15.0.0 prereleases need it\n    return true;\n  }\n\n  // Default to true for safety\n  return true;\n}\n\n/**\n * Log a message if debug mode is enabled.\n *\n * @param debug - Whether debug mode is enabled\n * @param message - The message to log\n */\nexport function debugLog(debug: boolean, message: string): void {\n  if (debug) {\n    // eslint-disable-next-line no-console\n    console.log(`[Tusk Drift] ${message}`);\n  }\n}\n\n/**\n * Log a warning message if warnings are not suppressed.\n *\n * @param suppress - Whether to suppress the warning\n * @param message - The warning message to log\n */\nexport function warn(suppress: boolean, message: string): void {\n  if (!suppress) {\n    // eslint-disable-next-line no-console\n    console.warn(`[Tusk Drift] ${message}`);\n  }\n}\n","import type { NextConfig } from \"next\";\nimport type { TuskDriftNextOptions } from \"./types\";\nimport { getNextjsVersion, shouldSetInstrumentationHook, debugLog, warn } from \"./utils\";\n\n/**\n * Wraps your Next.js configuration with Tusk Drift instrumentation setup.\n *\n * This function automatically configures Next.js to work with Tusk Drift by:\n * - Enabling the Next.js instrumentation hook (for Next.js < 15.0.0-rc.1)\n * - Configuring webpack externals to prevent bundling of core instrumentation packages\n * - Preserving your existing Next.js configuration and webpack customizations\n *\n * @param nextConfig - Your existing Next.js configuration object (optional)\n * @param options - Additional options to configure Tusk Drift's behavior (optional)\n * @returns The wrapped Next.js configuration with Tusk Drift instrumentation enabled\n *\n * @example\n * Basic usage:\n * ```javascript\n * // next.config.js\n * const { withTuskDrift } = require('@use-tusk/drift-node-sdk');\n *\n * module.exports = withTuskDrift({\n *   // Your Next.js config\n * });\n * ```\n *\n * @example\n * With debug logging:\n * ```javascript\n * // next.config.js\n * const { withTuskDrift } = require('@use-tusk/drift-node-sdk');\n *\n * module.exports = withTuskDrift(\n *   {\n *     // Your Next.js config\n *   },\n *   {\n *     debug: true,\n *   }\n * );\n * ```\n *\n * @remarks\n * The following webpack externals are added for server-side builds:\n * - `require-in-the-middle` - Required for CommonJS module interception\n * - `jsonpath` - Required for schema manipulation\n */\nexport function withTuskDrift(\n  nextConfig: NextConfig = {},\n  options: TuskDriftNextOptions = {},\n): NextConfig {\n  const config = nextConfig;\n\n  const debug = options.debug || false;\n  const suppressAllWarnings = options.suppressWarnings || false;\n\n  // Detect Next.js version\n  const nextjsVersion = getNextjsVersion();\n\n  if (nextjsVersion) {\n    debugLog(debug, `Detected Next.js version: ${nextjsVersion}`);\n  } else {\n    warn(\n      suppressAllWarnings || false,\n      \"Could not detect Next.js version. Some features may not work correctly. \" +\n        \"If you encounter issues, please ensure Next.js is properly installed.\",\n    );\n  }\n\n  // Determine if we should set instrumentationHook\n  const needsInstrumentationHook =\n    !options.disableInstrumentationHook && shouldSetInstrumentationHook(nextjsVersion);\n\n  const wrappedConfig: NextConfig = {\n    ...config,\n    ...(needsInstrumentationHook\n      ? {\n          experimental: {\n            ...config.experimental,\n            instrumentationHook: true,\n          } as any, // Type assertion for experimental features\n        }\n      : {\n          experimental: config.experimental,\n        }),\n    webpack: (webpackConfig: any, webpackOptions: any) => {\n      if (webpackOptions.isServer) {\n        // Safely handle different externals formats (array, function, object, or undefined)\n        const originalExternals = webpackConfig.externals;\n\n        // Core packages that must be external for instrumentation\n        const coreExternals = [\"require-in-the-middle\", \"jsonpath\"];\n\n        // Create externals mapping - since SDK's node_modules aren't published,\n        // we rely on these packages being available in the consumer's node_modules\n        const externalsMapping: Record<string, string> = {};\n        for (const pkg of coreExternals) {\n          externalsMapping[pkg] = `commonjs ${pkg}`;\n          debugLog(debug, `Mapped external ${pkg} -> commonjs ${pkg}`);\n        }\n\n        // Add our externals mapping\n        if (!originalExternals) {\n          webpackConfig.externals = [externalsMapping];\n          debugLog(debug, \"Created new externals with SDK paths\");\n        } else if (Array.isArray(originalExternals)) {\n          originalExternals.push(externalsMapping);\n          debugLog(debug, \"Added SDK paths to existing externals array\");\n        } else {\n          webpackConfig.externals = [originalExternals, externalsMapping];\n          debugLog(debug, \"Wrapped existing externals with SDK paths\");\n        }\n      }\n\n      // Call user's webpack function if they provided one\n      if (typeof config.webpack === \"function\") {\n        return config.webpack(webpackConfig, webpackOptions);\n      }\n\n      return webpackConfig;\n    },\n  };\n\n  if (needsInstrumentationHook) {\n    debugLog(debug, \"Set experimental.instrumentationHook to true\");\n  } else {\n    debugLog(\n      debug,\n      \"Skipped setting experimental.instrumentationHook (not needed for Next.js 15.0.0-rc.1+)\",\n    );\n  }\n\n  // Warn if user explicitly disabled instrumentationHook but we need it\n  if (\n    options.disableInstrumentationHook &&\n    nextjsVersion &&\n    shouldSetInstrumentationHook(nextjsVersion)\n  ) {\n    warn(\n      suppressAllWarnings || false,\n      \"You disabled instrumentationHook, but your Next.js version requires it. \" +\n        \"Tusk Drift may not initialize properly. Please remove the disableInstrumentationHook option.\",\n    );\n  }\n\n  return wrappedConfig;\n}\n","export interface TdInstrumentationConfig {\n  enabled?: boolean;\n  [key: string]: any;\n}\n\nexport abstract class TdInstrumentationAbstract {\n  protected _config: TdInstrumentationConfig;\n  protected instrumentationName: string;\n\n  constructor(instrumentationName: string, config: TdInstrumentationConfig = {}) {\n    this.instrumentationName = instrumentationName;\n    this._config = {\n      enabled: false,\n      ...config,\n    };\n  }\n\n  getConfig(): TdInstrumentationConfig {\n    return this._config;\n  }\n\n  setConfig(config: TdInstrumentationConfig = {}): void {\n    this._config = { ...config };\n  }\n\n  get name(): string {\n    return this.instrumentationName;\n  }\n\n  abstract enable(): void;\n  abstract isEnabled(): boolean;\n}\n","/**\n * Shared data normalization utilities to ensure consistent data processing\n * between recording (span export) and replay (mock request) modes.\n *\n * This utility addresses the issue where recording uses JSON.stringify() which omits\n * undefined values, while replay sends raw objects with undefined values that get\n * converted to explicit null fields in protobuf.\n */\n\n/**\n * Safe JSON stringify that handles circular references\n */\nfunction safeJsonStringify(obj: any): string {\n  const seen = new WeakSet();\n  return JSON.stringify(obj, (key, value) => {\n    if (typeof value === \"object\" && value !== null) {\n      if (seen.has(value)) {\n        return \"[Circular]\";\n      }\n      seen.add(value);\n    }\n    return value;\n  });\n}\n\n/**\n * Normalizes input data for consistent processing across recording and replay.\n * This ensures the same data structure is used in both modes by:\n * 1. Filtering out undefined values (like JSON.stringify does)\n * 2. Providing a consistent object structure for hashing\n * 3. Handling circular references safely\n */\nexport function normalizeInputData<T extends Record<string, any>>(inputData: T): T {\n  // Use safe JSON.stringify round-trip to match recording behavior\n  // This removes undefined values, normalizes the data structure, and handles circular references\n  return JSON.parse(safeJsonStringify(inputData)) as T;\n}\n\n/**\n * Creates a normalized input value for span attributes during recording.\n * This should be used instead of direct JSON.stringify to ensure consistency.\n */\nexport function createSpanInputValue(inputData: Record<string, any>): string {\n  const normalized = normalizeInputData(inputData);\n  return safeJsonStringify(normalized);\n}\n\n/**\n * Creates a normalized input value for mock requests during replay.\n * This ensures the same normalization is applied as during recording.\n */\nexport function createMockInputValue<T extends Record<string, any>>(inputData: T): T {\n  return normalizeInputData(inputData);\n}\n","export function shouldSample({\n  samplingRate,\n  isAppReady,\n}: {\n  samplingRate: number;\n  isAppReady: boolean;\n}): boolean {\n  const random = Math.random();\n  if (!isAppReady) {\n    // We should still record if app is not ready\n    return true;\n  }\n  return random < samplingRate;\n}\n","import { Value, Struct } from \"@use-tusk/drift-schemas/google/protobuf/struct\";\nimport { SpanKind as OtSpanKind } from \"@opentelemetry/api\";\nimport { SpanKind as PbSpanKind } from \"@use-tusk/drift-schemas/core/span\";\n\nexport const toStruct = (obj: unknown | undefined) => (obj ? objectToProtobufStruct(obj) : undefined);\n\n// Map OpenTelemetry SpanKind -> protobuf SpanKind\nexport const mapOtToPb = (k: OtSpanKind): PbSpanKind => {\n  switch (k) {\n    case OtSpanKind.INTERNAL:\n      return PbSpanKind.INTERNAL;\n    case OtSpanKind.SERVER:\n      return PbSpanKind.SERVER;\n    case OtSpanKind.CLIENT:\n      return PbSpanKind.CLIENT;\n    case OtSpanKind.PRODUCER:\n      return PbSpanKind.PRODUCER;\n    case OtSpanKind.CONSUMER:\n      return PbSpanKind.CONSUMER;\n    default:\n      return PbSpanKind.UNSPECIFIED;\n  }\n};\n\n/**\n * Converts a JavaScript object to protobuf Struct format\n */\nexport function objectToProtobufStruct(obj: unknown): Struct {\n  const fields: Record<string, Value> = {};\n\n  for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n    fields[key] = valueToProtobufValue(value);\n  }\n\n  return Struct.create({ fields });\n}\n\n/**\n * Converts a JavaScript value to protobuf Value format\n */\nexport function valueToProtobufValue(value: unknown): Value {\n  if (value === null || value === undefined) {\n    return Value.create({ kind: { oneofKind: \"nullValue\", nullValue: 0 } });\n  }\n\n  if (typeof value === \"boolean\") {\n    return Value.create({ kind: { oneofKind: \"boolValue\", boolValue: value } });\n  }\n\n  if (typeof value === \"number\") {\n    return Value.create({ kind: { oneofKind: \"numberValue\", numberValue: value } });\n  }\n\n  if (typeof value === \"string\") {\n    return Value.create({ kind: { oneofKind: \"stringValue\", stringValue: value } });\n  }\n\n  if (Array.isArray(value)) {\n    const listValue = {\n      values: value.map((item) => valueToProtobufValue(item)),\n    };\n    return Value.create({ kind: { oneofKind: \"listValue\", listValue } });\n  }\n\n  if (typeof value === \"object\" && value !== null) {\n    const structValue = objectToProtobufStruct(value);\n    return Value.create({ kind: { oneofKind: \"structValue\", structValue } });\n  }\n\n  // Fallback to string representation for other types\n  return Value.create({ kind: { oneofKind: \"stringValue\", stringValue: String(value) } });\n}\n","/**\n * Utility to access original global functions before they are instrumented.\n * This should be imported early in the application lifecycle to capture\n * the original references before any instrumentation occurs.\n *\n * NOTE: this only works for global functions, not for module imports.\n */\n\nconst OriginalDate = globalThis.Date;\nconst OriginalProcessEnv = process.env;\n\nexport class OriginalGlobalUtils {\n  /**\n   * Get the original Date constructor, unaffected by instrumentation\n   */\n  static getOriginalDate(): Date {\n    return new OriginalDate();\n  }\n\n  /**\n   * Get a specific environment variable using the original process.env\n   */\n  static getOriginalProcessEnvVar(key: string): string | undefined {\n    return OriginalProcessEnv[key];\n  }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport yaml from \"js-yaml\";\nimport { logger } from \"./logger\";\nimport { TransformConfigs } from \"src/instrumentation/libraries/types\";\n\nexport interface TuskConfig {\n  service?: {\n    id?: string;\n    name?: string;\n    port?: number;\n    start?: {\n      command?: string;\n    };\n    readiness_check?: {\n      command?: string;\n      timeout?: string;\n      interval?: string;\n    };\n  };\n  traces?: {\n    dir?: string;\n  };\n  tusk_api?: {\n    url?: string;\n  };\n  test_execution?: {\n    concurrency?: number;\n    timeout?: string;\n  };\n  comparison?: {\n    ignore_fields?: string[];\n  };\n  recording?: {\n    sampling_rate?: number;\n    export_spans?: boolean;\n    enable_env_var_recording?: boolean;\n    enable_analytics?: boolean;\n    exclude_paths?: string[];\n  };\n  transforms?: TransformConfigs;\n}\n\n/**\n * Find project root by traversing up from the current working directory\n * or from the SDK's installation location in node_modules\n */\nfunction findProjectRoot(): string | null {\n  let currentDir = process.cwd();\n\n  // If we're running from node_modules, traverse up to find the project root\n  if (currentDir.includes(\"node_modules\")) {\n    // Find the node_modules directory and go up one level\n    const nodeModulesIndex = currentDir.indexOf(\"node_modules\");\n    if (nodeModulesIndex !== -1) {\n      currentDir = currentDir.substring(0, nodeModulesIndex);\n    }\n  }\n\n  // Traverse up to find package.json (indicating project root)\n  while (currentDir !== path.dirname(currentDir)) {\n    const packageJsonPath = path.join(currentDir, \"package.json\");\n    if (fs.existsSync(packageJsonPath)) {\n      return currentDir;\n    }\n    currentDir = path.dirname(currentDir);\n  }\n\n  return null;\n}\n\n/**\n * Load the Tusk config from .tusk/config.yaml in the customer's project\n * Returns the raw config object without strict typing to allow future extensions\n */\nexport function loadTuskConfig(): TuskConfig | null {\n  try {\n    const projectRoot = findProjectRoot();\n    if (!projectRoot) {\n      logger.error(\"Could not find project root. Config loading skipped.\");\n      return null;\n    }\n\n    const configPath = path.join(projectRoot, \".tusk\", \"config.yaml\");\n\n    if (!fs.existsSync(configPath)) {\n      logger.error(`No config file found at ${configPath}`);\n      return null;\n    }\n\n    logger.debug(`Loading config from ${configPath}`);\n\n    const configContent = fs.readFileSync(configPath, \"utf8\");\n    const config = yaml.load(configContent) as TuskConfig;\n\n    logger.debug(`Successfully loaded config for service: ${config.service?.name || \"unknown\"}`);\n    return config;\n  } catch (error) {\n    logger.error(\"Error loading config:\", error);\n    return null;\n  }\n}\n","export function isNextJsRuntime(): boolean {\n  return (\n    process.env.NEXT_RUNTIME !== undefined || typeof (global as any).__NEXT_DATA__ !== \"undefined\"\n  );\n}\n\nexport function isEsm(moduleExports: any): boolean {\n  // Guard against null, undefined, and non-object values\n  if (!moduleExports || typeof moduleExports !== \"object\") {\n    return false;\n  }\n\n  try {\n    // Check if Symbol.toStringTag exists and equals \"Module\"\n    // This is the standard way ESM modules identify themselves\n    return moduleExports[Symbol.toStringTag] === \"Module\";\n  } catch (error) {\n    // If accessing the symbol throws an error (unlikely but possible with Proxies),\n    // safely return false\n    return false;\n  }\n}\n","import { OriginalGlobalUtils } from \"./\";\n\nexport type LogLevel = \"silent\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\ninterface LoggerConfig {\n  logLevel: LogLevel;\n  prefix?: string;\n}\n\nclass Logger {\n  private config: LoggerConfig;\n  private readonly levels = {\n    silent: 0,\n    error: 1,\n    warn: 2,\n    info: 3,\n    debug: 4,\n  };\n\n  constructor(config: LoggerConfig) {\n    this.config = config;\n  }\n\n  private shouldLog(level: LogLevel): boolean {\n    return this.levels[level] <= this.levels[this.config.logLevel];\n  }\n\n  private formatMessage(level: LogLevel, message: string): string {\n    const currentData = OriginalGlobalUtils.getOriginalDate();\n    const timestamp = currentData instanceof Date ? currentData.toISOString() : currentData;\n    // const timestamp = new Date().toISOString();\n    const prefix = this.config.prefix ? `[${this.config.prefix}] ` : \"[TuskDrift] \";\n    return `${timestamp} ${prefix}${message}`;\n  }\n\n  error(message: string, ...args: unknown[]): void {\n    if (this.shouldLog(\"error\")) {\n      console.error(this.formatMessage(\"error\", message), ...args);\n    }\n  }\n\n  warn(message: string, ...args: unknown[]): void {\n    if (this.shouldLog(\"warn\")) {\n      console.warn(this.formatMessage(\"warn\", message), ...args);\n    }\n  }\n\n  info(message: string, ...args: unknown[]): void {\n    if (this.shouldLog(\"info\")) {\n      console.log(this.formatMessage(\"info\", message), ...args);\n    }\n  }\n\n  debug(message: string, ...args: unknown[]): void {\n    if (this.shouldLog(\"debug\")) {\n      console.log(this.formatMessage(\"debug\", message), ...args);\n    }\n  }\n\n  setLogLevel(level: LogLevel): void {\n    this.config.logLevel = level;\n  }\n\n  getLogLevel(): LogLevel {\n    return this.config.logLevel;\n  }\n}\n\n// Global logger instance\nlet globalLogger: Logger;\n\nexport function createLogger(config: LoggerConfig): Logger {\n  return new Logger(config);\n}\n\nexport function initializeGlobalLogger(config: LoggerConfig): void {\n  globalLogger = createLogger(config);\n}\n\nexport function getLogger(): Logger {\n  if (!globalLogger) {\n    // Default to warn level if not initialized\n    globalLogger = createLogger({ logLevel: \"warn\" });\n  }\n  return globalLogger;\n}\n\n/**\n * - LogLevel = \"silent\"\n *   - No logs are emitted\n * - LogLevel = \"error\"\n *   - Logs errors\n * - LogLevel = \"warn\"\n *   - Logs warnings and errors\n * - LogLevel = \"info\"\n *   - Logs info, warnings, and errors\n * - LogLevel = \"debug\"\n *   - Logs debug, info, warnings, and errors\n */\nexport const logger = {\n  error: (message: string, ...args: unknown[]) => getLogger().error(message, ...args),\n  warn: (message: string, ...args: unknown[]) => getLogger().warn(message, ...args),\n  info: (message: string, ...args: unknown[]) => getLogger().info(message, ...args),\n  debug: (message: string, ...args: unknown[]) => getLogger().debug(message, ...args),\n  setLogLevel: (level: LogLevel) => getLogger().setLogLevel(level),\n  getLogLevel: () => getLogger().getLogLevel(),\n};\n","import { TuskDriftCore, TuskDriftMode } from \"../TuskDrift\";\nimport { SDK_VERSION } from \"../../version\";\nimport { logger } from \"../utils/logger\";\n\n/**\n * Send version mismatch alert to CLI (only in REPLAY mode)\n */\nexport function sendVersionMismatchAlert({\n  moduleName,\n  foundVersion,\n  supportedVersions,\n}: {\n  moduleName: string;\n  foundVersion: string | undefined;\n  supportedVersions: string[];\n}): void {\n  logger.info(\"Sending version mismatch alert\", {\n    moduleName,\n    foundVersion: foundVersion,\n    supportedVersions,\n  });\n  try {\n    // Only send in replay mode\n    const mode = TuskDriftCore.getInstance().getMode();\n    if (mode !== TuskDriftMode.REPLAY) {\n      return;\n    }\n\n    const protobufComm = TuskDriftCore.getInstance().getProtobufCommunicator();\n    if (protobufComm) {\n      protobufComm.sendInstrumentationVersionMismatchAlert({\n        moduleName,\n        requestedVersion: foundVersion,\n        supportedVersions,\n      });\n    }\n  } catch (e) {\n    logger.error(\"Error sending version mismatch alert:\", e);\n  }\n}\n\n/**\n * Send unpatched dependency alert to CLI\n */\nexport function sendUnpatchedDependencyAlert({\n  traceTestServerSpanId,\n  stackTrace,\n}: {\n  traceTestServerSpanId: string;\n  stackTrace?: string;\n}): void {\n  logger.info(\"Sending unpatched dependency alert\", {\n    traceTestServerSpanId,\n    stackTrace,\n  });\n  try {\n    const protobufComm = TuskDriftCore.getInstance().getProtobufCommunicator();\n    if (protobufComm && stackTrace) {\n      protobufComm.sendUnpatchedDependencyAlert({\n        stackTrace,\n        traceTestServerSpanId,\n      });\n    }\n  } catch (e) {\n    logger.error(\"Error sending unpatched dependency alert:\", e);\n  }\n}\n","import path from \"path\";\nimport { satisfies } from \"semver\";\nimport { TdInstrumentationAbstract, TdInstrumentationConfig } from \"./TdInstrumentationAbstract\";\nimport { TdInstrumentationNodeModule } from \"./TdInstrumentationNodeModule\";\nimport { Hook as HookRequire, HookOptions } from \"require-in-the-middle\";\nimport { Hook as HookImport } from \"import-in-the-middle\";\nimport type { HookFn } from \"import-in-the-middle\";\nimport { sendVersionMismatchAlert } from \"../../../core/analytics\";\nimport { logger } from \"../../../core/utils/logger\";\n\nexport abstract class TdInstrumentationBase extends TdInstrumentationAbstract {\n  protected _modules: TdInstrumentationNodeModule[] = [];\n  protected _hooks: (HookRequire | HookImport)[] = [];\n  protected _enabled = false;\n  // WeakSet to track patched modules (needed for ESM where we can't add properties to module exports)\n  private static _patchedModules = new WeakSet<object>();\n\n  constructor(instrumentationName: string, config: TdInstrumentationConfig = {}) {\n    super(instrumentationName, config);\n\n    let modules = this.init();\n    if (modules && !Array.isArray(modules)) {\n      modules = [modules];\n    }\n    this._modules = modules || [];\n\n    if (this._config.enabled) {\n      this.enable();\n    }\n  }\n\n  abstract init(): TdInstrumentationNodeModule | TdInstrumentationNodeModule[] | void;\n\n  /**\n   * Check if the provided version matches any of the supported versions\n   * @param supportedVersions - Array of version patterns (e.g. [\"^1.0.0\", \"2.x\"])\n   * @param version - The actual version to check (e.g. \"1.2.3\")\n   * @param includePrerelease - Whether to include prerelease versions\n   * @returns true if version is supported, false otherwise\n   */\n  isSupported(supportedVersions: string[], version?: string, includePrerelease = false): boolean {\n    if (typeof version === \"undefined\") {\n      return supportedVersions.includes(\"*\");\n    }\n    if (version === \"any\") {\n      return true;\n    }\n    return supportedVersions.some((supportedVersion) =>\n      satisfies(version, supportedVersion, {\n        includePrerelease,\n      }),\n    );\n  }\n\n  /**\n   * Extract package version from package.json in the given base directory\n   * @param baseDir - Base directory containing package.json\n   * @returns Version string or undefined if not found\n   */\n  private _extractPackageVersion(baseDir?: string): string | undefined {\n    if (!baseDir) {\n      return undefined;\n    }\n    try {\n      const packagePath = path.join(baseDir, \"package.json\");\n      const { version } = require(packagePath);\n      return typeof version === \"string\" ? version : undefined;\n    } catch (error) {\n      logger.warn(`Failed extracting version from ${baseDir}:`, error);\n    }\n    return undefined;\n  }\n\n  enable(): void {\n    if (this._enabled) {\n      return;\n    }\n    this._enabled = true;\n\n    // Set up hooks for each module (both CJS and ESM)\n    for (const module of this._modules) {\n      // CommonJS hook callback\n      const onRequire = (exports: any, name: string, baseDir?: string) => {\n        return this._onRequire(module, exports, name, baseDir);\n      };\n\n      // ESM hook callback\n      const hookFn: HookFn = (exports, name, baseDir) => {\n        // Handle absolute paths for ESM\n        if (!baseDir && path.isAbsolute(name)) {\n          const parsedPath = path.parse(name);\n          name = parsedPath.name;\n          baseDir = parsedPath.dir;\n        }\n        return this._onRequire(module, exports, name, baseDir || undefined);\n      };\n\n      const cjsHook = new HookRequire([module.name], { internals: true }, onRequire);\n      this._hooks.push(cjsHook);\n\n      // Register ESM hook (import-in-the-middle)\n      const esmHook = new HookImport([module.name], { internals: false }, hookFn);\n      this._hooks.push(esmHook);\n    }\n  }\n\n  isEnabled(): boolean {\n    return this._enabled;\n  }\n\n  /**\n   * Mark a module as patched.\n   */\n  protected markModuleAsPatched(moduleExports: any): void {\n    TdInstrumentationBase._patchedModules.add(moduleExports);\n  }\n\n  /**\n   * Check if a module has already been patched.\n   */\n  protected isModulePatched(moduleExports: any): boolean {\n    return TdInstrumentationBase._patchedModules.has(moduleExports);\n  }\n\n  private _onRequire(\n    module: TdInstrumentationNodeModule,\n    exports: any,\n    name: string,\n    baseDir?: string,\n  ): any {\n    // baseDir set by require-in-the-middle\n    if (!baseDir) {\n      if (typeof module.patch === \"function\") {\n        module.moduleExports = exports;\n        if (this._enabled) {\n          logger.debug(`Patching module ${name} (no version info available)`);\n          return module.patch(exports);\n        }\n      }\n      return exports;\n    }\n\n    const version = this._extractPackageVersion(baseDir);\n    module.moduleVersion = version;\n\n    if (module.name === name) {\n      if (\n        this.isSupported(module.supportedVersions, version) &&\n        typeof module.patch === \"function\"\n      ) {\n        module.moduleExports = exports;\n        if (this._enabled) {\n          logger.debug(\n            `Patching main module ${name} v${version} for instrumentation ${this.instrumentationName}`,\n          );\n          return module.patch(exports, module.moduleVersion);\n        }\n      } else if (version) {\n        // Check if ANY module for this package name supports this version before logging/alerting\n        const isVersionSupportedByAnyModule = this._modules\n          .filter((m) => m.name === name)\n          .some((m) => this.isSupported(m.supportedVersions, version));\n\n        if (!isVersionSupportedByAnyModule) {\n          logger.error(\n            `Version mismatch for module ${name}: found v${version}, supported versions: [${module.supportedVersions.join(\", \")}]. Please contact support@usetusk.ai to add support for this version.`,\n          );\n          sendVersionMismatchAlert({\n            moduleName: name,\n            foundVersion: version,\n            supportedVersions: module.supportedVersions,\n          });\n        }\n      } else {\n        logger.error(\n          `No version found for module ${name}, supported versions: [${module.supportedVersions.join(\", \")}]. Please contact support@usetusk.ai to add support for this version.`,\n        );\n        sendVersionMismatchAlert({\n          moduleName: name,\n          foundVersion: undefined,\n          supportedVersions: module.supportedVersions,\n        });\n      }\n      return exports;\n    }\n\n    // Handle file-level patching\n    const files = module.files ?? [];\n    const normalizedName = path.normalize(name);\n    const supportedFileInstrumentations = files\n      .filter((f) => f.name === normalizedName)\n      .filter((f) => this.isSupported(f.supportedVersions, version, false));\n\n    // Only log file version mismatch if NO module supports this file for this version\n    if (\n      supportedFileInstrumentations.length === 0 &&\n      files.some((f) => f.name === normalizedName)\n    ) {\n      // Check if ANY module in this instrumentation has a file that supports this version\n      const isFileSupportedByAnyModule = this._modules\n        .flatMap((m) => m.files || [])\n        .filter((f) => f.name === normalizedName)\n        .some((f) => this.isSupported(f.supportedVersions, version, false));\n\n      if (!isFileSupportedByAnyModule) {\n        logger.error(\n          `Version mismatch for file ${normalizedName}: found v${version}, no compatible file instrumentation found. Please contact support@usetusk.ai to add support for this version.`,\n        );\n        sendVersionMismatchAlert({\n          moduleName: normalizedName,\n          foundVersion: version,\n          supportedVersions: files.flatMap((f) => f.supportedVersions),\n        });\n      }\n    }\n\n    return supportedFileInstrumentations.reduce((patchedExports, file) => {\n      file.moduleExports = patchedExports;\n      if (this._enabled) {\n        logger.debug(\n          `Patching file ${file.name} v${version} for instrumentation ${this.instrumentationName}`,\n        );\n        return file.patch(patchedExports, module.moduleVersion);\n      }\n      return patchedExports;\n    }, exports);\n  }\n}\n","import { TdInstrumentationNodeModuleFile, PatchFunction } from \"./TdInstrumentationNodeModuleFile\";\n\nexport class TdInstrumentationNodeModule {\n  name: string;\n  supportedVersions: string[];\n  patch?: PatchFunction;\n  files: TdInstrumentationNodeModuleFile[];\n  moduleExports?: any;\n  moduleVersion?: string;\n\n  constructor({\n    name,\n    supportedVersions,\n    patch,\n    files,\n  }: {\n    name: string;\n    supportedVersions: string[];\n    patch?: PatchFunction;\n    files?: TdInstrumentationNodeModuleFile[];\n  }) {\n    this.name = name;\n    this.supportedVersions = supportedVersions;\n    this.patch = patch;\n    this.files = files ?? [];\n  }\n}\n","import { createContextKey } from \"@opentelemetry/api\";\nimport { StatusCode, PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { SpanKind } from \"@opentelemetry/api\";\nimport type { JsonSchema } from \"@use-tusk/drift-schemas/core/json_schema\";\n\nexport const TD_INSTRUMENTATION_LIBRARY_NAME = \"tusk-drift-sdk\";\n\nexport const REPLAY_TRACE_ID_CONTEXT_KEY = createContextKey(\"td.replayTraceId\");\nexport const SPAN_KIND_CONTEXT_KEY = createContextKey(\"td.spanKind\");\nexport const IS_PRE_APP_START_CONTEXT_KEY = createContextKey(\"td.isPreAppStart\");\nexport const STOP_RECORDING_CHILD_SPANS_CONTEXT_KEY = createContextKey(\n  \"td.stopRecordingChildSpans\",\n);\nexport const CALLING_LIBRARY_CONTEXT_KEY = createContextKey(\"td.callingLibrary\");\n\nexport enum TdSpanAttributes {\n  /**\n   * Presentational information:\n   *   - packageType: is the langauge agnostic type that will be used to classify the package\n   *   - name: is the visual name of the span (e.g. for http could be \"/api/users\", for graphql could be \"update UpdateUser\")\n   *\n   * - packageName: is the name of the package that is instrumented and can be specific to a language\n   * - instrumentationName: is the name of the instrumentation class\n   * - submoduleName: is the name of the submodule that is instrumented (e.g. \"GET\", \"query\", \"execute\", \"get\", etc.)\n   *\n   * Example 1: fetch package\n   *\n   * name: \"/api/users\"\n   * packageType: HTTP\n   * packageName: \"fetch\"\n   * instrumentationName: \"FetchInstrumentation\"\n   * submoduleName: \"GET\"\n   *\n   * Example 2: graphql package\n   *\n   * name: \"update UpdateUser\"\n   * packageType: GRAPHQL\n   * packageName: \"http\"\n   * instrumentationName: \"HttpInstrumentation\"\n   * submoduleName: \"execute\"\n   */\n  NAME = \"td.name\",\n  PACKAGE_TYPE = \"td.packageType\",\n  PACKAGE_NAME = \"td.packageName\",\n  INSTRUMENTATION_NAME = \"td.instrumentationName\",\n  SUBMODULE_NAME = \"td.submodule\",\n  IS_PRE_APP_START = \"td.isPreAppStart\",\n\n  INPUT_VALUE = \"td.inputValue\",\n  OUTPUT_VALUE = \"td.outputValue\",\n  INPUT_SCHEMA_MERGES = \"td.inputSchemaMerges\",\n  OUTPUT_SCHEMA_MERGES = \"td.outputSchemaMerges\",\n  METADATA = \"td.metadata\",\n  TRANSFORM_METADATA = \"td.transformMetadata\",\n}\n\nexport type CleanSpanData = {\n  traceId: string;\n  spanId: string;\n  parentSpanId: string;\n  name: string;\n\n  packageName: string;\n  instrumentationName: string;\n  submoduleName: string;\n\n  packageType?: PackageType;\n\n  // Values are kept as plain JSON for readability\n  inputValue: unknown;\n  outputValue: unknown;\n  // Schemas use the proto JsonSchema type\n  inputSchema: JsonSchema;\n  outputSchema?: JsonSchema; // optional bc replay outbound spans don't have output schemas\n\n  inputSchemaHash: string;\n  outputSchemaHash: string;\n  inputValueHash: string;\n  outputValueHash: string;\n\n  kind: SpanKind;\n\n  status: {\n    code: StatusCode;\n    message: string;\n  };\n\n  isPreAppStart: boolean;\n\n  timestamp: { seconds: number; nanos: number };\n  duration: { seconds: number; nanos: number };\n\n  isRootSpan: boolean;\n\n  metadata?: MetadataObject;\n  transformMetadata?: {\n    transformed: boolean;\n    actions: Array<{\n      type: \"redact\" | \"mask\" | \"replace\" | \"drop\";\n      field: string;\n      reason: string;\n      description?: string;\n    }>;\n  };\n  // sdk-specific\n  isUsed?: boolean;\n  stackTrace?: string;\n};\n\nexport type MockRequestData = {\n  traceId: string;\n  spanId: string;\n  name: string;\n  packageName: string;\n  packageType?: PackageType;\n  instrumentationName: string;\n  submoduleName: string;\n  inputValue: unknown;\n  kind: SpanKind;\n  stackTrace?: string;\n};\n\nexport type MetadataObject = {\n  ENV_VARS?: Record<string, unknown>;\n};\n\nexport type OneOf<T extends object> = {\n  [K in keyof T]: Required<Pick<T, K>> & Partial<Record<Exclude<keyof T, K>, null>>;\n}[keyof T];\n","import { logger } from \"../utils/logger\";\nimport { OriginalGlobalUtils } from \"../utils/OriginalGlobalUtils\";\n\n/**\n * Manages blocked trace IDs to prevent creation and export of spans\n * that belong to traces exceeding size limits.\n *\n * This class uses an in-memory Set for O(1) lookup performance and\n * automatically cleans up old entries to prevent memory leaks.\n */\nexport class TraceBlockingManager {\n  private static instance: TraceBlockingManager | null = null;\n  private blockedTraceIds: Set<string> = new Set();\n  private traceTimestamps: Map<string, number> = new Map();\n  private cleanupIntervalId: NodeJS.Timeout | null = null;\n\n  // Default TTL: 10 minutes (traces should complete well before this)\n  private readonly DEFAULT_TTL_MS = 10 * 60 * 1000;\n\n  // Cleanup interval: 2 minutes\n  private readonly CLEANUP_INTERVAL_MS = 2 * 60 * 1000;\n\n  private constructor() {\n    this.startCleanupInterval();\n  }\n\n  /**\n   * Get singleton instance\n   */\n  static getInstance(): TraceBlockingManager {\n    if (!TraceBlockingManager.instance) {\n      TraceBlockingManager.instance = new TraceBlockingManager();\n    }\n    return TraceBlockingManager.instance;\n  }\n\n  /**\n   * Check if a trace ID is blocked\n   */\n  isTraceBlocked(traceId: string): boolean {\n    return this.blockedTraceIds.has(traceId);\n  }\n\n  /**\n   * Block a trace ID and all future spans for this trace\n   */\n  blockTrace(traceId: string): void {\n    if (!this.blockedTraceIds.has(traceId)) {\n      this.blockedTraceIds.add(traceId);\n      const originalDate = OriginalGlobalUtils.getOriginalDate();\n      this.traceTimestamps.set(traceId, originalDate.getTime());\n      logger.debug(`[TraceBlockingManager] Blocked trace: ${traceId}`);\n    }\n  }\n\n  /**\n   * Start periodic cleanup of old blocked trace IDs\n   */\n  private startCleanupInterval(): void {\n    if (this.cleanupIntervalId) {\n      return;\n    }\n\n    this.cleanupIntervalId = setInterval(() => {\n      this.cleanupOldTraces();\n    }, this.CLEANUP_INTERVAL_MS);\n\n    // Don't keep the process alive just for cleanup\n    if (this.cleanupIntervalId.unref) {\n      this.cleanupIntervalId.unref();\n    }\n  }\n\n  /**\n   * Clean up trace IDs older than TTL\n   */\n  private cleanupOldTraces(): void {\n    const originalDate = OriginalGlobalUtils.getOriginalDate();\n    const now = originalDate.getTime();\n    const expiredTraces: string[] = [];\n\n    for (const [traceId, timestamp] of this.traceTimestamps.entries()) {\n      if (now - timestamp > this.DEFAULT_TTL_MS) {\n        expiredTraces.push(traceId);\n      }\n    }\n\n    for (const traceId of expiredTraces) {\n      this.blockedTraceIds.delete(traceId);\n      this.traceTimestamps.delete(traceId);\n    }\n\n    if (expiredTraces.length > 0) {\n      logger.debug(\n        `[TraceBlockingManager] Cleaned up ${expiredTraces.length} expired blocked trace(s)`,\n      );\n    }\n  }\n}\n","import {\n  trace,\n  context,\n  Span,\n  SpanStatusCode,\n  SpanKind,\n  Context,\n  Attributes,\n  SpanStatus,\n} from \"@opentelemetry/api\";\nimport {\n  IS_PRE_APP_START_CONTEXT_KEY,\n  MetadataObject,\n  REPLAY_TRACE_ID_CONTEXT_KEY,\n  SPAN_KIND_CONTEXT_KEY,\n  STOP_RECORDING_CHILD_SPANS_CONTEXT_KEY,\n  TdSpanAttributes,\n} from \"../types\";\nimport { TuskDriftCore, TuskDriftMode } from \"../TuskDrift\";\nimport { createSpanInputValue } from \"../utils/dataNormalizationUtils\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { SchemaMerges } from \"./JsonSchemaHelper\";\nimport { logger } from \"../utils/logger\";\nimport { TraceBlockingManager } from \"./TraceBlockingManager\";\n\nexport interface SpanInfo {\n  traceId: string;\n  spanId: string;\n  span: Span;\n  context: Context;\n  isPreAppStart: boolean;\n}\n\nexport interface CreateSpanOptions {\n  name: string;\n  kind: SpanKind;\n  attributes?: Attributes;\n  parentContext?: Context;\n  isPreAppStart: boolean;\n}\n\nexport interface SpanExecutorOptions {\n  name: string;\n  kind: SpanKind;\n  packageType?: PackageType;\n  packageName: string;\n  instrumentationName: string;\n  submodule: string;\n  inputValue: Record<string, unknown>;\n  isPreAppStart: boolean;\n  inputSchemaMerges?: SchemaMerges;\n  metadata?: MetadataObject;\n  stopRecordingChildSpans?: boolean;\n}\n\nexport interface AddSpanAttributesOptions {\n  name?: string;\n  packageName?: string;\n  instrumentationName?: string;\n  packageType?: PackageType;\n  submodule?: string;\n  isPreAppStart?: boolean;\n  inputValue?: Record<string, unknown>;\n  outputValue?: Record<string, unknown>;\n  inputSchemaMerges?: SchemaMerges;\n  outputSchemaMerges?: SchemaMerges;\n  metadata?: MetadataObject;\n  transformMetadata?: {\n    transformed: boolean;\n    actions: Array<{\n      type: \"redact\" | \"mask\" | \"replace\" | \"drop\";\n      field: string;\n      reason: string;\n      description?: string;\n    }>;\n  };\n}\n\nexport class SpanUtils {\n  /**\n   * Creates a new span and returns span info including trace ID and span ID\n   */\n  static createSpan(options: CreateSpanOptions): SpanInfo | null {\n    try {\n      // Get tracer from the global trace API\n      const tracer = TuskDriftCore.getInstance().getTracer();\n      const parentContext = options.parentContext || context.active();\n\n      // Check if we should block span creation for this trace\n      // This happens when a previous span in this trace exceeded size limits\n      const activeSpan = trace.getSpan(parentContext);\n      if (activeSpan) {\n        const parentTraceId = activeSpan.spanContext().traceId;\n        const traceBlockingManager = TraceBlockingManager.getInstance();\n\n        if (traceBlockingManager.isTraceBlocked(parentTraceId)) {\n          logger.debug(\n            `[SpanUtils] Skipping span creation for '${options.name}' - trace ${parentTraceId} is blocked`,\n          );\n          return null;\n        }\n      }\n\n      // We can add a bunch of attributes to the span here, everything we want to store in tusk drift backend\n      const span = tracer.startSpan(\n        options.name,\n        {\n          kind: options.kind || SpanKind.CLIENT,\n          attributes: options.attributes || {},\n        },\n        parentContext,\n      );\n\n      const spanContext = span.spanContext();\n\n      const newContext = trace\n        .setSpan(parentContext, span)\n        // This will be used by TCP instrumentation to determine if we have unpatched dependencies\n        .setValue(SPAN_KIND_CONTEXT_KEY, options.kind)\n        .setValue(IS_PRE_APP_START_CONTEXT_KEY, options.isPreAppStart);\n\n      return {\n        traceId: spanContext.traceId,\n        spanId: spanContext.spanId,\n        span,\n        context: newContext,\n        isPreAppStart: options.isPreAppStart,\n      };\n    } catch (error) {\n      logger.error(\"SpanUtils error creating span:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Executes a function within a span context\n   */\n  static withSpan<T>(spanInfo: SpanInfo, fn: () => T): T {\n    return context.with(spanInfo.context, fn);\n  }\n\n  /**\n   * Execute a function within a properly configured span\n   *\n   * If there is an error creating the span:\n   * - In record mode, the original function will be called\n   * - In replay mode, an error will be thrown\n   *\n   * @param mode The mode of the TuskDrift instance\n   * @param originalFunctionCall The function to call if the span is not created\n   * @param options Span configuration options\n   * @param fn Function to execute within the span\n   * @param contextTarget Optional target object to inject trace context into (for HTTP/fetch)\n   * @returns The result of the function execution\n   */\n  static createAndExecuteSpan<T>(\n    mode: TuskDriftMode,\n    originalFunctionCall: () => T,\n    options: SpanExecutorOptions,\n    fn: (spanInfo: SpanInfo) => T,\n  ): T {\n    // Check if we should stop recording child spans for this span\n    const spanContext = trace.getActiveSpan()?.spanContext();\n    if (spanContext) {\n      const stopRecordingChildSpans = context\n        .active()\n        .getValue(STOP_RECORDING_CHILD_SPANS_CONTEXT_KEY) as boolean;\n      if (stopRecordingChildSpans) {\n        logger.debug(\n          `[SpanUtils] Stopping recording of child spans for span ${spanContext.spanId}, packageName: ${options.packageName}, instrumentationName: ${options.instrumentationName}`,\n        );\n        return originalFunctionCall();\n      }\n    }\n\n    const {\n      name,\n      kind,\n      packageName,\n      instrumentationName,\n      packageType,\n      submodule,\n      inputValue,\n      inputSchemaMerges,\n      isPreAppStart,\n      metadata,\n      stopRecordingChildSpans,\n    } = options;\n\n    let spanInfo: SpanInfo | null = null;\n\n    try {\n      // Create span with standard attributes\n      spanInfo = SpanUtils.createSpan({\n        name,\n        kind,\n        isPreAppStart: options.isPreAppStart,\n        attributes: {\n          [TdSpanAttributes.NAME]: name,\n          [TdSpanAttributes.PACKAGE_NAME]: packageName,\n          [TdSpanAttributes.SUBMODULE_NAME]: submodule,\n          [TdSpanAttributes.INSTRUMENTATION_NAME]: instrumentationName,\n          [TdSpanAttributes.PACKAGE_TYPE]: packageType,\n          [TdSpanAttributes.INPUT_VALUE]: createSpanInputValue(inputValue),\n          [TdSpanAttributes.IS_PRE_APP_START]: isPreAppStart,\n          ...(inputSchemaMerges && {\n            [TdSpanAttributes.INPUT_SCHEMA_MERGES]: JSON.stringify(inputSchemaMerges),\n          }),\n          ...(metadata && {\n            [TdSpanAttributes.METADATA]: JSON.stringify(metadata),\n          }),\n        },\n      });\n    } catch (error) {\n      logger.error(\"SpanExecutor error creating span:\", error);\n      spanInfo = null;\n    }\n\n    if (!spanInfo) {\n      if (mode === TuskDriftMode.REPLAY) {\n        // Safe to throw error since we're in replay mode\n        throw new Error(\"Error creating span in replay mode\");\n      } else {\n        // Call the original function, don't want SDK errors to propagate to the user\n        return originalFunctionCall();\n      }\n    }\n\n    // Set the stopRecordingChildSpans context value if it is true\n    if (stopRecordingChildSpans) {\n      spanInfo.context = spanInfo.context.setValue(STOP_RECORDING_CHILD_SPANS_CONTEXT_KEY, true);\n    }\n\n    // Execute function within span context\n    return SpanUtils.withSpan(spanInfo, () => fn(spanInfo));\n  }\n\n  /**\n   * Gets the current active span info\n   */\n  static getCurrentSpanInfo(): SpanInfo | null {\n    try {\n      const activeSpan = trace.getActiveSpan();\n      if (!activeSpan) {\n        return null;\n      }\n\n      const spanContext = activeSpan.spanContext();\n      return {\n        traceId: spanContext.traceId,\n        spanId: spanContext.spanId,\n        span: activeSpan,\n        context: context.active(),\n        isPreAppStart: context.active().getValue(IS_PRE_APP_START_CONTEXT_KEY) as boolean,\n      };\n    } catch (error) {\n      logger.error(\"SpanUtils error getting current span info:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Adds attributes to a span\n   */\n  static addSpanAttributes(span: Span, addSpanAttributesOptions: AddSpanAttributesOptions): void {\n    try {\n      const attributes: Attributes = {\n        ...(addSpanAttributesOptions.name && {\n          [TdSpanAttributes.NAME]: addSpanAttributesOptions.name,\n        }),\n        ...(addSpanAttributesOptions.packageName && {\n          [TdSpanAttributes.PACKAGE_NAME]: addSpanAttributesOptions.packageName,\n        }),\n        ...(addSpanAttributesOptions.instrumentationName && {\n          [TdSpanAttributes.INSTRUMENTATION_NAME]: addSpanAttributesOptions.instrumentationName,\n        }),\n        ...(addSpanAttributesOptions.packageType && {\n          [TdSpanAttributes.PACKAGE_TYPE]: addSpanAttributesOptions.packageType,\n        }),\n        ...(addSpanAttributesOptions.submodule && {\n          [TdSpanAttributes.SUBMODULE_NAME]: addSpanAttributesOptions.submodule,\n        }),\n        ...(addSpanAttributesOptions.isPreAppStart && {\n          [TdSpanAttributes.IS_PRE_APP_START]: addSpanAttributesOptions.isPreAppStart,\n        }),\n        ...(addSpanAttributesOptions.inputValue && {\n          [TdSpanAttributes.INPUT_VALUE]: createSpanInputValue(addSpanAttributesOptions.inputValue),\n        }),\n        ...(addSpanAttributesOptions.outputValue && {\n          [TdSpanAttributes.OUTPUT_VALUE]: JSON.stringify(addSpanAttributesOptions.outputValue),\n        }),\n        ...(addSpanAttributesOptions.inputSchemaMerges && {\n          [TdSpanAttributes.INPUT_SCHEMA_MERGES]: JSON.stringify(\n            addSpanAttributesOptions.inputSchemaMerges,\n          ),\n        }),\n        ...(addSpanAttributesOptions.outputSchemaMerges && {\n          [TdSpanAttributes.OUTPUT_SCHEMA_MERGES]: JSON.stringify(\n            addSpanAttributesOptions.outputSchemaMerges,\n          ),\n        }),\n        ...(addSpanAttributesOptions.metadata && {\n          [TdSpanAttributes.METADATA]: JSON.stringify(addSpanAttributesOptions.metadata),\n        }),\n        ...(addSpanAttributesOptions.transformMetadata && {\n          [TdSpanAttributes.TRANSFORM_METADATA]: JSON.stringify(\n            addSpanAttributesOptions.transformMetadata,\n          ),\n        }),\n      };\n      span.setAttributes(attributes);\n    } catch (error) {\n      logger.error(\"SpanUtils error adding span attributes:\", error);\n    }\n  }\n\n  static setStatus(span: Span, status: SpanStatus): void {\n    try {\n      span.setStatus(status);\n    } catch (error) {\n      logger.error(\"SpanUtils error setting span status:\", error);\n    }\n  }\n\n  /**\n   * Sets span status and ends the span\n   *\n   * Spans are only exported once span.end() is called\n   */\n  static endSpan(span: Span, status?: { code: SpanStatusCode; message?: string }): void {\n    try {\n      if (status) {\n        span.setStatus(status);\n      }\n      span.end();\n    } catch (error) {\n      logger.error(\"SpanUtils error ending span:\", error);\n    }\n  }\n\n  /**\n   * Extracts trace ID from current context\n   */\n  static getCurrentTraceId(): string | null {\n    try {\n      const spanInfo = SpanUtils.getCurrentSpanInfo();\n      return spanInfo?.traceId || null;\n    } catch (error) {\n      logger.error(\"SpanUtils error getting current trace id:\", error);\n      return null;\n    }\n  }\n\n  static setCurrentReplayTraceId(replayTraceId: string): Context | null {\n    try {\n      return context.active().setValue(REPLAY_TRACE_ID_CONTEXT_KEY, replayTraceId);\n    } catch (error) {\n      logger.error(\"SpanUtils error setting current replay trace id:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets the current replay trace ID from the context\n   */\n  static getCurrentReplayTraceId(): string | null {\n    try {\n      const activeContext = context.active();\n      return activeContext.getValue(REPLAY_TRACE_ID_CONTEXT_KEY) as string | null;\n    } catch (error) {\n      logger.error(\"SpanUtils error getting current replay trace id:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Extracts span ID from current context\n   */\n  static getCurrentSpanId(): string | null {\n    try {\n      const spanInfo = SpanUtils.getCurrentSpanInfo();\n      return spanInfo?.spanId || null;\n    } catch (error) {\n      logger.error(\"SpanUtils error getting current span id:\", error);\n      return null;\n    }\n  }\n\n  /**\n   * Gets trace and span IDs as a combined string for logging\n   */\n  static getTraceInfo(): string {\n    let traceId = null;\n    let spanId = null;\n    try {\n      traceId = SpanUtils.getCurrentTraceId();\n      spanId = SpanUtils.getCurrentSpanId();\n    } catch (error) {\n      logger.error(\"SpanUtils error getting trace info:\", error);\n      return \"no-trace\";\n    }\n\n    if (traceId && spanId) {\n      return `trace=${traceId} span=${spanId}`;\n    }\n\n    return \"no-trace\";\n  }\n}\n","import * as zlib from \"zlib\";\nimport { logger } from \"../../../../core/utils/logger\";\n\n/**\n * Supported compression encodings and their corresponding zlib decompression functions\n */\nconst ENCODING_FUNCTION_MAP = {\n  gzip: \"gunzip\",\n  deflate: \"inflate\",\n  br: \"brotliDecompress\",\n} as const;\n\ntype SupportedEncoding = keyof typeof ENCODING_FUNCTION_MAP;\n\n/**\n * Decompresses a buffer using the specified encoding\n *\n * @param buffer - The compressed buffer to decompress\n * @param encoding - The compression encoding (gzip, deflate, br)\n * @returns Promise<Buffer> - The decompressed buffer\n */\nexport async function decompressBuffer(buffer: Buffer, encoding: string): Promise<Buffer> {\n  const normalizedEncoding = encoding.toLowerCase().trim() as SupportedEncoding;\n\n  if (normalizedEncoding in ENCODING_FUNCTION_MAP) {\n    return new Promise((resolve, reject) => {\n      const zlibFunction = ENCODING_FUNCTION_MAP[normalizedEncoding];\n      (zlib as any)[zlibFunction](buffer, (err: Error | null, decoded: Buffer) => {\n        if (err) {\n          reject(err);\n        } else {\n          resolve(decoded);\n        }\n      });\n    });\n  }\n\n  logger.debug(`Unknown encoding: ${encoding} - skipping decoding.`);\n  return Promise.resolve(buffer);\n}\n\n/**\n * Checks if a string represents a supported compression encoding\n *\n * @param encoding - The encoding string to check\n * @returns boolean - True if the encoding is supported\n */\nexport function isSupportedEncoding(encoding: string): boolean {\n  const normalizedEncoding = encoding.toLowerCase().trim();\n  return normalizedEncoding in ENCODING_FUNCTION_MAP;\n}\n\nexport function normalizeHeaders(headers: Record<string, any>): Record<string, any> {\n  const normalized: Record<string, any> = {};\n  for (const [name, value] of Object.entries(headers)) {\n    normalized[name.toLowerCase()] = value;\n  }\n  return normalized;\n}\n","/**\n * Utility functions for handling binary data and encoding detection\n */\n\n/**\n * Checks if a buffer contains valid UTF-8 text\n * Uses TextDecoder with fatal flag\n *\n * @param buffer - The buffer to check\n * @returns boolean - True if the buffer contains valid UTF-8 text\n */\nexport function isUtf8(buffer: Buffer): boolean {\n  if (buffer.length === 0) {\n    return true;\n  }\n\n  const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n\n  try {\n    // If this succeeds, the buffer contains valid UTF-8\n    decoder.decode(buffer);\n    return true;\n  } catch (error) {\n    // If this fails, the buffer contains invalid UTF-8 (likely binary)\n    return false;\n  }\n}\n\n/**\n * Safely converts a buffer to string using appropriate encoding\n *\n * @param buffer - The buffer to convert\n * @returns object with content and encoding used\n */\nexport function bufferToString(buffer: Buffer): { content: string; encoding: \"utf8\" | \"base64\" } {\n  if (isUtf8(buffer)) {\n    return {\n      content: buffer.toString(\"utf8\"),\n      encoding: \"utf8\",\n    };\n  } else {\n    return {\n      content: buffer.toString(\"base64\"),\n      encoding: \"base64\",\n    };\n  }\n}\n\n/**\n * Safely combines multiple chunks into a single buffer\n *\n * @param chunks - Array of chunks (can be strings or Buffers)\n * @returns Buffer - Combined buffer\n */\nexport function combineChunks(chunks: (string | Buffer)[]): Buffer {\n  const buffers: Buffer[] = chunks.map((chunk) => {\n    if (Buffer.isBuffer(chunk)) {\n      return chunk;\n    }\n    return Buffer.from(chunk);\n  });\n\n  return Buffer.concat(buffers);\n}\n","import { decompressBuffer } from \"./bodyDecompression\";\nimport { DecodedType } from \"@use-tusk/drift-schemas/core/json_schema\";\nimport { logger } from \"../../../../core/utils/logger\";\n\n// Mapping from content-type to decoded type\nconst CONTENT_TYPE_MAPPING: Record<string, DecodedType> = {\n  // JSON\n  \"application/json\": DecodedType.JSON,\n\n  // HTML\n  \"text/html\": DecodedType.HTML,\n\n  // CSS\n  \"text/css\": DecodedType.CSS,\n\n  // JavaScript\n  \"text/javascript\": DecodedType.JAVASCRIPT,\n  \"application/javascript\": DecodedType.JAVASCRIPT,\n  \"application/x-javascript\": DecodedType.JAVASCRIPT,\n\n  // XML\n  \"text/xml\": DecodedType.XML,\n  \"application/xml\": DecodedType.XML,\n\n  // SVG (special case - XML-based but can be rendered)\n  \"image/svg+xml\": DecodedType.SVG,\n\n  // YAML\n  \"application/yaml\": DecodedType.YAML,\n  \"application/x-yaml\": DecodedType.YAML,\n  \"text/yaml\": DecodedType.YAML,\n  \"text/x-yaml\": DecodedType.YAML,\n\n  // Plain text\n  \"text/plain\": DecodedType.PLAIN_TEXT,\n\n  // Markdown\n  \"text/markdown\": DecodedType.MARKDOWN,\n  \"text/x-markdown\": DecodedType.MARKDOWN,\n\n  // CSV\n  \"text/csv\": DecodedType.CSV,\n  \"application/csv\": DecodedType.CSV,\n\n  // SQL\n  \"application/sql\": DecodedType.SQL,\n  \"text/sql\": DecodedType.SQL,\n\n  // GraphQL\n  \"application/graphql\": DecodedType.GRAPHQL,\n\n  // Form data\n  \"application/x-www-form-urlencoded\": DecodedType.FORM_DATA,\n  \"multipart/form-data\": DecodedType.MULTIPART_FORM,\n\n  // PDF\n  \"application/pdf\": DecodedType.PDF,\n\n  // Specific image formats\n  \"image/jpeg\": DecodedType.JPEG,\n  \"image/jpg\": DecodedType.JPEG,\n  \"image/png\": DecodedType.PNG,\n  \"image/gif\": DecodedType.GIF,\n  \"image/webp\": DecodedType.WEBP,\n  \"image/bmp\": DecodedType.JPEG,\n  \"image/tiff\": DecodedType.JPEG,\n  \"image/ico\": DecodedType.PNG,\n\n  // Audio (keep generic since audio formatting is similar)\n  \"audio/mpeg\": DecodedType.AUDIO,\n  \"audio/mp3\": DecodedType.AUDIO,\n  \"audio/wav\": DecodedType.AUDIO,\n  \"audio/ogg\": DecodedType.AUDIO,\n  \"audio/webm\": DecodedType.AUDIO,\n\n  // Video (keep generic since video formatting is similar)\n  \"video/mp4\": DecodedType.VIDEO,\n  \"video/webm\": DecodedType.VIDEO,\n  \"video/ogg\": DecodedType.VIDEO,\n  \"video/avi\": DecodedType.VIDEO,\n  \"video/mov\": DecodedType.VIDEO,\n\n  // Specific binary formats\n  \"application/zip\": DecodedType.ZIP,\n  \"application/gzip\": DecodedType.GZIP,\n  \"application/x-gzip\": DecodedType.GZIP,\n\n  // Generic binary\n  \"application/octet-stream\": DecodedType.BINARY,\n  \"application/tar\": DecodedType.BINARY,\n  \"application/rar\": DecodedType.BINARY,\n  \"application/7z\": DecodedType.BINARY,\n};\n\n/**\n * Async HTTP body encoder that base64 encodes the body buffer\n */\nexport async function httpBodyEncoder({\n  bodyBuffer,\n  contentEncoding,\n}: {\n  bodyBuffer: Buffer;\n  contentEncoding?: string;\n}): Promise<string> {\n  // First check if we need to decompress the body\n  let processedBuffer = bodyBuffer;\n\n  if (contentEncoding) {\n    try {\n      processedBuffer = await decompressBuffer(bodyBuffer, contentEncoding);\n    } catch (error) {\n      logger.warn(`Failed to decompress body with encoding ${contentEncoding}:`, error);\n    }\n  }\n\n  return processedBuffer.toString(\"base64\");\n}\n\n/**\n * Parses a Content-Type header and returns the corresponding decoded type enum\n * @param contentType - The Content-Type header value (e.g., \"application/json; charset=utf-8\")\n * @returns The corresponding DecodedType enum value\n */\nexport function getDecodedType(\n  contentType: string | string[] | undefined,\n): DecodedType | undefined {\n  if (!contentType) {\n    return undefined;\n  }\n\n  // Handle array values (when same header appears multiple times)\n  // Should rarely happen, but just in case. First one is usually the \"original\" one.\n  const contentTypeString =\n    Array.isArray(contentType) && contentType.length > 0 ? contentType[0] : contentType;\n\n  if (!contentTypeString || typeof contentTypeString !== \"string\") {\n    logger.debug(`Invalid Content-Type header: ${contentType}`);\n    return undefined;\n  }\n\n  // Convert to lowercase and extract the main media type (before semicolon)\n  const mainType = contentTypeString.toLowerCase().split(\";\")[0].trim();\n  return CONTENT_TYPE_MAPPING[mainType];\n}\n\nexport const ACCEPTABLE_CONTENT_TYPES = new Set([DecodedType.JSON, DecodedType.PLAIN_TEXT]);\n","import { EventEmitter } from \"events\";\nimport { OriginalGlobalUtils } from \"../../../../core/utils\";\n\nexport interface TdHttpMockSocketOptions {\n  protocol?: \"http\" | \"https\";\n  family?: number;\n  port?: number;\n  hostname?: string;\n  host?: string;\n}\n\n/**\n * Mock socket implementation for Tusk Drift HTTP replay\n */\nexport class TdHttpMockSocket extends EventEmitter {\n  public authorized?: boolean;\n  public _hadError: boolean;\n  public connecting: boolean;\n  public writableLength: number;\n  public bufferSize: number;\n  public writable: boolean;\n  public readable: boolean;\n  public pending: boolean;\n  public destroyed: boolean;\n  public encrypted?: boolean;\n  public timeout: number;\n  public localAddress: string;\n  public remoteFamily: string;\n  public localPort: number;\n  public remoteAddress: string;\n  public remotePort: number;\n  public readableEnded: boolean = false;\n  public writableFinished: boolean = false;\n\n  constructor(options: TdHttpMockSocketOptions = {}) {\n    super();\n\n    // Set SSL/TLS properties for HTTPS\n    if (options.protocol === \"https\") {\n      this.authorized = true;\n      this.encrypted = true;\n    }\n\n    this.bufferSize = 0;\n    this.writableLength = 0;\n    this.writable = true;\n    this.readable = true;\n    this.pending = false;\n    this.destroyed = false;\n    this.connecting = true;\n    this._hadError = false;\n    this.timeout = 0;\n\n    // Set up network addressing\n    const ipv6 = options.family === 6;\n    this.remoteFamily = ipv6 ? \"IPv6\" : \"IPv4\";\n    this.remoteAddress = ipv6 ? \"::1\" : \"127.0.0.1\";\n    this.localAddress = this.remoteAddress;\n\n    // Set ports\n    const port = options.port || (options.protocol === \"https\" ? 443 : 80);\n    this.remotePort = Number.parseInt(String(port), 10);\n    this.localPort = this.remotePort;\n  }\n\n  setNoDelay(): this {\n    return this;\n  }\n\n  setKeepAlive(): this {\n    return this;\n  }\n\n  resume(): this {\n    return this;\n  }\n\n  ref(): this {\n    return this;\n  }\n\n  unref(): this {\n    return this;\n  }\n\n  write(): boolean {\n    return false;\n  }\n\n  address(): { port: number; family: string; address: string } {\n    return {\n      port: this.remotePort,\n      family: this.remoteFamily,\n      address: this.remoteAddress,\n    };\n  }\n\n  setTimeout(timeoutMs: number, callback?: () => void): this {\n    this.timeout = timeoutMs;\n    if (callback) {\n      this.once(\"timeout\", callback);\n    }\n    return this;\n  }\n\n  /**\n   * Artificial delay that will trip socket timeouts when appropriate.\n   * Doesn't actually wait for time to pass.\n   * Timeout events don't necessarily end the request.\n   */\n  applyDelay(delayMs: number): void {\n    if (this.timeout && delayMs > this.timeout) {\n      this.emit(\"timeout\");\n    }\n  }\n\n  getPeerCertificate(): string {\n    const originalDate = OriginalGlobalUtils.getOriginalDate();\n    return Buffer.from((Math.random() * 1e4 + originalDate.getTime()).toString()).toString(\n      \"base64\",\n    );\n  }\n\n  /**\n   * Denotes that no more I/O activity should happen on this socket.\n   * Sets flags and emits 'close' and optional 'error' events.\n   */\n  destroy(err?: Error): this {\n    if (this.destroyed) {\n      return this;\n    }\n\n    this.destroyed = true;\n    this.writable = false;\n    this.readable = false;\n    this.writableFinished = true;\n    this.readableEnded = true;\n\n    process.nextTick(() => {\n      if (err) {\n        this._hadError = true;\n        this.emit(\"error\", err);\n      }\n      this.emit(\"close\");\n    });\n\n    return this;\n  }\n}\n","export class EnvVarTracker {\n  // This should be a mapping between trace id and env var\n  private static envVars = new Map<string, Record<string, string | undefined>>();\n\n  static setEnvVar({\n    traceId,\n    key,\n    value,\n  }: {\n    traceId: string;\n    key: string;\n    value: string | undefined;\n  }): void {\n    this.envVars.set(traceId, {\n      ...(this.envVars.get(traceId) || {}),\n      [key]: value,\n    });\n  }\n\n  static setEnvVars(traceId: string, envVars: Record<string, string | undefined>): void {\n    this.envVars.set(traceId, envVars);\n  }\n\n  static getEnvVar(traceId: string, key: string): string | undefined {\n    return this.envVars.get(traceId)?.[key];\n  }\n\n  static getEnvVars(traceId: string): Record<string, string | undefined> | undefined {\n    return this.envVars.get(traceId);\n  }\n\n  static clearEnvVars(traceId: string): void {\n    this.envVars.delete(traceId);\n  }\n}\n","import { SpanUtils } from \"../../../core/tracing/SpanUtils\";\nimport { logger } from \"../../../core/utils/logger\";\n\n/**\n * Global date tracker that maintains the latest mock response timestamp per trace.\n * This is used to provide consistent dates in replay mode.\n */\nexport class DateTracker {\n  private static traceToLatestTimestamp = new Map<string, Date>();\n\n  /**\n   * Updates the latest timestamp for a given trace ID\n   */\n  static updateLatestTimestamp(traceId: string, timestamp: string | number): void {\n    const date = new Date(timestamp);\n    this.traceToLatestTimestamp.set(traceId, date);\n    logger.debug(`Updated latest timestamp for trace ${traceId}: ${date.toISOString()}`);\n  }\n\n  /**\n   * Gets the latest timestamp for the current trace\n   */\n  static getCurrentTraceLatestDate(): Date | null {\n    const replayTraceId = SpanUtils.getCurrentReplayTraceId();\n    if (!replayTraceId) {\n      return null;\n    }\n\n    return this.traceToLatestTimestamp.get(replayTraceId) || null;\n  }\n\n  /**\n   * Clears the timestamp for a given trace ID (useful for cleanup)\n   */\n  static clearTrace(traceId: string): void {\n    this.traceToLatestTimestamp.delete(traceId);\n  }\n\n  /**\n   * Clears all tracked timestamps (useful for testing)\n   */\n  static clearAll(): void {\n    this.traceToLatestTimestamp.clear();\n  }\n}\n","import * as crypto from \"crypto\";\nimport { logger } from \"../utils/logger\";\nimport {\n  JsonSchemaType,\n  EncodingType,\n  DecodedType,\n  type JsonSchema,\n} from \"@use-tusk/drift-schemas/core/json_schema\";\n\n// Standardized schema type mapping\nconst jsToJsonSchemaTypeMapping = {\n  [\"long\"]: JsonSchemaType.NUMBER,\n  [\"undefined\"]: JsonSchemaType.UNDEFINED,\n  [\"string\"]: JsonSchemaType.STRING,\n  [\"number\"]: JsonSchemaType.NUMBER,\n  [\"Number\"]: JsonSchemaType.NUMBER,\n  [\"boolean\"]: JsonSchemaType.BOOLEAN,\n  [\"null\"]: JsonSchemaType.NULL,\n  [\"bigint\"]: JsonSchemaType.NUMBER,\n  [\"Error\"]: JsonSchemaType.OBJECT,\n  [\"function\"]: JsonSchemaType.FUNCTION,\n  [\"RegExp\"]: JsonSchemaType.OBJECT,\n  [\"Set\"]: JsonSchemaType.UNORDERED_LIST,\n  [\"symbol\"]: JsonSchemaType.STRING,\n  [\"Date\"]: JsonSchemaType.STRING,\n  [\"Int8Array\"]: JsonSchemaType.STRING,\n  [\"Uint8Array\"]: JsonSchemaType.STRING,\n  [\"Uint8ClampedArray\"]: JsonSchemaType.STRING,\n  [\"Int16Array\"]: JsonSchemaType.STRING,\n  [\"Uint16Array\"]: JsonSchemaType.STRING,\n  [\"Int32Array\"]: JsonSchemaType.STRING,\n  [\"Uint32Array\"]: JsonSchemaType.STRING,\n  [\"Float32Array\"]: JsonSchemaType.STRING,\n  [\"Float64Array\"]: JsonSchemaType.STRING,\n  [\"DataView\"]: JsonSchemaType.STRING,\n  [\"ArrayBuffer\"]: JsonSchemaType.STRING,\n  [\"object\"]: JsonSchemaType.OBJECT,\n  [\"Object\"]: JsonSchemaType.OBJECT,\n  [\"Map\"]: JsonSchemaType.OBJECT,\n  [\"Array\"]: JsonSchemaType.ORDERED_LIST,\n  [\"Arguments\"]: JsonSchemaType.ORDERED_LIST,\n} as const;\n\n// Re-export proto types for convenience\nexport { JsonSchemaType, EncodingType, DecodedType, type JsonSchema };\n\n// The following types can be merged with the generated schema to provide additional information\n// This is set in the instrumentation layer and merged with the generated schema\nexport interface SchemaMergeTypes {\n  encoding?: EncodingType;\n  decodedType?: DecodedType;\n  matchImportance?: number; // Should be between 0 and 1, 0 being the lowest importance and 1 being the highest importance\n}\n\nexport type SchemaMerges = Record<string, SchemaMergeTypes>;\n\n/**\n * Utility class for JSON schema generation and hashing\n */\nexport class JsonSchemaHelper {\n  /**\n   * Determine the detailed type of a value using standardized mapping\n   */\n  static getDetailedType(value: any): JsonSchemaType {\n    if (value === null) {\n      return jsToJsonSchemaTypeMapping[\"null\"];\n    }\n\n    if (value === undefined) {\n      return jsToJsonSchemaTypeMapping[\"undefined\"];\n    }\n\n    const primitiveType = typeof value;\n\n    if (primitiveType === \"object\") {\n      // More specific object type detection\n      const objectType = Object.prototype.toString.call(value).slice(8, -1);\n\n      if (objectType === \"Array\") {\n        return jsToJsonSchemaTypeMapping[\"Array\"];\n      }\n\n      if (objectType === \"Date\") {\n        return jsToJsonSchemaTypeMapping[\"Date\"];\n      }\n\n      if (objectType === \"RegExp\") {\n        return jsToJsonSchemaTypeMapping[\"RegExp\"];\n      }\n\n      if (objectType === \"Error\") {\n        return jsToJsonSchemaTypeMapping[\"Error\"];\n      }\n\n      if (objectType === \"Set\") {\n        return jsToJsonSchemaTypeMapping[\"Set\"];\n      }\n\n      if (objectType === \"Map\") {\n        return jsToJsonSchemaTypeMapping[\"Map\"];\n      }\n\n      // Typed arrays\n      if (objectType === \"Int8Array\") return jsToJsonSchemaTypeMapping[\"Int8Array\"];\n      if (objectType === \"Uint8Array\") return jsToJsonSchemaTypeMapping[\"Uint8Array\"];\n      if (objectType === \"Uint8ClampedArray\") return jsToJsonSchemaTypeMapping[\"Uint8ClampedArray\"];\n      if (objectType === \"Int16Array\") return jsToJsonSchemaTypeMapping[\"Int16Array\"];\n      if (objectType === \"Uint16Array\") return jsToJsonSchemaTypeMapping[\"Uint16Array\"];\n      if (objectType === \"Int32Array\") return jsToJsonSchemaTypeMapping[\"Int32Array\"];\n      if (objectType === \"Uint32Array\") return jsToJsonSchemaTypeMapping[\"Uint32Array\"];\n      if (objectType === \"Float32Array\") return jsToJsonSchemaTypeMapping[\"Float32Array\"];\n      if (objectType === \"Float64Array\") return jsToJsonSchemaTypeMapping[\"Float64Array\"];\n      if (objectType === \"DataView\") return jsToJsonSchemaTypeMapping[\"DataView\"];\n      if (objectType === \"ArrayBuffer\") return jsToJsonSchemaTypeMapping[\"ArrayBuffer\"];\n\n      if (objectType === \"Arguments\") {\n        return jsToJsonSchemaTypeMapping[\"Arguments\"];\n      }\n\n      // Default to generic object\n      return jsToJsonSchemaTypeMapping[\"object\"];\n    }\n\n    if (primitiveType === \"string\") {\n      return jsToJsonSchemaTypeMapping[\"string\"];\n    }\n\n    if (primitiveType === \"number\") {\n      return jsToJsonSchemaTypeMapping[\"number\"];\n    }\n\n    if (primitiveType === \"bigint\") {\n      return jsToJsonSchemaTypeMapping[\"bigint\"];\n    }\n\n    if (primitiveType === \"boolean\") {\n      return jsToJsonSchemaTypeMapping[\"boolean\"];\n    }\n\n    if (primitiveType === \"function\") {\n      return jsToJsonSchemaTypeMapping[\"function\"];\n    }\n\n    if (primitiveType === \"symbol\") {\n      return jsToJsonSchemaTypeMapping[\"symbol\"];\n    }\n\n    // Fallback for unknown types\n    return jsToJsonSchemaTypeMapping[\"string\"];\n  }\n\n  /**\n   * Merge schema override with generated schema\n   * This allows partial overrides while preserving generated properties\n   */\n  private static mergeSchemaWithMerges(\n    generatedSchema: JsonSchema,\n    merges: SchemaMergeTypes,\n  ): JsonSchema {\n    const merged: JsonSchema = { ...generatedSchema };\n\n    // Apply merges properties\n    Object.keys(merges).forEach((key) => {\n      (merged as any)[key] = (merges as any)[key];\n    });\n\n    return merged;\n  }\n\n  /**\n   * Generate schema from data object using standardized types\n   *\n   * Note: We properties always exists on JsonSchema because proto3 maps cannot be marked optional.\n   * The JSON data is a bit inefficient because of this, but the easiest way to handle this is to keep it for now.\n   */\n  static generateSchema(data: any, schemaMerges?: SchemaMerges): JsonSchema {\n    if (data === null) {\n      return { type: jsToJsonSchemaTypeMapping[\"null\"], properties: {} };\n    }\n\n    if (data === undefined) {\n      return { type: jsToJsonSchemaTypeMapping[\"undefined\"], properties: {} };\n    }\n\n    const detailedType = JsonSchemaHelper.getDetailedType(data);\n\n    if (detailedType === JsonSchemaType.ORDERED_LIST) {\n      if (Array.isArray(data) && data.length === 0) {\n        return { type: JsonSchemaType.ORDERED_LIST, properties: {} };\n      }\n      const items =\n        Array.isArray(data) && data.length > 0\n          ? JsonSchemaHelper.generateSchema(data[0])\n          : undefined;\n      if (items !== undefined) {\n        return {\n          type: JsonSchemaType.ORDERED_LIST,\n          items,\n          properties: {},\n        };\n      }\n      return { type: JsonSchemaType.ORDERED_LIST, properties: {} };\n    }\n\n    if (detailedType === JsonSchemaType.UNORDERED_LIST) {\n      // Handle Set objects\n      if (data instanceof Set) {\n        const firstItem = data.size > 0 ? data.values().next().value : null;\n        if (firstItem !== null) {\n          return {\n            type: JsonSchemaType.UNORDERED_LIST,\n            items: JsonSchemaHelper.generateSchema(firstItem),\n            properties: {},\n          };\n        }\n      }\n      return { type: JsonSchemaType.UNORDERED_LIST, properties: {} };\n    }\n\n    if (detailedType === JsonSchemaType.OBJECT) {\n      const schema: JsonSchema = { type: JsonSchemaType.OBJECT, properties: {} };\n\n      // Handle Map objects\n      if (data instanceof Map) {\n        data.forEach((value, key) => {\n          const keyString = String(key);\n          const generatedSchema = JsonSchemaHelper.generateSchema(value);\n\n          // Check for schema override for this key\n          if (schemaMerges && schemaMerges[keyString]) {\n            schema.properties[keyString] = JsonSchemaHelper.mergeSchemaWithMerges(\n              generatedSchema,\n              schemaMerges[keyString],\n            );\n          } else {\n            schema.properties[keyString] = generatedSchema;\n          }\n        });\n      } else if (typeof data === \"object\") {\n        Object.keys(data).forEach((key) => {\n          const generatedSchema = JsonSchemaHelper.generateSchema(data[key]);\n\n          // Check for schema override for this key\n          if (schemaMerges && schemaMerges[key]) {\n            schema.properties[key] = JsonSchemaHelper.mergeSchemaWithMerges(\n              generatedSchema,\n              schemaMerges[key],\n            );\n          } else {\n            schema.properties[key] = generatedSchema;\n          }\n        });\n      }\n\n      return schema;\n    }\n\n    // For primitive types, return just the type\n    return { type: detailedType, properties: {} };\n  }\n\n  /**\n   * Generate deterministic hash for any data\n   */\n  static generateDeterministicHash(data: any): string {\n    // Sort object keys to ensure deterministic hashing\n    const sortedData = JsonSchemaHelper.sortObjectKeysRecursively(data);\n    const jsonString = JSON.stringify(sortedData);\n    return crypto.createHash(\"sha256\").update(jsonString).digest(\"hex\");\n  }\n\n  /**\n   * Recursively sort object keys for deterministic hashing\n   */\n  static sortObjectKeysRecursively(obj: any): any {\n    if (obj === null || obj === undefined) {\n      return obj;\n    }\n\n    if (Array.isArray(obj)) {\n      return obj.map((item) => JsonSchemaHelper.sortObjectKeysRecursively(item));\n    }\n\n    if (typeof obj === \"object\") {\n      const sortedObj: any = {};\n      Object.keys(obj)\n        .sort()\n        .forEach((key) => {\n          sortedObj[key] = JsonSchemaHelper.sortObjectKeysRecursively(obj[key]);\n        });\n      return sortedObj;\n    }\n\n    return obj;\n  }\n\n  /**\n   * Decode data based on schema merges containing encoding and decodedType\n   */\n  private static decodeDataWithMerges(data: any, schemaMerges?: SchemaMerges): any {\n    if (!schemaMerges) {\n      return data;\n    }\n\n    const decodedData = { ...data };\n\n    // Process each schema override that has encoding and decodedType\n    for (const [key, schema] of Object.entries(schemaMerges)) {\n      if (schema.encoding && schema.decodedType && data[key] !== undefined) {\n        try {\n          let decodedValue = data[key];\n\n          // Decode based on encoding type\n          if (schema.encoding === EncodingType.BASE64 && typeof decodedValue === \"string\") {\n            const buffer = Buffer.from(decodedValue, \"base64\");\n            decodedValue = buffer.toString(\"utf8\");\n          }\n\n          // Parse based on decoded type\n          if (schema.decodedType === DecodedType.JSON && typeof decodedValue === \"string\") {\n            decodedValue = JSON.parse(decodedValue);\n          }\n\n          decodedData[key] = decodedValue;\n        } catch (error) {\n          logger.debug(`[JsonSchemaHelper] Failed to decode ${key}:`, error);\n          // Keep original value if decoding fails\n          decodedData[key] = data[key];\n        }\n      }\n    }\n\n    return decodedData;\n  }\n\n  /**\n   * Generate schema and hash for input/output data\n   *\n   * This method handles schema merges by decoding data (e.g., base64 -> JSON) and\n   * generating schemas/hashes with schema merges applied.\n   *\n   * @param data - The original input data to process\n   * @param schemaMerges - Optional schema merges could contain encoding, decodedType, and/or matchImportance info\n   * @returns Object containing:\n   *   - schema: JsonSchema for the original data with merges applied\n   *   - decodedValueHash: Hash of the decoded data values (what the data looks like after decoding)\n   *   - decodedSchemaHash: Hash of the decoded data schema (structure of decoded data) with schema merges applied\n   *\n   *\n   * E.g. if body is base64-encoded JSON, the schema will show\n   *\n   * \"body\": {\n   *    \"type\": \"OBJECT\",\n   *    \"properties\": {\n   *       \"location\": { \"type\": \"STRING\" },\n   *       \"current\": {\n   *         \"type\": \"OBJECT\",\n   *         \"properties\": {\n   *           \"temp_F\": { \"type\": \"STRING\" },\n   *           \"humidity\": { \"type\": \"STRING\" },\n   *         }\n   *       },\n   *     },\n   *    \"encoding\": \"BASE64\",\n   *    \"decodedType\": \"JSON\"\n   *  },\n   *\n   * Where the actual body is stored as a base64-encoded JSON string but the schema still demonstrates the structure of the JSON object.\n   */\n  static generateSchemaAndHash(\n    data: any,\n    schemaMerges?: SchemaMerges,\n  ): {\n    schema: JsonSchema;\n    decodedValueHash: string;\n    decodedSchemaHash: string;\n  } {\n    // Simulate the same JSON serialization/deserialization that happens during recording\n    // This removes undefined values and normalizes the structure\n    const normalizedData = JSON.parse(JSON.stringify(data));\n\n    // Decode data based on schema merges (e.g., base64 -> JSON)\n    const decodedData = JsonSchemaHelper.decodeDataWithMerges(normalizedData, schemaMerges);\n\n    // Generate schema for the decoded data with the schema merges applied\n    const schema = JsonSchemaHelper.generateSchema(decodedData, schemaMerges);\n\n    // Generate hashes for decoded data\n    const decodedValueHash = JsonSchemaHelper.generateDeterministicHash(decodedData);\n    const decodedSchemaHash = JsonSchemaHelper.generateDeterministicHash(schema);\n\n    return { schema, decodedValueHash, decodedSchemaHash };\n  }\n\n  /**\n   * Get the standardized type mapping for reference\n   */\n  static getTypeMapping(): typeof jsToJsonSchemaTypeMapping {\n    return jsToJsonSchemaTypeMapping;\n  }\n}\n","import { SpanUtils } from \"../../../core/tracing/SpanUtils\";\nimport { TuskDriftCore } from \"../../../core/TuskDrift\";\nimport { DateTracker } from \"../trackers\";\nimport { JsonSchema, JsonSchemaHelper, SchemaMerges } from \"../../../core/tracing/JsonSchemaHelper\";\nimport { CleanSpanData, MockRequestData } from \"../../../core/types\";\nimport { StatusCode } from \"@use-tusk/drift-schemas/core/span\";\nimport { OriginalGlobalUtils, logger } from \"../../../core/utils\";\n\nexport interface MockRequest {\n  service: string;\n  operation: string;\n  target: string;\n  inputData?: any;\n  inputSchema?: JsonSchema;\n}\n\nexport interface MockResponse {\n  result: any;\n}\n\n// Add filler values for the clean span data fields we don't care about when fetching mocks\nfunction convertMockRequestDataToCleanSpanData(\n  mockRequestData: MockRequestData,\n  tuskDrift: TuskDriftCore,\n  inputValueSchemaMerges?: SchemaMerges,\n): CleanSpanData {\n  const {\n    schema: inputSchema,\n    decodedValueHash: inputValueHash,\n    decodedSchemaHash: inputSchemaHash,\n  } = JsonSchemaHelper.generateSchemaAndHash(mockRequestData.inputValue, inputValueSchemaMerges);\n\n  // log date.now in a readable format\n  const originalDate = OriginalGlobalUtils.getOriginalDate();\n\n  return {\n    ...mockRequestData,\n    parentSpanId: \"\",\n    inputValueHash,\n    inputSchema,\n    inputSchemaHash,\n    outputValue: undefined,\n    outputSchema: undefined,\n    outputSchemaHash: \"\",\n    outputValueHash: \"\",\n    timestamp: {\n      seconds: Math.floor(originalDate.getTime() / 1000),\n      nanos: (originalDate.getTime() % 1000) * 1000000,\n    },\n    duration: {\n      seconds: 0,\n      nanos: 0,\n    },\n    isRootSpan: false,\n    isPreAppStart: !tuskDrift.isAppReady(),\n    metadata: undefined,\n    status: {\n      code: StatusCode.OK,\n      message: \"OK\",\n    },\n    stackTrace: mockRequestData.stackTrace,\n  };\n}\n\n/**\n * Utility function to find mock responses for replay mode across all instrumentations.\n * This centralizes the common logic of:\n * 1. Getting the replay trace ID from context\n * 2. Making the mock request to TuskDrift\n * 3. Handling the response and error cases\n *\n * @param outboundSpan - The outbound span to find a mock response for\n * @param tuskDrift - The TuskDrift instance to make the mock request\n * @param inputValueSchemaOverrides - The schema overrides for the input value\n * @returns Promise<MockResponse | null> - The mock response or null if not found\n */\nexport async function findMockResponseAsync({\n  mockRequestData,\n  tuskDrift,\n  inputValueSchemaMerges,\n}: {\n  mockRequestData: MockRequestData;\n  tuskDrift: TuskDriftCore;\n  inputValueSchemaMerges?: SchemaMerges;\n}): Promise<MockResponse | null> {\n  const outboundSpan = convertMockRequestDataToCleanSpanData(\n    mockRequestData,\n    tuskDrift,\n    inputValueSchemaMerges,\n  );\n  try {\n    // Get replay trace ID from context\n    const replayTraceId = SpanUtils.getCurrentReplayTraceId();\n\n    logger.debug(`Finding ${outboundSpan.traceId} mock for replay trace ID: ${replayTraceId}`);\n\n    const mockResponse = await tuskDrift.requestMockAsync({\n      outboundSpan,\n      // We could have no replay trace ID if we are finding outbound mocks for calls made before the app started\n      testId: replayTraceId || \"\",\n    });\n\n    if (!mockResponse || !mockResponse.found) {\n      logger.debug(\n        `No matching mock found for ${outboundSpan.traceId} with input value: ${JSON.stringify(\n          outboundSpan.inputValue,\n        )}`,\n        replayTraceId,\n      );\n      return null;\n    }\n\n    const responseBody = (mockResponse.response as any)?.response?.body;\n    logger.debug(`Found ${outboundSpan.traceId} mock response:`, responseBody, {\n      timestamp: (mockResponse.response as any)?.timestamp,\n    });\n\n    // Track the latest timestamp for this trace\n    if ((mockResponse.response as any)?.timestamp) {\n      DateTracker.updateLatestTimestamp(\n        replayTraceId || \"\",\n        (mockResponse.response as any).timestamp,\n      );\n    }\n\n    return {\n      result: responseBody,\n    };\n  } catch (error) {\n    logger.error(`Error finding ${outboundSpan.traceId} mock response:`, error);\n    return null;\n  }\n}\n\nexport function findMockResponseSync({\n  mockRequestData,\n  tuskDrift,\n  inputValueSchemaMerges,\n}: {\n  mockRequestData: MockRequestData;\n  tuskDrift: TuskDriftCore;\n  inputValueSchemaMerges?: SchemaMerges;\n}): MockResponse | null {\n  const outboundSpan = convertMockRequestDataToCleanSpanData(\n    mockRequestData,\n    tuskDrift,\n    inputValueSchemaMerges,\n  );\n  try {\n    // Get replay trace ID from context\n    const replayTraceId = SpanUtils.getCurrentReplayTraceId();\n\n    logger.debug(`Finding ${outboundSpan.traceId} mock for replay trace ID: ${replayTraceId}`);\n\n    const mockResponse = tuskDrift.requestMockSync({\n      outboundSpan,\n      testId: replayTraceId || \"\",\n    });\n\n    if (!mockResponse || !mockResponse.found) {\n      logger.debug(\n        `No matching mock found for ${outboundSpan.traceId} with input value: ${JSON.stringify(\n          outboundSpan.inputValue,\n        )}`,\n        replayTraceId,\n      );\n      return null;\n    }\n\n    const responseBody = (mockResponse.response as any)?.response?.body;\n    logger.debug(`Found ${outboundSpan.traceId} mock response and timestamp:`, responseBody, {\n      timestamp: (mockResponse.response as any)?.timestamp,\n    });\n\n    // Track the latest timestamp for this trace\n    if ((mockResponse.response as any)?.timestamp) {\n      DateTracker.updateLatestTimestamp(\n        replayTraceId || \"\",\n        (mockResponse.response as any).timestamp,\n      );\n    }\n\n    return {\n      result: responseBody,\n    };\n  } catch (error) {\n    logger.error(`Error finding ${outboundSpan.traceId} mock response:`, error);\n    return null;\n  }\n}\n","import { EventEmitter } from \"events\";\nimport { IncomingMessage } from \"http\";\nimport { TdHttpMockSocket, TdHttpMockSocketOptions } from \"./TdHttpMockSocket\";\nimport { SpanInfo } from \"../../../../core/tracing/SpanUtils\";\nimport { getDecodedType, httpBodyEncoder, normalizeHeaders } from \"../utils\";\nimport { HttpClientInputValue, HttpClientOutputValue } from \"../types\";\nimport { TuskDriftCore } from \"../../../../core/TuskDrift\";\nimport { createMockInputValue } from \"../../../../core/utils\";\nimport { findMockResponseAsync } from \"../../../core/utils/mockResponseUtils\";\nimport { SpanKind } from \"@opentelemetry/api\";\n\n// Lazy-loaded to avoid loading http module at import time\nlet ClientRequest: any;\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { EncodingType } from \"../../../../core/tracing/JsonSchemaHelper\";\nimport { logger } from \"../../../../core/utils/logger\";\n\nexport interface TdMockClientRequestOptions extends TdHttpMockSocketOptions {\n  method?: string;\n  path?: string;\n  headers?: Record<string, any>;\n  timeout?: number;\n  auth?: string;\n  agent?: any;\n  protocol?: \"http\" | \"https\";\n  hostname?: string;\n  port?: number;\n}\n\n/**\n * Mock ClientRequest implementation for Tusk Drift HTTP replay\n */\nexport class TdMockClientRequest extends EventEmitter {\n  private readonly INSTRUMENTATION_NAME = \"HttpInstrumentation\";\n  public options: TdMockClientRequestOptions;\n  public socket: TdHttpMockSocket;\n  public connection: TdHttpMockSocket;\n  public response: IncomingMessage;\n  public res?: IncomingMessage;\n  public path?: string;\n  public method?: string;\n  public finished: boolean = false;\n  private tuskDrift: TuskDriftCore;\n  private spanInfo?: SpanInfo;\n  private stackTrace?: string;\n\n  private requestBodyBuffers: Buffer[] = [];\n  private playbackStarted: boolean = false;\n  private readyToStartPlaybackOnSocketEvent: boolean = false;\n  private headers: Record<string, any> = {};\n\n  constructor(\n    options: TdMockClientRequestOptions,\n    spanInfo?: SpanInfo,\n    callback?: (res: IncomingMessage) => void,\n    stackTrace?: string,\n  ) {\n    super();\n    TdMockClientRequest._setupPrototype();\n    this.tuskDrift = TuskDriftCore.getInstance();\n\n    this.spanInfo = spanInfo;\n    this.stackTrace = stackTrace;\n\n    if (!options || Object.keys(options).length === 0) {\n      throw new Error(\n        \"Making a request with empty `options` is not supported in TdMockClientRequest\",\n      );\n    }\n\n    this.options = {\n      ...options,\n      headers: normalizeHeaders(options.headers || {}),\n    };\n\n    // Set up callback\n    if (callback) {\n      this.once(\"response\", callback);\n    }\n\n    // Create mock socket\n    this.socket = new TdHttpMockSocket({\n      protocol: options.protocol || \"http\",\n      family: options.family || 4,\n      port: options.port || 80,\n      hostname: options.hostname || \"localhost\",\n    });\n\n    // Set timeout if specified\n    const timeout = options.timeout || options.agent?.options?.timeout;\n    if (timeout) {\n      this.socket.setTimeout(timeout);\n    }\n\n    // Create response object\n    this.response = new IncomingMessage(this.socket as any);\n    this.connection = this.socket;\n\n    this.attachRequest();\n\n    // Connect socket asynchronously\n    process.nextTick(async () => {\n      await this.connectSocket();\n    });\n  }\n\n  private attachRequest(): void {\n    const { options } = this;\n\n    // Set headers\n    for (const [name, value] of Object.entries(options.headers || {})) {\n      // Convert array values to string (take first value if array)\n      // const headerValue = Array.isArray(value) ? value[0] : value;\n      this.setHeader(name.toLowerCase(), value);\n    }\n\n    // Set auth header if provided\n    if (options.auth && !options.headers?.authorization) {\n      this.setHeader(\"authorization\", `Basic ${Buffer.from(options.auth).toString(\"base64\")}`);\n    }\n\n    // Set request properties\n    this.path = options.path || \"/\";\n    this.method = options.method || \"GET\";\n\n    // Handle 100-continue\n    if (options.headers?.expect === \"100-continue\") {\n      setImmediate(() => {\n        this.emit(\"continue\");\n      });\n    }\n  }\n\n  private async connectSocket(): Promise<void> {\n    if (this.isDestroyed()) {\n      return;\n    }\n\n    this.connection = this.socket;\n\n    // Propagate events\n    this.propagateEvents([\"error\", \"timeout\"], this.socket, this);\n\n    this.socket.on(\"close\", () => {\n      this.socketOnClose();\n    });\n\n    this.socket.connecting = false;\n    this.emit(\"socket\", this.socket);\n    this.socket.emit(\"connect\");\n\n    if (this.socket.authorized) {\n      this.socket.emit(\"secureConnect\");\n    }\n\n    if (this.readyToStartPlaybackOnSocketEvent) {\n      await this.maybeStartPlayback();\n    }\n  }\n\n  private propagateEvents(events: string[], source: EventEmitter, target: EventEmitter): void {\n    for (const event of events) {\n      source.on(event, (...args) => target.emit(event, ...args));\n    }\n  }\n\n  private socketOnClose(): void {\n    if (!(this.res || this.socket._hadError)) {\n      this.socket._hadError = true;\n      const err = new Error(\"socket hang up\") as any;\n      err.code = \"ECONNRESET\";\n      this.emit(\"error\", err);\n    }\n    this.emit(\"close\");\n  }\n\n  private async maybeStartPlayback(): Promise<void> {\n    if (this.socket.connecting) {\n      this.readyToStartPlaybackOnSocketEvent = true;\n      return;\n    }\n\n    if (!(this.isDestroyed() || this.playbackStarted)) {\n      await this.startPlayback();\n    }\n  }\n\n  private isDestroyed(): boolean {\n    return (this as any).destroyed || this.socket.destroyed;\n  }\n\n  public write(chunk?: any, encoding?: any, callback?: any): boolean {\n    if (this.finished) {\n      const err = new Error(\"write after end\") as any;\n      err.code = \"ERR_STREAM_WRITE_AFTER_END\";\n      process.nextTick(() => this.emit(\"error\", err));\n      return true;\n    }\n\n    if (this.socket?.destroyed) {\n      return false;\n    }\n\n    if (!chunk) {\n      return true;\n    }\n\n    if (!Buffer.isBuffer(chunk)) {\n      chunk = Buffer.from(chunk, encoding);\n    }\n\n    this.requestBodyBuffers.push(chunk);\n\n    // Handle callback\n    const cb = typeof encoding === \"function\" ? encoding : callback;\n    if (typeof cb === \"function\") {\n      cb();\n    }\n\n    setImmediate(() => {\n      this.emit(\"drain\");\n    });\n\n    return false;\n  }\n\n  public end(chunk?: any, encoding?: any, callback?: any): this {\n    // Prevent multiple calls to end()\n    if (this.finished) {\n      return this;\n    }\n\n    let cb = callback;\n    if (typeof chunk === \"function\") {\n      cb = chunk;\n      chunk = null;\n    } else if (typeof encoding === \"function\") {\n      cb = encoding;\n      encoding = null;\n    }\n\n    if (typeof cb === \"function\") {\n      this.once(\"finish\", cb);\n    }\n\n    if (chunk) {\n      this.write(chunk, encoding);\n    }\n\n    this.finished = true;\n\n    process.nextTick(async () => {\n      await this.maybeStartPlayback();\n    });\n\n    return this;\n  }\n\n  public flushHeaders(): void {\n    process.nextTick(async () => {\n      await this.maybeStartPlayback();\n    });\n  }\n\n  private async startPlayback(): Promise<void> {\n    this.playbackStarted = true;\n\n    try {\n      // For background requests (no traceId), skip mock fetching and return 200 OK immediately\n      if (!this.spanInfo) {\n        logger.debug(\n          `[TdMockClientRequest] Background request detected (no spanInfo), returning 200 OK without mock lookup`,\n        );\n\n        const emptyResponse: HttpClientOutputValue = {\n          statusCode: 200,\n          statusMessage: \"OK\",\n          headers: {},\n          httpVersion: \"1.1\",\n          httpVersionMajor: 1,\n          httpVersionMinor: 1,\n          complete: true,\n          readable: false,\n        };\n\n        this.emit(\"finish\");\n\n        // Play the empty response\n        process.nextTick(() => {\n          this.playResponse(emptyResponse);\n        });\n        return;\n      }\n\n      // Build input value for matching\n      const rawInputValue: HttpClientInputValue = {\n        method: this.method || \"GET\",\n        path: this.path,\n        headers: this.headers,\n        protocol: this.options.protocol || \"http\",\n        hostname: this.options.hostname,\n        port: this.options.port || undefined,\n        timeout: this.options.timeout || undefined,\n      };\n\n      if (this.requestBodyBuffers.length > 0) {\n        const bodyBuffer = Buffer.concat(\n          this.requestBodyBuffers.map((chunk) =>\n            Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk),\n          ),\n        );\n\n        const encodedBody = await httpBodyEncoder({\n          bodyBuffer,\n        });\n\n        rawInputValue.body = encodedBody;\n        rawInputValue.bodySize = bodyBuffer.length;\n      }\n\n      const inputValue = createMockInputValue(rawInputValue);\n      const mockData = await findMockResponseAsync({\n        mockRequestData: {\n          traceId: this.spanInfo.traceId,\n          spanId: this.spanInfo.spanId,\n          name:\n            rawInputValue.path || `${rawInputValue.protocol.toUpperCase()} ${rawInputValue.method}`,\n          packageName: rawInputValue.protocol,\n          packageType: PackageType.HTTP,\n          instrumentationName: this.INSTRUMENTATION_NAME,\n          submoduleName: rawInputValue.method,\n          inputValue,\n          kind: SpanKind.CLIENT,\n          stackTrace: this.stackTrace,\n        },\n        tuskDrift: this.tuskDrift,\n        inputValueSchemaMerges: {\n          body: {\n            encoding: EncodingType.BASE64,\n            decodedType: getDecodedType(\n              (rawInputValue.headers[\"content-type\"] as string | string[]) || \"\",\n            ),\n          },\n          headers: {\n            matchImportance: 0,\n          },\n        },\n      });\n      if (!mockData) {\n        logger.warn(`[TdMockClientRequest] No mock data found for ${this.method} ${this.path}`);\n        throw new Error(\n          `[TdMockClientRequest] No matching mock found for ${this.method} ${this.path}`,\n        );\n      }\n\n      this.emit(\"finish\");\n\n      // Play the response\n      process.nextTick(() => {\n        // This type is used in _handleOutboundRequestInSpan when storing output value while recording\n        this.playResponse(mockData.result as HttpClientOutputValue);\n      });\n    } catch (error) {\n      logger.error(\"[TdMockClientRequest] Error during playback:\", error);\n      this.emit(\"error\", error);\n    }\n  }\n\n  private playResponse(mockDataResult: HttpClientOutputValue): void {\n    logger.debug(`[TdMockClientRequest] Playing HTTP mock response:`, mockDataResult);\n    try {\n      // Check if this is an error response that should emit an error event\n      if (mockDataResult.errorName) {\n        logger.debug(`[TdMockClientRequest] Detected error response, emitting error event`);\n\n        // Create the appropriate error object\n        const error = new Error(mockDataResult.errorMessage);\n\n        // For connection errors, emit error immediately\n        process.nextTick(() => {\n          this.emit(\"error\", error);\n        });\n        return;\n      }\n\n      // Set up response properties\n      this.response.statusCode = mockDataResult.statusCode || 200;\n      this.response.statusMessage = mockDataResult.statusMessage || \"OK\";\n\n      // Set headers - normalize to lowercase for consistent handling\n      const headers = normalizeHeaders(mockDataResult.headers || {});\n      const filteredHeaders = { ...headers };\n\n      // Remove compression headers since we provide uncompressed data\n      const compressionHeaders = Object.keys(filteredHeaders).filter((key) =>\n        key.toLowerCase().includes(\"content-encoding\"),\n      );\n      compressionHeaders.forEach((header) => {\n        delete filteredHeaders[header];\n      });\n\n      this.response.headers = filteredHeaders;\n      this.response.rawHeaders = [];\n\n      // Convert headers to rawHeaders format\n      for (const [key, value] of Object.entries(filteredHeaders)) {\n        this.response.rawHeaders.push(key, String(value));\n      }\n\n      // Set HTTP version properties\n      this.response.httpVersion = mockDataResult.httpVersion || \"1.1\";\n      this.response.httpVersionMajor = mockDataResult.httpVersionMajor || 1;\n      this.response.httpVersionMinor = mockDataResult.httpVersionMinor || 1;\n      this.response.complete = false;\n      this.response.readable = true;\n\n      // Set up response methods\n      (this.response as any).getHeader = (name: string) => {\n        return this.response.headers?.[name.toLowerCase()];\n      };\n\n      (this.response as any).getHeaders = () => {\n        return this.response.headers || {};\n      };\n\n      (this.response as any).hasHeader = (name: string) => {\n        return Boolean(this.response.headers?.[name.toLowerCase()]);\n      };\n\n      this.res = this.response;\n      (this.response as any).req = this;\n\n      // Emit response event\n      this.emit(\"response\", this.response);\n\n      // Handle response body\n      process.nextTick(async () => {\n        await this.emitResponseBody(mockDataResult);\n      });\n    } catch (error) {\n      logger.error(\"[TdMockClientRequest] Error playing response:\", error);\n      this.emit(\"error\", error);\n    }\n  }\n\n  private async emitResponseBody(outputValue: HttpClientOutputValue): Promise<void> {\n    if (!outputValue.body) {\n      // No body data\n      this.response.push(null);\n      this.response.complete = true;\n      this.response.readable = false;\n      return;\n    }\n\n    try {\n      const bodyBuffer = Buffer.from(outputValue.body, \"base64\");\n\n      // Push data to response stream\n      this.response.push(bodyBuffer);\n    } catch (error) {\n      logger.error(\"[TdMockClientRequest] Error processing response body:\", error);\n      this.response.push(null);\n    }\n\n    // Signal end of response\n    this.response.push(null);\n    this.response.complete = true;\n    this.response.readable = false;\n  }\n\n  public setHeader(name: string, value: any): void {\n    this.headers[name.toLowerCase()] = value;\n  }\n\n  public getHeader(name: string): any {\n    return this.headers[name.toLowerCase()];\n  }\n\n  public removeHeader(name: string): void {\n    delete this.headers[name.toLowerCase()];\n  }\n\n  public getHeaders(): Record<string, any> {\n    return { ...this.headers };\n  }\n\n  public abort(): void {\n    logger.debug(\"[TdMockClientRequest] Request aborted\");\n    this.emit(\"abort\");\n    this.socket.destroy();\n  }\n\n  public setTimeout(timeout: number, callback?: () => void): this {\n    if (callback) {\n      this.once(\"timeout\", callback);\n    }\n    return this;\n  }\n\n  public destroy(error?: Error): this {\n    logger.debug(\"[TdMockClientRequest] Request destroyed\", error);\n    if (error) {\n      this.emit(\"error\", error);\n    }\n    this.emit(\"close\");\n    this.socket.destroy();\n    return this;\n  }\n\n  // Set up prototype chain to extend ClientRequest\n  private static _setupPrototype() {\n    if (!ClientRequest) {\n      ClientRequest = require(\"http\").ClientRequest;\n      Object.setPrototypeOf(TdMockClientRequest.prototype, ClientRequest.prototype);\n    }\n  }\n\n  // Call this before creating instances\n  static initialize() {\n    TdMockClientRequest._setupPrototype();\n  }\n}\n","import { SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { TdMockClientRequest, TdMockClientRequestOptions } from \"./mocks/TdMockClientRequest\";\nimport type { RequestOptions } from \"http\";\nimport { logger } from \"../../../core/utils/logger\";\n\n/**\n * HTTP Replay Hooks - Clean separation of replay logic from instrumentation\n */\nexport class HttpReplayHooks {\n  /**\n   * Extract trace ID from request headers\n   */\n  extractTraceIdFromHeaders(req: any): string | null {\n    const traceIdHeader = req.headers[\"x-td-trace-id\"] || req.headers[\"X-TD-TRACE-ID\"];\n    return traceIdHeader ? String(traceIdHeader) : null;\n  }\n\n  /**\n   * Check if we should fetch env vars from CLI\n   */\n  extractShouldFetchEnvVars(req: any): boolean {\n    const fetchHeader = req.headers[\"x-td-fetch-env-vars\"] || req.headers[\"X-TD-FETCH-ENV-VARS\"];\n    return fetchHeader === \"true\" || fetchHeader === true;\n  }\n\n  /**\n   * Handle outbound HTTP requests in replay mode\n   * Uses TdMockClientRequest for simplified mocking approach\n   */\n  handleOutboundReplayRequest({\n    method,\n    requestOptions,\n    protocol,\n    args,\n    spanInfo,\n    stackTrace,\n  }: {\n    method: string;\n    requestOptions: RequestOptions;\n    protocol: \"http\" | \"https\";\n    args: any[];\n    spanInfo?: SpanInfo;\n    stackTrace?: string;\n  }): TdMockClientRequest | undefined {\n    logger.debug(\n      `[HttpReplayHooks] Handling outbound ${protocol.toUpperCase()} ${method} request in replay mode`,\n    );\n\n    // Extract callback from args if present\n    let callback: ((res: any) => void) | undefined;\n    if (args.length > 1 && typeof args[1] === \"function\") {\n      callback = args[1];\n    } else if (args.length > 2 && typeof args[2] === \"function\") {\n      callback = args[2];\n    }\n\n    logger.debug(\"[HttpReplayHooks] Creating TdMockClientRequest for replay\");\n\n    // Prepare options for mock client request\n    const mockOptions: TdMockClientRequestOptions = {\n      path: requestOptions.path || undefined,\n      headers: requestOptions.headers || {},\n      timeout: requestOptions.timeout || undefined,\n      auth: requestOptions.auth || undefined,\n      agent: requestOptions.agent || undefined,\n      protocol,\n      hostname: requestOptions.hostname || requestOptions.host || undefined,\n      port: requestOptions.port ? Number(requestOptions.port) : undefined,\n      method,\n    };\n\n    // Create and return the mock client request\n    const mockRequest = new TdMockClientRequest(mockOptions, spanInfo, callback, stackTrace);\n\n    // For GET/HEAD requests, automatically call .end() to match native http.get() behavior\n    // Native http.get() and https.get() are convenience methods that automatically call .end()\n    if (method === \"GET\" || method === \"HEAD\") {\n      // Schedule .end() call after constructor completes\n      process.nextTick(() => {\n        mockRequest.end();\n      });\n    }\n\n    return mockRequest;\n  }\n}\n","import { SpanKind } from \"@opentelemetry/api\";\nimport { SpanUtils } from \"../../../core/tracing/SpanUtils\";\nimport { TuskDriftCore } from \"../../../core/TuskDrift\";\nimport { logger } from \"../../../core/utils/logger\";\n\nexport type OriginalFunctionCall<T> = () => T;\nexport type RecordModeHandler<T> = ({ isPreAppStart }: { isPreAppStart: boolean }) => T;\nexport type ReplayModeHandler<T> = () => T;\n\n/**\n * Utility function that abstracts the common record mode pattern of checking for current span context\n * and deciding whether to execute record mode logic or just call the original function.\n *\n * @param originalFunctionCall - Function that calls the original function when no span context exists\n * @param recordModeHandler - Function that handles the record mode logic when span context exists\n * @param spanKind - The kind of span being created\n * @returns The result from either originalFunctionCall or recordModeHandler\n */\nexport function handleRecordMode<T>({\n  originalFunctionCall,\n  recordModeHandler,\n  spanKind,\n}: {\n  originalFunctionCall: OriginalFunctionCall<T>;\n  recordModeHandler: RecordModeHandler<T>;\n  spanKind: SpanKind;\n}): T {\n  let isAppReady = false;\n  let currentSpanInfo = null;\n  try {\n    isAppReady = TuskDriftCore.getInstance().isAppReady();\n    currentSpanInfo = SpanUtils.getCurrentSpanInfo();\n  } catch (error) {\n    logger.error(`ModeUtils error checking app readiness or getting current span info:`, error);\n    return originalFunctionCall();\n  }\n\n  if (!isAppReady) {\n    // If app is not ready, call recordModeHandler with beforeAppStart=true\n    return recordModeHandler({ isPreAppStart: true });\n  }\n\n  if ((!currentSpanInfo && spanKind !== SpanKind.SERVER) || currentSpanInfo?.isPreAppStart) {\n    // If there is no current span info meaning this request isn't attached to a span (not part of an inbound request) AND isn't a server request\n    // OR the current span was created before the app started. No need to keep recording these requests\n    return originalFunctionCall();\n  } else {\n    // App is ready and we have span context, call recordModeHandler with beforeAppStart=false\n    return recordModeHandler({ isPreAppStart: false });\n  }\n}\n\n/**\n * Utility function that abstracts the common replay mode pattern of checking if the app is ready\n *\n * If this is a background request (app is ready and no parent span), calls the backgroundRequestHandler.\n * Otherwise, calls the replayModeHandler.\n * @param replayModeHandler - Function that handles the replay mode logic when app is ready\n * @param noOpRequestHandler - Function to handle no-op requests, called for background requests\n * @returns The result from either noOpRequestHandler or replayModeHandler\n */\nexport function handleReplayMode<T>({\n  replayModeHandler,\n  noOpRequestHandler,\n  isServerRequest,\n}: {\n  replayModeHandler: ReplayModeHandler<T>;\n  noOpRequestHandler: () => T;\n  isServerRequest: boolean;\n}): T {\n  const isAppReady = TuskDriftCore.getInstance().isAppReady();\n  const currentSpanInfo = SpanUtils.getCurrentSpanInfo();\n\n  // Background request: App is ready + not within a trace (no parent span) + not a server request\n  if (isAppReady && !currentSpanInfo && !isServerRequest) {\n    logger.debug(`[ModeUtils] Handling no-op request`);\n    // This is a background request (app is ready and no parent span), call the backgroundRequestHandler\n    return noOpRequestHandler();\n  }\n\n  return replayModeHandler();\n}\n","/**\n * Paths to exclude from instrumentation to avoid recording SDK export traffic\n */\n\nimport { SpanExportService } from \"@use-tusk/drift-schemas/backend/span_export_service\";\n\nexport const TUSK_SKIP_HEADER = \"x-td-skip-instrumentation\";\n\nexport function isTuskDriftIngestionUrl(urlOrPath?: string | null): boolean {\n  if (!urlOrPath) return false;\n\n  // Use typeName to avoid hardcoding the endpoint path\n  return urlOrPath.includes(SpanExportService.typeName);\n}\n","import { logger } from \"../../../core/utils/logger\";\n\n/**\n * Shimmer utility functions for wrapping and unwrapping methods\n * Based on shimmer patterns commonly used in instrumentation\n */\n\n/**\n * Check if a function has been wrapped by checking for the wrapped property\n */\nexport function isWrapped(func: any): boolean {\n  return typeof func === \"function\" && func._isWrapped === true;\n}\n\n/**\n * Wrap a method on an object with a new function\n */\nexport function wrap<T = any>(\n  target: any,\n  propertyName: string,\n  wrapper: (original: T) => T,\n): T | void {\n  if (typeof target[propertyName] !== \"function\") {\n    logger.debug(`Cannot wrap non-function property: ${propertyName}`);\n    return;\n  }\n\n  if (isWrapped(target[propertyName])) {\n    logger.debug(`Property ${propertyName} is already wrapped`);\n    return;\n  }\n\n  const original = target[propertyName];\n  const wrapped = wrapper(original);\n\n  if (typeof wrapped !== \"function\") {\n    logger.debug(`Wrapper must return a function for property: ${propertyName}`);\n    return;\n  }\n\n  // Mark as wrapped and store original\n  (wrapped as any)._isWrapped = true;\n  (wrapped as any)._original = original;\n  (wrapped as any)._propertyName = propertyName;\n\n  target[propertyName] = wrapped;\n  return wrapped;\n}\n","/**\n * Helper functions for capturing stack traces in replay mode\n *\n * TODO: Consider using a structured format for stack frames:\n *\n * {\n *   \"frames\": [\n *     {\n *       \"fileName\": \"file.js\",\n *       \"lineNumber\": 10,\n *       \"columnNumber\": 20,\n *       \"functionName\": \"functionName\"\n *     }\n *   ]\n * }\n *\n * This would allow for more efficient matching and filtering of stack frames.\n * It would also allow for more accurate stack trace reconstruction in replay mode.\n */\n\n/**\n *\n * @param excludeClassNames - Class names to exclude from the stack trace\n * @returns The stack trace as a string\n */\nexport function captureStackTrace(excludeClassNames: string[] = []): string {\n  const originalStackTraceLimit = Error.stackTraceLimit; // Default is 10\n\n  Error.stackTraceLimit = 100;\n  const s = new Error().stack || \"\";\n  Error.stackTraceLimit = originalStackTraceLimit;\n\n  const defaultExcludes = [\n    \"drift-node-sdk/src/instrumentation\",\n    \"drift-node-sdk/src/core\",\n    \"node_modules/@use-tusk\",\n  ];\n\n  const allExcludes = [...defaultExcludes, ...excludeClassNames];\n\n  return s\n    .split(\"\\n\")\n    .slice(2) // Skip \"Error\" and capture method lines\n    .filter((l) => !allExcludes.some((exclude) => l.includes(exclude)))\n    .join(\"\\n\");\n}\n","import * as crypto from \"crypto\";\nimport jp from \"jsonpath\";\nimport { SpanKind } from \"@opentelemetry/api\";\nimport {\n  HttpClientInputValue,\n  HttpClientOutputValue,\n  HttpServerInputValue,\n  HttpServerOutputValue,\n} from \"./types\";\nimport { OneOf } from \"src/core/types\";\nimport { TransformConfigs } from \"../types\";\n\nexport interface HttpTransform {\n  matcher: HttpTransformMatcher;\n  action: HttpTransformAction;\n}\n\n/** A matcher config. An element is matched iff *all* conditions specified\n * here are true. Only one target field is allowed, but any of the common\n * fields may be provided.\n * */\nexport type HttpTransformMatcher = {\n  /** Request direction, relative to this service. */\n  direction: \"inbound\" | \"outbound\";\n  /** HTTP method: array of methods like [\"GET\", \"POST\"]. Empty array matches\n   * all methods. */\n  method?: (\"GET\" | \"POST\" | \"DELETE\" | \"PUT\")[];\n  /** URL path pattern: \"/api/user/*\" */\n  pathPattern?: string;\n  /** Host pattern. e.g. \"api.example.com\" */\n  host?: string;\n} & OneOf<HttpTransformMatchingFields>;\n\n/** Target fields. See doc for more info on why it's split and not part of the\n * matcher configs . */\nexport type HttpTransformMatchingFields = {\n  /** JSONPath expression e.g. \"$.user.password\" */\n  jsonPath: string;\n  /** Query parameter name */\n  queryParam: string;\n  /** Header name */\n  headerName: string;\n  /** Transform the entire URL path */\n  urlPath: boolean;\n  /** Transform the entire request/response body */\n  fullBody: boolean;\n};\n\nexport type HttpTransformAction =\n  | {\n      type: \"redact\";\n      /** Prefix for hash (default: \"REDACTED_\") */\n      hashPrefix?: string;\n    }\n  | {\n      type: \"mask\";\n      /** Character to use for masking (default: \"*\") */\n      maskChar?: string;\n    }\n  | {\n      type: \"replace\";\n      /** Static replacement value (required) */\n      replaceWith: string;\n    }\n  | {\n      type: \"drop\";\n    };\n\nexport interface HttpSpanData {\n  traceId: string;\n  spanId: string;\n  kind: SpanKind;\n  protocol?: HttpClientInputValue[\"protocol\"];\n  inputValue?: HttpClientInputValue | HttpServerInputValue;\n  outputValue?: HttpClientOutputValue | HttpServerOutputValue;\n  transformMetadata?: {\n    transformed: boolean;\n    actions: TransformAction[];\n  };\n}\n\ntype CompiledTransform = (span: HttpSpanData) => TransformAction | undefined;\n\ntype TransformAction = {\n  type: \"redact\" | \"mask\" | \"replace\" | \"drop\";\n  field: string;\n  reason: string;\n  description?: string;\n};\n\ntype ActionFunction = (value: string) => string;\n\ntype MatcherFunction = (span: HttpSpanData) => boolean;\n\n/**\n * Creates an empty HttpClientInputValue object for dropped spans\n */\nfunction createEmptyClientInputValue(\n  protocol?: HttpClientInputValue[\"protocol\"],\n): HttpClientInputValue {\n  return {\n    protocol: protocol || \"http\",\n    method: \"\",\n    headers: {},\n  };\n}\n\n/**\n * Creates an empty HttpServerInputValue object for dropped spans\n */\nfunction createEmptyServerInputValue(): HttpServerInputValue {\n  return {\n    method: \"\",\n    url: \"\",\n    target: \"\",\n    headers: {},\n    body: \"\",\n    bodySize: 0,\n    httpVersion: \"\",\n  };\n}\n\n/**\n * Creates an empty HttpClientOutputValue object for dropped spans\n */\nfunction createEmptyClientOutputValue(): HttpClientOutputValue {\n  return {\n    httpVersion: \"1.0\",\n    httpVersionMajor: 1,\n    httpVersionMinor: 0,\n    complete: true,\n    readable: true,\n    headers: {},\n  };\n}\n\n/**\n * Creates an empty HttpServerOutputValue object for dropped spans\n */\nfunction createEmptyServerOutputValue(): HttpServerOutputValue {\n  return {\n    headers: {},\n  };\n}\n\nexport class HttpTransformEngine {\n  private compiledTransforms: CompiledTransform[] = [];\n\n  constructor(transformConfigs?: TransformConfigs) {\n    if (transformConfigs?.http) {\n      this.compiledTransforms = transformConfigs.http.map((transform) =>\n        this.compileHttpTransform(transform),\n      );\n    }\n  }\n\n  shouldDropInboundRequest(\n    method: string,\n    url: string,\n    headers?: Record<string, string | string[] | undefined>,\n    body?: string,\n  ): boolean {\n    const testSpan: HttpSpanData = {\n      traceId: \"\",\n      spanId: \"\",\n      kind: SpanKind.SERVER,\n      protocol: \"http\",\n      inputValue: {\n        method,\n        url,\n        target: url,\n        headers: headers || {},\n        httpVersion: \"1.1\",\n        body,\n        bodySize: 0,\n      } as HttpServerInputValue,\n    };\n\n    for (const compiledTransform of this.compiledTransforms) {\n      const action = compiledTransform(testSpan);\n      if (action && action.type === \"drop\") {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  shouldDropOutboundRequest(inputValue: HttpClientInputValue): boolean {\n    const clonedInputValue = JSON.parse(JSON.stringify(inputValue)) as HttpClientInputValue;\n\n    const testSpan: HttpSpanData = {\n      traceId: \"\",\n      spanId: \"\",\n      kind: SpanKind.CLIENT,\n      protocol: inputValue.protocol || \"http\",\n      inputValue: clonedInputValue,\n    };\n\n    for (const compiledTransform of this.compiledTransforms) {\n      const action = compiledTransform(testSpan);\n      if (action && action.type === \"drop\") {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  applyTransforms(spanData: HttpSpanData): HttpSpanData {\n    const actions: TransformAction[] = [];\n\n    for (const compiledTransform of this.compiledTransforms) {\n      const action = compiledTransform(spanData);\n      if (action) {\n        actions.push(action);\n      }\n    }\n\n    if (actions.length > 0) {\n      spanData.transformMetadata = {\n        transformed: true,\n        actions,\n      };\n    }\n\n    return spanData;\n  }\n\n  private compileHttpTransform(transform: HttpTransform): CompiledTransform {\n    const { matcher, action } = transform;\n\n    const matcherFunction = this.compileMatcher(matcher);\n    if (action.type === \"drop\") {\n      return (span) => {\n        if (!matcherFunction(span)) {\n          return;\n        }\n\n        // Drop all sensitive data by replacing with empty objects\n        if (span.inputValue) {\n          span.inputValue =\n            span.kind === SpanKind.CLIENT\n              ? createEmptyClientInputValue(span.protocol)\n              : createEmptyServerInputValue();\n        }\n\n        if (span.outputValue) {\n          span.outputValue =\n            span.kind === SpanKind.CLIENT\n              ? createEmptyClientOutputValue()\n              : createEmptyServerOutputValue();\n        }\n\n        return {\n          type: \"drop\",\n          field: \"entire_span\",\n          reason: \"transforms\",\n          description: this.describeTransform(transform),\n        };\n      };\n    }\n\n    const compiledAction = this.compileAction(matcher, action);\n    const fieldDescription = this.getFieldDescription(matcher);\n\n    return (span) => {\n      if (!matcherFunction(span)) {\n        return;\n      }\n\n      const result = compiledAction(span);\n      if (result) {\n        return {\n          type: action.type,\n          field: fieldDescription,\n          reason: \"transforms\",\n        };\n      }\n\n      return;\n    };\n  }\n\n  private compileAction(\n    matcher: HttpTransformMatcher,\n    action: HttpTransformAction,\n  ): (span: HttpSpanData) => boolean {\n    const actionFunction = this.compileActionFunction(action);\n\n    if (matcher.jsonPath) {\n      return this.compileJsonPathAction(matcher.jsonPath, actionFunction, matcher.direction);\n    }\n    if (matcher.queryParam) {\n      return this.compileQueryParamAction(matcher.queryParam, actionFunction, matcher.direction);\n    }\n    if (matcher.headerName) {\n      return this.compileHeaderAction(matcher.headerName, actionFunction, matcher.direction);\n    }\n    if (matcher.urlPath) {\n      return this.compileUrlPathAction(actionFunction, matcher.direction);\n    }\n    if (matcher.fullBody) {\n      return this.compileFullBodyAction(actionFunction, matcher.direction);\n    }\n\n    return () => false;\n  }\n\n  private compileMatcher(matcher: HttpTransformMatcher): MatcherFunction {\n    const checks: MatcherFunction[] = [];\n\n    if (matcher.direction === \"outbound\") {\n      checks.push((span) => span.kind === SpanKind.CLIENT);\n    } else if (matcher.direction === \"inbound\") {\n      checks.push((span) => span.kind === SpanKind.SERVER);\n    }\n\n    if (matcher.method) {\n      // Empty array means match all methods (wildcard)\n      if (matcher.method.length === 0) {\n        // No check needed - matches all methods\n      } else {\n        const methods = matcher.method.map((method) => method.toUpperCase());\n        checks.push((span) => {\n          const spanMethod = span.inputValue?.method?.toUpperCase();\n          return spanMethod ? methods.includes(spanMethod) : false;\n        });\n      }\n    }\n\n    if (matcher.pathPattern) {\n      try {\n        const pattern = new RegExp(matcher.pathPattern);\n        if (matcher.direction === \"outbound\") {\n          checks.push((span) => {\n            const path = (span.inputValue as HttpClientInputValue)?.path;\n            return path ? pattern.test(path) : false;\n          });\n        } else {\n          checks.push((span) => {\n            const path = (span.inputValue as HttpServerInputValue)?.url;\n            return path ? pattern.test(path) : false;\n          });\n        }\n      } catch (error) {\n        throw new Error(\n          `Invalid path pattern \"${matcher.pathPattern}\": ${error instanceof Error ? error.message : String(error)}`,\n        );\n      }\n    }\n\n    if (matcher.host) {\n      try {\n        const hostPattern = new RegExp(matcher.host);\n        if (matcher.direction === \"outbound\") {\n          checks.push((span) => {\n            const hostname = (span.inputValue as HttpClientInputValue)?.hostname;\n            return hostname ? hostPattern.test(hostname) : false;\n          });\n        } else {\n          checks.push((span) => {\n            const url = (span.inputValue as HttpServerInputValue)?.url;\n            if (!url) {\n              return false;\n            }\n            try {\n              const hostname = new URL(url, \"http://localhost\").hostname;\n              return hostPattern.test(hostname);\n            } catch {\n              return false;\n            }\n          });\n        }\n      } catch (error) {\n        throw new Error(\n          `Invalid host pattern \"${matcher.host}\": ${error instanceof Error ? error.message : String(error)}`,\n        );\n      }\n    }\n\n    if (checks.length === 0) {\n      return () => true;\n    }\n    if (checks.length === 1) {\n      return checks[0];\n    }\n\n    return (span) => checks.every((check) => check(span));\n  }\n\n  private compileJsonPathAction(\n    jsonPath: string,\n    actionFunction: ActionFunction,\n    direction: HttpTransformMatcher[\"direction\"],\n  ): (span: HttpSpanData) => boolean {\n    const selector = direction === \"inbound\" ? \"inputValue\" : \"outputValue\";\n    return (span) => {\n      const target = span[selector];\n      if (!target) {\n        return false;\n      }\n\n      try {\n        // Access body based on direction\n        const body = direction === \"inbound\"\n          ? (target as HttpServerInputValue).body\n          : (target as HttpClientOutputValue | HttpServerOutputValue).body;\n\n        if (!body) {\n          return false;\n        }\n\n        // Body is base64-encoded, decode and parse it\n        let bodyObj;\n        if (typeof body === \"string\") {\n          try {\n            const decoded = Buffer.from(body, \"base64\").toString(\"utf8\");\n            bodyObj = JSON.parse(decoded);\n          } catch (e) {\n            // If decoding/parsing fails, body might not be JSON\n            return false;\n          }\n        } else {\n          bodyObj = body;\n        }\n\n        const nodes = jp.apply(bodyObj, jsonPath, actionFunction);\n\n        // Re-encode the modified body as base64\n        if (typeof body === \"string\" && nodes.length > 0) {\n          const reencoded = Buffer.from(JSON.stringify(bodyObj)).toString(\"base64\");\n          if (direction === \"inbound\") {\n            (target as HttpServerInputValue).body = reencoded;\n          } else {\n            (target as HttpClientOutputValue | HttpServerOutputValue).body = reencoded;\n          }\n        }\n\n        return nodes.length > 0;\n      } catch (error) {\n        return false;\n      }\n    };\n  }\n\n  private compileHeaderAction(\n    headerName: string,\n    actionFunction: ActionFunction,\n    _: HttpTransformMatcher[\"direction\"],\n  ): (span: HttpSpanData) => boolean {\n    const lowerHeader = headerName.toLowerCase();\n\n    return (span) => {\n      // For inbound: transform request headers (SERVER span inputValue)\n      // For outbound: transform request headers (CLIENT span inputValue)\n      // Note: We always transform the request headers, which is inputValue for both directions\n      const target = span.inputValue;\n      if (!target?.headers) {\n        return false;\n      }\n\n      let applied = false;\n      for (const key of Object.keys(target.headers)) {\n        if (key.toLowerCase() === lowerHeader) {\n          const headerValue = target.headers[key];\n          if (typeof headerValue === \"string\") {\n            (target.headers as Record<string, string>)[key] = actionFunction(headerValue);\n            applied = true;\n          }\n        }\n      }\n      return applied;\n    };\n  }\n\n  private compileQueryParamAction(\n    queryParam: string,\n    actionFunction: ActionFunction,\n    direction: HttpTransformMatcher[\"direction\"],\n  ): (span: HttpSpanData) => boolean {\n    return (span) => {\n      if (!span.inputValue) {\n        return false;\n      }\n\n      return this.transformQueryParamInData(span.inputValue, queryParam, actionFunction, direction);\n    };\n  }\n\n  private compileFullBodyAction(\n    actionFunction: ActionFunction,\n    direction: HttpTransformMatcher[\"direction\"],\n  ): (span: HttpSpanData) => boolean {\n    const selector = direction === \"inbound\" ? \"inputValue\" : \"outputValue\";\n\n    return (span) => {\n      const target = span[selector];\n      if (!target || !(\"body\" in target) || target.body === undefined) {\n        return false;\n      }\n\n      if (direction === \"outbound\") {\n        // Output bodies are base64-encoded strings - decode, transform, re-encode\n        const outputTarget = target as HttpClientOutputValue | HttpServerOutputValue;\n        if (typeof outputTarget.body === \"string\") {\n          try {\n            const decoded = Buffer.from(outputTarget.body, \"base64\").toString(\"utf8\");\n            const transformed = actionFunction(decoded);\n            outputTarget.body = Buffer.from(transformed).toString(\"base64\");\n          } catch (error) {\n            // If not valid base64, treat as plain string\n            outputTarget.body = Buffer.from(actionFunction(outputTarget.body)).toString(\"base64\");\n          }\n        }\n      } else {\n        // Input bodies can be either objects or base64-encoded strings\n        const inputTarget = target as HttpServerInputValue;\n        if (typeof inputTarget.body === \"string\") {\n          try {\n            const decoded = Buffer.from(inputTarget.body, \"base64\").toString(\"utf8\");\n            const transformed = actionFunction(decoded);\n            inputTarget.body = Buffer.from(transformed).toString(\"base64\");\n          } catch (error) {\n            // If not valid base64, treat as plain string\n            inputTarget.body = Buffer.from(actionFunction(inputTarget.body)).toString(\"base64\");\n          }\n        } else if (typeof inputTarget.body === \"object\") {\n          // Body is a plain object - transform it directly\n          const bodyStr = JSON.stringify(inputTarget.body);\n          const transformed = actionFunction(bodyStr);\n          // Replace with transformed value (could be string or parsed back)\n          try {\n            inputTarget.body = JSON.parse(transformed);\n          } catch {\n            // If transformed value is not JSON, store as-is\n            inputTarget.body = transformed as any;\n          }\n        }\n      }\n      return true;\n    };\n  }\n\n  private compileUrlPathAction(\n    actionFunction: ActionFunction,\n    direction: HttpTransformMatcher[\"direction\"],\n  ): (span: HttpSpanData) => boolean {\n    return (span) => {\n      if (!span.inputValue) {\n        return false;\n      }\n      return this.transformUrlPathInData(span.inputValue, actionFunction, direction);\n    };\n  }\n\n  private transformQueryParamInData(\n    data: HttpClientInputValue | HttpServerInputValue,\n    queryParam: string,\n    actionFunction: ActionFunction,\n    direction: HttpTransformMatcher[\"direction\"],\n  ): boolean {\n    if (!data) {\n      return false;\n    }\n\n    let applied = false;\n\n    if (direction === \"outbound\") {\n      const clientData = data as HttpClientInputValue;\n      if (clientData.path && typeof clientData.path === \"string\") {\n        const url = new URL(clientData.path, \"http://localhost\");\n        if (url.searchParams.has(queryParam)) {\n          const oldValue = url.searchParams.get(queryParam);\n          if (oldValue !== null) {\n            const newValue = actionFunction(oldValue);\n            url.searchParams.set(queryParam, newValue);\n            clientData.path = url.pathname + url.search;\n            applied = true;\n          }\n        }\n      }\n    } else {\n      const serverData = data as HttpServerInputValue;\n      // Transform url field\n      if (serverData.url && typeof serverData.url === \"string\") {\n        try {\n          const url = new URL(serverData.url);\n          if (url.searchParams.has(queryParam)) {\n            const oldValue = url.searchParams.get(queryParam);\n            if (oldValue !== null) {\n              const newValue = actionFunction(oldValue);\n              url.searchParams.set(queryParam, newValue);\n              serverData.url = url.toString();\n              applied = true;\n            }\n          }\n        } catch {\n          // ignore\n        }\n      }\n      // Transform target field\n      if (serverData.target && typeof serverData.target === \"string\") {\n        try {\n          const url = new URL(serverData.target, \"http://localhost\");\n          if (url.searchParams.has(queryParam)) {\n            const oldValue = url.searchParams.get(queryParam);\n            if (oldValue !== null) {\n              const newValue = actionFunction(oldValue);\n              url.searchParams.set(queryParam, newValue);\n              serverData.target = url.pathname + url.search;\n              applied = true;\n            }\n          }\n        } catch {\n          // ignore\n        }\n      }\n    }\n\n    return applied;\n  }\n\n  private transformUrlPathInData(\n    data: HttpClientInputValue | HttpServerInputValue,\n    actionFunction: ActionFunction,\n    direction: HttpTransformMatcher[\"direction\"],\n  ): boolean {\n    if (!data) {\n      return false;\n    }\n\n    let applied = false;\n\n    if (direction === \"outbound\") {\n      const clientData = data as HttpClientInputValue;\n      if (clientData.path && typeof clientData.path === \"string\") {\n        clientData.path = actionFunction(clientData.path);\n        applied = true;\n      }\n    } else {\n      const serverData = data as HttpServerInputValue;\n      if (serverData.url && typeof serverData.url === \"string\") {\n        serverData.url = actionFunction(serverData.url);\n        applied = true;\n      }\n      if (serverData.target && typeof serverData.target === \"string\") {\n        serverData.target = actionFunction(serverData.target);\n        applied = true;\n      }\n    }\n\n    return applied;\n  }\n\n  private compileActionFunction(action: HttpTransformAction): ActionFunction {\n    switch (action.type) {\n      case \"redact\":\n        return (value) => {\n          const prefix = action.hashPrefix || \"REDACTED_\";\n          const hash = crypto.createHash(\"sha256\").update(String(value)).digest(\"hex\");\n          return `${prefix}${hash.substring(0, 12)}...`;\n        };\n      case \"mask\":\n        return (value) => {\n          const maskChar = action.maskChar || \"*\";\n          return maskChar.repeat(value.length);\n        };\n      case \"replace\":\n        return () => action.replaceWith;\n      default:\n        return (value) => value;\n    }\n  }\n\n  private getFieldDescription(matcher: HttpTransformMatcher): string {\n    if (matcher.jsonPath) return `jsonPath:${matcher.jsonPath}`;\n    if (matcher.queryParam) return `queryParam:${matcher.queryParam}`;\n    if (matcher.headerName) return `header:${matcher.headerName}`;\n    if (matcher.urlPath) return \"urlPath\";\n    if (matcher.fullBody) return \"fullBody\";\n    return \"unknown\";\n  }\n\n  private describeTransform(transform: HttpTransform): string {\n    return JSON.stringify(transform.matcher);\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { TdInstrumentationConfig } from \"../../core/baseClasses/TdInstrumentationAbstract\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode, context } from \"@opentelemetry/api\";\nimport type {\n  ClientRequest,\n  IncomingHttpHeaders,\n  IncomingMessage,\n  RequestOptions,\n  Server,\n  ServerResponse,\n} from \"http\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport {\n  combineChunks,\n  getDecodedType,\n  httpBodyEncoder,\n  normalizeHeaders,\n  ACCEPTABLE_CONTENT_TYPES,\n} from \"./utils\";\nimport { HttpReplayHooks } from \"./HttpReplayHooks\";\nimport {\n  HttpClientInputValue,\n  HttpServerInputValue,\n  HttpModuleExports,\n  HttpsModuleExports,\n  HttpClientOutputValue,\n  HttpServerOutputValue,\n  HttpProtocol,\n} from \"./types\";\nimport {\n  wrap,\n  TUSK_SKIP_HEADER,\n  handleRecordMode,\n  handleReplayMode,\n  isTuskDriftIngestionUrl,\n  captureStackTrace,\n} from \"../../core/utils\";\nimport { PackageType, StatusCode } from \"@use-tusk/drift-schemas/core/span\";\nimport {\n  EncodingType,\n  JsonSchemaHelper,\n  SchemaMerges,\n} from \"../../../core/tracing/JsonSchemaHelper\";\nimport {\n  shouldSample,\n  OriginalGlobalUtils,\n  logger,\n  isEsm,\n  isNextJsRuntime,\n} from \"../../../core/utils\";\nimport { EnvVarTracker } from \"../../core/trackers\";\nimport { HttpSpanData, HttpTransformEngine } from \"./HttpTransformEngine\";\nimport { TransformConfigs } from \"../types\";\nimport { TraceBlockingManager } from \"src/core/tracing/TraceBlockingManager\";\n\nexport interface HttpInstrumentationConfig extends TdInstrumentationConfig {\n  requestHook?: (request: any) => void;\n  responseHook?: (response: any) => void;\n  mode: TuskDriftMode;\n  transforms?: TransformConfigs;\n}\n\nexport class HttpInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"HttpInstrumentation\";\n  private mode: TuskDriftMode;\n  private replayHooks: HttpReplayHooks;\n  private tuskDrift: TuskDriftCore;\n  private transformEngine: HttpTransformEngine;\n\n  constructor(config: HttpInstrumentationConfig) {\n    super(\"http\", config);\n    this.mode = config.mode;\n    this.replayHooks = new HttpReplayHooks();\n    this.tuskDrift = TuskDriftCore.getInstance();\n    this.transformEngine = new HttpTransformEngine(config.transforms);\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"http\",\n        supportedVersions: [\"*\"],\n        patch: (moduleExports: HttpModuleExports) => this._patchHttpModule(moduleExports, \"http\"),\n      }),\n      new TdInstrumentationNodeModule({\n        name: \"https\",\n        supportedVersions: [\"*\"],\n        patch: (moduleExports: HttpsModuleExports) => this._patchHttpModule(moduleExports, \"https\"),\n      }),\n    ];\n  }\n\n  private _patchHttpModule(\n    httpModule: HttpModuleExports | HttpsModuleExports,\n    protocol: HttpProtocol,\n  ): HttpModuleExports | HttpsModuleExports {\n    const protocolUpper = protocol.toUpperCase();\n    logger.debug(`[HttpInstrumentation] Patching ${protocolUpper} module in ${this.mode} mode`);\n\n    if (this.isModulePatched(httpModule)) {\n      logger.debug(`[HttpInstrumentation] ${protocolUpper} module already patched, skipping`);\n      return httpModule;\n    }\n\n    if (isEsm(httpModule)) {\n      // ESM Case: Also set wrapped methods on the default export\n      // In ESM: import http from 'http' gives { default: <http module>, request: ..., get: ... }\n      // Users may access http.request (namespace) OR http.default.request (default export)\n      // We need to ensure both are wrapped\n      if (httpModule.default) {\n        // Should always be true in ESM mode, but just in case\n        this._wrap(httpModule.default, \"request\", this._getRequestPatchFn(protocol));\n        this._wrap(httpModule.default, \"get\", this._getGetPatchFn(protocol));\n      }\n    } else {\n      // Wrap methods on the http/https module namespace\n      this._wrap(httpModule, \"request\", this._getRequestPatchFn(protocol));\n      this._wrap(httpModule, \"get\", this._getGetPatchFn(protocol));\n    }\n\n    // Wrap Server.prototype.emit (works the same for both CommonJS and ESM)\n    // This is a prototype method, so no special ESM handling needed\n    const HttpServer = httpModule.Server;\n    if (HttpServer && HttpServer.prototype) {\n      this._wrap(HttpServer.prototype, \"emit\", this._getServerEmitPatchFn(protocol));\n      logger.debug(`[HttpInstrumentation] Wrapped Server.prototype.emit for ${protocolUpper}`);\n    }\n\n    this.markModuleAsPatched(httpModule);\n    logger.debug(`[HttpInstrumentation] ${protocolUpper} module patching complete`);\n\n    return httpModule;\n  }\n\n  private _createServerSpan({\n    req,\n    res,\n    originalHandler,\n    protocol,\n  }: {\n    req: IncomingMessage;\n    res: ServerResponse;\n    originalHandler: Function;\n    protocol: HttpProtocol;\n  }): void {\n    // Don't record/replay if this is a nextJs runtime\n    // We have a nextJs instrumentation to handle this\n    if (isNextJsRuntime()) {\n      logger.debug(\n        `[HttpInstrumentation] Skipping recording/replaying for nextJs runtime, handled by nextJs instrumentation`,\n      );\n      return originalHandler.call(this);\n    }\n\n    const method = req.method || \"GET\";\n    const url = req.url || \"/\";\n    const target = req.url || \"/\";\n    const spanProtocol = this._normalizeProtocol(protocol, \"http\");\n\n    // Ignore drift ingestion endpoints (avoid recording SDK export traffic)\n    if (isTuskDriftIngestionUrl(url) || isTuskDriftIngestionUrl(target)) {\n      logger.debug(`[HttpInstrumentation] Ignoring drift ingestion endpoints`);\n      return originalHandler.call(this);\n    }\n\n    // Check if transforms want to drop this inbound request entirely (prevents trace creation)\n    if (this.transformEngine.shouldDropInboundRequest(method, url, req.headers)) {\n      logger.debug(\n        `[HttpInstrumentation] Dropping inbound request due to transforms: ${method} ${url}`,\n      );\n      return originalHandler.call(this);\n    }\n\n    // Handle replay mode using replay hooks (only if app is ready)\n    if (this.mode === TuskDriftMode.REPLAY) {\n      return handleReplayMode({\n        // Shouldn't be used for server requests\n        noOpRequestHandler: () => {\n          throw new Error(\n            `[HttpInstrumentation] Should never call noOpRequestHandler for server requests`,\n          );\n        },\n        isServerRequest: true,\n        replayModeHandler: () => {\n          // Remove accept-encoding header to prevent compression during replay\n          // since we're providing already-decompressed data\n          if (req.headers[\"accept-encoding\"]) {\n            delete req.headers[\"accept-encoding\"];\n          }\n\n          // Build input value object for server request in replay mode\n          const fullUrl = `${spanProtocol}://${req.headers.host || \"localhost\"}${url}`;\n          const inputValue = {\n            method,\n            url: fullUrl,\n            target,\n            headers: req.headers,\n            httpVersion: req.httpVersion,\n            remoteAddress: req.socket?.remoteAddress,\n            remotePort: req.socket?.remotePort,\n          };\n\n          // Set replay trace context (replaces previous replayHooks-only call)\n          const replayTraceId = this.replayHooks.extractTraceIdFromHeaders(req);\n          if (!replayTraceId) {\n            logger.debug(`[HttpInstrumentation] No trace id found in headers`, req.headers);\n            // No trace context; proceed without span\n            return originalHandler.call(this);\n          }\n\n          logger.debug(`[HttpInstrumentation] Setting replay trace id`, replayTraceId);\n\n          // Fetch env vars from CLI if requested\n          const shouldFetch = this.replayHooks.extractShouldFetchEnvVars(req);\n          if (shouldFetch) {\n            try {\n              const envVars = this.tuskDrift.requestEnvVarsSync(replayTraceId);\n              EnvVarTracker.setEnvVars(replayTraceId, envVars);\n              logger.debug(`[HttpInstrumentation] Fetched env vars from CLI for trace ${replayTraceId}`);\n            } catch (error) {\n              logger.error(`[HttpInstrumentation] Failed to fetch env vars from CLI:`, error);\n            }\n          }\n\n          const ctxWithReplayTraceId = SpanUtils.setCurrentReplayTraceId(replayTraceId);\n\n          if (!ctxWithReplayTraceId) {\n            // Replay mode, okay to throw error\n            throw new Error(\"Error setting current replay trace id\");\n          }\n\n          return context.with(ctxWithReplayTraceId, () => {\n            return SpanUtils.createAndExecuteSpan(\n              this.mode,\n              () => originalHandler.call(this),\n              {\n                name: `${target}`,\n                kind: SpanKind.SERVER,\n                packageName: spanProtocol,\n                submodule: method,\n                packageType: PackageType.HTTP,\n                instrumentationName: this.INSTRUMENTATION_NAME,\n                inputValue,\n                inputSchemaMerges: {\n                  headers: {\n                    matchImportance: 0,\n                  },\n                },\n                isPreAppStart: false,\n              },\n              (spanInfo) => {\n                // Use the full server-span handler to capture input/output and end the span\n                return this._handleInboundRequestInSpan({\n                  req,\n                  res,\n                  originalHandler,\n                  spanInfo,\n                  inputValue,\n                  schemaMerges: {\n                    headers: {\n                      matchImportance: 0,\n                    },\n                  },\n                  protocol: spanProtocol,\n                });\n              },\n            );\n          });\n        },\n      });\n    } else if (this.mode === TuskDriftMode.RECORD) {\n      // Skip CORS preflight in RECORD mode (don't create a span)\n      if (method.toUpperCase() === \"OPTIONS\" || !!req.headers[\"access-control-request-method\"]) {\n        return originalHandler.call(this);\n      }\n\n      logger.debug(`[HttpInstrumentation] Creating server span for ${method} ${url}`);\n      return handleRecordMode({\n        originalFunctionCall: () => originalHandler.call(this),\n        recordModeHandler: ({ isPreAppStart }) => {\n          // Build input value object for server request\n          const fullUrl = `${spanProtocol}://${req.headers.host || \"localhost\"}${url}`;\n          const filteredHeaders = { ...req.headers };\n          // Remove accept-encoding header (case-insensitive) to prevent compression during replay\n          //\n          // During RECORD mode, responses are compressed by the server (gzip/deflate/br),\n          // then decompressed by our instrumentation and stored as uncompressed base64 data.\n          // During REPLAY mode, if the client sends Accept-Encoding headers, the server's\n          // compression middleware will compress our already-decompressed response data,\n          // resulting in double-compressed garbage that the client can't decode.\n          //\n          // Therefore, we remove all Accept-Encoding headers during replay so compression middleware\n          // skips compression and returns our stored decompressed data directly.\n          // IMPORTANT: only update the headers object we are recording, not the original request headers\n          Object.keys(filteredHeaders).forEach((key) => {\n            if (key.toLowerCase() === \"accept-encoding\") {\n              delete filteredHeaders[key];\n            }\n          });\n          const inputValue = {\n            method,\n            url: fullUrl,\n            target,\n            headers: filteredHeaders,\n            httpVersion: req.httpVersion,\n            remoteAddress: req.socket?.remoteAddress,\n            remotePort: req.socket?.remotePort,\n          };\n\n          logger.debug(\n            `[HttpInstrumentation] Http inbound request arriving, inputValue: ${JSON.stringify(inputValue)}`,\n          );\n\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => originalHandler.call(this),\n            {\n              name: `${target}`,\n              kind: SpanKind.SERVER,\n              packageName: spanProtocol,\n              packageType: PackageType.HTTP,\n              submodule: method,\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue,\n              inputSchemaMerges: {\n                headers: {\n                  matchImportance: 0,\n                },\n              },\n              isPreAppStart,\n            },\n            (spanInfo) => {\n              return this._handleInboundRequestInSpan({\n                req,\n                res,\n                originalHandler,\n                spanInfo,\n                inputValue, // Body will be populated by _captureServerRequestBody in _handleInboundRequestInSpan\n                schemaMerges: {\n                  headers: {\n                    matchImportance: 0,\n                  },\n                },\n                protocol: spanProtocol,\n              });\n            },\n          );\n        },\n        spanKind: SpanKind.SERVER,\n      });\n    } else {\n      // Should never happen since we're only patching record and replay modes\n      return originalHandler.call(this);\n    }\n  }\n\n  /**\n   * Handles server-side request processing within a span context.\n   *\n   * TypeScript typing notes:\n   * - req: IncomingMessage - We can use proper typing because we only patch req.read() with signature-compatible changes\n   * - res: any - We must use 'any' because we patch res.end() with incompatible signatures (async function vs sync overloads)\n   *\n   * NOTE: addAttributes() will override the current attributes so we need to pass current schema merges\n   * to make sure we don't lose any information\n   */\n  private _handleInboundRequestInSpan({\n    req,\n    res,\n    originalHandler,\n    spanInfo,\n    inputValue,\n    schemaMerges,\n    protocol,\n  }: {\n    req: IncomingMessage;\n    res: ServerResponse;\n    originalHandler: Function;\n    spanInfo: SpanInfo;\n    inputValue: {\n      method: string;\n      url: string;\n      target: string;\n      headers: IncomingHttpHeaders;\n      httpVersion: string;\n      remoteAddress?: string;\n      remotePort?: number;\n    };\n    schemaMerges: SchemaMerges | undefined;\n    protocol: HttpProtocol;\n  }) {\n    const self = this;\n    const spanProtocol = this._normalizeProtocol(protocol, \"http\");\n    // Bind context to request/response objects\n    context.bind(spanInfo.context, req);\n    context.bind(spanInfo.context, res);\n\n    // Track the complete input value (will be updated when body is captured)\n    let completeInputValue: any = inputValue;\n\n    // Capture request body if it exists\n    // NOTE: IncomingMessage doesn't have a .body property - we need to capture it from the stream\n    // This patches req.read() and listens for 'data'/'end' events to collect body chunks as they arrive\n    // Handles both read() consumption and pipe/stream consumption patterns used by different frameworks\n    this._captureServerRequestBody(req, spanInfo, inputValue, schemaMerges, (updatedInputValue) => {\n      completeInputValue = updatedInputValue;\n    });\n\n    // Track response completion\n    const originalEnd = res.end.bind(res);\n    const responseChunks: (string | Buffer)[] = [];\n\n    // Patch response write to capture body with Buffer support\n    const originalWrite = res.write?.bind(res);\n    if (originalWrite) {\n      res.write = function (chunk: string | Buffer, encoding?: any, callback?: any) {\n        if (chunk) {\n          responseChunks.push(chunk);\n        }\n        return originalWrite.call(this, chunk, encoding, callback);\n      };\n    }\n\n    res.end = function (chunk: any, encoding?: any, callback?: any) {\n      const statusCode = res.statusCode;\n\n      // Capture any final response data\n      if (chunk) {\n        responseChunks.push(chunk);\n      }\n\n      logger.debug(\n        `[HttpInstrumentation] Server request completed: ${statusCode} (${SpanUtils.getTraceInfo()})`,\n      );\n\n      // Process response body asynchronously without blocking\n      process.nextTick(async () => {\n        // Normalize headers to lowercase for consistent access\n        const rawHeaders = res.getHeaders ? (res.getHeaders() as Record<string, string>) : {};\n        const normalizedHeaders = normalizeHeaders(rawHeaders);\n\n        const outputValue: HttpServerOutputValue = {\n          statusCode,\n          statusMessage: res.statusMessage,\n          headers: normalizedHeaders,\n        };\n\n        // Process response body if we have chunks\n        if (responseChunks.length > 0) {\n          try {\n            const responseBuffer = combineChunks(responseChunks);\n            const contentEncoding = outputValue.headers?.[\"content-encoding\"];\n\n            const encodedBody = await httpBodyEncoder({\n              bodyBuffer: responseBuffer,\n              contentEncoding,\n            });\n\n            // Store parsed body data\n            outputValue.body = encodedBody;\n            outputValue.bodySize = responseBuffer.length;\n          } catch (error) {\n            logger.error(`[HttpInstrumentation] Error processing server response body:`, error);\n          }\n        }\n\n        try {\n          // Apply transforms to span data before adding attributes\n          // Use completeInputValue which includes the request body\n          const spanData: HttpSpanData = {\n            traceId: spanInfo.traceId,\n            spanId: spanInfo.spanId,\n            kind: SpanKind.SERVER,\n            protocol: spanProtocol,\n            inputValue: completeInputValue,\n            outputValue,\n          };\n          self.transformEngine.applyTransforms(spanData);\n\n          SpanUtils.addSpanAttributes(spanInfo.span, {\n            inputValue: spanData.inputValue,\n            outputValue: spanData.outputValue,\n            outputSchemaMerges: {\n              body: {\n                encoding: EncodingType.BASE64,\n                decodedType: getDecodedType(spanData.outputValue?.headers?.[\"content-type\"] || \"\"),\n              },\n              headers: {\n                matchImportance: 0,\n              },\n            },\n            metadata: {\n              ENV_VARS: EnvVarTracker.getEnvVars(spanInfo.traceId),\n            },\n            ...(spanData.transformMetadata && {\n              transformMetadata: spanData.transformMetadata,\n            }),\n          });\n\n          // Make sure to delete the env vars from the tracker\n          EnvVarTracker.clearEnvVars(spanInfo.traceId);\n\n          const status =\n            statusCode >= 400\n              ? { code: SpanStatusCode.ERROR, message: `HTTP ${statusCode}` }\n              : { code: SpanStatusCode.OK };\n\n          SpanUtils.setStatus(spanInfo.span, status);\n\n          // Ignore static asset responses\n          // Must check this before ending the span\n          const decodedType = getDecodedType(outputValue.headers?.[\"content-type\"] || \"\");\n          if (decodedType && !ACCEPTABLE_CONTENT_TYPES.has(decodedType)) {\n            const traceBlockingManager = TraceBlockingManager.getInstance();\n            traceBlockingManager.blockTrace(spanInfo.traceId);\n            logger.debug(\n              `[HttpInstrumentation] Blocking trace ${spanInfo.traceId} because it is not an acceptable decoded type: ${decodedType}`,\n              { acceptableContentTypes: Array.from(ACCEPTABLE_CONTENT_TYPES) },\n            );\n          }\n\n          SpanUtils.endSpan(spanInfo.span);\n        } catch (error) {\n          logger.error(`[HttpInstrumentation] Error adding response attributes to span:`, error);\n        }\n\n        if (self.mode === TuskDriftMode.REPLAY) {\n          try {\n            const now = OriginalGlobalUtils.getOriginalDate();\n            const replayTraceId = SpanUtils.getCurrentReplayTraceId() || spanInfo.traceId;\n\n            // Derive packageName from URL if needed\n            let packageName = spanProtocol;\n            try {\n              const u = new URL(completeInputValue.url || inputValue.url);\n              packageName = self._normalizeProtocol(u.protocol || undefined, spanProtocol);\n            } catch {}\n\n            // Compute schemas and hashes using the complete input value (with body)\n            const { schema: inputSchema, decodedValueHash: inputValueHash } =\n              JsonSchemaHelper.generateSchemaAndHash(completeInputValue, {\n                body: {\n                  encoding: EncodingType.BASE64,\n                  decodedType: getDecodedType(\n                    (completeInputValue.headers && completeInputValue.headers[\"content-type\"]) ||\n                      \"\",\n                  ),\n                },\n                headers: {\n                  matchImportance: 0,\n                },\n              });\n\n            const { schema: outputSchema, decodedValueHash: outputValueHash } =\n              JsonSchemaHelper.generateSchemaAndHash(outputValue, {\n                body: {\n                  encoding: EncodingType.BASE64,\n                  decodedType: getDecodedType(outputValue.headers[\"content-type\"] || \"\"),\n                },\n                headers: {\n                  matchImportance: 0,\n                },\n              });\n\n            const cleanSpan = {\n              traceId: replayTraceId,\n              spanId: spanInfo.spanId,\n              parentSpanId: \"\",\n              name: `${completeInputValue.target || inputValue.target}`,\n              packageName,\n              instrumentationName: \"HttpInstrumentation\",\n              submoduleName: completeInputValue.method || inputValue.method,\n              inputValue: completeInputValue,\n              outputValue,\n              inputSchema,\n              outputSchema,\n              inputSchemaHash: JsonSchemaHelper.generateDeterministicHash(inputSchema),\n              outputSchemaHash: JsonSchemaHelper.generateDeterministicHash(outputSchema),\n              inputValueHash,\n              outputValueHash,\n              // Use OpenTelemetry SpanKind for CleanSpanData.kind\n              kind: SpanKind.SERVER,\n              packageType: PackageType.HTTP,\n              status: {\n                code: statusCode >= 400 ? StatusCode.ERROR : StatusCode.OK,\n                message: statusCode >= 400 ? `HTTP ${statusCode}` : \"\",\n              },\n              timestamp: {\n                seconds: Math.floor(now.getTime() / 1000),\n                nanos: (now.getTime() % 1000) * 1_000_000,\n              },\n              duration: { seconds: 0, nanos: 0 },\n              isRootSpan: true,\n              isPreAppStart: false,\n              metadata: undefined,\n            };\n\n            await self.tuskDrift.sendInboundSpanForReplay(cleanSpan);\n          } catch (e) {\n            logger.error(\"[HttpInstrumentation] Failed to build/send inbound replay span:\", e);\n          }\n        }\n      });\n\n      return originalEnd.call(this, chunk, encoding, callback);\n    };\n\n    // Track errors\n    req.on(\"error\", (error: Error) => {\n      try {\n        logger.debug(\n          `[HttpInstrumentation] Server request error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n        );\n        SpanUtils.endSpan(spanInfo.span, {\n          code: SpanStatusCode.ERROR,\n          message: error.message,\n        });\n      } catch (error) {\n        logger.error(`[HttpInstrumentation] Error ending span:`, error);\n      }\n    });\n\n    res.on(\"error\", (error: Error) => {\n      try {\n        logger.debug(\n          `[HttpInstrumentation] Server response error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n        );\n        SpanUtils.endSpan(spanInfo.span, {\n          code: SpanStatusCode.ERROR,\n          message: error.message,\n        });\n      } catch (error) {\n        logger.error(`[HttpInstrumentation] Error ending span:`, error);\n      }\n    });\n\n    // Call the original handler within the span context\n    return originalHandler.call(this);\n  }\n\n  /**\n   * Captures the request body from an IncomingMessage stream by patching req.read() and listening for data events.\n   * This is necessary because IncomingMessage doesn't expose the body directly - it must be read from the stream.\n   *\n   * The method handles two consumption patterns:\n   * - READ mode: When application calls req.read() directly\n   * - PIPE mode: When request is piped/streamed (data events)\n   *\n   * When the request body is fully captured (on 'end' event), it parses the body and updates the span\n   * with the complete input data. This ensures exported spans contain the full request body information.\n   *\n   * NOTE: addAttributes() will override the current attributes so we need to pass current schema merges\n   * to make sure we don't lose any information\n   */\n  private _captureServerRequestBody(\n    req: IncomingMessage,\n    spanInfo: SpanInfo,\n    inputValue: {\n      method: string;\n      url: string;\n      target: string;\n      headers: IncomingHttpHeaders;\n      httpVersion: string;\n      remoteAddress?: string;\n      remotePort?: number;\n    },\n    schemaMerges: SchemaMerges | undefined,\n    onBodyCaptured?: (updatedInputValue: HttpServerInputValue) => void,\n  ): void {\n    const requestBodyChunks: Buffer[] = [];\n    let streamConsumptionMode: \"NOT_CONSUMING\" | \"READ\" | \"PIPE\" = \"NOT_CONSUMING\";\n\n    // Patch req.read to capture body chunks when application calls read()\n    const originalRead = req.read.bind(req);\n    req.read = function read(size?: number) {\n      const chunk = originalRead(size);\n      if (\n        chunk &&\n        (streamConsumptionMode === \"READ\" || streamConsumptionMode === \"NOT_CONSUMING\")\n      ) {\n        streamConsumptionMode = \"READ\";\n        requestBodyChunks.push(Buffer.from(chunk));\n      }\n      return chunk;\n    };\n\n    // Listen for 'resume' event to know when streaming starts\n    req.once(\"resume\", () => {\n      req.addListener(\"data\", (chunk: string | Buffer) => {\n        if (\n          chunk &&\n          (streamConsumptionMode === \"PIPE\" || streamConsumptionMode === \"NOT_CONSUMING\")\n        ) {\n          streamConsumptionMode = \"PIPE\";\n          requestBodyChunks.push(Buffer.from(chunk));\n        }\n      });\n    });\n\n    // Process the complete body when the request ends\n    req.addListener(\"end\", async (chunk?: string | Buffer) => {\n      if (chunk) {\n        requestBodyChunks.push(Buffer.from(chunk));\n      }\n\n      if (requestBodyChunks.length > 0) {\n        try {\n          const bodyBuffer = Buffer.concat(requestBodyChunks);\n\n          // Parse the request body using existing body parser\n          const encodedBody = await httpBodyEncoder({\n            bodyBuffer,\n            contentEncoding: req.headers[\"content-encoding\"] as string,\n          });\n\n          // Update input value with parsed body\n          const updatedInputValue: HttpServerInputValue = {\n            ...inputValue,\n            body: encodedBody,\n            bodySize: bodyBuffer.length,\n          };\n\n          if (onBodyCaptured) {\n            onBodyCaptured(updatedInputValue);\n          }\n\n          // Update the span with the complete request body information\n          SpanUtils.addSpanAttributes(spanInfo.span, {\n            inputValue: updatedInputValue,\n            inputSchemaMerges: {\n              ...schemaMerges,\n              body: {\n                encoding: EncodingType.BASE64,\n                decodedType: getDecodedType(req.headers[\"content-type\"] || \"\"),\n              },\n            },\n          });\n\n          logger.debug(\n            `[HttpInstrumentation] Captured request body for ${req.method} ${req.url}: ${bodyBuffer.length} bytes`,\n          );\n        } catch (error) {\n          logger.error(`[HttpInstrumentation] Error processing request body:`, error);\n        }\n      }\n    });\n  }\n\n  private _captureClientRequestBody(\n    req: ClientRequest,\n    spanInfo: SpanInfo,\n    inputValue: HttpClientInputValue,\n    schemaMerges: SchemaMerges | undefined,\n    onBodyCaptured?: (updatedInputValue: HttpClientInputValue) => void,\n  ): void {\n    const requestBodyChunks: (string | Buffer)[] = [];\n    let requestBodyCaptured = false;\n\n    // Patch the write method to capture request body\n    const originalWrite = req.write?.bind(req);\n    if (originalWrite) {\n      req.write = function (chunk: any, encoding?: any, callback?: any): boolean {\n        if (chunk && !requestBodyCaptured) {\n          requestBodyChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding));\n        }\n        return originalWrite.call(this, chunk, encoding, callback);\n      };\n    }\n\n    // Patch the end method to capture final request body and process it\n    const originalEnd = req.end?.bind(req);\n    if (originalEnd) {\n      req.end = function (chunk?: any, encoding?: any, callback?: any): ClientRequest {\n        // Capture final chunk if provided\n        if (chunk && !requestBodyCaptured) {\n          requestBodyChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, encoding));\n        }\n\n        // Process captured request body asynchronously (don't block the request)\n        if (requestBodyChunks.length > 0 && !requestBodyCaptured) {\n          requestBodyCaptured = true;\n          (async () => {\n            try {\n              const bodyBuffer = Buffer.concat(\n                requestBodyChunks.map((chunk) =>\n                  Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk),\n                ),\n              );\n\n              // Parse the request body using existing body parser\n              const encodedBody = await httpBodyEncoder({\n                bodyBuffer,\n              });\n\n              // Update input value with parsed body\n              const updatedInputValue: HttpClientInputValue = {\n                ...inputValue,\n                body: encodedBody,\n                bodySize: bodyBuffer.length,\n              };\n\n              // Call callback to update closure variable in response handler\n              if (onBodyCaptured) {\n                onBodyCaptured(updatedInputValue);\n              }\n\n              // Update the span with the complete request body information\n              SpanUtils.addSpanAttributes(spanInfo.span, {\n                inputValue: updatedInputValue,\n                inputSchemaMerges: {\n                  ...schemaMerges,\n                  body: {\n                    encoding: EncodingType.BASE64,\n                    decodedType: getDecodedType(\n                      (inputValue.headers[\"content-type\"] as string | string[]) || \"\",\n                    ),\n                  },\n                },\n              });\n\n              logger.debug(\n                `[HttpInstrumentation] Captured request body for ${req.method} ${req.path}: ${bodyBuffer.length} bytes`,\n              );\n            } catch (error) {\n              logger.error(`[HttpInstrumentation] Error processing request body:`, error);\n            }\n          })();\n        }\n\n        return originalEnd.call(this, chunk, encoding, callback);\n      };\n    }\n  }\n\n  /*\n   * This is the main function that executes a real HTTP request with proper span handling\n   * Should be passed to SpanExecutor.createAndExecuteSpan\n   */\n  private _handleOutboundRequestInSpan(\n    originalRequest: Function,\n    args: any[],\n    spanInfo: SpanInfo,\n    inputValue: HttpClientInputValue,\n    schemaMerges: SchemaMerges | undefined,\n  ) {\n    const req = originalRequest.apply(this, args);\n\n    // Track the complete input value (will be updated when body is captured)\n    let completeInputValue = inputValue;\n\n    // NOTE: This is a patch to capture the request body\n    // This is necessary because ClientRequest doesn't have a .body property - we need to capture it from the stream\n    // This patches req.write() and listens for 'data'/'end' events to collect body chunks as they arrive\n    // Handles both write() consumption and pipe/stream consumption patterns used by different frameworks\n    this._captureClientRequestBody(req, spanInfo, inputValue, schemaMerges, (updatedInputValue) => {\n      completeInputValue = updatedInputValue;\n    });\n\n    // Add event listeners to track request/response within span context\n    req.on(\"response\", (res: IncomingMessage) => {\n      logger.debug(\n        `[HttpInstrumentation] HTTP response received: ${res.statusCode} (${SpanUtils.getTraceInfo()})`,\n      );\n\n      // Build basic output value object\n      const outputValue: HttpClientOutputValue = {\n        statusCode: res.statusCode,\n        statusMessage: res.statusMessage,\n        headers: this._captureHeadersFromRawHeaders(res.rawHeaders),\n        httpVersion: res.httpVersion,\n        httpVersionMajor: res.httpVersionMajor,\n        httpVersionMinor: res.httpVersionMinor,\n        complete: res.complete,\n        readable: res.readable,\n      };\n\n      // Capture response body using dual-mode consumption strategy\n      // This handles both read() and pipe() consumption patterns\n      const responseChunks: Buffer[] = [];\n      let streamConsumptionMode: \"NOT_CONSUMING\" | \"READ\" | \"PIPE\" = \"NOT_CONSUMING\";\n\n      // Patch res.read to capture body chunks when application calls read()\n      const originalRead = res.read?.bind(res);\n      if (originalRead) {\n        res.read = function read(size?: number) {\n          const chunk = originalRead(size);\n          if (\n            chunk &&\n            (streamConsumptionMode === \"READ\" || streamConsumptionMode === \"NOT_CONSUMING\")\n          ) {\n            streamConsumptionMode = \"READ\";\n            responseChunks.push(Buffer.from(chunk));\n          }\n          return chunk;\n        };\n      }\n\n      // Listen for 'resume' event to know when streaming starts\n      res.once(\"resume\", () => {\n        res.on(\"data\", (chunk: string | Buffer) => {\n          if (\n            chunk &&\n            (streamConsumptionMode === \"PIPE\" || streamConsumptionMode === \"NOT_CONSUMING\")\n          ) {\n            streamConsumptionMode = \"PIPE\";\n            responseChunks.push(Buffer.from(chunk));\n          }\n        });\n      });\n\n      // Always attach end listener to ensure span gets ended\n      res.on(\"end\", async (chunk?: string | Buffer) => {\n        // Capture final chunk if provided\n        if (chunk && typeof chunk !== \"function\") {\n          responseChunks.push(Buffer.from(chunk));\n        }\n\n        try {\n          if (responseChunks.length > 0) {\n            // Combine all chunks into a single buffer\n            const responseBuffer = Buffer.concat(responseChunks);\n\n            // Capture raw headers before processing\n            const rawHeaders = this._captureHeadersFromRawHeaders(res.rawHeaders);\n\n            // Store the raw headers\n            outputValue.headers = rawHeaders;\n\n            // Parse response body\n            const contentEncoding = rawHeaders[\"content-encoding\"];\n            const encodedBody = await httpBodyEncoder({\n              bodyBuffer: responseBuffer,\n              contentEncoding,\n            });\n\n            // Store parsed body data\n            outputValue.body = encodedBody;\n            outputValue.bodySize = responseBuffer.length;\n          }\n\n          // Always end the span, even if there's no response body\n          this._addOutputAttributesToSpan({\n            spanInfo,\n            outputValue,\n            statusCode: res.statusCode || 1,\n            outputSchemaMerges: {\n              body: {\n                encoding: EncodingType.BASE64,\n                decodedType: getDecodedType(outputValue.headers[\"content-type\"] || \"\"),\n              },\n              headers: {\n                matchImportance: 0,\n              },\n            },\n            inputValue: completeInputValue,\n          });\n        } catch (error) {\n          logger.error(`[HttpInstrumentation] Error processing response body:`, error);\n        }\n      });\n    });\n\n    req.on(\"error\", (error: Error) => {\n      try {\n        logger.debug(\n          `[HttpInstrumentation] HTTP request error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n        );\n\n        // Record the error as the output value for replay\n        const errorOutputValue: HttpClientOutputValue = {\n          headers: {},\n          httpVersion: \"1.1\",\n          httpVersionMajor: 1,\n          httpVersionMinor: 1,\n          complete: true,\n          readable: false,\n          // Add error-specific fields\n          errorName: error.name || \"UNKNOWN\",\n          errorMessage: error.message,\n        };\n\n        // Add the error output to the span so it gets recorded\n        this._addOutputAttributesToSpan({\n          spanInfo,\n          outputValue: errorOutputValue,\n          statusCode: 0,\n          outputSchemaMerges: {\n            headers: {\n              matchImportance: 0,\n            },\n          },\n          inputValue: completeInputValue,\n        });\n\n        SpanUtils.endSpan(spanInfo.span, {\n          code: SpanStatusCode.ERROR,\n          message: error.message,\n        });\n      } catch (error) {\n        logger.error(`[HttpInstrumentation] Error ending span:`, error);\n      }\n    });\n\n    return req;\n  }\n\n  /**\n   * Helper method to add output attributes to span\n   */\n  private _addOutputAttributesToSpan({\n    spanInfo,\n    outputValue,\n    statusCode,\n    outputSchemaMerges,\n    inputValue,\n  }: {\n    spanInfo: SpanInfo;\n    outputValue: HttpClientOutputValue;\n    statusCode: number;\n    outputSchemaMerges?: SchemaMerges;\n    inputValue: HttpClientInputValue;\n  }): void {\n    // Apply transforms\n    const normalizedProtocol = this._normalizeProtocol(inputValue.protocol, \"http\");\n    const spanData: HttpSpanData = {\n      traceId: spanInfo.traceId,\n      spanId: spanInfo.spanId,\n      kind: SpanKind.CLIENT,\n      protocol: normalizedProtocol,\n      inputValue,\n      outputValue,\n    };\n\n    this.transformEngine.applyTransforms(spanData);\n\n    SpanUtils.addSpanAttributes(spanInfo.span, {\n      inputValue: spanData.inputValue,\n      outputValue: spanData.outputValue,\n      outputSchemaMerges,\n      transformMetadata: spanData.transformMetadata ? spanData.transformMetadata : undefined,\n    });\n\n    // Set span status based on HTTP status\n    const status =\n      statusCode >= 400\n        ? { code: SpanStatusCode.ERROR, message: `HTTP ${statusCode}` }\n        : { code: SpanStatusCode.OK };\n\n    SpanUtils.endSpan(spanInfo.span, status);\n  }\n\n  private _captureHeadersFromRawHeaders(rawHeaders: string[]): Record<string, string> {\n    const headers: Record<string, string> = {};\n    for (let i = 0; i < rawHeaders.length; i += 2) {\n      const key = rawHeaders[i].toLowerCase();\n      const value = rawHeaders[i + 1];\n      headers[key] = value;\n    }\n    return headers;\n  }\n\n  private _getRequestPatchFn(protocol: HttpProtocol) {\n    const self = this;\n\n    return (originalRequest: Function) => {\n      return function (this: Request, ...args: any[]) {\n        // Handle both URL string and RequestOptions object\n        let requestOptions: RequestOptions;\n        if (typeof args[0] === \"string\") {\n          // Parse URL string into RequestOptions\n          const url = new URL(args[0]);\n          requestOptions = {\n            protocol: url.protocol,\n            hostname: url.hostname,\n            port: url.port ? parseInt(url.port) : undefined,\n            path: url.pathname + url.search,\n            method: args[1]?.method || \"GET\",\n            headers: args[1]?.headers || {},\n          };\n        } else {\n          requestOptions = args[0] || {};\n        }\n        const method = requestOptions.method || \"GET\";\n        const requestProtocol = self._normalizeProtocol(\n          requestOptions.protocol || undefined,\n          protocol,\n        );\n\n        if (self.mode === TuskDriftMode.REPLAY) {\n          const stackTrace = captureStackTrace([\"HttpInstrumentation\"]);\n\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              // Calling with no spanInfo since this is a background request\n              // handleOutboundReplayRequest will return a 200 OK response with no mock data\n              return self.replayHooks.handleOutboundReplayRequest({\n                method,\n                requestOptions,\n                protocol: requestProtocol,\n                args,\n              });\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              // Build input value object for replay mode\n              const headers = normalizeHeaders(requestOptions.headers || {});\n              const inputValue: HttpClientInputValue = {\n                method,\n                path: requestOptions.path || undefined,\n                headers,\n                protocol: requestProtocol,\n                hostname: requestOptions.hostname || requestOptions.host || undefined,\n                port: requestOptions.port ? Number(requestOptions.port) : undefined,\n                timeout: requestOptions.timeout || undefined,\n              };\n\n              // Create span in replay mode\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalRequest.apply(this, args),\n                {\n                  name: requestOptions.path || `${requestProtocol.toUpperCase()} ${method}`,\n                  kind: SpanKind.CLIENT,\n                  packageName: requestProtocol,\n                  packageType: PackageType.HTTP,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  submodule: method,\n                  inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self.replayHooks.handleOutboundReplayRequest({\n                    method,\n                    requestOptions,\n                    protocol: requestProtocol,\n                    args,\n                    spanInfo,\n                    stackTrace,\n                  });\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalRequest.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              const headers = normalizeHeaders(requestOptions.headers || {});\n\n              // Ignore SDK's own drift export calls\n              if (\n                headers[TUSK_SKIP_HEADER] === \"true\" ||\n                isTuskDriftIngestionUrl(requestOptions.path)\n              ) {\n                return originalRequest.apply(this, args);\n              }\n\n              const inputValue: HttpClientInputValue = {\n                method,\n                path: requestOptions.path || undefined,\n                headers,\n                protocol: requestProtocol,\n                hostname: requestOptions.hostname || requestOptions.host || undefined,\n                port: requestOptions.port ? Number(requestOptions.port) : undefined,\n                timeout: requestOptions.timeout || undefined,\n              };\n\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalRequest.apply(this, args),\n                {\n                  name: requestOptions.path || `${requestProtocol.toUpperCase()} ${method}`,\n                  kind: SpanKind.CLIENT,\n                  packageName: requestProtocol,\n                  packageType: PackageType.HTTP,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  submodule: method,\n                  inputValue,\n                  inputSchemaMerges: {\n                    headers: {\n                      matchImportance: 0,\n                    },\n                  },\n                  isPreAppStart,\n                },\n                (spanInfo: SpanInfo) => {\n                  return self._handleOutboundRequestInSpan(\n                    originalRequest,\n                    args,\n                    spanInfo,\n                    inputValue,\n                    {\n                      headers: {\n                        matchImportance: 0,\n                      },\n                    },\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalRequest.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _getGetPatchFn(protocol: HttpProtocol) {\n    const self = this;\n\n    return (originalGet: Function) => {\n      return function (this: Request, ...args: any[]) {\n        // Handle both URL string and RequestOptions object\n        let requestOptions: RequestOptions;\n        if (typeof args[0] === \"string\") {\n          // Parse URL string into RequestOptions\n          const url = new URL(args[0]);\n          requestOptions = {\n            protocol: url.protocol,\n            hostname: url.hostname,\n            port: url.port ? parseInt(url.port) : undefined,\n            path: url.pathname + url.search,\n            headers: args[1]?.headers || {},\n          };\n        } else {\n          requestOptions = args[0] || {};\n        }\n        const method = \"GET\";\n        const requestProtocol = self._normalizeProtocol(\n          requestOptions.protocol || undefined,\n          protocol,\n        );\n\n        // Handle replay mode using replay hooks (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              // Calling with no spanInfo since this is a background request\n              // handleOutboundReplayRequest will return a 200 OK response with no mock data\n              return self.replayHooks.handleOutboundReplayRequest({\n                method,\n                requestOptions,\n                protocol: requestProtocol,\n                args,\n              });\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              // Build input value object for replay mode\n              const headers = normalizeHeaders(requestOptions.headers || {});\n              const inputValue: HttpClientInputValue = {\n                method,\n                path: requestOptions.path || undefined,\n                headers,\n                protocol: requestProtocol,\n                hostname: requestOptions.hostname || requestOptions.host || undefined,\n                port: requestOptions.port ? Number(requestOptions.port) : undefined,\n                timeout: requestOptions.timeout || undefined,\n              };\n\n              // Create span in replay mode\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalGet.apply(this, args),\n                {\n                  name: requestOptions.path || `${requestProtocol.toUpperCase()} ${method}`,\n                  kind: SpanKind.CLIENT,\n                  packageName: requestProtocol,\n                  packageType: PackageType.HTTP,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  submodule: method,\n                  inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self.replayHooks.handleOutboundReplayRequest({\n                    method,\n                    requestOptions,\n                    protocol: requestProtocol,\n                    args,\n                    spanInfo,\n                  });\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalGet.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              const headers = normalizeHeaders(requestOptions.headers || {});\n\n              // Ignore SDK's own drift export calls\n              if (\n                headers[TUSK_SKIP_HEADER] === \"true\" ||\n                isTuskDriftIngestionUrl(requestOptions.path)\n              ) {\n                return originalGet.apply(this, args);\n              }\n\n              const inputValue: HttpClientInputValue = {\n                method,\n                path: requestOptions.path || undefined,\n                headers,\n                protocol: requestProtocol,\n                hostname: requestOptions.hostname || requestOptions.host || undefined,\n                port: requestOptions.port ? Number(requestOptions.port) : undefined,\n                timeout: requestOptions.timeout || undefined,\n              };\n\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalGet.apply(this, args),\n                {\n                  name: requestOptions.path || `${requestProtocol.toUpperCase()} ${method}`,\n                  kind: SpanKind.CLIENT,\n                  packageName: requestProtocol,\n                  packageType: PackageType.HTTP,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  submodule: method,\n                  inputValue,\n                  inputSchemaMerges: {\n                    headers: {\n                      matchImportance: 0,\n                    },\n                  },\n                  isPreAppStart,\n                },\n                (spanInfo: SpanInfo) => {\n                  return self._handleOutboundRequestInSpan(\n                    originalGet,\n                    args,\n                    spanInfo,\n                    inputValue,\n                    {\n                      headers: {\n                        matchImportance: 0,\n                      },\n                    },\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalGet.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _getServerEmitPatchFn(protocol: HttpProtocol) {\n    const self = this;\n\n    return (originalEmit: Function) => {\n      return function (this: Server, eventName: string, ...args: any[]) {\n        if (eventName === \"request\") {\n          // Sample as soon as we can to avoid additional overhead if this request is not sampled\n          if (self.mode === TuskDriftMode.RECORD) {\n            if (\n              !shouldSample({\n                samplingRate: self.tuskDrift.getSamplingRate(),\n                isAppReady: self.tuskDrift.isAppReady(),\n              })\n            ) {\n              return originalEmit.apply(this, [eventName, ...args]);\n            }\n          }\n\n          const req = args[0];\n          const res = args[1];\n\n          return self._createServerSpan({\n            req,\n            res,\n            originalHandler: () => {\n              return originalEmit.apply(this, [eventName, ...args]);\n            },\n            protocol,\n          });\n        }\n\n        return originalEmit.apply(this, [eventName, ...args]);\n      };\n    };\n  }\n\n  private _normalizeProtocol(protocol: string | undefined, fallback: HttpProtocol): HttpProtocol {\n    if (!protocol) {\n      return fallback;\n    }\n\n    const normalized = protocol.toLowerCase().replace(/:$/, \"\");\n    if (normalized === \"http\" || normalized === \"https\") {\n      return normalized;\n    }\n\n    return fallback;\n  }\n\n  private _wrap(\n    target: HttpModuleExports | HttpsModuleExports | Server,\n    propertyName: string,\n    wrapper: (original: Function) => Function,\n  ): Function | void {\n    return wrap(target, propertyName, wrapper);\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { EnvVarTracker } from \"../../core/trackers\";\nimport { TdInstrumentationConfig } from \"../../core/baseClasses/TdInstrumentationAbstract\";\nimport { logger } from \"../../../core/utils/logger\";\n\nexport interface EnvInstrumentationConfig extends TdInstrumentationConfig {\n  mode?: TuskDriftMode;\n}\n\n/**\n * Environment variable instrumentation that records and replays process.env access.\n * In record mode, captures environment variable values.\n * In replay mode, returns previously recorded values for deterministic behavior.\n */\nexport class EnvInstrumentation extends TdInstrumentationBase {\n  private mode: TuskDriftMode;\n  private originalProcessEnv?: typeof process.env;\n  private isInPatchedCall = false;\n\n  constructor(config: EnvInstrumentationConfig = {}) {\n    super(\"env\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    // Environment variables are global, not a module, so we patch process.env directly\n    this.patchProcessEnv();\n    return [];\n  }\n\n  private patchProcessEnv(): void {\n    // Unlike other instrumentations that patch modules when they're required (lazy patching),\n    // env var instrumentation patches process.env immediately during init() since process.env\n    // is a global object, not a module. This means we need to explicitly check if the\n    // instrumentation is enabled before patching, otherwise we'd always patch process.env\n    // even when the user has disabled env var recording via enable_env_var_recording config.\n    if (this.mode === TuskDriftMode.DISABLED || !this._config.enabled) {\n      return;\n    }\n\n    this.originalProcessEnv = process.env;\n\n    // Create a proxy around process.env\n    const envProxy = new Proxy(this.originalProcessEnv, {\n      get: (target, property, receiver) => {\n        return this._handleEnvAccess(target, property as string);\n      },\n      set: (target, property, value, receiver) => {\n        // Allow setting env vars normally\n        target[property as string] = value;\n        return true;\n      },\n      deleteProperty: (target, property) => {\n        delete target[property as string];\n        return true;\n      },\n      ownKeys: (target) => {\n        return Reflect.ownKeys(target);\n      },\n      getOwnPropertyDescriptor: (target, property) => {\n        return Reflect.getOwnPropertyDescriptor(target, property);\n      },\n      has: (target, property) => {\n        return Reflect.has(target, property);\n      },\n    });\n\n    // Replace global process.env with our proxy\n    process.env = envProxy;\n  }\n\n  private _handleEnvAccess(target: typeof process.env, key: string): string | undefined {\n    // Prevent recursion\n    if (this.isInPatchedCall) {\n      return target[key];\n    }\n\n    if (!TuskDriftCore.getInstance().isAppReady()) {\n      // Want to use the original process.env when app is in process of starting up\n      return target[key];\n    }\n\n    this.isInPatchedCall = true;\n    try {\n      return this._handleEnvAccessInMode(target, key);\n    } finally {\n      this.isInPatchedCall = false;\n    }\n  }\n\n  private _handleEnvAccessInMode(target: typeof process.env, key: string): string | undefined {\n    let currentSpanInfo: SpanInfo | null = null;\n    try {\n      currentSpanInfo = SpanUtils.getCurrentSpanInfo();\n    } catch (error) {\n      logger.error(`EnvInstrumentation error getting current span info:`, error);\n    }\n\n    if (!currentSpanInfo) {\n      return target[key];\n    }\n\n    if (this.mode === TuskDriftMode.REPLAY) {\n      return this._handleReplayMode(target, key);\n    } else if (this.mode === TuskDriftMode.RECORD) {\n      return this._handleRecordMode(currentSpanInfo, target, key);\n    } else {\n      return target[key];\n    }\n  }\n\n  private _handleReplayMode(target: typeof process.env, key: string): string | undefined {\n    const replayTraceId = SpanUtils.getCurrentReplayTraceId();\n    if (!replayTraceId) {\n      return target[key];\n    }\n\n    const envVar = EnvVarTracker.getEnvVar(replayTraceId, key);\n    if (envVar) {\n      logger.debug(`Returning env var ${key} for trace ${replayTraceId}: ${envVar}`);\n      return envVar;\n    }\n\n    return target[key];\n  }\n\n  private _handleRecordMode(\n    spanInfo: SpanInfo,\n    target: typeof process.env,\n    key: string,\n  ): string | undefined {\n    try {\n      EnvVarTracker.setEnvVar({\n        traceId: spanInfo.traceId,\n        key,\n        value: target[key] || undefined,\n      });\n    } catch (error) {\n      logger.error(`EnvInstrumentation error storing env var:`, error);\n    }\n    return target[key];\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { SpanUtils } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind } from \"@opentelemetry/api\";\nimport { TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { SPAN_KIND_CONTEXT_KEY } from \"../../../core/types\";\nimport { wrap } from \"../../core/utils\";\nimport { DateInstrumentationConfig } from \"./types\";\nimport { DateTracker } from \"../../core/trackers\";\nimport { logger } from \"../../../core/utils/logger\";\n\n/**\n * Date instrumentation that provides consistent dates in replay mode.\n * In replay mode, new Date() calls return the latest mock response timestamp.\n *\n * Note: this probably won't match exactly to the milliseconds, but it will be very close to date the application probably expects\n */\nexport class DateInstrumentation extends TdInstrumentationBase {\n  private mode: TuskDriftMode;\n  private originalDate?: typeof Date;\n  private isInPatchedCall = false;\n  private static instance: DateInstrumentation;\n\n  constructor(config: DateInstrumentationConfig = {}) {\n    super(\"date\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    DateInstrumentation.instance = this;\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    // Date is a global, not a module, so we patch it directly\n    this.patchGlobalDate();\n    return [];\n  }\n\n  private patchGlobalDate(): void {\n    // Unlike other instrumentations that patch modules when they're required (lazy patching),\n    // date instrumentation patches the global Date function immediately during init() since\n    // Date is a global API, not a module. This means we need to explicitly check if the\n    // instrumentation is enabled before patching, otherwise we'd always patch globalThis.Date\n    // even when the user has disabled date instrumentation.\n    if (this.mode === TuskDriftMode.DISABLED || !this._config.enabled) {\n      return;\n    }\n\n    this.originalDate = globalThis.Date;\n\n    const _TdDate = this._wrap(globalThis, \"Date\", this.getDatePatchFn());\n\n    // Copy static methods\n    _TdDate.now = function (): number {\n      return new _TdDate().getTime();\n    };\n    _TdDate.parse = this.originalDate!.parse.bind(this.originalDate!);\n    _TdDate.UTC = this.originalDate!.UTC.bind(this.originalDate!);\n\n    // Set up prototype chain\n    Object.setPrototypeOf(_TdDate.prototype, this.originalDate!.prototype);\n    Object.defineProperty(_TdDate, Symbol.hasInstance, {\n      value: (instance: any) => instance instanceof this.originalDate!,\n    });\n\n    logger.debug(\"Global Date patching complete\");\n  }\n\n  static getOriginalDate(): Date | string {\n    return new DateInstrumentation.instance.originalDate!();\n  }\n\n  private _handleDateCall(args: any[], isConstructorCall: boolean): Date | string {\n    // Prevent recursion\n    if (this.isInPatchedCall) {\n      return this._callOriginalDate(args, isConstructorCall);\n    }\n\n    // Only handle replay mode, pass through everything else\n    if (this.mode !== TuskDriftMode.REPLAY) {\n      return this._callOriginalDate(args, isConstructorCall);\n    }\n\n    const currentSpanInfo = SpanUtils.getCurrentSpanInfo();\n    if (!currentSpanInfo) {\n      return this._callOriginalDate(args, isConstructorCall);\n    }\n\n    // We only want to replace Date calls from server spans\n    const spanKind = currentSpanInfo.context.getValue(SPAN_KIND_CONTEXT_KEY);\n    if (spanKind !== SpanKind.SERVER) {\n      return this._callOriginalDate(args, isConstructorCall);\n    }\n\n    this.isInPatchedCall = true;\n    try {\n      return this._handleReplayDate(args, isConstructorCall);\n    } finally {\n      this.isInPatchedCall = false;\n    }\n  }\n\n  private _handleReplayDate(args: any[], isConstructorCall: boolean): Date | string {\n    // If new Date() is called without arguments, use the latest timestamp from trace\n    if (args.length === 0) {\n      const latestDate = DateTracker.getCurrentTraceLatestDate();\n      if (latestDate) {\n        logger.debug(\n          `Replacing new Date() with latest trace timestamp: ${latestDate.toISOString()}`,\n        );\n        return isConstructorCall\n          ? new this.originalDate!(latestDate.getTime())\n          : latestDate.toString();\n      }\n    }\n\n    // For all other cases (Date with arguments), use original behavior\n    return this._callOriginalDate(args, isConstructorCall);\n  }\n\n  private _callOriginalDate(args: any[], isConstructorCall: boolean): Date | string {\n    if (isConstructorCall) {\n      if (args.length === 0) {\n        return new this.originalDate!();\n      }\n      return new (this.originalDate as any)(...args);\n    } else {\n      // Function call: Date() - should return string\n      return new this.originalDate!().toString();\n    }\n  }\n\n  private getDatePatchFn() {\n    const self = this;\n    return (OriginalDate: typeof Date) => {\n      function _TdDate(this: any, ...args: any[]): Date | string {\n        const isConstructorCall = new.target !== undefined;\n        return self._handleDateCall(args, isConstructorCall);\n      }\n      return _TdDate;\n    };\n  }\n\n  private _wrap(target: any, propertyName: string, wrapper: (original: any) => any): any {\n    wrap(target, propertyName, wrapper);\n    return target[propertyName];\n  }\n}\n","import { normalize } from \"path\";\n\nexport type PatchFunction = (moduleExports: any, moduleVersion?: string) => any;\n\nexport class TdInstrumentationNodeModuleFile {\n  name: string;\n  supportedVersions: string[];\n  patch: PatchFunction;\n  moduleExports?: any;\n\n  constructor({\n    name,\n    supportedVersions,\n    patch,\n  }: {\n    name: string;\n    supportedVersions: string[];\n    patch: PatchFunction;\n  }) {\n    this.name = normalize(name);\n    this.supportedVersions = supportedVersions;\n    this.patch = patch;\n  }\n}\n","interface GraphQLTypeNode {\n  kind: string;\n  type?: GraphQLTypeNode;\n  name?: { value: string };\n}\n\ninterface GraphQLVariableDefinition {\n  variable?: { name?: { value: string } };\n  type?: GraphQLTypeNode;\n}\n\ninterface GraphQLSelectionSet {\n  selections: GraphQLSelection[];\n}\n\ninterface GraphQLSelection {\n  kind: string;\n  name?: { value: string };\n  alias?: { value: string };\n  selectionSet?: GraphQLSelectionSet;\n  arguments?: GraphQLArgument[];\n  directives?: GraphQLDirective[];\n}\n\ninterface GraphQLArgument {\n  kind: string;\n  value?: any;\n}\n\ninterface GraphQLDirective {\n  arguments: GraphQLArgument[];\n}\n\ninterface GraphQLOperationDefinition {\n  kind: string;\n  operation: string;\n  name?: { value: string };\n  variableDefinitions?: GraphQLVariableDefinition[];\n  selectionSet: GraphQLSelectionSet;\n}\n\ninterface GraphQLExecutionArgs {\n  document: { definitions: any[] };\n  variableValues?: any;\n  operationName?: string;\n}\n\nexport const getOperationDefinition = (\n  payload: GraphQLExecutionArgs,\n): GraphQLOperationDefinition | undefined =>\n  payload.document.definitions.find(\n    (definition: any) => definition?.kind === \"OperationDefinition\",\n  ) as GraphQLOperationDefinition | undefined;\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { TdInstrumentationConfig } from \"../../core/baseClasses/TdInstrumentationAbstract\";\nimport { TdInstrumentationNodeModuleFile } from \"../../core/baseClasses/TdInstrumentationNodeModuleFile\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { wrap } from \"../../core/utils\";\nimport { getOperationDefinition } from \"./utils\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { Span } from \"@opentelemetry/api\";\nimport { logger } from \"../../../core/utils/logger\";\n\nexport interface GraphqlInstrumentationConfig extends TdInstrumentationConfig {\n  mode?: TuskDriftMode;\n}\n\n/**\n * GraphQL is instrumented purely for presentational metadata.\n * We do not replay GraphQL operations.\n *\n * Behavior:\n * - REPLAY mode: Just call original functions (no patching)\n * - RECORD mode: Intercept GraphQL execute calls and add presentational metadata to parent HTTP spans\n *   - Add presentational metadata to parent HTTP spans\n *   - Always call original GraphQL functions\n */\nexport class GraphqlInstrumentation extends TdInstrumentationBase {\n  private tuskDrift: TuskDriftCore;\n\n  constructor(config: GraphqlInstrumentationConfig = {}) {\n    super(\"graphql\", config);\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    // Patch GraphQL v16\n    const patchGraphqlExecuteV16 = new TdInstrumentationNodeModuleFile({\n      name: \"graphql/execution/execute.js\",\n      supportedVersions: [\"16.*\"],\n      // Graphql v16 deprecated executeSync\n      patch: (moduleExports: any) => {\n        this._wrap(moduleExports, \"execute\", this._patchExecuteFn());\n        return moduleExports;\n      },\n    });\n\n    // Patch GraphQL v15\n    const patchGraphqlExecuteV15 = new TdInstrumentationNodeModuleFile({\n      name: \"graphql/execution/execute.js\",\n      supportedVersions: [\"15.*\"],\n      patch: (moduleExports: any) => {\n        this._wrap(moduleExports, \"execute\", this._patchExecuteFn());\n        this._wrap(moduleExports, \"executeSync\", this._patchExecuteFn());\n        return moduleExports;\n      },\n    });\n\n    const moduleGraphqlV16 = new TdInstrumentationNodeModule({\n      name: \"graphql\",\n      supportedVersions: [\"16.*\"],\n      patch: (moduleExports: any) => moduleExports,\n      // execute doesn't exist in the main module export\n      // Hence we patch the files directly\n      files: [patchGraphqlExecuteV16],\n    });\n\n    const moduleGraphqlV15 = new TdInstrumentationNodeModule({\n      name: \"graphql\",\n      supportedVersions: [\"15.*\"],\n      patch: (moduleExports: any) => moduleExports,\n      // execute and executeSync don't exist in the main module export\n      // Hence we patch the files directly\n      files: [patchGraphqlExecuteV15],\n    });\n\n    return [moduleGraphqlV15, moduleGraphqlV16];\n  }\n\n  /**\n   * Patch GraphQL execute function to add metadata to parent HTTP server spans\n   */\n  private _patchExecuteFn() {\n    const self = this;\n    return (originalExecute: any) => {\n      return function execute(this: any, ...args: any[]) {\n        return self._handleGraphQLExecution(\"execute\", originalExecute, args, this);\n      };\n    };\n  }\n\n  /**\n   * Handle GraphQL execution - add metadata to parent server span if present\n   */\n  private _handleGraphQLExecution(\n    methodName: string,\n    originalMethod: Function,\n    args: any[],\n    context: any,\n  ): any {\n    if (this.tuskDrift.getMode() !== TuskDriftMode.RECORD) {\n      logger.debug(`[GraphQLInstrumentation] Not in RECORD mode, skipping instrumentation`);\n      return originalMethod.apply(context, args);\n    }\n\n    let currentSpanInfo: SpanInfo | null = null;\n    try {\n      currentSpanInfo = SpanUtils.getCurrentSpanInfo();\n    } catch (error) {\n      logger.error(`[GraphQLInstrumentation] error getting current span info:`, error);\n    }\n\n    if (!currentSpanInfo) {\n      logger.debug(\n        `[GraphQLInstrumentation] No current span found for ${methodName}, calling original`,\n      );\n      return originalMethod.apply(context, args);\n    }\n\n    try {\n      logger.debug(`[GraphQLInstrumentation] Update span attributes with GraphQL info`);\n      this._addGraphQLMetadataToSpan(currentSpanInfo.span, args);\n    } catch (error) {\n      logger.warn(\n        `[GraphQLInstrumentation] Failed to update span attributes with GraphQL info:`,\n        error,\n      );\n    }\n\n    return originalMethod.apply(context, args);\n  }\n\n  /**\n   * Extract GraphQL metadata from execution args and add to span\n   */\n  private _addGraphQLMetadataToSpan(span: Span, args: any[]): void {\n    const [executionArgs] = args;\n\n    if (!executionArgs || !executionArgs.document) {\n      logger.warn(`[GraphQLInstrumentation] No execution args or document found`);\n      return;\n    }\n\n    try {\n      // Extract operation information\n      const operationDef = getOperationDefinition(executionArgs);\n      const operationType = operationDef?.operation || \"query\";\n      const operationName = executionArgs.operationName || operationDef?.name?.value || \"Anonymous\";\n\n      SpanUtils.addSpanAttributes(span, {\n        name: `${operationType} ${operationName}`,\n        packageType: PackageType.GRAPHQL,\n      });\n    } catch (error) {\n      logger.warn(`[GraphQLInstrumentation] Error extracting GraphQL metadata:`, error);\n    }\n  }\n\n  private _wrap(target: any, propertyName: string, wrapper: (original: any) => any): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","import { EventEmitter } from \"events\";\nimport { PgInstrumentation } from \"../Instrumentation\";\nimport { createMockInputValue } from \"../../../../core/utils\";\nimport { SpanInfo } from \"../../../../core/tracing/SpanUtils\";\nimport { logger } from \"../../../../core/utils/logger\";\nimport { captureStackTrace } from \"src/instrumentation/core/utils\";\n\n/**\n * Mock PostgreSQL client for replay mode\n * Extends EventEmitter to properly handle all client methods and events\n */\nexport class TdPgClientMock extends EventEmitter {\n  private pgInstrumentation: PgInstrumentation;\n  private spanInfo?: SpanInfo;\n\n  constructor(pgInstrumentation: PgInstrumentation, spanInfo?: SpanInfo) {\n    super();\n    this.pgInstrumentation = pgInstrumentation;\n    this.spanInfo = spanInfo;\n  }\n\n  query(...args: any[]) {\n    logger.debug(`[TdPgClientMock] Mock pool client query intercepted in REPLAY mode`);\n\n    const stackTrace = captureStackTrace([\"TdPgClientMock\"]);\n\n    // Parse query arguments similar to the main query patch\n    const queryConfig = this.pgInstrumentation.parseQueryArgs(args);\n\n    if (!queryConfig || !queryConfig.text) {\n      logger.debug(`[TdPgClientMock] Could not parse mock client query, returning empty result`);\n      return Promise.resolve({ rows: [], rowCount: 0 });\n    }\n\n    const rawInputValue = {\n      text: queryConfig.text,\n      values: queryConfig.values || [],\n      clientType: \"client\",\n    };\n\n    const inputValue = createMockInputValue(rawInputValue);\n\n    if (this.spanInfo) {\n      return this.pgInstrumentation.handleReplayQuery(\n        queryConfig,\n        inputValue,\n        this.spanInfo,\n        stackTrace,\n      );\n    } else {\n      // Background query\n      // Return an EventEmitter that immediately completes with empty results\n      return this.pgInstrumentation.handleNoOpReplayQuery(queryConfig);\n    }\n  }\n\n  release() {\n    // No-op for pool client release - just emit end event to simulate normal behavior\n    this.emit(\"end\");\n  }\n\n  end() {\n    this.emit(\"end\");\n    return Promise.resolve();\n  }\n\n  connect(callback?: Function) {\n    // Mock connect - already connected\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    }\n    return Promise.resolve();\n  }\n\n  // Additional pg Client properties and methods that might be expected by ORMs\n  get connectionParameters() {\n    return {\n      host: \"localhost\",\n      port: 5432,\n      database: \"mock\",\n      user: \"mock\",\n    };\n  }\n\n  get readyForQuery() {\n    return true;\n  }\n\n  get processID() {\n    return 12345;\n  }\n\n  get secretKey() {\n    return 67890;\n  }\n\n  get activeQuery() {\n    return false;\n  }\n\n  pauseDrain() {\n    // No-op\n  }\n\n  resumeDrain() {\n    // No-op\n  }\n\n  escapeIdentifier(str: string) {\n    return `\"${str.replace(/\"/g, '\"\"')}\"`;\n  }\n\n  escapeLiteral(str: string) {\n    return `'${str.replace(/'/g, \"''\")}'`;\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { captureStackTrace, wrap } from \"../../core/utils\";\nimport { TdPgClientMock } from \"./mocks/TdPgClientMock\";\nimport { findMockResponseAsync } from \"../../core/utils/mockResponseUtils\";\nimport { handleRecordMode, handleReplayMode } from \"../../core/utils/modeUtils\";\nimport {\n  PgModuleExports,\n  PgPoolModuleExports,\n  PgClientInputValue,\n  PgInstrumentationConfig,\n  QueryConfig,\n  PgResult,\n} from \"./types\";\n// NOTE: these types are from version 8.15.5 of pg\n// Older versions of pg may have different types, but this is fine for now\nimport type { Connection, Query, Pool, PoolClient, Client } from \"pg\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger } from \"../../../core/utils/logger\";\n\nexport class PgInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"PgInstrumentation\";\n  private mode: TuskDriftMode;\n  private tuskDrift: TuskDriftCore;\n\n  constructor(config: PgInstrumentationConfig = {}) {\n    super(\"pg\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"pg\",\n        supportedVersions: [\"8.*\"],\n        patch: (moduleExports: PgModuleExports) => this._patchPgModule(moduleExports),\n      }),\n      new TdInstrumentationNodeModule({\n        name: \"pg-pool\",\n        supportedVersions: [\"2.*\", \"3.*\"],\n        patch: (moduleExports: PgPoolModuleExports) => this._patchPgPoolModule(moduleExports),\n      }),\n      // TODO: instrument pg-cursor\n    ];\n  }\n\n  private _patchPgModule(pgModule: PgModuleExports): PgModuleExports {\n    logger.debug(`[PgInstrumentation] Patching PG module in ${this.mode} mode`);\n\n    if (this.isModulePatched(pgModule)) {\n      logger.debug(`[PgInstrumentation] PG module already patched, skipping`);\n      return pgModule;\n    }\n\n    // Wrap Client.prototype.query\n    if (pgModule.Client && pgModule.Client.prototype) {\n      this._wrap(pgModule.Client.prototype, \"query\", this._getQueryPatchFn(\"client\"));\n      logger.debug(`[PgInstrumentation] Wrapped Client.prototype.query`);\n    }\n\n    // Wrap Client.prototype.connect\n    if (pgModule.Client && pgModule.Client.prototype) {\n      this._wrap(pgModule.Client.prototype, \"connect\", this._getConnectPatchFn(\"client\"));\n      logger.debug(`[PgInstrumentation] Wrapped Client.prototype.connect`);\n    }\n\n    this.markModuleAsPatched(pgModule);\n    logger.debug(`[PgInstrumentation] PG module patching complete`);\n\n    return pgModule;\n  }\n\n  private _getQueryPatchFn(clientType: string) {\n    const self = this;\n\n    return (originalQuery: Function) => {\n      return function query(this: Query, ...args: any[]) {\n        // Parse query arguments - pg supports multiple signatures\n        let queryConfig: QueryConfig | null = null;\n        try {\n          queryConfig = self.parseQueryArgs(args);\n        } catch (error) {\n          logger.error(`[PgInstrumentation] error parsing query args:`, error);\n        }\n\n        if (!queryConfig || !queryConfig.text) {\n          // If we can't parse the query, let it pass through\n          logger.debug(`[PgInstrumentation] Could not parse query, returning`, args);\n          return originalQuery.apply(this, args);\n        }\n\n        const inputValue: PgClientInputValue = {\n          text: queryConfig.text,\n          values: queryConfig.values || [],\n          clientType,\n        };\n\n        // Handle replay mode (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          const stackTrace = captureStackTrace([\"PgInstrumentation\"]);\n\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              return self.handleNoOpReplayQuery(queryConfig);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              // Create span in replay mode\n              const packageName = inputValue.clientType === \"pool\" ? \"pg-pool\" : \"pg\";\n              const spanName = inputValue.clientType === \"pool\" ? \"pg-pool.query\" : \"pg.query\";\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalQuery.apply(this, args),\n                {\n                  name: spanName,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"query\",\n                  packageType: PackageType.PG,\n                  packageName: packageName,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self.handleReplayQuery(queryConfig, inputValue, spanInfo, stackTrace);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalQuery.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              // Record mode - create span and execute real query\n              // Create span for database query\n              const packageName = inputValue.clientType === \"pool\" ? \"pg-pool\" : \"pg\";\n              const spanName = inputValue.clientType === \"pool\" ? \"pg-pool.query\" : \"pg.query\";\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalQuery.apply(this, args),\n                {\n                  name: spanName,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"query\",\n                  packageType: PackageType.PG,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  packageName: packageName,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordQueryInSpan(\n                    spanInfo,\n                    originalQuery,\n                    queryConfig,\n                    args,\n                    this,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalQuery.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _getConnectPatchFn(clientType: string) {\n    const self = this;\n\n    return (originalConnect: Function) => {\n      return function connect(this: Connection, callback?: Function) {\n        const inputValue = { clientType };\n\n        // Handle replay mode (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              if (callback) {\n                process.nextTick(() => callback(null));\n                return;\n              } else {\n                return Promise.resolve();\n              }\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              // Create span in replay mode\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalConnect.apply(this, [callback]),\n                {\n                  name: `pg.connect`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"connect\",\n                  packageName: \"pg\",\n                  packageType: PackageType.PG,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self._handleReplayConnect(callback);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalConnect.apply(this, [callback]),\n            recordModeHandler: ({ isPreAppStart }) => {\n              // Record mode - create span and execute real connect\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalConnect.apply(this, [callback]),\n                {\n                  name: `pg.connect`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"connect\",\n                  packageName: \"pg\",\n                  packageType: PackageType.PG,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordConnectInSpan(spanInfo, originalConnect, callback, this);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalConnect.apply(this, [callback]);\n        }\n      };\n    };\n  }\n\n  parseQueryArgs(args: any[]): QueryConfig | null {\n    if (args.length === 0) return null;\n\n    const firstArg = args[0];\n\n    // String query: query(text, values?, callback?)\n    if (typeof firstArg === \"string\") {\n      const config: QueryConfig = {\n        text: firstArg,\n        callback: typeof args[args.length - 1] === \"function\" ? args[args.length - 1] : undefined,\n      };\n      if (Array.isArray(args[1])) {\n        config.values = args[1];\n      }\n      return config;\n    }\n\n    // Query config object: query(config, callback?)\n    if (typeof firstArg === \"object\" && firstArg.text) {\n      return {\n        text: firstArg.text,\n        values: firstArg.values,\n        callback: firstArg.callback || (typeof args[1] === \"function\" ? args[1] : undefined),\n      };\n    }\n\n    return null;\n  }\n\n  private _handleRecordQueryInSpan(\n    spanInfo: SpanInfo,\n    originalQuery: Function,\n    queryConfig: QueryConfig,\n    args: any[],\n    context: Query,\n  ): Query {\n    const hasCallback = !!queryConfig.callback;\n\n    if (hasCallback) {\n      // Callback-based query\n      const originalCallback = queryConfig.callback!;\n      const wrappedCallback = (error: Error | null, result?: PgResult) => {\n        if (error) {\n          logger.debug(\n            `[PgInstrumentation] PG query error (hasCallback): ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error ending span:`, error);\n          }\n        } else {\n          logger.debug(\n            `[PgInstrumentation] PG query completed successfully (hasCallback) (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            this._addOutputAttributesToSpan(spanInfo, result);\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error processing response:`, error);\n          }\n        }\n        return originalCallback(error, result);\n      };\n\n      // Replace callback in args\n      try {\n        const firstArg = args[0];\n        const isConfigObject = typeof firstArg === \"object\" && firstArg.text && firstArg.callback;\n\n        if (isConfigObject) {\n          // Callback was in config object\n          const configIndex = 0; // First argument is the config\n          args[configIndex] = { ...args[configIndex], callback: wrappedCallback };\n        } else {\n          // Callback was separate argument (last argument)\n          const callbackIndex = args.findIndex((arg) => typeof arg === \"function\");\n          if (callbackIndex >= 0) {\n            args[callbackIndex] = wrappedCallback;\n          }\n        }\n      } catch (error) {\n        logger.error(`[PgInstrumentation] error replacing callback:`, error, args);\n      }\n\n      return originalQuery.apply(context, args);\n    } else {\n      // Promise-based query\n      const promise = originalQuery.apply(context, args);\n\n      return promise\n        .then((result: PgResult) => {\n          logger.debug(\n            `[PgInstrumentation] PG query completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            this._addOutputAttributesToSpan(spanInfo, result);\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error processing response:`, error);\n          }\n          return result;\n        })\n        .catch((error: Error) => {\n          logger.debug(\n            `[PgInstrumentation] PG query error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error ending span:`, error);\n          }\n          throw error;\n        });\n    }\n  }\n\n  async handleNoOpReplayQuery(queryConfig: QueryConfig): Promise<any> {\n    const emptyResult = { rows: [], rowCount: 0 };\n    if (queryConfig.callback) {\n      process.nextTick(() => queryConfig.callback!(null, emptyResult));\n      return;\n    } else {\n      return Promise.resolve(emptyResult);\n    }\n  }\n\n  async handleReplayQuery(\n    queryConfig: QueryConfig,\n    inputValue: PgClientInputValue,\n    spanInfo: SpanInfo,\n    stackTrace?: string,\n  ): Promise<any> {\n    logger.debug(`[PgInstrumentation] Replaying PG query`);\n\n    const packageName = inputValue.clientType === \"pool\" ? \"pg-pool\" : \"pg\";\n    const spanName = inputValue.clientType === \"pool\" ? \"pg-pool.query\" : \"pg.query\";\n\n    // Look for matching recorded response\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: spanName,\n        inputValue: inputValue,\n        packageName: packageName,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"query\",\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      const queryText = queryConfig.text || inputValue.text || \"UNKNOWN_QUERY\";\n      logger.warn(`[PgInstrumentation] No mock data found for PG query: ${queryText}`);\n      throw new Error(`[PgInstrumentation] No mock data found for PG query: ${queryText}`);\n    }\n\n    // Convert string timestamps back to Date objects based on field metadata\n    const processedResult = this.convertPostgresTypes(mockData.result);\n\n    // Return mocked response\n    if (queryConfig.callback) {\n      process.nextTick(() => {\n        queryConfig.callback!(null, processedResult);\n      });\n      return;\n    } else {\n      return Promise.resolve(processedResult);\n    }\n  }\n\n  /**\n   * Convert PostgreSQL string values back to appropriate JavaScript types\n   * based on field metadata from the recorded response.\n   *\n   * Reference for data type IDs: https://jdbc.postgresql.org/documentation/publicapi/constant-values.html\n   */\n  private convertPostgresTypes(result: any): any {\n    if (!result || !result.fields || !result.rows) {\n      return result;\n    }\n\n    // Create a map of field names to their PostgreSQL data types\n    const fieldTypeMap: Record<string, number> = {};\n    result.fields.forEach((field: any) => {\n      fieldTypeMap[field.name] = field.dataTypeID;\n    });\n\n    // Convert rows based on field types\n    const convertedRows = result.rows.map((row: any, rowIndex: number) => {\n      const convertedRow = { ...row };\n\n      Object.keys(row).forEach((fieldName) => {\n        const dataTypeID = fieldTypeMap[fieldName];\n        const value = row[fieldName];\n\n        if (value === null || value === undefined) {\n          return; // Keep null/undefined values as-is\n        }\n\n        switch (dataTypeID) {\n          case 1184: // timestamptz (timestamp with timezone)\n          case 1114: // timestamp (timestamp without timezone)\n            if (typeof value === \"string\") {\n              const dateObj = new Date(value);\n              convertedRow[fieldName] = dateObj;\n            }\n            break;\n          case 1082: // date\n            if (typeof value === \"string\") {\n              convertedRow[fieldName] = new Date(value);\n            }\n            break;\n          case 1083: // time\n          case 1266: // timetz (time with timezone)\n            // Keep time fields as strings for now, as they're not typically\n            // converted to Date objects by pg client\n            break;\n          // Add other type conversions as needed\n          default:\n            // Keep other types as-is\n            break;\n        }\n      });\n\n      return convertedRow;\n    });\n\n    const finalResult = {\n      ...result,\n      rows: convertedRows,\n    };\n\n    return finalResult;\n  }\n\n  private _handleRecordConnectInSpan(\n    spanInfo: SpanInfo,\n    originalConnect: Function,\n    callback: Function | undefined,\n    context: Connection,\n  ): Connection {\n    if (callback) {\n      // Callback-based connect\n      const wrappedCallback = (error: Error | null) => {\n        if (error) {\n          logger.debug(\n            `[PgInstrumentation] PG connect error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error ending span:`, error);\n          }\n        } else {\n          logger.debug(\n            `[PgInstrumentation] PG connect completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: { connected: true },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error processing connect response:`, error);\n          }\n        }\n        return callback(error);\n      };\n\n      return originalConnect.call(context, wrappedCallback);\n    } else {\n      // Promise-based connect\n      const promise = originalConnect.call(context);\n\n      return promise\n        .then((result: Connection) => {\n          logger.debug(\n            `[PgInstrumentation] PG connect completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: { connected: true },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error processing connect response:`, error);\n          }\n          return result;\n        })\n        .catch((error: Error) => {\n          logger.debug(\n            `[PgInstrumentation] PG connect error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error ending span:`, error);\n          }\n          throw error;\n        });\n    }\n  }\n\n  private _handleReplayConnect(callback?: Function) {\n    logger.debug(`[PgInstrumentation] Replaying PG connect`);\n\n    // For connect operations, just simulate success\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    } else {\n      return Promise.resolve();\n    }\n  }\n\n  private _addOutputAttributesToSpan(spanInfo: SpanInfo, result?: PgResult): void {\n    if (!result) return;\n\n    const outputValue = {\n      command: result.command,\n      rowCount: result.rowCount,\n      oid: result.oid,\n      rows: result.rows || [],\n      fields: result.fields || [],\n    };\n\n    SpanUtils.addSpanAttributes(spanInfo.span, {\n      outputValue,\n    });\n  }\n\n  private _patchPgPoolModule(pgPoolModule: PgPoolModuleExports): PgPoolModuleExports {\n    if (this.isModulePatched(pgPoolModule)) {\n      logger.debug(`[PgInstrumentation] PG Pool module already patched, skipping`);\n      return pgPoolModule;\n    }\n\n    // Wrap Pool.prototype.query\n    if (pgPoolModule.prototype) {\n      this._wrap(pgPoolModule.prototype, \"query\", this._getQueryPatchFn(\"pool\"));\n      logger.debug(`[PgInstrumentation] Wrapped Pool.prototype.query`);\n    }\n\n    // Wrap Pool.prototype.connect\n    if (pgPoolModule.prototype) {\n      this._wrap(pgPoolModule.prototype, \"connect\", this._getPoolConnectPatchFn());\n      logger.debug(`[PgInstrumentation] Wrapped Pool.prototype.connect`);\n    }\n\n    this.markModuleAsPatched(pgPoolModule);\n    logger.debug(`[PgInstrumentation] PG Pool module patching complete`);\n\n    return pgPoolModule;\n  }\n\n  private _getPoolConnectPatchFn() {\n    const self = this;\n\n    return (originalConnect: Function) => {\n      return function connect(this: Connection, callback?: Function) {\n        const inputValue = { clientType: \"pool\" };\n\n        // Handle replay mode (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const mockClient = new TdPgClientMock(self);\n\n              if (callback) {\n                process.nextTick(() => callback(null, mockClient, () => {}));\n                return;\n              } else {\n                return Promise.resolve(mockClient);\n              }\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalConnect.apply(this, [callback]),\n                {\n                  name: `pg-pool.connect`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"connect\",\n                  packageName: \"pg-pool\",\n                  packageType: PackageType.PG,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self._handleReplayPoolConnect(spanInfo, callback);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalConnect.apply(this, [callback]),\n            recordModeHandler: ({ isPreAppStart }) => {\n              // Record mode - create span and execute real connect\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalConnect.apply(this, [callback]),\n                {\n                  name: `pg-pool.connect`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"connect\",\n                  packageName: \"pg-pool\",\n                  packageType: PackageType.PG,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordPoolConnectInSpan(\n                    spanInfo,\n                    originalConnect,\n                    callback,\n                    this,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalConnect.apply(this, [callback]);\n        }\n      };\n    };\n  }\n\n  private _handleRecordPoolConnectInSpan(\n    spanInfo: SpanInfo,\n    originalConnect: Function,\n    callback: Function | undefined,\n    context: Connection,\n  ): Connection {\n    if (callback) {\n      // Callback-based pool connect\n      const wrappedCallback = (error: Error | null, client?: PoolClient, done?: Function) => {\n        if (error) {\n          logger.debug(\n            `[PgInstrumentation] PG Pool connect error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error ending span:`, error);\n          }\n        } else {\n          logger.debug(\n            `[PgInstrumentation] PG Pool connect completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: {\n                connected: true,\n                hasClient: !!client,\n              },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error processing pool connect response:`, error);\n          }\n        }\n        return callback(error, client, done);\n      };\n\n      return originalConnect.call(context, wrappedCallback);\n    } else {\n      // Promise-based pool connect\n      const promise = originalConnect.call(context);\n\n      return promise\n        .then((client: PoolClient) => {\n          logger.debug(\n            `[PgInstrumentation] PG Pool connect completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: {\n                connected: true,\n                hasClient: !!client,\n              },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error processing pool connect response:`, error);\n          }\n          return client;\n        })\n        .catch((error: Error) => {\n          logger.debug(\n            `[PgInstrumentation] PG Pool connect error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[PgInstrumentation] error ending span:`, error);\n          }\n          throw error;\n        });\n    }\n  }\n\n  private _handleReplayPoolConnect(spanInfo: SpanInfo, callback?: Function) {\n    logger.debug(`[PgInstrumentation] Replaying PG Pool connect`);\n\n    // For pool connect operations, simulate returning a mock client\n    // The client's query method should also be instrumented for replay\n    const mockClient = new TdPgClientMock(this, spanInfo);\n\n    if (callback) {\n      process.nextTick(() => callback(null, mockClient, () => {}));\n      return;\n    } else {\n      return Promise.resolve(mockClient);\n    }\n  }\n\n  private _wrap(\n    target: Query | Connection | Client | Pool,\n    propertyName: string,\n    wrapper: (original: any) => any,\n  ): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","import { TdInstrumentationConfig } from \"../../core/baseClasses/TdInstrumentationAbstract\";\nimport { TuskDriftMode } from \"../../../core/TuskDrift\";\n\nexport interface PostgresClientInputValue {\n  query: string;\n  parameters: any[];\n  options?: Record<string, any>;\n  [key: string]: unknown;\n}\n\nexport interface PostgresTransactionInputValue {\n  query: \"BEGIN\" | \"COMMIT\" | \"ROLLBACK\";\n  parameters: any[];\n  options?: {\n    transactionOptions?: string;\n  };\n}\n\nexport interface PostgresConnectionInputValue {\n  connectionString?: string;\n  options?: Record<string, any>;\n}\n\nexport interface PostgresModuleExports {\n  sql?: Function;\n  default?: Function;\n  [key: string]: any;\n}\n\nexport interface PostgresInstrumentationConfig extends TdInstrumentationConfig {\n  requestHook?: (query: any) => void;\n  responseHook?: (result: any) => void;\n  mode?: TuskDriftMode;\n}\n\n/**\n * postgres.js result format with metadata\n */\nexport interface PostgresResult {\n  rows?: PostgresRow[];\n  command?: string;\n  count?: number;\n}\n\n/**\n * postgres.js row data (generic object with any properties)\n */\nexport type PostgresRow = Record<string, any>;\n\n/**\n * Result from convertPostgresTypes - can be either:\n * - A result object with {rows, command, count}\n * - A plain array of rows\n * - null/undefined\n */\nexport type PostgresConvertedResult =\n  | PostgresResult\n  | PostgresRow[];\n\nexport type PostgresOutputValueType = {\n  rows?: PostgresRow[];\n  command?: string;\n  count?: number;\n  _tdOriginalFormat: PostgresReturnType;\n}\n\n// Add this as a private method in your class\nexport function isPostgresOutputValueType(value: any): value is PostgresOutputValueType {\n  return (\n    value !== null &&\n    value !== undefined &&\n    typeof value === \"object\" &&\n    \"_tdOriginalFormat\" in value &&\n    Object.values(PostgresReturnType).includes(value._tdOriginalFormat)\n  );\n}\n\n/**\n * Transaction result\n */\nexport interface PostgresTransactionResult {\n  status: \"committed\" | \"rolled_back\";\n  result?: any;\n  error?: string;\n}\n\nexport enum PostgresReturnType {\n  ARRAY = \"array\",\n  OBJECT = \"object\",\n}","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { captureStackTrace, wrap } from \"../../core/utils\";\nimport { findMockResponseAsync } from \"../../core/utils/mockResponseUtils\";\nimport { handleRecordMode, handleReplayMode } from \"../../core/utils/modeUtils\";\nimport {\n  PostgresModuleExports,\n  PostgresClientInputValue,\n  PostgresInstrumentationConfig,\n  PostgresRow,\n  PostgresConvertedResult,\n  PostgresReturnType,\n  PostgresOutputValueType,\n  isPostgresOutputValueType,\n} from \"./types\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger, isEsm } from \"../../../core/utils\";\n\nexport class PostgresInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"PostgresInstrumentation\";\n  private mode: TuskDriftMode;\n  private tuskDrift: TuskDriftCore;\n\n  constructor(config: PostgresInstrumentationConfig = {}) {\n    super(\"postgres\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"postgres\",\n        supportedVersions: [\"3.*\"],\n        patch: (moduleExports: PostgresModuleExports) => this._patchPostgresModule(moduleExports),\n      }),\n    ];\n  }\n\n  private _patchPostgresModule(postgresModule: PostgresModuleExports): PostgresModuleExports {\n    logger.debug(`[PostgresInstrumentation] Patching Postgres module in ${this.mode} mode`);\n\n    if (this.isModulePatched(postgresModule)) {\n      logger.debug(`[PostgresInstrumentation] Postgres module already patched, skipping`);\n      return postgresModule;\n    }\n\n    const self = this;\n\n    if (isEsm(postgresModule)) {\n      // ESM Case: Default function exports are in the .default property\n      // In ESM: import postgres from 'postgres' gives { default: function(...) {...} }\n      // We need to wrap moduleExports.default, not the module itself\n      logger.debug(`[PostgresInstrumentation] Wrapping ESM default export`);\n      this._wrap(postgresModule, \"default\", (originalFunction: any) => {\n        return function (this: any, ...args: any[]) {\n          return self._handlePostgresConnection(originalFunction, args);\n        };\n      });\n    } else {\n      // CommonJS Case: The module IS the function directly\n      // In CJS: const postgres = require('postgres') gives the function directly\n      // We need to create a wrapped function and return it\n      logger.debug(`[PostgresInstrumentation] Module is a function (CJS style)`);\n      const originalFunction = postgresModule as any;\n\n      const wrappedFunction = function (...args: any[]) {\n        logger.debug(`[PostgresInstrumentation] Wrapped postgres() (CJS) called with args:`, args);\n        return self._handlePostgresConnection(originalFunction, args);\n      } as any;\n\n      // Copy ALL properties from original function to wrapped function\n      // This ensures the wrapped function has all the same properties (like .sql, etc.)\n      Object.setPrototypeOf(wrappedFunction, Object.getPrototypeOf(originalFunction));\n      Object.defineProperty(wrappedFunction, \"name\", { value: originalFunction.name });\n\n      // Copy all enumerable properties\n      for (const key in originalFunction) {\n        if (originalFunction.hasOwnProperty(key)) {\n          wrappedFunction[key] = originalFunction[key];\n        }\n      }\n\n      // Copy all own property descriptors (for non-enumerable properties)\n      Object.getOwnPropertyNames(originalFunction).forEach((key) => {\n        if (key !== \"prototype\" && key !== \"length\" && key !== \"name\") {\n          const descriptor = Object.getOwnPropertyDescriptor(originalFunction, key);\n          if (descriptor) {\n            Object.defineProperty(wrappedFunction, key, descriptor);\n          }\n        }\n      });\n\n      postgresModule = wrappedFunction;\n    }\n\n    // TODO: need to test that this actually gets patched in ESM mode\n    // Also patch the sql function if it exists as a named export\n    if (postgresModule.sql && typeof postgresModule.sql === \"function\") {\n      this._wrap(postgresModule, \"sql\", this._getSqlPatchFn());\n      logger.debug(`[PostgresInstrumentation] Wrapped sql function`);\n    }\n\n    this.markModuleAsPatched(postgresModule);\n    logger.debug(`[PostgresInstrumentation] Postgres module patching complete`);\n\n    return postgresModule;\n  }\n\n  private _handlePostgresConnection(originalFunction: Function, args: any[]): any {\n    // Extract connection parameters from args\n    // postgres() signature: postgres(url, options?) or postgres(options)\n    const connectionString = typeof args[0] === \"string\" ? args[0] : undefined;\n    const options = typeof args[0] === \"string\" ? args[1] : args[0];\n\n    const inputValue = {\n      connectionString: connectionString\n        ? this._sanitizeConnectionString(connectionString)\n        : undefined,\n      options: options ? this._sanitizeConnectionOptions(options) : undefined,\n    };\n\n    // Handle replay mode\n    if (this.mode === TuskDriftMode.REPLAY) {\n      return handleReplayMode({\n        noOpRequestHandler: () => {\n          try {\n            const sqlInstance = originalFunction(...args);\n            const wrappedInstance = this._wrapSqlInstance(sqlInstance);\n\n            return wrappedInstance;\n          } catch (error: any) {\n            logger.debug(\n              `[PostgresInstrumentation] Postgres connection error in replay: ${error.message}`,\n            );\n\n            throw error;\n          }\n        },\n        isServerRequest: false,\n        replayModeHandler: () => {\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => {\n              const sqlInstance = originalFunction(...args);\n              return this._wrapSqlInstance(sqlInstance);\n            },\n            {\n              name: \"postgres.connect\",\n              kind: SpanKind.CLIENT,\n              submodule: \"connect\",\n              packageType: PackageType.PG,\n              packageName: \"postgres\",\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue: inputValue,\n              isPreAppStart: false,\n            },\n            (spanInfo) => {\n              return this._handleReplayConnect(originalFunction, args);\n            },\n          );\n        },\n      });\n    } else if (this.mode === TuskDriftMode.RECORD) {\n      return handleRecordMode({\n        originalFunctionCall: () => {\n          const sqlInstance = originalFunction(...args);\n          return this._wrapSqlInstance(sqlInstance);\n        },\n        recordModeHandler: ({ isPreAppStart }) => {\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => {\n              const sqlInstance = originalFunction(...args);\n              return this._wrapSqlInstance(sqlInstance);\n            },\n            {\n              name: \"postgres.connect\",\n              kind: SpanKind.CLIENT,\n              submodule: \"connect\",\n              packageType: PackageType.PG,\n              packageName: \"postgres\",\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue: inputValue,\n              isPreAppStart,\n            },\n            (spanInfo) => {\n              return this._handleRecordConnect(spanInfo, originalFunction, args);\n            },\n          );\n        },\n        spanKind: SpanKind.CLIENT,\n      });\n    } else {\n      return originalFunction(...args);\n    }\n  }\n\n  private _sanitizeConnectionString(connectionString: string): string {\n    try {\n      // Remove password from connection string for security\n      const url = new URL(connectionString);\n      if (url.password) {\n        url.password = \"***\";\n      }\n      return url.toString();\n    } catch {\n      return \"[INVALID_URL]\";\n    }\n  }\n\n  private _sanitizeConnectionOptions(options: any): any {\n    if (!options || typeof options !== \"object\") {\n      return options;\n    }\n\n    const sanitized = { ...options };\n\n    // Remove sensitive fields\n    if (sanitized.password) {\n      sanitized.password = \"***\";\n    }\n    if (sanitized.ssl && typeof sanitized.ssl === \"object\") {\n      sanitized.ssl = { ...sanitized.ssl };\n      if (sanitized.ssl.key) sanitized.ssl.key = \"***\";\n      if (sanitized.ssl.cert) sanitized.ssl.cert = \"***\";\n      if (sanitized.ssl.ca) sanitized.ssl.ca = \"***\";\n    }\n\n    return sanitized;\n  }\n\n  private _handleRecordConnect(spanInfo: SpanInfo, originalFunction: Function, args: any[]): any {\n    const sqlInstance = originalFunction(...args);\n    const wrappedInstance = this._wrapSqlInstance(sqlInstance);\n\n    try {\n      logger.debug(\n        `[PostgresInstrumentation] Postgres connection created successfully (${SpanUtils.getTraceInfo()})`,\n      );\n      SpanUtils.addSpanAttributes(spanInfo.span, {\n        outputValue: { connected: true },\n      });\n      SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n    } catch (error) {\n      logger.error(`[PostgresInstrumentation] error adding span attributes:`, error);\n    }\n\n    return wrappedInstance;\n  }\n\n  private _handleReplayConnect(originalFunction: Function, args: any[]): any {\n    logger.debug(`[PostgresInstrumentation] Replaying Postgres connection`);\n\n    // In replay mode, we still create the sql instance but wrap it\n    // The actual queries will be mocked when they're executed\n    try {\n      const sqlInstance = originalFunction(...args);\n      const wrappedInstance = this._wrapSqlInstance(sqlInstance);\n\n      return wrappedInstance;\n    } catch (error: any) {\n      logger.debug(\n        `[PostgresInstrumentation] Postgres connection error in replay: ${error.message}`,\n      );\n\n      throw error;\n    }\n  }\n\n  private _wrapSqlInstance(sqlInstance: any): any {\n    if (!sqlInstance || typeof sqlInstance !== \"function\") {\n      return sqlInstance;\n    }\n\n    const self = this;\n    const originalSql = sqlInstance;\n\n    // Create wrapped sql function\n    const wrappedSql = function (strings: TemplateStringsArray, ...values: any[]) {\n      return self._handleSqlQuery(originalSql, strings, values);\n    };\n\n    // Copy all properties from the original sql instance\n    Object.setPrototypeOf(wrappedSql, Object.getPrototypeOf(originalSql));\n    for (const key in originalSql) {\n      if (typeof originalSql[key] !== \"function\") {\n        (wrappedSql as any)[key] = originalSql[key];\n      } else {\n        (wrappedSql as any)[key] = originalSql[key].bind(originalSql);\n      }\n    }\n\n    // Patch the unsafe method specifically\n    if (typeof originalSql.unsafe === \"function\") {\n      (wrappedSql as any).unsafe = self._wrapUnsafeMethod(originalSql);\n      logger.debug(`[PostgresInstrumentation] Wrapped unsafe method on sql instance`);\n    }\n\n    // Patch the begin method for transaction support\n    if (typeof originalSql.begin === \"function\") {\n      (wrappedSql as any).begin = self._wrapBeginMethod(originalSql);\n      logger.debug(`[PostgresInstrumentation] Wrapped begin method on sql instance`);\n    }\n\n    return wrappedSql;\n  }\n\n  private _wrapUnsafeMethod(sqlInstance: any) {\n    const self = this;\n    const originalUnsafe = sqlInstance.unsafe;\n\n    return function unsafe(\n      query: string,\n      parameters?: any[],\n      queryOptions?: { prepare?: boolean },\n    ): any {\n      return self._handleUnsafeQuery(sqlInstance, originalUnsafe, query, parameters, queryOptions);\n    };\n  }\n\n  private _wrapBeginMethod(sqlInstance: any) {\n    const self = this;\n    const originalBegin = sqlInstance.begin;\n\n    return function begin(\n      optionsOrCallback?: string | ((sql: any) => any),\n      callback?: (sql: any) => any,\n    ): any {\n      // Handle both signatures: begin(callback) and begin(options, callback)\n      const options = typeof optionsOrCallback === \"string\" ? optionsOrCallback : \"\";\n      const transactionCallback =\n        typeof optionsOrCallback === \"function\" ? optionsOrCallback : callback;\n\n      return self._handleBeginTransaction(sqlInstance, originalBegin, options, transactionCallback);\n    };\n  }\n\n  private _getSqlPatchFn() {\n    const self = this;\n\n    return (originalSql: Function) => {\n      return function sql(strings: TemplateStringsArray, ...values: any[]) {\n        return self._handleSqlQuery(originalSql, strings, values);\n      };\n    };\n  }\n\n  private _handleSqlQuery(\n    originalSql: Function,\n    strings: TemplateStringsArray,\n    values: any[],\n  ): any {\n    // Reconstruct the query from template strings and values\n    let query = \"\";\n    for (let i = 0; i < strings.length; i++) {\n      query += strings[i];\n      if (i < values.length) {\n        query += `$${i + 1}`; // PostgreSQL parameter placeholder\n      }\n    }\n\n    const inputValue: PostgresClientInputValue = {\n      query: query.trim(),\n      parameters: values,\n    };\n\n    // Handle replay mode (only if app is ready)\n    if (this.mode === TuskDriftMode.REPLAY) {\n      const stackTrace = captureStackTrace([\"PostgresInstrumentation\"]);\n\n      return handleReplayMode({\n        noOpRequestHandler: () => {\n          return;\n        },\n        isServerRequest: false,\n        replayModeHandler: () => {\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => originalSql.call(this, strings, ...values),\n            {\n              name: \"postgres.query\",\n              kind: SpanKind.CLIENT,\n              submodule: \"query\",\n              packageType: PackageType.PG,\n              packageName: \"postgres\",\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue: inputValue,\n              isPreAppStart: false,\n            },\n            (spanInfo) => {\n              return this.handleReplaySqlQuery({\n                inputValue,\n                spanInfo,\n                submodule: \"query\",\n                name: \"postgres.query\",\n                stackTrace,\n              });\n            },\n          );\n        },\n      });\n    } else if (this.mode === TuskDriftMode.RECORD) {\n      return handleRecordMode({\n        originalFunctionCall: () => originalSql.call(this, strings, ...values),\n        recordModeHandler: ({ isPreAppStart }) => {\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => originalSql.call(this, strings, ...values),\n            {\n              name: \"postgres.query\",\n              kind: SpanKind.CLIENT,\n              submodule: \"query\",\n              packageType: PackageType.PG,\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              packageName: \"postgres\",\n              inputValue: inputValue,\n              isPreAppStart,\n            },\n            (spanInfo) => {\n              return this._handleRecordQueryInSpan(spanInfo, originalSql, strings, values);\n            },\n          );\n        },\n        spanKind: SpanKind.CLIENT,\n      });\n    } else {\n      // Should never happen since we're only patching record and replay modes\n      return originalSql.call(this, strings, ...values);\n    }\n  }\n\n  private _handleUnsafeQuery(\n    sqlInstance: any,\n    originalUnsafe: Function,\n    query: string,\n    parameters?: any[],\n    queryOptions?: { prepare?: boolean },\n  ): any {\n    // Create a function that calls unsafe with the correct arguments\n    const executeUnsafe = () => {\n      // Only pass arguments that were actually provided\n      if (queryOptions !== undefined) {\n        return originalUnsafe.call(sqlInstance, query, parameters, queryOptions);\n      } else if (parameters !== undefined) {\n        return originalUnsafe.call(sqlInstance, query, parameters);\n      } else {\n        return originalUnsafe.call(sqlInstance, query);\n      }\n    };\n\n    const inputValue: PostgresClientInputValue = {\n      query: query.trim(),\n      parameters: parameters || [],\n      options: queryOptions,\n    };\n\n    if (this.mode === TuskDriftMode.REPLAY) {\n      const stackTrace = captureStackTrace([\"PostgresInstrumentation\"]);\n\n      return handleReplayMode({\n        noOpRequestHandler: () => {\n          return Promise.resolve(undefined);\n        },\n        isServerRequest: false,\n        replayModeHandler: () => {\n          return this._createPendingQueryWrapper(() => {\n            return SpanUtils.createAndExecuteSpan(\n              this.mode,\n              () => executeUnsafe(),\n              {\n                name: \"postgres.unsafe\",\n                kind: SpanKind.CLIENT,\n                submodule: \"unsafe\",\n                packageType: PackageType.PG,\n                packageName: \"postgres\",\n                instrumentationName: this.INSTRUMENTATION_NAME,\n                inputValue: inputValue,\n                isPreAppStart: false,\n              },\n              (spanInfo) => {\n                return this.handleReplayUnsafeQuery({\n                  inputValue,\n                  spanInfo,\n                  submodule: \"unsafe\",\n                  name: \"postgres.unsafe\",\n                  stackTrace,\n                });\n              },\n            );\n          });\n        },\n      });\n    } else if (this.mode === TuskDriftMode.RECORD) {\n      return handleRecordMode({\n        originalFunctionCall: executeUnsafe,\n        recordModeHandler: ({ isPreAppStart }) => {\n          // Execute postgres.js query first, then create span afterwards\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            executeUnsafe,\n            {\n              name: \"postgres.unsafe\",\n              kind: SpanKind.CLIENT,\n              submodule: \"unsafe\",\n              packageType: PackageType.PG,\n              packageName: \"postgres\",\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue: inputValue,\n              isPreAppStart,\n            },\n            (spanInfo) => {\n              return this._executeThenAddOutputAttributes(spanInfo, executeUnsafe);\n            },\n          );\n        },\n        spanKind: SpanKind.CLIENT,\n      });\n    } else {\n      // Should never happen since we're only patching record and replay modes\n      return executeUnsafe();\n    }\n  }\n\n  private _handleBeginTransaction(\n    sqlInstance: any,\n    originalBegin: Function,\n    options: string,\n    transactionCallback?: (sql: any) => any,\n  ): any {\n    const inputValue = {\n      query: \"BEGIN\",\n      options: options ? { transactionOptions: options } : undefined,\n    };\n\n    const executeBegin = () => {\n      if (options && transactionCallback) {\n        return originalBegin.call(sqlInstance, options, transactionCallback);\n      } else if (transactionCallback) {\n        return originalBegin.call(sqlInstance, transactionCallback);\n      } else {\n        return originalBegin.call(sqlInstance, options || undefined);\n      }\n    };\n\n    if (this.mode === TuskDriftMode.REPLAY) {\n      const stackTrace = captureStackTrace([\"PostgresInstrumentation\"]);\n\n      return handleReplayMode({\n        noOpRequestHandler: () => {\n          return;\n        },\n        isServerRequest: false,\n        replayModeHandler: () => {\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => executeBegin(),\n            {\n              name: \"postgres.begin\",\n              kind: SpanKind.CLIENT,\n              submodule: \"transaction\",\n              packageType: PackageType.PG,\n              packageName: \"postgres\",\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue: inputValue,\n              isPreAppStart: false,\n            },\n            (spanInfo) => {\n              return this._handleReplayBeginTransaction(spanInfo, options, stackTrace);\n            },\n          );\n        },\n      });\n    } else if (this.mode === TuskDriftMode.RECORD) {\n      return handleRecordMode({\n        originalFunctionCall: executeBegin,\n        recordModeHandler: ({ isPreAppStart }) => {\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            executeBegin,\n            {\n              name: \"postgres.begin\",\n              kind: SpanKind.CLIENT,\n              submodule: \"transaction\",\n              packageType: PackageType.PG,\n              packageName: \"postgres\",\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue: inputValue,\n              isPreAppStart,\n            },\n            (spanInfo) => {\n              return this._handleRecordBeginTransaction(spanInfo, executeBegin);\n            },\n          );\n        },\n        spanKind: SpanKind.CLIENT,\n      });\n    } else {\n      return executeBegin();\n    }\n  }\n\n  /**\n   * Execute postgres.js unsafe query and create span afterwards.\n   *\n   * postgres.js has sophisticated internal session and connection management\n   * that is extremely sensitive to async context changes. Unlike the regular 'pg' library,\n   * postgres.js maintains internal state using promise identity and async context tracking.\n   *\n   * The issue: promise chain modification breaks postgres.js.\n   * Calling .then()/.catch() creates new promise objects, breaking postgres.js's internal tracking\n   *\n   * Solution: We must execute the postgres.js query in its completely unmodified context:\n   * - Return the original promise object unchanged\n   * - Use promise.finally() to track completion without creating a new promise chain\n   *\n   * This preserves postgres.js's internal session management while still providing tracing.\n   * The 'pg' library doesn't have this issue because it has simpler internal state management.\n   */\n  private _executeThenAddOutputAttributes(\n    spanInfo: SpanInfo,\n    executeUnsafe: () => Promise<any>,\n  ): Promise<any> {\n    const promise = executeUnsafe();\n\n    // Use finally() which doesn't change the promise chain's behavior\n    promise.finally(() => {\n      // Create span after completion without affecting the original promise\n      promise\n        .then((result) => {\n          logger.debug(`[PostgresInstrumentation] Postgres unsafe query completed successfully`);\n          try {\n            this._addOutputAttributesToSpan(spanInfo, result);\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(\n              `[PostgresInstrumentation] error processing unsafe query response:`,\n              error,\n            );\n          }\n        })\n        .catch((error) => {\n          logger.debug(`[PostgresInstrumentation] Postgres unsafe query error: ${error.message}`);\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[PostgresInstrumentation] error ending span:`, error);\n          }\n        });\n    });\n\n    return promise; // Return the original promise\n  }\n\n  private _handleRecordBeginTransaction(\n    spanInfo: SpanInfo,\n    executeBegin: () => Promise<any>,\n  ): Promise<any> {\n    const promise = executeBegin();\n\n    // Use finally() which doesn't change the promise chain's behavior\n    promise.finally(() => {\n      // Create span after completion without affecting the original promise\n      promise\n        .then((result) => {\n          logger.debug(\n            `[PostgresInstrumentation] Postgres transaction completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: { status: \"committed\", result },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[PostgresInstrumentation] error processing transaction response:`, error);\n          }\n        })\n        .catch((error) => {\n          logger.debug(\n            `[PostgresInstrumentation] Postgres transaction error (rolled back): ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: { status: \"rolled_back\", error: error.message },\n            });\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (spanError) {\n            logger.error(`[PostgresInstrumentation] error ending span:`, spanError);\n          }\n        });\n    });\n\n    return promise; // Return the original promise\n  }\n\n  private async _handleReplayBeginTransaction(\n    spanInfo: SpanInfo,\n    options?: string,\n    stackTrace?: string,\n  ): Promise<any> {\n    logger.debug(`[PostgresInstrumentation] Replaying Postgres transaction`);\n\n    // Find mock data for the transaction\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: \"postgres.begin\",\n        inputValue: {\n          query: \"BEGIN\",\n          options: options ? { transactionOptions: options } : undefined,\n        },\n        packageName: \"postgres\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"transaction\",\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      logger.warn(`[PostgresInstrumentation] No mock data found for transaction BEGIN`);\n      throw new Error(`[PostgresInstrumentation] No matching mock found for transaction BEGIN`);\n    }\n\n    logger.debug(\n      `[PostgresInstrumentation] Found mock data for transaction: ${JSON.stringify(mockData)}`,\n    );\n\n    // Transaction results are stored directly without type conversion\n    const transactionResult = mockData.result;\n\n    // Check if the transaction was successful or rolled back\n    const wasCommitted =\n      transactionResult &&\n      typeof transactionResult === \"object\" &&\n      \"status\" in transactionResult &&\n      transactionResult.status === \"committed\";\n\n    if (wasCommitted) {\n      return transactionResult.result;\n    } else {\n      // Transaction was rolled back\n      const errorMessage =\n        transactionResult &&\n        typeof transactionResult === \"object\" &&\n        \"error\" in transactionResult &&\n        transactionResult.error\n          ? transactionResult.error\n          : \"Transaction rolled back\";\n      throw new Error(errorMessage);\n    }\n  }\n\n  private async _handleRecordQueryInSpan(\n    spanInfo: SpanInfo,\n    originalSql: Function,\n    strings: TemplateStringsArray,\n    values: any[],\n  ): Promise<any> {\n    try {\n      const result = await originalSql.call(this, strings, ...values);\n\n      try {\n        logger.debug(\n          `[PostgresInstrumentation] Postgres query completed successfully (${SpanUtils.getTraceInfo()})`,\n        );\n\n        this._addOutputAttributesToSpan(spanInfo, result);\n        SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n      } catch (error) {\n        logger.error(`[PostgresInstrumentation] error processing query response:`, error);\n      }\n\n      return result;\n    } catch (error: any) {\n      try {\n        logger.debug(\n          `[PostgresInstrumentation] Postgres query error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n        );\n        SpanUtils.endSpan(spanInfo.span, {\n          code: SpanStatusCode.ERROR,\n          message: error.message,\n        });\n      } catch (spanError) {\n        logger.error(`[PostgresInstrumentation] error ending span:`, spanError);\n      }\n\n      throw error;\n    }\n  }\n\n  async handleReplaySqlQuery({\n    inputValue,\n    spanInfo,\n    submodule,\n    name,\n    stackTrace,\n  }: {\n    inputValue: PostgresClientInputValue;\n    spanInfo: SpanInfo;\n    submodule: string;\n    name: string;\n    stackTrace?: string;\n  }): Promise<PostgresRow[] | undefined> {\n    logger.debug(`[PostgresInstrumentation] Replaying Postgres sql query`);\n\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name,\n        inputValue: inputValue,\n        packageName: \"postgres\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: submodule,\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      const queryText = inputValue.query || \"UNKNOWN_QUERY\";\n      logger.warn(\n        `[PostgresInstrumentation] No mock data found for Postgres sql query: ${queryText}`,\n      );\n      throw new Error(\n        `[PostgresInstrumentation] No matching mock found for Postgres sql query: ${queryText}`,\n      );\n    }\n\n    logger.debug(\n      `[PostgresInstrumentation] Found mock data for Postgres sql query: ${JSON.stringify(mockData)}`,\n    );\n\n    const processedResult = this.convertPostgresTypes(mockData.result);\n\n    logger.debug(\n      `[PostgresInstrumentation] Sql query processed result: ${JSON.stringify(processedResult)}`,\n    );\n\n    // Template string queries return just the rows array\n    // Type guard: check if processedResult has a 'rows' property (PostgresResult type)\n    const isResultObject =\n      processedResult && typeof processedResult === \"object\" && \"rows\" in processedResult;\n    const rows = isResultObject\n      ? processedResult.rows || []\n      : (processedResult as PostgresRow[]) || [];\n\n    // postgres.js returns an array with metadata properties attached\n    const resultArray = Object.assign(rows, {\n      command: isResultObject ? processedResult.command : undefined,\n      count: isResultObject ? processedResult.count : undefined,\n    });\n    return resultArray;\n  }\n\n  async handleReplayUnsafeQuery({\n    inputValue,\n    spanInfo,\n    submodule,\n    name,\n    stackTrace,\n  }: {\n    inputValue: PostgresClientInputValue;\n    spanInfo: SpanInfo;\n    submodule: string;\n    name: string;\n    stackTrace?: string;\n  }): Promise<PostgresConvertedResult | undefined> {\n    logger.debug(`[PostgresInstrumentation] Replaying Postgres unsafe query`);\n\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name,\n        inputValue: inputValue,\n        packageName: \"postgres\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: submodule,\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      const queryText = inputValue.query || \"UNKNOWN_QUERY\";\n      logger.warn(\n        `[PostgresInstrumentation] No mock data found for Postgres unsafe query: ${queryText}`,\n      );\n      throw new Error(\n        `[PostgresInstrumentation] No matching mock found for Postgres unsafe query: ${queryText}`,\n      );\n    }\n\n    logger.debug(\n      `[PostgresInstrumentation] Found mock data for Postgres unsafe query: ${JSON.stringify(mockData)}`,\n    );\n\n    const processedResult = this.convertPostgresTypes(mockData.result);\n\n    logger.debug(\n      `[PostgresInstrumentation] Unsafe query processed result: ${JSON.stringify(processedResult)}`,\n    );\n\n    return processedResult;\n  }\n\n  /**\n   * Create a postgres.js-compatible PendingQuery wrapper.\n   * This creates a thenable object with .values(), .raw(), etc. methods\n   * that matches the postgres.js PendingQuery interface.\n   *\n   * NOTE: This wrapper is ONLY needed for unsafe() queries, not template string queries.\n   * - unsafe() returns a PendingQuery with .values() method that Drizzle calls\n   * - Template strings return a plain Promise/array and don't need the wrapper\n   *\n   * Also NOTE: unsafe expects a PendingQuery in return. This includes most common ones, but not all.\n   * There is a possiblity we need to add the rest of the methods to the PendingQuery interface from \"postgres\" library.\n   */\n  private _createPendingQueryWrapper(\n    queryPromiseFactory: () => Promise<PostgresConvertedResult>,\n  ): Promise<any> {\n    // Create the main promise\n    const mainPromise = queryPromiseFactory();\n\n    // Create a thenable wrapper that has the postgres.js methods\n    const pendingQuery = Object.assign(mainPromise, {\n      // .values() returns a promise that resolves to array of value arrays\n      values: () => {\n        return mainPromise.then((result: PostgresConvertedResult) => {\n          if (!result) {\n            return [];\n          }\n\n          // Type guard: check if result is a PostgresResult object with 'rows' property\n          const isResultObject = typeof result === \"object\" && \"rows\" in result;\n          const rows = isResultObject ? result.rows || [] : Array.isArray(result) ? result : [];\n\n          // Convert rows to arrays if they're objects\n          const valueArrays = rows.map((row: PostgresRow) => {\n            if (Array.isArray(row)) {\n              return row;\n            }\n            // If row is an object, convert to array of values\n            return Object.values(row);\n          });\n\n          // Return array with metadata\n          return Object.assign(valueArrays, {\n            command: isResultObject ? result.command : undefined,\n            count: isResultObject ? result.count : undefined,\n          });\n        });\n      },\n    });\n\n    return pendingQuery;\n  }\n\n  /**\n   * Convert PostgreSQL string values back to appropriate JavaScript types\n   * based on common PostgreSQL data patterns.\n   */\n  private convertPostgresTypes(result: any): PostgresConvertedResult | undefined {\n    // if result is not of type PostgresOutputValueType, throw an error\n    if (!isPostgresOutputValueType(result)) {\n      logger.error(\n        `[PostgresInstrumentation] output value is not of type PostgresOutputValueType: ${JSON.stringify(result)}`,\n      );\n      return undefined;\n    }\n\n    if (!result) {\n      return undefined;\n    }\n\n    // Check for our metadata flag\n    const { _tdOriginalFormat: originalFormat, ...convertedResult } = result;\n\n    // Handle postgres.js result format: { command, count, rows }\n    if (originalFormat === PostgresReturnType.OBJECT) {\n      return convertedResult;\n    } else if (originalFormat === PostgresReturnType.ARRAY) {\n      return convertedResult.rows || [];\n    } else {\n      logger.error(`[PostgresInstrumentation] Invalid result format: ${JSON.stringify(result)}`);\n      return undefined;\n    }\n  }\n\n  private _addOutputAttributesToSpan(spanInfo: SpanInfo, result?: any): void {\n    if (!result) return;\n\n    let outputValue: PostgresOutputValueType;\n\n    if (Array.isArray(result)) {\n      // Direct array result - wrap with metadata to indicate original format\n      logger.debug(\n        `[PostgresInstrumentation] Adding output attributes to span for array result: ${JSON.stringify(result)}`,\n      );\n      outputValue = {\n        _tdOriginalFormat: PostgresReturnType.ARRAY,\n        rows: result,\n      };\n    } else if (typeof result === \"object\") {\n      logger.debug(\n        `[PostgresInstrumentation] Adding output attributes to span for object result: ${JSON.stringify(result)}`,\n      );\n      outputValue = {\n        _tdOriginalFormat: PostgresReturnType.OBJECT,\n        count: result.count,\n        rows: result.rows,\n        command: result.command,\n      };\n    } else {\n      logger.error(`[PostgresInstrumentation] Invalid result format: ${JSON.stringify(result)}`);\n      return;\n    }\n\n    SpanUtils.addSpanAttributes(spanInfo.span, {\n      outputValue,\n    });\n  }\n\n  private _wrap(target: any, propertyName: string, wrapper: (original: any) => any): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","import { EventEmitter } from \"events\";\nimport { Mysql2Instrumentation } from \"../Instrumentation\";\nimport { createMockInputValue } from \"../../../../core/utils\";\nimport { SpanInfo } from \"../../../../core/tracing/SpanUtils\";\nimport { logger } from \"../../../../core/utils/logger\";\nimport { QueryCallback } from \"../types\";\nimport { captureStackTrace } from \"src/instrumentation/core/utils\";\n\n/**\n * Mock MySQL2 connection/pool connection for replay mode\n * Extends EventEmitter to properly handle all connection methods and events\n */\nexport class TdMysql2ConnectionMock extends EventEmitter {\n  private mysql2Instrumentation: Mysql2Instrumentation;\n  private clientType: \"connection\" | \"pool\" | \"poolConnection\"; // Add this property\n  private spanInfo?: SpanInfo;\n\n  // MySQL2 connection properties\n  public threadId: number | null = null;\n  public config: any = {\n    host: \"localhost\",\n    port: 3306,\n    database: \"mock\",\n    user: \"mock\",\n  };\n\n  constructor(\n    mysql2Instrumentation: Mysql2Instrumentation,\n    clientType: \"connection\" | \"pool\" | \"poolConnection\" = \"poolConnection\", // Add parameter with default\n    spanInfo?: SpanInfo,\n  ) {\n    super();\n    this.mysql2Instrumentation = mysql2Instrumentation;\n    this.spanInfo = spanInfo;\n    this.clientType = clientType; // Store the clientType\n    this.threadId = 1;\n  }\n\n  query(...args: any[]) {\n    logger.debug(`[TdMysql2ConnectionMock] Mock connection query intercepted in REPLAY mode`);\n\n    const stackTrace = captureStackTrace([\"TdMysql2ConnectionMock\"]);\n\n    // Parse query arguments similar to the main query patch\n    const queryConfig = this.mysql2Instrumentation.parseQueryArgs(args);\n\n    if (!queryConfig || !queryConfig.sql) {\n      logger.debug(\n        `[TdMysql2ConnectionMock] Could not parse mock connection query, returning empty result`,\n      );\n      const emptyResult = { rows: [], fields: [] };\n      if (queryConfig?.callback) {\n        process.nextTick(() => queryConfig.callback!(null, emptyResult.rows, emptyResult.fields));\n        return;\n      }\n      return Promise.resolve([emptyResult.rows, emptyResult.fields]);\n    }\n\n    const rawInputValue = {\n      sql: queryConfig.sql,\n      values: queryConfig.values || [],\n      clientType: this.clientType, // Use the stored clientType instead of hardcoded value\n    };\n\n    const inputValue = createMockInputValue(rawInputValue);\n\n    if (this.spanInfo) {\n      return this.mysql2Instrumentation.handleReplayQuery(\n        queryConfig,\n        inputValue,\n        this.spanInfo,\n        stackTrace,\n      );\n    } else {\n      // Background query\n      // Return an EventEmitter that immediately completes with empty results\n      return this.mysql2Instrumentation.handleNoOpReplayQuery(queryConfig);\n    }\n  }\n\n  execute(...args: any[]) {\n    logger.debug(`[TdMysql2ConnectionMock] Mock connection execute intercepted in REPLAY mode`);\n\n    const stackTrace = captureStackTrace([\"TdMysql2ConnectionMock\"]);\n\n    // Parse execute arguments similar to the main execute patch\n    const queryConfig = this.mysql2Instrumentation.parseQueryArgs(args);\n\n    if (!queryConfig || !queryConfig.sql) {\n      logger.debug(\n        `[TdMysql2ConnectionMock] Could not parse mock connection execute, returning empty result`,\n      );\n      const emptyResult = { rows: [], fields: [] };\n      if (queryConfig?.callback) {\n        process.nextTick(() => queryConfig.callback!(null, emptyResult.rows, emptyResult.fields));\n        return;\n      }\n      return Promise.resolve([emptyResult.rows, emptyResult.fields]);\n    }\n\n    const rawInputValue = {\n      sql: queryConfig.sql,\n      values: queryConfig.values || [],\n      clientType: this.clientType, // Use the stored clientType instead of hardcoded value\n    };\n\n    const inputValue = createMockInputValue(rawInputValue);\n\n    if (this.spanInfo) {\n      return this.mysql2Instrumentation.handleReplayQuery(\n        queryConfig,\n        inputValue,\n        this.spanInfo,\n        stackTrace,\n      );\n    } else {\n      // Background query\n      // Return an EventEmitter that immediately completes with empty results\n      return this.mysql2Instrumentation.handleNoOpReplayQuery(queryConfig);\n    }\n  }\n\n  release() {\n    // No-op for pool connection release - just emit end event to simulate normal behavior\n    this.emit(\"end\");\n  }\n\n  destroy() {\n    // No-op for connection destroy\n    this.emit(\"end\");\n  }\n\n  end(callback?: QueryCallback) {\n    this.emit(\"end\");\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    }\n    return Promise.resolve();\n  }\n\n  connect(callback?: QueryCallback) {\n    // Mock connect - already connected\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    }\n    return Promise.resolve();\n  }\n\n  ping(callback?: QueryCallback) {\n    // Mock ping\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    }\n    return Promise.resolve();\n  }\n\n  beginTransaction(callback?: QueryCallback) {\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    }\n    return Promise.resolve();\n  }\n\n  commit(callback?: QueryCallback) {\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    }\n    return Promise.resolve();\n  }\n\n  rollback(callback?: QueryCallback) {\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    }\n    return Promise.resolve();\n  }\n\n  changeUser(options: any, callback?: QueryCallback) {\n    if (callback) {\n      process.nextTick(() => callback(null));\n      return;\n    }\n    return Promise.resolve();\n  }\n\n  pause() {\n    // No-op\n  }\n\n  resume() {\n    // No-op\n  }\n\n  escape(value: any): string {\n    if (value === null || value === undefined) {\n      return \"NULL\";\n    }\n    if (typeof value === \"string\") {\n      return `'${value.replace(/'/g, \"''\")}'`;\n    }\n    if (typeof value === \"number\") {\n      return value.toString();\n    }\n    if (typeof value === \"boolean\") {\n      return value ? \"1\" : \"0\";\n    }\n    if (value instanceof Date) {\n      return `'${value.toISOString()}'`;\n    }\n    return `'${String(value)}'`;\n  }\n\n  escapeId(identifier: string): string {\n    return `\\`${identifier.replace(/`/g, \"``\")}\\``;\n  }\n\n  format(sql: string, values?: any[]): string {\n    if (!values || values.length === 0) {\n      return sql;\n    }\n    let index = 0;\n    return sql.replace(/\\?/g, () => {\n      if (index >= values.length) {\n        return \"?\";\n      }\n      return this.escape(values[index++]);\n    });\n  }\n}\n","import { EventEmitter } from \"events\";\nimport { SpanKind } from \"@opentelemetry/api\";\nimport { SpanInfo } from \"../../../../core/tracing/SpanUtils\";\nimport { TuskDriftCore } from \"../../../../core/TuskDrift\";\nimport { findMockResponseAsync } from \"../../../core/utils/mockResponseUtils\";\nimport { logger } from \"../../../../core/utils/logger\";\nimport { Mysql2QueryConfig, Mysql2InputValue, Mysql2Result, QueryError } from \"../types\";\n\n/**\n * Handles replay mode for MySQL2 query operations\n */\nexport class TdMysql2QueryMock {\n  private readonly INSTRUMENTATION_NAME = \"Mysql2Instrumentation\";\n  private tuskDrift: TuskDriftCore;\n\n  constructor() {\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  /**\n   * Handle replay of a MySQL2 query (query or execute)\n   */\n  handleReplayQuery(\n    queryConfig: Mysql2QueryConfig,\n    inputValue: Mysql2InputValue,\n    spanInfo: SpanInfo,\n    submoduleName: string = \"query\",\n    stackTrace?: string,\n  ): EventEmitter {\n    logger.debug(`[Mysql2Instrumentation] Replaying MySQL2 query`);\n\n    const clientType = inputValue.clientType;\n    const spanName = `mysql2.${clientType}.${submoduleName}`;\n\n    // Always return an EventEmitter, even when using callbacks\n    // This is because mysql2 always returns a Query object (EventEmitter)\n    // that can be used for both streaming and callback modes\n    // Sequelize relies on this behavior to call .setMaxListeners() on the return value\n    return this._handleQuery(\n      queryConfig,\n      inputValue,\n      spanInfo,\n      spanName,\n      submoduleName,\n      stackTrace,\n    );\n  }\n\n  /**\n   * Handle background query requests (outside of trace context)\n   * Returns an EventEmitter that immediately completes with empty results\n   */\n  handleNoOpReplayQuery(queryConfig: Mysql2QueryConfig): EventEmitter {\n    logger.debug(`[Mysql2Instrumentation] Background query detected, returning empty result`);\n\n    const emitter = new EventEmitter();\n\n    // Make it thenable for Promise/await support\n    (emitter as any).then = function (\n      onResolve?: (value: any) => any,\n      onReject?: (error: any) => any,\n    ) {\n      return new Promise((resolve) => {\n        emitter.once(\"end\", () => {\n          resolve([[], []]); // Empty rows and fields\n        });\n      }).then(onResolve, onReject);\n    };\n\n    // Emit completion asynchronously\n    process.nextTick(() => {\n      const callback = queryConfig.callback;\n      if (callback) {\n        callback(null, [], []);\n      }\n      emitter.emit(\"end\");\n    });\n\n    return emitter;\n  }\n\n  /**\n   * Handle query - always returns an EventEmitter (like mysql2 does)\n   * This handles both callback and streaming modes\n   * The EventEmitter is also thenable (has a .then() method) to support await/Promise usage\n   */\n  private _handleQuery(\n    queryConfig: Mysql2QueryConfig,\n    inputValue: Mysql2InputValue,\n    spanInfo: SpanInfo,\n    spanName: string,\n    submoduleName: string,\n    stackTrace?: string,\n  ): EventEmitter {\n    const emitter = new EventEmitter();\n\n    // Store rows and fields for Promise resolution\n    let storedRows: any = null;\n    let storedFields: any = null;\n\n    // Make the emitter thenable so it can be awaited\n    // This is how mysql2's Query object works - it's an EventEmitter that can also be awaited\n    (emitter as any).then = function (\n      onResolve?: (value: any) => any,\n      onReject?: (error: any) => any,\n    ) {\n      return new Promise((resolve, reject) => {\n        emitter.once(\"end\", () => {\n          resolve([storedRows, storedFields]);\n        });\n        emitter.once(\"error\", (error) => {\n          reject(error);\n        });\n      }).then(onResolve, onReject);\n    };\n\n    // Fetch mock data asynchronously and emit events\n    (async () => {\n      try {\n        const mockData = await this._fetchMockData(\n          inputValue,\n          spanInfo,\n          spanName,\n          submoduleName,\n          stackTrace,\n        );\n\n        if (!mockData) {\n          const sql = queryConfig.sql || inputValue.sql || \"UNKNOWN_QUERY\";\n          logger.warn(`[Mysql2Instrumentation] No mock data found for MySQL2 query: ${sql}`);\n\n          throw new Error(`[Mysql2Instrumentation] No matching mock found for query: ${sql}`);\n        }\n\n        // Convert mock data to proper MySQL2 format\n        const processedResult = this._convertMysql2Types(mockData.result);\n\n        // Store for Promise resolution\n        storedRows = processedResult.rows;\n        storedFields = processedResult.fields;\n\n        // Emit events to simulate query execution\n        process.nextTick(() => {\n          // Emit fields event if available\n          if (processedResult.fields) {\n            emitter.emit(\"fields\", processedResult.fields);\n          }\n\n          // If callback is provided, call it with results\n          if (queryConfig.callback) {\n            queryConfig.callback(null, processedResult.rows, processedResult.fields);\n          }\n\n          // Emit result events for streaming mode\n          if (Array.isArray(processedResult.rows)) {\n            for (const row of processedResult.rows) {\n              emitter.emit(\"result\", row);\n            }\n          } else if (processedResult.rows) {\n            emitter.emit(\"result\", processedResult.rows);\n          }\n\n          // Always emit end event\n          emitter.emit(\"end\");\n        });\n      } catch (error) {\n        process.nextTick(() => {\n          // If callback provided, call it with error\n          if (queryConfig.callback) {\n            queryConfig.callback(error as QueryError);\n          }\n          // Always emit error event\n          emitter.emit(\"error\", error);\n        });\n      }\n    })();\n\n    return emitter;\n  }\n\n  /**\n   * Fetch mock data from CLI\n   */\n  private async _fetchMockData(\n    inputValue: Mysql2InputValue,\n    spanInfo: SpanInfo,\n    spanName: string,\n    submoduleName: string,\n    stackTrace?: string,\n  ) {\n    return await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: spanName,\n        inputValue: inputValue,\n        packageName: \"mysql2\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: submoduleName,\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n  }\n\n  /**\n   * Convert stored MySQL2 values back to appropriate JavaScript types\n   */\n  private _convertMysql2Types(result: any): Mysql2Result {\n    if (!result) {\n      return { rows: [], fields: [] };\n    }\n\n    // If result has rows and fields, use them\n    if (result.rows !== undefined && result.fields !== undefined) {\n      return {\n        rows: result.rows,\n        fields: result.fields,\n      };\n    }\n\n    // Otherwise, assume result is the rows\n    return {\n      rows: result,\n      fields: [],\n    };\n  }\n}\n","import { SpanKind } from \"@opentelemetry/api\";\nimport { SpanInfo } from \"../../../../core/tracing/SpanUtils\";\nimport { TuskDriftCore } from \"../../../../core/TuskDrift\";\nimport { findMockResponseAsync } from \"../../../core/utils/mockResponseUtils\";\nimport { logger } from \"../../../../core/utils/logger\";\n\n/**\n * Mock for MySQL2 connection events (connect/error)\n * Handles replay of recorded connection establishment events in REPLAY mode\n * Recording happens through normal SpanUtils flow in RECORD mode\n */\nexport class TdMysql2ConnectionEventMock {\n  private readonly INSTRUMENTATION_NAME = \"Mysql2Instrumentation\";\n  private spanInfo: SpanInfo;\n  private tuskDrift: TuskDriftCore;\n\n  constructor(spanInfo: SpanInfo) {\n    this.spanInfo = spanInfo;\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  /**\n   * Get recorded connection event for replay\n   * Returns { output } for success, or throws error if connection failed\n   * The connection events are recorded automatically via SpanUtils in record mode\n   */\n  async getReplayedConnectionEvent(inputValue: any): Promise<{ output?: any }> {\n    logger.debug(`[TdMysql2ConnectionEventMock] Retrieving recorded connection event`);\n\n    try {\n      const mockData = await findMockResponseAsync({\n        mockRequestData: {\n          traceId: this.spanInfo.traceId,\n          spanId: this.spanInfo.spanId,\n          name: \"mysql2.connection.create\",\n          inputValue,\n          packageName: \"mysql2\",\n          instrumentationName: this.INSTRUMENTATION_NAME,\n          submoduleName: \"connectEvent\",\n          kind: SpanKind.CLIENT,\n        },\n        tuskDrift: this.tuskDrift,\n      });\n\n      if (!mockData) {\n        logger.warn(`[TdMysql2ConnectionEventMock] No mock data found, using default success`);\n        return { output: {} };\n      }\n\n      // Return the recorded connection result\n      return {\n        output: mockData.result || {},\n      };\n    } catch (error) {\n      logger.error(`[TdMysql2ConnectionEventMock] Error getting replay value:`, error);\n      // Return empty success event as fallback\n      return { output: {} };\n    }\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { TdInstrumentationNodeModuleFile } from \"../../core/baseClasses/TdInstrumentationNodeModuleFile\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { wrap, isWrapped } from \"../../core/utils/shimmerUtils\";\nimport { handleRecordMode, handleReplayMode } from \"../../core/utils/modeUtils\";\nimport {\n  Mysql2InputValue,\n  Mysql2InstrumentationConfig,\n  Mysql2QueryConfig,\n  Connection,\n  Pool,\n  PoolConnection,\n  QueryError,\n  FieldPacket,\n  QueryCallback,\n} from \"./types\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger } from \"../../../core/utils/logger\";\nimport { TdMysql2ConnectionMock } from \"./mocks/TdMysql2ConnectionMock\";\nimport { TdMysql2QueryMock } from \"./mocks/TdMysql2QueryMock\";\nimport { captureStackTrace } from \"src/instrumentation/core/utils\";\nimport { TdMysql2ConnectionEventMock } from \"./mocks/TdMysql2ConnectionEventMock\";\nimport { EventEmitter } from \"events\";\n\n// Version ranges for mysql2\nconst COMPLETE_SUPPORTED_VERSIONS = \">=2.3.3 <4.0.0\";\nconst V2_3_3_TO_3_11_4 = \">=2.3.3 <3.11.5\";\nconst V3_11_5_TO_4_0 = \">=3.11.5 <4.0.0\";\n\nexport class Mysql2Instrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"Mysql2Instrumentation\";\n  private mode: TuskDriftMode;\n  private queryMock: TdMysql2QueryMock;\n\n  constructor(config: Mysql2InstrumentationConfig = {}) {\n    super(\"mysql2\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.queryMock = new TdMysql2QueryMock();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"mysql2\",\n        supportedVersions: [COMPLETE_SUPPORTED_VERSIONS],\n        files: [\n          // For v2.3.3-3.11.4: lib/connection.js with prototypes AND class wrapping\n          new TdInstrumentationNodeModuleFile({\n            name: \"mysql2/lib/connection.js\",\n            supportedVersions: [V2_3_3_TO_3_11_4],\n            patch: (moduleExports: any) => this._patchConnectionV2(moduleExports),\n          }),\n          // For v3.11.5+: lib/base/connection.js with prototypes only\n          new TdInstrumentationNodeModuleFile({\n            name: \"mysql2/lib/base/connection.js\",\n            supportedVersions: [V3_11_5_TO_4_0],\n            patch: (moduleExports: any) => this._patchBaseConnection(moduleExports),\n          }),\n          // For v3.11.5+: lib/connection.js with class wrapping only\n          new TdInstrumentationNodeModuleFile({\n            name: \"mysql2/lib/connection.js\",\n            supportedVersions: [V3_11_5_TO_4_0],\n            patch: (moduleExports: any) => this._patchConnectionV3(moduleExports),\n          }),\n          // For v2.3.3-3.11.4: lib/pool.js with prototypes AND class wrapping\n          new TdInstrumentationNodeModuleFile({\n            name: \"mysql2/lib/pool.js\",\n            supportedVersions: [V2_3_3_TO_3_11_4],\n            patch: (moduleExports: any) => this._patchPoolV2(moduleExports),\n          }),\n          // For v3.11.5+: lib/pool.js with class wrapping only\n          new TdInstrumentationNodeModuleFile({\n            name: \"mysql2/lib/pool.js\",\n            supportedVersions: [V3_11_5_TO_4_0],\n            patch: (moduleExports: any) => this._patchPoolV3(moduleExports),\n          }),\n          // For v2.3.3-3.11.4: lib/pool_connection.js with class wrapping\n          new TdInstrumentationNodeModuleFile({\n            name: \"mysql2/lib/pool_connection.js\",\n            supportedVersions: [V2_3_3_TO_3_11_4],\n            patch: (moduleExports: any) => this._patchPoolConnectionV2(moduleExports),\n          }),\n          // For v3.11.5+: lib/pool_connection.js with class wrapping\n          new TdInstrumentationNodeModuleFile({\n            name: \"mysql2/lib/pool_connection.js\",\n            supportedVersions: [V3_11_5_TO_4_0],\n            patch: (moduleExports: any) => this._patchPoolConnectionV3(moduleExports),\n          }),\n        ],\n      }),\n    ];\n  }\n\n  private _patchBaseConnection(BaseConnectionClass: any): any {\n    logger.debug(`[Mysql2Instrumentation] Patching BaseConnection class`);\n\n    if (this.isModulePatched(BaseConnectionClass)) {\n      logger.debug(`[Mysql2Instrumentation] BaseConnection class already patched, skipping`);\n      return BaseConnectionClass;\n    }\n\n    // Wrap BaseConnection.prototype.query\n    if (BaseConnectionClass.prototype && BaseConnectionClass.prototype.query) {\n      if (!isWrapped(BaseConnectionClass.prototype.query)) {\n        this._wrap(BaseConnectionClass.prototype, \"query\", this._getQueryPatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped BaseConnection.prototype.query`);\n      }\n    }\n\n    // Wrap BaseConnection.prototype.execute (prepared statements)\n    if (BaseConnectionClass.prototype && BaseConnectionClass.prototype.execute) {\n      if (!isWrapped(BaseConnectionClass.prototype.execute)) {\n        this._wrap(BaseConnectionClass.prototype, \"execute\", this._getExecutePatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped BaseConnection.prototype.execute`);\n      }\n    }\n\n    // Wrap BaseConnection.prototype.connect\n    if (BaseConnectionClass.prototype && BaseConnectionClass.prototype.connect) {\n      if (!isWrapped(BaseConnectionClass.prototype.connect)) {\n        this._wrap(BaseConnectionClass.prototype, \"connect\", this._getConnectPatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped BaseConnection.prototype.connect`);\n      }\n    }\n\n    // Wrap BaseConnection.prototype.ping\n    if (BaseConnectionClass.prototype && BaseConnectionClass.prototype.ping) {\n      if (!isWrapped(BaseConnectionClass.prototype.ping)) {\n        this._wrap(BaseConnectionClass.prototype, \"ping\", this._getPingPatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped BaseConnection.prototype.ping`);\n      }\n    }\n\n    // Wrap BaseConnection.prototype.end\n    if (BaseConnectionClass.prototype && BaseConnectionClass.prototype.end) {\n      if (!isWrapped(BaseConnectionClass.prototype.end)) {\n        this._wrap(BaseConnectionClass.prototype, \"end\", this._getEndPatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped BaseConnection.prototype.end`);\n      }\n    }\n\n    this.markModuleAsPatched(BaseConnectionClass);\n    logger.debug(`[Mysql2Instrumentation] BaseConnection class patching complete`);\n\n    return BaseConnectionClass;\n  }\n\n  // v2.3.3-3.11.4: Patch prototypes AND wrap constructor\n  private _patchConnectionV2(ConnectionClass: any): any {\n    logger.debug(`[Mysql2Instrumentation] Patching Connection class (v2)`);\n\n    if (this.isModulePatched(ConnectionClass)) {\n      logger.debug(`[Mysql2Instrumentation] Connection class already patched, skipping`);\n      return ConnectionClass;\n    }\n\n    // Patch all connection prototype methods\n    this._patchConnectionPrototypes(ConnectionClass);\n\n    // Wrap the Connection constructor to handle connection events\n    const patchedConnectionClass = this._getPatchedConnectionClass(ConnectionClass);\n\n    this.markModuleAsPatched(ConnectionClass);\n\n    logger.debug(`[Mysql2Instrumentation] Connection class (v2) patching complete`);\n    return patchedConnectionClass;\n  }\n\n  // v3.11.5+: Only wrap constructor (prototypes already patched in base/connection.js)\n  private _patchConnectionV3(ConnectionClass: any): any {\n    logger.debug(`[Mysql2Instrumentation] Connection class (v3) - wrapping constructor only`);\n    // For v3.11.5+, lib/connection.js extends base/connection.js\n    // We already patched the prototypes in base/connection.js\n    // But we still need to wrap the constructor for connection event handling\n    const patchedConnectionClass = this._getPatchedConnectionClass(ConnectionClass);\n    return patchedConnectionClass;\n  }\n\n  // Helper to patch all connection prototype methods (used by both versions)\n  private _patchConnectionPrototypes(ConnectionClass: any): void {\n    // Wrap Connection.prototype.query\n    if (ConnectionClass.prototype && ConnectionClass.prototype.query) {\n      if (!isWrapped(ConnectionClass.prototype.query)) {\n        this._wrap(ConnectionClass.prototype, \"query\", this._getQueryPatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped Connection.prototype.query`);\n      }\n    }\n\n    // Wrap Connection.prototype.execute (prepared statements)\n    if (ConnectionClass.prototype && ConnectionClass.prototype.execute) {\n      if (!isWrapped(ConnectionClass.prototype.execute)) {\n        this._wrap(ConnectionClass.prototype, \"execute\", this._getExecutePatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped Connection.prototype.execute`);\n      }\n    }\n\n    // Wrap Connection.prototype.connect\n    if (ConnectionClass.prototype && ConnectionClass.prototype.connect) {\n      if (!isWrapped(ConnectionClass.prototype.connect)) {\n        this._wrap(ConnectionClass.prototype, \"connect\", this._getConnectPatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped Connection.prototype.connect`);\n      }\n    }\n\n    // Wrap Connection.prototype.ping\n    if (ConnectionClass.prototype && ConnectionClass.prototype.ping) {\n      if (!isWrapped(ConnectionClass.prototype.ping)) {\n        this._wrap(ConnectionClass.prototype, \"ping\", this._getPingPatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped Connection.prototype.ping`);\n      }\n    }\n\n    // Wrap Connection.prototype.end\n    if (ConnectionClass.prototype && ConnectionClass.prototype.end) {\n      if (!isWrapped(ConnectionClass.prototype.end)) {\n        this._wrap(ConnectionClass.prototype, \"end\", this._getEndPatchFn(\"connection\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped Connection.prototype.end`);\n      }\n    }\n  }\n\n  // v2.3.3-3.11.4: Patch prototypes for Pool\n  private _patchPoolV2(PoolClass: any): any {\n    logger.debug(`[Mysql2Instrumentation] Patching Pool class (v2)`);\n\n    if (this.isModulePatched(PoolClass)) {\n      logger.debug(`[Mysql2Instrumentation] Pool class already patched, skipping`);\n      return PoolClass;\n    }\n\n    // Patch pool prototype methods\n    this._patchPoolPrototypes(PoolClass);\n\n    this.markModuleAsPatched(PoolClass);\n\n    logger.debug(`[Mysql2Instrumentation] Pool class (v2) patching complete`);\n    return PoolClass;\n  }\n\n  // v3.11.5+: Patch prototypes for Pool (there's no base/pool.js)\n  private _patchPoolV3(PoolClass: any): any {\n    logger.debug(`[Mysql2Instrumentation] Patching Pool class (v3)`);\n\n    if (this.isModulePatched(PoolClass)) {\n      logger.debug(`[Mysql2Instrumentation] Pool class already patched, skipping`);\n      return PoolClass;\n    }\n\n    // Patch pool prototype methods\n    this._patchPoolPrototypes(PoolClass);\n\n    this.markModuleAsPatched(PoolClass);\n\n    logger.debug(`[Mysql2Instrumentation] Pool class (v3) patching complete`);\n    return PoolClass;\n  }\n\n  // Helper to patch pool prototype methods\n  private _patchPoolPrototypes(PoolClass: any): void {\n    // Wrap Pool.prototype.query\n    if (PoolClass.prototype && PoolClass.prototype.query) {\n      if (!isWrapped(PoolClass.prototype.query)) {\n        this._wrap(PoolClass.prototype, \"query\", this._getQueryPatchFn(\"pool\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped Pool.prototype.query`);\n      }\n    }\n\n    // Wrap Pool.prototype.execute (prepared statements)\n    if (PoolClass.prototype && PoolClass.prototype.execute) {\n      if (!isWrapped(PoolClass.prototype.execute)) {\n        this._wrap(PoolClass.prototype, \"execute\", this._getExecutePatchFn(\"pool\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped Pool.prototype.execute`);\n      }\n    }\n\n    // Wrap Pool.prototype.getConnection\n    if (PoolClass.prototype && PoolClass.prototype.getConnection) {\n      if (!isWrapped(PoolClass.prototype.getConnection)) {\n        this._wrap(PoolClass.prototype, \"getConnection\", this._getPoolGetConnectionPatchFn());\n        logger.debug(`[Mysql2Instrumentation] Wrapped Pool.prototype.getConnection`);\n      }\n    }\n\n    // Wrap Pool.prototype.end\n    if (PoolClass.prototype && PoolClass.prototype.end) {\n      if (!isWrapped(PoolClass.prototype.end)) {\n        this._wrap(PoolClass.prototype, \"end\", this._getEndPatchFn(\"pool\"));\n        logger.debug(`[Mysql2Instrumentation] Wrapped Pool.prototype.end`);\n      }\n    }\n  }\n\n  // v2.3.3-3.11.4: PoolConnection extends Connection, so inherits patched methods\n  private _patchPoolConnectionV2(PoolConnectionClass: any): any {\n    logger.debug(\n      `[Mysql2Instrumentation] PoolConnection class (v2) - skipping (inherits from Connection)`,\n    );\n    // PoolConnection extends Connection, so it inherits the patched methods\n    // No additional patching needed\n    return PoolConnectionClass;\n  }\n\n  // v3.11.5+: PoolConnection extends Connection, so inherits patched methods\n  private _patchPoolConnectionV3(PoolConnectionClass: any): any {\n    logger.debug(\n      `[Mysql2Instrumentation] PoolConnection class (v3) - skipping (inherits from Connection)`,\n    );\n    // PoolConnection extends Connection, so it inherits the patched methods\n    // No additional patching needed\n    return PoolConnectionClass;\n  }\n\n  private _getQueryPatchFn(clientType: \"connection\" | \"pool\" | \"poolConnection\") {\n    const self = this;\n\n    return (originalQuery: Function) => {\n      return function query(this: Connection | Pool | PoolConnection, ...args: any[]) {\n        // Parse query arguments - mysql2 supports multiple signatures\n        let queryConfig: Mysql2QueryConfig | null = null;\n        try {\n          queryConfig = self.parseQueryArgs(args);\n        } catch (error) {\n          logger.error(`[Mysql2Instrumentation] error parsing query args:`, error);\n        }\n\n        if (!queryConfig || !queryConfig.sql) {\n          // If we can't parse the query, let it pass through\n          logger.debug(`[Mysql2Instrumentation] Could not parse query, returning`, args);\n          return originalQuery.apply(this, args);\n        }\n\n        const inputValue: Mysql2InputValue = {\n          sql: queryConfig.sql,\n          values: queryConfig.values || [],\n          clientType,\n        };\n\n        // Handle replay mode (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          const stackTrace = captureStackTrace([\"Mysql2Instrumentation\"]);\n\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              return self.queryMock.handleNoOpReplayQuery(queryConfig);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              const spanName = `mysql2.${clientType}.query`;\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalQuery.apply(this, args),\n                {\n                  name: spanName,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"query\",\n                  packageType: PackageType.MYSQL,\n                  packageName: \"mysql2\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self.handleReplayQuery(\n                    queryConfig,\n                    inputValue,\n                    spanInfo,\n                    \"query\",\n                    stackTrace,\n                  );\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalQuery.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              // Record mode - create span and execute real query\n              const spanName = `mysql2.${clientType}.query`;\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalQuery.apply(this, args),\n                {\n                  name: spanName,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"query\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  packageName: \"mysql2\",\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordQueryInSpan(\n                    spanInfo,\n                    originalQuery,\n                    queryConfig,\n                    args,\n                    this,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalQuery.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _getExecutePatchFn(clientType: \"connection\" | \"pool\" | \"poolConnection\") {\n    const self = this;\n\n    return (originalExecute: Function) => {\n      return function execute(this: Connection | Pool | PoolConnection, ...args: any[]) {\n        // Parse execute arguments - similar to query but for prepared statements\n        let queryConfig: Mysql2QueryConfig | null = null;\n        try {\n          queryConfig = self.parseQueryArgs(args);\n        } catch (error) {\n          logger.error(`[Mysql2Instrumentation] error parsing execute args:`, error);\n        }\n\n        if (!queryConfig || !queryConfig.sql) {\n          // If we can't parse the query, let it pass through\n          logger.debug(`[Mysql2Instrumentation] Could not parse execute, returning`, args);\n          return originalExecute.apply(this, args);\n        }\n\n        const inputValue: Mysql2InputValue = {\n          sql: queryConfig.sql,\n          values: queryConfig.values || [],\n          clientType,\n        };\n\n        // Handle replay mode (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          const stackTrace = captureStackTrace([\"Mysql2Instrumentation\"]);\n\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              return self.queryMock.handleNoOpReplayQuery(queryConfig);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              const spanName = `mysql2.${clientType}.execute`;\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalExecute.apply(this, args),\n                {\n                  name: spanName,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"execute\",\n                  packageType: PackageType.MYSQL,\n                  packageName: \"mysql2\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self.handleReplayQuery(\n                    queryConfig,\n                    inputValue,\n                    spanInfo,\n                    \"execute\",\n                    stackTrace,\n                  );\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalExecute.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              // Record mode - create span and execute real query\n              const spanName = `mysql2.${clientType}.execute`;\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalExecute.apply(this, args),\n                {\n                  name: spanName,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"execute\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  packageName: \"mysql2\",\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordQueryInSpan(\n                    spanInfo,\n                    originalExecute,\n                    queryConfig,\n                    args,\n                    this,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalExecute.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _getPoolGetConnectionPatchFn() {\n    const self = this;\n\n    return (originalGetConnection: Function) => {\n      return function getConnection(this: Pool, callback?: QueryCallback) {\n        const inputValue = { clientType: \"pool\" as const };\n\n        // Handle replay mode (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              return self.handleNoOpReplayGetConnection(callback);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalGetConnection.apply(this, [callback]),\n                {\n                  name: `mysql2.pool.getConnection`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"getConnection\",\n                  packageName: \"mysql2\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self._handleReplayPoolGetConnection(spanInfo, callback);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalGetConnection.apply(this, [callback]),\n            recordModeHandler: ({ isPreAppStart }) => {\n              // Record mode - create span and execute real getConnection\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalGetConnection.apply(this, [callback]),\n                {\n                  name: `mysql2.pool.getConnection`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"getConnection\",\n                  packageName: \"mysql2\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordPoolGetConnectionInSpan(\n                    spanInfo,\n                    originalGetConnection,\n                    callback,\n                    this,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalGetConnection.apply(this, [callback]);\n        }\n      };\n    };\n  }\n\n  private _getConnectPatchFn(clientType: \"connection\" | \"pool\" | \"poolConnection\") {\n    const self = this;\n\n    return (originalConnect: Function) => {\n      return function connect(this: Connection, callback?: Function) {\n        const inputValue = { clientType };\n\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              if (callback) {\n                process.nextTick(() => callback(null));\n                return;\n              }\n              return Promise.resolve();\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalConnect.apply(this, [callback]),\n                {\n                  name: `mysql2.${clientType}.connect`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"connect\",\n                  packageName: \"mysql2\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  // In replay mode, just return success immediately\n                  if (callback) {\n                    process.nextTick(() => callback(null));\n                    return;\n                  }\n                  return Promise.resolve();\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalConnect.apply(this, [callback]),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalConnect.apply(this, [callback]),\n                {\n                  name: `mysql2.${clientType}.connect`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"connect\",\n                  packageName: \"mysql2\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleSimpleCallbackMethod(\n                    spanInfo,\n                    originalConnect,\n                    callback,\n                    this,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalConnect.apply(this, [callback]);\n        }\n      };\n    };\n  }\n\n  private _getPingPatchFn(clientType: \"connection\" | \"pool\" | \"poolConnection\") {\n    const self = this;\n\n    return (originalPing: Function) => {\n      return function ping(this: Connection, callback?: Function) {\n        const inputValue = { clientType };\n\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              if (callback) {\n                process.nextTick(() => callback(null));\n                return;\n              }\n              return Promise.resolve();\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalPing.apply(this, [callback]),\n                {\n                  name: `mysql2.${clientType}.ping`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"ping\",\n                  packageName: \"mysql2\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  // In replay mode, just return success immediately\n                  if (callback) {\n                    process.nextTick(() => callback(null));\n                    return;\n                  }\n                  return Promise.resolve();\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalPing.apply(this, [callback]),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalPing.apply(this, [callback]),\n                {\n                  name: `mysql2.${clientType}.ping`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"ping\",\n                  packageName: \"mysql2\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleSimpleCallbackMethod(spanInfo, originalPing, callback, this);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalPing.apply(this, [callback]);\n        }\n      };\n    };\n  }\n\n  private _getEndPatchFn(clientType: \"connection\" | \"pool\" | \"poolConnection\") {\n    const self = this;\n\n    return (originalEnd: Function) => {\n      return function end(this: Connection, callback?: Function) {\n        const inputValue = { clientType };\n\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              if (callback) {\n                process.nextTick(() => callback(null));\n                return;\n              }\n              return Promise.resolve();\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalEnd.apply(this, [callback]),\n                {\n                  name: `mysql2.${clientType}.end`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"end\",\n                  packageName: \"mysql2\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  // In replay mode, just return success immediately\n                  if (callback) {\n                    process.nextTick(() => callback(null));\n                    return;\n                  }\n                  return Promise.resolve();\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalEnd.apply(this, [callback]),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalEnd.apply(this, [callback]),\n                {\n                  name: `mysql2.${clientType}.end`,\n                  kind: SpanKind.CLIENT,\n                  submodule: \"end\",\n                  packageName: \"mysql2\",\n                  packageType: PackageType.MYSQL,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleSimpleCallbackMethod(spanInfo, originalEnd, callback, this);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalEnd.apply(this, [callback]);\n        }\n      };\n    };\n  }\n\n  private _handleSimpleCallbackMethod(\n    spanInfo: SpanInfo,\n    originalMethod: Function,\n    callback: Function | undefined,\n    context: any,\n  ): any {\n    if (callback) {\n      const wrappedCallback = (error: Error | null) => {\n        if (error) {\n          logger.debug(\n            `[Mysql2Instrumentation] MySQL2 method error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[Mysql2Instrumentation] error ending span:`, error);\n          }\n        } else {\n          logger.debug(\n            `[Mysql2Instrumentation] MySQL2 method completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: { success: true },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[Mysql2Instrumentation] error processing response:`, error);\n          }\n        }\n        return callback(error);\n      };\n\n      return originalMethod.call(context, wrappedCallback);\n    } else {\n      // No callback provided - some methods might return a promise, some might not\n      // For methods like connect(), ping(), end(), we need to handle both cases\n      const result = originalMethod.call(context);\n\n      // Check if result is a promise\n      if (result && typeof result.then === \"function\") {\n        return result\n          .then(() => {\n            logger.debug(\n              `[Mysql2Instrumentation] MySQL2 method completed successfully (${SpanUtils.getTraceInfo()})`,\n            );\n            try {\n              SpanUtils.addSpanAttributes(spanInfo.span, {\n                outputValue: { success: true },\n              });\n              SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n            } catch (error) {\n              logger.error(`[Mysql2Instrumentation] error processing response:`, error);\n            }\n          })\n          .catch((error: Error) => {\n            logger.debug(\n              `[Mysql2Instrumentation] MySQL2 method error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n            );\n            try {\n              SpanUtils.endSpan(spanInfo.span, {\n                code: SpanStatusCode.ERROR,\n                message: error.message,\n              });\n            } catch (error) {\n              logger.error(`[Mysql2Instrumentation] error ending span:`, error);\n            }\n            throw error;\n          });\n      } else {\n        // Not a promise - just return the result and end the span successfully\n        logger.debug(\n          `[Mysql2Instrumentation] MySQL2 method completed (non-promise) (${SpanUtils.getTraceInfo()})`,\n        );\n        try {\n          SpanUtils.addSpanAttributes(spanInfo.span, {\n            outputValue: { success: true },\n          });\n          SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n        } catch (error) {\n          logger.error(`[Mysql2Instrumentation] error processing response:`, error);\n        }\n        return result;\n      }\n    }\n  }\n\n  parseQueryArgs(args: any[]): Mysql2QueryConfig | null {\n    if (args.length === 0) return null;\n\n    const firstArg = args[0];\n\n    // String query: query(sql, values?, callback?)\n    if (typeof firstArg === \"string\") {\n      const config: Mysql2QueryConfig = {\n        sql: firstArg,\n        callback: typeof args[args.length - 1] === \"function\" ? args[args.length - 1] : undefined,\n      };\n      if (Array.isArray(args[1])) {\n        config.values = args[1];\n      } else if (args.length > 1 && typeof args[1] !== \"function\") {\n        config.values = [args[1]];\n      }\n      return config;\n    }\n\n    // Query options object: query(options, callback?)\n    if (typeof firstArg === \"object\" && firstArg.sql) {\n      return {\n        sql: firstArg.sql,\n        values: firstArg.values,\n        callback: firstArg.callback || (typeof args[1] === \"function\" ? args[1] : undefined),\n      };\n    }\n\n    return null;\n  }\n\n  private _handleRecordQueryInSpan(\n    spanInfo: SpanInfo,\n    originalQuery: Function,\n    queryConfig: Mysql2QueryConfig,\n    args: any[],\n    context: Connection | Pool | PoolConnection,\n  ): any {\n    const hasCallback = !!queryConfig.callback;\n\n    if (hasCallback) {\n      // Callback-based query\n      const originalCallback = queryConfig.callback!;\n      const wrappedCallback = (error: QueryError | null, results?: any, fields?: FieldPacket[]) => {\n        if (error) {\n          logger.debug(\n            `[Mysql2Instrumentation] MySQL2 query error (hasCallback): ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[Mysql2Instrumentation] error ending span:`, error);\n          }\n        } else {\n          logger.debug(\n            `[Mysql2Instrumentation] MySQL2 query completed successfully (hasCallback) (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            this._addOutputAttributesToSpan(spanInfo, results, fields);\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[Mysql2Instrumentation] error processing response:`, error);\n          }\n        }\n        return originalCallback(error, results, fields);\n      };\n\n      // Replace callback in args\n      try {\n        const firstArg = args[0];\n        const isOptionsObject = typeof firstArg === \"object\" && firstArg.sql;\n\n        if (isOptionsObject && firstArg.callback) {\n          // Callback was in options object\n          args[0] = { ...args[0], callback: wrappedCallback };\n        } else {\n          // Callback was separate argument (last argument)\n          const callbackIndex = args.findIndex((arg) => typeof arg === \"function\");\n          if (callbackIndex >= 0) {\n            args[callbackIndex] = wrappedCallback;\n          }\n        }\n      } catch (error) {\n        logger.error(`[Mysql2Instrumentation] error replacing callback:`, error, args);\n      }\n\n      return originalQuery.apply(context, args);\n    } else {\n      // Promise-based query or streaming query (no callback)\n      const result = originalQuery.apply(context, args);\n\n      // For streaming queries (event emitters), attach event listeners\n      // In mysql2, streaming queries are identified by checking if result has 'on' method\n      // and we're NOT using it as a promise (not calling .then() explicitly)\n      if (result && typeof result.on === \"function\") {\n        // Collect data for streaming queries\n        const streamResults: any[] = [];\n        let streamFields: any = null;\n\n        result\n          .on(\"error\", (error: Error) => {\n            logger.debug(\n              `[Mysql2Instrumentation] MySQL2 stream query error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n            );\n            try {\n              SpanUtils.endSpan(spanInfo.span, {\n                code: SpanStatusCode.ERROR,\n                message: error.message,\n              });\n            } catch (error) {\n              logger.error(`[Mysql2Instrumentation] error ending span:`, error);\n            }\n          })\n          .on(\"fields\", (fields: any) => {\n            streamFields = fields;\n          })\n          .on(\"result\", (row: any) => {\n            streamResults.push(row);\n          })\n          .on(\"end\", () => {\n            logger.debug(\n              `[Mysql2Instrumentation] MySQL2 stream query completed (${SpanUtils.getTraceInfo()})`,\n            );\n            try {\n              this._addOutputAttributesToSpan(spanInfo, streamResults, streamFields);\n              SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n            } catch (error) {\n              logger.error(`[Mysql2Instrumentation] error ending span:`, error);\n            }\n          });\n      }\n\n      return result;\n    }\n  }\n\n  handleReplayQuery(\n    queryConfig: Mysql2QueryConfig,\n    inputValue: Mysql2InputValue,\n    spanInfo: SpanInfo,\n    submoduleName: string = \"query\",\n    stackTrace?: string,\n  ): EventEmitter {\n    return this.queryMock.handleReplayQuery(\n      queryConfig,\n      inputValue,\n      spanInfo,\n      submoduleName,\n      stackTrace,\n    );\n  }\n\n  handleNoOpReplayQuery(queryConfig: Mysql2QueryConfig): EventEmitter {\n    return this.queryMock.handleNoOpReplayQuery(queryConfig);\n  }\n\n  private _handleRecordPoolGetConnectionInSpan(\n    spanInfo: SpanInfo,\n    originalGetConnection: Function,\n    callback: Function | undefined,\n    context: Pool,\n  ): any {\n    if (callback) {\n      // Callback-based getConnection\n      const wrappedCallback = (error: Error | null, connection?: PoolConnection) => {\n        if (error) {\n          logger.debug(\n            `[Mysql2Instrumentation] MySQL2 Pool getConnection error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[Mysql2Instrumentation] error ending span:`, error);\n          }\n        } else {\n          logger.debug(\n            `[Mysql2Instrumentation] MySQL2 Pool getConnection completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: {\n                connected: true,\n                hasConnection: !!connection,\n              },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[Mysql2Instrumentation] error processing getConnection response:`, error);\n          }\n        }\n        return callback(error, connection);\n      };\n\n      return originalGetConnection.call(context, wrappedCallback);\n    } else {\n      // Promise-based getConnection\n      const promise = originalGetConnection.call(context);\n\n      return promise\n        .then((connection: PoolConnection) => {\n          logger.debug(\n            `[Mysql2Instrumentation] MySQL2 Pool getConnection completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: {\n                connected: true,\n                hasConnection: !!connection,\n              },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[Mysql2Instrumentation] error processing getConnection response:`, error);\n          }\n          return connection;\n        })\n        .catch((error: Error) => {\n          logger.debug(\n            `[Mysql2Instrumentation] MySQL2 Pool getConnection error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          try {\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[Mysql2Instrumentation] error ending span:`, error);\n          }\n          throw error;\n        });\n    }\n  }\n\n  private handleNoOpReplayGetConnection(callback?: Function): any {\n    logger.debug(\n      `[Mysql2Instrumentation] Background getConnection detected, returning mock connection`,\n    );\n\n    const mockConnection = new TdMysql2ConnectionMock(this, \"pool\");\n\n    if (callback) {\n      process.nextTick(() => callback(null, mockConnection));\n      return;\n    }\n    return Promise.resolve(mockConnection);\n  }\n\n  private _handleReplayPoolGetConnection(spanInfo: SpanInfo, callback?: Function) {\n    logger.debug(`[Mysql2Instrumentation] Replaying MySQL2 Pool getConnection`);\n\n    // For pool getConnection operations, simulate returning a mock connection\n    const mockConnection = new TdMysql2ConnectionMock(this, \"pool\", spanInfo);\n\n    if (callback) {\n      process.nextTick(() => callback(null, mockConnection));\n      return;\n    } else {\n      return Promise.resolve(mockConnection);\n    }\n  }\n\n  /**\n   * Creates a patched Connection class that intercepts the constructor\n   * to handle connection event recording/replay.\n   *\n   * Wrap the Connection constructor to:\n   * - In RECORD mode: listen for 'connect'/'error' events and record them\n   * - In REPLAY mode: create a MockConnection that fakes the connection and emits recorded events\n   */\n  private _getPatchedConnectionClass(OriginalConnection: any): any {\n    const self = this;\n\n    // Create the patched constructor function\n    function TdPatchedConnection(this: any, ...args: any[]) {\n      const inputValue = { method: \"createConnection\" };\n      // RECORD mode: create real connection and record connect/error events\n      if (self.mode === TuskDriftMode.RECORD) {\n        return handleRecordMode({\n          originalFunctionCall: () => new OriginalConnection(...args),\n          recordModeHandler: ({ isPreAppStart }) => {\n            return SpanUtils.createAndExecuteSpan(\n              self.mode,\n              () => new OriginalConnection(...args),\n              {\n                name: `mysql2.connection.create`,\n                kind: SpanKind.CLIENT,\n                submodule: \"connectEvent\",\n                packageType: PackageType.MYSQL,\n                packageName: \"mysql2\",\n                instrumentationName: self.INSTRUMENTATION_NAME,\n                inputValue,\n                isPreAppStart,\n              },\n              (spanInfo) => {\n                const connection = new OriginalConnection(...args);\n\n                // Listen for successful connection - record via span\n                connection.on(\"connect\", (connectionObj: any) => {\n                  try {\n                    SpanUtils.addSpanAttributes(spanInfo.span, {\n                      outputValue: { connected: true, connectionObj },\n                    });\n                    SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n                  } catch {\n                    logger.error(`[Mysql2Instrumentation] error adding span attributes:`);\n                  }\n                });\n\n                // Listen for connection errors - record via span\n                connection.on(\"error\", (err: Error) => {\n                  try {\n                    logger.debug(\n                      `[Mysql2Instrumentation] Connection error, recording: ${err.message}`,\n                    );\n                    SpanUtils.endSpan(spanInfo.span, {\n                      code: SpanStatusCode.ERROR,\n                      message: err.message,\n                    });\n                  } catch {\n                    logger.error(`[Mysql2Instrumentation] error ending span`);\n                  }\n                });\n\n                return connection;\n              },\n            );\n          },\n          spanKind: SpanKind.CLIENT,\n        });\n      }\n\n      // REPLAY mode: create mock connection that doesn't actually connect\n      if (self.mode === TuskDriftMode.REPLAY) {\n        return handleReplayMode({\n          noOpRequestHandler: () => {\n            // For background connection creation, return a mock connection\n            return new TdMysql2ConnectionMock(self, \"connection\");\n          },\n          isServerRequest: false,\n          replayModeHandler: () => {\n            return SpanUtils.createAndExecuteSpan(\n              self.mode,\n              () => new OriginalConnection(...args),\n              {\n                name: `mysql2.connection.create`,\n                kind: SpanKind.CLIENT,\n                submodule: \"connectEvent\",\n                packageType: PackageType.MYSQL,\n                packageName: \"mysql2\",\n                instrumentationName: self.INSTRUMENTATION_NAME,\n                inputValue,\n                isPreAppStart: false,\n              },\n              (spanInfo) => {\n                // Create a mock connection class that extends the original\n                class MockConnection extends OriginalConnection {\n                  private _isConnectOrErrorEmitted = false;\n                  private _connectEventMock: TdMysql2ConnectionEventMock;\n\n                  constructor(...mockConnectionArgs: any[]) {\n                    // Clone the args and use fake host/port to prevent actual connection\n                    const clonedArgs = JSON.parse(JSON.stringify(mockConnectionArgs));\n                    if (clonedArgs[0] && clonedArgs[0].config) {\n                      clonedArgs[0].config.host = \"127.0.0.1\";\n                      clonedArgs[0].config.port = 127;\n                    } else if (clonedArgs[0]) {\n                      // Direct config object\n                      clonedArgs[0].host = \"127.0.0.1\";\n                      clonedArgs[0].port = 127;\n                    }\n\n                    // Call parent constructor with fake connection config\n                    super(...clonedArgs);\n\n                    // Get the recorded connection event\n                    this._connectEventMock = new TdMysql2ConnectionEventMock(spanInfo);\n                  }\n\n                  // Override the 'on' method to emit recorded events\n                  on(event: string, listener: Function): any {\n                    if (!this._connectEventMock) {\n                      return super.on(event, listener);\n                    }\n\n                    // Handle 'connect' event - emit recorded connection success\n                    if (event === \"connect\" && !this._isConnectOrErrorEmitted) {\n                      this._connectEventMock\n                        .getReplayedConnectionEvent(inputValue)\n                        .then(({ output }) => {\n                          if (output !== undefined) {\n                            process.nextTick(() => {\n                              listener.call(this, output);\n                              this._isConnectOrErrorEmitted = true;\n                            });\n                          }\n                        })\n                        .catch((err) => {\n                          logger.error(\n                            `[Mysql2Instrumentation] Error replaying connection event:`,\n                            err,\n                          );\n                        });\n                      return this;\n                    }\n\n                    // Handle 'error' event - just register the listener (connection should succeed in replay)\n                    if (event === \"error\" && !this._isConnectOrErrorEmitted) {\n                      // In replay mode, we don't expect errors (connection is mocked)\n                      // But register the listener anyway for compatibility\n                      return this;\n                    }\n\n                    // For other events, use the parent handler\n                    return super.on(event, listener);\n                  }\n                }\n\n                const mockConnection = new MockConnection(...args);\n\n                // Add default error listener to prevent unhandled errors\n                mockConnection.addListener(\"error\", (_err: Error) => {\n                  // Silently catch to prevent crashes\n                });\n\n                return mockConnection;\n              },\n            );\n          },\n        });\n      }\n\n      // Fallback for disabled mode\n      return new OriginalConnection(...args);\n    }\n\n    // Copy static properties from original class\n    const staticProps = Object.getOwnPropertyNames(OriginalConnection).filter(\n      (key) => ![\"length\", \"name\", \"prototype\"].includes(key),\n    );\n    for (const staticProp of staticProps) {\n      (TdPatchedConnection as any)[staticProp] = OriginalConnection[staticProp];\n    }\n\n    // Set prototype chain\n    Object.setPrototypeOf(TdPatchedConnection.prototype, OriginalConnection.prototype);\n\n    return TdPatchedConnection;\n  }\n\n  private _addOutputAttributesToSpan(\n    spanInfo: SpanInfo,\n    result?: any,\n    fields?: FieldPacket[],\n  ): void {\n    if (!result) return;\n\n    // Handle different result types\n    let outputValue: any = {};\n\n    if (Array.isArray(result)) {\n      // SELECT query - array of rows\n      outputValue = {\n        rowCount: result.length,\n        rows: result,\n        fields: fields || [],\n      };\n    } else if (result.affectedRows !== undefined) {\n      // INSERT/UPDATE/DELETE query - OkPacket or ResultSetHeader\n      outputValue = {\n        affectedRows: result.affectedRows,\n        insertId: result.insertId,\n        warningCount: result.warningCount,\n      };\n    } else {\n      // Other result types\n      outputValue = result;\n    }\n\n    SpanUtils.addSpanAttributes(spanInfo.span, {\n      outputValue,\n    });\n  }\n\n  private _wrap(\n    target: Connection | Pool | PoolConnection,\n    propertyName: string,\n    wrapper: (original: any) => any,\n  ): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { TdInstrumentationConfig } from \"../../core/baseClasses/TdInstrumentationAbstract\";\nimport { SpanUtils } from \"../../../core/tracing/SpanUtils\";\nimport { TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { SPAN_KIND_CONTEXT_KEY, CALLING_LIBRARY_CONTEXT_KEY } from \"../../../core/types\";\nimport { SpanKind } from \"@opentelemetry/api\";\nimport { sendUnpatchedDependencyAlert } from \"../../../core/analytics\";\nimport { logger, isNextJsRuntime } from \"../../../core/utils\";\nimport { SpanInfo } from \"../../../core/tracing/SpanUtils\";\n\nexport interface TcpInstrumentationConfig extends TdInstrumentationConfig {\n  mode?: TuskDriftMode;\n}\n\n/**\n * TCP Instrumentation for Tusk Drift\n *\n * Behavior:\n * - REPLAY mode: Intercept TCP calls and check parent span\n *   - If parent span is SERVER (inbound), log it out\n *   - If parent span is not SERVER, log warning about unpached dependency\n *   - Custom checks for HTTP related TCP calls + ProtobufCommunicator calls, no need to log those\n */\nexport class TcpInstrumentation extends TdInstrumentationBase {\n  private mode: TuskDriftMode;\n  private loggedSpans = new Set<string>(); // Track spans that have been logged\n\n  constructor(config: TcpInstrumentationConfig = {}) {\n    super(\"tcp\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n\n    this._patchLoadedModules();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"net\",\n        supportedVersions: [\"*\"],\n        patch: (moduleExports: any) => this._patchNetModule(moduleExports),\n      }),\n    ];\n  }\n\n  private _patchLoadedModules(): void {\n    if (isNextJsRuntime()) {\n      // Why this is needed for Next.js:\n      // 1. Next.js's instrumentation hook (instrumentation.ts) runs DURING or AFTER framework initialization\n      // 2. By that time, database clients (pg, mysql2, etc.) may have already loaded their dependencies\n      // 3. Built-in modules like 'net' don't appear in require.cache like npm packages do\n      // 4. The net module may never get loaded naturally if:\n      //    - Database connections are lazy-loaded (only created when first needed)\n      //    - Next.js webpack optimizes away certain requires\n      //    - No database operations occur during startup\n      // 5. By force-loading 'net' here, we trigger the require-in-the-middle hooks immediately\n      // 6. This ensures that when database clients DO require('net'), they get the patched version\n      //\n      // For regular Node.js apps where TuskDrift.initialize() runs before any other imports,\n      // this force-load is redundant but harmless - the hooks would catch net naturally.\n      logger.debug(\n        `[TcpInstrumentation] Next.js environment detected - force-loading net module to ensure patching`,\n      );\n\n      try {\n        // This will trigger the require-in-the-middle hook which calls _onRequire -> _patchNetModule\n        require(\"net\");\n        logger.debug(`[TcpInstrumentation] net module force-loaded`);\n      } catch (err) {\n        logger.error(`[TcpInstrumentation] Error force-loading net module:`, err);\n      }\n    } else {\n      // Regular Node.js environment - hooks will catch net when it's first required\n      logger.debug(\n        `[TcpInstrumentation] Regular Node.js environment - hooks will catch net module on first require`,\n      );\n    }\n  }\n\n  private _patchNetModule(netModule: any): any {\n    logger.debug(`[TcpInstrumentation] Patching NET module in ${this.mode} mode`);\n\n    if (this.isModulePatched(netModule)) {\n      logger.debug(`[TcpInstrumentation] NET module already patched, skipping`);\n      return netModule;\n    }\n\n    if (this.mode !== TuskDriftMode.REPLAY) {\n      logger.debug(`[TcpInstrumentation] Not in replay mode, returning original net module`);\n      return netModule;\n    }\n\n    const originalConnect = netModule.Socket.prototype.connect;\n    const originalWrite = netModule.Socket.prototype.write;\n\n    const self = this;\n\n    // Patch net.Socket.prototype.connect\n    // Socket.prototype has other methods we can patch (read, _write, end, etc)\n    // But connect should be sufficient since we are only patching TCP to get insights into what modules we haven't patched\n    netModule.Socket.prototype.connect = function (...args: any[]) {\n      return self._handleTcpCall(\"connect\", originalConnect, args, this);\n    };\n\n    netModule.Socket.prototype.write = function (...args: any[]) {\n      return self._handleTcpCall(\"write\", originalWrite, args, this);\n    };\n\n    this.markModuleAsPatched(netModule);\n    return netModule;\n  }\n\n  private _logUnpatchedDependency(\n    methodName: string,\n    currentSpanInfo: SpanInfo,\n    socketContext: any,\n  ) {\n    const spanKey = `${currentSpanInfo.spanId}-${methodName}`;\n\n    if (!this.loggedSpans.has(spanKey)) {\n      this.loggedSpans.add(spanKey);\n      Error.stackTraceLimit = Infinity;\n\n      // NOTE: this log string is used in run.sh's\n      // If updating this log string, update the log string in the run.sh's\n      logger.warn(\n        `[TcpInstrumentation] TCP called from inbound request context, likely unpatched dependency`,\n        {\n          tcpMethod: methodName,\n          spanId: currentSpanInfo.spanId,\n          traceId: currentSpanInfo.traceId,\n          socketContext,\n        },\n      );\n\n      const stackTrace = new Error().stack || \"\";\n      const traceTestServerSpanId = SpanUtils.getCurrentReplayTraceId();\n      logger.warn(`[TcpInstrumentation] Full stack trace:\\n${stackTrace}`, {\n        traceTestServerSpanId,\n      });\n\n      Error.stackTraceLimit = 10;\n      sendUnpatchedDependencyAlert({\n        traceTestServerSpanId: traceTestServerSpanId || \"\",\n        stackTrace,\n      });\n\n      // Clean up old span entries periodically to prevent memory leaks\n      if (this.loggedSpans.size > 1000) {\n        logger.debug(\n          `[TcpInstrumentation] Cleaning up logged spans cache (${this.loggedSpans.size} entries)`,\n        );\n        this.loggedSpans.clear();\n      }\n    }\n  }\n\n  private _handleTcpCall(\n    methodName: string,\n    originalMethod: Function,\n    args: any[],\n    socketContext: any,\n  ): any {\n    // Don't want to log any HTTP response socket calls\n    if (this._isHttpResponseSocket(socketContext)) {\n      return originalMethod.apply(socketContext, args);\n    }\n\n    const currentSpanInfo = SpanUtils.getCurrentSpanInfo();\n\n    if (!currentSpanInfo) {\n      return originalMethod.apply(socketContext, args);\n    }\n\n    const callingLibrary = currentSpanInfo.context.getValue(CALLING_LIBRARY_CONTEXT_KEY);\n    const spanKind = currentSpanInfo.context.getValue(SPAN_KIND_CONTEXT_KEY);\n\n    // Don't want to log any TCP calls made to the CLI\n    if (spanKind === SpanKind.SERVER && callingLibrary !== \"ProtobufCommunicator\") {\n      // Log unpatched dependency without expensive stack trace\n      this._logUnpatchedDependency(methodName, currentSpanInfo, socketContext);\n    }\n\n    // TODO: if we are confident in our ability to detect unpatched dependencies, instead of returning the original method when we detect a unpatched dependency\n    // We can throw an error to prevent the server from making actual outbound calls in replay mode\n    return originalMethod.apply(socketContext, args);\n  }\n\n  private _isHttpResponseSocket(socketContext: any): boolean {\n    // Check if this socket is associated with HTTP response handling\n    return socketContext && socketContext._httpMessage;\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { captureStackTrace, wrap } from \"../../core/utils\";\nimport { findMockResponseAsync } from \"../../core/utils/mockResponseUtils\";\nimport { handleRecordMode, handleReplayMode } from \"../../core/utils/modeUtils\";\nimport {\n  JsonwebtokenModuleExports,\n  JsonwebtokenInstrumentationConfig,\n  JwtVerifyInputValue,\n  JwtSignInputValue,\n  VerifyQueryConfig,\n  SignQueryConfig,\n} from \"./types\";\nimport { createMockInputValue } from \"../../../core/utils\";\nimport { logger } from \"../../../core/utils/logger\";\n\nexport class JsonwebtokenInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"JsonwebtokenInstrumentation\";\n  private mode: TuskDriftMode;\n  private tuskDrift: TuskDriftCore;\n  private _JsonWebTokenError?: any;\n  private _NotBeforeError?: any;\n  private _TokenExpiredError?: any;\n\n  constructor(config: JsonwebtokenInstrumentationConfig = {}) {\n    super(\"jsonwebtoken\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"jsonwebtoken\",\n        supportedVersions: [\"5.*\", \"6.*\", \"7.*\", \"8.*\", \"9.*\"],\n        patch: (moduleExports: JsonwebtokenModuleExports) =>\n          this._patchJsonwebtokenModule(moduleExports),\n      }),\n    ];\n  }\n\n  private _patchJsonwebtokenModule(\n    jwtModule: JsonwebtokenModuleExports,\n  ): JsonwebtokenModuleExports {\n    if (this.isModulePatched(jwtModule)) {\n      logger.debug(`[JsonwebtokenInstrumentation] jsonwebtoken module already patched, skipping`);\n      return jwtModule;\n    }\n\n    // Store original functions and error classes\n    this._JsonWebTokenError = jwtModule.JsonWebTokenError;\n    this._NotBeforeError = jwtModule.NotBeforeError;\n    this._TokenExpiredError = jwtModule.TokenExpiredError;\n\n    // Wrap jwt.verify\n    if (jwtModule.verify) {\n      this._wrap(jwtModule, \"verify\", this._getVerifyPatchFn());\n      logger.debug(`[JsonwebtokenInstrumentation] Wrapped jwt.verify`);\n    }\n\n    // Wrap jwt.sign\n    if (jwtModule.sign) {\n      this._wrap(jwtModule, \"sign\", this._getSignPatchFn());\n      logger.debug(`[JsonwebtokenInstrumentation] Wrapped jwt.sign`);\n    }\n\n    this.markModuleAsPatched(jwtModule);\n    logger.debug(`[JsonwebtokenInstrumentation] jsonwebtoken module patching complete`);\n\n    return jwtModule;\n  }\n\n  private _getVerifyPatchFn() {\n    const self = this;\n\n    return (originalVerify: Function) => {\n      return function verify(this: any, ...args: any[]) {\n        // Parse verify arguments - jwt.verify supports multiple signatures\n        let verifyConfig: VerifyQueryConfig | null = null;\n        try {\n          verifyConfig = self.parseVerifyArgs(args);\n        } catch (error) {\n          logger.error(`[JsonwebtokenInstrumentation] error parsing verify args:`, error);\n        }\n\n        if (!verifyConfig || !verifyConfig.token) {\n          // If we can't parse the arguments, let it pass through\n          logger.debug(\n            `[JsonwebtokenInstrumentation] Could not parse jwt.verify args, executing original`,\n            args,\n          );\n          return originalVerify.apply(this, args);\n        }\n\n        const rawInputValue: JwtVerifyInputValue = {\n          token: verifyConfig.token,\n          secretOrPublicKey:\n            typeof verifyConfig.secretOrPublicKey === \"function\"\n              ? \"[Function:secretProvider]\"\n              : verifyConfig.secretOrPublicKey,\n          options: verifyConfig.options,\n        };\n\n        // Normalize the input value for consistent hashing\n        let inputValue: JwtVerifyInputValue;\n\n        try {\n          inputValue = createMockInputValue(rawInputValue);\n        } catch (error) {\n          logger.error(`[JsonwebtokenInstrumentation] error creating mock input value:`, error);\n          return originalVerify.apply(this, args);\n        }\n\n        // Handle replay mode (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          const stackTrace = captureStackTrace([\"JsonwebtokenInstrumentation\"]);\n\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const hasCallback = !!verifyConfig.callback;\n              if (hasCallback) {\n                process.nextTick(() => verifyConfig.callback!(null, undefined));\n                return;\n              } else {\n                return undefined;\n              }\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              // Create span in replay mode\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalVerify.apply(this, args),\n                {\n                  name: \"jsonwebtoken.verify\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"verify\",\n                  packageName: \"jsonwebtoken\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self.handleReplayVerify(verifyConfig, inputValue, spanInfo, stackTrace);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalVerify.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalVerify.apply(this, args),\n                {\n                  name: \"jsonwebtoken.verify\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"verify\",\n                  packageName: \"jsonwebtoken\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordVerifyInSpan(\n                    spanInfo,\n                    originalVerify,\n                    verifyConfig,\n                    args,\n                    this,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalVerify.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _getSignPatchFn() {\n    const self = this;\n\n    return (originalSign: Function) => {\n      return function sign(this: any, ...args: any[]) {\n        // Parse sign arguments - jwt.sign supports multiple signatures\n        let signConfig: SignQueryConfig | null = null;\n        try {\n          signConfig = self.parseSignArgs(args);\n        } catch (error) {\n          logger.error(`[JsonwebtokenInstrumentation] error parsing sign args:`, error);\n        }\n\n        if (!signConfig || !signConfig.payload) {\n          // If we can't parse the arguments, let it pass through\n          logger.warn(\n            `[JsonwebtokenInstrumentation] Could not parse jwt.sign args, executing original`,\n            args,\n          );\n          return originalSign.apply(this, args);\n        }\n\n        const inputValue: JwtSignInputValue = {\n          payload: signConfig.payload,\n          secretOrPrivateKey: signConfig.secretOrPrivateKey,\n          options: signConfig.options,\n        };\n\n        // Handle replay mode (only if app is ready)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          const stackTrace = captureStackTrace([\"JsonwebtokenInstrumentation\"]);\n\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const hasCallback = !!signConfig.callback;\n              if (hasCallback) {\n                process.nextTick(() => signConfig.callback!(null, undefined));\n                return;\n              } else {\n                return undefined;\n              }\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              // Create span in replay mode\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalSign.apply(this, args),\n                {\n                  name: \"jsonwebtoken.sign\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"sign\",\n                  packageName: \"jsonwebtoken\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self.handleReplaySign(signConfig, inputValue, spanInfo, stackTrace);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalSign.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              // Record mode - create span and execute real sign\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalSign.apply(this, args),\n                {\n                  name: \"jsonwebtoken.sign\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"sign\",\n                  packageName: \"jsonwebtoken\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordSignInSpan(\n                    spanInfo,\n                    originalSign,\n                    signConfig,\n                    args,\n                    this,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalSign.apply(this, args);\n        }\n      };\n    };\n  }\n\n  parseVerifyArgs(args: any[]): VerifyQueryConfig | null {\n    if (args.length < 2) return null;\n\n    const token = args[0];\n    const secretOrPublicKey = args[1];\n\n    if (typeof token !== \"string\") return null;\n\n    const config: VerifyQueryConfig = {\n      token,\n      secretOrPublicKey,\n      callback: typeof args[args.length - 1] === \"function\" ? args[args.length - 1] : undefined,\n    };\n\n    // Check for options parameter\n    if (\n      args.length >= 3 &&\n      typeof args[2] === \"object\" &&\n      typeof args[args.length - 1] !== \"function\"\n    ) {\n      config.options = args[2];\n    } else if (args.length >= 4 && typeof args[2] === \"object\") {\n      config.options = args[2];\n    }\n\n    return config;\n  }\n\n  parseSignArgs(args: any[]): SignQueryConfig | null {\n    if (args.length < 2) return null;\n\n    const payload = args[0];\n    const secretOrPrivateKey = args[1];\n\n    const config: SignQueryConfig = {\n      payload,\n      secretOrPrivateKey,\n      callback: typeof args[args.length - 1] === \"function\" ? args[args.length - 1] : undefined,\n    };\n\n    // Check for options parameter\n    if (\n      args.length >= 3 &&\n      typeof args[2] === \"object\" &&\n      typeof args[args.length - 1] !== \"function\"\n    ) {\n      config.options = args[2];\n    } else if (args.length >= 4 && typeof args[2] === \"object\") {\n      config.options = args[2];\n    }\n\n    return config;\n  }\n\n  private _handleRecordVerifyInSpan(\n    spanInfo: SpanInfo,\n    originalVerify: Function,\n    verifyConfig: VerifyQueryConfig,\n    args: any[],\n    context: any,\n  ): any {\n    const hasCallback = !!verifyConfig.callback;\n\n    if (hasCallback) {\n      // Callback-based verify\n      const originalCallback = verifyConfig.callback!;\n      const wrappedCallback = (error: Error | null, decoded?: any) => {\n        if (error) {\n          try {\n            logger.debug(\n              `[JsonwebtokenInstrumentation] JWT verify error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n            );\n            this._addErrorOutputAttributesToSpan(spanInfo, error);\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n          }\n        } else {\n          try {\n            logger.debug(\n              `[JsonwebtokenInstrumentation] JWT verify completed successfully (${SpanUtils.getTraceInfo()})`,\n            );\n            this._addOutputAttributesToSpan(spanInfo, decoded);\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n          }\n        }\n        return originalCallback(error, decoded);\n      };\n\n      try {\n        // Replace callback in args\n        args[args.length - 1] = wrappedCallback;\n      } catch (error) {\n        logger.error(`[JsonwebtokenInstrumentation] error replacing callback:`, error, args);\n      }\n\n      try {\n        const retVal = originalVerify.apply(context, args);\n        return retVal;\n      } catch (error: any) {\n        try {\n          logger.debug(\n            `[JsonwebtokenInstrumentation] JWT verify sync error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          this._addErrorOutputAttributesToSpan(spanInfo, error);\n          SpanUtils.endSpan(spanInfo.span, {\n            code: SpanStatusCode.ERROR,\n            message: error.message,\n          });\n        } catch (error) {\n          logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n        }\n        throw error;\n      }\n    } else {\n      // Synchronous verify\n      try {\n        const result = originalVerify.apply(context, args);\n        try {\n          logger.debug(\n            `[JsonwebtokenInstrumentation] JWT verify completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          this._addOutputAttributesToSpan(spanInfo, result);\n          SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n        } catch (error) {\n          logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n        }\n\n        return result;\n      } catch (error: any) {\n        try {\n          logger.debug(\n            `[JsonwebtokenInstrumentation] JWT verify error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          this._addErrorOutputAttributesToSpan(spanInfo, error);\n          SpanUtils.endSpan(spanInfo.span, {\n            code: SpanStatusCode.ERROR,\n            message: error.message,\n          });\n        } catch (error) {\n          logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n        }\n        throw error;\n      }\n    }\n  }\n\n  private _handleRecordSignInSpan(\n    spanInfo: SpanInfo,\n    originalSign: Function,\n    signConfig: SignQueryConfig,\n    args: any[],\n    context: any,\n  ): any {\n    const hasCallback = !!signConfig.callback;\n\n    if (hasCallback) {\n      // Callback-based sign\n      const originalCallback = signConfig.callback!;\n      const wrappedCallback = (error: Error | null, token?: string) => {\n        if (error) {\n          try {\n            logger.debug(\n              `[JsonwebtokenInstrumentation] JWT sign error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n            );\n            this._addErrorOutputAttributesToSpan(spanInfo, error);\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (error) {\n            logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n          }\n        } else {\n          try {\n            logger.debug(\n              `[JsonwebtokenInstrumentation] JWT sign completed successfully (${SpanUtils.getTraceInfo()})`,\n            );\n            this._addOutputAttributesToSpan(spanInfo, token);\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n          }\n        }\n        return originalCallback(error, token);\n      };\n\n      try {\n        // Replace callback in args\n        args[args.length - 1] = wrappedCallback;\n      } catch (error) {\n        logger.error(`[JsonwebtokenInstrumentation] error replacing callback:`, error, args);\n      }\n\n      const retVal = originalSign.apply(context, args);\n      return retVal;\n    } else {\n      // Synchronous sign\n      try {\n        const result = originalSign.apply(context, args);\n        try {\n          logger.debug(\n            `[JsonwebtokenInstrumentation] JWT sign completed successfully (${SpanUtils.getTraceInfo()})`,\n          );\n          this._addOutputAttributesToSpan(spanInfo, result);\n          SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n        } catch (error) {\n          logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n        }\n        return result;\n      } catch (error: any) {\n        try {\n          logger.debug(\n            `[JsonwebtokenInstrumentation] JWT sign error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n          );\n          this._addErrorOutputAttributesToSpan(spanInfo, error);\n          SpanUtils.endSpan(spanInfo.span, {\n            code: SpanStatusCode.ERROR,\n            message: error.message,\n          });\n        } catch (error) {\n          logger.error(`[JsonwebtokenInstrumentation] error ending span:`, error);\n        }\n        throw error;\n      }\n    }\n  }\n\n  async handleReplayVerify(\n    verifyConfig: VerifyQueryConfig,\n    inputValue: JwtVerifyInputValue,\n    spanInfo: SpanInfo,\n    stackTrace?: string,\n  ): Promise<any> {\n    logger.debug(`[JsonwebtokenInstrumentation] Replaying JWT verify`);\n\n    // Look for matching recorded response\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: \"jsonwebtoken.verify\",\n        packageName: \"jsonwebtoken\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"verify\",\n        inputValue: inputValue,\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    const hasCallback = !!verifyConfig.callback;\n\n    if (!mockData) {\n      logger.warn(\n        `[JsonwebtokenInstrumentation] No mock data found for JWT verify: ${verifyConfig.token}`,\n      );\n\n      throw new Error(\n        `[JsonwebtokenInstrumentation] No matching mock found for JWT verify: ${verifyConfig.token}`,\n      );\n    }\n\n    // Handle errors from the mock data (errors are embedded in the result)\n    if (mockData.result && mockData.result.error) {\n      let error = mockData.result.error;\n\n      // Recreate specific JWT error types\n      if (this._TokenExpiredError && mockData.result.error.name === \"TokenExpiredError\") {\n        error = new this._TokenExpiredError(\n          mockData.result.error.message,\n          mockData.result.error.expiredAt,\n        );\n      } else if (this._JsonWebTokenError && mockData.result.error.name === \"JsonWebTokenError\") {\n        error = new this._JsonWebTokenError(mockData.result.error.message);\n      } else if (this._NotBeforeError && mockData.result.error.name === \"NotBeforeError\") {\n        error = new this._NotBeforeError(mockData.result.error.message, mockData.result.error.date);\n      } else {\n        // Create a generic error if we don't have the specific error class\n        error = new Error(mockData.result.error.message);\n        error.name = mockData.result.error.name;\n      }\n\n      if (hasCallback) {\n        process.nextTick(() => verifyConfig.callback!(error));\n        return;\n      } else {\n        throw error;\n      }\n    }\n\n    // Handle successful verification\n    const result = mockData.result.token !== undefined ? mockData.result.token : mockData.result;\n    if (hasCallback) {\n      process.nextTick(() => {\n        verifyConfig.callback!(null, result);\n      });\n      return;\n    } else {\n      return result;\n    }\n  }\n\n  async handleReplaySign(\n    signConfig: SignQueryConfig,\n    inputValue: JwtSignInputValue,\n    spanInfo: SpanInfo,\n    stackTrace?: string,\n  ): Promise<any> {\n    logger.debug(`[JsonwebtokenInstrumentation] Replaying JWT sign`);\n\n    // Look for matching recorded response\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo?.traceId,\n        spanId: spanInfo?.spanId,\n        name: \"jsonwebtoken.sign\",\n        packageName: \"jsonwebtoken\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"sign\",\n        inputValue: inputValue,\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    const hasCallback = !!signConfig.callback;\n\n    if (!mockData) {\n      logger.warn(`[JsonwebtokenInstrumentation] No mock data found for JWT sign`);\n      throw new Error(`[JsonwebtokenInstrumentation] No matching mock found for JWT sign`);\n    }\n\n    // Handle errors from the mock data (errors are embedded in the result)\n    if (mockData.result && mockData.result.error) {\n      let error = mockData.result.error;\n\n      // Recreate specific JWT error types\n      if (this._JsonWebTokenError && mockData.result.error.name === \"JsonWebTokenError\") {\n        error = new this._JsonWebTokenError(mockData.result.error.message);\n      } else {\n        // Create a generic error if we don't have the specific error class\n        error = new Error(mockData.result.error.message);\n        error.name = mockData.result.error.name;\n      }\n\n      if (hasCallback) {\n        process.nextTick(() => signConfig.callback!(error));\n        return;\n      } else {\n        throw error;\n      }\n    }\n\n    // Handle successful signing\n    const result = mockData.result.token !== undefined ? mockData.result.token : mockData.result;\n    if (hasCallback) {\n      process.nextTick(() => {\n        signConfig.callback!(null, result);\n      });\n      return;\n    } else {\n      return result;\n    }\n  }\n\n  private _addOutputAttributesToSpan(spanInfo: SpanInfo, result?: any): void {\n    if (!result) return;\n\n    const outputValue = typeof result === \"string\" ? { token: result } : result;\n\n    SpanUtils.addSpanAttributes(spanInfo.span, {\n      outputValue,\n    });\n  }\n\n  private _addErrorOutputAttributesToSpan(spanInfo: SpanInfo, error: Error): void {\n    const errorOutput = {\n      error: {\n        name: error.name,\n        message: error.message,\n        // Include any additional properties that specific JWT errors might have\n        ...((error as any).expiredAt && { expiredAt: (error as any).expiredAt }),\n        ...((error as any).date && { date: (error as any).date }),\n      },\n    };\n\n    SpanUtils.addSpanAttributes(spanInfo.span, {\n      outputValue: errorOutput,\n    });\n  }\n\n  private _wrap(target: any, propertyName: string, wrapper: (original: any) => any): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { JwksRsaModuleExports, JwksRsaInstrumentationConfig } from \"./types\";\nimport { logger } from \"../../../core/utils/logger\";\n\n/**\n * JwksRsa is just patched to override rate limits enforced on the client side in replay mode\n *\n * No spans are being recorded or replayed for jwks-rsa.\n */\nexport class JwksRsaInstrumentation extends TdInstrumentationBase {\n  private tuskDrift: TuskDriftCore;\n\n  constructor(config: JwksRsaInstrumentationConfig = {}) {\n    super(\"jwks-rsa\", config);\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"jwks-rsa\",\n        supportedVersions: [\"1.*\", \"2.*\", \"3.*\"],\n        patch: (moduleExports: JwksRsaModuleExports) => this._patchJwksRsaModule(moduleExports),\n      }),\n    ];\n  }\n\n  private _patchJwksRsaModule(jwksModule: any): any {\n    logger.debug(\n      `[JwksRsaInstrumentation] Patching jwks-rsa module, current mode: ${this.tuskDrift.getMode()}`,\n    );\n\n    if (this.isModulePatched(jwksModule)) {\n      logger.debug(`[JwksRsaInstrumentation] jwks-rsa module already patched, skipping`);\n      return jwksModule;\n    }\n\n    const self = this;\n\n    if (jwksModule.expressJwtSecret) {\n      const originalExpressJwtSecret = jwksModule.expressJwtSecret;\n      jwksModule.expressJwtSecret = function (options: any) {\n        logger.debug(`[JwksRsaInstrumentation] expressJwtSecret called with options:`, options);\n        const modifiedOptions = { ...options };\n        // Only disable rate limiting in replay mode\n        if (self.tuskDrift.getMode() === TuskDriftMode.REPLAY) {\n          logger.debug(\n            `[JwksRsaInstrumentation] REPLAY MODE - Disabling rate limiting for expressJwtSecret`,\n          );\n          modifiedOptions.rateLimit = false;\n          delete modifiedOptions.jwksRequestsPerMinute;\n          logger.debug(`[JwksRsaInstrumentation] Modified options:`, modifiedOptions);\n        }\n        return originalExpressJwtSecret(modifiedOptions);\n      };\n      logger.debug(`[JwksRsaInstrumentation] Patched expressJwtSecret method`);\n    }\n\n    this.markModuleAsPatched(jwksModule);\n\n    logger.debug(`[JwksRsaInstrumentation] jwks-rsa module patching complete`);\n    return jwksModule;\n  }\n}\n","import * as crypto from \"crypto\";\nimport jp from \"jsonpath\";\nimport { SpanKind } from \"@opentelemetry/api\";\nimport { FetchInputValue, FetchOutputValue } from \"./types\";\nimport { OneOf } from \"src/core/types\";\nimport { TransformConfigs } from \"../types\";\n\nexport interface FetchTransform {\n  matcher: FetchTransformMatcher;\n  action: FetchTransformAction;\n}\n\n/** A matcher config. An element is matched iff *all* conditions specified\n * here are true. Only one target field is allowed, but any of the common\n * fields may be provided.\n * */\nexport type FetchTransformMatcher = {\n  /** Request direction relative to this service. Fetch is always\n   * outbound, but included for consistency. */\n  direction?: \"outbound\";\n  /** HTTP method: array of methods like [\"GET\", \"POST\"]. Empty array matches\n   * all methods. */\n  method?: (\"GET\" | \"POST\" | \"DELETE\" | \"PUT\")[];\n  /** Regex to match against URL path e.g. \"/api/user/.*\" */\n  pathPattern?: string;\n  /** Regex to match against hostname e.g. \"api.example.com\" */\n  host?: string;\n} & OneOf<FetchTransformMatchingFields>;\n\n/** Target fields. See doc for more info on why it's split and not part of the\n * matcher configs . */\nexport type FetchTransformMatchingFields = {\n  /** JSONPath expression e.g. \"$.user.password\" */\n  jsonPath: string;\n  /** Query parameter name */\n  queryParam: string;\n  /** Header name */\n  headerName: string;\n  /** Transform the entire URL path */\n  urlPath: boolean;\n  /** Transform the entire request/response body */\n  fullBody: boolean;\n};\n\nexport type FetchTransformAction =\n  | {\n      type: \"redact\";\n      /** Prefix for hash (default: \"REDACTED_\") */\n      hashPrefix?: string;\n    }\n  | {\n      type: \"mask\";\n      /** Character to use for masking (default: \"*\") */\n      maskChar?: string;\n    }\n  | {\n      type: \"replace\";\n      /** Static replacement value (required) */\n      replaceWith: string;\n    }\n  | {\n      type: \"drop\";\n    };\n\nexport interface FetchSpanData {\n  traceId: string;\n  spanId: string;\n  kind: SpanKind;\n  inputValue?: FetchInputValue;\n  outputValue?: FetchOutputValue;\n  transformMetadata?: {\n    transformed: boolean;\n    actions: TransformAction[];\n  };\n}\n\ntype CompiledTransform = (span: FetchSpanData) => TransformAction | undefined;\n\ntype TransformAction = {\n  type: \"redact\" | \"mask\" | \"replace\" | \"drop\";\n  field: string;\n  reason: string;\n  description?: string;\n};\n\ntype ActionFunction = (value: string) => string;\n\ntype MatcherFunction = (span: FetchSpanData) => boolean;\n\n/**\n * Creates an empty FetchInputValue object for dropped spans\n */\nfunction createEmptyInputValue(): FetchInputValue {\n  return {\n    url: \"\",\n    method: \"\",\n    headers: {},\n  };\n}\n\n/**\n * Creates an empty FetchOutputValue object for dropped spans\n */\nfunction createEmptyOutputValue(): FetchOutputValue {\n  return {\n    status: 0,\n    statusText: \"\",\n    headers: {},\n    bodySize: 0,\n  };\n}\n\nexport class FetchTransformEngine {\n  private compiledTransforms: CompiledTransform[] = [];\n\n  constructor(transformConfigs?: TransformConfigs) {\n    if (transformConfigs?.fetch) {\n      this.compiledTransforms = transformConfigs.fetch.map((transform) =>\n        this.compileTransform(transform),\n      );\n    }\n  }\n\n  applyTransforms(spanData: FetchSpanData): FetchSpanData {\n    const actions: TransformAction[] = [];\n\n    for (const compiledTransform of this.compiledTransforms) {\n      const action = compiledTransform(spanData);\n      if (action) {\n        actions.push(action);\n      }\n    }\n\n    if (actions.length > 0) {\n      spanData.transformMetadata = {\n        transformed: true,\n        actions,\n      };\n    }\n\n    return spanData;\n  }\n\n  private compileTransform(transform: FetchTransform): CompiledTransform {\n    const { matcher, action } = transform;\n\n    const matcherFunction = this.compileMatcher(matcher);\n    if (action.type === \"drop\") {\n      return (span) => {\n        if (!matcherFunction(span)) {\n          return;\n        }\n\n        // Drop all sensitive data\n        if (span.inputValue) {\n          span.inputValue = createEmptyInputValue();\n        }\n\n        if (span.outputValue) {\n          span.outputValue = createEmptyOutputValue();\n        }\n\n        return {\n          type: \"drop\",\n          field: \"entire_span\",\n          reason: \"transforms\",\n          description: this.describeTransform(transform),\n        };\n      };\n    }\n\n    const compiledAction = this.compileAction(matcher, action);\n    const fieldDescription = this.getFieldDescription(matcher);\n\n    return (span) => {\n      if (!matcherFunction(span)) {\n        return;\n      }\n\n      const result = compiledAction(span);\n      if (result) {\n        return {\n          type: action.type,\n          field: fieldDescription,\n          reason: \"transforms\",\n        };\n      }\n\n      return;\n    };\n  }\n\n  private compileAction(\n    matcher: FetchTransformMatcher,\n    action: FetchTransformAction,\n  ): (span: FetchSpanData) => boolean {\n    const actionFunction = this.compileActionFunction(action);\n\n    if (matcher.jsonPath) {\n      return this.compileJsonPathAction(matcher.jsonPath, actionFunction);\n    }\n    if (matcher.queryParam) {\n      return this.compileQueryParamAction(matcher.queryParam, actionFunction);\n    }\n    if (matcher.headerName) {\n      return this.compileHeaderAction(matcher.headerName, actionFunction);\n    }\n    if (matcher.urlPath) {\n      return this.compileUrlPathAction(actionFunction);\n    }\n    if (matcher.fullBody) {\n      return this.compileFullBodyAction(actionFunction);\n    }\n\n    return () => false;\n  }\n\n  private compileMatcher(matcher: FetchTransformMatcher): MatcherFunction {\n    const checks: MatcherFunction[] = [];\n\n    // Fetch is always CLIENT kind\n    checks.push((span) => span.kind === SpanKind.CLIENT);\n\n    if (matcher.method) {\n      // Empty array means match all methods (wildcard)\n      if (matcher.method.length === 0) {\n        // No check needed - matches all methods\n      } else {\n        const methods = matcher.method.map((method) => method.toUpperCase());\n        checks.push((span) => {\n          const spanMethod = span.inputValue?.method?.toUpperCase();\n          return spanMethod ? methods.includes(spanMethod) : false;\n        });\n      }\n    }\n\n    if (matcher.pathPattern) {\n      try {\n        const pattern = new RegExp(matcher.pathPattern);\n        checks.push((span) => {\n          const url = span.inputValue?.url;\n          if (!url) return false;\n          try {\n            const urlObj = new URL(url);\n            return pattern.test(urlObj.pathname);\n          } catch {\n            return false;\n          }\n        });\n      } catch (error) {\n        throw new Error(\n          `Invalid path pattern \"${matcher.pathPattern}\": ${error instanceof Error ? error.message : String(error)}`,\n        );\n      }\n    }\n\n    if (matcher.host) {\n      try {\n        const hostPattern = new RegExp(matcher.host);\n        checks.push((span) => {\n          const url = span.inputValue?.url;\n          if (!url) return false;\n          try {\n            const urlObj = new URL(url);\n            return hostPattern.test(urlObj.hostname);\n          } catch {\n            return false;\n          }\n        });\n      } catch (error) {\n        throw new Error(\n          `Invalid host pattern \"${matcher.host}\": ${error instanceof Error ? error.message : String(error)}`,\n        );\n      }\n    }\n\n    if (checks.length === 0) {\n      return () => true;\n    }\n    if (checks.length === 1) {\n      return checks[0];\n    }\n\n    return (span) => checks.every((check) => check(span));\n  }\n\n  private compileJsonPathAction(\n    jsonPath: string,\n    actionFunction: ActionFunction,\n  ): (span: FetchSpanData) => boolean {\n    return (span) => {\n      let applied = false;\n\n      // Apply to request body (inputValue)\n      if (span.inputValue?.body) {\n        try {\n          let bodyObj;\n          const body = span.inputValue.body;\n\n          if (typeof body === \"string\") {\n            try {\n              const decoded = Buffer.from(body, \"base64\").toString(\"utf8\");\n              bodyObj = JSON.parse(decoded);\n            } catch (e) {\n              // If decoding/parsing fails, body might not be JSON\n              return false;\n            }\n          } else {\n            bodyObj = body;\n          }\n\n          const nodes = jp.apply(bodyObj, jsonPath, actionFunction);\n\n          // Re-encode the modified body as base64\n          if (typeof body === \"string\" && nodes.length > 0) {\n            const reencoded = Buffer.from(JSON.stringify(bodyObj)).toString(\"base64\");\n            span.inputValue.body = reencoded;\n            applied = true;\n          }\n        } catch (error) {\n          // ignore\n        }\n      }\n\n      // Apply to response body (outputValue)\n      if (span.outputValue?.body) {\n        try {\n          let bodyObj;\n          const body = span.outputValue.body;\n\n          if (typeof body === \"string\") {\n            try {\n              const decoded = Buffer.from(body, \"base64\").toString(\"utf8\");\n              bodyObj = JSON.parse(decoded);\n            } catch (e) {\n              // If decoding/parsing fails, body might not be JSON\n              return applied;\n            }\n          } else {\n            bodyObj = body;\n          }\n\n          const nodes = jp.apply(bodyObj, jsonPath, actionFunction);\n\n          // Re-encode the modified body as base64\n          if (typeof body === \"string\" && nodes.length > 0) {\n            const reencoded = Buffer.from(JSON.stringify(bodyObj)).toString(\"base64\");\n            span.outputValue.body = reencoded;\n            applied = true;\n          }\n        } catch (error) {\n          // ignore\n        }\n      }\n\n      return applied;\n    };\n  }\n\n  private compileHeaderAction(\n    headerName: string,\n    actionFunction: ActionFunction,\n  ): (span: FetchSpanData) => boolean {\n    const lowerHeader = headerName.toLowerCase();\n\n    return (span) => {\n      let applied = false;\n\n      // Transform request headers\n      if (span.inputValue?.headers) {\n        for (const key of Object.keys(span.inputValue.headers)) {\n          if (key.toLowerCase() === lowerHeader) {\n            span.inputValue.headers[key] = actionFunction(span.inputValue.headers[key]);\n            applied = true;\n          }\n        }\n      }\n\n      // Transform response headers\n      if (span.outputValue?.headers) {\n        for (const key of Object.keys(span.outputValue.headers)) {\n          if (key.toLowerCase() === lowerHeader) {\n            span.outputValue.headers[key] = actionFunction(span.outputValue.headers[key]);\n            applied = true;\n          }\n        }\n      }\n\n      return applied;\n    };\n  }\n\n  private compileQueryParamAction(\n    queryParam: string,\n    actionFunction: ActionFunction,\n  ): (span: FetchSpanData) => boolean {\n    return (span) => {\n      if (!span.inputValue?.url) {\n        return false;\n      }\n\n      try {\n        const url = new URL(span.inputValue.url);\n        if (url.searchParams.has(queryParam)) {\n          const oldValue = url.searchParams.get(queryParam);\n          if (oldValue !== null) {\n            const newValue = actionFunction(oldValue);\n            url.searchParams.set(queryParam, newValue);\n            span.inputValue.url = url.toString();\n            return true;\n          }\n        }\n      } catch {\n        // ignore invalid URLs\n      }\n\n      return false;\n    };\n  }\n\n  private compileFullBodyAction(actionFunction: ActionFunction): (span: FetchSpanData) => boolean {\n    return (span) => {\n      let applied = false;\n\n      // Transform request body\n      if (span.inputValue && span.inputValue.body !== undefined) {\n        const body = span.inputValue.body;\n        if (typeof body === \"string\") {\n          try {\n            const decoded = Buffer.from(body, \"base64\").toString(\"utf8\");\n            const transformed = actionFunction(decoded);\n            span.inputValue.body = Buffer.from(transformed).toString(\"base64\");\n            applied = true;\n          } catch (error) {\n            // If not valid base64, treat as plain string\n            span.inputValue.body = Buffer.from(actionFunction(body)).toString(\"base64\");\n            applied = true;\n          }\n        } else {\n          span.inputValue.body = Buffer.from(actionFunction(JSON.stringify(body))).toString(\n            \"base64\",\n          );\n          applied = true;\n        }\n      }\n\n      // Transform response body\n      if (span.outputValue && span.outputValue.body !== undefined) {\n        const body = span.outputValue.body;\n        if (typeof body === \"string\") {\n          try {\n            const decoded = Buffer.from(body, \"base64\").toString(\"utf8\");\n            const transformed = actionFunction(decoded);\n            span.outputValue.body = Buffer.from(transformed).toString(\"base64\");\n            applied = true;\n          } catch (error) {\n            // If not valid base64, treat as plain string\n            span.outputValue.body = Buffer.from(actionFunction(body)).toString(\"base64\");\n            applied = true;\n          }\n        } else {\n          span.outputValue.body = Buffer.from(actionFunction(JSON.stringify(body))).toString(\n            \"base64\",\n          );\n          applied = true;\n        }\n      }\n\n      return applied;\n    };\n  }\n\n  private compileUrlPathAction(actionFunction: ActionFunction): (span: FetchSpanData) => boolean {\n    return (span) => {\n      if (span.inputValue?.url) {\n        try {\n          const urlObj = new URL(span.inputValue.url);\n          urlObj.pathname = actionFunction(urlObj.pathname);\n          span.inputValue.url = urlObj.toString();\n          return true;\n        } catch {\n          // If URL parsing fails, transform the whole URL string\n          span.inputValue.url = actionFunction(span.inputValue.url);\n          return true;\n        }\n      }\n      return false;\n    };\n  }\n\n  private compileActionFunction(action: FetchTransformAction): ActionFunction {\n    switch (action.type) {\n      case \"redact\":\n        return (value) => {\n          const prefix = action.hashPrefix || \"REDACTED_\";\n          const hash = crypto.createHash(\"sha256\").update(String(value)).digest(\"hex\");\n          return `${prefix}${hash.substring(0, 12)}...`;\n        };\n      case \"mask\":\n        return (value) => {\n          const maskChar = action.maskChar || \"*\";\n          return maskChar.repeat(value.length);\n        };\n      case \"replace\":\n        return () => action.replaceWith;\n      default:\n        return (value) => value;\n    }\n  }\n\n  private getFieldDescription(matcher: FetchTransformMatcher): string {\n    if (matcher.jsonPath) return `jsonPath:${matcher.jsonPath}`;\n    if (matcher.queryParam) return `queryParam:${matcher.queryParam}`;\n    if (matcher.headerName) return `header:${matcher.headerName}`;\n    if (matcher.urlPath) return \"urlPath\";\n    if (matcher.fullBody) return \"fullBody\";\n    return \"unknown\";\n  }\n\n  private describeTransform(transform: FetchTransform): string {\n    return JSON.stringify(transform.matcher);\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { SpanInfo, SpanUtils } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { getDecodedType, httpBodyEncoder } from \"../http/utils\";\nimport { captureStackTrace, isTuskDriftIngestionUrl, TUSK_SKIP_HEADER } from \"../../core/utils\";\nimport { findMockResponseAsync } from \"../../core/utils/mockResponseUtils\";\nimport { handleReplayMode, handleRecordMode } from \"../../core/utils/modeUtils\";\nimport { FetchInputValue, FetchOutputValue, FetchInstrumentationConfig } from \"./types\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { EncodingType } from \"../../../core/tracing/JsonSchemaHelper\";\nimport { logger } from \"../../../core/utils/logger\";\nimport { FetchSpanData, FetchTransformEngine } from \"./FetchTransformEngine\";\n\n/**\n * Fetch API instrumentation for capturing requests made via fetch()\n * This covers libraries like @octokit/rest, axios (when using fetch adapter), etc.\n */\nexport class FetchInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"FetchInstrumentation\";\n  private mode: TuskDriftMode;\n  private tuskDrift: TuskDriftCore;\n  private originalFetch?: typeof globalThis.fetch;\n  private transformEngine: FetchTransformEngine;\n\n  constructor(config: FetchInstrumentationConfig = {}) {\n    super(\"fetch\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.tuskDrift = TuskDriftCore.getInstance();\n    this.transformEngine = new FetchTransformEngine(config.transforms);\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    // Fetch is a global, not a module, so we patch it directly\n    // Fetch doesn't need to be reuired'd like other node modules hence we just directly patch it\n    this.patchGlobalFetch();\n    return [];\n  }\n\n  private patchGlobalFetch(): void {\n    // Unlike other instrumentations that patch modules when they're required (lazy patching),\n    // fetch instrumentation patches the global fetch function immediately during init() since\n    // fetch is a global API, not a module. This means we need to explicitly check if the\n    // instrumentation is enabled before patching, otherwise we'd always patch globalThis.fetch\n    // even when the user has disabled fetch instrumentation.\n    if (this.mode === TuskDriftMode.DISABLED || !this._config.enabled) {\n      return;\n    }\n\n    if (typeof globalThis.fetch !== \"function\") {\n      logger.debug(\"fetch not available in this environment\");\n      return;\n    }\n\n    this.originalFetch = globalThis.fetch;\n    const self = this;\n\n    globalThis.fetch = function (\n      input: string | URL | Request,\n      init?: RequestInit,\n    ): Promise<Response> {\n      const stackTrace = captureStackTrace([\"FetchInstrumentation\"]);\n      return self._handleFetchRequest(input, init, stackTrace);\n    } as typeof globalThis.fetch;\n\n    logger.debug(\"Global fetch patching complete\");\n  }\n\n  private async _handleFetchRequest(\n    input: string | URL | Request,\n    init?: RequestInit,\n    stackTrace?: string,\n  ): Promise<Response> {\n    // Parse request details\n    const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\n    const method = init?.method || \"GET\";\n    const headers = init?.headers || {};\n\n    let normalizedHeaders = {};\n    let encodedBody: any = init?.body;\n    try {\n      normalizedHeaders = this._normalizeHeaders(headers);\n      encodedBody = init?.body ? ((await this._encodeRequestBody(init?.body)) as any) : init?.body;\n    } catch (error) {\n      logger.error(`FetchInstrumentation error normalizing headers:`, error);\n    }\n\n    // Ignore SDK's own drift export calls\n    const shouldSkip =\n      (normalizedHeaders as any)[TUSK_SKIP_HEADER] === \"true\" || isTuskDriftIngestionUrl(url);\n\n    if (shouldSkip) {\n      return this.originalFetch!(input, init);\n    }\n\n    const inputValue: FetchInputValue = {\n      url,\n      method,\n      headers: normalizedHeaders,\n      body: encodedBody,\n    };\n\n    // Handle replay mode (only if app is ready)\n    if (this.mode === TuskDriftMode.REPLAY) {\n      return handleReplayMode({\n        noOpRequestHandler: () => {\n          const mockResponse = new Response(null, {\n            status: 200,\n            statusText: \"OK\",\n          });\n\n          return Promise.resolve(mockResponse);\n        },\n        isServerRequest: false,\n        replayModeHandler: () => {\n          // Create span in replay mode\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => this.originalFetch!(input, init),\n            {\n              name: url,\n              kind: SpanKind.CLIENT,\n              packageName: \"fetch\",\n              packageType: PackageType.HTTP,\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              submodule: inputValue.method,\n              inputValue,\n              isPreAppStart: false,\n            },\n            (spanInfo) => {\n              return this._handleReplayFetch(inputValue, spanInfo, stackTrace);\n            },\n          );\n        },\n      });\n    } else if (this.mode === TuskDriftMode.RECORD) {\n      return handleRecordMode({\n        originalFunctionCall: () => this.originalFetch!(input, init),\n        recordModeHandler: ({ isPreAppStart }) =>\n          this._handleRecordFetch(input, inputValue, isPreAppStart, init),\n        spanKind: SpanKind.CLIENT,\n      });\n    } else {\n      // Should never happen since we're only patching record and replay modes\n      return this.originalFetch!(input, init);\n    }\n  }\n\n  private _handleRecordFetch(\n    input: string | URL | Request,\n    inputValue: FetchInputValue,\n    isPreAppStart: boolean,\n    init?: RequestInit,\n  ): Promise<Response> {\n    return SpanUtils.createAndExecuteSpan(\n      this.mode,\n      () => this.originalFetch!(input, init),\n      {\n        name: inputValue.url,\n        kind: SpanKind.CLIENT,\n        packageName: \"fetch\",\n        packageType: PackageType.HTTP,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submodule: inputValue.method,\n        inputValue,\n        inputSchemaMerges: {\n          ...(inputValue.body && {\n            body: {\n              encoding: EncodingType.BASE64,\n              decodedType: getDecodedType(inputValue.headers[\"content-type\"] || \"\"),\n            },\n          }),\n          ...(inputValue.headers && {\n            headers: {\n              matchImportance: 0,\n            },\n          }),\n        },\n        isPreAppStart,\n      },\n      (spanInfo) => {\n        return this.originalFetch!(input, init)\n          .then(async (response) => {\n            // Clone response to read body without consuming it\n            try {\n              const responseClone = response.clone();\n              const encodedBody = await this._encodeResponseBody(responseClone);\n\n              const outputValue = {\n                status: response.status,\n                statusText: response.statusText,\n                headers: this._responseHeadersToObject(response.headers),\n                body: encodedBody,\n                bodySize: encodedBody?.length || 0,\n              } as FetchOutputValue;\n\n              // Apply transforms to span data before adding attributes\n              const spanData: FetchSpanData = {\n                traceId: spanInfo.traceId,\n                spanId: spanInfo.spanId,\n                kind: SpanKind.CLIENT,\n                inputValue,\n                outputValue,\n              };\n              this.transformEngine.applyTransforms(spanData);\n\n              SpanUtils.addSpanAttributes(spanInfo.span, {\n                inputValue: spanData.inputValue,\n                outputValue: spanData.outputValue,\n                outputSchemaMerges: {\n                  body: {\n                    encoding: EncodingType.BASE64,\n                    decodedType: getDecodedType(\n                      (spanData.outputValue as any).headers?.[\"content-type\"] || \"\",\n                    ),\n                  },\n                  headers: {\n                    matchImportance: 0,\n                  },\n                },\n                ...(spanData.transformMetadata && {\n                  transformMetadata: spanData.transformMetadata,\n                }),\n              });\n\n              const status =\n                response.status >= 400\n                  ? { code: SpanStatusCode.ERROR, message: `HTTP ${response.status}` }\n                  : { code: SpanStatusCode.OK };\n\n              SpanUtils.endSpan(spanInfo.span, status);\n            } catch (error) {\n              logger.error(`FetchInstrumentation error processing response body:`, error);\n            }\n            return response;\n          })\n          .catch((error) => {\n            try {\n              SpanUtils.endSpan(spanInfo.span, {\n                code: SpanStatusCode.ERROR,\n                message: error.message,\n              });\n            } catch (error) {\n              logger.error(`FetchInstrumentation error ending span:`, error);\n            }\n            throw error;\n          });\n      },\n    );\n  }\n\n  private async _handleReplayFetch(\n    inputValue: FetchInputValue,\n    spanInfo: SpanInfo,\n    stackTrace?: string,\n  ): Promise<Response> {\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: inputValue.url,\n        packageName: \"fetch\",\n        packageType: PackageType.HTTP,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: inputValue.method,\n        inputValue,\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n      inputValueSchemaMerges: {\n        ...(inputValue.body && {\n          body: {\n            encoding: EncodingType.BASE64,\n            decodedType: getDecodedType(inputValue.headers[\"content-type\"] || \"\"),\n          },\n        }),\n        ...(inputValue.headers && {\n          headers: {\n            matchImportance: 0,\n          },\n        }),\n      },\n    });\n\n    if (!mockData) {\n      logger.warn(\n        `[FetchInstrumentation] No mock data found for fetch request with input value: ${JSON.stringify(inputValue)}`,\n      );\n      throw new Error(`[FetchInstrumentation] No matching mock found for fetch request`);\n    }\n\n    const { result } = mockData;\n    const responseBody = this._constructFetchResponseBody(result);\n\n    const mockResponse = new Response(responseBody, {\n      status: result.status,\n      statusText: result.statusText,\n      headers: new Headers(result.headers),\n    });\n\n    return Promise.resolve(mockResponse);\n  }\n\n  private _normalizeHeaders(headers: any): Record<string, string> {\n    if (headers instanceof Headers) {\n      const result: Record<string, string> = {};\n      headers.forEach((value, key) => {\n        result[key.toLowerCase()] = value;\n      });\n      return result;\n    } else if (Array.isArray(headers)) {\n      const result: Record<string, string> = {};\n      headers.forEach(([key, value]) => {\n        result[key.toLowerCase()] = value;\n      });\n      return result;\n    } else if (typeof headers === \"object\" && headers !== null) {\n      const result: Record<string, string> = {};\n      Object.entries(headers).forEach(([key, value]) => {\n        if (typeof value === \"string\") {\n          result[key.toLowerCase()] = value;\n        }\n      });\n      return result;\n    }\n    return {};\n  }\n\n  private async _encodeRequestBody(body: any): Promise<string | undefined> {\n    try {\n      let bodyBuffer: Buffer;\n\n      if (body === null) {\n        return undefined;\n      }\n\n      if (typeof body === \"string\") {\n        // String body - convert to buffer\n        bodyBuffer = Buffer.from(body, \"utf8\");\n      } else if (body instanceof ArrayBuffer) {\n        // ArrayBuffer - convert directly\n        bodyBuffer = Buffer.from(body);\n      } else if (\n        body instanceof Uint8Array ||\n        body instanceof Int8Array ||\n        body instanceof Uint16Array ||\n        body instanceof Int16Array ||\n        body instanceof Uint32Array ||\n        body instanceof Int32Array ||\n        body instanceof Float32Array ||\n        body instanceof Float64Array ||\n        body instanceof DataView\n      ) {\n        // TypedArray or DataView - convert to buffer\n        bodyBuffer = Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n      } else if (body instanceof URLSearchParams) {\n        // URLSearchParams - convert to string first\n        bodyBuffer = Buffer.from(body.toString(), \"utf8\");\n      } else if (body instanceof FormData) {\n        // FormData - this is tricky, we need to serialize it\n        // For now, let's skip encoding FormData as it's complex\n        logger.warn(\"FormData encoding not yet supported, skipping body encoding\");\n        return undefined;\n      } else if (body instanceof Blob) {\n        // Blob - read as array buffer\n        const arrayBuffer = await body.arrayBuffer();\n        bodyBuffer = Buffer.from(arrayBuffer);\n      } else if (body && typeof body === \"object\" && Symbol.asyncIterator in body) {\n        // AsyncIterable<Uint8Array>\n        const chunks: Uint8Array[] = [];\n        for await (const chunk of body as AsyncIterable<Uint8Array>) {\n          chunks.push(chunk);\n        }\n        bodyBuffer = Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));\n      } else if (body && typeof body === \"object\" && Symbol.iterator in body) {\n        // Iterable<Uint8Array>\n        const chunks: Uint8Array[] = [];\n        for (const chunk of body as Iterable<Uint8Array>) {\n          chunks.push(chunk);\n        }\n        bodyBuffer = Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)));\n      } else {\n        // Unknown type\n        logger.warn(\"Unknown body type, cannot encode:\", typeof body, body);\n        return undefined;\n      }\n\n      return await httpBodyEncoder({ bodyBuffer });\n    } catch (error) {\n      logger.warn(\"Failed to encode request body:\", error);\n      return undefined;\n    }\n  }\n\n  /**\n   * Encode response body using existing httpBodyEncoder\n   */\n  private async _encodeResponseBody(response: Response): Promise<string | undefined> {\n    try {\n      if (!response.body) {\n        return undefined;\n      }\n      const arrayBuffer = await response.arrayBuffer();\n      const bodyBuffer = Buffer.from(arrayBuffer);\n\n      return await httpBodyEncoder({ bodyBuffer });\n    } catch (error) {\n      return undefined;\n    }\n  }\n\n  /**\n   * Construct response body for replay mode\n   */\n  private _constructFetchResponseBody(result: FetchOutputValue): Buffer<ArrayBuffer> | null {\n    if (result.body) {\n      return Buffer.from(result.body, \"base64\");\n    }\n    return null;\n  }\n\n  private _responseHeadersToObject(headers: Headers): Record<string, string> {\n    const result: Record<string, string> = {};\n    headers.forEach((value, key) => {\n      result[key.toLowerCase()] = value;\n    });\n    return result;\n  }\n}\n","import { TdInstrumentationConfig } from \"../../core/baseClasses/TdInstrumentationAbstract\";\nimport { TuskDriftMode } from \"../../../core/TuskDrift\";\n\nexport interface IORedisInputValue {\n  command: string;\n  args: any[];\n  argsMetadata?: BufferMetadata[];\n  connectionInfo?: {\n    host?: string;\n    port?: number;\n  };\n  [key: string]: unknown;\n}\n\nexport interface IORedisConnectInputValue {\n  host?: string;\n  port?: number;\n  [key: string]: unknown;\n}\n\nexport interface IORedisModuleExports {\n  prototype?: any;\n  default?: any;\n  [key: string]: any;\n}\n\nexport interface IORedisInstrumentationConfig extends TdInstrumentationConfig {\n  requestHook?: (command: any) => void;\n  responseHook?: (result: any) => void;\n  mode?: TuskDriftMode;\n}\n\nexport interface IORedisCommand {\n  name: string;\n  args: any[];\n  resolve?: (result: any) => void;\n  reject?: (err: Error) => void;\n  callback?: Function;\n}\n\nexport interface IORedisInterface {\n  options: {\n    host?: string;\n    port?: number;\n    [key: string]: any;\n  };\n  sendCommand(command: IORedisCommand): Promise<any>;\n  connect(): Promise<void>;\n}\n\nexport enum BufferEncoding {\n  UTF8 = \"UTF8\",\n  BASE64 = \"BASE64\",\n  NONE = \"NONE\",\n}\n\nexport interface BufferMetadata {\n  bufferMeta?: string;\n  encoding?: BufferEncoding;\n}\n\nexport interface IORedisOutputValue extends Record<string, unknown> {\n  value: any;\n  metadata?: BufferMetadata;\n}\n","import { BufferEncoding } from \"./types\";\n\ninterface ConvertedValue {\n  value: any;\n  bufferMeta?: string;\n  encoding?: BufferEncoding;\n}\n\n/**\n * Check if a Buffer contains valid UTF-8 data\n */\nfunction isUtf8(buffer: Buffer): boolean {\n  try {\n    const str = buffer.toString(\"utf8\");\n    // Check if the string can be converted back to the same buffer\n    return Buffer.from(str, \"utf8\").equals(buffer);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Convert a value (potentially a Buffer) to a JSON-able format with metadata\n */\nexport function convertValueToJsonable(value: any): ConvertedValue {\n  if (Buffer.isBuffer(value)) {\n    if (isUtf8(value)) {\n      try {\n        // Try to parse as JSON\n        return {\n          value: JSON.parse(value.toString()),\n          bufferMeta: undefined,\n          encoding: BufferEncoding.UTF8,\n        };\n      } catch {\n        // Not JSON, just UTF-8 string\n        return {\n          value: value.toString(\"utf8\"),\n          bufferMeta: undefined,\n          encoding: BufferEncoding.UTF8,\n        };\n      }\n    }\n    // Non-UTF-8 buffer - store as base64\n    return {\n      value: \"RAW_CONTENT\",\n      bufferMeta: value.toString(\"base64\"),\n      encoding: BufferEncoding.BASE64,\n    };\n  }\n\n  if (typeof value === \"string\") {\n    try {\n      // Try to parse as JSON\n      return {\n        value: JSON.parse(value),\n        bufferMeta: undefined,\n        encoding: BufferEncoding.NONE,\n      };\n    } catch {\n      // Not JSON, just a string\n    }\n  }\n\n  // For any other type (number, object, array, etc.)\n  return {\n    value,\n    bufferMeta: undefined,\n    encoding: BufferEncoding.NONE,\n  };\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { TdInstrumentationNodeModuleFile } from \"../../core/baseClasses/TdInstrumentationNodeModuleFile\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { wrap, isWrapped } from \"../../core/utils/shimmerUtils\";\nimport { findMockResponseAsync } from \"../../core/utils/mockResponseUtils\";\nimport { handleRecordMode, handleReplayMode } from \"../../core/utils/modeUtils\";\nimport {\n  IORedisModuleExports,\n  IORedisInputValue,\n  IORedisConnectInputValue,\n  IORedisInstrumentationConfig,\n  IORedisCommand,\n  IORedisInterface,\n  IORedisOutputValue,\n  BufferMetadata,\n} from \"./types\";\nimport { convertValueToJsonable } from \"./utils\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger, isEsm } from \"../../../core/utils\";\nimport { captureStackTrace } from \"src/instrumentation/core/utils\";\n\nconst SUPPORTED_VERSIONS = [\">=4.11.0 <5\", \"5.*\"];\n\nexport class IORedisInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"IORedisInstrumentation\";\n  private mode: TuskDriftMode;\n  private tuskDrift: TuskDriftCore;\n\n  constructor(config: IORedisInstrumentationConfig = {}) {\n    super(\"ioredis\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"ioredis\",\n        supportedVersions: SUPPORTED_VERSIONS,\n        patch: (moduleExports: IORedisModuleExports) => this._patchIORedisModule(moduleExports),\n        files: [\n          new TdInstrumentationNodeModuleFile({\n            name: \"ioredis/built/Pipeline.js\",\n            supportedVersions: [\"5.*\"],\n            patch: (moduleExports: any) => this._patchPipelineModule(moduleExports),\n          }),\n          new TdInstrumentationNodeModuleFile({\n            name: \"ioredis/built/pipeline.js\",\n            supportedVersions: [\">=4.11.0 <5\"],\n            patch: (moduleExports: any) => this._patchPipelineModule(moduleExports),\n          }),\n        ],\n      }),\n    ];\n  }\n\n  private _patchIORedisModule(moduleExports: IORedisModuleExports): IORedisModuleExports {\n    logger.debug(`[IORedisInstrumentation] Patching IORedis module in ${this.mode} mode`);\n\n    if (this.isModulePatched(moduleExports)) {\n      logger.debug(`[IORedisInstrumentation] IORedis module already patched, skipping`);\n      return moduleExports;\n    }\n\n    const actualExports = isEsm(moduleExports) ? moduleExports.default : moduleExports;\n\n    if (!actualExports || !actualExports.prototype) {\n      logger.error(`[IORedisInstrumentation] Invalid module exports, cannot patch`);\n      return moduleExports;\n    }\n\n    // Wrap sendCommand method\n    if (actualExports.prototype.sendCommand) {\n      if (!isWrapped(actualExports.prototype.sendCommand)) {\n        this._wrap(actualExports.prototype, \"sendCommand\", this._getSendCommandPatchFn());\n        logger.debug(`[IORedisInstrumentation] Wrapped sendCommand method`);\n      }\n    }\n\n    // Wrap connect method\n    if (actualExports.prototype.connect) {\n      if (!isWrapped(actualExports.prototype.connect)) {\n        this._wrap(actualExports.prototype, \"connect\", this._getConnectPatchFn());\n        logger.debug(`[IORedisInstrumentation] Wrapped connect method`);\n      }\n    }\n\n    // Wrap pipeline() and multi() methods to intercept pipeline/transaction creation\n    if (actualExports.prototype.pipeline) {\n      if (!isWrapped(actualExports.prototype.pipeline)) {\n        this._wrap(actualExports.prototype, \"pipeline\", this._getPipelineCreationPatchFn());\n        logger.debug(`[IORedisInstrumentation] Wrapped pipeline method`);\n      }\n    }\n\n    if (actualExports.prototype.multi) {\n      if (!isWrapped(actualExports.prototype.multi)) {\n        this._wrap(actualExports.prototype, \"multi\", this._getMultiCreationPatchFn());\n        logger.debug(`[IORedisInstrumentation] Wrapped multi method`);\n      }\n    }\n\n    this.markModuleAsPatched(moduleExports);\n    logger.debug(`[IORedisInstrumentation] IORedis module patching complete`);\n\n    return moduleExports;\n  }\n\n  private _patchPipelineModule(moduleExports: any): any {\n    logger.debug(`[IORedisInstrumentation] Patching Pipeline module in ${this.mode} mode`);\n\n    if (this.isModulePatched(moduleExports)) {\n      logger.debug(`[IORedisInstrumentation] Pipeline module already patched, skipping`);\n      return moduleExports;\n    }\n\n    const actualExports = isEsm(moduleExports) ? moduleExports.default : moduleExports;\n\n    if (!actualExports || !actualExports.prototype) {\n      logger.debug(`[IORedisInstrumentation] Invalid Pipeline module exports, cannot patch`);\n      return moduleExports;\n    }\n\n    // Wrap exec method for pipelines\n    if (actualExports.prototype.exec) {\n      if (!isWrapped(actualExports.prototype.exec)) {\n        this._wrap(actualExports.prototype, \"exec\", this._getPipelineExecPatchFn());\n        logger.debug(`[IORedisInstrumentation] Wrapped Pipeline.exec method`);\n      }\n    }\n\n    this.markModuleAsPatched(moduleExports);\n    logger.debug(`[IORedisInstrumentation] Pipeline module patching complete`);\n\n    return moduleExports;\n  }\n\n  private _getSendCommandPatchFn() {\n    const self = this;\n\n    return (originalSendCommand: Function) => {\n      return function sendCommand(this: IORedisInterface, cmd?: IORedisCommand) {\n        if (!cmd || typeof cmd !== \"object\" || !cmd.name) {\n          return originalSendCommand.apply(this, arguments);\n        }\n\n        const commandName = cmd.name;\n        const commandArgs = cmd.args || [];\n\n        let sanitizedArgs: any[] = [];\n        let argsMetadata: BufferMetadata[] = [];\n        try {\n          const sanitized = self._sanitizeArgs(commandArgs);\n          sanitizedArgs = sanitized.values;\n          argsMetadata = sanitized.metadata;\n        } catch (error) {\n          logger.error(`[IORedisInstrumentation] error sanitizing args:`, error);\n        }\n\n        const inputValue: IORedisInputValue = {\n          command: commandName,\n          args: sanitizedArgs,\n          argsMetadata,\n          connectionInfo: {\n            host: this.options?.host,\n            port: this.options?.port,\n          },\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          const stackTrace = captureStackTrace([\"IORedisInstrumentation\"]);\n\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              return undefined;\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalSendCommand.apply(this, arguments),\n                {\n                  name: `ioredis.${commandName}`,\n                  kind: SpanKind.CLIENT,\n                  submodule: commandName,\n                  packageType: PackageType.REDIS,\n                  packageName: \"ioredis\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self._handleReplaySendCommand(spanInfo, cmd, inputValue, stackTrace);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalSendCommand.apply(this, arguments),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalSendCommand.apply(this, arguments),\n                {\n                  name: `ioredis.${commandName}`,\n                  kind: SpanKind.CLIENT,\n                  submodule: commandName,\n                  packageType: PackageType.REDIS,\n                  packageName: \"ioredis\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordSendCommand(spanInfo, originalSendCommand, cmd, this);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalSendCommand.apply(this, arguments);\n        }\n      };\n    };\n  }\n\n  private _getConnectPatchFn() {\n    const self = this;\n    return (originalConnect: Function) => {\n      return function connect(this: IORedisInterface) {\n        const inputValue: IORedisConnectInputValue = {\n          host: this.options?.host,\n          port: this.options?.port,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              process.nextTick(() => {\n                (this as any).emit(\"ready\");\n              });\n\n              return Promise.resolve();\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalConnect.apply(this, arguments),\n                {\n                  name: \"ioredis.connect\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"connect\",\n                  packageType: PackageType.REDIS,\n                  packageName: \"ioredis\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self._handleReplayConnect(this);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalConnect.apply(this, arguments),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalConnect.apply(this, arguments),\n                {\n                  name: \"ioredis.connect\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"connect\",\n                  packageType: PackageType.REDIS,\n                  packageName: \"ioredis\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordConnect(spanInfo, originalConnect, this);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalConnect.apply(this, arguments);\n        }\n      };\n    };\n  }\n\n  private _getPipelineCreationPatchFn() {\n    const self = this;\n\n    return (originalPipeline: Function) => {\n      return function pipeline(this: any, ...args: any[]) {\n        const pipelineInstance = originalPipeline.apply(this, args);\n\n        // Dynamically wrap the exec method on this pipeline instance\n        if (pipelineInstance && pipelineInstance.exec && !isWrapped(pipelineInstance.exec)) {\n          self._wrap(pipelineInstance, \"exec\", self._getPipelineExecPatchFn());\n          logger.debug(`[IORedisInstrumentation] Wrapped exec on pipeline instance`);\n        }\n\n        return pipelineInstance;\n      };\n    };\n  }\n\n  private _getMultiCreationPatchFn() {\n    const self = this;\n\n    return (originalMulti: Function) => {\n      return function multi(this: any, ...args: any[]) {\n        const multiInstance = originalMulti.apply(this, args);\n\n        // Dynamically wrap the exec method on this multi instance\n        if (multiInstance && multiInstance.exec && !isWrapped(multiInstance.exec)) {\n          self._wrap(multiInstance, \"exec\", self._getPipelineExecPatchFn());\n          logger.debug(`[IORedisInstrumentation] Wrapped exec on multi instance`);\n        }\n\n        return multiInstance;\n      };\n    };\n  }\n\n  private _getPipelineExecPatchFn() {\n    const self = this;\n\n    return (originalExec: Function) => {\n      return function exec(this: any, ...args: any[]) {\n        // Extract queued commands from pipeline\n        const queue = (this as any)._queue || [];\n        const commands = queue\n          .filter((q: any) => q.name !== \"exec\")\n          .map((q: any) => ({\n            command: q.name,\n            args: q.args || [],\n          }));\n\n        const inputValue = {\n          commands,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              return [];\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalExec.apply(this, args),\n                {\n                  name: \"ioredis.pipeline.exec\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"pipeline-exec\",\n                  packageType: PackageType.REDIS,\n                  packageName: \"ioredis\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self._handleReplayPipelineExec(spanInfo, inputValue, args);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalExec.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalExec.apply(this, args),\n                {\n                  name: \"ioredis.pipeline.exec\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"pipeline-exec\",\n                  packageType: PackageType.REDIS,\n                  packageName: \"ioredis\",\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordPipelineExec(spanInfo, originalExec, this, args);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalExec.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _handleRecordSendCommand(\n    spanInfo: SpanInfo,\n    originalSendCommand: Function,\n    cmd: IORedisCommand,\n    thisContext: IORedisInterface,\n  ): Promise<any> {\n    // Execute the command and capture the final resolved value\n    // (after ioredis transformations)\n    const promise = originalSendCommand.apply(thisContext, [cmd]);\n\n    if (promise && typeof promise.then === \"function\") {\n      return promise\n        .then((result: any) => {\n          try {\n            logger.debug(\n              `[IORedisInstrumentation] IORedis command ${cmd.name} completed successfully (${SpanUtils.getTraceInfo()})`,\n            );\n\n            // Serialize the FINAL transformed result (what the application receives)\n            const outputValue = this._serializeOutput(result);\n            SpanUtils.addSpanAttributes(spanInfo.span, { outputValue });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch (error) {\n            logger.error(`[IORedisInstrumentation] error processing command response:`, error);\n          }\n          return result;\n        })\n        .catch((error: any) => {\n          try {\n            logger.debug(\n              `[IORedisInstrumentation] IORedis command ${cmd.name} error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n            );\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch (spanError) {\n            logger.error(`[IORedisInstrumentation] error ending span:`, spanError);\n          }\n          throw error;\n        });\n    }\n\n    return promise;\n  }\n\n  private async _handleReplaySendCommand(\n    spanInfo: SpanInfo,\n    cmd: IORedisCommand,\n    inputValue: IORedisInputValue,\n    stackTrace?: string,\n  ): Promise<any> {\n    logger.debug(`[IORedisInstrumentation] Replaying IORedis command ${cmd.name}`);\n\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: `ioredis.${cmd.name}`,\n        inputValue: inputValue,\n        packageName: \"ioredis\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: cmd.name,\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      logger.warn(`[IORedisInstrumentation] No mock data found for command: ${cmd.name}`);\n      throw new Error(`[IORedisInstrumentation] No matching mock found for command: ${cmd.name}`);\n    }\n\n    logger.debug(\n      `[IORedisInstrumentation] Found mock data for command ${cmd.name}: ${JSON.stringify(mockData)}`,\n    );\n\n    const result = this._deserializeOutput(mockData.result);\n\n    // Handle callback if present\n    if (cmd.callback && typeof cmd.callback === \"function\") {\n      process.nextTick(() => {\n        cmd.callback!(null, result);\n      });\n    }\n\n    // Return the already-transformed result directly\n    // We recorded the final transformed value, so no additional transformation needed\n    return Promise.resolve(result);\n  }\n\n  private _handleRecordConnect(\n    spanInfo: SpanInfo,\n    originalConnect: Function,\n    thisContext: IORedisInterface,\n  ): Promise<any> {\n    const promise = originalConnect.apply(thisContext, []);\n\n    if (promise && typeof promise.then === \"function\") {\n      return promise\n        .then((result: any) => {\n          try {\n            logger.debug(\n              `[IORedisInstrumentation] IORedis connect completed successfully (${SpanUtils.getTraceInfo()})`,\n            );\n            SpanUtils.addSpanAttributes(spanInfo.span, {\n              outputValue: { connected: true },\n            });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch {\n            logger.error(`[IORedisInstrumentation] error adding span attributes`);\n          }\n          return result;\n        })\n        .catch((error: any) => {\n          try {\n            logger.debug(\n              `[IORedisInstrumentation] IORedis connect error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n            );\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch {\n            logger.error(`[IORedisInstrumentation] error adding span attributes`);\n          }\n          throw error;\n        });\n    }\n\n    try {\n      // Non-promise result\n      logger.debug(\n        `[IORedisInstrumentation] IORedis connect completed (synchronous) (${SpanUtils.getTraceInfo()})`,\n      );\n      SpanUtils.addSpanAttributes(spanInfo.span, {\n        outputValue: { connected: true },\n      });\n      SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n    } catch {\n      logger.error(`[IORedisInstrumentation] error adding span attributes`);\n    }\n    return promise;\n  }\n\n  private async _handleReplayConnect(thisContext: IORedisInterface): Promise<any> {\n    logger.debug(`[IORedisInstrumentation] Replaying IORedis connect`);\n\n    process.nextTick(() => {\n      (thisContext as any).emit(\"ready\");\n    });\n\n    return Promise.resolve();\n  }\n\n  private _handleRecordPipelineExec(\n    spanInfo: SpanInfo,\n    originalExec: Function,\n    thisContext: any,\n    args: any[],\n  ): Promise<any> {\n    const promise = originalExec.apply(thisContext, args);\n\n    if (promise && typeof promise.then === \"function\") {\n      return promise\n        .then((results: any) => {\n          try {\n            logger.debug(\n              `[IORedisInstrumentation] Pipeline exec completed successfully (${SpanUtils.getTraceInfo()})`,\n            );\n\n            // Serialize the results with metadata\n            const outputValue = this._serializePipelineOutput(results);\n            SpanUtils.addSpanAttributes(spanInfo.span, { outputValue });\n            SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n          } catch {\n            logger.error(`[IORedisInstrumentation] error adding span attributes`);\n          }\n          return results;\n        })\n        .catch((error: any) => {\n          try {\n            logger.debug(\n              `[IORedisInstrumentation] Pipeline exec error: ${error.message} (${SpanUtils.getTraceInfo()})`,\n            );\n            SpanUtils.endSpan(spanInfo.span, {\n              code: SpanStatusCode.ERROR,\n              message: error.message,\n            });\n          } catch {\n            logger.error(`[IORedisInstrumentation] error adding span attributes`);\n          }\n          throw error;\n        });\n    }\n\n    return promise;\n  }\n\n  private async _handleReplayPipelineExec(\n    spanInfo: SpanInfo,\n    inputValue: any,\n    args: any[],\n  ): Promise<any> {\n    logger.debug(`[IORedisInstrumentation] Replaying Pipeline exec`);\n\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: \"ioredis.pipeline.exec\",\n        inputValue: inputValue,\n        packageName: \"ioredis\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"pipeline-exec\",\n        kind: SpanKind.CLIENT,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      logger.warn(`[IORedisInstrumentation] No mock data found for pipeline exec`);\n      throw new Error(`[IORedisInstrumentation] No matching mock found for pipeline exec`);\n    }\n\n    logger.debug(\n      `[IORedisInstrumentation] Found mock data for pipeline exec: ${JSON.stringify(mockData)}`,\n    );\n\n    // Deserialize the pipeline results with metadata\n    const result = this._deserializePipelineOutput(mockData.result);\n\n    // Handle callback if present\n    const callback = args[args.length - 1];\n    if (typeof callback === \"function\") {\n      process.nextTick(() => {\n        callback(null, result);\n      });\n    }\n\n    return Promise.resolve(result);\n  }\n\n  private _sanitizeArgs(args: any[]): { values: any[]; metadata: BufferMetadata[] } {\n    const values: any[] = [];\n    const metadata: BufferMetadata[] = [];\n\n    args.forEach((arg) => {\n      const converted = convertValueToJsonable(arg);\n      values.push(converted.value);\n      metadata.push({\n        bufferMeta: converted.bufferMeta,\n        encoding: converted.encoding,\n      });\n    });\n\n    return { values, metadata };\n  }\n\n  private _serializeOutput(value: any): IORedisOutputValue {\n    // We record the FINAL transformed value from ioredis (after Promise resolution)\n    // This value is already in its final form (strings, numbers, objects, arrays, etc.)\n    // No need for Buffer metadata since ioredis has already transformed Buffers to their final types\n    return { value };\n  }\n\n  private _serializePipelineOutput(results: any): any {\n    // Store the final transformed pipeline results as-is\n    return { value: results };\n  }\n\n  private _deserializePipelineOutput(outputValue: any): any {\n    if (!outputValue) {\n      return [];\n    }\n\n    // Return the stored value as-is (already in final form)\n    return outputValue.value || outputValue;\n  }\n\n  private _deserializeOutput(outputValue: any): any {\n    if (!outputValue) {\n      return undefined;\n    }\n\n    // If outputValue is not an IORedisOutputValue object (doesn't have 'value' property),\n    // it might be the raw value itself\n    if (typeof outputValue !== \"object\" || !(\"value\" in outputValue)) {\n      return outputValue;\n    }\n\n    // Return the stored value as-is (it's already in final form from ioredis transformations)\n    return outputValue.value;\n  }\n\n  private _wrap(target: any, propertyName: string, wrapper: (original: any) => any): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","import { ReadableMetadata, ReadableMetadataValue } from \"./types\";\n\n/**\n * Check if a buffer contains valid UTF-8 text\n */\nfunction isUtf8(buffer: Buffer): boolean {\n  try {\n    const str = buffer.toString(\"utf8\");\n    return Buffer.from(str, \"utf8\").equals(buffer);\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Convert gRPC Metadata object to a plain JavaScript object\n */\nexport function serializeGrpcMetadata(metadata: any): ReadableMetadata {\n  if (!metadata) {\n    return {};\n  }\n\n  const readableMetadata: ReadableMetadata = {};\n\n  // Get all metadata keys\n  const metadataMap = metadata.getMap ? metadata.getMap() : {};\n  const keys = Object.keys(metadataMap);\n\n  for (const key of keys) {\n    const valueArr = metadata.get(key);\n    readableMetadata[key] = [];\n\n    for (const value of valueArr) {\n      if (typeof value === \"string\") {\n        readableMetadata[key].push(value);\n        continue;\n      }\n\n      // Handle binary values (Buffers)\n      if (Buffer.isBuffer(value)) {\n        let readableBuffer: ReadableMetadataValue;\n        if (isUtf8(value)) {\n          readableBuffer = {\n            value: value.toString(\"utf8\"),\n            encoding: \"utf8\",\n          };\n        } else {\n          readableBuffer = {\n            value: value.toString(\"base64\"),\n            encoding: \"base64\",\n          };\n        }\n        readableMetadata[key].push(readableBuffer);\n      }\n    }\n  }\n\n  return readableMetadata;\n}\n\n/**\n * Convert a plain JavaScript object back to gRPC Metadata\n */\nexport function deserializeGrpcMetadata(\n  MetadataConstructor: any,\n  readableMetadata: ReadableMetadata,\n): any {\n  const metadata = new MetadataConstructor();\n\n  for (const [key, valueArr] of Object.entries(readableMetadata)) {\n    for (const value of valueArr) {\n      if (typeof value === \"string\") {\n        metadata.add(key, value);\n        continue;\n      }\n\n      // Handle binary values\n      if (typeof value === \"object\" && \"value\" in value && \"encoding\" in value) {\n        const encodedValue = value as ReadableMetadataValue;\n        if (encodedValue.encoding === \"utf8\") {\n          metadata.add(key, Buffer.from(encodedValue.value, \"utf-8\"));\n        } else {\n          metadata.add(key, Buffer.from(encodedValue.value, \"base64\"));\n        }\n      }\n    }\n  }\n\n  return metadata;\n}\n\n/**\n * Extract service and method name from gRPC path\n * Path format: /package.ServiceName/MethodName\n */\nexport function parseGrpcPath(path: string): {\n  method: string;\n  service: string;\n} {\n  if (!path || path === null) {\n    return { method: \"\", service: \"\" };\n  }\n\n  const parts = path.replace(/^\\//, \"\").split(\"/\");\n  const service = parts[0] || \"\";\n  const method = parts[1] || \"\";\n\n  return { method, service };\n}\n\n/**\n * Convert request/response body to a serializable format, handling Buffers\n */\nexport function serializeGrpcPayload(realBody: any): {\n  readableBody: any;\n  bufferMap: Record<string, { value: string; encoding: string }>;\n  jsonableStringMap: Record<string, string>;\n} {\n  const bufferMap: Record<string, { value: string; encoding: string }> = {};\n  const jsonableStringMap: Record<string, string> = {};\n\n  // Clone the body to avoid mutating the original\n  const readableBody = deepClone(realBody);\n\n  // Process the body recursively\n  processPayloadForSerialization(readableBody, bufferMap, jsonableStringMap, []);\n\n  return { readableBody, bufferMap, jsonableStringMap };\n}\n\n/**\n * Recursively process a payload to convert Buffers to placeholders\n */\nfunction processPayloadForSerialization(\n  payload: any,\n  bufferMap: Record<string, { value: string; encoding: string }>,\n  jsonableStringMap: Record<string, string>,\n  path: string[],\n): void {\n  if (!payload || typeof payload !== \"object\") {\n    return;\n  }\n\n  for (const key of Object.keys(payload)) {\n    const currentPath = [...path, key];\n    const currentPathStr = currentPath.join(\".\");\n\n    // Handle Buffer objects\n    if (Buffer.isBuffer(payload[key])) {\n      if (isUtf8(payload[key])) {\n        const stringValue = payload[key].toString(\"utf-8\");\n        bufferMap[currentPathStr] = {\n          value: stringValue,\n          encoding: \"utf8\",\n        };\n        payload[key] = \"__tusk_drift_buffer_replaced__\";\n      } else {\n        bufferMap[currentPathStr] = {\n          value: payload[key].toString(\"base64\"),\n          encoding: \"base64\",\n        };\n        payload[key] = \"__tusk_drift_buffer_replaced__\";\n      }\n      continue;\n    }\n\n    // Handle nested objects\n    if (typeof payload[key] === \"object\" && payload[key] !== null) {\n      processPayloadForSerialization(payload[key], bufferMap, jsonableStringMap, currentPath);\n    }\n  }\n}\n\n/**\n * Convert a serialized payload back to its original format with Buffers restored\n */\nexport function deserializeGrpcPayload(\n  readablePayload: any,\n  bufferMap: Record<string, { value: string; encoding: string }>,\n  jsonableStringMap: Record<string, string>,\n): any {\n  const clonedPayload = deepClone(readablePayload);\n  restorePayloadFromSerialization(clonedPayload, bufferMap, jsonableStringMap, []);\n  return clonedPayload;\n}\n\n/**\n * Recursively restore Buffers in a payload\n */\nfunction restorePayloadFromSerialization(\n  payload: any,\n  bufferMap: Record<string, { value: string; encoding: string }>,\n  jsonableStringMap: Record<string, string>,\n  path: string[],\n): void {\n  if (!payload || typeof payload !== \"object\") {\n    return;\n  }\n\n  for (const key of Object.keys(payload)) {\n    const currentPath = [...path, key];\n    const currentPathStr = currentPath.join(\".\");\n\n    // Restore Buffer placeholders\n    if (payload[key] === \"__tusk_drift_buffer_replaced__\") {\n      const buffer = bufferMap[currentPathStr];\n      if (buffer) {\n        if (buffer.encoding === \"utf8\") {\n          payload[key] = Buffer.from(buffer.value, \"utf-8\");\n        } else {\n          payload[key] = Buffer.from(buffer.value, \"base64\");\n        }\n      }\n      continue;\n    }\n\n    // Handle nested objects\n    if (typeof payload[key] === \"object\" && payload[key] !== null) {\n      restorePayloadFromSerialization(payload[key], bufferMap, jsonableStringMap, currentPath);\n    }\n  }\n}\n\n/**\n * Deep clone an object\n */\nfunction deepClone(obj: any): any {\n  if (obj === null || typeof obj !== \"object\") {\n    return obj;\n  }\n\n  if (Buffer.isBuffer(obj)) {\n    return Buffer.from(obj);\n  }\n\n  if (Array.isArray(obj)) {\n    return obj.map((item) => deepClone(item));\n  }\n\n  const cloned: any = {};\n  for (const key in obj) {\n    if (obj.hasOwnProperty(key)) {\n      cloned[key] = deepClone(obj[key]);\n    }\n  }\n\n  return cloned;\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { TdInstrumentationNodeModuleFile } from \"../../core/baseClasses/TdInstrumentationNodeModuleFile\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { captureStackTrace, wrap } from \"../../core/utils\";\nimport { findMockResponseAsync } from \"../../core/utils/mockResponseUtils\";\nimport { handleRecordMode, handleReplayMode } from \"../../core/utils/modeUtils\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger } from \"../../../core/utils/logger\";\nimport {\n  GrpcInstrumentationConfig,\n  GrpcModuleExports,\n  GrpcClientInputValue,\n  GrpcServerInputValue,\n  ReadableMetadata,\n  GrpcOutputValue,\n  BufferMetadata,\n  GrpcErrorOutput,\n} from \"./types\";\nimport {\n  serializeGrpcMetadata,\n  deserializeGrpcMetadata,\n  parseGrpcPath,\n  serializeGrpcPayload,\n  deserializeGrpcPayload,\n} from \"./utils\";\nimport { EventEmitter } from \"events\";\nimport { Readable } from \"stream\";\n\nconst GRPC_MODULE_NAME = \"@grpc/grpc-js\";\n\nexport class GrpcInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"GrpcInstrumentation\";\n  private mode: TuskDriftMode;\n  private tuskDrift: TuskDriftCore;\n  private Metadata: any;\n  // Store for version-specific Metadata constructors\n  private static metadataStore = new Map<string, any>();\n\n  constructor(config: GrpcInstrumentationConfig = {}) {\n    super(\"grpc\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.tuskDrift = TuskDriftCore.getInstance();\n    logger.debug(`[GrpcInstrumentation] Constructor called with mode: ${this.mode}`);\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    // Client file instrumentation - patch the internal client module\n    const grpcClientFileInstrumentation = new TdInstrumentationNodeModuleFile({\n      name: `${GRPC_MODULE_NAME}/build/src/client.js`,\n      supportedVersions: [\"1.*\"],\n      patch: (moduleExports: any, version?: string) => {\n        logger.debug(`[GrpcInstrumentation] Patching gRPC client file v${version}`);\n\n        if (moduleExports.Client && moduleExports.Client.prototype) {\n          this._patchGrpcClient(moduleExports.Client.prototype, version || \"\");\n          logger.debug(`[GrpcInstrumentation] Wrapped Client methods in client file`);\n        } else {\n          logger.warn(`[GrpcInstrumentation] Client class not found in client file exports`);\n        }\n\n        return moduleExports;\n      },\n    });\n\n    // NOTE: Not using this yet. This is somewhat working, haven't full tested it yet\n    // Adding this would require more changes to replay grpc server calls. Holding off until a customer asks for it\n    // const grpcServerFileInstrumentation = new TdInstrumentationNodeModuleFile({\n    //   name: `${GRPC_MODULE_NAME}/build/src/server.js`,\n    //   supportedVersions: [\"1.*\"],\n    //   patch: (moduleExports: any, version?: string) => {\n    //     logger.debug(`[GrpcInstrumentation] Patching gRPC server file v${version}`);\n\n    //     if (moduleExports.Server && moduleExports.Server.prototype) {\n    //       this._patchGrpcServer(moduleExports.Server.prototype, version || \"\");\n    //       logger.debug(`[GrpcInstrumentation] Wrapped Server methods in server file`);\n    //     } else {\n    //       logger.warn(`[GrpcInstrumentation] Server class not found in server file exports`);\n    //     }\n\n    //     return moduleExports;\n    //   },\n    // });\n\n    // Main module instrumentation - patch the main @grpc/grpc-js package\n    const grpcInstrumentation = new TdInstrumentationNodeModule({\n      name: GRPC_MODULE_NAME,\n      supportedVersions: [\"1.*\"],\n      patch: (moduleExports: GrpcModuleExports, version?: string) => {\n        logger.debug(`[GrpcInstrumentation] Patching main gRPC module v${version}`);\n        return this._patchGrpcModule(moduleExports, version || \"\");\n      },\n      files: [grpcClientFileInstrumentation],\n    });\n\n    return [grpcInstrumentation];\n  }\n\n  private _patchGrpcModule(moduleExports: GrpcModuleExports, version: string): GrpcModuleExports {\n    logger.debug(`[GrpcInstrumentation] Patching gRPC main module in ${this.mode} mode`);\n\n    if (this.isModulePatched(moduleExports)) {\n      logger.debug(`[GrpcInstrumentation] gRPC module already patched, skipping`);\n      return moduleExports;\n    }\n\n    // Store Metadata constructor for this version\n    if (moduleExports.Metadata) {\n      GrpcInstrumentation.metadataStore.set(version, moduleExports.Metadata);\n      this.Metadata = moduleExports.Metadata;\n      logger.debug(`[GrpcInstrumentation] Stored Metadata constructor for version ${version}`);\n    }\n\n    // Note: Client and Server are patched via TdInstrumentationNodeModuleFile for the internal modules\n    // This ensures the patches are applied before any service clients are created\n    // The Client.prototype.makeUnaryRequest patch will handle all unary gRPC calls\n\n    this.markModuleAsPatched(moduleExports);\n    logger.debug(`[GrpcInstrumentation] gRPC main module patching complete`);\n\n    return moduleExports;\n  }\n\n  private _patchGrpcClient(clientPrototype: any, version: string): void {\n    if (!clientPrototype) {\n      logger.warn(`[GrpcInstrumentation] Client prototype not found`);\n      return;\n    }\n\n    // Wrap makeUnaryRequest\n    this._wrap(clientPrototype, \"makeUnaryRequest\", this._getMakeUnaryRequestPatchFn(version));\n\n    // Wrap server streaming requests (used by Firestore queries)\n    this._wrap(\n      clientPrototype,\n      \"makeServerStreamRequest\",\n      this._getMakeServerStreamRequestPatchFn(version),\n    );\n\n    // Wrap waitForReady (for replay mode, we skip the actual wait)\n    this._wrap(clientPrototype, \"waitForReady\", this._getWaitForReadyPatchFn());\n\n    // Wrap close (for replay mode, we don't actually close)\n    this._wrap(clientPrototype, \"close\", this._getClosePatchFn());\n\n    // Wrap getChannel (for replay mode, we return a mock)\n    this._wrap(clientPrototype, \"getChannel\", this._getGetChannelPatchFn());\n\n    logger.debug(`[GrpcInstrumentation] Client methods patched successfully`);\n  }\n\n  // NOTE: Not using this yet. This is somewhat working, haven't full tested it yet\n  // Adding this would require more changes to replay grpc server calls. Holding off until a customer asks for it\n  // private _patchGrpcServer(serverPrototype: any, version: string): void {\n  //   if (!serverPrototype) {\n  //     logger.warn(`[GrpcInstrumentation] Server prototype not found`);\n  //     return;\n  //   }\n\n  //   // Wrap register method to intercept handler registration\n  //   this._wrap(serverPrototype, \"register\", this._getRegisterPatchFn(version));\n\n  //   logger.debug(`[GrpcInstrumentation] Server methods patched successfully`);\n  // }\n\n  /**\n   * Helper method to parse optional unary response arguments\n   *\n   * Handles the following cases:\n   * 1. (metadata: Metadata, callback: Function) - no options\n   * 2. (metadata: Metadata, options: Object, callback: Function) - with options\n   */\n  private parseUnaryCallArguments(\n    MetadataConstructor: any,\n    arg1: any,\n    arg2: any,\n    arg3: any,\n  ): { metadata: any; options: any; callback: Function } {\n    // Case 1: metadata + callback (no options)\n    if (arg1 instanceof MetadataConstructor && typeof arg2 === \"function\") {\n      return {\n        metadata: arg1,\n        options: {},\n        callback: arg2,\n      };\n    }\n\n    // Case 2: metadata + options + callback\n    if (\n      arg1 instanceof MetadataConstructor &&\n      arg2 instanceof Object &&\n      typeof arg3 === \"function\"\n    ) {\n      return {\n        metadata: arg1,\n        options: arg2,\n        callback: arg3,\n      };\n    }\n\n    // We try/catch this function so throwing an error is okay\n    throw new Error(\n      `[GrpcInstrumentation] Incorrect arguments passed to makeUnaryRequest. Expected (metadata, [options], callback) but got types: (${typeof arg1}, ${typeof arg2}, ${typeof arg3})`,\n    );\n  }\n\n  /**\n   * Helper method to extract and validate all input parameters for makeUnaryRequest\n   */\n  private extractRequestParameters(\n    args: any[],\n    MetadataConstructor: any,\n  ): {\n    method: string;\n    serialize: Function;\n    deserialize: Function;\n    argument: any;\n    metadata: any;\n    options: any;\n    callback: Function;\n  } {\n    const method = args[0];\n    const serialize = args[1];\n    const deserialize = args[2];\n    const argument = args[3];\n\n    const { metadata, options, callback } = this.parseUnaryCallArguments(\n      MetadataConstructor,\n      args[4],\n      args[5],\n      args[6],\n    );\n\n    return { method, serialize, deserialize, argument, metadata, options, callback };\n  }\n\n  private _getMakeUnaryRequestPatchFn(version: string) {\n    const self = this;\n    logger.debug(\n      `[GrpcInstrumentation] _getMakeUnaryRequestPatchFn called for version: ${version}`,\n    );\n    return (original: Function) => {\n      return function makeUnaryRequest(this: any, ...args: any[]) {\n        logger.debug(`[GrpcInstrumentation] makeUnaryRequest called! args length: ${args.length}`);\n        const MetadataConstructor = GrpcInstrumentation.metadataStore.get(version) || self.Metadata;\n\n        if (!MetadataConstructor) {\n          logger.warn(\n            `[GrpcInstrumentation] Metadata constructor not found for version ${version}`,\n          );\n          return original.apply(this, args);\n        }\n\n        // Use defensive parsing to extract and validate all parameters\n        let parsedParams: {\n          method: string;\n          serialize: Function;\n          deserialize: Function;\n          argument: any;\n          metadata: any;\n          options: any;\n          callback: Function;\n        };\n\n        try {\n          parsedParams = self.extractRequestParameters(args, MetadataConstructor);\n        } catch (error) {\n          logger.error(`[GrpcInstrumentation] Error parsing makeUnaryRequest arguments:`, error);\n          // Fall back to original function if we can't parse the arguments\n          return original.apply(this, args);\n        }\n\n        const { method: path, argument, metadata, options, callback } = parsedParams;\n\n        let method: string;\n        let service: string;\n        let readableBody: any;\n        let bufferMap: Record<\n          string,\n          {\n            value: string;\n            encoding: string;\n          }\n        >;\n        let jsonableStringMap: Record<string, string>;\n        let readableMetadata: ReadableMetadata;\n\n        try {\n          ({ method, service } = parseGrpcPath(path));\n          ({ readableBody, bufferMap, jsonableStringMap } = serializeGrpcPayload(argument));\n          readableMetadata = serializeGrpcMetadata(metadata);\n        } catch (error) {\n          logger.error(`[GrpcInstrumentation] Error parsing makeUnaryRequest arguments:`, error);\n          // Fall back to original function if we can't parse the arguments\n          return original.apply(this, args);\n        }\n\n        const inputMeta: BufferMetadata = {\n          bufferMap,\n          jsonableStringMap,\n        };\n\n        const inputValue: GrpcClientInputValue = {\n          method,\n          service,\n          body: readableBody,\n          metadata: readableMetadata,\n          inputMeta,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          const stackTrace = captureStackTrace([\"GrpcInstrumentation\"]);\n\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              callback(null, undefined);\n              return;\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => original.apply(this, args),\n                {\n                  name: \"grpc.client.unary\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"client\",\n                  packageType: PackageType.GRPC,\n                  packageName: GRPC_MODULE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self._handleReplayUnaryRequest(\n                    spanInfo,\n                    inputValue,\n                    callback,\n                    MetadataConstructor,\n                    stackTrace,\n                  );\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => original.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => original.apply(this, args),\n                {\n                  name: \"grpc.client.unary\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"client\",\n                  packageType: PackageType.GRPC,\n                  packageName: GRPC_MODULE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordUnaryRequest(\n                    spanInfo,\n                    original,\n                    this,\n                    parsedParams,\n                    callback,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return original.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _getMakeServerStreamRequestPatchFn(version: string) {\n    const self = this;\n    logger.debug(\n      `[GrpcInstrumentation] _getMakeServerStreamRequestPatchFn called for version: ${version}`,\n    );\n    return (original: Function) => {\n      return function makeServerStreamRequest(this: any, ...args: any[]) {\n        logger.debug(\n          `[GrpcInstrumentation] makeServerStreamRequest called! args length: ${args.length}`,\n        );\n        const MetadataConstructor = GrpcInstrumentation.metadataStore.get(version) || self.Metadata;\n\n        if (!MetadataConstructor) {\n          logger.warn(\n            `[GrpcInstrumentation] Metadata constructor not found for version ${version}`,\n          );\n          return original.apply(this, args);\n        }\n\n        // Parse arguments for server stream request\n        // Signature: (method, serialize, deserialize, argument, metadata?, options?)\n        let parsedParams: {\n          method: string;\n          serialize: Function;\n          deserialize: Function;\n          argument: any;\n          metadata: any;\n          options: any;\n        };\n\n        try {\n          parsedParams = self.extractServerStreamRequestParameters(args, MetadataConstructor);\n        } catch (error) {\n          logger.error(\n            `[GrpcInstrumentation] Error parsing makeServerStreamRequest arguments:`,\n            error,\n          );\n          // Fall back to original function if we can't parse the arguments\n          return original.apply(this, args);\n        }\n\n        const { method: path, argument, metadata, options } = parsedParams;\n\n        let method: string;\n        let service: string;\n        let readableBody: any;\n        let bufferMap: Record<\n          string,\n          {\n            value: string;\n            encoding: string;\n          }\n        >;\n        let jsonableStringMap: Record<string, string>;\n        let readableMetadata: ReadableMetadata;\n\n        try {\n          ({ method, service } = parseGrpcPath(path));\n          ({ readableBody, bufferMap, jsonableStringMap } = serializeGrpcPayload(argument));\n          readableMetadata = serializeGrpcMetadata(metadata);\n        } catch (error) {\n          logger.error(\n            `[GrpcInstrumentation] Error parsing makeServerStreamRequest arguments:`,\n            error,\n          );\n          // Fall back to original function if we can't parse the arguments\n          return original.apply(this, args);\n        }\n\n        const inputMeta: BufferMetadata = {\n          bufferMap,\n          jsonableStringMap,\n        };\n\n        const inputValue: GrpcClientInputValue = {\n          method,\n          service,\n          body: readableBody,\n          metadata: readableMetadata,\n          inputMeta,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              // Create a Readable stream instead of EventEmitter\n              const stream = new Readable({\n                objectMode: true, // Important for gRPC which streams objects\n                read() {\n                  // No-op: data will be pushed asynchronously when mock data arrives\n                },\n              });\n\n              // Add gRPC-specific methods\n              Object.assign(stream, {\n                cancel() {},\n                getPeer: () => \"0.0.0.0:0000\",\n                call: undefined,\n              });\n\n              return stream;\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => original.apply(this, args),\n                {\n                  name: \"grpc.client.server_stream\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"client\",\n                  packageType: PackageType.GRPC,\n                  packageName: GRPC_MODULE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                },\n                (spanInfo) => {\n                  return self._handleReplayServerStreamRequest(\n                    spanInfo,\n                    inputValue,\n                    MetadataConstructor,\n                  );\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => original.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => original.apply(this, args),\n                {\n                  name: \"grpc.client.server_stream\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"client\",\n                  packageType: PackageType.GRPC,\n                  packageName: GRPC_MODULE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleRecordServerStreamRequest(\n                    spanInfo,\n                    original,\n                    this,\n                    parsedParams,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return original.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private extractServerStreamRequestParameters(\n    args: any[],\n    MetadataConstructor: any,\n  ): {\n    method: string;\n    serialize: Function;\n    deserialize: Function;\n    argument: any;\n    metadata: any;\n    options: any;\n  } {\n    // Server stream request signature:\n    // (method, serialize, deserialize, argument, metadata?, options?)\n    const method = args[0];\n    const serialize = args[1];\n    const deserialize = args[2];\n    const argument = args[3];\n\n    // args[4] can be metadata or options\n    // args[5] can be options\n    let metadata: any;\n    let options: any;\n\n    if (args.length === 6) {\n      // Both metadata and options provided\n      metadata = args[4];\n      options = args[5];\n    } else if (args.length === 5) {\n      // Either metadata or options provided\n      // Check if it's a Metadata instance\n      if (args[4] instanceof MetadataConstructor) {\n        metadata = args[4];\n        options = {};\n      } else {\n        metadata = new MetadataConstructor();\n        options = args[4] || {};\n      }\n    } else {\n      metadata = new MetadataConstructor();\n      options = {};\n    }\n\n    return { method, serialize, deserialize, argument, metadata, options };\n  }\n\n  private _handleRecordUnaryRequest(\n    spanInfo: SpanInfo,\n    original: Function,\n    context: any,\n    parsedParams: {\n      method: string;\n      serialize: Function;\n      deserialize: Function;\n      argument: any;\n      metadata: any;\n      options: any;\n      callback: Function;\n    },\n    callback: Function,\n  ): any {\n    let isResponseReceived = false;\n    let isStatusEmitted = false;\n    let hasErrorOccurred = false;\n    let isSpanCompleted = false;\n    let readableResponseBody: any;\n    let responseBufferMap: Record<string, { value: string; encoding: string }> = {};\n    let responseJsonableStringMap: Record<string, any> = {};\n    let status: {\n      code: number;\n      details: string;\n      metadata: Record<string, any>;\n    };\n    let responseMetadataInitial: any = {};\n    let serviceError: any;\n\n    /**\n     * Completes the span exactly once, regardless of which event fires first.\n     * gRPC's asynchronous nature means the callback and status event can fire in any order,\n     * so we need to guard against double span completion.\n     */\n    const completeSpan = (output: any, statusCode: SpanStatusCode, errorMessage?: string) => {\n      if (isSpanCompleted) {\n        return; // Span already completed, prevent double-ending\n      }\n      isSpanCompleted = true;\n\n      try {\n        SpanUtils.addSpanAttributes(spanInfo.span, {\n          outputValue: output,\n        });\n        SpanUtils.endSpan(spanInfo.span, {\n          code: statusCode,\n          message: errorMessage,\n        });\n      } catch (e) {\n        logger.error(`[GrpcInstrumentation] Error completing span:`, e);\n      }\n    };\n\n    // Wrap the callback to capture response\n    const patchedCallback = (err: any, value: any) => {\n      try {\n        if (err) {\n          serviceError = err;\n          hasErrorOccurred = true;\n        } else {\n          const { readableBody, bufferMap, jsonableStringMap } = serializeGrpcPayload(value);\n          readableResponseBody = readableBody;\n          responseBufferMap = bufferMap;\n          responseJsonableStringMap = jsonableStringMap;\n          isResponseReceived = true;\n        }\n\n        if (isStatusEmitted && isResponseReceived) {\n          const realOutput: GrpcOutputValue = {\n            body: readableResponseBody,\n            metadata: responseMetadataInitial,\n            status,\n            bufferMap: responseBufferMap,\n            jsonableStringMap: responseJsonableStringMap,\n          };\n          completeSpan(realOutput, SpanStatusCode.OK);\n        } else if (isStatusEmitted && hasErrorOccurred) {\n          const errorOutput: GrpcErrorOutput = {\n            error: {\n              message: serviceError.message,\n              name: serviceError.name,\n              stack: serviceError.stack,\n            },\n            status,\n            metadata: responseMetadataInitial,\n          };\n          completeSpan(errorOutput, SpanStatusCode.ERROR, serviceError.message);\n        }\n      } catch (e) {\n        logger.error(`[GrpcInstrumentation] Error in patchedCallback:`, e);\n      }\n\n      return callback(err, value);\n    };\n\n    // Reconstruct the makeUnaryRequest call with all validated parameters\n    // This ensures we always pass the full 7 arguments in the correct format\n    const inputArgs = [\n      parsedParams.method,\n      parsedParams.serialize,\n      parsedParams.deserialize,\n      parsedParams.argument,\n      parsedParams.metadata,\n      parsedParams.options,\n      patchedCallback,\n    ];\n\n    const result = original.apply(context, inputArgs);\n\n    // Listen to metadata and status events\n    result.on(\"metadata\", (initialMetadata: any) => {\n      responseMetadataInitial = serializeGrpcMetadata(initialMetadata);\n    });\n\n    result.on(\"status\", (responseStatus: any) => {\n      status = {\n        code: responseStatus.code,\n        details: responseStatus.details,\n        metadata: serializeGrpcMetadata(responseStatus.metadata),\n      };\n      isStatusEmitted = true;\n\n      if (isResponseReceived) {\n        const realOutput: GrpcOutputValue = {\n          body: readableResponseBody,\n          metadata: responseMetadataInitial,\n          status,\n          bufferMap: responseBufferMap,\n          jsonableStringMap: responseJsonableStringMap,\n        };\n        completeSpan(realOutput, SpanStatusCode.OK);\n      } else if (hasErrorOccurred) {\n        const errorOutput: GrpcErrorOutput = {\n          error: {\n            message: serviceError.message,\n            name: serviceError.name,\n            stack: serviceError.stack,\n          },\n          status,\n          metadata: responseMetadataInitial,\n        };\n        completeSpan(errorOutput, SpanStatusCode.ERROR, serviceError.message);\n      }\n    });\n\n    return result;\n  }\n\n  // Add this helper function to check if it's an error response\n  private isGrpcErrorOutput(result: GrpcOutputValue | GrpcErrorOutput): result is GrpcErrorOutput {\n    return \"error\" in result;\n  }\n\n  private _handleReplayUnaryRequest(\n    spanInfo: SpanInfo,\n    inputValue: GrpcClientInputValue,\n    callback: Function,\n    MetadataConstructor: any,\n    stackTrace?: string,\n  ): any {\n    logger.debug(`[GrpcInstrumentation] Replaying gRPC unary request`);\n\n    // Create emitter immediately\n    const emitter = Object.assign(new EventEmitter(), {\n      cancel() {},\n      getPeer: () => \"0.0.0.0:0000\",\n      call: undefined,\n    });\n\n    // Fetch mock data in background\n    findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: \"grpc.client.unary\",\n        inputValue: inputValue,\n        packageName: GRPC_MODULE_NAME,\n        packageType: PackageType.GRPC,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"client\",\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    })\n      .then((mockData) => {\n        if (!mockData) {\n          logger.warn(\n            `[GrpcInstrumentation] No mock data found for gRPC request: ${inputValue.service}/${inputValue.method}`,\n            inputValue,\n          );\n          throw new Error(`[GrpcInstrumentation] No matching mock found for gRPC unary request`);\n        }\n\n        const mockResult: GrpcOutputValue | GrpcErrorOutput = mockData.result;\n        let status: any;\n\n        // Check if it's an error response\n        if (this.isGrpcErrorOutput(mockResult)) {\n          const { error, status: errorStatus } = mockResult;\n          status = {\n            code: errorStatus.code,\n            details: errorStatus.details,\n            metadata: deserializeGrpcMetadata(MetadataConstructor, errorStatus.metadata),\n          };\n\n          const errorObj = Object.assign(new Error(error.message), {\n            name: error.name,\n            stack: error.stack,\n            ...status,\n          });\n\n          callback(errorObj);\n        } else {\n          // Success response\n          const { body, status: successStatus, bufferMap, jsonableStringMap } = mockResult;\n          const bufferMapToUse = bufferMap || {};\n          const jsonableStringMapToUse = jsonableStringMap || {};\n\n          status = {\n            code: successStatus.code,\n            details: successStatus.details,\n            metadata: deserializeGrpcMetadata(MetadataConstructor, successStatus.metadata),\n          };\n\n          const realResponse = deserializeGrpcPayload(body, bufferMapToUse, jsonableStringMapToUse);\n          callback(null, realResponse);\n        }\n\n        // Emit events\n        process.nextTick(() => {\n          if (mockResult.metadata) {\n            emitter.emit(\n              \"metadata\",\n              deserializeGrpcMetadata(MetadataConstructor, mockResult.metadata),\n            );\n          }\n          emitter.emit(\"status\", status);\n        });\n      })\n      .catch((error) => {\n        logger.error(`[GrpcInstrumentation] Error fetching mock data:`, error);\n        callback(error);\n      });\n\n    // Return emitter immediately (synchronously)\n    return emitter;\n  }\n\n  private _handleRecordServerStreamRequest(\n    spanInfo: SpanInfo,\n    original: Function,\n    context: any,\n    parsedParams: {\n      method: string;\n      serialize: Function;\n      deserialize: Function;\n      argument: any;\n      metadata: any;\n      options: any;\n    },\n  ): any {\n    let isStatusEmitted = false;\n    let hasErrorOccurred = false;\n    let isSpanCompleted = false;\n    let streamResponses: any[] = [];\n    let status: {\n      code: number;\n      details: string;\n      metadata: Record<string, any>;\n    };\n    let responseMetadataInitial: any = {};\n    let serviceError: any;\n\n    /**\n     * Completes the span exactly once\n     */\n    const completeSpan = (output: any, statusCode: SpanStatusCode, errorMessage?: string) => {\n      if (isSpanCompleted) {\n        return;\n      }\n      isSpanCompleted = true;\n\n      try {\n        SpanUtils.addSpanAttributes(spanInfo.span, {\n          outputValue: output,\n        });\n        SpanUtils.endSpan(spanInfo.span, {\n          code: statusCode,\n        });\n      } catch (e) {\n        logger.error(`[GrpcInstrumentation] Error completing span:`, e);\n      }\n    };\n\n    // Construct the makeServerStreamRequest call\n    const inputArgs = [\n      parsedParams.method,\n      parsedParams.serialize,\n      parsedParams.deserialize,\n      parsedParams.argument,\n      parsedParams.metadata,\n      parsedParams.options,\n    ];\n\n    const stream = original.apply(context, inputArgs);\n\n    // Listen to data events to collect all streamed responses\n    stream.on(\"data\", (data: any) => {\n      try {\n        const { readableBody, bufferMap, jsonableStringMap } = serializeGrpcPayload(data);\n        streamResponses.push({\n          body: readableBody,\n          bufferMap,\n          jsonableStringMap,\n        });\n      } catch (e) {\n        logger.error(`[GrpcInstrumentation] Error serializing stream data:`, e);\n      }\n    });\n\n    // Listen to metadata event\n    stream.on(\"metadata\", (initialMetadata: any) => {\n      responseMetadataInitial = serializeGrpcMetadata(initialMetadata);\n    });\n\n    // Listen to error event\n    stream.on(\"error\", (err: any) => {\n      serviceError = err;\n      hasErrorOccurred = true;\n    });\n\n    // Listen to status event (emitted when stream completes)\n    stream.on(\"status\", (responseStatus: any) => {\n      status = {\n        code: responseStatus.code,\n        details: responseStatus.details,\n        metadata: serializeGrpcMetadata(responseStatus.metadata),\n      };\n      isStatusEmitted = true;\n\n      // Complete span when status is received\n      if (!hasErrorOccurred && streamResponses.length > 0) {\n        const output: GrpcOutputValue = {\n          body: streamResponses,\n          metadata: responseMetadataInitial,\n          status,\n          bufferMap: {},\n          jsonableStringMap: {},\n        };\n        completeSpan(output, SpanStatusCode.OK);\n      } else if (!hasErrorOccurred && streamResponses.length === 0) {\n        // Empty stream is still successful\n        const output: GrpcOutputValue = {\n          body: [],\n          metadata: responseMetadataInitial,\n          status,\n          bufferMap: {},\n          jsonableStringMap: {},\n        };\n        completeSpan(output, SpanStatusCode.OK);\n      } else if (hasErrorOccurred) {\n        const errorOutput: GrpcErrorOutput = {\n          error: {\n            message: serviceError.message,\n            name: serviceError.name,\n            stack: serviceError.stack,\n          },\n          status,\n          metadata: responseMetadataInitial,\n        };\n        completeSpan(errorOutput, SpanStatusCode.ERROR, serviceError.message);\n      }\n    });\n\n    return stream;\n  }\n\n  private _handleReplayServerStreamRequest(\n    spanInfo: SpanInfo,\n    inputValue: GrpcClientInputValue,\n    MetadataConstructor: any,\n  ): any {\n    logger.debug(`[GrpcInstrumentation] Replaying gRPC server stream request`);\n\n    // Create a Readable stream instead of EventEmitter\n    const stream = new Readable({\n      objectMode: true, // Important for gRPC which streams objects\n      read() {\n        // No-op: data will be pushed asynchronously when mock data arrives\n      },\n    });\n\n    // Add gRPC-specific methods\n    Object.assign(stream, {\n      cancel() {},\n      getPeer: () => \"0.0.0.0:0000\",\n      call: undefined,\n    });\n\n    // Fetch mock data in background\n    findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: \"grpc.client.server_stream\",\n        inputValue: inputValue,\n        packageName: GRPC_MODULE_NAME,\n        packageType: PackageType.GRPC,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"client\",\n        kind: SpanKind.CLIENT,\n      },\n      tuskDrift: this.tuskDrift,\n    })\n      .then((mockData) => {\n        if (!mockData) {\n          logger.warn(\n            `[GrpcInstrumentation] No mock data found for gRPC server stream request: ${inputValue.service}/${inputValue.method}`,\n            inputValue,\n          );\n\n          throw new Error(\n            `[GrpcInstrumentation] No matching mock found for gRPC server stream request`,\n          );\n        }\n\n        const mockResult: GrpcOutputValue | GrpcErrorOutput = mockData.result;\n\n        // Emit events on next tick to simulate async behavior\n        process.nextTick(() => {\n          if (this.isGrpcErrorOutput(mockResult)) {\n            // Handle error case\n            const { error, status: errorStatus } = mockResult;\n            const status = {\n              code: errorStatus.code,\n              details: errorStatus.details,\n              metadata: deserializeGrpcMetadata(MetadataConstructor, errorStatus.metadata),\n            };\n\n            if (mockResult.metadata) {\n              stream.emit(\n                \"metadata\",\n                deserializeGrpcMetadata(MetadataConstructor, mockResult.metadata),\n              );\n            }\n\n            const errorObj = Object.assign(new Error(error.message), {\n              name: error.name,\n              stack: error.stack,\n              ...status,\n            });\n\n            stream.emit(\"error\", errorObj);\n            stream.emit(\"status\", status);\n            stream.push(null); // Signal end of stream\n          } else {\n            // Handle success case - emit data events for each item in the stream\n            const { body, status: successStatus } = mockResult;\n            const status = {\n              code: successStatus.code,\n              details: successStatus.details,\n              metadata: deserializeGrpcMetadata(MetadataConstructor, successStatus.metadata),\n            };\n\n            if (mockResult.metadata) {\n              stream.emit(\n                \"metadata\",\n                deserializeGrpcMetadata(MetadataConstructor, mockResult.metadata),\n              );\n            }\n\n            // Push data to the readable stream\n            if (Array.isArray(body)) {\n              body.forEach((item: any) => {\n                const bufferMapToUse = item.bufferMap || {};\n                const jsonableStringMapToUse = item.jsonableStringMap || {};\n                const realResponse = deserializeGrpcPayload(\n                  item.body,\n                  bufferMapToUse,\n                  jsonableStringMapToUse,\n                );\n                stream.push(realResponse); // Push to stream instead of emit\n              });\n            }\n\n            stream.push(null); // Signal end of stream (important!)\n            stream.emit(\"status\", status);\n          }\n        });\n      })\n      .catch((error) => {\n        logger.error(`[GrpcInstrumentation] Error fetching mock data for server stream:`, error);\n        process.nextTick(() => {\n          stream.emit(\"error\", error);\n          stream.emit(\"status\", {\n            code: 2, // UNKNOWN\n            details: error.message,\n            metadata: new MetadataConstructor(),\n          });\n          stream.push(null); // Signal end of stream\n        });\n      });\n\n    // Return stream immediately (synchronously)\n    return stream;\n  }\n\n  // NOTE: Not using this yet. This is somewhat working, haven't full tested it yet\n  // Adding this would require more changes to replay grpc server calls. Holding off until a customer asks for it\n  // private _getRegisterPatchFn(version: string) {\n  //   const self = this;\n\n  //   return (originalRegister: Function) => {\n  //     return function register(this: any, ...args: any[]) {\n  //       const path = args[0];\n  //       const handler = args[1];\n  //       const type = args[4]; // 'unary', 'clientStream', 'serverStream', 'bidi'\n\n  //       // Only instrument unary calls for now\n  //       if (type !== \"unary\") {\n  //         return originalRegister.apply(this, args);\n  //       }\n\n  //       // Patch the handler\n  //       const patchedHandler = self._getHandlerPatchFn(path, version)(handler);\n  //       const newArgs = [path, patchedHandler, ...args.slice(2)];\n\n  //       if (self.mode === TuskDriftMode.RECORD) {\n  //         return originalRegister.apply(this, newArgs);\n  //       } else if (self.mode === TuskDriftMode.REPLAY) {\n  //         // In replay mode, we still register the handler but it will use mocked data\n  //         return originalRegister.apply(this, newArgs);\n  //       } else {\n  //         return originalRegister.apply(this, args);\n  //       }\n  //     };\n  //   };\n  // }\n\n  // NOTE: Not using this yet. This is somewhat working, haven't full tested it yet\n  // Adding this would require more changes to replay grpc server calls. Holding off until a customer asks for it\n  // private _getHandlerPatchFn(path: string, version: string) {\n  //   const self = this;\n\n  //   return (originalHandler: Function) => {\n  //     return function handler(this: any, call: any, callback: Function) {\n  //       const { method, service } = extractServiceAndMethodFromPath(path);\n  //       const { request: requestBody, metadata: requestMetadata } = call;\n\n  //       const { readableBody, bufferMap, jsonableStringMap } =\n  //         getReadableBodyAndBufferMap(requestBody);\n  //       const readableMetadata = getReadableMetadata(requestMetadata);\n\n  //       const inputValue: GrpcServerInputValue = {\n  //         method,\n  //         service,\n  //         body: readableBody,\n  //         metadata: readableMetadata,\n  //       };\n\n  //       const inputMeta: BufferMetadata = {\n  //         bufferMap,\n  //         jsonableStringMap,\n  //       };\n\n  //       if (self.mode === TuskDriftMode.RECORD) {\n  //         return handleRecordMode({\n  //           originalFunctionCall: () => originalHandler.call(this, call, callback),\n  //           recordModeHandler: ({ isPreAppStart }) => {\n  //             return SpanUtils.createAndExecuteSpan(\n  //               self.mode,\n  //               () => originalHandler.call(this, call, callback),\n  //               {\n  //                 name: \"grpc.server.unary\",\n  //                 kind: SpanKind.SERVER,\n  //                 submodule: \"server\",\n  //                 packageType: PackageType.GRPC,\n  //                 packageName: GRPC_MODULE_NAME,\n  //                 instrumentationName: self.INSTRUMENTATION_NAME,\n  //                 inputValue: inputValue,\n  //                 isPreAppStart,\n  //               },\n  //               (spanInfo) => {\n  //                 return self._handleRecordServerHandler(\n  //                   spanInfo,\n  //                   originalHandler,\n  //                   this,\n  //                   call,\n  //                   callback,\n  //                   version,\n  //                 );\n  //               },\n  //             );\n  //           },\n  //           spanKind: SpanKind.SERVER,\n  //         });\n  //       } else if (self.mode === TuskDriftMode.REPLAY) {\n  //         return handleReplayMode({\n  //           replayModeHandler: () => {\n  //             return SpanUtils.createAndExecuteSpan(\n  //               self.mode,\n  //               () => originalHandler.call(this, call, callback),\n  //               {\n  //                 name: \"grpc.server.unary\",\n  //                 kind: SpanKind.SERVER,\n  //                 submodule: \"server\",\n  //                 packageType: PackageType.GRPC,\n  //                 packageName: GRPC_MODULE_NAME,\n  //                 instrumentationName: self.INSTRUMENTATION_NAME,\n  //                 inputValue: inputValue,\n  //                 isPreAppStart: false,\n  //               },\n  //               (spanInfo) => {\n  //                 return self._handleReplayServerHandler(\n  //                   spanInfo,\n  //                   originalHandler,\n  //                   this,\n  //                   call,\n  //                   callback,\n  //                 );\n  //               },\n  //             );\n  //           },\n  //         });\n  //       } else {\n  //         return originalHandler.call(this, call, callback);\n  //       }\n  //     };\n  //   };\n  // }\n\n  // NOTE: Not using this yet. This is somewhat working, haven't full tested it yet\n  // Adding this would require more changes to replay grpc server calls. Holding off until a customer asks for it\n  // private _handleRecordServerHandler(\n  //   spanInfo: SpanInfo,\n  //   originalHandler: Function,\n  //   context: any,\n  //   call: any,\n  //   originalCallback: Function,\n  //   version: string,\n  // ): void {\n  //   const MetadataConstructor = GrpcInstrumentation.metadataStore.get(version) || this.Metadata;\n  //   let initialMetadata: any = {};\n\n  //   // Wrap sendMetadata to capture initial metadata\n  //   const originalSendMetadata = call.sendMetadata;\n  //   call.sendMetadata = function (metadata: any) {\n  //     initialMetadata = getReadableMetadata(metadata);\n  //     if (originalSendMetadata) {\n  //       originalSendMetadata.call(call, metadata);\n  //     }\n  //   };\n\n  //   // Wrap the callback to capture response\n  //   const patchedCallback = (err: any, response: any, trailingMetadata?: any) => {\n  //     const metadata = trailingMetadata || new MetadataConstructor();\n\n  //     if (err) {\n  //       const status = {\n  //         code: err.code || 2, // 2 = UNKNOWN\n  //         details: err.details || err.message,\n  //         metadata: getReadableMetadata(metadata),\n  //       };\n\n  //       const errorOutput = {\n  //         error: {\n  //           message: err.message,\n  //           name: err.name,\n  //           stack: err.stack,\n  //         },\n  //         status,\n  //         metadata: initialMetadata,\n  //       };\n\n  //       SpanUtils.addSpanAttributes(spanInfo.span, {\n  //         outputValue: errorOutput,\n  //       });\n  //       SpanUtils.endSpan(spanInfo.span, {\n  //         code: SpanStatusCode.ERROR,\n  //         message: err.message,\n  //       });\n  //     } else {\n  //       const { readableBody, bufferMap, jsonableStringMap } =\n  //         getReadableBodyAndBufferMap(response);\n\n  //       const status = {\n  //         code: 0, // OK\n  //         details: \"OK\",\n  //         metadata: getReadableMetadata(metadata),\n  //       };\n\n  //       const successOutput: GrpcOutputValue = {\n  //         body: readableBody,\n  //         status,\n  //         metadata: initialMetadata,\n  //       };\n\n  //       SpanUtils.addSpanAttributes(spanInfo.span, {\n  //         outputValue: successOutput,\n  //       });\n  //       SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n  //     }\n\n  //     return originalCallback(err, response, metadata);\n  //   };\n\n  //   try {\n  //     originalHandler.call(context, call, patchedCallback);\n  //   } catch (e: any) {\n  //     logger.error(`[GrpcInstrumentation] Error in server handler:`, e);\n  //     const status = {\n  //       code: 2, // UNKNOWN\n  //       details: `Server method handler threw error ${e.message}`,\n  //       metadata: {},\n  //     };\n\n  //     const errorOutput = {\n  //       error: {\n  //         message: e.message,\n  //         name: e.name,\n  //         stack: e.stack,\n  //       },\n  //       status,\n  //       metadata: initialMetadata,\n  //     };\n\n  //     SpanUtils.addSpanAttributes(spanInfo.span, {\n  //       outputValue: errorOutput,\n  //     });\n  //     SpanUtils.endSpan(spanInfo.span, {\n  //       code: SpanStatusCode.ERROR,\n  //       message: e.message,\n  //     });\n\n  //     throw e;\n  //   }\n  // }\n\n  // NOTE: Not using this yet. This is somewhat working, haven't full tested it yet\n  // Adding this would require more changes to replay grpc server calls. Holding off until a customer asks for it\n  // private _handleReplayServerHandler(\n  //   spanInfo: SpanInfo,\n  //   originalHandler: Function,\n  //   context: any,\n  //   call: any,\n  //   originalCallback: Function,\n  // ): void {\n  //   // In replay mode, we still execute the handler to maintain server behavior\n  //   // but the downstream calls will be mocked\n  //   try {\n  //     originalHandler.call(context, call, originalCallback);\n  //   } catch (e: any) {\n  //     logger.error(`[GrpcInstrumentation] Error in replay server handler:`, e);\n  //     SpanUtils.endSpan(spanInfo.span, {\n  //       code: SpanStatusCode.ERROR,\n  //       message: e.message,\n  //     });\n  //     throw e;\n  //   }\n  // }\n\n  private _getWaitForReadyPatchFn() {\n    const self = this;\n\n    return (original: Function) => {\n      return function waitForReady(this: any, deadline: any, callback: Function) {\n        if (self.mode === TuskDriftMode.REPLAY) {\n          // In replay mode, immediately call the callback to skip waiting\n          process.nextTick(() => callback());\n          return;\n        } else {\n          return original.apply(this, [deadline, callback]);\n        }\n      };\n    };\n  }\n\n  private _getClosePatchFn() {\n    const self = this;\n\n    return (original: Function) => {\n      return function close(this: any) {\n        if (self.mode === TuskDriftMode.REPLAY) {\n          // In replay mode, don't actually close the client\n          return;\n        } else {\n          return original.apply(this, arguments);\n        }\n      };\n    };\n  }\n\n  private _getGetChannelPatchFn() {\n    const self = this;\n\n    return (original: Function) => {\n      return function getChannel(this: any) {\n        if (self.mode === TuskDriftMode.REPLAY) {\n          // In replay mode, return a mock channel object\n          return {};\n        } else {\n          return original.apply(this, arguments);\n        }\n      };\n    };\n  }\n\n  private _wrap(target: any, propertyName: string, wrapper: (original: any) => any): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","import { FirestoreDocumentResult, FirestoreDocumentData } from \"../types\";\n\n/**\n * Mock Firestore DocumentSnapshot for replay mode\n * Mimics the Firestore DocumentSnapshot API\n */\nexport class TdFirestoreDocumentMock {\n  private documentData: FirestoreDocumentResult;\n\n  constructor(documentData: FirestoreDocumentResult) {\n    this.documentData = documentData;\n  }\n\n  /**\n   * The document's identifier within its collection\n   */\n  get id(): string {\n    return this.documentData.id;\n  }\n\n  /**\n   * Whether the document exists\n   */\n  get exists(): boolean {\n    return this.documentData.exists;\n  }\n\n  /**\n   * A DocumentReference to the document location\n   */\n  get ref(): any {\n    // Return a minimal mock reference\n    return {\n      id: this.documentData.id,\n      path: this.documentData.path,\n    };\n  }\n\n  /**\n   * The time the document was created (if available)\n   */\n  get createTime(): any {\n    return this.documentData.createTime\n      ? {\n          seconds: this.documentData.createTime.seconds,\n          nanoseconds: this.documentData.createTime.nanoseconds,\n          toDate: () =>\n            new Date(\n              this.documentData.createTime!.seconds * 1000 +\n                this.documentData.createTime!.nanoseconds / 1000000,\n            ),\n        }\n      : null;\n  }\n\n  /**\n   * The time the document was last updated (if available)\n   */\n  get updateTime(): any {\n    return this.documentData.updateTime\n      ? {\n          seconds: this.documentData.updateTime.seconds,\n          nanoseconds: this.documentData.updateTime.nanoseconds,\n          toDate: () =>\n            new Date(\n              this.documentData.updateTime!.seconds * 1000 +\n                this.documentData.updateTime!.nanoseconds / 1000000,\n            ),\n        }\n      : null;\n  }\n\n  /**\n   * The time the document was read (if available)\n   */\n  get readTime(): any {\n    return this.documentData.readTime\n      ? {\n          seconds: this.documentData.readTime.seconds,\n          nanoseconds: this.documentData.readTime.nanoseconds,\n          toDate: () =>\n            new Date(\n              this.documentData.readTime!.seconds * 1000 +\n                this.documentData.readTime!.nanoseconds / 1000000,\n            ),\n        }\n      : null;\n  }\n\n  /**\n   * Retrieves all fields in the document as an object\n   */\n  data(): FirestoreDocumentData | undefined {\n    return this.documentData.data;\n  }\n\n  /**\n   * Retrieves the field specified by fieldPath\n   */\n  get(fieldPath: string): any {\n    if (!this.documentData.data) {\n      return undefined;\n    }\n\n    // Simple field path resolution (doesn't handle nested paths with dots)\n    return this.documentData.data[fieldPath];\n  }\n\n  /**\n   * Returns true if the document's data and path are equal to the provided value\n   */\n  isEqual(other: TdFirestoreDocumentMock): boolean {\n    return this.documentData.path === other.documentData.path;\n  }\n}\n","import { FirestoreQueryResult } from \"../types\";\nimport { TdFirestoreDocumentMock } from \"./TdFirestoreDocumentMock\";\n\n/**\n * Mock Firestore QuerySnapshot for replay mode\n * Mimics the Firestore QuerySnapshot API\n */\nexport class TdFirestoreQueryMock {\n  private queryResult: FirestoreQueryResult;\n  private _docs: TdFirestoreDocumentMock[];\n\n  constructor(queryResult: FirestoreQueryResult) {\n    this.queryResult = queryResult;\n    this._docs = queryResult.docs.map((doc) => new TdFirestoreDocumentMock(doc));\n  }\n\n  /**\n   * An array of all the documents in the QuerySnapshot\n   */\n  get docs(): TdFirestoreDocumentMock[] {\n    return this._docs;\n  }\n\n  /**\n   * The number of documents in the QuerySnapshot\n   */\n  get size(): number {\n    return this.queryResult.size;\n  }\n\n  /**\n   * True if there are no documents in the QuerySnapshot\n   */\n  get empty(): boolean {\n    return this.queryResult.empty;\n  }\n\n  /**\n   * The time the query snapshot was read\n   */\n  get readTime(): any {\n    return this.queryResult.readTime\n      ? {\n          seconds: this.queryResult.readTime.seconds,\n          nanoseconds: this.queryResult.readTime.nanoseconds,\n          toDate: () =>\n            new Date(\n              this.queryResult.readTime!.seconds * 1000 +\n                this.queryResult.readTime!.nanoseconds / 1000000,\n            ),\n        }\n      : null;\n  }\n\n  /**\n   * The query on which you called get or onSnapshot\n   */\n  get query(): any {\n    // Return a minimal mock query reference\n    return {\n      // Mock query object - can be extended if needed\n    };\n  }\n\n  /**\n   * Enumerates all of the documents in the QuerySnapshot\n   */\n  forEach(callback: (result: TdFirestoreDocumentMock) => void, thisArg?: any): void {\n    this._docs.forEach(callback, thisArg);\n  }\n\n  /**\n   * Returns an array of the documents changes since the last snapshot\n   */\n  docChanges(): any[] {\n    // In replay mode, we don't track changes, so return empty array\n    return [];\n  }\n\n  /**\n   * Returns true if the document data and path are equal to this QuerySnapshot\n   */\n  isEqual(other: TdFirestoreQueryMock): boolean {\n    if (this.size !== other.size) {\n      return false;\n    }\n    // Simple comparison based on size - could be enhanced\n    return this.size === other.size && this.empty === other.empty;\n  }\n}\n","import { FirestoreWriteResult } from \"../types\";\n\n/**\n * Mock Firestore WriteResult for replay mode\n * Mimics the Firestore WriteResult API\n */\nexport class TdFirestoreWriteResultMock {\n  private result: FirestoreWriteResult;\n\n  constructor(result: FirestoreWriteResult) {\n    this.result = result;\n  }\n\n  /**\n   * The write time as reported by the server\n   */\n  get writeTime(): any {\n    return this.result.writeTime\n      ? {\n          seconds: this.result.writeTime.seconds,\n          nanoseconds: this.result.writeTime.nanoseconds,\n          toDate: () =>\n            new Date(\n              this.result.writeTime!.seconds * 1000 +\n                this.result.writeTime!.nanoseconds / 1000000,\n            ),\n        }\n      : null;\n  }\n\n  /**\n   * Returns true if this WriteResult is equal to the provided one\n   */\n  isEqual(other: TdFirestoreWriteResultMock): boolean {\n    if (!this.writeTime || !other.writeTime) {\n      return this.writeTime === other.writeTime;\n    }\n    return (\n      this.writeTime.seconds === other.writeTime.seconds &&\n      this.writeTime.nanoseconds === other.writeTime.nanoseconds\n    );\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { TdInstrumentationNodeModuleFile } from \"../../core/baseClasses/TdInstrumentationNodeModuleFile\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { handleRecordMode, handleReplayMode } from \"../../core/utils/modeUtils\";\nimport { findMockResponseAsync, findMockResponseSync } from \"../../core/utils/mockResponseUtils\";\nimport { createMockInputValue } from \"../../../core/utils\";\nimport {\n  FirestoreInstrumentationConfig,\n  FirestoreInputValue,\n  FirestoreDocumentResult,\n  FirestoreQueryResult,\n  FirestoreWriteResult,\n} from \"./types\";\nimport { TdFirestoreDocumentMock } from \"./mocks/TdFirestoreDocumentMock\";\nimport { TdFirestoreQueryMock } from \"./mocks/TdFirestoreQueryMock\";\nimport { TdFirestoreWriteResultMock } from \"./mocks/TdFirestoreWriteResultMock\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger } from \"../../../core/utils/logger\";\n\nconst FIRESTORE_VERSION = \"7.*\";\nconst PACKAGE_NAME = \"@google-cloud/firestore\";\n\nexport class FirestoreInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"FirestoreInstrumentation\";\n  private mode: TuskDriftMode;\n  private tuskDrift: TuskDriftCore;\n  private originalCollectionDocFn: Function | null = null;\n\n  constructor(config: FirestoreInstrumentationConfig = {}) {\n    super(PACKAGE_NAME, config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: PACKAGE_NAME,\n        supportedVersions: [FIRESTORE_VERSION],\n        files: [\n          // Patch DocumentReference methods\n          new TdInstrumentationNodeModuleFile({\n            name: \"@google-cloud/firestore/build/src/reference/document-reference.js\",\n            supportedVersions: [FIRESTORE_VERSION],\n            patch: (moduleExports: any) => this._patchDocumentReference(moduleExports),\n          }),\n          // Patch CollectionReference methods\n          new TdInstrumentationNodeModuleFile({\n            name: \"@google-cloud/firestore/build/src/reference/collection-reference.js\",\n            supportedVersions: [FIRESTORE_VERSION],\n            patch: (moduleExports: any) => this._patchCollectionReference(moduleExports),\n          }),\n          // Patch Query methods\n          new TdInstrumentationNodeModuleFile({\n            name: \"@google-cloud/firestore/build/src/reference/query.js\",\n            supportedVersions: [FIRESTORE_VERSION],\n            patch: (moduleExports: any) => this._patchQuery(moduleExports),\n          }),\n        ],\n      }),\n    ];\n  }\n\n  private _patchDocumentReference(moduleExports: any): any {\n    logger.debug(`[FirestoreInstrumentation] Patching DocumentReference in ${this.mode} mode`);\n\n    if (this.isModulePatched(moduleExports)) {\n      logger.debug(`[FirestoreInstrumentation] DocumentReference already patched, skipping`);\n      return moduleExports;\n    }\n\n    const DocumentReference = moduleExports.DocumentReference;\n    if (!DocumentReference || !DocumentReference.prototype) {\n      logger.warn(`[FirestoreInstrumentation] DocumentReference.prototype not found`);\n      return moduleExports;\n    }\n\n    // Patch DocumentReference methods\n    this._wrap(DocumentReference.prototype, \"get\", this._getDocumentGetPatchFn());\n    this._wrap(DocumentReference.prototype, \"create\", this._getDocumentCreatePatchFn());\n    this._wrap(DocumentReference.prototype, \"set\", this._getDocumentSetPatchFn());\n    this._wrap(DocumentReference.prototype, \"update\", this._getDocumentUpdatePatchFn());\n    this._wrap(DocumentReference.prototype, \"delete\", this._getDocumentDeletePatchFn());\n\n    this.markModuleAsPatched(moduleExports);\n    logger.debug(`[FirestoreInstrumentation] DocumentReference patching complete`);\n\n    return moduleExports;\n  }\n\n  private _patchCollectionReference(moduleExports: any): any {\n    logger.debug(`[FirestoreInstrumentation] Patching CollectionReference in ${this.mode} mode`);\n\n    if (this.isModulePatched(moduleExports)) {\n      logger.debug(`[FirestoreInstrumentation] CollectionReference already patched, skipping`);\n      return moduleExports;\n    }\n\n    const CollectionReference = moduleExports.CollectionReference;\n    if (!CollectionReference || !CollectionReference.prototype) {\n      logger.warn(`[FirestoreInstrumentation] CollectionReference.prototype not found`);\n      return moduleExports;\n    }\n\n    // Save original doc function before patching (needed for replay handlers)\n    this.originalCollectionDocFn = CollectionReference.prototype.doc;\n\n    // Patch CollectionReference methods\n    this._wrap(CollectionReference.prototype, \"add\", this._getCollectionAddPatchFn());\n    this._wrap(CollectionReference.prototype, \"doc\", this._getCollectionDocPatchFn());\n\n    this.markModuleAsPatched(moduleExports);\n    logger.debug(`[FirestoreInstrumentation] CollectionReference patching complete`);\n\n    return moduleExports;\n  }\n\n  private _patchQuery(moduleExports: any): any {\n    logger.debug(`[FirestoreInstrumentation] Patching Query in ${this.mode} mode`);\n\n    if (this.isModulePatched(moduleExports)) {\n      logger.debug(`[FirestoreInstrumentation] Query already patched, skipping`);\n      return moduleExports;\n    }\n\n    const Query = moduleExports.Query;\n    if (!Query || !Query.prototype) {\n      logger.warn(`[FirestoreInstrumentation] Query.prototype not found`);\n      return moduleExports;\n    }\n\n    // Patch Query methods\n    this._wrap(Query.prototype, \"get\", this._getQueryGetPatchFn());\n\n    this.markModuleAsPatched(moduleExports);\n    logger.debug(`[FirestoreInstrumentation] Query patching complete`);\n\n    return moduleExports;\n  }\n\n  private _getDocumentGetPatchFn() {\n    const self = this;\n\n    return (originalGet: Function) => {\n      return function (this: any) {\n        const documentPath = this.path;\n\n        const inputValue: FirestoreInputValue = {\n          operation: \"document.get\",\n          path: documentPath,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const emptyDocumentResult: FirestoreDocumentResult = {\n                exists: false,\n                id: \"\",\n                path: \"\",\n              };\n              return new TdFirestoreDocumentMock(emptyDocumentResult);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalGet.call(this),\n                {\n                  name: \"firestore.document.get\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleReplayDocumentGet(spanInfo, inputValue);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalGet.call(this),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalGet.call(this),\n                {\n                  name: \"firestore.document.get\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleRecordDocumentGet(spanInfo, originalGet, this);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalGet.call(this);\n        }\n      };\n    };\n  }\n\n  private async _handleRecordDocumentGet(\n    spanInfo: SpanInfo,\n    originalGet: Function,\n    context: any,\n  ): Promise<any> {\n    const snapshot = await originalGet.call(context);\n\n    // Capture document data\n    const documentResult: FirestoreDocumentResult = {\n      id: snapshot.id,\n      path: snapshot.ref.path,\n      exists: snapshot.exists,\n      data: snapshot.exists ? snapshot.data() : undefined,\n      createTime: snapshot.createTime\n        ? { seconds: snapshot.createTime.seconds, nanoseconds: snapshot.createTime.nanoseconds }\n        : undefined,\n      updateTime: snapshot.updateTime\n        ? { seconds: snapshot.updateTime.seconds, nanoseconds: snapshot.updateTime.nanoseconds }\n        : undefined,\n      readTime: snapshot.readTime\n        ? { seconds: snapshot.readTime.seconds, nanoseconds: snapshot.readTime.nanoseconds }\n        : undefined,\n    };\n\n    try {\n      SpanUtils.addSpanAttributes(spanInfo.span, {\n        outputValue: documentResult,\n      });\n      SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n    } catch {\n      logger.error(`[FirestoreInstrumentation] Error updating span attributes for document.get`);\n    }\n\n    return snapshot;\n  }\n\n  private async _handleReplayDocumentGet(\n    spanInfo: SpanInfo,\n    inputValue: FirestoreInputValue,\n  ): Promise<any> {\n    logger.debug(`[FirestoreInstrumentation] Replaying document.get`);\n\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: \"firestore.document.get\",\n        inputValue: createMockInputValue(inputValue),\n        packageName: PACKAGE_NAME,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"document\",\n        kind: SpanKind.CLIENT,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      logger.warn(\n        `[FirestoreInstrumentation] No mock data found for document.get: ${inputValue.path}`,\n      );\n      throw new Error(`[FirestoreInstrumentation] No matching mock found for document.get`);\n    }\n\n    const documentResult = mockData.result as FirestoreDocumentResult;\n    return new TdFirestoreDocumentMock(documentResult);\n  }\n\n  private _getDocumentCreatePatchFn() {\n    const self = this;\n\n    return (originalCreate: Function) => {\n      return function (this: any, data: any) {\n        const documentPath = this.path;\n\n        const inputValue: FirestoreInputValue = {\n          operation: \"document.create\",\n          path: documentPath,\n          data: data,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const now = Date.now();\n              const emptyWriteResult: FirestoreWriteResult = {\n                writeTime: {\n                  seconds: Math.floor(now / 1000),\n                  nanoseconds: (now % 1000) * 1000000,\n                },\n              };\n              return new TdFirestoreWriteResultMock(emptyWriteResult);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalCreate.call(this, data),\n                {\n                  name: \"firestore.document.create\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleReplayDocumentWrite(spanInfo, inputValue);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalCreate.call(this, data),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalCreate.call(this, data),\n                {\n                  name: \"firestore.document.create\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleRecordDocumentWrite(spanInfo, originalCreate, this, data);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalCreate.call(this, data);\n        }\n      };\n    };\n  }\n\n  private _getDocumentSetPatchFn() {\n    const self = this;\n\n    return (originalSet: Function) => {\n      return function (this: any, data: any, options?: any) {\n        const documentPath = this.path;\n\n        const inputValue: FirestoreInputValue = {\n          operation: \"document.set\",\n          path: documentPath,\n          data: data,\n          options: options,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const now = Date.now();\n              const emptyWriteResult: FirestoreWriteResult = {\n                writeTime: {\n                  seconds: Math.floor(now / 1000),\n                  nanoseconds: (now % 1000) * 1000000,\n                },\n              };\n              return new TdFirestoreWriteResultMock(emptyWriteResult);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalSet.call(this, data, options),\n                {\n                  name: \"firestore.document.set\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleReplayDocumentWrite(spanInfo, inputValue);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalSet.call(this, data, options),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalSet.call(this, data, options),\n                {\n                  name: \"firestore.document.set\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleRecordDocumentWrite(\n                    spanInfo,\n                    originalSet,\n                    this,\n                    data,\n                    options,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalSet.call(this, data, options);\n        }\n      };\n    };\n  }\n\n  private _getDocumentUpdatePatchFn() {\n    const self = this;\n\n    return (originalUpdate: Function) => {\n      return function (this: any, ...args: any[]) {\n        const documentPath = this.path;\n\n        // Firestore update() can take either (data) or (field, value, ...moreFieldsAndValues)\n        const inputValue: FirestoreInputValue = {\n          operation: \"document.update\",\n          path: documentPath,\n          data: args.length === 1 ? args[0] : args, // Capture all args\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const now = Date.now();\n              const emptyWriteResult: FirestoreWriteResult = {\n                writeTime: {\n                  seconds: Math.floor(now / 1000),\n                  nanoseconds: (now % 1000) * 1000000,\n                },\n              };\n              return new TdFirestoreWriteResultMock(emptyWriteResult);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalUpdate.apply(this, args),\n                {\n                  name: \"firestore.document.update\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleReplayDocumentWrite(spanInfo, inputValue);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalUpdate.apply(this, args),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalUpdate.apply(this, args),\n                {\n                  name: \"firestore.document.update\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleRecordDocumentWrite(spanInfo, originalUpdate, this, ...args);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalUpdate.apply(this, args);\n        }\n      };\n    };\n  }\n\n  private _getDocumentDeletePatchFn() {\n    const self = this;\n\n    return (originalDelete: Function) => {\n      return function (this: any, precondition?: any) {\n        const documentPath = this.path;\n\n        const inputValue: FirestoreInputValue = {\n          operation: \"document.delete\",\n          path: documentPath,\n          options: precondition,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const now = Date.now();\n              const emptyWriteResult: FirestoreWriteResult = {\n                writeTime: {\n                  seconds: Math.floor(now / 1000),\n                  nanoseconds: (now % 1000) * 1000000,\n                },\n              };\n              return new TdFirestoreWriteResultMock(emptyWriteResult);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalDelete.call(this, precondition),\n                {\n                  name: \"firestore.document.delete\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleReplayDocumentWrite(spanInfo, inputValue);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalDelete.call(this, precondition),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalDelete.call(this, precondition),\n                {\n                  name: \"firestore.document.delete\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"document\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleRecordDocumentWrite(\n                    spanInfo,\n                    originalDelete,\n                    this,\n                    precondition,\n                  );\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalDelete.call(this, precondition);\n        }\n      };\n    };\n  }\n\n  private async _handleRecordDocumentWrite(\n    spanInfo: SpanInfo,\n    originalWrite: Function,\n    context: any,\n    ...args: any[]\n  ): Promise<any> {\n    const writeResult = await originalWrite.apply(context, args);\n\n    // Capture write result\n    const result: FirestoreWriteResult = {\n      writeTime: writeResult.writeTime\n        ? {\n            seconds: writeResult.writeTime.seconds,\n            nanoseconds: writeResult.writeTime.nanoseconds,\n          }\n        : undefined,\n    };\n\n    try {\n      SpanUtils.addSpanAttributes(spanInfo.span, {\n        outputValue: result,\n      });\n      SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n    } catch {\n      logger.error(`[FirestoreInstrumentation] Error updating span attributes for document.write`);\n    }\n\n    return writeResult;\n  }\n\n  private async _handleReplayDocumentWrite(\n    spanInfo: SpanInfo,\n    inputValue: FirestoreInputValue,\n  ): Promise<any> {\n    logger.debug(`[FirestoreInstrumentation] Replaying document write: ${inputValue.operation}`);\n\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: `firestore.${inputValue.operation}`,\n        inputValue: createMockInputValue(inputValue),\n        packageName: PACKAGE_NAME,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"document\",\n        kind: SpanKind.CLIENT,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      logger.warn(\n        `[FirestoreInstrumentation] No mock data found for ${inputValue.operation}: ${inputValue.path}`,\n      );\n      throw new Error(\n        `[FirestoreInstrumentation] No matching mock found for ${inputValue.operation}`,\n      );\n    }\n\n    // Return mock write result with proper API\n    const writeResult = mockData.result as FirestoreWriteResult;\n    return new TdFirestoreWriteResultMock(writeResult);\n  }\n\n  private _getCollectionAddPatchFn() {\n    const self = this;\n\n    return (originalAdd: Function) => {\n      return function (this: any, data: any) {\n        const collectionPath = this.path;\n\n        const inputValue: FirestoreInputValue = {\n          operation: \"collection.add\",\n          path: collectionPath,\n          data: data,\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              if (!this.originalCollectionDocFn) {\n                logger.error(`[FirestoreInstrumentation] Original doc function not available`);\n                return Promise.reject(new Error(\"Original doc function not available\"));\n              }\n              return this.originalCollectionDocFn.call(this, \"\");\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalAdd.call(this, data),\n                {\n                  name: \"firestore.collection.add\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"collection\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleReplayCollectionAdd(spanInfo, inputValue, this);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalAdd.call(this, data),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalAdd.call(this, data),\n                {\n                  name: \"firestore.collection.add\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"collection\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleRecordCollectionAdd(spanInfo, originalAdd, this, data);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalAdd.call(this, data);\n        }\n      };\n    };\n  }\n\n  private async _handleRecordCollectionAdd(\n    spanInfo: SpanInfo,\n    originalAdd: Function,\n    context: any,\n    data: any,\n  ): Promise<any> {\n    const docRef = await originalAdd.call(context, data);\n\n    // Capture the auto-generated document ID\n    const result = {\n      id: docRef.id,\n      path: docRef.path,\n    };\n\n    try {\n      SpanUtils.addSpanAttributes(spanInfo.span, {\n        outputValue: result,\n      });\n      SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n    } catch {\n      logger.error(`[FirestoreInstrumentation] Error updating span attributes for collection.add`);\n    }\n\n    return docRef;\n  }\n  private async _handleReplayCollectionAdd(\n    spanInfo: SpanInfo,\n    inputValue: FirestoreInputValue,\n    collectionRef: any,\n  ): Promise<any> {\n    logger.debug(`[FirestoreInstrumentation] Replaying collection.add`);\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: \"firestore.collection.add\",\n        inputValue: createMockInputValue(inputValue),\n        packageName: PACKAGE_NAME,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"collection\",\n        kind: SpanKind.CLIENT,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      logger.warn(\n        `[FirestoreInstrumentation] No mock data found for collection.add: ${inputValue.path}`,\n      );\n\n      throw new Error(`[FirestoreInstrumentation] No matching mock found for collection.add`);\n    }\n\n    // Return a DocumentReference with the recorded ID\n    // Use original doc function to avoid nested instrumentation\n    const recordedId = mockData.result.id;\n    if (!this.originalCollectionDocFn) {\n      logger.error(`[FirestoreInstrumentation] Original doc function not available`);\n      return Promise.reject(new Error(\"Original doc function not available\"));\n    }\n    return this.originalCollectionDocFn.call(collectionRef, recordedId);\n  }\n\n  private _getCollectionDocPatchFn() {\n    const self = this;\n\n    return (originalDoc: Function) => {\n      return function (this: any, documentPath?: string) {\n        const collectionPath = this.path;\n\n        const inputValue: FirestoreInputValue = {\n          operation: \"collection.doc\",\n          path: collectionPath,\n          documentId: documentPath,\n        };\n\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              return originalDoc.call(this, \"\");\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () =>\n                  documentPath ? originalDoc.call(this, documentPath) : originalDoc.call(this),\n                {\n                  name: \"firestore.collection.doc\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"collection\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  // doc is a sync function so we need to fetch the mock syncronously\n                  // This function might throw an error if this is the frist mock requested in replay mode\n                  // and the CLI/SDK connection couldn't be awaited\n                  // This is a known limitation that is only relevant in replay mode so not the biggest deal\n                  const mockData = findMockResponseSync({\n                    mockRequestData: {\n                      traceId: spanInfo.traceId,\n                      spanId: spanInfo.spanId,\n                      name: \"firestore.collection.doc\",\n                      inputValue: createMockInputValue(inputValue),\n                      packageName: PACKAGE_NAME,\n                      instrumentationName: self.INSTRUMENTATION_NAME,\n                      submoduleName: \"collection\",\n                      kind: SpanKind.CLIENT,\n                    },\n                    tuskDrift: self.tuskDrift,\n                  });\n\n                  if (!mockData) {\n                    logger.warn(\n                      `[FirestoreInstrumentation] No mock data found for collection.doc: ${collectionPath}`,\n                    );\n                    throw new Error(\n                      `[FirestoreInstrumentation] No matching mock found for collection.doc`,\n                    );\n                  }\n\n                  // Use the recorded ID (this ensures deterministic replay)\n                  const recordedId = mockData.result.id;\n\n                  logger.debug(\n                    `[FirestoreInstrumentation] replaying doc call with recorded id: ${recordedId}`,\n                  );\n                  const docRef = originalDoc.call(this, recordedId);\n                  logger.debug(`[FirestoreInstrumentation] doc ref, id`, docRef, recordedId);\n                  return docRef;\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () =>\n              documentPath ? originalDoc.call(this, documentPath) : originalDoc.call(this),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () =>\n                  documentPath ? originalDoc.call(this, documentPath) : originalDoc.call(this),\n                {\n                  name: \"firestore.collection.doc\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"collection\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  // Record the ID (whether auto-generated or provided)\n                  const docRef = documentPath\n                    ? originalDoc.call(this, documentPath)\n                    : originalDoc.call(this);\n                  const result = {\n                    id: docRef.id,\n                    path: docRef.path,\n                  };\n                  try {\n                    SpanUtils.addSpanAttributes(spanInfo.span, {\n                      outputValue: result,\n                    });\n                    SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n                  } catch {\n                    logger.error(\n                      `[FirestoreInstrumentation] Error updating span attributes for collection.doc`,\n                    );\n                  }\n                  return docRef;\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return documentPath ? originalDoc.call(this, documentPath) : originalDoc.call(this);\n        }\n      };\n    };\n  }\n\n  private _getQueryGetPatchFn() {\n    const self = this;\n\n    return (originalGet: Function) => {\n      return function (this: any) {\n        // Try to extract query path - queries have a _queryOptions property\n        const queryPath = this._queryOptions?.parentPath?.formattedName || \"unknown\";\n\n        const inputValue: FirestoreInputValue = {\n          operation: \"query.get\",\n          path: queryPath,\n          // Could capture query constraints here if needed\n        };\n\n        // Handle replay mode\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              const emptyQueryResult: FirestoreQueryResult = {\n                size: 0,\n                empty: true,\n                docs: [],\n              };\n              return new TdFirestoreQueryMock(emptyQueryResult);\n            },\n            isServerRequest: false,\n            replayModeHandler: () => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalGet.call(this),\n                {\n                  name: \"firestore.query.get\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"query\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart: false,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleReplayQueryGet(spanInfo, inputValue);\n                },\n              );\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          return handleRecordMode({\n            originalFunctionCall: () => originalGet.call(this),\n            recordModeHandler: ({ isPreAppStart }) => {\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalGet.call(this),\n                {\n                  name: \"firestore.query.get\",\n                  kind: SpanKind.CLIENT,\n                  submodule: \"query\",\n                  packageType: PackageType.FIRESTORE,\n                  packageName: PACKAGE_NAME,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue: inputValue,\n                  isPreAppStart,\n                  stopRecordingChildSpans: true,\n                },\n                (spanInfo) => {\n                  return self._handleRecordQueryGet(spanInfo, originalGet, this);\n                },\n              );\n            },\n            spanKind: SpanKind.CLIENT,\n          });\n        } else {\n          return originalGet.call(this);\n        }\n      };\n    };\n  }\n\n  private async _handleRecordQueryGet(\n    spanInfo: SpanInfo,\n    originalGet: Function,\n    context: any,\n  ): Promise<any> {\n    const querySnapshot = await originalGet.call(context);\n\n    // Capture query results\n    const queryResult: FirestoreQueryResult = {\n      docs: querySnapshot.docs.map((doc: any) => ({\n        id: doc.id,\n        path: doc.ref.path,\n        exists: doc.exists,\n        data: doc.exists ? doc.data() : undefined,\n        createTime: doc.createTime\n          ? { seconds: doc.createTime.seconds, nanoseconds: doc.createTime.nanoseconds }\n          : undefined,\n        updateTime: doc.updateTime\n          ? { seconds: doc.updateTime.seconds, nanoseconds: doc.updateTime.nanoseconds }\n          : undefined,\n        readTime: doc.readTime\n          ? { seconds: doc.readTime.seconds, nanoseconds: doc.readTime.nanoseconds }\n          : undefined,\n      })),\n      size: querySnapshot.size,\n      empty: querySnapshot.empty,\n      readTime: querySnapshot.readTime\n        ? {\n            seconds: querySnapshot.readTime.seconds,\n            nanoseconds: querySnapshot.readTime.nanoseconds,\n          }\n        : undefined,\n    };\n\n    try {\n      SpanUtils.addSpanAttributes(spanInfo.span, {\n        outputValue: queryResult,\n      });\n      SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n    } catch {\n      logger.error(`[FirestoreInstrumentation] Error updating span attributes for query.get`);\n    }\n\n    return querySnapshot;\n  }\n\n  private async _handleReplayQueryGet(\n    spanInfo: SpanInfo,\n    inputValue: FirestoreInputValue,\n  ): Promise<any> {\n    logger.debug(`[FirestoreInstrumentation] Replaying query.get`);\n\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: \"firestore.query.get\",\n        inputValue: createMockInputValue(inputValue),\n        packageName: PACKAGE_NAME,\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: \"query\",\n        kind: SpanKind.CLIENT,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      logger.warn(\n        `[FirestoreInstrumentation] No mock data found for query.get: ${inputValue.path}`,\n      );\n      throw new Error(`[FirestoreInstrumentation] No matching mock found for query.get`);\n    }\n\n    const queryResult = mockData.result as FirestoreQueryResult;\n    return new TdFirestoreQueryMock(queryResult);\n  }\n\n  protected _wrap<T extends (...args: any[]) => any>(\n    target: any,\n    propertyName: string,\n    wrapper: (original: T) => T,\n  ): void {\n    if (!target || typeof target[propertyName] !== \"function\") {\n      logger.warn(\n        `[FirestoreInstrumentation] Cannot wrap ${propertyName}: not a function or target is undefined`,\n      );\n      return;\n    }\n\n    const original = target[propertyName];\n    const wrapped = wrapper(original);\n    target[propertyName] = wrapped;\n  }\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode, context } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { HttpReplayHooks } from \"../http/HttpReplayHooks\";\nimport { DecodedType } from \"@use-tusk/drift-schemas/core/json_schema\";\nimport {\n  NextjsInstrumentationConfig,\n  NextjsServerInputValue,\n  NextjsServerOutputValue,\n  NextjsBaseServerModule,\n} from \"./types\";\nimport { wrap, handleRecordMode, handleReplayMode } from \"../../core/utils\";\nimport { shouldSample, OriginalGlobalUtils, logger } from \"../../../core/utils\";\nimport { PackageType, StatusCode } from \"@use-tusk/drift-schemas/core/span\";\nimport { EncodingType, JsonSchemaHelper } from \"../../../core/tracing/JsonSchemaHelper\";\nimport { EnvVarTracker } from \"../../core/trackers\";\nimport {\n  combineChunks,\n  httpBodyEncoder,\n  getDecodedType,\n  ACCEPTABLE_CONTENT_TYPES,\n} from \"../http/utils\";\nimport { TraceBlockingManager } from \"../../../core/tracing/TraceBlockingManager\";\nimport { IncomingMessage, ServerResponse } from \"http\";\n\nexport class NextjsInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"NextjsInstrumentation\";\n  private mode: TuskDriftMode;\n  private replayHooks: HttpReplayHooks;\n  private tuskDrift: TuskDriftCore;\n\n  constructor(config: NextjsInstrumentationConfig = {}) {\n    super(\"nextjs\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.replayHooks = new HttpReplayHooks();\n    this.tuskDrift = TuskDriftCore.getInstance();\n    logger.debug(`[NextjsInstrumentation] Constructor called with mode: ${this.mode}`);\n\n    // Almost always, Next.js instrumentation hook runs after Next.js server has loaded,\n    // so we need to patch existing modules in require.cache\n    this._patchLoadedModules();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    logger.debug(`[NextjsInstrumentation] Initializing in ${this.mode} mode`);\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"next/dist/server/base-server\",\n        supportedVersions: [\"*\"],\n        patch: (moduleExports) => {\n          return this._patchBaseServer(moduleExports);\n        },\n      }),\n    ];\n  }\n\n  private _patchLoadedModules(): void {\n    logger.debug(`[NextjsInstrumentation] Checking for already-loaded Next.js modules`);\n\n    // Search require.cache directly for Next.js server modules\n    const pattern = \"/next/dist/server/base-server.js\";\n\n    let patchedCount = 0;\n    for (const [modulePath, cached] of Object.entries(require.cache)) {\n      if (modulePath.includes(pattern) && cached && cached.exports) {\n        logger.debug(`[NextjsInstrumentation] Found ${pattern} at ${modulePath}, patching now`);\n        this._patchBaseServer(cached.exports);\n        patchedCount++;\n        break; // Only patch each module once\n      }\n    }\n\n    if (patchedCount === 0) {\n      logger.debug(`[NextjsInstrumentation] No Next.js server modules found in require.cache yet`);\n      logger.debug(\n        `[NextjsInstrumentation] Will wait for require-in-the-middle hooks to catch them`,\n      );\n    } else {\n      logger.debug(\n        `[NextjsInstrumentation] Patched ${patchedCount} already-loaded Next.js modules`,\n      );\n    }\n  }\n\n  private _patchBaseServer(baseServerModule: NextjsBaseServerModule): NextjsBaseServerModule {\n    logger.debug(`[NextjsInstrumentation] Patching Next.js BaseServer in ${this.mode} mode`);\n\n    // Get the BaseServer class (could be default export or named export)\n    const BaseServer = baseServerModule.default || baseServerModule.BaseServer || baseServerModule;\n\n    // Check if this specific BaseServer.prototype is already patched\n    // This prevents duplicate patching when multiple Next.js modules export the same BaseServer\n    if (BaseServer && BaseServer.prototype) {\n      if (this.isModulePatched(BaseServer.prototype)) {\n        logger.debug(`[NextjsInstrumentation] BaseServer.prototype already patched, skipping`);\n        return baseServerModule;\n      }\n\n      if (BaseServer.prototype.handleRequest) {\n        this._wrap(BaseServer.prototype, \"handleRequest\", this._getHandleRequestPatchFn());\n        logger.debug(`[NextjsInstrumentation] Wrapped BaseServer.prototype.handleRequest`);\n        this.markModuleAsPatched(BaseServer.prototype);\n      } else {\n        logger.warn(`[NextjsInstrumentation] Could not find BaseServer.prototype.handleRequest`);\n      }\n    } else {\n      logger.warn(`[NextjsInstrumentation] Could not find BaseServer class`);\n    }\n\n    logger.debug(`[NextjsInstrumentation] Next.js BaseServer patching complete`);\n    return baseServerModule;\n  }\n\n  private _getHandleRequestPatchFn() {\n    const self = this;\n\n    return (originalHandleRequest: Function) => {\n      return async function (\n        this: any,\n        req: IncomingMessage,\n        res: ServerResponse,\n        parsedUrl?: any,\n      ) {\n        // Sample as soon as we can to avoid additional overhead if this request is not sampled\n        if (self.mode === TuskDriftMode.RECORD) {\n          if (\n            !shouldSample({\n              samplingRate: self.tuskDrift.getSamplingRate(),\n              isAppReady: self.tuskDrift.isAppReady(),\n            })\n          ) {\n            return originalHandleRequest.call(this, req, res, parsedUrl);\n          }\n        }\n\n        const method = req.method || \"GET\";\n        const url = req.url || \"/\";\n\n        logger.debug(`[NextjsInstrumentation] Intercepted Next.js request: ${method} ${url}`);\n\n        // Handle replay mode using replay hooks (pass through pattern)\n        if (self.mode === TuskDriftMode.REPLAY) {\n          return handleReplayMode({\n            noOpRequestHandler: () => {\n              throw new Error(\n                `[NextjsInstrumentation] Should never call noOpRequestHandler for server requests ${method} ${url}`,\n              );\n            },\n            isServerRequest: true,\n            replayModeHandler: () => {\n              // Build input value object for server request in replay mode\n              const inputValue: NextjsServerInputValue = {\n                method,\n                url,\n                target: url,\n                headers: self._normalizeHeaders(req.headers || {}),\n              };\n\n              // Set replay trace context\n              const replayTraceId = self.replayHooks.extractTraceIdFromHeaders(req);\n              if (!replayTraceId) {\n                // No trace context; proceed without span\n                logger.debug(`[NextjsInstrumentation] No trace ID found, calling original handler`);\n                return originalHandleRequest.call(this, req, res, parsedUrl);\n              }\n\n              logger.debug(`[NextjsInstrumentation] Setting replay trace id`, replayTraceId);\n\n              // Fetch env vars from CLI if requested\n              const shouldFetch = self.replayHooks.extractShouldFetchEnvVars(req);\n              if (shouldFetch) {\n                try {\n                  const envVars = self.tuskDrift.requestEnvVarsSync(replayTraceId);\n                  EnvVarTracker.setEnvVars(replayTraceId, envVars);\n                  logger.debug(\n                    `[NextjsInstrumentation] Fetched env vars from CLI for trace ${replayTraceId}`,\n                  );\n                } catch (error) {\n                  logger.error(`[NextjsInstrumentation] Failed to fetch env vars from CLI:`, error);\n                }\n              }\n\n              const ctxWithReplayTraceId = SpanUtils.setCurrentReplayTraceId(replayTraceId);\n\n              if (!ctxWithReplayTraceId) {\n                throw new Error(\"Error setting current replay trace id\");\n              }\n\n              return context.with(ctxWithReplayTraceId, () => {\n                return SpanUtils.createAndExecuteSpan(\n                  self.mode,\n                  () => originalHandleRequest.call(this, req, res, parsedUrl),\n                  {\n                    name: url,\n                    kind: SpanKind.SERVER,\n                    packageName: \"nextjs\",\n                    submodule: method,\n                    packageType: PackageType.HTTP,\n                    instrumentationName: self.INSTRUMENTATION_NAME,\n                    inputValue,\n                    inputSchemaMerges: {\n                      headers: {\n                        matchImportance: 0,\n                      },\n                    },\n                    isPreAppStart: false,\n                  },\n                  (spanInfo) => {\n                    // Pass through to Next.js handler and capture response\n                    return self._handleNextjsRequestInSpan({\n                      req,\n                      res,\n                      parsedUrl,\n                      originalHandleRequest,\n                      spanInfo,\n                      inputValue,\n                      thisContext: this,\n                    });\n                  },\n                );\n              });\n            },\n          });\n        } else if (self.mode === TuskDriftMode.RECORD) {\n          // Skip CORS preflight in RECORD mode (don't create a span)\n          if (\n            method.toUpperCase() === \"OPTIONS\" ||\n            !!req.headers[\"access-control-request-method\"]\n          ) {\n            return originalHandleRequest.call(this, req, res, parsedUrl);\n          }\n\n          logger.debug(`[NextjsInstrumentation] Creating server span for ${method} ${url}`);\n          return handleRecordMode({\n            originalFunctionCall: () => originalHandleRequest.call(this, req, res, parsedUrl),\n            recordModeHandler: ({ isPreAppStart }: { isPreAppStart: boolean }) => {\n              const inputValue: NextjsServerInputValue = {\n                method,\n                url,\n                target: url,\n                headers: self._normalizeHeaders(req.headers || {}),\n              };\n\n              return SpanUtils.createAndExecuteSpan(\n                self.mode,\n                () => originalHandleRequest.call(this, req, res, parsedUrl),\n                {\n                  name: url,\n                  kind: SpanKind.SERVER,\n                  packageName: \"nextjs\",\n                  packageType: PackageType.HTTP,\n                  submodule: method,\n                  instrumentationName: self.INSTRUMENTATION_NAME,\n                  inputValue,\n                  inputSchemaMerges: {\n                    headers: {\n                      matchImportance: 0,\n                    },\n                  },\n                  isPreAppStart,\n                },\n                (spanInfo) => {\n                  return self._handleNextjsRequestInSpan({\n                    req,\n                    res,\n                    parsedUrl,\n                    originalHandleRequest,\n                    spanInfo,\n                    inputValue,\n                    thisContext: this,\n                  });\n                },\n              );\n            },\n            spanKind: SpanKind.SERVER,\n          });\n        } else {\n          // Should never happen since we're only patching record and replay modes\n          return originalHandleRequest.call(this, req, res, parsedUrl);\n        }\n      };\n    };\n  }\n\n  private async _handleNextjsRequestInSpan({\n    req,\n    res,\n    parsedUrl,\n    originalHandleRequest,\n    spanInfo,\n    inputValue,\n    thisContext,\n  }: {\n    req: IncomingMessage;\n    res: ServerResponse;\n    parsedUrl: any;\n    originalHandleRequest: Function;\n    spanInfo: SpanInfo;\n    inputValue: NextjsServerInputValue;\n    thisContext: any;\n  }) {\n    const self = this;\n\n    // Bind context to request/response objects\n    context.bind(spanInfo.context, req);\n    context.bind(spanInfo.context, res);\n\n    // Track the complete input value (will be updated when body is captured)\n    let completeInputValue: NextjsServerInputValue = inputValue;\n\n    // Capture request body if it exists\n    this._captureRequestBody(req, spanInfo, inputValue, (updatedInputValue) => {\n      completeInputValue = updatedInputValue;\n    });\n\n    // Store original statusCode\n    let capturedStatusCode: number | undefined;\n    let capturedStatusMessage: string | undefined;\n    let capturedHeaders: Record<string, string> = {};\n    const responseChunks: (string | Buffer)[] = [];\n\n    // Next.js wraps the response object, so we need to access the underlying Node.js response\n    const actualRes = (res as any).originalResponse || res;\n\n    // Patch res.writeHead to capture status and headers\n    const originalWriteHead = actualRes.writeHead?.bind(actualRes);\n    if (originalWriteHead) {\n      actualRes.writeHead = function (statusCode: number, statusMessage?: any, headers?: any) {\n        capturedStatusCode = statusCode;\n\n        // Handle both signatures: writeHead(status, headers) and writeHead(status, message, headers)\n        if (typeof statusMessage === \"object\") {\n          capturedHeaders = self._normalizeHeaders(statusMessage);\n        } else {\n          capturedStatusMessage = statusMessage;\n          if (headers) {\n            capturedHeaders = self._normalizeHeaders(headers);\n          }\n        }\n\n        return originalWriteHead.call(this, statusCode, statusMessage, headers);\n      };\n    }\n\n    // Patch res.setHeader to capture headers\n    const originalSetHeader = actualRes.setHeader?.bind(actualRes);\n    if (originalSetHeader) {\n      actualRes.setHeader = function (name: string, value: string | string[]) {\n        capturedHeaders[name.toLowerCase()] = Array.isArray(value) ? value.join(\", \") : value;\n        return originalSetHeader.call(this, name, value);\n      };\n    }\n\n    // Patch res.write to capture body chunks\n    const originalWrite = actualRes.write?.bind(actualRes);\n    if (originalWrite) {\n      actualRes.write = function (chunk: string | Buffer, encoding?: any, callback?: any) {\n        if (chunk) {\n          responseChunks.push(chunk);\n        }\n        return originalWrite.call(this, chunk, encoding, callback);\n      };\n    }\n\n    // Patch res.end to capture final body chunk\n    const originalEnd = actualRes.end?.bind(actualRes);\n    if (originalEnd) {\n      actualRes.end = function (chunk?: any, encoding?: any, callback?: any) {\n        if (chunk) {\n          responseChunks.push(chunk);\n        }\n        return originalEnd.call(this, chunk, encoding, callback);\n      };\n    }\n\n    try {\n      // Call original Next.js handler (pass through)\n      await originalHandleRequest.call(thisContext, req, res, parsedUrl);\n    } catch (error) {\n      logger.error(\n        `[NextjsInstrumentation] Error in Next.js request: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n      try {\n        SpanUtils.endSpan(spanInfo.span, {\n          code: SpanStatusCode.ERROR,\n          message: error instanceof Error ? error.message : \"Unknown error\",\n        });\n      } catch (e) {\n        logger.error(`[NextjsInstrumentation] Error ending span:`, e);\n      }\n      throw error;\n    }\n\n    try {\n      // Capture final status code if not already captured\n      if (!capturedStatusCode) {\n        capturedStatusCode = res.statusCode;\n        capturedStatusMessage = res.statusMessage;\n      }\n\n      // Get final headers if not already captured\n      if (Object.keys(capturedHeaders).length === 0 && res.getHeaders) {\n        const rawHeaders = res.getHeaders() as Record<string, string | string[]>;\n        capturedHeaders = self._normalizeHeaders(rawHeaders);\n      }\n\n      logger.debug(\n        `[NextjsInstrumentation] Next.js request completed: ${capturedStatusCode} (${SpanUtils.getTraceInfo()})`,\n      );\n\n      // Build output value\n      const outputValue: NextjsServerOutputValue = {\n        statusCode: capturedStatusCode,\n        statusMessage: capturedStatusMessage,\n        headers: capturedHeaders,\n      };\n\n      // Process response body if we have chunks\n      if (responseChunks.length > 0) {\n        try {\n          const responseBuffer = combineChunks(responseChunks);\n          const contentEncoding = outputValue.headers?.[\"content-encoding\"];\n\n          const encodedBody = await httpBodyEncoder({\n            bodyBuffer: responseBuffer,\n            contentEncoding,\n          });\n\n          // Store parsed body data\n          outputValue.body = encodedBody;\n          outputValue.bodySize = responseBuffer.length;\n        } catch (error) {\n          logger.error(`[NextjsInstrumentation] Error processing response body:`, error);\n        }\n      }\n\n      // Add span attributes (use completeInputValue which includes request body)\n      SpanUtils.addSpanAttributes(spanInfo.span, {\n        inputValue: completeInputValue,\n        outputValue,\n        outputSchemaMerges: {\n          body: {\n            encoding: EncodingType.BASE64,\n            decodedType: getDecodedType(outputValue.headers?.[\"content-type\"] || \"\"),\n          },\n          headers: {\n            matchImportance: 0,\n          },\n        },\n        metadata: {\n          ENV_VARS: EnvVarTracker.getEnvVars(spanInfo.traceId),\n        },\n      });\n\n      // Clear env vars\n      EnvVarTracker.clearEnvVars(spanInfo.traceId);\n\n      const status =\n        (capturedStatusCode || 200) >= 400\n          ? { code: SpanStatusCode.ERROR, message: `HTTP ${capturedStatusCode}` }\n          : { code: SpanStatusCode.OK };\n\n      SpanUtils.setStatus(spanInfo.span, status);\n\n      // Ignore static asset responses\n      // Must check this before ending the span\n      const decodedType = getDecodedType(outputValue.headers?.[\"content-type\"] || \"\");\n      if (decodedType && !ACCEPTABLE_CONTENT_TYPES.has(decodedType)) {\n        const traceBlockingManager = TraceBlockingManager.getInstance();\n        traceBlockingManager.blockTrace(spanInfo.traceId);\n        logger.debug(\n          `[NextjsInstrumentation] Blocking trace ${spanInfo.traceId} because it is not an acceptable decoded type: ${decodedType}`,\n          { acceptableContentTypes: Array.from(ACCEPTABLE_CONTENT_TYPES) },\n        );\n      }\n\n      SpanUtils.endSpan(spanInfo.span);\n\n      // In REPLAY mode, send inbound span to CLI\n      if (self.mode === TuskDriftMode.REPLAY) {\n        try {\n          const now = OriginalGlobalUtils.getOriginalDate();\n          const replayTraceId = SpanUtils.getCurrentReplayTraceId() || spanInfo.traceId;\n\n          // Compute schemas and hashes (use completeInputValue which includes request body)\n          const { schema: inputSchema, decodedValueHash: inputValueHash } =\n            JsonSchemaHelper.generateSchemaAndHash(completeInputValue, {\n              body: {\n                encoding: EncodingType.BASE64,\n                decodedType: getDecodedType(\n                  (completeInputValue.headers && completeInputValue.headers[\"content-type\"]) || \"\",\n                ),\n              },\n              headers: {\n                matchImportance: 0,\n              },\n            });\n\n          const { schema: outputSchema, decodedValueHash: outputValueHash } =\n            JsonSchemaHelper.generateSchemaAndHash(outputValue, {\n              body: {\n                encoding: EncodingType.BASE64,\n                decodedType: getDecodedType(outputValue.headers[\"content-type\"] || \"\"),\n              },\n              headers: {\n                matchImportance: 0,\n              },\n            });\n\n          const cleanSpan = {\n            traceId: replayTraceId,\n            spanId: spanInfo.spanId,\n            parentSpanId: \"\",\n            name: completeInputValue.url,\n            packageName: \"nextjs\",\n            instrumentationName: self.INSTRUMENTATION_NAME,\n            submoduleName: completeInputValue.method,\n            inputValue: completeInputValue,\n            outputValue,\n            inputSchema,\n            outputSchema,\n            inputSchemaHash: JsonSchemaHelper.generateDeterministicHash(inputSchema),\n            outputSchemaHash: JsonSchemaHelper.generateDeterministicHash(outputSchema),\n            inputValueHash,\n            outputValueHash,\n            kind: SpanKind.SERVER,\n            packageType: PackageType.HTTP,\n            status: {\n              code: (capturedStatusCode || 200) >= 400 ? StatusCode.ERROR : StatusCode.OK,\n              message: (capturedStatusCode || 200) >= 400 ? `HTTP ${capturedStatusCode}` : \"\",\n            },\n            timestamp: {\n              seconds: Math.floor(now.getTime() / 1000),\n              nanos: (now.getTime() % 1000) * 1_000_000,\n            },\n            duration: { seconds: 0, nanos: 0 },\n            isRootSpan: true,\n            isPreAppStart: false,\n            metadata: undefined,\n          };\n\n          await self.tuskDrift.sendInboundSpanForReplay(cleanSpan);\n        } catch (e) {\n          logger.error(\"[NextjsInstrumentation] Failed to build/send inbound replay span:\", e);\n        }\n      }\n    } catch (error) {\n      logger.error(\n        `[NextjsInstrumentation] Error in Next.js request: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n      try {\n        SpanUtils.endSpan(spanInfo.span, {\n          code: SpanStatusCode.ERROR,\n          message: error instanceof Error ? error.message : \"Unknown error\",\n        });\n      } catch (e) {\n        logger.error(`[NextjsInstrumentation] Error ending span:`, e);\n      }\n    }\n  }\n\n  /**\n   * Captures the request body from an IncomingMessage stream by patching req.read() and listening for data events.\n   * Similar to HTTP instrumentation's request body capture, but adapted for Next.js.\n   */\n  private _captureRequestBody(\n    req: any,\n    spanInfo: SpanInfo,\n    inputValue: NextjsServerInputValue,\n    onBodyCaptured?: (updatedInputValue: NextjsServerInputValue) => void,\n  ): void {\n    // Next.js wraps the request object, so we need to access the underlying Node.js request\n    // Try multiple possible locations for the actual IncomingMessage\n    const actualReq = req.originalRequest || req._req || req;\n\n    const requestBodyChunks: Buffer[] = [];\n    let streamConsumptionMode: \"NOT_CONSUMING\" | \"READ\" | \"PIPE\" = \"NOT_CONSUMING\";\n\n    // Patch req.read to capture body chunks when application calls read()\n    const originalRead = actualReq.read?.bind(actualReq);\n    if (originalRead) {\n      actualReq.read = function read(size?: number) {\n        const chunk = originalRead(size);\n        if (\n          chunk &&\n          (streamConsumptionMode === \"READ\" || streamConsumptionMode === \"NOT_CONSUMING\")\n        ) {\n          streamConsumptionMode = \"READ\";\n          requestBodyChunks.push(Buffer.from(chunk));\n        }\n        return chunk;\n      };\n    }\n\n    // Check if actualReq has event emitter methods\n    if (typeof actualReq.once !== \"function\" || typeof actualReq.addListener !== \"function\") {\n      logger.debug(\n        `[NextjsInstrumentation] Request object doesn't have event emitter methods, skipping body capture`,\n      );\n      return;\n    }\n\n    // Listen for 'resume' event to know when streaming starts\n    actualReq.once(\"resume\", () => {\n      actualReq.addListener(\"data\", (chunk: string | Buffer) => {\n        if (\n          chunk &&\n          (streamConsumptionMode === \"PIPE\" || streamConsumptionMode === \"NOT_CONSUMING\")\n        ) {\n          streamConsumptionMode = \"PIPE\";\n          requestBodyChunks.push(Buffer.from(chunk));\n        }\n      });\n    });\n\n    // Process the complete body when the request ends\n    actualReq.addListener(\"end\", async (chunk?: string | Buffer) => {\n      if (chunk) {\n        requestBodyChunks.push(Buffer.from(chunk));\n      }\n\n      if (requestBodyChunks.length > 0) {\n        try {\n          const bodyBuffer = Buffer.concat(requestBodyChunks);\n\n          // Parse the request body using existing body parser\n          const encodedBody = await httpBodyEncoder({\n            bodyBuffer,\n            contentEncoding: actualReq.headers[\"content-encoding\"] as string,\n          });\n\n          // Update input value with parsed body\n          const updatedInputValue: NextjsServerInputValue = {\n            ...inputValue,\n            body: encodedBody,\n            bodySize: bodyBuffer.length,\n          };\n\n          if (onBodyCaptured) {\n            onBodyCaptured(updatedInputValue);\n          }\n\n          // Update the span with the complete request body information\n          SpanUtils.addSpanAttributes(spanInfo.span, {\n            inputValue: updatedInputValue,\n            inputSchemaMerges: {\n              body: {\n                encoding: EncodingType.BASE64,\n                decodedType: getDecodedType(actualReq.headers[\"content-type\"] || \"\"),\n              },\n              headers: {\n                matchImportance: 0,\n              },\n            },\n          });\n\n          logger.debug(\n            `[NextjsInstrumentation] Captured request body for ${actualReq.method} ${actualReq.url}: ${bodyBuffer.length} bytes`,\n          );\n        } catch (error) {\n          logger.error(`[NextjsInstrumentation] Error processing request body:`, error);\n        }\n      }\n    });\n  }\n\n  private _normalizeHeaders(\n    headers: Record<string, string | string[] | undefined>,\n  ): Record<string, string> {\n    const normalized: Record<string, string> = {};\n    for (const [key, value] of Object.entries(headers)) {\n      if (value !== undefined) {\n        normalized[key.toLowerCase()] = Array.isArray(value) ? value.join(\", \") : String(value);\n      }\n    }\n    return normalized;\n  }\n\n  private _wrap(\n    target: any,\n    propertyName: string,\n    wrapper: (original: Function) => Function,\n  ): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","import { TdInstrumentationConfig } from \"../../core/baseClasses/TdInstrumentationAbstract\";\nimport { TuskDriftMode } from \"../../../core/TuskDrift\";\n\nexport interface PrismaInstrumentationConfig extends TdInstrumentationConfig {\n  requestHook?: (operation: any) => void;\n  responseHook?: (result: any) => void;\n  mode?: TuskDriftMode;\n}\n\nexport interface PrismaInputValue {\n  model: string;\n  operation: string;\n  args: any;\n  [key: string]: unknown;\n}\n\nexport interface PrismaOutputValue {\n  prismaResult: any;\n  _tdOriginalFormat?: \"result\" | \"error\";\n  [key: string]: unknown;\n}\n\nexport interface PrismaModuleExports {\n  PrismaClient?: any;\n  default?: any;\n  [key: string]: any;\n}\n\n/**\n * Prisma error class names for proper error handling\n */\nexport enum PrismaErrorClassName {\n  PrismaClientKnownRequestError = \"PrismaClientKnownRequestError\",\n  PrismaClientUnknownRequestError = \"PrismaClientUnknownRequestError\",\n  PrismaClientInitializationError = \"PrismaClientInitializationError\",\n  PrismaClientValidationError = \"PrismaClientValidationError\",\n  PrismaClientRustPanicError = \"PrismaClientRustPanicError\",\n  NotFoundError = \"NotFoundError\",\n}\n\nexport interface PrismaErrorWithClassName extends Error {\n  customTdName?: PrismaErrorClassName;\n  [key: string]: any;\n}\n","import { TdInstrumentationBase } from \"../../core/baseClasses/TdInstrumentationBase\";\nimport { TdInstrumentationNodeModule } from \"../../core/baseClasses/TdInstrumentationNodeModule\";\nimport { SpanUtils, SpanInfo } from \"../../../core/tracing/SpanUtils\";\nimport { SpanKind, SpanStatusCode } from \"@opentelemetry/api\";\nimport { TuskDriftCore, TuskDriftMode } from \"../../../core/TuskDrift\";\nimport { captureStackTrace, wrap } from \"../../core/utils\";\nimport { findMockResponseAsync } from \"../../core/utils/mockResponseUtils\";\nimport { handleRecordMode, handleReplayMode } from \"../../core/utils/modeUtils\";\nimport {\n  PrismaModuleExports,\n  PrismaInputValue,\n  PrismaInstrumentationConfig,\n  PrismaErrorClassName,\n  PrismaErrorWithClassName,\n  PrismaOutputValue,\n} from \"./types\";\nimport { PackageType } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger } from \"../../../core/utils\";\n\ninterface PrismaErrorClassInfo {\n  name: PrismaErrorClassName;\n  errorClass: any;\n}\n\nexport class PrismaInstrumentation extends TdInstrumentationBase {\n  private readonly INSTRUMENTATION_NAME = \"PrismaInstrumentation\";\n  private mode: TuskDriftMode;\n  private tuskDrift: TuskDriftCore;\n  private prismaErrorClasses: PrismaErrorClassInfo[] = [];\n\n  constructor(config: PrismaInstrumentationConfig = {}) {\n    super(\"@prisma/client\", config);\n    this.mode = config.mode || TuskDriftMode.DISABLED;\n    this.tuskDrift = TuskDriftCore.getInstance();\n  }\n\n  init(): TdInstrumentationNodeModule[] {\n    return [\n      new TdInstrumentationNodeModule({\n        name: \"@prisma/client\",\n        supportedVersions: [\"5.*\", \"6.*\"],\n        patch: (moduleExports: PrismaModuleExports) => this._patchPrismaModule(moduleExports),\n      }),\n    ];\n  }\n\n  private _patchPrismaModule(prismaModule: PrismaModuleExports): PrismaModuleExports {\n    if (this.isModulePatched(prismaModule)) {\n      logger.debug(`[PrismaInstrumentation] Prisma module already patched, skipping`);\n      return prismaModule;\n    }\n\n    // Store Prisma error classes for later use\n    this._storePrismaErrorClasses(prismaModule);\n\n    // Wrap the PrismaClient constructor\n    logger.debug(`[PrismaInstrumentation] Wrapping PrismaClient constructor`);\n    this._wrap(prismaModule, \"PrismaClient\", (OriginalPrismaClient: any) => {\n      const self = this;\n      logger.debug(`[PrismaInstrumentation] PrismaClient wrapper called`);\n\n      return class TdPrismaClient {\n        constructor(...args: any[]) {\n          logger.debug(`[PrismaInstrumentation] Creating patched PrismaClient instance`);\n\n          // Create the original Prisma client\n          const prismaClient = new OriginalPrismaClient(...args);\n\n          // Extend the client with our instrumentation\n          const extendedClient = prismaClient.$extends({\n            query: {\n              async $allOperations({ model, operation, args: operationArgs, query }: any) {\n                logger.debug(\n                  `[PrismaInstrumentation] $allOperations intercepted: ${model}.${operation}`,\n                );\n                return self._handlePrismaOperation({\n                  model,\n                  operation,\n                  args: operationArgs,\n                  query,\n                });\n              },\n            },\n          });\n\n          return extendedClient;\n        }\n      };\n    });\n\n    this.markModuleAsPatched(prismaModule);\n    logger.debug(`[PrismaInstrumentation] Prisma module patching complete`);\n\n    return prismaModule;\n  }\n\n  private _storePrismaErrorClasses(moduleExports: PrismaModuleExports): void {\n    // In ESM, error classes are in moduleExports.Prisma.*\n    // In CJS, error classes are directly on moduleExports.*\n    const prismaNamespace = moduleExports.Prisma || {};\n\n    this.prismaErrorClasses = [\n      {\n        name: PrismaErrorClassName.PrismaClientKnownRequestError,\n        errorClass:\n          moduleExports.PrismaClientKnownRequestError ||\n          prismaNamespace.PrismaClientKnownRequestError,\n      },\n      {\n        name: PrismaErrorClassName.PrismaClientUnknownRequestError,\n        errorClass:\n          moduleExports.PrismaClientUnknownRequestError ||\n          prismaNamespace.PrismaClientUnknownRequestError,\n      },\n      {\n        name: PrismaErrorClassName.PrismaClientInitializationError,\n        errorClass:\n          moduleExports.PrismaClientInitializationError ||\n          prismaNamespace.PrismaClientInitializationError,\n      },\n      {\n        name: PrismaErrorClassName.PrismaClientValidationError,\n        errorClass:\n          moduleExports.PrismaClientValidationError || prismaNamespace.PrismaClientValidationError,\n      },\n      {\n        name: PrismaErrorClassName.PrismaClientRustPanicError,\n        errorClass:\n          moduleExports.PrismaClientRustPanicError || prismaNamespace.PrismaClientRustPanicError,\n      },\n      {\n        name: PrismaErrorClassName.NotFoundError,\n        errorClass: moduleExports.NotFoundError || prismaNamespace.NotFoundError,\n      },\n    ];\n  }\n\n  private _handlePrismaOperation({\n    model,\n    operation,\n    args,\n    query,\n  }: {\n    model: string;\n    operation: string;\n    args: any;\n    query: (args: any) => Promise<any>;\n  }): Promise<any> {\n    const inputValue: PrismaInputValue = {\n      model,\n      operation,\n      args,\n    };\n\n    logger.debug(\n      `[PrismaInstrumentation] Intercepted Prisma operation: ${model}.${operation} in ${this.mode} mode`,\n    );\n\n    if (this.mode === TuskDriftMode.RECORD) {\n      return handleRecordMode({\n        originalFunctionCall: () => query(args),\n        recordModeHandler: ({ isPreAppStart }) => {\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => query(args),\n            {\n              name: `prisma.${operation}`,\n              kind: SpanKind.CLIENT,\n              submodule: model,\n              packageType: PackageType.UNSPECIFIED,\n              packageName: \"@prisma/client\",\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue,\n              isPreAppStart,\n            },\n            (spanInfo) => {\n              return this._handleRecordPrismaOperation(spanInfo, query, args);\n            },\n          );\n        },\n        spanKind: SpanKind.CLIENT,\n      });\n    } else if (this.mode === TuskDriftMode.REPLAY) {\n      const stackTrace = captureStackTrace([\"PrismaInstrumentation\"]);\n\n      return handleReplayMode({\n        noOpRequestHandler: () => query(args),\n        isServerRequest: false,\n        replayModeHandler: () => {\n          return SpanUtils.createAndExecuteSpan(\n            this.mode,\n            () => query(args),\n            {\n              name: `prisma.${operation}`,\n              kind: SpanKind.CLIENT,\n              submodule: model,\n              packageType: PackageType.UNSPECIFIED,\n              packageName: \"@prisma/client\",\n              instrumentationName: this.INSTRUMENTATION_NAME,\n              inputValue,\n              isPreAppStart: false,\n            },\n            (spanInfo) => {\n              return this._handleReplayPrismaOperation(spanInfo, inputValue, stackTrace);\n            },\n          );\n        },\n      });\n    } else {\n      // DISABLED mode - just pass through\n      return query(args);\n    }\n  }\n\n  private async _handleRecordPrismaOperation(\n    spanInfo: SpanInfo,\n    query: (args: any) => Promise<any>,\n    args: any,\n  ): Promise<any> {\n    try {\n      logger.debug(`[PrismaInstrumentation] Recording Prisma operation`);\n\n      // Execute the real Prisma query\n      const result = await query(args);\n\n      // Store the result in the span\n      const outputValue: PrismaOutputValue = {\n        prismaResult: result,\n        _tdOriginalFormat: \"result\",\n      };\n\n      try {\n        SpanUtils.addSpanAttributes(spanInfo.span, {\n          outputValue,\n        });\n        SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n      } catch (spanError) {\n        logger.error(`[PrismaInstrumentation] error adding span attributes:`, spanError);\n      }\n\n      return result;\n    } catch (error: any) {\n      logger.debug(`[PrismaInstrumentation] Prisma operation error: ${error.message}`);\n\n      try {\n        // Identify the Prisma error class\n        const errorClassName = this._getPrismaErrorClassName(error);\n\n        // Create a serializable error object\n        const errorWithClassName: PrismaErrorWithClassName = this._cloneError(error);\n        if (errorClassName) {\n          errorWithClassName.customTdName = errorClassName;\n        }\n\n        // Store the error in the span\n        const outputValue: PrismaOutputValue = {\n          prismaResult: errorWithClassName,\n          _tdOriginalFormat: \"error\",\n        };\n\n        SpanUtils.addSpanAttributes(spanInfo.span, {\n          outputValue,\n        });\n        SpanUtils.endSpan(spanInfo.span, {\n          code: SpanStatusCode.ERROR,\n          message: error.message,\n        });\n      } catch (spanError) {\n        logger.error(\n          `[PrismaInstrumentation] error extracting error and adding span attributes:`,\n          spanError,\n        );\n      }\n\n      // Re-throw the original error\n      throw error;\n    }\n  }\n\n  private async _handleReplayPrismaOperation(\n    spanInfo: SpanInfo,\n    inputValue: PrismaInputValue,\n    stackTrace?: string,\n  ): Promise<any> {\n    const mockData = await findMockResponseAsync({\n      mockRequestData: {\n        traceId: spanInfo.traceId,\n        spanId: spanInfo.spanId,\n        name: `prisma.${inputValue.operation}`,\n        inputValue,\n        packageName: \"@prisma/client\",\n        instrumentationName: this.INSTRUMENTATION_NAME,\n        submoduleName: inputValue.model,\n        kind: SpanKind.CLIENT,\n        stackTrace,\n      },\n      tuskDrift: this.tuskDrift,\n    });\n\n    if (!mockData) {\n      logger.warn(\n        `[PrismaInstrumentation] No mock data found for Prisma operation: ${inputValue.model}.${inputValue.operation}`,\n      );\n      throw new Error(\n        `[PrismaInstrumentation] No matching mock found for Prisma operation: ${inputValue.model}.${inputValue.operation}`,\n      );\n    }\n\n    logger.debug(\n      `[PrismaInstrumentation] Found mock data for Prisma operation: ${inputValue.model}.${inputValue.operation}`,\n    );\n\n    const outputValue = mockData.result as PrismaOutputValue;\n\n    // Check if this is an error replay\n    if (outputValue._tdOriginalFormat === \"error\") {\n      const errorObj = outputValue.prismaResult as PrismaErrorWithClassName;\n\n      // Restore the correct Prisma error class prototype\n      if (errorObj.customTdName) {\n        const errorClass = this._getPrismaErrorClassFromName(errorObj.customTdName);\n        if (errorClass) {\n          Object.setPrototypeOf(errorObj, errorClass.prototype);\n        }\n      }\n\n      SpanUtils.endSpan(spanInfo.span, {\n        code: SpanStatusCode.ERROR,\n        message: errorObj.message || \"Prisma error\",\n      });\n\n      throw errorObj;\n    }\n\n    // Return the successful result\n    SpanUtils.endSpan(spanInfo.span, { code: SpanStatusCode.OK });\n    return outputValue.prismaResult;\n  }\n\n  private _getPrismaErrorClassName(error: any): PrismaErrorClassName | undefined {\n    for (const errorInfo of this.prismaErrorClasses) {\n      if (error instanceof errorInfo.errorClass) {\n        return errorInfo.name;\n      }\n    }\n    return undefined;\n  }\n\n  private _getPrismaErrorClassFromName(className: PrismaErrorClassName): any {\n    for (const errorInfo of this.prismaErrorClasses) {\n      if (errorInfo.name === className) {\n        return errorInfo.errorClass;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Deep clone an error object to make it serializable\n   */\n  private _cloneError(error: any): PrismaErrorWithClassName {\n    const cloned: PrismaErrorWithClassName = new Error(error.message) as PrismaErrorWithClassName;\n    cloned.name = error.name;\n    cloned.stack = error.stack;\n\n    // Copy all enumerable properties\n    for (const key in error) {\n      if (error.hasOwnProperty(key)) {\n        try {\n          cloned[key] = error[key];\n        } catch (e) {\n          // Skip properties that can't be copied\n        }\n      }\n    }\n\n    return cloned;\n  }\n\n  private _wrap(target: any, propertyName: string, wrapper: (original: any) => any): void {\n    wrap(target, propertyName, wrapper);\n  }\n}\n","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isTracingSuppressed = exports.unsuppressTracing = exports.suppressTracing = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\nconst SUPPRESS_TRACING_KEY = (0, api_1.createContextKey)('OpenTelemetry SDK Context Key SUPPRESS_TRACING');\nfunction suppressTracing(context) {\n    return context.setValue(SUPPRESS_TRACING_KEY, true);\n}\nexports.suppressTracing = suppressTracing;\nfunction unsuppressTracing(context) {\n    return context.deleteValue(SUPPRESS_TRACING_KEY);\n}\nexports.unsuppressTracing = unsuppressTracing;\nfunction isTracingSuppressed(context) {\n    return context.getValue(SUPPRESS_TRACING_KEY) === true;\n}\nexports.isTracingSuppressed = isTracingSuppressed;\n//# sourceMappingURL=suppress-tracing.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BAGGAGE_MAX_TOTAL_LENGTH = exports.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS = exports.BAGGAGE_MAX_NAME_VALUE_PAIRS = exports.BAGGAGE_HEADER = exports.BAGGAGE_ITEMS_SEPARATOR = exports.BAGGAGE_PROPERTIES_SEPARATOR = exports.BAGGAGE_KEY_PAIR_SEPARATOR = void 0;\nexports.BAGGAGE_KEY_PAIR_SEPARATOR = '=';\nexports.BAGGAGE_PROPERTIES_SEPARATOR = ';';\nexports.BAGGAGE_ITEMS_SEPARATOR = ',';\n// Name of the http header used to propagate the baggage\nexports.BAGGAGE_HEADER = 'baggage';\n// Maximum number of name-value pairs allowed by w3c spec\nexports.BAGGAGE_MAX_NAME_VALUE_PAIRS = 180;\n// Maximum number of bytes per a single name-value pair allowed by w3c spec\nexports.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS = 4096;\n// Maximum total length of all name-value pairs allowed by w3c spec\nexports.BAGGAGE_MAX_TOTAL_LENGTH = 8192;\n//# sourceMappingURL=constants.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseKeyPairsIntoRecord = exports.parsePairKeyValue = exports.getKeyPairs = exports.serializeKeyPairs = void 0;\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst api_1 = require(\"@opentelemetry/api\");\nconst constants_1 = require(\"./constants\");\nfunction serializeKeyPairs(keyPairs) {\n    return keyPairs.reduce((hValue, current) => {\n        const value = `${hValue}${hValue !== '' ? constants_1.BAGGAGE_ITEMS_SEPARATOR : ''}${current}`;\n        return value.length > constants_1.BAGGAGE_MAX_TOTAL_LENGTH ? hValue : value;\n    }, '');\n}\nexports.serializeKeyPairs = serializeKeyPairs;\nfunction getKeyPairs(baggage) {\n    return baggage.getAllEntries().map(([key, value]) => {\n        let entry = `${encodeURIComponent(key)}=${encodeURIComponent(value.value)}`;\n        // include opaque metadata if provided\n        // NOTE: we intentionally don't URI-encode the metadata - that responsibility falls on the metadata implementation\n        if (value.metadata !== undefined) {\n            entry += constants_1.BAGGAGE_PROPERTIES_SEPARATOR + value.metadata.toString();\n        }\n        return entry;\n    });\n}\nexports.getKeyPairs = getKeyPairs;\nfunction parsePairKeyValue(entry) {\n    const valueProps = entry.split(constants_1.BAGGAGE_PROPERTIES_SEPARATOR);\n    if (valueProps.length <= 0)\n        return;\n    const keyPairPart = valueProps.shift();\n    if (!keyPairPart)\n        return;\n    const separatorIndex = keyPairPart.indexOf(constants_1.BAGGAGE_KEY_PAIR_SEPARATOR);\n    if (separatorIndex <= 0)\n        return;\n    const key = decodeURIComponent(keyPairPart.substring(0, separatorIndex).trim());\n    const value = decodeURIComponent(keyPairPart.substring(separatorIndex + 1).trim());\n    let metadata;\n    if (valueProps.length > 0) {\n        metadata = (0, api_1.baggageEntryMetadataFromString)(valueProps.join(constants_1.BAGGAGE_PROPERTIES_SEPARATOR));\n    }\n    return { key, value, metadata };\n}\nexports.parsePairKeyValue = parsePairKeyValue;\n/**\n * Parse a string serialized in the baggage HTTP Format (without metadata):\n * https://github.com/w3c/baggage/blob/master/baggage/HTTP_HEADER_FORMAT.md\n */\nfunction parseKeyPairsIntoRecord(value) {\n    if (typeof value !== 'string' || value.length === 0)\n        return {};\n    return value\n        .split(constants_1.BAGGAGE_ITEMS_SEPARATOR)\n        .map(entry => {\n        return parsePairKeyValue(entry);\n    })\n        .filter(keyPair => keyPair !== undefined && keyPair.value.length > 0)\n        .reduce((headers, keyPair) => {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        headers[keyPair.key] = keyPair.value;\n        return headers;\n    }, {});\n}\nexports.parseKeyPairsIntoRecord = parseKeyPairsIntoRecord;\n//# sourceMappingURL=utils.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.W3CBaggagePropagator = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\nconst suppress_tracing_1 = require(\"../../trace/suppress-tracing\");\nconst constants_1 = require(\"../constants\");\nconst utils_1 = require(\"../utils\");\n/**\n * Propagates {@link Baggage} through Context format propagation.\n *\n * Based on the Baggage specification:\n * https://w3c.github.io/baggage/\n */\nclass W3CBaggagePropagator {\n    inject(context, carrier, setter) {\n        const baggage = api_1.propagation.getBaggage(context);\n        if (!baggage || (0, suppress_tracing_1.isTracingSuppressed)(context))\n            return;\n        const keyPairs = (0, utils_1.getKeyPairs)(baggage)\n            .filter((pair) => {\n            return pair.length <= constants_1.BAGGAGE_MAX_PER_NAME_VALUE_PAIRS;\n        })\n            .slice(0, constants_1.BAGGAGE_MAX_NAME_VALUE_PAIRS);\n        const headerValue = (0, utils_1.serializeKeyPairs)(keyPairs);\n        if (headerValue.length > 0) {\n            setter.set(carrier, constants_1.BAGGAGE_HEADER, headerValue);\n        }\n    }\n    extract(context, carrier, getter) {\n        const headerValue = getter.get(carrier, constants_1.BAGGAGE_HEADER);\n        const baggageString = Array.isArray(headerValue)\n            ? headerValue.join(constants_1.BAGGAGE_ITEMS_SEPARATOR)\n            : headerValue;\n        if (!baggageString)\n            return context;\n        const baggage = {};\n        if (baggageString.length === 0) {\n            return context;\n        }\n        const pairs = baggageString.split(constants_1.BAGGAGE_ITEMS_SEPARATOR);\n        pairs.forEach(entry => {\n            const keyPair = (0, utils_1.parsePairKeyValue)(entry);\n            if (keyPair) {\n                const baggageEntry = { value: keyPair.value };\n                if (keyPair.metadata) {\n                    baggageEntry.metadata = keyPair.metadata;\n                }\n                baggage[keyPair.key] = baggageEntry;\n            }\n        });\n        if (Object.entries(baggage).length === 0) {\n            return context;\n        }\n        return api_1.propagation.setBaggage(context, api_1.propagation.createBaggage(baggage));\n    }\n    fields() {\n        return [constants_1.BAGGAGE_HEADER];\n    }\n}\nexports.W3CBaggagePropagator = W3CBaggagePropagator;\n//# sourceMappingURL=W3CBaggagePropagator.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AnchoredClock = void 0;\n/**\n * A utility for returning wall times anchored to a given point in time. Wall time measurements will\n * not be taken from the system, but instead are computed by adding a monotonic clock time\n * to the anchor point.\n *\n * This is needed because the system time can change and result in unexpected situations like\n * spans ending before they are started. Creating an anchored clock for each local root span\n * ensures that span timings and durations are accurate while preventing span times from drifting\n * too far from the system clock.\n *\n * Only creating an anchored clock once per local trace ensures span times are correct relative\n * to each other. For example, a child span will never have a start time before its parent even\n * if the system clock is corrected during the local trace.\n *\n * Heavily inspired by the OTel Java anchored clock\n * https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/AnchoredClock.java\n */\nclass AnchoredClock {\n    /**\n     * Create a new AnchoredClock anchored to the current time returned by systemClock.\n     *\n     * @param systemClock should be a clock that returns the number of milliseconds since January 1 1970 such as Date\n     * @param monotonicClock should be a clock that counts milliseconds monotonically such as window.performance or perf_hooks.performance\n     */\n    constructor(systemClock, monotonicClock) {\n        this._monotonicClock = monotonicClock;\n        this._epochMillis = systemClock.now();\n        this._performanceMillis = monotonicClock.now();\n    }\n    /**\n     * Returns the current time by adding the number of milliseconds since the\n     * AnchoredClock was created to the creation epoch time\n     */\n    now() {\n        const delta = this._monotonicClock.now() - this._performanceMillis;\n        return this._epochMillis + delta;\n    }\n}\nexports.AnchoredClock = AnchoredClock;\n//# sourceMappingURL=anchored-clock.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isAttributeValue = exports.isAttributeKey = exports.sanitizeAttributes = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\nfunction sanitizeAttributes(attributes) {\n    const out = {};\n    if (typeof attributes !== 'object' || attributes == null) {\n        return out;\n    }\n    for (const [key, val] of Object.entries(attributes)) {\n        if (!isAttributeKey(key)) {\n            api_1.diag.warn(`Invalid attribute key: ${key}`);\n            continue;\n        }\n        if (!isAttributeValue(val)) {\n            api_1.diag.warn(`Invalid attribute value set for key: ${key}`);\n            continue;\n        }\n        if (Array.isArray(val)) {\n            out[key] = val.slice();\n        }\n        else {\n            out[key] = val;\n        }\n    }\n    return out;\n}\nexports.sanitizeAttributes = sanitizeAttributes;\nfunction isAttributeKey(key) {\n    return typeof key === 'string' && key.length > 0;\n}\nexports.isAttributeKey = isAttributeKey;\nfunction isAttributeValue(val) {\n    if (val == null) {\n        return true;\n    }\n    if (Array.isArray(val)) {\n        return isHomogeneousAttributeValueArray(val);\n    }\n    return isValidPrimitiveAttributeValue(val);\n}\nexports.isAttributeValue = isAttributeValue;\nfunction isHomogeneousAttributeValueArray(arr) {\n    let type;\n    for (const element of arr) {\n        // null/undefined elements are allowed\n        if (element == null)\n            continue;\n        if (!type) {\n            if (isValidPrimitiveAttributeValue(element)) {\n                type = typeof element;\n                continue;\n            }\n            // encountered an invalid primitive\n            return false;\n        }\n        if (typeof element === type) {\n            continue;\n        }\n        return false;\n    }\n    return true;\n}\nfunction isValidPrimitiveAttributeValue(val) {\n    switch (typeof val) {\n        case 'number':\n        case 'boolean':\n        case 'string':\n            return true;\n    }\n    return false;\n}\n//# sourceMappingURL=attributes.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loggingErrorHandler = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\n/**\n * Returns a function that logs an error using the provided logger, or a\n * console logger if one was not provided.\n */\nfunction loggingErrorHandler() {\n    return (ex) => {\n        api_1.diag.error(stringifyException(ex));\n    };\n}\nexports.loggingErrorHandler = loggingErrorHandler;\n/**\n * Converts an exception into a string representation\n * @param {Exception} ex\n */\nfunction stringifyException(ex) {\n    if (typeof ex === 'string') {\n        return ex;\n    }\n    else {\n        return JSON.stringify(flattenException(ex));\n    }\n}\n/**\n * Flattens an exception into key-value pairs by traversing the prototype chain\n * and coercing values to strings. Duplicate properties will not be overwritten;\n * the first insert wins.\n */\nfunction flattenException(ex) {\n    const result = {};\n    let current = ex;\n    while (current !== null) {\n        Object.getOwnPropertyNames(current).forEach(propertyName => {\n            if (result[propertyName])\n                return;\n            const value = current[propertyName];\n            if (value) {\n                result[propertyName] = String(value);\n            }\n        });\n        current = Object.getPrototypeOf(current);\n    }\n    return result;\n}\n//# sourceMappingURL=logging-error-handler.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.globalErrorHandler = exports.setGlobalErrorHandler = void 0;\nconst logging_error_handler_1 = require(\"./logging-error-handler\");\n/** The global error handler delegate */\nlet delegateHandler = (0, logging_error_handler_1.loggingErrorHandler)();\n/**\n * Set the global error handler\n * @param {ErrorHandler} handler\n */\nfunction setGlobalErrorHandler(handler) {\n    delegateHandler = handler;\n}\nexports.setGlobalErrorHandler = setGlobalErrorHandler;\n/**\n * Return the global error handler\n * @param {Exception} ex\n */\nfunction globalErrorHandler(ex) {\n    try {\n        delegateHandler(ex);\n    }\n    catch (_a) { } // eslint-disable-line no-empty\n}\nexports.globalErrorHandler = globalErrorHandler;\n//# sourceMappingURL=global-error-handler.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TracesSamplerValues = void 0;\nvar TracesSamplerValues;\n(function (TracesSamplerValues) {\n    TracesSamplerValues[\"AlwaysOff\"] = \"always_off\";\n    TracesSamplerValues[\"AlwaysOn\"] = \"always_on\";\n    TracesSamplerValues[\"ParentBasedAlwaysOff\"] = \"parentbased_always_off\";\n    TracesSamplerValues[\"ParentBasedAlwaysOn\"] = \"parentbased_always_on\";\n    TracesSamplerValues[\"ParentBasedTraceIdRatio\"] = \"parentbased_traceidratio\";\n    TracesSamplerValues[\"TraceIdRatio\"] = \"traceidratio\";\n})(TracesSamplerValues = exports.TracesSamplerValues || (exports.TracesSamplerValues = {}));\n//# sourceMappingURL=sampling.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.parseEnvironment = exports.DEFAULT_ENVIRONMENT = exports.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT = exports.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT = exports.DEFAULT_ATTRIBUTE_COUNT_LIMIT = exports.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\nconst sampling_1 = require(\"./sampling\");\nconst DEFAULT_LIST_SEPARATOR = ',';\n/**\n * Environment interface to define all names\n */\nconst ENVIRONMENT_BOOLEAN_KEYS = ['OTEL_SDK_DISABLED'];\nfunction isEnvVarABoolean(key) {\n    return (ENVIRONMENT_BOOLEAN_KEYS.indexOf(key) > -1);\n}\nconst ENVIRONMENT_NUMBERS_KEYS = [\n    'OTEL_BSP_EXPORT_TIMEOUT',\n    'OTEL_BSP_MAX_EXPORT_BATCH_SIZE',\n    'OTEL_BSP_MAX_QUEUE_SIZE',\n    'OTEL_BSP_SCHEDULE_DELAY',\n    'OTEL_BLRP_EXPORT_TIMEOUT',\n    'OTEL_BLRP_MAX_EXPORT_BATCH_SIZE',\n    'OTEL_BLRP_MAX_QUEUE_SIZE',\n    'OTEL_BLRP_SCHEDULE_DELAY',\n    'OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT',\n    'OTEL_ATTRIBUTE_COUNT_LIMIT',\n    'OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT',\n    'OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT',\n    'OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT',\n    'OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT',\n    'OTEL_SPAN_EVENT_COUNT_LIMIT',\n    'OTEL_SPAN_LINK_COUNT_LIMIT',\n    'OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT',\n    'OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT',\n    'OTEL_EXPORTER_OTLP_TIMEOUT',\n    'OTEL_EXPORTER_OTLP_TRACES_TIMEOUT',\n    'OTEL_EXPORTER_OTLP_METRICS_TIMEOUT',\n    'OTEL_EXPORTER_OTLP_LOGS_TIMEOUT',\n    'OTEL_EXPORTER_JAEGER_AGENT_PORT',\n];\nfunction isEnvVarANumber(key) {\n    return (ENVIRONMENT_NUMBERS_KEYS.indexOf(key) > -1);\n}\nconst ENVIRONMENT_LISTS_KEYS = [\n    'OTEL_NO_PATCH_MODULES',\n    'OTEL_PROPAGATORS',\n    'OTEL_SEMCONV_STABILITY_OPT_IN',\n];\nfunction isEnvVarAList(key) {\n    return ENVIRONMENT_LISTS_KEYS.indexOf(key) > -1;\n}\nexports.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT = Infinity;\nexports.DEFAULT_ATTRIBUTE_COUNT_LIMIT = 128;\nexports.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT = 128;\nexports.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT = 128;\n/**\n * Default environment variables\n */\nexports.DEFAULT_ENVIRONMENT = {\n    OTEL_SDK_DISABLED: false,\n    CONTAINER_NAME: '',\n    ECS_CONTAINER_METADATA_URI_V4: '',\n    ECS_CONTAINER_METADATA_URI: '',\n    HOSTNAME: '',\n    KUBERNETES_SERVICE_HOST: '',\n    NAMESPACE: '',\n    OTEL_BSP_EXPORT_TIMEOUT: 30000,\n    OTEL_BSP_MAX_EXPORT_BATCH_SIZE: 512,\n    OTEL_BSP_MAX_QUEUE_SIZE: 2048,\n    OTEL_BSP_SCHEDULE_DELAY: 5000,\n    OTEL_BLRP_EXPORT_TIMEOUT: 30000,\n    OTEL_BLRP_MAX_EXPORT_BATCH_SIZE: 512,\n    OTEL_BLRP_MAX_QUEUE_SIZE: 2048,\n    OTEL_BLRP_SCHEDULE_DELAY: 5000,\n    OTEL_EXPORTER_JAEGER_AGENT_HOST: '',\n    OTEL_EXPORTER_JAEGER_AGENT_PORT: 6832,\n    OTEL_EXPORTER_JAEGER_ENDPOINT: '',\n    OTEL_EXPORTER_JAEGER_PASSWORD: '',\n    OTEL_EXPORTER_JAEGER_USER: '',\n    OTEL_EXPORTER_OTLP_ENDPOINT: '',\n    OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: '',\n    OTEL_EXPORTER_OTLP_METRICS_ENDPOINT: '',\n    OTEL_EXPORTER_OTLP_LOGS_ENDPOINT: '',\n    OTEL_EXPORTER_OTLP_HEADERS: '',\n    OTEL_EXPORTER_OTLP_TRACES_HEADERS: '',\n    OTEL_EXPORTER_OTLP_METRICS_HEADERS: '',\n    OTEL_EXPORTER_OTLP_LOGS_HEADERS: '',\n    OTEL_EXPORTER_OTLP_TIMEOUT: 10000,\n    OTEL_EXPORTER_OTLP_TRACES_TIMEOUT: 10000,\n    OTEL_EXPORTER_OTLP_METRICS_TIMEOUT: 10000,\n    OTEL_EXPORTER_OTLP_LOGS_TIMEOUT: 10000,\n    OTEL_EXPORTER_ZIPKIN_ENDPOINT: 'http://localhost:9411/api/v2/spans',\n    OTEL_LOG_LEVEL: api_1.DiagLogLevel.INFO,\n    OTEL_NO_PATCH_MODULES: [],\n    OTEL_PROPAGATORS: ['tracecontext', 'baggage'],\n    OTEL_RESOURCE_ATTRIBUTES: '',\n    OTEL_SERVICE_NAME: '',\n    OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT: exports.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,\n    OTEL_ATTRIBUTE_COUNT_LIMIT: exports.DEFAULT_ATTRIBUTE_COUNT_LIMIT,\n    OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT: exports.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,\n    OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT: exports.DEFAULT_ATTRIBUTE_COUNT_LIMIT,\n    OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT: exports.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT,\n    OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT: exports.DEFAULT_ATTRIBUTE_COUNT_LIMIT,\n    OTEL_SPAN_EVENT_COUNT_LIMIT: 128,\n    OTEL_SPAN_LINK_COUNT_LIMIT: 128,\n    OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT: exports.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT,\n    OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT: exports.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT,\n    OTEL_TRACES_EXPORTER: '',\n    OTEL_TRACES_SAMPLER: sampling_1.TracesSamplerValues.ParentBasedAlwaysOn,\n    OTEL_TRACES_SAMPLER_ARG: '',\n    OTEL_LOGS_EXPORTER: '',\n    OTEL_EXPORTER_OTLP_INSECURE: '',\n    OTEL_EXPORTER_OTLP_TRACES_INSECURE: '',\n    OTEL_EXPORTER_OTLP_METRICS_INSECURE: '',\n    OTEL_EXPORTER_OTLP_LOGS_INSECURE: '',\n    OTEL_EXPORTER_OTLP_CERTIFICATE: '',\n    OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE: '',\n    OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE: '',\n    OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE: '',\n    OTEL_EXPORTER_OTLP_COMPRESSION: '',\n    OTEL_EXPORTER_OTLP_TRACES_COMPRESSION: '',\n    OTEL_EXPORTER_OTLP_METRICS_COMPRESSION: '',\n    OTEL_EXPORTER_OTLP_LOGS_COMPRESSION: '',\n    OTEL_EXPORTER_OTLP_CLIENT_KEY: '',\n    OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY: '',\n    OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY: '',\n    OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY: '',\n    OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE: '',\n    OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE: '',\n    OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE: '',\n    OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE: '',\n    OTEL_EXPORTER_OTLP_PROTOCOL: 'http/protobuf',\n    OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: 'http/protobuf',\n    OTEL_EXPORTER_OTLP_METRICS_PROTOCOL: 'http/protobuf',\n    OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: 'http/protobuf',\n    OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: 'cumulative',\n    OTEL_SEMCONV_STABILITY_OPT_IN: [],\n};\n/**\n * @param key\n * @param environment\n * @param values\n */\nfunction parseBoolean(key, environment, values) {\n    if (typeof values[key] === 'undefined') {\n        return;\n    }\n    const value = String(values[key]);\n    // support case-insensitive \"true\"\n    environment[key] = value.toLowerCase() === 'true';\n}\n/**\n * Parses a variable as number with number validation\n * @param name\n * @param environment\n * @param values\n * @param min\n * @param max\n */\nfunction parseNumber(name, environment, values, min = -Infinity, max = Infinity) {\n    if (typeof values[name] !== 'undefined') {\n        const value = Number(values[name]);\n        if (!isNaN(value)) {\n            if (value < min) {\n                environment[name] = min;\n            }\n            else if (value > max) {\n                environment[name] = max;\n            }\n            else {\n                environment[name] = value;\n            }\n        }\n    }\n}\n/**\n * Parses list-like strings from input into output.\n * @param name\n * @param environment\n * @param values\n * @param separator\n */\nfunction parseStringList(name, output, input, separator = DEFAULT_LIST_SEPARATOR) {\n    const givenValue = input[name];\n    if (typeof givenValue === 'string') {\n        output[name] = givenValue.split(separator).map(v => v.trim());\n    }\n}\n// The support string -> DiagLogLevel mappings\nconst logLevelMap = {\n    ALL: api_1.DiagLogLevel.ALL,\n    VERBOSE: api_1.DiagLogLevel.VERBOSE,\n    DEBUG: api_1.DiagLogLevel.DEBUG,\n    INFO: api_1.DiagLogLevel.INFO,\n    WARN: api_1.DiagLogLevel.WARN,\n    ERROR: api_1.DiagLogLevel.ERROR,\n    NONE: api_1.DiagLogLevel.NONE,\n};\n/**\n * Environmentally sets log level if valid log level string is provided\n * @param key\n * @param environment\n * @param values\n */\nfunction setLogLevelFromEnv(key, environment, values) {\n    const value = values[key];\n    if (typeof value === 'string') {\n        const theLevel = logLevelMap[value.toUpperCase()];\n        if (theLevel != null) {\n            environment[key] = theLevel;\n        }\n    }\n}\n/**\n * Parses environment values\n * @param values\n */\nfunction parseEnvironment(values) {\n    const environment = {};\n    for (const env in exports.DEFAULT_ENVIRONMENT) {\n        const key = env;\n        switch (key) {\n            case 'OTEL_LOG_LEVEL':\n                setLogLevelFromEnv(key, environment, values);\n                break;\n            default:\n                if (isEnvVarABoolean(key)) {\n                    parseBoolean(key, environment, values);\n                }\n                else if (isEnvVarANumber(key)) {\n                    parseNumber(key, environment, values);\n                }\n                else if (isEnvVarAList(key)) {\n                    parseStringList(key, environment, values);\n                }\n                else {\n                    const value = values[key];\n                    if (typeof value !== 'undefined' && value !== null) {\n                        environment[key] = String(value);\n                    }\n                }\n        }\n    }\n    return environment;\n}\nexports.parseEnvironment = parseEnvironment;\n//# sourceMappingURL=environment.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getEnvWithoutDefaults = exports.getEnv = void 0;\nconst environment_1 = require(\"../../utils/environment\");\n/**\n * Gets the environment variables\n */\nfunction getEnv() {\n    const processEnv = (0, environment_1.parseEnvironment)(process.env);\n    return Object.assign({}, environment_1.DEFAULT_ENVIRONMENT, processEnv);\n}\nexports.getEnv = getEnv;\nfunction getEnvWithoutDefaults() {\n    return (0, environment_1.parseEnvironment)(process.env);\n}\nexports.getEnvWithoutDefaults = getEnvWithoutDefaults;\n//# sourceMappingURL=environment.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._globalThis = void 0;\n/** only globals that common to node and browsers are allowed */\n// eslint-disable-next-line node/no-unsupported-features/es-builtins\nexports._globalThis = typeof globalThis === 'object' ? globalThis : global;\n//# sourceMappingURL=globalThis.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hexToBinary = void 0;\nfunction intValue(charCode) {\n    // 0-9\n    if (charCode >= 48 && charCode <= 57) {\n        return charCode - 48;\n    }\n    // a-f\n    if (charCode >= 97 && charCode <= 102) {\n        return charCode - 87;\n    }\n    // A-F\n    return charCode - 55;\n}\nfunction hexToBinary(hexStr) {\n    const buf = new Uint8Array(hexStr.length / 2);\n    let offset = 0;\n    for (let i = 0; i < hexStr.length; i += 2) {\n        const hi = intValue(hexStr.charCodeAt(i));\n        const lo = intValue(hexStr.charCodeAt(i + 1));\n        buf[offset++] = (hi << 4) | lo;\n    }\n    return buf;\n}\nexports.hexToBinary = hexToBinary;\n//# sourceMappingURL=hex-to-binary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.hexToBase64 = void 0;\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nconst hex_to_binary_1 = require(\"../../common/hex-to-binary\");\nfunction hexToBase64(hexStr) {\n    return Buffer.from((0, hex_to_binary_1.hexToBinary)(hexStr)).toString('base64');\n}\nexports.hexToBase64 = hexToBase64;\n//# sourceMappingURL=hex-to-base64.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RandomIdGenerator = void 0;\nconst SPAN_ID_BYTES = 8;\nconst TRACE_ID_BYTES = 16;\n/**\n * @deprecated Use the one defined in @opentelemetry/sdk-trace-base instead.\n */\nclass RandomIdGenerator {\n    constructor() {\n        /**\n         * Returns a random 16-byte trace ID formatted/encoded as a 32 lowercase hex\n         * characters corresponding to 128 bits.\n         */\n        this.generateTraceId = getIdGenerator(TRACE_ID_BYTES);\n        /**\n         * Returns a random 8-byte span ID formatted/encoded as a 16 lowercase hex\n         * characters corresponding to 64 bits.\n         */\n        this.generateSpanId = getIdGenerator(SPAN_ID_BYTES);\n    }\n}\nexports.RandomIdGenerator = RandomIdGenerator;\nconst SHARED_BUFFER = Buffer.allocUnsafe(TRACE_ID_BYTES);\nfunction getIdGenerator(bytes) {\n    return function generateId() {\n        for (let i = 0; i < bytes / 4; i++) {\n            // unsigned right shift drops decimal part of the number\n            // it is required because if a number between 2**32 and 2**32 - 1 is generated, an out of range error is thrown by writeUInt32BE\n            SHARED_BUFFER.writeUInt32BE((Math.random() * 2 ** 32) >>> 0, i * 4);\n        }\n        // If buffer is all 0, set the last byte to 1 to guarantee a valid w3c id is generated\n        for (let i = 0; i < bytes; i++) {\n            if (SHARED_BUFFER[i] > 0) {\n                break;\n            }\n            else if (i === bytes - 1) {\n                SHARED_BUFFER[bytes - 1] = 1;\n            }\n        }\n        return SHARED_BUFFER.toString('hex', 0, bytes);\n    };\n}\n//# sourceMappingURL=RandomIdGenerator.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.otperformance = void 0;\nconst perf_hooks_1 = require(\"perf_hooks\");\nexports.otperformance = perf_hooks_1.performance;\n//# sourceMappingURL=performance.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VERSION = void 0;\n// this is autogenerated file, see scripts/version-update.js\nexports.VERSION = '1.30.1';\n//# sourceMappingURL=version.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SDK_INFO = void 0;\nconst version_1 = require(\"../../version\");\nconst semantic_conventions_1 = require(\"@opentelemetry/semantic-conventions\");\n/** Constants describing the SDK in use */\nexports.SDK_INFO = {\n    [semantic_conventions_1.SEMRESATTRS_TELEMETRY_SDK_NAME]: 'opentelemetry',\n    [semantic_conventions_1.SEMRESATTRS_PROCESS_RUNTIME_NAME]: 'node',\n    [semantic_conventions_1.SEMRESATTRS_TELEMETRY_SDK_LANGUAGE]: semantic_conventions_1.TELEMETRYSDKLANGUAGEVALUES_NODEJS,\n    [semantic_conventions_1.SEMRESATTRS_TELEMETRY_SDK_VERSION]: version_1.VERSION,\n};\n//# sourceMappingURL=sdk-info.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unrefTimer = void 0;\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction unrefTimer(timer) {\n    timer.unref();\n}\nexports.unrefTimer = unrefTimer;\n//# sourceMappingURL=timer-util.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unrefTimer = exports.SDK_INFO = exports.otperformance = exports.RandomIdGenerator = exports.hexToBase64 = exports._globalThis = exports.getEnv = exports.getEnvWithoutDefaults = void 0;\nvar environment_1 = require(\"./environment\");\nObject.defineProperty(exports, \"getEnvWithoutDefaults\", { enumerable: true, get: function () { return environment_1.getEnvWithoutDefaults; } });\nObject.defineProperty(exports, \"getEnv\", { enumerable: true, get: function () { return environment_1.getEnv; } });\nvar globalThis_1 = require(\"./globalThis\");\nObject.defineProperty(exports, \"_globalThis\", { enumerable: true, get: function () { return globalThis_1._globalThis; } });\nvar hex_to_base64_1 = require(\"./hex-to-base64\");\nObject.defineProperty(exports, \"hexToBase64\", { enumerable: true, get: function () { return hex_to_base64_1.hexToBase64; } });\nvar RandomIdGenerator_1 = require(\"./RandomIdGenerator\");\nObject.defineProperty(exports, \"RandomIdGenerator\", { enumerable: true, get: function () { return RandomIdGenerator_1.RandomIdGenerator; } });\nvar performance_1 = require(\"./performance\");\nObject.defineProperty(exports, \"otperformance\", { enumerable: true, get: function () { return performance_1.otperformance; } });\nvar sdk_info_1 = require(\"./sdk-info\");\nObject.defineProperty(exports, \"SDK_INFO\", { enumerable: true, get: function () { return sdk_info_1.SDK_INFO; } });\nvar timer_util_1 = require(\"./timer-util\");\nObject.defineProperty(exports, \"unrefTimer\", { enumerable: true, get: function () { return timer_util_1.unrefTimer; } });\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.unrefTimer = exports.otperformance = exports.hexToBase64 = exports.getEnvWithoutDefaults = exports.getEnv = exports._globalThis = exports.SDK_INFO = exports.RandomIdGenerator = void 0;\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nvar node_1 = require(\"./node\");\nObject.defineProperty(exports, \"RandomIdGenerator\", { enumerable: true, get: function () { return node_1.RandomIdGenerator; } });\nObject.defineProperty(exports, \"SDK_INFO\", { enumerable: true, get: function () { return node_1.SDK_INFO; } });\nObject.defineProperty(exports, \"_globalThis\", { enumerable: true, get: function () { return node_1._globalThis; } });\nObject.defineProperty(exports, \"getEnv\", { enumerable: true, get: function () { return node_1.getEnv; } });\nObject.defineProperty(exports, \"getEnvWithoutDefaults\", { enumerable: true, get: function () { return node_1.getEnvWithoutDefaults; } });\nObject.defineProperty(exports, \"hexToBase64\", { enumerable: true, get: function () { return node_1.hexToBase64; } });\nObject.defineProperty(exports, \"otperformance\", { enumerable: true, get: function () { return node_1.otperformance; } });\nObject.defineProperty(exports, \"unrefTimer\", { enumerable: true, get: function () { return node_1.unrefTimer; } });\n//# sourceMappingURL=index.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addHrTimes = exports.isTimeInput = exports.isTimeInputHrTime = exports.hrTimeToMicroseconds = exports.hrTimeToMilliseconds = exports.hrTimeToNanoseconds = exports.hrTimeToTimeStamp = exports.hrTimeDuration = exports.timeInputToHrTime = exports.hrTime = exports.getTimeOrigin = exports.millisToHrTime = void 0;\nconst platform_1 = require(\"../platform\");\nconst NANOSECOND_DIGITS = 9;\nconst NANOSECOND_DIGITS_IN_MILLIS = 6;\nconst MILLISECONDS_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS_IN_MILLIS);\nconst SECOND_TO_NANOSECONDS = Math.pow(10, NANOSECOND_DIGITS);\n/**\n * Converts a number of milliseconds from epoch to HrTime([seconds, remainder in nanoseconds]).\n * @param epochMillis\n */\nfunction millisToHrTime(epochMillis) {\n    const epochSeconds = epochMillis / 1000;\n    // Decimals only.\n    const seconds = Math.trunc(epochSeconds);\n    // Round sub-nanosecond accuracy to nanosecond.\n    const nanos = Math.round((epochMillis % 1000) * MILLISECONDS_TO_NANOSECONDS);\n    return [seconds, nanos];\n}\nexports.millisToHrTime = millisToHrTime;\nfunction getTimeOrigin() {\n    let timeOrigin = platform_1.otperformance.timeOrigin;\n    if (typeof timeOrigin !== 'number') {\n        const perf = platform_1.otperformance;\n        timeOrigin = perf.timing && perf.timing.fetchStart;\n    }\n    return timeOrigin;\n}\nexports.getTimeOrigin = getTimeOrigin;\n/**\n * Returns an hrtime calculated via performance component.\n * @param performanceNow\n */\nfunction hrTime(performanceNow) {\n    const timeOrigin = millisToHrTime(getTimeOrigin());\n    const now = millisToHrTime(typeof performanceNow === 'number' ? performanceNow : platform_1.otperformance.now());\n    return addHrTimes(timeOrigin, now);\n}\nexports.hrTime = hrTime;\n/**\n *\n * Converts a TimeInput to an HrTime, defaults to _hrtime().\n * @param time\n */\nfunction timeInputToHrTime(time) {\n    // process.hrtime\n    if (isTimeInputHrTime(time)) {\n        return time;\n    }\n    else if (typeof time === 'number') {\n        // Must be a performance.now() if it's smaller than process start time.\n        if (time < getTimeOrigin()) {\n            return hrTime(time);\n        }\n        else {\n            // epoch milliseconds or performance.timeOrigin\n            return millisToHrTime(time);\n        }\n    }\n    else if (time instanceof Date) {\n        return millisToHrTime(time.getTime());\n    }\n    else {\n        throw TypeError('Invalid input type');\n    }\n}\nexports.timeInputToHrTime = timeInputToHrTime;\n/**\n * Returns a duration of two hrTime.\n * @param startTime\n * @param endTime\n */\nfunction hrTimeDuration(startTime, endTime) {\n    let seconds = endTime[0] - startTime[0];\n    let nanos = endTime[1] - startTime[1];\n    // overflow\n    if (nanos < 0) {\n        seconds -= 1;\n        // negate\n        nanos += SECOND_TO_NANOSECONDS;\n    }\n    return [seconds, nanos];\n}\nexports.hrTimeDuration = hrTimeDuration;\n/**\n * Convert hrTime to timestamp, for example \"2019-05-14T17:00:00.000123456Z\"\n * @param time\n */\nfunction hrTimeToTimeStamp(time) {\n    const precision = NANOSECOND_DIGITS;\n    const tmp = `${'0'.repeat(precision)}${time[1]}Z`;\n    const nanoString = tmp.substring(tmp.length - precision - 1);\n    const date = new Date(time[0] * 1000).toISOString();\n    return date.replace('000Z', nanoString);\n}\nexports.hrTimeToTimeStamp = hrTimeToTimeStamp;\n/**\n * Convert hrTime to nanoseconds.\n * @param time\n */\nfunction hrTimeToNanoseconds(time) {\n    return time[0] * SECOND_TO_NANOSECONDS + time[1];\n}\nexports.hrTimeToNanoseconds = hrTimeToNanoseconds;\n/**\n * Convert hrTime to milliseconds.\n * @param time\n */\nfunction hrTimeToMilliseconds(time) {\n    return time[0] * 1e3 + time[1] / 1e6;\n}\nexports.hrTimeToMilliseconds = hrTimeToMilliseconds;\n/**\n * Convert hrTime to microseconds.\n * @param time\n */\nfunction hrTimeToMicroseconds(time) {\n    return time[0] * 1e6 + time[1] / 1e3;\n}\nexports.hrTimeToMicroseconds = hrTimeToMicroseconds;\n/**\n * check if time is HrTime\n * @param value\n */\nfunction isTimeInputHrTime(value) {\n    return (Array.isArray(value) &&\n        value.length === 2 &&\n        typeof value[0] === 'number' &&\n        typeof value[1] === 'number');\n}\nexports.isTimeInputHrTime = isTimeInputHrTime;\n/**\n * check if input value is a correct types.TimeInput\n * @param value\n */\nfunction isTimeInput(value) {\n    return (isTimeInputHrTime(value) ||\n        typeof value === 'number' ||\n        value instanceof Date);\n}\nexports.isTimeInput = isTimeInput;\n/**\n * Given 2 HrTime formatted times, return their sum as an HrTime.\n */\nfunction addHrTimes(time1, time2) {\n    const out = [time1[0] + time2[0], time1[1] + time2[1]];\n    // Nanoseconds\n    if (out[1] >= SECOND_TO_NANOSECONDS) {\n        out[1] -= SECOND_TO_NANOSECONDS;\n        out[0] += 1;\n    }\n    return out;\n}\nexports.addHrTimes = addHrTimes;\n//# sourceMappingURL=time.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExportResultCode = void 0;\nvar ExportResultCode;\n(function (ExportResultCode) {\n    ExportResultCode[ExportResultCode[\"SUCCESS\"] = 0] = \"SUCCESS\";\n    ExportResultCode[ExportResultCode[\"FAILED\"] = 1] = \"FAILED\";\n})(ExportResultCode = exports.ExportResultCode || (exports.ExportResultCode = {}));\n//# sourceMappingURL=ExportResult.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CompositePropagator = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\n/** Combines multiple propagators into a single propagator. */\nclass CompositePropagator {\n    /**\n     * Construct a composite propagator from a list of propagators.\n     *\n     * @param [config] Configuration object for composite propagator\n     */\n    constructor(config = {}) {\n        var _a;\n        this._propagators = (_a = config.propagators) !== null && _a !== void 0 ? _a : [];\n        this._fields = Array.from(new Set(this._propagators\n            // older propagators may not have fields function, null check to be sure\n            .map(p => (typeof p.fields === 'function' ? p.fields() : []))\n            .reduce((x, y) => x.concat(y), [])));\n    }\n    /**\n     * Run each of the configured propagators with the given context and carrier.\n     * Propagators are run in the order they are configured, so if multiple\n     * propagators write the same carrier key, the propagator later in the list\n     * will \"win\".\n     *\n     * @param context Context to inject\n     * @param carrier Carrier into which context will be injected\n     */\n    inject(context, carrier, setter) {\n        for (const propagator of this._propagators) {\n            try {\n                propagator.inject(context, carrier, setter);\n            }\n            catch (err) {\n                api_1.diag.warn(`Failed to inject with ${propagator.constructor.name}. Err: ${err.message}`);\n            }\n        }\n    }\n    /**\n     * Run each of the configured propagators with the given context and carrier.\n     * Propagators are run in the order they are configured, so if multiple\n     * propagators write the same context key, the propagator later in the list\n     * will \"win\".\n     *\n     * @param context Context to add values to\n     * @param carrier Carrier from which to extract context\n     */\n    extract(context, carrier, getter) {\n        return this._propagators.reduce((ctx, propagator) => {\n            try {\n                return propagator.extract(ctx, carrier, getter);\n            }\n            catch (err) {\n                api_1.diag.warn(`Failed to extract with ${propagator.constructor.name}. Err: ${err.message}`);\n            }\n            return ctx;\n        }, context);\n    }\n    fields() {\n        // return a new array so our fields cannot be modified\n        return this._fields.slice();\n    }\n}\nexports.CompositePropagator = CompositePropagator;\n//# sourceMappingURL=composite.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateValue = exports.validateKey = void 0;\nconst VALID_KEY_CHAR_RANGE = '[_0-9a-z-*/]';\nconst VALID_KEY = `[a-z]${VALID_KEY_CHAR_RANGE}{0,255}`;\nconst VALID_VENDOR_KEY = `[a-z0-9]${VALID_KEY_CHAR_RANGE}{0,240}@[a-z]${VALID_KEY_CHAR_RANGE}{0,13}`;\nconst VALID_KEY_REGEX = new RegExp(`^(?:${VALID_KEY}|${VALID_VENDOR_KEY})$`);\nconst VALID_VALUE_BASE_REGEX = /^[ -~]{0,255}[!-~]$/;\nconst INVALID_VALUE_COMMA_EQUAL_REGEX = /,|=/;\n/**\n * Key is opaque string up to 256 characters printable. It MUST begin with a\n * lowercase letter, and can only contain lowercase letters a-z, digits 0-9,\n * underscores _, dashes -, asterisks *, and forward slashes /.\n * For multi-tenant vendor scenarios, an at sign (@) can be used to prefix the\n * vendor name. Vendors SHOULD set the tenant ID at the beginning of the key.\n * see https://www.w3.org/TR/trace-context/#key\n */\nfunction validateKey(key) {\n    return VALID_KEY_REGEX.test(key);\n}\nexports.validateKey = validateKey;\n/**\n * Value is opaque string up to 256 characters printable ASCII RFC0020\n * characters (i.e., the range 0x20 to 0x7E) except comma , and =.\n */\nfunction validateValue(value) {\n    return (VALID_VALUE_BASE_REGEX.test(value) &&\n        !INVALID_VALUE_COMMA_EQUAL_REGEX.test(value));\n}\nexports.validateValue = validateValue;\n//# sourceMappingURL=validators.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TraceState = void 0;\nconst validators_1 = require(\"../internal/validators\");\nconst MAX_TRACE_STATE_ITEMS = 32;\nconst MAX_TRACE_STATE_LEN = 512;\nconst LIST_MEMBERS_SEPARATOR = ',';\nconst LIST_MEMBER_KEY_VALUE_SPLITTER = '=';\n/**\n * TraceState must be a class and not a simple object type because of the spec\n * requirement (https://www.w3.org/TR/trace-context/#tracestate-field).\n *\n * Here is the list of allowed mutations:\n * - New key-value pair should be added into the beginning of the list\n * - The value of any key can be updated. Modified keys MUST be moved to the\n * beginning of the list.\n */\nclass TraceState {\n    constructor(rawTraceState) {\n        this._internalState = new Map();\n        if (rawTraceState)\n            this._parse(rawTraceState);\n    }\n    set(key, value) {\n        // TODO: Benchmark the different approaches(map vs list) and\n        // use the faster one.\n        const traceState = this._clone();\n        if (traceState._internalState.has(key)) {\n            traceState._internalState.delete(key);\n        }\n        traceState._internalState.set(key, value);\n        return traceState;\n    }\n    unset(key) {\n        const traceState = this._clone();\n        traceState._internalState.delete(key);\n        return traceState;\n    }\n    get(key) {\n        return this._internalState.get(key);\n    }\n    serialize() {\n        return this._keys()\n            .reduce((agg, key) => {\n            agg.push(key + LIST_MEMBER_KEY_VALUE_SPLITTER + this.get(key));\n            return agg;\n        }, [])\n            .join(LIST_MEMBERS_SEPARATOR);\n    }\n    _parse(rawTraceState) {\n        if (rawTraceState.length > MAX_TRACE_STATE_LEN)\n            return;\n        this._internalState = rawTraceState\n            .split(LIST_MEMBERS_SEPARATOR)\n            .reverse() // Store in reverse so new keys (.set(...)) will be placed at the beginning\n            .reduce((agg, part) => {\n            const listMember = part.trim(); // Optional Whitespace (OWS) handling\n            const i = listMember.indexOf(LIST_MEMBER_KEY_VALUE_SPLITTER);\n            if (i !== -1) {\n                const key = listMember.slice(0, i);\n                const value = listMember.slice(i + 1, part.length);\n                if ((0, validators_1.validateKey)(key) && (0, validators_1.validateValue)(value)) {\n                    agg.set(key, value);\n                }\n                else {\n                    // TODO: Consider to add warning log\n                }\n            }\n            return agg;\n        }, new Map());\n        // Because of the reverse() requirement, trunc must be done after map is created\n        if (this._internalState.size > MAX_TRACE_STATE_ITEMS) {\n            this._internalState = new Map(Array.from(this._internalState.entries())\n                .reverse() // Use reverse same as original tracestate parse chain\n                .slice(0, MAX_TRACE_STATE_ITEMS));\n        }\n    }\n    _keys() {\n        return Array.from(this._internalState.keys()).reverse();\n    }\n    _clone() {\n        const traceState = new TraceState();\n        traceState._internalState = new Map(this._internalState);\n        return traceState;\n    }\n}\nexports.TraceState = TraceState;\n//# sourceMappingURL=TraceState.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.W3CTraceContextPropagator = exports.parseTraceParent = exports.TRACE_STATE_HEADER = exports.TRACE_PARENT_HEADER = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\nconst suppress_tracing_1 = require(\"./suppress-tracing\");\nconst TraceState_1 = require(\"./TraceState\");\nexports.TRACE_PARENT_HEADER = 'traceparent';\nexports.TRACE_STATE_HEADER = 'tracestate';\nconst VERSION = '00';\nconst VERSION_PART = '(?!ff)[\\\\da-f]{2}';\nconst TRACE_ID_PART = '(?![0]{32})[\\\\da-f]{32}';\nconst PARENT_ID_PART = '(?![0]{16})[\\\\da-f]{16}';\nconst FLAGS_PART = '[\\\\da-f]{2}';\nconst TRACE_PARENT_REGEX = new RegExp(`^\\\\s?(${VERSION_PART})-(${TRACE_ID_PART})-(${PARENT_ID_PART})-(${FLAGS_PART})(-.*)?\\\\s?$`);\n/**\n * Parses information from the [traceparent] span tag and converts it into {@link SpanContext}\n * @param traceParent - A meta property that comes from server.\n *     It should be dynamically generated server side to have the server's request trace Id,\n *     a parent span Id that was set on the server's request span,\n *     and the trace flags to indicate the server's sampling decision\n *     (01 = sampled, 00 = not sampled).\n *     for example: '{version}-{traceId}-{spanId}-{sampleDecision}'\n *     For more information see {@link https://www.w3.org/TR/trace-context/}\n */\nfunction parseTraceParent(traceParent) {\n    const match = TRACE_PARENT_REGEX.exec(traceParent);\n    if (!match)\n        return null;\n    // According to the specification the implementation should be compatible\n    // with future versions. If there are more parts, we only reject it if it's using version 00\n    // See https://www.w3.org/TR/trace-context/#versioning-of-traceparent\n    if (match[1] === '00' && match[5])\n        return null;\n    return {\n        traceId: match[2],\n        spanId: match[3],\n        traceFlags: parseInt(match[4], 16),\n    };\n}\nexports.parseTraceParent = parseTraceParent;\n/**\n * Propagates {@link SpanContext} through Trace Context format propagation.\n *\n * Based on the Trace Context specification:\n * https://www.w3.org/TR/trace-context/\n */\nclass W3CTraceContextPropagator {\n    inject(context, carrier, setter) {\n        const spanContext = api_1.trace.getSpanContext(context);\n        if (!spanContext ||\n            (0, suppress_tracing_1.isTracingSuppressed)(context) ||\n            !(0, api_1.isSpanContextValid)(spanContext))\n            return;\n        const traceParent = `${VERSION}-${spanContext.traceId}-${spanContext.spanId}-0${Number(spanContext.traceFlags || api_1.TraceFlags.NONE).toString(16)}`;\n        setter.set(carrier, exports.TRACE_PARENT_HEADER, traceParent);\n        if (spanContext.traceState) {\n            setter.set(carrier, exports.TRACE_STATE_HEADER, spanContext.traceState.serialize());\n        }\n    }\n    extract(context, carrier, getter) {\n        const traceParentHeader = getter.get(carrier, exports.TRACE_PARENT_HEADER);\n        if (!traceParentHeader)\n            return context;\n        const traceParent = Array.isArray(traceParentHeader)\n            ? traceParentHeader[0]\n            : traceParentHeader;\n        if (typeof traceParent !== 'string')\n            return context;\n        const spanContext = parseTraceParent(traceParent);\n        if (!spanContext)\n            return context;\n        spanContext.isRemote = true;\n        const traceStateHeader = getter.get(carrier, exports.TRACE_STATE_HEADER);\n        if (traceStateHeader) {\n            // If more than one `tracestate` header is found, we merge them into a\n            // single header.\n            const state = Array.isArray(traceStateHeader)\n                ? traceStateHeader.join(',')\n                : traceStateHeader;\n            spanContext.traceState = new TraceState_1.TraceState(typeof state === 'string' ? state : undefined);\n        }\n        return api_1.trace.setSpanContext(context, spanContext);\n    }\n    fields() {\n        return [exports.TRACE_PARENT_HEADER, exports.TRACE_STATE_HEADER];\n    }\n}\nexports.W3CTraceContextPropagator = W3CTraceContextPropagator;\n//# sourceMappingURL=W3CTraceContextPropagator.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getRPCMetadata = exports.deleteRPCMetadata = exports.setRPCMetadata = exports.RPCType = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\nconst RPC_METADATA_KEY = (0, api_1.createContextKey)('OpenTelemetry SDK Context Key RPC_METADATA');\nvar RPCType;\n(function (RPCType) {\n    RPCType[\"HTTP\"] = \"http\";\n})(RPCType = exports.RPCType || (exports.RPCType = {}));\nfunction setRPCMetadata(context, meta) {\n    return context.setValue(RPC_METADATA_KEY, meta);\n}\nexports.setRPCMetadata = setRPCMetadata;\nfunction deleteRPCMetadata(context) {\n    return context.deleteValue(RPC_METADATA_KEY);\n}\nexports.deleteRPCMetadata = deleteRPCMetadata;\nfunction getRPCMetadata(context) {\n    return context.getValue(RPC_METADATA_KEY);\n}\nexports.getRPCMetadata = getRPCMetadata;\n//# sourceMappingURL=rpc-metadata.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AlwaysOffSampler = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\n/**\n * @deprecated Use the one defined in @opentelemetry/sdk-trace-base instead.\n * Sampler that samples no traces.\n */\nclass AlwaysOffSampler {\n    shouldSample() {\n        return {\n            decision: api_1.SamplingDecision.NOT_RECORD,\n        };\n    }\n    toString() {\n        return 'AlwaysOffSampler';\n    }\n}\nexports.AlwaysOffSampler = AlwaysOffSampler;\n//# sourceMappingURL=AlwaysOffSampler.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AlwaysOnSampler = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\n/**\n * @deprecated Use the one defined in @opentelemetry/sdk-trace-base instead.\n * Sampler that samples all traces.\n */\nclass AlwaysOnSampler {\n    shouldSample() {\n        return {\n            decision: api_1.SamplingDecision.RECORD_AND_SAMPLED,\n        };\n    }\n    toString() {\n        return 'AlwaysOnSampler';\n    }\n}\nexports.AlwaysOnSampler = AlwaysOnSampler;\n//# sourceMappingURL=AlwaysOnSampler.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ParentBasedSampler = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\nconst global_error_handler_1 = require(\"../../common/global-error-handler\");\nconst AlwaysOffSampler_1 = require(\"./AlwaysOffSampler\");\nconst AlwaysOnSampler_1 = require(\"./AlwaysOnSampler\");\n/**\n * @deprecated Use the one defined in @opentelemetry/sdk-trace-base instead.\n * A composite sampler that either respects the parent span's sampling decision\n * or delegates to `delegateSampler` for root spans.\n */\nclass ParentBasedSampler {\n    constructor(config) {\n        var _a, _b, _c, _d;\n        this._root = config.root;\n        if (!this._root) {\n            (0, global_error_handler_1.globalErrorHandler)(new Error('ParentBasedSampler must have a root sampler configured'));\n            this._root = new AlwaysOnSampler_1.AlwaysOnSampler();\n        }\n        this._remoteParentSampled =\n            (_a = config.remoteParentSampled) !== null && _a !== void 0 ? _a : new AlwaysOnSampler_1.AlwaysOnSampler();\n        this._remoteParentNotSampled =\n            (_b = config.remoteParentNotSampled) !== null && _b !== void 0 ? _b : new AlwaysOffSampler_1.AlwaysOffSampler();\n        this._localParentSampled =\n            (_c = config.localParentSampled) !== null && _c !== void 0 ? _c : new AlwaysOnSampler_1.AlwaysOnSampler();\n        this._localParentNotSampled =\n            (_d = config.localParentNotSampled) !== null && _d !== void 0 ? _d : new AlwaysOffSampler_1.AlwaysOffSampler();\n    }\n    shouldSample(context, traceId, spanName, spanKind, attributes, links) {\n        const parentContext = api_1.trace.getSpanContext(context);\n        if (!parentContext || !(0, api_1.isSpanContextValid)(parentContext)) {\n            return this._root.shouldSample(context, traceId, spanName, spanKind, attributes, links);\n        }\n        if (parentContext.isRemote) {\n            if (parentContext.traceFlags & api_1.TraceFlags.SAMPLED) {\n                return this._remoteParentSampled.shouldSample(context, traceId, spanName, spanKind, attributes, links);\n            }\n            return this._remoteParentNotSampled.shouldSample(context, traceId, spanName, spanKind, attributes, links);\n        }\n        if (parentContext.traceFlags & api_1.TraceFlags.SAMPLED) {\n            return this._localParentSampled.shouldSample(context, traceId, spanName, spanKind, attributes, links);\n        }\n        return this._localParentNotSampled.shouldSample(context, traceId, spanName, spanKind, attributes, links);\n    }\n    toString() {\n        return `ParentBased{root=${this._root.toString()}, remoteParentSampled=${this._remoteParentSampled.toString()}, remoteParentNotSampled=${this._remoteParentNotSampled.toString()}, localParentSampled=${this._localParentSampled.toString()}, localParentNotSampled=${this._localParentNotSampled.toString()}}`;\n    }\n}\nexports.ParentBasedSampler = ParentBasedSampler;\n//# sourceMappingURL=ParentBasedSampler.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TraceIdRatioBasedSampler = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\n/**\n * @deprecated Use the one defined in @opentelemetry/sdk-trace-base instead.\n * Sampler that samples a given fraction of traces based of trace id deterministically.\n */\nclass TraceIdRatioBasedSampler {\n    constructor(_ratio = 0) {\n        this._ratio = _ratio;\n        this._ratio = this._normalize(_ratio);\n        this._upperBound = Math.floor(this._ratio * 0xffffffff);\n    }\n    shouldSample(context, traceId) {\n        return {\n            decision: (0, api_1.isValidTraceId)(traceId) && this._accumulate(traceId) < this._upperBound\n                ? api_1.SamplingDecision.RECORD_AND_SAMPLED\n                : api_1.SamplingDecision.NOT_RECORD,\n        };\n    }\n    toString() {\n        return `TraceIdRatioBased{${this._ratio}}`;\n    }\n    _normalize(ratio) {\n        if (typeof ratio !== 'number' || isNaN(ratio))\n            return 0;\n        return ratio >= 1 ? 1 : ratio <= 0 ? 0 : ratio;\n    }\n    _accumulate(traceId) {\n        let accumulation = 0;\n        for (let i = 0; i < traceId.length / 8; i++) {\n            const pos = i * 8;\n            const part = parseInt(traceId.slice(pos, pos + 8), 16);\n            accumulation = (accumulation ^ part) >>> 0;\n        }\n        return accumulation;\n    }\n}\nexports.TraceIdRatioBasedSampler = TraceIdRatioBasedSampler;\n//# sourceMappingURL=TraceIdRatioBasedSampler.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isPlainObject = void 0;\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/**\n * based on lodash in order to support esm builds without esModuleInterop.\n * lodash is using MIT License.\n **/\nconst objectTag = '[object Object]';\nconst nullTag = '[object Null]';\nconst undefinedTag = '[object Undefined]';\nconst funcProto = Function.prototype;\nconst funcToString = funcProto.toString;\nconst objectCtorString = funcToString.call(Object);\nconst getPrototype = overArg(Object.getPrototypeOf, Object);\nconst objectProto = Object.prototype;\nconst hasOwnProperty = objectProto.hasOwnProperty;\nconst symToStringTag = Symbol ? Symbol.toStringTag : undefined;\nconst nativeObjectToString = objectProto.toString;\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n    return function (arg) {\n        return func(transform(arg));\n    };\n}\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n    if (!isObjectLike(value) || baseGetTag(value) !== objectTag) {\n        return false;\n    }\n    const proto = getPrototype(value);\n    if (proto === null) {\n        return true;\n    }\n    const Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n    return (typeof Ctor == 'function' &&\n        Ctor instanceof Ctor &&\n        funcToString.call(Ctor) === objectCtorString);\n}\nexports.isPlainObject = isPlainObject;\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n    return value != null && typeof value == 'object';\n}\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n    if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n    }\n    return symToStringTag && symToStringTag in Object(value)\n        ? getRawTag(value)\n        : objectToString(value);\n}\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n    const isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];\n    let unmasked = false;\n    try {\n        value[symToStringTag] = undefined;\n        unmasked = true;\n    }\n    catch (e) {\n        // silence\n    }\n    const result = nativeObjectToString.call(value);\n    if (unmasked) {\n        if (isOwn) {\n            value[symToStringTag] = tag;\n        }\n        else {\n            delete value[symToStringTag];\n        }\n    }\n    return result;\n}\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n    return nativeObjectToString.call(value);\n}\n//# sourceMappingURL=lodash.merge.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.merge = void 0;\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst lodash_merge_1 = require(\"./lodash.merge\");\nconst MAX_LEVEL = 20;\n/**\n * Merges objects together\n * @param args - objects / values to be merged\n */\nfunction merge(...args) {\n    let result = args.shift();\n    const objects = new WeakMap();\n    while (args.length > 0) {\n        result = mergeTwoObjects(result, args.shift(), 0, objects);\n    }\n    return result;\n}\nexports.merge = merge;\nfunction takeValue(value) {\n    if (isArray(value)) {\n        return value.slice();\n    }\n    return value;\n}\n/**\n * Merges two objects\n * @param one - first object\n * @param two - second object\n * @param level - current deep level\n * @param objects - objects holder that has been already referenced - to prevent\n * cyclic dependency\n */\nfunction mergeTwoObjects(one, two, level = 0, objects) {\n    let result;\n    if (level > MAX_LEVEL) {\n        return undefined;\n    }\n    level++;\n    if (isPrimitive(one) || isPrimitive(two) || isFunction(two)) {\n        result = takeValue(two);\n    }\n    else if (isArray(one)) {\n        result = one.slice();\n        if (isArray(two)) {\n            for (let i = 0, j = two.length; i < j; i++) {\n                result.push(takeValue(two[i]));\n            }\n        }\n        else if (isObject(two)) {\n            const keys = Object.keys(two);\n            for (let i = 0, j = keys.length; i < j; i++) {\n                const key = keys[i];\n                result[key] = takeValue(two[key]);\n            }\n        }\n    }\n    else if (isObject(one)) {\n        if (isObject(two)) {\n            if (!shouldMerge(one, two)) {\n                return two;\n            }\n            result = Object.assign({}, one);\n            const keys = Object.keys(two);\n            for (let i = 0, j = keys.length; i < j; i++) {\n                const key = keys[i];\n                const twoValue = two[key];\n                if (isPrimitive(twoValue)) {\n                    if (typeof twoValue === 'undefined') {\n                        delete result[key];\n                    }\n                    else {\n                        // result[key] = takeValue(twoValue);\n                        result[key] = twoValue;\n                    }\n                }\n                else {\n                    const obj1 = result[key];\n                    const obj2 = twoValue;\n                    if (wasObjectReferenced(one, key, objects) ||\n                        wasObjectReferenced(two, key, objects)) {\n                        delete result[key];\n                    }\n                    else {\n                        if (isObject(obj1) && isObject(obj2)) {\n                            const arr1 = objects.get(obj1) || [];\n                            const arr2 = objects.get(obj2) || [];\n                            arr1.push({ obj: one, key });\n                            arr2.push({ obj: two, key });\n                            objects.set(obj1, arr1);\n                            objects.set(obj2, arr2);\n                        }\n                        result[key] = mergeTwoObjects(result[key], twoValue, level, objects);\n                    }\n                }\n            }\n        }\n        else {\n            result = two;\n        }\n    }\n    return result;\n}\n/**\n * Function to check if object has been already reference\n * @param obj\n * @param key\n * @param objects\n */\nfunction wasObjectReferenced(obj, key, objects) {\n    const arr = objects.get(obj[key]) || [];\n    for (let i = 0, j = arr.length; i < j; i++) {\n        const info = arr[i];\n        if (info.key === key && info.obj === obj) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction isArray(value) {\n    return Array.isArray(value);\n}\nfunction isFunction(value) {\n    return typeof value === 'function';\n}\nfunction isObject(value) {\n    return (!isPrimitive(value) &&\n        !isArray(value) &&\n        !isFunction(value) &&\n        typeof value === 'object');\n}\nfunction isPrimitive(value) {\n    return (typeof value === 'string' ||\n        typeof value === 'number' ||\n        typeof value === 'boolean' ||\n        typeof value === 'undefined' ||\n        value instanceof Date ||\n        value instanceof RegExp ||\n        value === null);\n}\nfunction shouldMerge(one, two) {\n    if (!(0, lodash_merge_1.isPlainObject)(one) || !(0, lodash_merge_1.isPlainObject)(two)) {\n        return false;\n    }\n    return true;\n}\n//# sourceMappingURL=merge.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.callWithTimeout = exports.TimeoutError = void 0;\n/**\n * Error that is thrown on timeouts.\n */\nclass TimeoutError extends Error {\n    constructor(message) {\n        super(message);\n        // manually adjust prototype to retain `instanceof` functionality when targeting ES5, see:\n        // https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n        Object.setPrototypeOf(this, TimeoutError.prototype);\n    }\n}\nexports.TimeoutError = TimeoutError;\n/**\n * Adds a timeout to a promise and rejects if the specified timeout has elapsed. Also rejects if the specified promise\n * rejects, and resolves if the specified promise resolves.\n *\n * <p> NOTE: this operation will continue even after it throws a {@link TimeoutError}.\n *\n * @param promise promise to use with timeout.\n * @param timeout the timeout in milliseconds until the returned promise is rejected.\n */\nfunction callWithTimeout(promise, timeout) {\n    let timeoutHandle;\n    const timeoutPromise = new Promise(function timeoutFunction(_resolve, reject) {\n        timeoutHandle = setTimeout(function timeoutHandler() {\n            reject(new TimeoutError('Operation timed out.'));\n        }, timeout);\n    });\n    return Promise.race([promise, timeoutPromise]).then(result => {\n        clearTimeout(timeoutHandle);\n        return result;\n    }, reason => {\n        clearTimeout(timeoutHandle);\n        throw reason;\n    });\n}\nexports.callWithTimeout = callWithTimeout;\n//# sourceMappingURL=timeout.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isUrlIgnored = exports.urlMatches = void 0;\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nfunction urlMatches(url, urlToMatch) {\n    if (typeof urlToMatch === 'string') {\n        return url === urlToMatch;\n    }\n    else {\n        return !!url.match(urlToMatch);\n    }\n}\nexports.urlMatches = urlMatches;\n/**\n * Check if {@param url} should be ignored when comparing against {@param ignoredUrls}\n * @param url\n * @param ignoredUrls\n */\nfunction isUrlIgnored(url, ignoredUrls) {\n    if (!ignoredUrls) {\n        return false;\n    }\n    for (const ignoreUrl of ignoredUrls) {\n        if (urlMatches(url, ignoreUrl)) {\n            return true;\n        }\n    }\n    return false;\n}\nexports.isUrlIgnored = isUrlIgnored;\n//# sourceMappingURL=url.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isWrapped = void 0;\n/**\n * Checks if certain function has been already wrapped\n * @param func\n */\nfunction isWrapped(func) {\n    return (typeof func === 'function' &&\n        typeof func.__original === 'function' &&\n        typeof func.__unwrap === 'function' &&\n        func.__wrapped === true);\n}\nexports.isWrapped = isWrapped;\n//# sourceMappingURL=wrap.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Deferred = void 0;\nclass Deferred {\n    constructor() {\n        this._promise = new Promise((resolve, reject) => {\n            this._resolve = resolve;\n            this._reject = reject;\n        });\n    }\n    get promise() {\n        return this._promise;\n    }\n    resolve(val) {\n        this._resolve(val);\n    }\n    reject(err) {\n        this._reject(err);\n    }\n}\nexports.Deferred = Deferred;\n//# sourceMappingURL=promise.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BindOnceFuture = void 0;\nconst promise_1 = require(\"./promise\");\n/**\n * Bind the callback and only invoke the callback once regardless how many times `BindOnceFuture.call` is invoked.\n */\nclass BindOnceFuture {\n    constructor(_callback, _that) {\n        this._callback = _callback;\n        this._that = _that;\n        this._isCalled = false;\n        this._deferred = new promise_1.Deferred();\n    }\n    get isCalled() {\n        return this._isCalled;\n    }\n    get promise() {\n        return this._deferred.promise;\n    }\n    call(...args) {\n        if (!this._isCalled) {\n            this._isCalled = true;\n            try {\n                Promise.resolve(this._callback.call(this._that, ...args)).then(val => this._deferred.resolve(val), err => this._deferred.reject(err));\n            }\n            catch (err) {\n                this._deferred.reject(err);\n            }\n        }\n        return this._deferred.promise;\n    }\n}\nexports.BindOnceFuture = BindOnceFuture;\n//# sourceMappingURL=callback.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports._export = void 0;\nconst api_1 = require(\"@opentelemetry/api\");\nconst suppress_tracing_1 = require(\"../trace/suppress-tracing\");\n/**\n * @internal\n * Shared functionality used by Exporters while exporting data, including suppression of Traces.\n */\nfunction _export(exporter, arg) {\n    return new Promise(resolve => {\n        // prevent downstream exporter calls from generating spans\n        api_1.context.with((0, suppress_tracing_1.suppressTracing)(api_1.context.active()), () => {\n            exporter.export(arg, (result) => {\n                resolve(result);\n            });\n        });\n    });\n}\nexports._export = _export;\n//# sourceMappingURL=exporter.js.map","\"use strict\";\n/*\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT = exports.DEFAULT_ATTRIBUTE_COUNT_LIMIT = exports.TraceState = exports.unsuppressTracing = exports.suppressTracing = exports.isTracingSuppressed = exports.TraceIdRatioBasedSampler = exports.ParentBasedSampler = exports.AlwaysOnSampler = exports.AlwaysOffSampler = exports.setRPCMetadata = exports.getRPCMetadata = exports.deleteRPCMetadata = exports.RPCType = exports.parseTraceParent = exports.W3CTraceContextPropagator = exports.TRACE_STATE_HEADER = exports.TRACE_PARENT_HEADER = exports.CompositePropagator = exports.unrefTimer = exports.otperformance = exports.hexToBase64 = exports.getEnvWithoutDefaults = exports.getEnv = exports._globalThis = exports.SDK_INFO = exports.RandomIdGenerator = exports.baggageUtils = exports.ExportResultCode = exports.hexToBinary = exports.timeInputToHrTime = exports.millisToHrTime = exports.isTimeInputHrTime = exports.isTimeInput = exports.hrTimeToTimeStamp = exports.hrTimeToNanoseconds = exports.hrTimeToMilliseconds = exports.hrTimeToMicroseconds = exports.hrTimeDuration = exports.hrTime = exports.getTimeOrigin = exports.addHrTimes = exports.loggingErrorHandler = exports.setGlobalErrorHandler = exports.globalErrorHandler = exports.sanitizeAttributes = exports.isAttributeValue = exports.isAttributeKey = exports.AnchoredClock = exports.W3CBaggagePropagator = void 0;\nexports.internal = exports.VERSION = exports.BindOnceFuture = exports.isWrapped = exports.urlMatches = exports.isUrlIgnored = exports.callWithTimeout = exports.TimeoutError = exports.TracesSamplerValues = exports.merge = exports.parseEnvironment = exports.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT = exports.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT = exports.DEFAULT_ENVIRONMENT = void 0;\nvar W3CBaggagePropagator_1 = require(\"./baggage/propagation/W3CBaggagePropagator\");\nObject.defineProperty(exports, \"W3CBaggagePropagator\", { enumerable: true, get: function () { return W3CBaggagePropagator_1.W3CBaggagePropagator; } });\nvar anchored_clock_1 = require(\"./common/anchored-clock\");\nObject.defineProperty(exports, \"AnchoredClock\", { enumerable: true, get: function () { return anchored_clock_1.AnchoredClock; } });\nvar attributes_1 = require(\"./common/attributes\");\nObject.defineProperty(exports, \"isAttributeKey\", { enumerable: true, get: function () { return attributes_1.isAttributeKey; } });\nObject.defineProperty(exports, \"isAttributeValue\", { enumerable: true, get: function () { return attributes_1.isAttributeValue; } });\nObject.defineProperty(exports, \"sanitizeAttributes\", { enumerable: true, get: function () { return attributes_1.sanitizeAttributes; } });\nvar global_error_handler_1 = require(\"./common/global-error-handler\");\nObject.defineProperty(exports, \"globalErrorHandler\", { enumerable: true, get: function () { return global_error_handler_1.globalErrorHandler; } });\nObject.defineProperty(exports, \"setGlobalErrorHandler\", { enumerable: true, get: function () { return global_error_handler_1.setGlobalErrorHandler; } });\nvar logging_error_handler_1 = require(\"./common/logging-error-handler\");\nObject.defineProperty(exports, \"loggingErrorHandler\", { enumerable: true, get: function () { return logging_error_handler_1.loggingErrorHandler; } });\nvar time_1 = require(\"./common/time\");\nObject.defineProperty(exports, \"addHrTimes\", { enumerable: true, get: function () { return time_1.addHrTimes; } });\nObject.defineProperty(exports, \"getTimeOrigin\", { enumerable: true, get: function () { return time_1.getTimeOrigin; } });\nObject.defineProperty(exports, \"hrTime\", { enumerable: true, get: function () { return time_1.hrTime; } });\nObject.defineProperty(exports, \"hrTimeDuration\", { enumerable: true, get: function () { return time_1.hrTimeDuration; } });\nObject.defineProperty(exports, \"hrTimeToMicroseconds\", { enumerable: true, get: function () { return time_1.hrTimeToMicroseconds; } });\nObject.defineProperty(exports, \"hrTimeToMilliseconds\", { enumerable: true, get: function () { return time_1.hrTimeToMilliseconds; } });\nObject.defineProperty(exports, \"hrTimeToNanoseconds\", { enumerable: true, get: function () { return time_1.hrTimeToNanoseconds; } });\nObject.defineProperty(exports, \"hrTimeToTimeStamp\", { enumerable: true, get: function () { return time_1.hrTimeToTimeStamp; } });\nObject.defineProperty(exports, \"isTimeInput\", { enumerable: true, get: function () { return time_1.isTimeInput; } });\nObject.defineProperty(exports, \"isTimeInputHrTime\", { enumerable: true, get: function () { return time_1.isTimeInputHrTime; } });\nObject.defineProperty(exports, \"millisToHrTime\", { enumerable: true, get: function () { return time_1.millisToHrTime; } });\nObject.defineProperty(exports, \"timeInputToHrTime\", { enumerable: true, get: function () { return time_1.timeInputToHrTime; } });\nvar hex_to_binary_1 = require(\"./common/hex-to-binary\");\nObject.defineProperty(exports, \"hexToBinary\", { enumerable: true, get: function () { return hex_to_binary_1.hexToBinary; } });\nvar ExportResult_1 = require(\"./ExportResult\");\nObject.defineProperty(exports, \"ExportResultCode\", { enumerable: true, get: function () { return ExportResult_1.ExportResultCode; } });\nconst utils_1 = require(\"./baggage/utils\");\nexports.baggageUtils = {\n    getKeyPairs: utils_1.getKeyPairs,\n    serializeKeyPairs: utils_1.serializeKeyPairs,\n    parseKeyPairsIntoRecord: utils_1.parseKeyPairsIntoRecord,\n    parsePairKeyValue: utils_1.parsePairKeyValue,\n};\nvar platform_1 = require(\"./platform\");\nObject.defineProperty(exports, \"RandomIdGenerator\", { enumerable: true, get: function () { return platform_1.RandomIdGenerator; } });\nObject.defineProperty(exports, \"SDK_INFO\", { enumerable: true, get: function () { return platform_1.SDK_INFO; } });\nObject.defineProperty(exports, \"_globalThis\", { enumerable: true, get: function () { return platform_1._globalThis; } });\nObject.defineProperty(exports, \"getEnv\", { enumerable: true, get: function () { return platform_1.getEnv; } });\nObject.defineProperty(exports, \"getEnvWithoutDefaults\", { enumerable: true, get: function () { return platform_1.getEnvWithoutDefaults; } });\nObject.defineProperty(exports, \"hexToBase64\", { enumerable: true, get: function () { return platform_1.hexToBase64; } });\nObject.defineProperty(exports, \"otperformance\", { enumerable: true, get: function () { return platform_1.otperformance; } });\nObject.defineProperty(exports, \"unrefTimer\", { enumerable: true, get: function () { return platform_1.unrefTimer; } });\nvar composite_1 = require(\"./propagation/composite\");\nObject.defineProperty(exports, \"CompositePropagator\", { enumerable: true, get: function () { return composite_1.CompositePropagator; } });\nvar W3CTraceContextPropagator_1 = require(\"./trace/W3CTraceContextPropagator\");\nObject.defineProperty(exports, \"TRACE_PARENT_HEADER\", { enumerable: true, get: function () { return W3CTraceContextPropagator_1.TRACE_PARENT_HEADER; } });\nObject.defineProperty(exports, \"TRACE_STATE_HEADER\", { enumerable: true, get: function () { return W3CTraceContextPropagator_1.TRACE_STATE_HEADER; } });\nObject.defineProperty(exports, \"W3CTraceContextPropagator\", { enumerable: true, get: function () { return W3CTraceContextPropagator_1.W3CTraceContextPropagator; } });\nObject.defineProperty(exports, \"parseTraceParent\", { enumerable: true, get: function () { return W3CTraceContextPropagator_1.parseTraceParent; } });\nvar rpc_metadata_1 = require(\"./trace/rpc-metadata\");\nObject.defineProperty(exports, \"RPCType\", { enumerable: true, get: function () { return rpc_metadata_1.RPCType; } });\nObject.defineProperty(exports, \"deleteRPCMetadata\", { enumerable: true, get: function () { return rpc_metadata_1.deleteRPCMetadata; } });\nObject.defineProperty(exports, \"getRPCMetadata\", { enumerable: true, get: function () { return rpc_metadata_1.getRPCMetadata; } });\nObject.defineProperty(exports, \"setRPCMetadata\", { enumerable: true, get: function () { return rpc_metadata_1.setRPCMetadata; } });\nvar AlwaysOffSampler_1 = require(\"./trace/sampler/AlwaysOffSampler\");\nObject.defineProperty(exports, \"AlwaysOffSampler\", { enumerable: true, get: function () { return AlwaysOffSampler_1.AlwaysOffSampler; } });\nvar AlwaysOnSampler_1 = require(\"./trace/sampler/AlwaysOnSampler\");\nObject.defineProperty(exports, \"AlwaysOnSampler\", { enumerable: true, get: function () { return AlwaysOnSampler_1.AlwaysOnSampler; } });\nvar ParentBasedSampler_1 = require(\"./trace/sampler/ParentBasedSampler\");\nObject.defineProperty(exports, \"ParentBasedSampler\", { enumerable: true, get: function () { return ParentBasedSampler_1.ParentBasedSampler; } });\nvar TraceIdRatioBasedSampler_1 = require(\"./trace/sampler/TraceIdRatioBasedSampler\");\nObject.defineProperty(exports, \"TraceIdRatioBasedSampler\", { enumerable: true, get: function () { return TraceIdRatioBasedSampler_1.TraceIdRatioBasedSampler; } });\nvar suppress_tracing_1 = require(\"./trace/suppress-tracing\");\nObject.defineProperty(exports, \"isTracingSuppressed\", { enumerable: true, get: function () { return suppress_tracing_1.isTracingSuppressed; } });\nObject.defineProperty(exports, \"suppressTracing\", { enumerable: true, get: function () { return suppress_tracing_1.suppressTracing; } });\nObject.defineProperty(exports, \"unsuppressTracing\", { enumerable: true, get: function () { return suppress_tracing_1.unsuppressTracing; } });\nvar TraceState_1 = require(\"./trace/TraceState\");\nObject.defineProperty(exports, \"TraceState\", { enumerable: true, get: function () { return TraceState_1.TraceState; } });\nvar environment_1 = require(\"./utils/environment\");\nObject.defineProperty(exports, \"DEFAULT_ATTRIBUTE_COUNT_LIMIT\", { enumerable: true, get: function () { return environment_1.DEFAULT_ATTRIBUTE_COUNT_LIMIT; } });\nObject.defineProperty(exports, \"DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT\", { enumerable: true, get: function () { return environment_1.DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT; } });\nObject.defineProperty(exports, \"DEFAULT_ENVIRONMENT\", { enumerable: true, get: function () { return environment_1.DEFAULT_ENVIRONMENT; } });\nObject.defineProperty(exports, \"DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT\", { enumerable: true, get: function () { return environment_1.DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT; } });\nObject.defineProperty(exports, \"DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT\", { enumerable: true, get: function () { return environment_1.DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT; } });\nObject.defineProperty(exports, \"parseEnvironment\", { enumerable: true, get: function () { return environment_1.parseEnvironment; } });\nvar merge_1 = require(\"./utils/merge\");\nObject.defineProperty(exports, \"merge\", { enumerable: true, get: function () { return merge_1.merge; } });\nvar sampling_1 = require(\"./utils/sampling\");\nObject.defineProperty(exports, \"TracesSamplerValues\", { enumerable: true, get: function () { return sampling_1.TracesSamplerValues; } });\nvar timeout_1 = require(\"./utils/timeout\");\nObject.defineProperty(exports, \"TimeoutError\", { enumerable: true, get: function () { return timeout_1.TimeoutError; } });\nObject.defineProperty(exports, \"callWithTimeout\", { enumerable: true, get: function () { return timeout_1.callWithTimeout; } });\nvar url_1 = require(\"./utils/url\");\nObject.defineProperty(exports, \"isUrlIgnored\", { enumerable: true, get: function () { return url_1.isUrlIgnored; } });\nObject.defineProperty(exports, \"urlMatches\", { enumerable: true, get: function () { return url_1.urlMatches; } });\nvar wrap_1 = require(\"./utils/wrap\");\nObject.defineProperty(exports, \"isWrapped\", { enumerable: true, get: function () { return wrap_1.isWrapped; } });\nvar callback_1 = require(\"./utils/callback\");\nObject.defineProperty(exports, \"BindOnceFuture\", { enumerable: true, get: function () { return callback_1.BindOnceFuture; } });\nvar version_1 = require(\"./version\");\nObject.defineProperty(exports, \"VERSION\", { enumerable: true, get: function () { return version_1.VERSION; } });\nconst exporter_1 = require(\"./internal/exporter\");\nexports.internal = {\n    _export: exporter_1._export,\n};\n//# sourceMappingURL=index.js.map","import { ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { SpanKind as OtSpanKind } from \"@opentelemetry/api\";\nimport { JsonSchemaHelper, JsonSchemaType, JsonSchema } from \"./JsonSchemaHelper\";\nimport { CleanSpanData, MetadataObject, TdSpanAttributes } from \"../types\";\nimport { PackageType, StatusCode } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger, OriginalGlobalUtils } from \"../utils\";\n\n/**\n * Utility class for transforming OpenTelemetry spans to CleanSpanData\n */\nexport class SpanTransformer {\n  /**\n   * Transform OpenTelemetry span to clean JSON format with compile-time type safety\n   * Return type is derived from protobuf schema but uses clean JSON.\n   * We use JSON because serialized protobuf is extremely verbose and not readable.\n   */\n  static transformSpanToCleanJSON(span: ReadableSpan): CleanSpanData {\n    const isRootSpan = !span.parentSpanId || span.kind === OtSpanKind.SERVER;\n\n    // Extract data from span attributes\n    const attributes = span.attributes;\n    const packageName = SpanTransformer.extractPackageName(attributes);\n    const instrumentationName = SpanTransformer.extractInstrumentationName(span, attributes);\n    const submoduleName = SpanTransformer.extractSubmoduleName(attributes);\n\n    // Process input data\n    const inputValueString = attributes[TdSpanAttributes.INPUT_VALUE] as string;\n    const inputData = JSON.parse(inputValueString);\n\n    // Extract input schema merges if they exist\n    const inputSchemaMergesString = attributes[TdSpanAttributes.INPUT_SCHEMA_MERGES] as string;\n    const inputSchemaMerges = inputSchemaMergesString\n      ? JSON.parse(inputSchemaMergesString)\n      : undefined;\n\n    const {\n      schema: inputSchema,\n      decodedValueHash: inputValueHash,\n      decodedSchemaHash: inputSchemaHash,\n    } = JsonSchemaHelper.generateSchemaAndHash(inputData, inputSchemaMerges);\n\n    // Process output data\n    let outputData: unknown = {};\n    let outputSchema: JsonSchema = { type: JsonSchemaType.OBJECT, properties: {} };\n    let outputValueHash: string = \"\";\n    let outputSchemaHash: string = \"\";\n\n    if (attributes[TdSpanAttributes.OUTPUT_VALUE]) {\n      const outputValueString = attributes[TdSpanAttributes.OUTPUT_VALUE] as string;\n      outputData = JSON.parse(outputValueString);\n\n      // Extract output schema merges if they exist\n      const outputSchemaMergesString = attributes[TdSpanAttributes.OUTPUT_SCHEMA_MERGES] as string;\n      const outputSchemaMerges = outputSchemaMergesString\n        ? JSON.parse(outputSchemaMergesString)\n        : undefined;\n\n      ({\n        schema: outputSchema,\n        decodedValueHash: outputValueHash,\n        decodedSchemaHash: outputSchemaHash,\n      } = JsonSchemaHelper.generateSchemaAndHash(outputData, outputSchemaMerges));\n    } else {\n      ({\n        schema: outputSchema,\n        decodedValueHash: outputValueHash,\n        decodedSchemaHash: outputSchemaHash,\n      } = JsonSchemaHelper.generateSchemaAndHash(outputData));\n    }\n\n    let metadata: MetadataObject | undefined = undefined;\n    if (attributes[TdSpanAttributes.METADATA]) {\n      metadata = JSON.parse(attributes[TdSpanAttributes.METADATA] as string);\n    }\n\n    let transformMetadata;\n    const transformMetadataString = attributes[TdSpanAttributes.TRANSFORM_METADATA] as\n      | string\n      | undefined;\n    if (transformMetadataString) {\n      try {\n        transformMetadata = JSON.parse(transformMetadataString);\n      } catch (error) {\n        logger.warn(\"[SpanTransformer] Failed to parse transform metadata\", error);\n      }\n    }\n\n    const originalDate = OriginalGlobalUtils.getOriginalDate();\n\n    return {\n      traceId: span.spanContext().traceId,\n      spanId: span.spanContext().spanId,\n      parentSpanId: span.parentSpanId || \"\",\n\n      name: attributes[TdSpanAttributes.NAME] as string,\n\n      packageName,\n      instrumentationName,\n      submoduleName: submoduleName || \"\",\n\n      packageType: (attributes[TdSpanAttributes.PACKAGE_TYPE] as PackageType) || undefined,\n\n      inputValue: inputData,\n      outputValue: outputData,\n      inputSchema,\n      outputSchema,\n\n      inputSchemaHash,\n      outputSchemaHash,\n      inputValueHash,\n      outputValueHash,\n\n      kind: span.kind,\n\n      status: {\n        code: span.status.code === 1 ? StatusCode.OK : StatusCode.ERROR,\n        message: span.status.message || \"\",\n      },\n\n      isPreAppStart: attributes[TdSpanAttributes.IS_PRE_APP_START] === true,\n\n      timestamp: {\n        seconds: Math.floor(originalDate.getTime() / 1000),\n        nanos: (originalDate.getTime() % 1000) * 1000000,\n      },\n      duration: {\n        seconds: span.duration[0],\n        nanos: span.duration[1],\n      },\n      isRootSpan,\n      metadata,\n      transformMetadata,\n    } satisfies CleanSpanData;\n  }\n\n  /**\n   * Extract package name from attributes or instrumentation library\n   */\n  private static extractPackageName(attributes: Record<string, unknown>): string {\n    // Check for explicit package name in attributes\n    if (attributes[TdSpanAttributes.PACKAGE_NAME]) {\n      return attributes[TdSpanAttributes.PACKAGE_NAME] as string;\n    }\n\n    return \"unknown\";\n  }\n\n  /**\n   * Extract instrumentation name from span data\n   */\n  private static extractInstrumentationName(\n    span: ReadableSpan,\n    attributes: Record<string, unknown>,\n  ): string {\n    // Check for explicit instrumentation name in attributes\n    if (attributes[TdSpanAttributes.INSTRUMENTATION_NAME]) {\n      return attributes[TdSpanAttributes.INSTRUMENTATION_NAME] as string;\n    }\n\n    // Generate from library name or type\n    if (span.instrumentationLibrary?.name) {\n      return `tusk-instrumentation-${span.instrumentationLibrary.name}`;\n    }\n\n    // Generate from detected package\n    const packageName = SpanTransformer.extractPackageName(attributes);\n    return `tusk-instrumentation-${packageName}`;\n  }\n\n  /**\n   * Extract submodule name from attributes\n   */\n  private static extractSubmoduleName(attributes: Record<string, unknown>): string | undefined {\n    // Check for explicit submodule in attributes\n    if (attributes[TdSpanAttributes.SUBMODULE_NAME]) {\n      return attributes[TdSpanAttributes.SUBMODULE_NAME] as string;\n    }\n\n    return undefined;\n  }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { ExportResult, ExportResultCode } from \"@opentelemetry/core\";\nimport type { SpanExportAdapter } from \"../TdSpanExporter\";\nimport { CleanSpanData } from \"../../types\";\nimport { logger } from \"../../utils/logger\";\n\nexport interface FilesystemSpanAdapterConfig {\n  baseDirectory: string;\n}\n\n/**\n * Exports spans to local JSONL files organized by trace ID\n */\nexport class FilesystemSpanAdapter implements SpanExportAdapter {\n  readonly name = \"filesystem\";\n  private baseDirectory: string;\n  private traceFileMap: Map<string, string> = new Map();\n\n  constructor(config: FilesystemSpanAdapterConfig) {\n    this.baseDirectory = config.baseDirectory;\n\n    // Initialize file system\n    if (!fs.existsSync(this.baseDirectory)) {\n      fs.mkdirSync(this.baseDirectory, { recursive: true });\n    }\n  }\n\n  async exportSpans(spans: CleanSpanData[]): Promise<ExportResult> {\n    try {\n      for (const span of spans) {\n        const traceId = span.traceId;\n\n        // Get or create file path for this trace ID\n        let filePath = this.traceFileMap.get(traceId);\n\n        if (!filePath) {\n          const isoTimestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n          filePath = path.join(this.baseDirectory, `${isoTimestamp}_trace_${traceId}.jsonl`);\n          this.traceFileMap.set(traceId, filePath);\n        }\n\n        const jsonLine = JSON.stringify(span) + \"\\n\";\n        fs.appendFileSync(filePath, jsonLine, \"utf8\");\n      }\n\n      logger.debug(\n        `Exported ${spans.length} span(s) to trace-specific files in ${this.baseDirectory}`,\n      );\n\n      return { code: ExportResultCode.SUCCESS };\n    } catch (error) {\n      logger.error(`Failed to export spans to local files:`, error);\n      return {\n        code: ExportResultCode.FAILED,\n        error: error instanceof Error ? error : new Error(\"Filesystem export failed\"),\n      };\n    }\n  }\n\n  async shutdown(): Promise<void> {\n    // No cleanup needed for filesystem exporter\n    return Promise.resolve();\n  }\n}\n","import { ExportResult, ExportResultCode } from \"@opentelemetry/core\";\nimport type { SpanExportAdapter } from \"../TdSpanExporter\";\nimport { CleanSpanData } from \"../../types\";\nimport { SpanExportServiceClient } from \"@use-tusk/drift-schemas/backend/span_export_service.client\";\nimport { ExportSpansRequest } from \"@use-tusk/drift-schemas/backend/span_export_service\";\nimport { TwirpFetchTransport } from \"@protobuf-ts/twirp-transport\";\nimport { Span, PackageType, SpanKind as DriftSpanKind } from \"@use-tusk/drift-schemas/core/span\";\nimport { SpanKind as OtelSpanKind } from \"@opentelemetry/api\";\nimport { toStruct } from \"../../utils/protobufUtils\";\nimport { logger } from \"../../utils/logger\";\n\nexport interface ApiSpanAdapterConfig {\n  apiKey: string;\n  tuskBackendBaseUrl: string;\n  observableServiceId: string;\n  environment: string;\n  sdkVersion: string;\n  sdkInstanceId: string;\n}\n\nconst DRIFT_API_PATH = \"/api/drift\";\n\n/**\n * Exports spans to Tusk backend API via protobuf\n */\nexport class ApiSpanAdapter implements SpanExportAdapter {\n  readonly name = \"api\";\n  private spanExportClient: SpanExportServiceClient;\n  private observableServiceId: string;\n  private environment: string;\n  private sdkVersion: string;\n  private sdkInstanceId: string;\n\n  constructor(config: ApiSpanAdapterConfig) {\n    this.observableServiceId = config.observableServiceId;\n    this.environment = config.environment;\n    this.sdkVersion = config.sdkVersion;\n    this.sdkInstanceId = config.sdkInstanceId;\n\n    const transport = new TwirpFetchTransport({\n      baseUrl: `${config.tuskBackendBaseUrl}${DRIFT_API_PATH}`,\n      meta: {\n        \"x-api-key\": config.apiKey,\n        \"x-td-skip-instrumentation\": \"true\",\n      },\n    });\n    this.spanExportClient = new SpanExportServiceClient(transport);\n\n    logger.debug(\"ApiSpanAdapter initialized\");\n  }\n\n  async exportSpans(spans: CleanSpanData[]): Promise<ExportResult> {\n    try {\n      // Transform spans to protobuf format\n      const protoSpans: Span[] = spans.map(span => this.transformSpanToProtobuf(span));\n\n      const request: ExportSpansRequest = {\n        observableServiceId: this.observableServiceId,\n        environment: this.environment,\n        sdkVersion: this.sdkVersion,\n        sdkInstanceId: this.sdkInstanceId,\n        spans: protoSpans,\n      };\n\n      const response = await this.spanExportClient.exportSpans(request);\n\n      if (!response.response.success) {\n        throw new Error(`Remote export failed: ${response.response.message}`);\n      }\n\n      logger.debug(`Successfully exported ${spans.length} spans to remote endpoint`);\n      return { code: ExportResultCode.SUCCESS };\n    } catch (error) {\n      logger.error(`Failed to export spans to remote:`, error);\n      return {\n        code: ExportResultCode.FAILED,\n        error: error instanceof Error ? error : new Error(\"API export failed\"),\n      };\n    }\n  }\n\n  private transformSpanToProtobuf(cleanSpan: CleanSpanData): Span {\n    return {\n      traceId: cleanSpan.traceId,\n      spanId: cleanSpan.spanId,\n      parentSpanId: cleanSpan.parentSpanId,\n      name: cleanSpan.name,\n      packageName: cleanSpan.packageName,\n      instrumentationName: cleanSpan.instrumentationName,\n      submoduleName: cleanSpan.submoduleName,\n      packageType: cleanSpan.packageType || PackageType.UNSPECIFIED,\n      inputValue: toStruct(cleanSpan.inputValue),\n      outputValue: toStruct(cleanSpan.outputValue),\n      inputSchema: cleanSpan.inputSchema,\n      outputSchema: cleanSpan.outputSchema,\n      inputSchemaHash: cleanSpan.inputSchemaHash || \"\",\n      outputSchemaHash: cleanSpan.outputSchemaHash || \"\",\n      inputValueHash: cleanSpan.inputValueHash || \"\",\n      outputValueHash: cleanSpan.outputValueHash || \"\",\n      kind: this.mapSpanKind(cleanSpan.kind),\n      status: cleanSpan.status,\n      isPreAppStart: cleanSpan.isPreAppStart,\n      timestamp: { seconds: BigInt(cleanSpan.timestamp.seconds), nanos: cleanSpan.timestamp.nanos },\n      duration: { seconds: BigInt(cleanSpan.duration.seconds), nanos: cleanSpan.duration.nanos },\n      isRootSpan: cleanSpan.isRootSpan,\n      metadata: toStruct(cleanSpan.metadata),\n    };\n  }\n\n  private mapSpanKind(kind: OtelSpanKind): DriftSpanKind {\n    switch (kind) {\n      case OtelSpanKind.CLIENT:\n        return DriftSpanKind.CLIENT;\n      case OtelSpanKind.SERVER:\n        return DriftSpanKind.SERVER;\n      case OtelSpanKind.PRODUCER:\n        return DriftSpanKind.PRODUCER;\n      case OtelSpanKind.CONSUMER:\n        return DriftSpanKind.CONSUMER;\n      case OtelSpanKind.INTERNAL:\n        return DriftSpanKind.INTERNAL;\n      default:\n        return DriftSpanKind.UNSPECIFIED;\n    }\n  }\n\n  async shutdown(): Promise<void> {\n    // No cleanup needed for API exporter\n    return Promise.resolve();\n  }\n}\n","import { SpanExporter, ReadableSpan } from \"@opentelemetry/sdk-trace-base\";\nimport { ExportResult, ExportResultCode } from \"@opentelemetry/core\";\nimport { TuskDriftMode } from \"../TuskDrift\";\nimport { SpanTransformer } from \"./SpanTransformer\";\nimport { FilesystemSpanAdapter } from \"./adapters/FilesystemSpanAdapter\";\nimport { ApiSpanAdapter } from \"./adapters/ApiSpanAdapter\";\nimport { logger } from \"../utils/logger\";\nimport { CleanSpanData, TD_INSTRUMENTATION_LIBRARY_NAME, TdSpanAttributes } from \"../types\";\nimport { TraceBlockingManager } from \"./TraceBlockingManager\";\n\nexport interface TdTraceExporterConfig {\n  baseDirectory: string;\n  mode: TuskDriftMode;\n  observableServiceId?: string;\n  useRemoteExport: boolean;\n  apiKey?: string;\n  tuskBackendBaseUrl: string;\n  environment: string;\n  sdkVersion: string;\n  sdkInstanceId: string;\n}\n\n/** A SpanExportAdapter defines the actual thing that exports to api/file/etc.\n * */\nexport interface SpanExportAdapter {\n  name: string;\n  exportSpans(spans: CleanSpanData[]): Promise<ExportResult>;\n  shutdown(): Promise<void>;\n}\n\nexport class TdSpanExporter implements SpanExporter {\n  private mode: TuskDriftMode;\n  private adapters: SpanExportAdapter[] = [];\n\n  constructor(config: TdTraceExporterConfig) {\n    this.mode = config.mode;\n\n    this.setupDefaultAdapters(config);\n\n    logger.debug(`TdSpanExporter initialized with ${this.adapters.length} adapter(s)`);\n  }\n\n  private setupDefaultAdapters(config: TdTraceExporterConfig): void {\n    if (config.useRemoteExport && config.apiKey && config.observableServiceId) {\n      logger.debug(\"TdSpanExporter using API adapter\");\n      this.addAdapter(\n        new ApiSpanAdapter({\n          apiKey: config.apiKey,\n          tuskBackendBaseUrl: config.tuskBackendBaseUrl,\n          observableServiceId: config.observableServiceId,\n          environment: config.environment,\n          sdkVersion: config.sdkVersion,\n          sdkInstanceId: config.sdkInstanceId,\n        }),\n      );\n    } else {\n      logger.debug(\"TdSpanExporter falling back to filesystem adapter\");\n      this.addAdapter(\n        new FilesystemSpanAdapter({\n          baseDirectory: config.baseDirectory,\n        }),\n      );\n    }\n  }\n\n  getAdapters() {\n    return this.adapters;\n  }\n\n  /**\n   * Add a custom export adapter\n   */\n  addAdapter(adapter: SpanExportAdapter): void {\n    this.adapters.push(adapter);\n    logger.debug(`Added ${adapter.name} adapter. Total adapters: ${this.adapters.length}`);\n  }\n\n  /**\n   * Remove a specific adapter\n   */\n  removeAdapter(adapter: SpanExportAdapter): void {\n    const index = this.adapters.indexOf(adapter);\n    if (index > -1) {\n      this.adapters.splice(index, 1);\n      logger.debug(`Removed ${adapter.name} adapter. Total adapters: ${this.adapters.length}`);\n    }\n  }\n\n  /**\n   * Clear all adapters\n   */\n  clearAdapters(): void {\n    this.adapters = [];\n    logger.debug(\"All adapters cleared\");\n  }\n\n  /**\n   * Set the mode for determining which adapters to run\n   */\n  setMode(mode: TuskDriftMode): void {\n    this.mode = mode;\n  }\n\n  /**\n   * Export spans using all configured adapters\n   */\n  export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n    logger.debug(`TdSpanExporter.export() called with ${spans.length} span(s)`);\n\n    const traceBlockingManager = TraceBlockingManager.getInstance();\n\n    const filteredSpansBasedOnLibraryName: ReadableSpan[] = spans.filter((span) => {\n      // Only keep spans created from this SDK\n      // This is set in getTracer in TuskDrift.ts\n      if (span.instrumentationLibrary.name === TD_INSTRUMENTATION_LIBRARY_NAME) {\n        return true;\n      }\n      return false;\n    });\n\n    logger.debug(\n      `After filtering based on library name: ${filteredSpansBasedOnLibraryName.length} span(s) remaining`,\n    );\n\n    const MAX_SPAN_SIZE_MB = 1;\n    const MAX_SPAN_SIZE_BYTES = MAX_SPAN_SIZE_MB * 1024 * 1024;\n\n    const filteredBlockedSpans: ReadableSpan[] = filteredSpansBasedOnLibraryName.filter((span) => {\n      const traceId = span.spanContext().traceId;\n\n      // Early exit: if this trace is already blocked, skip this span\n      if (traceBlockingManager.isTraceBlocked(traceId)) {\n        logger.debug(\n          `Skipping span '${span.name}' (${span.spanContext().spanId}) - trace ${traceId} is blocked`,\n        );\n        return false;\n      }\n\n      const inputValueString = (span.attributes[TdSpanAttributes.INPUT_VALUE] as string) || \"\";\n      const outputValueString = (span.attributes[TdSpanAttributes.OUTPUT_VALUE] as string) || \"\";\n\n      // Calculate approximate size (input + output are the main contributors)\n      // Add a small buffer for other attributes and metadata\n      const inputSize = Buffer.byteLength(inputValueString, \"utf8\");\n      const outputSize = Buffer.byteLength(outputValueString, \"utf8\");\n      const estimatedTotalSize = inputSize + outputSize + 50000; // 50KB buffer for other data\n\n      const estimatedSizeMB = estimatedTotalSize / (1024 * 1024);\n\n      if (estimatedTotalSize > MAX_SPAN_SIZE_BYTES) {\n        // Block this trace to prevent future spans from being created\n        traceBlockingManager.blockTrace(traceId);\n\n        logger.warn(\n          `Blocking trace ${traceId} - span '${span.name}' (${span.spanContext().spanId}) has estimated size ${estimatedSizeMB.toFixed(2)} MB exceeding limit of ${MAX_SPAN_SIZE_MB} MB. Future spans for this trace will be prevented.`,\n        );\n        return false;\n      }\n      return true;\n    });\n\n    logger.debug(\n      `Filtered ${filteredSpansBasedOnLibraryName.length - filteredBlockedSpans.length} blocked/oversized span(s), ${filteredBlockedSpans.length} remaining`,\n    );\n\n    // Transform spans to CleanSpanData\n    const cleanSpans: CleanSpanData[] = filteredBlockedSpans.map((span) =>\n      SpanTransformer.transformSpanToCleanJSON(span),\n    );\n\n    if (this.adapters.length === 0) {\n      logger.debug(\"No adapters configured\");\n      resultCallback({ code: ExportResultCode.SUCCESS });\n      return;\n    }\n\n    // Filter adapters based on mode\n    const activeAdapters = this.getActiveAdapters();\n\n    if (activeAdapters.length === 0) {\n      logger.debug(`No active adapters for mode: ${this.mode}`);\n      resultCallback({ code: ExportResultCode.SUCCESS });\n      return;\n    }\n\n    // Export to all active adapters\n    Promise.all(activeAdapters.map((adapter) => adapter.exportSpans(cleanSpans)))\n      .then(() => resultCallback({ code: ExportResultCode.SUCCESS }))\n      .catch((error) => resultCallback({ code: ExportResultCode.FAILED, error }));\n  }\n\n  private getActiveAdapters(): SpanExportAdapter[] {\n    if (this.mode !== TuskDriftMode.RECORD) {\n      // In non-RECORD mode, only run in-memory and callback adapters\n      return this.adapters.filter(\n        (adapter) => adapter.name === \"in-memory\" || adapter.name === \"callback\",\n      );\n    }\n\n    // In RECORD mode, run all adapters\n    return this.adapters;\n  }\n\n  /**\n   * Shutdown all adapters\n   */\n  async shutdown(): Promise<void> {\n    await Promise.all(this.adapters.map((adapter) => adapter.shutdown()));\n  }\n\n  /**\n   * Force flush any pending spans\n   */\n  async forceFlush(): Promise<void> {\n    // Most adapters write immediately, so nothing to flush\n    return Promise.resolve();\n  }\n}\n","{\n  \"name\": \"@use-tusk/drift-node-sdk\",\n  \"version\": \"0.1.13\",\n  \"description\": \"Node.js SDK for Tusk Drift instrumentation and replay\",\n  \"homepage\": \"https://github.com/Use-Tusk/drift-node-sdk\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Use-Tusk/drift-node-sdk.git\"\n  },\n  \"type\": \"module\",\n  \"files\": [\n    \"dist/**\",\n    \"hook.mjs\"\n  ],\n  \"publishConfig\": {\n    \"access\": \"public\",\n    \"registry\": \"https://registry.npmjs.org/\"\n  },\n  \"main\": \"./dist/index.cjs\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.cts\",\n  \"exports\": {\n    \".\": {\n      \"import\": \"./dist/index.js\",\n      \"require\": \"./dist/index.cjs\"\n    },\n    \"./hook.mjs\": \"./hook.mjs\",\n    \"./package.json\": \"./package.json\"\n  },\n  \"scripts\": {\n    \"postinstall\": \"patch-package\",\n    \"build\": \"npm run typecheck && tsdown\",\n    \"build:watch\": \"tsdown --watch\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"clean\": \"rm -rf dist\",\n    \"lint\": \"eslint 'src/**/*.ts'\",\n    \"lint:fix\": \"eslint 'src/**/*.ts' --fix\",\n    \"test\": \"ava --workerThreads false\",\n    \"test:docker\": \"docker compose -f docker-compose.test.yml up -d --wait\"\n  },\n  \"keywords\": [\n    \"instrumentation\",\n    \"replay\",\n    \"nodejs\",\n    \"typescript\",\n    \"tusk\"\n  ],\n  \"author\": \"\",\n  \"license\": \"Apache-2.0\",\n  \"devDependencies\": {\n    \"@bufbuild/buf\": \"^1.57.0\",\n    \"@grpc/grpc-js\": \"^1.13.4\",\n    \"@grpc/proto-loader\": \"^0.7.15\",\n    \"@types/express\": \"^4.17.21\",\n    \"@types/google-protobuf\": \"^3.15.12\",\n    \"@types/js-yaml\": \"^4.0.9\",\n    \"@types/jsonpath\": \"^0.2.4\",\n    \"@types/jsonwebtoken\": \"^9.0.10\",\n    \"@types/node\": \"^20.19.19\",\n    \"@types/pg\": \"^8.15.5\",\n    \"@types/supertest\": \"^6.0.2\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n    \"@typescript-eslint/parser\": \"^6.0.0\",\n    \"ava\": \"^6.4.1\",\n    \"axios\": \"^1.6.0\",\n    \"eslint\": \"^8.57.1\",\n    \"express\": \"^5.1.0\",\n    \"graphql\": \"^16.9.0\",\n    \"graphql-http\": \"^1.22.0\",\n    \"graphql-request\": \"^6.1.0\",\n    \"ioredis\": \"^5.8.1\",\n    \"jsonwebtoken\": \"^9.0.2\",\n    \"mongodb\": \"^6.0.0\",\n    \"mysql2\": \"^3.15.1\",\n    \"next\": \"^15.5.4\",\n    \"pg\": \"^8.16.3\",\n    \"postgres\": \"^3.4.7\",\n    \"prettier\": \"^3.2.4\",\n    \"supertest\": \"^7.0.0\",\n    \"ts-node\": \"^10.9.2\",\n    \"tsc-alias\": \"^1.8.16\",\n    \"tsdown\": \"^0.15.0\",\n    \"tsx\": \"^4.20.6\",\n    \"typescript\": \"^5.0.0\"\n  },\n  \"dependencies\": {\n    \"@opentelemetry/api\": \"^1.7.0\",\n    \"@opentelemetry/resources\": \"^1.30.1\",\n    \"@opentelemetry/sdk-trace-node\": \"^1.30.1\",\n    \"@opentelemetry/semantic-conventions\": \"^1.17.0\",\n    \"@protobuf-ts/twirp-transport\": \"^2.11.1\",\n    \"@use-tusk/drift-schemas\": \"^0.1.16\",\n    \"import-in-the-middle\": \"^1.14.4\",\n    \"install\": \"^0.13.0\",\n    \"js-yaml\": \"^4.1.0\",\n    \"jsonpath\": \"^1.1.1\",\n    \"npm\": \"^11.6.0\",\n    \"patch-package\": \"^8.0.0\",\n    \"require-in-the-middle\": \"^7.0.0\",\n    \"semver\": \"^7.7.2\"\n  },\n  \"engines\": {\n    \"node\": \">=16.0.0\"\n  }\n}\n","import { version } from \"../package.json\";\nexport const SDK_VERSION = version;\n// Developer should update this when there are breaking changes to the current CLI\nexport const MIN_CLI_VERSION = \"0.1.0\";\n","import net from \"net\";\nimport { MIN_CLI_VERSION, SDK_VERSION } from \"../version\";\nimport { execSync } from \"child_process\";\nimport path from \"path\";\nimport os from \"os\";\nimport fs from \"fs\";\nimport {\n  CLIMessage,\n  MessageType,\n  GetMockRequest,\n  GetMockResponse,\n  ConnectRequest,\n  SDKMessage,\n  SendInboundSpanForReplayRequest,\n  SendAlertRequest,\n  InstrumentationVersionMismatchAlert,\n  UnpatchedDependencyAlert,\n  EnvVarRequest,\n} from \"@use-tusk/drift-schemas/core/communication\";\nimport { context, Context, SpanKind as OtSpanKind } from \"@opentelemetry/api\";\nimport { Value } from \"@use-tusk/drift-schemas/google/protobuf/struct\";\nimport { CleanSpanData, CALLING_LIBRARY_CONTEXT_KEY } from \"./types\";\nimport { Span } from \"@use-tusk/drift-schemas/core/span\";\nimport { logger, objectToProtobufStruct, toStruct, mapOtToPb, OriginalGlobalUtils } from \"./utils\";\n\nexport interface MockRequestInput {\n  testId: string;\n  outboundSpan: CleanSpanData;\n}\n\ninterface MockResponseOutput {\n  found: boolean;\n  response?: Record<string, unknown>;\n  error?: string;\n}\n\nexport class ProtobufCommunicator {\n  /**\n   * Shared child process script for synchronous protobuf requests.\n   * This script establishes its own connection to the CLI and handles async socket communication.\n   */\n  private static readonly SYNC_CHILD_SCRIPT = `\nconst net = require('net');\nconst fs = require('fs');\n\nconst requestFile = process.argv[2];\nconst responseFile = process.argv[3];\nconst config = JSON.parse(process.argv[4]);\n\nlet responseReceived = false;\nlet timeoutId;\n\nfunction cleanup(exitCode) {\n  if (timeoutId) clearTimeout(timeoutId);\n  process.exit(exitCode);\n}\n\ntry {\n  // Read the request data\n  const requestData = fs.readFileSync(requestFile);\n\n  // Create connection based on config\n  const client = config.type === 'unix'\n    ? net.createConnection({ path: config.path })\n    : net.createConnection({ host: config.host, port: config.port });\n\n  const incomingChunks = [];\n  let incomingBuffer = Buffer.alloc(0);\n\n  // Set timeout\n  timeoutId = setTimeout(() => {\n    if (!responseReceived) {\n      console.error('Timeout waiting for response');\n      client.destroy();\n      cleanup(1);\n    }\n  }, 10000);\n\n  client.on('connect', () => {\n    // Send the request\n    client.write(requestData);\n  });\n\n  client.on('data', (data) => {\n    incomingBuffer = Buffer.concat([incomingBuffer, data]);\n\n    // Try to parse complete message (4 byte length prefix + message)\n    while (incomingBuffer.length >= 4) {\n      const messageLength = incomingBuffer.readUInt32BE(0);\n\n      if (incomingBuffer.length < 4 + messageLength) {\n        // Incomplete message, wait for more data\n        break;\n      }\n\n      // We have a complete message\n      const messageData = incomingBuffer.slice(4, 4 + messageLength);\n      incomingBuffer = incomingBuffer.slice(4 + messageLength);\n\n      // Write the complete response (including length prefix)\n      const lengthPrefix = Buffer.allocUnsafe(4);\n      lengthPrefix.writeUInt32BE(messageLength, 0);\n      fs.writeFileSync(responseFile, Buffer.concat([lengthPrefix, messageData]));\n\n      responseReceived = true;\n      client.destroy();\n      cleanup(0);\n      break;\n    }\n  });\n\n  client.on('error', (err) => {\n    if (!responseReceived) {\n      console.error('Connection error:', err.message);\n      cleanup(1);\n    }\n  });\n\n  client.on('close', () => {\n    if (!responseReceived) {\n      console.error('Connection closed without response');\n      cleanup(1);\n    }\n  });\n\n} catch (err) {\n  console.error('Script error:', err.message);\n  cleanup(1);\n}\n`;\n\n  private client: net.Socket | null = null;\n  private pendingRequests = new Map<\n    string,\n    {\n      resolve: (response: any) => void;\n      reject: (error: Error) => void;\n    }\n  >();\n  private incomingBuffer = Buffer.alloc(0);\n  // Store the context when connecting and reuse it\n  private protobufContext: Context | null = null;\n\n  private makeConnection(\n    connectionInfo: { socketPath: string } | { host: string; port: number },\n    callback: () => void,\n  ) {\n    const currentContext = context.active();\n    this.protobufContext = currentContext.setValue(\n      CALLING_LIBRARY_CONTEXT_KEY,\n      \"ProtobufCommunicator\",\n    );\n\n    // Create connection in context so TCP instrumentation knows to ignore these TCP calls\n    return context.with(this.protobufContext, () => {\n      if (\"socketPath\" in connectionInfo) {\n        // Unix socket connection\n        this.client = net.createConnection(connectionInfo.socketPath, callback);\n      } else {\n        // TCP connection\n        this.client = net.createConnection(\n          { host: connectionInfo.host, port: connectionInfo.port },\n          callback,\n        );\n      }\n    });\n  }\n\n  async connect(\n    connectionInfo: { socketPath: string } | { host: string; port: number },\n    serviceId: string,\n  ): Promise<void> {\n    return new Promise((resolve, reject) => {\n      this.makeConnection(connectionInfo, () => {\n        const connType = \"socketPath\" in connectionInfo ? \"Unix socket\" : \"TCP\";\n        logger.debug(`Connected to CLI via protobuf (${connType})`);\n        this.sendConnectMessage(serviceId).then(resolve).catch(reject);\n      });\n\n      this.client?.on(\"error\", (err) => {\n        logger.error(\"Connection error:\", err);\n        reject(err);\n      });\n\n      this.client?.on(\"data\", (data) => {\n        this.handleIncomingData(data);\n      });\n\n      this.client?.on(\"timeout\", () => {\n        logger.error(\"Connection timeout\");\n        reject(new Error(\"Connection timeout\"));\n      });\n\n      this.client?.on(\"end\", () => {\n        logger.debug(\"Connection to CLI ended\");\n      });\n\n      this.client?.on(\"close\", () => {\n        logger.debug(\"Connection to CLI closed\");\n        // Reject all pending requests\n        for (const [requestId, { reject }] of this.pendingRequests) {\n          reject(new Error(\"Connection closed before response received\"));\n        }\n        this.pendingRequests.clear();\n      });\n    });\n  }\n\n  private async sendConnectMessage(serviceId: string): Promise<void> {\n    const connectRequest = ConnectRequest.create({\n      serviceId,\n      sdkVersion: SDK_VERSION,\n      minCliVersion: MIN_CLI_VERSION,\n    });\n\n    const sdkMessage = SDKMessage.create({\n      type: MessageType.SDK_CONNECT,\n      requestId: this.generateRequestId(),\n      payload: {\n        oneofKind: \"connectRequest\",\n        connectRequest,\n      },\n    });\n\n    await this.sendProtobufMessage(sdkMessage);\n\n    // SDK awaits CLI's decision\n    // If CLI accepts -> connection proceeds\n    // If CLI rejects -> CLI closes the connection and terminates the service.\n  }\n\n  private getStackTrace(): string {\n    Error.stackTraceLimit = 100;\n    const s = new Error().stack || \"\";\n    Error.stackTraceLimit = 10;\n    return s\n      .split(\"\\n\")\n      .slice(2)\n      .filter((l) => !l.includes(\"ProtobufCommunicator\"))\n      .join(\"\\n\");\n  }\n\n  async requestMockAsync(mockRequest: MockRequestInput): Promise<MockResponseOutput> {\n    const requestId = this.generateRequestId();\n\n    // Clean the input data to remove undefined values\n    const cleanSpan = mockRequest.outboundSpan\n      ? this.cleanSpan(mockRequest.outboundSpan)\n      : undefined;\n\n    // Convert inputValue to protobuf Struct format\n    if (cleanSpan?.inputValue) {\n      cleanSpan.inputValue = objectToProtobufStruct(cleanSpan.inputValue);\n    }\n\n    // Convert inputSchema to protobuf Struct format\n    if (cleanSpan?.inputSchema) {\n      cleanSpan.inputSchema = objectToProtobufStruct(cleanSpan.inputSchema);\n    }\n\n    // Convert kind to protobuf format\n    if (cleanSpan?.kind) {\n      cleanSpan.kind = mapOtToPb(cleanSpan.kind as OtSpanKind);\n    }\n\n    const protoMockRequest = GetMockRequest.create({\n      ...mockRequest,\n      requestId,\n      tags: {},\n      outboundSpan: cleanSpan,\n      stackTrace: cleanSpan?.stackTrace,\n    });\n\n    const sdkMessage: SDKMessage = SDKMessage.create({\n      type: MessageType.MOCK_REQUEST,\n      requestId: requestId,\n      payload: {\n        oneofKind: \"getMockRequest\",\n        getMockRequest: protoMockRequest,\n      },\n    });\n\n    logger.debug(\n      `[ProtobufCommunicator] Creating mock request with requestId: ${requestId}, testId: ${mockRequest.testId}`,\n    );\n\n    return new Promise((resolve, reject) => {\n      this.pendingRequests.set(requestId, { resolve, reject });\n      this.sendProtobufMessage(sdkMessage).catch(reject);\n    });\n  }\n\n  /**\n   * Generic synchronous request handler that spawns a child process.\n   * @param sdkMessage The SDK message to send\n   * @param filePrefix Prefix for temporary files (e.g., 'envvar', 'mock')\n   * @param responseHandler Function to extract and return the desired response\n   */\n  private executeSyncRequest<TResponse>(\n    sdkMessage: SDKMessage,\n    filePrefix: string,\n    responseHandler: (cliMessage: CLIMessage) => TResponse,\n  ): TResponse {\n    const requestId = sdkMessage.requestId;\n\n    // Serialize the message to binary\n    const messageBytes = SDKMessage.toBinary(sdkMessage);\n\n    // Create temporary file paths\n    const tempDir = os.tmpdir();\n    const requestFile = path.join(tempDir, `tusk-sync-${filePrefix}-request-${requestId}.bin`);\n    const responseFile = path.join(tempDir, `tusk-sync-${filePrefix}-response-${requestId}.bin`);\n    const scriptFile = path.join(tempDir, `tusk-sync-${filePrefix}-script-${requestId}.js`);\n\n    try {\n      // Write length prefix (4 bytes big-endian) + message to temp file\n      const lengthBuffer = Buffer.allocUnsafe(4);\n      lengthBuffer.writeUInt32BE(messageBytes.length, 0);\n      const fullMessage = Buffer.concat([lengthBuffer, Buffer.from(messageBytes)]);\n      fs.writeFileSync(requestFile, fullMessage);\n\n      // Determine connection method (Unix socket or TCP)\n      const mockSocket = OriginalGlobalUtils.getOriginalProcessEnvVar(\"TUSK_MOCK_SOCKET\");\n      const mockHost = OriginalGlobalUtils.getOriginalProcessEnvVar(\"TUSK_MOCK_HOST\");\n      const mockPort = OriginalGlobalUtils.getOriginalProcessEnvVar(\"TUSK_MOCK_PORT\");\n\n      let connectionConfig: any;\n      if (mockSocket) {\n        connectionConfig = { type: \"unix\", path: mockSocket };\n      } else if (mockHost && mockPort) {\n        connectionConfig = { type: \"tcp\", host: mockHost, port: parseInt(mockPort, 10) };\n      } else {\n        const socketPath = path.join(os.tmpdir(), \"tusk-connect.sock\");\n        connectionConfig = { type: \"unix\", path: socketPath };\n      }\n\n      // Write the script to a file\n      fs.writeFileSync(scriptFile, ProtobufCommunicator.SYNC_CHILD_SCRIPT);\n\n      try {\n        // Execute the child process synchronously using execSync\n        execSync(\n          `node \"${scriptFile}\" \"${requestFile}\" \"${responseFile}\" '${JSON.stringify(connectionConfig)}'`,\n          {\n            timeout: 12000, // Slightly longer than the child's timeout\n            stdio: \"pipe\",\n          },\n        );\n\n        // Read the response from the file\n        const responseBuffer = fs.readFileSync(responseFile);\n\n        // Parse the response (4 byte length prefix + message)\n        if (responseBuffer.length < 4) {\n          throw new Error(\"Invalid response: too short\");\n        }\n\n        const responseLength = responseBuffer.readUInt32BE(0);\n        if (responseBuffer.length < 4 + responseLength) {\n          throw new Error(\"Invalid response: incomplete message\");\n        }\n\n        const responseData = responseBuffer.slice(4, 4 + responseLength);\n        const cliMessage = CLIMessage.fromBinary(responseData);\n\n        // Use the provided handler to extract the specific response\n        return responseHandler(cliMessage);\n      } catch (error: any) {\n        logger.error(\n          `[ProtobufCommunicator] error in sync ${filePrefix} request child process:`,\n          error,\n        );\n        throw error;\n      }\n    } catch (error: any) {\n      throw new Error(`Sync ${filePrefix} request failed: ${error.message}`);\n    } finally {\n      // Clean up temp files\n      try {\n        if (fs.existsSync(requestFile)) fs.unlinkSync(requestFile);\n      } catch (e) {\n        logger.error(\"[ProtobufCommunicator] error cleaning up request file:\", e);\n      }\n      try {\n        if (fs.existsSync(responseFile)) fs.unlinkSync(responseFile);\n      } catch (e) {\n        logger.error(\"[ProtobufCommunicator] error cleaning up response file:\", e);\n      }\n      try {\n        if (fs.existsSync(scriptFile)) fs.unlinkSync(scriptFile);\n      } catch (e) {\n        logger.error(\"[ProtobufCommunicator] error cleaning up script file:\", e);\n      }\n    }\n  }\n\n  /**\n   * Request environment variables from CLI synchronously using a child process.\n   * This blocks the main thread, so it should be used carefully.\n   * Similar to requestMockSync but for environment variables.\n   */\n  requestEnvVarsSync(traceTestServerSpanId: string): Record<string, string> {\n    const requestId = this.generateRequestId();\n\n    const envVarRequest = EnvVarRequest.create({\n      traceTestServerSpanId,\n    });\n\n    const sdkMessage = SDKMessage.create({\n      type: MessageType.ENV_VAR_REQUEST,\n      requestId: requestId,\n      payload: {\n        oneofKind: \"envVarRequest\",\n        envVarRequest,\n      },\n    });\n\n    logger.debug(\n      `[ProtobufCommunicator] Requesting env vars (sync) for trace: ${traceTestServerSpanId}`,\n    );\n\n    return this.executeSyncRequest(sdkMessage, \"envvar\", (cliMessage) => {\n      if (cliMessage.payload.oneofKind !== \"envVarResponse\") {\n        throw new Error(`Unexpected response type: ${cliMessage.type}`);\n      }\n\n      const envVarResponse = cliMessage.payload.envVarResponse;\n      if (!envVarResponse) {\n        throw new Error(\"No env var response received\");\n      }\n\n      // Convert protobuf map to Record<string, string>\n      const envVars: Record<string, string> = {};\n      if (envVarResponse.envVars) {\n        Object.entries(envVarResponse.envVars).forEach(([key, value]) => {\n          envVars[key] = value;\n        });\n      }\n\n      logger.debug(\n        `[ProtobufCommunicator] Received env vars (sync), count: ${Object.keys(envVars).length}`,\n      );\n      return envVars;\n    });\n  }\n\n  /**\n   * This function uses a separate Node.js child process to communicate with the CLI over a socket.\n   * The child process creates its own connection and event loop, allowing proper async socket handling.\n   * The parent process blocks synchronously waiting for the child to complete.\n   *\n   * Since this function blocks the main thread, there is a performance impact. We should use requestMockAsync whenever possible and only use this function\n   * for instrumentations that require fetching mocks synchronously.\n   */\n  requestMockSync(mockRequest: MockRequestInput): MockResponseOutput {\n    const requestId = this.generateRequestId();\n\n    // Clean the input data to remove undefined values\n    const cleanSpan = mockRequest.outboundSpan\n      ? this.cleanSpan(mockRequest.outboundSpan)\n      : undefined;\n\n    // Convert inputValue to protobuf Struct format\n    if (cleanSpan?.inputValue) {\n      cleanSpan.inputValue = objectToProtobufStruct(cleanSpan.inputValue);\n    }\n\n    // Convert inputSchema to protobuf Struct format\n    if (cleanSpan?.inputSchema) {\n      cleanSpan.inputSchema = objectToProtobufStruct(cleanSpan.inputSchema);\n    }\n\n    // Convert kind to protobuf format\n    if (cleanSpan?.kind) {\n      cleanSpan.kind = mapOtToPb(cleanSpan.kind as OtSpanKind);\n    }\n\n    const protoMockRequest = GetMockRequest.create({\n      ...mockRequest,\n      requestId,\n      tags: {},\n      outboundSpan: cleanSpan,\n      stackTrace: cleanSpan?.stackTrace,\n    });\n\n    const sdkMessage = SDKMessage.create({\n      type: MessageType.MOCK_REQUEST,\n      requestId: requestId,\n      payload: {\n        oneofKind: \"getMockRequest\",\n        getMockRequest: protoMockRequest,\n      },\n    });\n\n    logger.debug(\"Sending protobuf request to CLI (sync)\", {\n      outboundSpan: mockRequest.outboundSpan,\n      testId: mockRequest.testId,\n    });\n\n    return this.executeSyncRequest(sdkMessage, \"mock\", (cliMessage) => {\n      if (cliMessage.payload.oneofKind !== \"getMockResponse\") {\n        throw new Error(`Unexpected response type: ${cliMessage.type}`);\n      }\n\n      const mockResponse = cliMessage.payload.getMockResponse;\n      if (!mockResponse) {\n        throw new Error(\"No mock response received\");\n      }\n\n      if (mockResponse.found) {\n        try {\n          const responseData = this.extractResponseData(mockResponse);\n          return {\n            found: true,\n            response: responseData,\n          };\n        } catch (error) {\n          throw new Error(`Failed to extract response data: ${error}`);\n        }\n      } else {\n        return {\n          found: false,\n          error: mockResponse.error || \"Mock not found\",\n        };\n      }\n    });\n  }\n\n  private async sendProtobufMessage(message: SDKMessage): Promise<void> {\n    if (!this.client || !this.protobufContext) {\n      throw new Error(\"Not connected to CLI\");\n    }\n\n    const messageBytes = SDKMessage.toBinary(message);\n    const lengthBuffer = Buffer.allocUnsafe(4);\n    lengthBuffer.writeUInt32BE(messageBytes.length, 0);\n\n    // Send message in context so TCP instrumentation knows to ignore these TCP calls\n    context.with(this.protobufContext, () => {\n      this.client!.write(lengthBuffer);\n      this.client!.write(Buffer.from(messageBytes));\n    });\n  }\n\n  async sendInboundSpanForReplay(span: CleanSpanData): Promise<void> {\n    if (!this.client) return;\n\n    const pbSpan = Span.create({\n      traceId: span.traceId,\n      spanId: span.spanId,\n      parentSpanId: span.parentSpanId || \"\",\n      name: span.name || \"\",\n      packageName: span.packageName,\n      instrumentationName: span.instrumentationName,\n      submoduleName: span.submoduleName || \"\",\n      inputValue: toStruct(span.inputValue),\n      outputValue: toStruct(span.outputValue),\n      inputSchema: span.inputSchema,\n      outputSchema: span.outputSchema,\n      inputSchemaHash: span.inputSchemaHash || \"\",\n      outputSchemaHash: span.outputSchemaHash || \"\",\n      inputValueHash: span.inputValueHash || \"\",\n      outputValueHash: span.outputValueHash || \"\",\n      kind: mapOtToPb(span.kind as OtSpanKind),\n      status: { code: span.status.code, message: span.status.message || \"\" },\n      timestamp: span.timestamp\n        ? { seconds: BigInt(span.timestamp.seconds), nanos: span.timestamp.nanos }\n        : undefined,\n      isRootSpan: span.isRootSpan ?? false,\n      metadata: toStruct(span.metadata),\n      packageType: span.packageType,\n    });\n\n    const req = SendInboundSpanForReplayRequest.create({ span: pbSpan });\n\n    const sdkMessage = SDKMessage.create({\n      type: MessageType.INBOUND_SPAN,\n      requestId: this.generateRequestId(),\n      payload: {\n        oneofKind: \"sendInboundSpanForReplayRequest\",\n        sendInboundSpanForReplayRequest: req,\n      },\n    });\n\n    await this.sendProtobufMessage(sdkMessage);\n  }\n\n  /**\n   * Send an alert to the CLI (fire-and-forget, no response expected)\n   */\n  private async sendAlert(alert: SendAlertRequest): Promise<void> {\n    if (!this.client || !this.protobufContext) {\n      logger.debug(\"[ProtobufCommunicator] Not connected to CLI, skipping alert\");\n      return;\n    }\n\n    const sdkMessage = SDKMessage.create({\n      type: MessageType.ALERT,\n      requestId: this.generateRequestId(),\n      payload: {\n        oneofKind: \"sendAlertRequest\",\n        sendAlertRequest: alert,\n      },\n    });\n\n    // Fire-and-forget - don't wait for response\n    try {\n      await this.sendProtobufMessage(sdkMessage);\n      logger.debug(\"[ProtobufCommunicator] Alert sent to CLI\");\n    } catch (error) {\n      logger.debug(\"[ProtobufCommunicator] Failed to send alert to CLI:\", error);\n      // Swallow error - alerts are non-critical\n    }\n  }\n\n  /**\n   * Send instrumentation version mismatch alert to CLI\n   */\n  async sendInstrumentationVersionMismatchAlert(params: {\n    moduleName: string;\n    requestedVersion: string | undefined;\n    supportedVersions: string[];\n  }): Promise<void> {\n    const alert = SendAlertRequest.create({\n      alert: {\n        oneofKind: \"versionMismatch\",\n        versionMismatch: InstrumentationVersionMismatchAlert.create({\n          moduleName: params.moduleName,\n          requestedVersion: params.requestedVersion || \"\",\n          supportedVersions: params.supportedVersions,\n          sdkVersion: SDK_VERSION,\n        }),\n      },\n    });\n    await this.sendAlert(alert);\n  }\n\n  /**\n   * Send unpatched dependency alert to CLI\n   */\n  async sendUnpatchedDependencyAlert(params: {\n    stackTrace: string;\n    traceTestServerSpanId: string;\n  }): Promise<void> {\n    const alert = SendAlertRequest.create({\n      alert: {\n        oneofKind: \"unpatchedDependency\",\n        unpatchedDependency: UnpatchedDependencyAlert.create({\n          stackTrace: params.stackTrace,\n          traceTestServerSpanId: params.traceTestServerSpanId,\n          sdkVersion: SDK_VERSION,\n        }),\n      },\n    });\n    await this.sendAlert(alert);\n  }\n\n  private handleIncomingData(data: Buffer): void {\n    this.incomingBuffer = Buffer.concat([this.incomingBuffer, data]);\n    logger.debug(`[ProtobufCommunicator] Processing buffer, length: ${this.incomingBuffer.length}`);\n\n    while (this.incomingBuffer.length >= 4) {\n      const messageLength = this.incomingBuffer.readUInt32BE(0);\n      logger.debug(\n        `[ProtobufCommunicator] Message length from prefix: ${messageLength}, buffer has: ${this.incomingBuffer.length - 4}`,\n      );\n\n      if (this.incomingBuffer.length < 4 + messageLength) {\n        logger.debug(\n          `[ProtobufCommunicator] Incomplete message, waiting for more data. Need ${4 + messageLength}, have ${this.incomingBuffer.length}`,\n        );\n        break;\n      }\n\n      const messageData = this.incomingBuffer.slice(4, 4 + messageLength);\n      this.incomingBuffer = this.incomingBuffer.slice(4 + messageLength);\n\n      try {\n        const cliMessage = CLIMessage.fromBinary(messageData);\n        logger.debug(\n          `[ProtobufCommunicator] Parsed CLI message type: ${cliMessage.type}, requestId: ${cliMessage.requestId}`,\n        );\n        this.handleCLIMessage(cliMessage);\n      } catch (error) {\n        logger.error(\"[ProtobufCommunicator] failed to parse CLI message:\", error);\n      }\n    }\n  }\n\n  private handleCLIMessage(message: CLIMessage): void {\n    const requestId = message.requestId;\n\n    logger.debug(\n      `[ProtobufCommunicator] Received CLI message for requestId: ${requestId}, pending requests:`,\n      Array.from(this.pendingRequests.keys()),\n    );\n\n    if (message.payload.oneofKind === \"connectResponse\") {\n      const connectResponse = message.payload.connectResponse;\n      if (connectResponse?.success) {\n        logger.debug(\"[ProtobufCommunicator] CLI acknowledged connection\");\n      } else {\n        logger.error(\"[ProtobufCommunicator] CLI rejected connection:\", connectResponse?.error);\n      }\n      return;\n    }\n\n    if (message.payload.oneofKind === \"getMockResponse\") {\n      const mockResponse = message.payload.getMockResponse;\n      logger.debug(\n        `[ProtobufCommunicator] Received mock response for requestId: ${requestId}, pending requests:`,\n        Array.from(this.pendingRequests.keys()),\n      );\n      const pendingRequest = this.pendingRequests.get(requestId);\n\n      if (!pendingRequest) {\n        logger.warn(\n          \"[ProtobufCommunicator] received response for unknown request:\",\n          requestId,\n          \"Available pending requests:\",\n          Array.from(this.pendingRequests.keys()),\n        );\n        return;\n      }\n\n      this.pendingRequests.delete(requestId);\n\n      if (!mockResponse) {\n        pendingRequest.reject(new Error(\"No mock response received\"));\n        return;\n      }\n\n      if (mockResponse.found) {\n        try {\n          const responseData = this.extractResponseData(mockResponse);\n          pendingRequest.resolve({\n            found: true,\n            response: responseData,\n          });\n        } catch (error) {\n          pendingRequest.reject(new Error(`Failed to extract response data: ${error}`));\n        }\n      } else {\n        pendingRequest.resolve({\n          found: false,\n          error: mockResponse.error || \"Mock not found\",\n        });\n      }\n    }\n\n    if (message.payload.oneofKind === \"envVarResponse\") {\n      const envVarResponse = message.payload.envVarResponse;\n      logger.debug(`[ProtobufCommunicator] Received env var response for requestId: ${requestId}`);\n      const pendingRequest = this.pendingRequests.get(requestId);\n\n      if (!pendingRequest) {\n        logger.warn(\n          \"[ProtobufCommunicator] received env var response for unknown request:\",\n          requestId,\n        );\n        return;\n      }\n\n      this.pendingRequests.delete(requestId);\n\n      // Convert protobuf map to Record<string, string>\n      const envVars: Record<string, string> = {};\n      if (envVarResponse?.envVars) {\n        Object.entries(envVarResponse.envVars).forEach(([key, value]) => {\n          envVars[key] = value;\n        });\n      }\n\n      pendingRequest.resolve(envVars);\n      return;\n    }\n  }\n\n  /**\n   * Extract response data from MockResponse\n   */\n  private extractResponseData(mockResponse: GetMockResponse): Record<string, unknown> {\n    if (!mockResponse.responseData) {\n      return {};\n    }\n\n    try {\n      const struct = mockResponse.responseData;\n\n      logger.debug(\"[ProtobufCommunicator] extracting response data directly from protobuf\");\n\n      if (struct.fields && struct.fields[\"response\"]) {\n        const responseValue = Value.toJson(struct.fields[\"response\"]);\n        if (responseValue) {\n          logger.debug(\n            \"[ProtobufCommunicator] Extracted response data:\",\n            JSON.stringify(responseValue, null, 2),\n          );\n          return responseValue as Record<string, unknown>;\n        }\n      }\n\n      return {};\n    } catch (error) {\n      logger.error(\"[ProtobufCommunicator] failed to extract response data:\", error);\n      throw error;\n    }\n  }\n\n  private generateRequestId(): string {\n    return Math.random().toString(36).slice(2, 11);\n  }\n\n  private cleanSpan(data: any): any {\n    if (data === null || data === undefined) {\n      return null;\n    }\n\n    if (Array.isArray(data)) {\n      return data.map((item) => this.cleanSpan(item)).filter((item) => item !== undefined);\n    }\n\n    if (typeof data === \"object\") {\n      const cleaned: any = {};\n      for (const [key, value] of Object.entries(data)) {\n        if (value !== undefined) {\n          cleaned[key] = this.cleanSpan(value);\n        }\n      }\n      return cleaned;\n    }\n\n    return data;\n  }\n\n  disconnect(): void {\n    if (this.client) {\n      this.client.destroy();\n      this.client = null;\n    }\n  }\n}\n","export const TuskDriftInstrumentationModuleNames = [\n  \"http\",\n  \"https\",\n  \"pg\",\n  \"postgres\",\n  \"node-fetch\",\n  \"graphql\",\n  \"jsonwebtoken\",\n  \"jwks-rsa\",\n  \"mysql2\",\n  \"ioredis\",\n  \"@grpc/grpc-js\",\n  \"@google-cloud/firestore\",\n  // Note: \"next\" is intentionally excluded from this list because Next.js is always\n  // required before SDK initialization in Next.js apps.\n  // Our Next.js instrumentation handles this case correctly by patching at runtime\n  // rather than relying on require-in-the-middle hooks.\n];\n","import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport {\n  HttpInstrumentation,\n  PgInstrumentation,\n  FetchInstrumentation,\n  TcpInstrumentation,\n  GraphqlInstrumentation,\n  JsonwebtokenInstrumentation,\n  DateInstrumentation,\n  JwksRsaInstrumentation,\n  EnvInstrumentation,\n  PostgresInstrumentation,\n  Mysql2Instrumentation,\n  IORedisInstrumentation,\n  GrpcInstrumentation,\n  FirestoreInstrumentation,\n  NextjsInstrumentation,\n  PrismaInstrumentation,\n} from \"../instrumentation/libraries\";\nimport { TdSpanExporter } from \"./tracing/TdSpanExporter\";\nimport { trace, Tracer } from \"@opentelemetry/api\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport { ProtobufCommunicator, MockRequestInput } from \"./ProtobufCommunicator\";\nimport { BatchSpanProcessor } from \"@opentelemetry/sdk-trace-node\";\nimport { CleanSpanData, TD_INSTRUMENTATION_LIBRARY_NAME } from \"./types\";\nimport { TuskDriftInstrumentationModuleNames } from \"./TuskDriftInstrumentationModuleNames\";\nimport { SDK_VERSION } from \"../version\";\nimport {\n  LogLevel,\n  initializeGlobalLogger,\n  logger,\n  loadTuskConfig,\n  TuskConfig,\n  OriginalGlobalUtils,\n} from \"./utils\";\nimport { TransformConfigs } from \"../instrumentation/libraries/types\";\nimport { ATTR_SERVICE_NAME } from \"@opentelemetry/semantic-conventions\";\nimport { Resource } from \"@opentelemetry/resources\";\n\nexport interface InitParams {\n  apiKey?: string;\n  env?: string;\n  logLevel?: LogLevel;\n  transforms?: TransformConfigs;\n  samplingRate?: number;\n}\n\nexport enum TuskDriftMode {\n  DISABLED = \"DISABLED\",\n  RECORD = \"RECORD\",\n  REPLAY = \"REPLAY\",\n}\n\n/**\n * The core class for Tusk Drift.\n * This class is responsible for initializing the Tusk Drift SDK and managing the Tusk Drift instance.\n */\nexport class TuskDriftCore {\n  private static instance: TuskDriftCore;\n  private initialized = false;\n  private appReady = false;\n  private mode: TuskDriftMode;\n  private initParams: InitParams;\n  private config: TuskConfig;\n  private communicator?: ProtobufCommunicator | undefined;\n  private samplingRate: number;\n  private cliConnectionPromise: Promise<void> | null;\n  // Add a flag to track connection status\n  private isConnectedWithCLI = false;\n  spanExporter?: TdSpanExporter;\n\n  constructor() {\n    this.mode = this.detectMode();\n    this.config = loadTuskConfig() || {};\n  }\n\n  private isCommonJS(): boolean {\n    return (\n      typeof module !== \"undefined\" &&\n      \"exports\" in module &&\n      typeof require !== \"undefined\" &&\n      typeof require.cache !== \"undefined\"\n    );\n  }\n\n  private getPackageName(modulePath: string): string | null {\n    let dir = path.dirname(modulePath);\n    while (dir) {\n      const packageJsonPath = path.join(dir, \"package.json\");\n      if (fs.existsSync(packageJsonPath)) {\n        try {\n          const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\"));\n          return packageJson.name || null;\n        } catch (err) {\n          logger.error(`Error reading package.json in ${packageJsonPath}:`, err);\n          return null;\n        }\n      }\n      const parentDir = path.dirname(dir);\n      if (parentDir === dir || !parentDir.includes(\"node_modules\")) {\n        break;\n      }\n      dir = parentDir;\n    }\n    return null;\n  }\n\n  private alreadyRequiredModules(): Set<string> {\n    const alreadyRequiredModuleNames = new Set<string>();\n\n    if (this.isCommonJS()) {\n      const requireCache = Object.keys(require.cache);\n      for (const modulePath of requireCache) {\n        if (modulePath.includes(\"node_modules\")) {\n          const packageName = this.getPackageName(modulePath);\n          if (packageName && TuskDriftInstrumentationModuleNames.includes(packageName)) {\n            alreadyRequiredModuleNames.add(packageName);\n          }\n        }\n      }\n    } else {\n      // ESM or other module systems - no reliable detection possible\n      logger.debug(\"Running in ES Module mode. Cannot detect pre-loaded instrumentation modules.\");\n    }\n\n    return alreadyRequiredModuleNames;\n  }\n\n  static getInstance(): TuskDriftCore {\n    if (!TuskDriftCore.instance) {\n      TuskDriftCore.instance = new TuskDriftCore();\n    }\n    return TuskDriftCore.instance;\n  }\n\n  private detectMode(): TuskDriftMode {\n    const modeEnv = OriginalGlobalUtils.getOriginalProcessEnvVar(\"TUSK_DRIFT_MODE\");\n\n    switch (modeEnv?.toUpperCase()) {\n      case \"RECORD\":\n        return TuskDriftMode.RECORD;\n      case \"REPLAY\":\n        return TuskDriftMode.REPLAY;\n      case \"DISABLED\":\n      case \"DISABLE\":\n        return TuskDriftMode.DISABLED;\n      default:\n        // If no mode specified, default to disabled\n        return TuskDriftMode.DISABLED;\n    }\n  }\n\n  private validateSamplingRate(value: number, source: string): boolean {\n    if (typeof value !== \"number\" || isNaN(value)) {\n      logger.warn(`Invalid sampling rate from ${source}: not a number. Ignoring.`);\n      return false;\n    }\n    if (value < 0 || value > 1) {\n      logger.warn(\n        `Invalid sampling rate from ${source}: ${value}. Must be between 0.0 and 1.0. Ignoring.`,\n      );\n      return false;\n    }\n    return true;\n  }\n\n  private determineSamplingRate(initParams: InitParams): number {\n    // Precedence: InitParams > Env Var > Config YAML > Default (1.0)\n\n    // 1. Check init params (highest priority)\n    if (initParams.samplingRate !== undefined) {\n      if (this.validateSamplingRate(initParams.samplingRate, \"init params\")) {\n        logger.debug(`Using sampling rate from init params: ${initParams.samplingRate}`);\n        return initParams.samplingRate;\n      }\n    }\n\n    // 2. Check environment variable\n    const envSamplingRate = OriginalGlobalUtils.getOriginalProcessEnvVar(\"TUSK_SAMPLING_RATE\");\n    if (envSamplingRate !== undefined) {\n      const parsed = parseFloat(envSamplingRate);\n      if (this.validateSamplingRate(parsed, \"TUSK_SAMPLING_RATE env var\")) {\n        logger.debug(`Using sampling rate from TUSK_SAMPLING_RATE env var: ${parsed}`);\n        return parsed;\n      }\n    }\n\n    // 3. Check config file\n    if (this.config.recording?.sampling_rate !== undefined) {\n      if (this.validateSamplingRate(this.config.recording.sampling_rate, \"config.yaml\")) {\n        logger.debug(\n          `Using sampling rate from config.yaml: ${this.config.recording.sampling_rate}`,\n        );\n        return this.config.recording.sampling_rate;\n      }\n    }\n\n    // 4. Default to 1.0 (100%)\n    logger.debug(\"Using default sampling rate: 1.0\");\n    return 1;\n  }\n\n  private registerDefaultInstrumentations(): void {\n    const transforms = this.config.transforms ?? this.initParams.transforms;\n\n    // Just creating the instrumentations registers them with the sdk\n    // All these instrumentations extend TdInstrumentationBase\n    // TdInstrumentationBase constructor calls enable() which sets up the require-in-the-middle hooks to patch the modules\n    // when the modules are required\n    new HttpInstrumentation({\n      enabled: true,\n      mode: this.mode,\n      transforms,\n    });\n\n    new PgInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new FetchInstrumentation({\n      enabled: true,\n      mode: this.mode,\n      transforms,\n    });\n\n    new TcpInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new GraphqlInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new JsonwebtokenInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new DateInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new JwksRsaInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new EnvInstrumentation({\n      enabled: this.config.recording?.enable_env_var_recording || false,\n      mode: this.mode,\n    });\n\n    new PostgresInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new Mysql2Instrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new IORedisInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new GrpcInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new FirestoreInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new NextjsInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n\n    new PrismaInstrumentation({\n      enabled: true,\n      mode: this.mode,\n    });\n  }\n\n  private initializeTracing({ baseDirectory }: { baseDirectory: string }): void {\n    const serviceName = this.config.service?.name || \"unknown\";\n\n    logger.debug(`Initializing OpenTelemetry tracing for service: ${serviceName}`);\n\n    this.spanExporter = new TdSpanExporter({\n      baseDirectory,\n      mode: this.mode,\n      useRemoteExport: this.config.recording?.export_spans || false,\n      observableServiceId: this.config.service?.id,\n      apiKey: this.initParams.apiKey,\n      tuskBackendBaseUrl: this.config.tusk_api?.url || \"https://api.usetusk.ai\",\n      environment: this.initParams.env || \"unknown\",\n      sdkVersion: SDK_VERSION,\n      sdkInstanceId: this.generateSdkInstanceId(),\n    });\n\n    const tracerProvider = new NodeTracerProvider({\n      resource: new Resource({\n        [ATTR_SERVICE_NAME]: serviceName,\n      }),\n      spanProcessors: [\n        new BatchSpanProcessor(this.spanExporter, {\n          // Maximum queue size before spans are dropped, default 2048\n          maxQueueSize: 2048,\n          // Maximum batch size per export, default 512\n          maxExportBatchSize: 512,\n          // Interval between exports, default 5s\n          scheduledDelayMillis: 2000,\n          // Max time for export before timeout, default 30s\n          exportTimeoutMillis: 30000,\n        }),\n      ],\n    });\n\n    // Register the tracer provider\n    tracerProvider.register();\n    logger.debug(`OpenTelemetry tracing initialized`);\n  }\n\n  private generateSdkInstanceId(): string {\n    const originalDate = OriginalGlobalUtils.getOriginalDate();\n    return `sdk-${originalDate.getTime()}-${Math.random().toString(36).substr(2, 9)}`;\n  }\n\n  initialize(initParams: InitParams): void {\n    // Initialize logging with provided level or default to 'info'\n    initializeGlobalLogger({\n      logLevel: initParams.logLevel || \"info\",\n      prefix: \"TuskDrift\",\n    });\n\n    this.samplingRate = this.determineSamplingRate(initParams);\n    this.initParams = initParams;\n\n    if (!this.initParams.env) {\n      const nodeEnv = OriginalGlobalUtils.getOriginalProcessEnvVar(\"NODE_ENV\") || \"development\";\n      logger.warn(\n        `Environment not provided in initialization parameters. Using '${nodeEnv}' as the environment.`,\n      );\n      this.initParams.env = nodeEnv;\n    }\n\n    if (this.initialized) {\n      logger.debug(\"Already initialized, skipping...\");\n      return;\n    }\n\n    if (\n      this.mode === TuskDriftMode.RECORD &&\n      this.config.recording?.export_spans &&\n      !this.initParams.apiKey\n    ) {\n      logger.error(\n        \"In record mode and export_spans is true, but API key not provided. API key is required to export spans to Tusk backend. Please provide an API key in the initialization parameters.\",\n      );\n      return;\n    }\n\n    // Need to have observable service id if exporting spans to Tusk backend\n    if (this.config.recording?.export_spans && !this.config.service?.id) {\n      logger.error(\n        \"Observable service ID not provided. Please provide an observable service ID in the configuration file.\",\n      );\n      return;\n    }\n\n    if (this.mode === TuskDriftMode.DISABLED) {\n      logger.debug(\"SDK disabled via environment variable\");\n      return;\n    }\n\n    logger.debug(`Initializing in ${this.mode} mode`);\n\n    if (this.mode === TuskDriftMode.REPLAY) {\n      // Disable Sentry in replay mode\n      process.env.SENTRY_DSN = \"\";\n    }\n\n    // Initialize ProtobufCommunicator early\n    this.communicator = new ProtobufCommunicator();\n\n    if (this.mode === TuskDriftMode.REPLAY) {\n      // Check if TCP mode or Unix socket mode\n      const mockHost = OriginalGlobalUtils.getOriginalProcessEnvVar(\"TUSK_MOCK_HOST\");\n      const mockPort = OriginalGlobalUtils.getOriginalProcessEnvVar(\"TUSK_MOCK_PORT\");\n      const mockSocket = OriginalGlobalUtils.getOriginalProcessEnvVar(\"TUSK_MOCK_SOCKET\");\n\n      let connectionInfo: { socketPath: string } | { host: string; port: number };\n\n      if (mockHost && mockPort) {\n        // TCP mode (Docker)\n        connectionInfo = {\n          host: mockHost,\n          port: parseInt(mockPort, 10),\n        };\n        logger.debug(`Using TCP connection to CLI: ${mockHost}:${mockPort}`);\n      } else {\n        // Unix socket mode (default)\n        const socketPath = mockSocket || path.join(os.tmpdir(), \"tusk-connect.sock\");\n\n        // Check if socket exists and is ready\n        try {\n          fs.accessSync(socketPath, fs.constants.F_OK);\n          const stats = fs.statSync(socketPath);\n          if (!stats.isSocket()) {\n            throw new Error(`Path exists but is not a socket: ${socketPath}`);\n          }\n          logger.debug(\"Socket found and verified at\", socketPath);\n        } catch (error) {\n          if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n            throw new Error(`Socket not found at ${socketPath}. Make sure Tusk CLI is running.`);\n          }\n          throw new Error(\n            `Socket check failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n          );\n        }\n\n        connectionInfo = { socketPath };\n      }\n\n      // Start connection early for replay mode (runs in parallel with other initialization)\n      // This will be awaited when the first requestAsyncMock is called\n      this.cliConnectionPromise = this.communicator\n        .connect(connectionInfo, this.config.service?.id || \"unknown\")\n        .then(() => {\n          this.isConnectedWithCLI = true;\n          logger.debug(\"SDK successfully connected to CLI\");\n        });\n    }\n\n    // Check if any instrumentation modules are already required\n    const packageNames = this.alreadyRequiredModules();\n    if (packageNames.size > 0) {\n      const moduleList = [...packageNames].join(\", \");\n      const message = `TuskDrift must be initialized before any other modules are required. This ensures TuskDrift is able to instrument the required modules. ${moduleList} ${packageNames.size > 1 ? \"are\" : \"is\"} already required.`;\n\n      if (this.mode === TuskDriftMode.RECORD) {\n        logger.warn(`${message} TuskDrift is now disabled and will continue in disabled mode.`);\n        this.mode = TuskDriftMode.DISABLED;\n        return;\n      } else if (this.mode === TuskDriftMode.REPLAY) {\n        logger.error(`${message} TuskDrift will not run in replay mode. Stopping the app.`);\n        process.exit(1);\n      }\n    }\n\n    // Only used when storing spans locally\n    const baseDirectory = this.config.traces?.dir || path.join(process.cwd(), \".tusk/traces\");\n\n    logger.debug(`Config: ${JSON.stringify(this.config)}`);\n    logger.debug(`Base directory: ${baseDirectory}`);\n\n    // Register instrumentations (runs in parallel with connection)\n    this.registerDefaultInstrumentations();\n\n    // Initialize OpenTelemetry tracing (runs in parallel with connection)\n    // Important to do this after registering instrumentations since initializeTracing lazy imports the NodeSDK from OpenTelemetry\n    // which imports the gRPC exporter\n    this.initializeTracing({ baseDirectory });\n\n    this.initialized = true;\n    logger.info(\"SDK initialized successfully\");\n  }\n\n  markAppAsReady(): void {\n    if (!this.initialized) {\n      if (this.mode !== TuskDriftMode.DISABLED) {\n        logger.error(\"markAppAsReady() called before initialize(). Call initialize() first.\");\n      }\n      return;\n    }\n\n    this.appReady = true;\n    logger.debug(\"Application marked as ready\");\n\n    if (this.mode === TuskDriftMode.REPLAY) {\n      logger.debug(\"Replay mode active - ready to serve mocked responses\");\n    } else if (this.mode === TuskDriftMode.RECORD) {\n      logger.debug(\"Record mode active - capturing inbound requests and responses\");\n    }\n  }\n\n  async sendInboundSpanForReplay(span: CleanSpanData): Promise<void> {\n    try {\n      if (this.communicator) {\n        await this.communicator.sendInboundSpanForReplay(span);\n      }\n    } catch (e) {\n      logger.error(\"Failed to send inbound replay span:\", e);\n    }\n  }\n\n  private createMockRequestCore(\n    mockRequest: MockRequestInput,\n  ): { found: boolean; response?: unknown; error?: string } | null {\n    if (!this.communicator || this.mode !== TuskDriftMode.REPLAY) {\n      logger.error(\n        \"Cannot request mock: not in replay mode or no CLI connection\",\n        this.mode,\n        this.communicator,\n      );\n      return { found: false, error: \"Not in replay mode or no CLI connection\" };\n    }\n\n    return null; // Indicates we should proceed with CLI request\n  }\n\n  async requestMockAsync(\n    mockRequest: MockRequestInput,\n  ): Promise<{ found: boolean; response?: unknown; error?: string }> {\n    if (this.cliConnectionPromise && !this.isConnectedWithCLI) {\n      logger.debug(\"Waiting for CLI connection to be established\");\n      await this.cliConnectionPromise;\n    }\n\n    const mockRequestCore = this.createMockRequestCore(mockRequest);\n    if (mockRequestCore) {\n      return mockRequestCore;\n    }\n    return this.requestMockFromCLIAsync(mockRequest);\n  }\n\n  private async requestMockFromCLIAsync(\n    mockRequest: MockRequestInput,\n  ): Promise<{ found: boolean; response?: unknown; error?: string }> {\n    if (!this.communicator || this.mode !== TuskDriftMode.REPLAY) {\n      logger.error(\"Cannot request mock: not in replay mode or no CLI connection\");\n      return { found: false, error: \"Not in replay mode or no CLI connection\" };\n    }\n\n    try {\n      logger.debug(\"Sending protobuf request to CLI (async)\", JSON.stringify(mockRequest, null, 2));\n\n      const response = await this.communicator.requestMockAsync({\n        testId: mockRequest.testId,\n        outboundSpan: mockRequest.outboundSpan,\n      });\n\n      logger.debug(\"Received protobuf response from CLI\", JSON.stringify(response, null, 2));\n      return response;\n    } catch (error) {\n      logger.error(\"Error sending protobuf request to CLI:\", error);\n      return {\n        found: false,\n        error: `Error sending request: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      };\n    }\n  }\n\n  /**\n   * Request environment variables from CLI for a specific trace (synchronously).\n   * This blocks the main thread, so it should be used carefully.\n   */\n  requestEnvVarsSync(traceTestServerSpanId: string): Record<string, string> {\n    if (!this.isConnectedWithCLI) {\n      logger.error(\"Requesting sync env vars but CLI is not ready yet\");\n      throw new Error(\"Requesting sync env vars but CLI is not ready yet\");\n    }\n\n    if (!this.communicator || this.mode !== TuskDriftMode.REPLAY) {\n      logger.debug(\"Cannot request env vars: not in replay mode or no CLI connection\");\n      return {};\n    }\n\n    try {\n      logger.debug(`Requesting env vars (sync) for trace: ${traceTestServerSpanId}`);\n      const envVars = this.communicator.requestEnvVarsSync(traceTestServerSpanId);\n      logger.debug(`Received env vars from CLI, count: ${Object.keys(envVars).length}`);\n      logger.debug(\n        `First 10 env vars: ${JSON.stringify(Object.keys(envVars).slice(0, 10), null, 2)}`,\n      );\n      return envVars;\n    } catch (error) {\n      logger.error(`[TuskDrift] Error requesting env vars from CLI:`, error);\n      return {};\n    }\n  }\n\n  requestMockSync(mockRequest: MockRequestInput): {\n    found: boolean;\n    response?: unknown;\n    error?: string;\n  } {\n    if (!this.isConnectedWithCLI) {\n      // We cannot await for the CLI to be connected like we do in requestMockAsync since it's a synchronous call\n      // That means this function will likely throw an error if the first mock requested needs to be sync\n      // This is a limitation of the current implementation and will be fixed in the future\n      logger.error(\"Requesting sync mock but CLI is not ready yet\");\n      throw new Error(\"Requesting sync mock but CLI is not ready yet\");\n    }\n\n    const mockRequestCore = this.createMockRequestCore(mockRequest);\n    if (mockRequestCore) {\n      return mockRequestCore;\n    }\n    return this.requestMockFromCLISync(mockRequest);\n  }\n\n  private requestMockFromCLISync(mockRequest: MockRequestInput): {\n    found: boolean;\n    response?: unknown;\n    error?: string;\n  } {\n    if (!this.communicator || this.mode !== TuskDriftMode.REPLAY) {\n      logger.error(\n        \"Cannot request mock: not in replay mode or no CLI connection\",\n        this.mode,\n        this.communicator,\n      );\n      return { found: false, error: \"Not in replay mode or no CLI connection\" };\n    }\n\n    try {\n      logger.debug(\"Sending protobuf request to CLI (sync)\", mockRequest);\n\n      const response = this.communicator.requestMockSync({\n        testId: mockRequest.testId,\n        outboundSpan: mockRequest.outboundSpan,\n      });\n\n      logger.debug(\"Received protobuf response from CLI\", response);\n      return response;\n    } catch (error) {\n      logger.error(\"Error sending protobuf request to CLI:\", error);\n      return {\n        found: false,\n        error: `Error sending request: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      };\n    }\n  }\n\n  getMode(): TuskDriftMode {\n    return this.mode;\n  }\n\n  getSamplingRate(): number {\n    return this.samplingRate;\n  }\n\n  isInitialized(): boolean {\n    return this.initialized;\n  }\n\n  isAppReady(): boolean {\n    return this.appReady;\n  }\n\n  getConfig(): TuskConfig {\n    return this.config;\n  }\n\n  getInitParams(): InitParams {\n    return this.initParams;\n  }\n\n  getTracer(): Tracer {\n    return trace.getTracer(TD_INSTRUMENTATION_LIBRARY_NAME);\n  }\n\n  getProtobufCommunicator(): ProtobufCommunicator | undefined {\n    return this.communicator;\n  }\n}\n\n// These JSDoc comments are exposed in the type definitions\ninterface TuskDriftPublicAPI {\n  /**\n   * Initialize the TuskDrift SDK instance\n   *\n   * This is the main initialization function for TuskDrift that must be called before importing/requiring any other modules.\n   *\n   * @param initParams - The initialization parameters object containing:\n   *   - apiKey: string - Your TuskDrift API key (required)\n   *   - env: string - The environment name (e.g., 'development', 'staging', 'production') (required)\n   *   - logLevel?: LogLevel - Optional logging level ('silent' | 'error' | 'warn' | 'info' | 'debug'), defaults to 'info'\n   *   - samplingRate?: number - Optional sampling rate (0.0-1.0) for recording requests. Overrides TUSK_SAMPLING_RATE env var and config.yaml. Defaults to 1.0\n   *\n   * @returns void - Initializes the SDK\n   *\n   * @example\n   * ```typescript\n   * import  { TuskDrift } from \"@use-tusk/drift-node-sdk\"\n   *\n   * TuskDrift.initialize({\n   *   apiKey: 'your-api-key',\n   *   env: 'production',\n   *   logLevel: 'debug',\n   *   samplingRate: 1  // Record 100% of requests\n   * });\n   *\n   * ```\n   */\n  initialize(initParams: InitParams): void;\n\n  /**\n   * Mark the application as ready for recording/replay\n   *\n   * This should be called after the application has completed initialization and is ready to serve requests.\n   *\n   * @returns void\n   */\n  markAppAsReady(): void;\n\n  /**\n   * Check if the application is ready\n   */\n  isAppReady(): boolean;\n}\n\nclass TuskDriftSDK implements TuskDriftPublicAPI {\n  private tuskDrift = TuskDriftCore.getInstance();\n\n  initialize(initParams: InitParams): void {\n    return this.tuskDrift.initialize(initParams);\n  }\n\n  markAppAsReady(): void {\n    return this.tuskDrift.markAppAsReady();\n  }\n\n  isAppReady(): boolean {\n    return this.tuskDrift.isAppReady();\n  }\n}\n\n// Export singleton instance with restricted API\nexport const TuskDrift: TuskDriftPublicAPI = new TuskDriftSDK();\n"],"x_google_ignoreList":[62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102],"mappings":"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"}