{"version":3,"sources":["../src/metrics/api-provider-metrics.ts","../src/tracing/api-provider-tracing.ts","../src/http-client/common.ts","../src/http-client/node-fetch-wrapper.ts","../src/http-client/axios-wrapper.ts","../src/utils/module-import-util.ts"],"names":["metrics","trace","SpanKind","SpanStatusCode","otelContext","logger","Logger","axios","AXIOS_INSTANCE_TOKEN","HttpModule"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Histogram, Counter, UpDownCounter, metrics, Meter } from '@opentelemetry/api';\nimport type { RequestInfo, ResponseInfo } from '../typing.js';\n\nexport interface ProviderMetricsConfig {\n  enabled: boolean;\n  meterName?: string;\n  meterVersion?: string;\n  // eslint-disable-next-line no-unused-vars\n  getStatusCategory?: (statusCode: number | string) => string;\n  // eslint-disable-next-line no-unused-vars\n  isSuccessStatus?: (statusCode: number) => boolean;\n}\n\nexport interface ProviderMetricsCollection {\n  // API Provider latency metrics\n  providerLatency: Histogram;\n\n  // Provider success rate metrics\n  providerRequests: Counter;\n  providerSuccesses: Counter;\n  providerFailures: Counter;\n\n  // Active requests gauge\n  activeRequests: UpDownCounter;\n\n  // Request/response size metrics\n  requestSize: Histogram;\n  responseSize: Histogram;\n}\n\ninterface BaseProviderLabels {\n  provider: string;\n  api_key: string;\n  host: string;\n}\n\ninterface FullProviderLabels extends BaseProviderLabels {\n  method: string;\n  path: string;\n  status_code: string;\n  status_category: string;\n}\n\nexport class ProviderMetricsManager {\n  private metrics: ProviderMetricsCollection;\n  private config: Required<ProviderMetricsConfig>;\n  private meter: Meter;\n\n  constructor(config: ProviderMetricsConfig = {\n    enabled: true,\n  }) {\n    this.config = {\n      meterName: 'api-provider-metrics',\n      meterVersion: '1.0.0',\n      getStatusCategory: this.getStatusCategory.bind(this),\n      isSuccessStatus: (statusCode: number): boolean => statusCode >= 200 && statusCode < 400,\n      ...config,\n    };\n\n    this.meter = metrics.getMeter(\n      this.config.meterName,\n      this.config.meterVersion,\n    );\n\n    this.metrics = {} as ProviderMetricsCollection;\n    this.initializeMetrics();\n  }\n\n  private initializeMetrics(): void {\n    // API Provider latency histogram\n    this.metrics.providerLatency = this.meter.createHistogram('api_provider_latency_ms', {\n      description: 'API provider request latency in milliseconds, will ignore failed requests',\n      unit: 'ms',\n      advice: {\n        // 50ms -> 60s\n        explicitBucketBoundaries: [50, 100, 500, 1000, 2000, 5000, 10000, 30000, 60000],\n      },\n    });\n\n    // Provider request counters\n    this.metrics.providerRequests = this.meter.createCounter('api_provider_requests_total', {\n      description: 'Total number of requests to API providers',\n    });\n\n    this.metrics.providerSuccesses = this.meter.createCounter('api_provider_successes_total', {\n      description: 'Total number of successful requests to API providers',\n    });\n\n    this.metrics.providerFailures = this.meter.createCounter('api_provider_failures_total', {\n      description: 'Total number of failed requests to API providers',\n    });\n\n    // Active requests gauge\n    this.metrics.activeRequests = this.meter.createUpDownCounter('api_provider_active_requests', {\n      description: 'Number of currently active requests to API providers',\n    });\n\n    // Request size histogram\n    this.metrics.requestSize = this.meter.createHistogram('api_provider_request_size_bytes', {\n      description: 'Size of API provider requests in bytes',\n      unit: 'bytes',\n      advice: {\n        // 100bytes -> 60KB\n        explicitBucketBoundaries: [100, 500, 1000, 2000, 5000, 10000, 30000, 60000],\n      },\n    });\n\n    // Response size histogram\n    this.metrics.responseSize = this.meter.createHistogram('api_provider_response_size_bytes', {\n      description: 'Size of API provider responses in bytes',\n      unit: 'bytes',\n      advice: {\n        // 100bytes -> 60KB\n        explicitBucketBoundaries: [100, 500, 1000, 2000, 5000, 10000, 30000, 60000],\n      },\n    });\n  }\n\n  private recordResponseSize(\n    attributes: BaseProviderLabels,\n    responseSize: number,\n  ): void {\n    this.metrics.responseSize.record(responseSize, {\n      provider: attributes.provider,\n      api_key: attributes.api_key,\n      host: attributes.host,\n    });\n  }\n\n  private recordRequestSize(\n    attributes: BaseProviderLabels,\n    requestSize: number,\n  ): void {\n    this.metrics.requestSize.record(requestSize, {\n      provider: attributes.provider,\n      api_key: attributes.api_key,\n      host: attributes.host,\n    });\n  }\n\n  private changeActiveRequests(\n    attributes: BaseProviderLabels,\n    delta: number,\n  ): void {\n    this.metrics.activeRequests.add(delta, {\n      provider: attributes.provider,\n      api_key: attributes.api_key,\n      host: attributes.host,\n    });\n  }\n\n  private incrementProviderRequests(\n    attributes: FullProviderLabels,\n  ): void {\n    this.metrics.providerRequests.add(1, {\n      provider: attributes.provider,\n      api_key: attributes.api_key,\n      host: attributes.host,\n      method: attributes.method,\n      path: attributes.path,\n      status_code: attributes.status_code,\n      status_category: attributes.status_category,\n    });\n  }\n\n  private incrementProviderSuccesses(\n    attributes: FullProviderLabels,\n  ): void {\n    this.metrics.providerSuccesses.add(1, {\n      provider: attributes.provider,\n      api_key: attributes.api_key,\n      host: attributes.host,\n      method: attributes.method,\n      path: attributes.path,\n      status_category: attributes.status_category,\n    });\n  }\n\n  private incrementProviderFailures(\n    attributes: FullProviderLabels,\n  ): void {\n    this.metrics.providerFailures.add(1, {\n      provider: attributes.provider,\n      api_key: attributes.api_key,\n      host: attributes.host,\n      method: attributes.method,\n      path: attributes.path,\n      status_category: attributes.status_category,\n    });\n  }\n\n  private recordProviderLatency(\n    attributes: BaseProviderLabels,\n    duration: number,\n  ): void {\n    this.metrics.providerLatency.record(duration, {\n      provider: attributes.provider,\n      api_key: attributes.api_key,\n      host: attributes.host,\n    });\n  }\n\n  recordRequestStart(requestInfo: RequestInfo): void {\n    if (!this.config.enabled) return;\n\n    // Increment active requests\n    this.changeActiveRequests({\n      ...requestInfo,\n      api_key: requestInfo.apiKey,\n    }, 1);\n\n    // Record request size if available\n    if (requestInfo.requestSize !== undefined) {\n      this.recordRequestSize({\n        ...requestInfo,\n        api_key: requestInfo.apiKey,\n      }, requestInfo.requestSize);\n    }\n  }\n\n  recordRequestComplete(responseInfo: ResponseInfo): void {\n    if (!this.config.enabled) return;\n\n    // Record latency\n    this.recordProviderLatency({\n      ...responseInfo,\n      api_key: responseInfo.apiKey,\n    }, responseInfo.duration);\n\n    // Record response size if available\n    this.recordResponseSize({\n      ...responseInfo,\n      api_key: responseInfo.apiKey,\n    }, responseInfo.responseSize);\n\n    // Record provider request counters\n    this.incrementProviderRequests({\n      ...responseInfo,\n      api_key: responseInfo.apiKey,\n      status_code: responseInfo.statusCode.toString(),\n      status_category: this.config.getStatusCategory(responseInfo.statusCode),\n    });\n\n    // Record success or failure\n    if (this.config.isSuccessStatus(responseInfo.statusCode)) {\n      this.incrementProviderSuccesses({\n        ...responseInfo,\n        api_key: responseInfo.apiKey,\n        status_code: responseInfo.statusCode.toString(),\n        status_category: this.config.getStatusCategory(responseInfo.statusCode),\n      });\n    } else {\n      this.incrementProviderFailures({\n        ...responseInfo,\n        api_key: responseInfo.apiKey,\n        status_code: responseInfo.statusCode.toString(),\n        status_category: this.config.getStatusCategory(responseInfo.statusCode),\n      });\n    }\n\n    // Decrement active requests\n    this.changeActiveRequests({\n      ...responseInfo,\n      api_key: responseInfo.apiKey,\n    }, -1);\n  }\n\n  recordRequestError(\n    requestInfo: RequestInfo,\n    errorType: string,\n    shouldDecrementActiveRequests: boolean,\n  ): void {\n    if (!this.config.enabled) return;\n\n    const codeString = errorType.substring(0, 10);\n    // Record provider failure\n    this.incrementProviderFailures({\n      ...requestInfo,\n      api_key: requestInfo.apiKey,\n      status_code: codeString,\n      status_category: this.config.getStatusCategory(codeString),\n    });\n\n    // Decrement active requests if requested (to avoid double-decrementing)\n    if (shouldDecrementActiveRequests) {\n      this.changeActiveRequests({\n        ...requestInfo,\n        api_key: requestInfo.apiKey,\n      }, -1);\n    }\n  }\n\n  private getStatusCategory(statusCode: number | string): string {\n    if (typeof statusCode === 'string') return statusCode;\n    if (this.config.isSuccessStatus(statusCode)) return 'success';\n    if (statusCode >= 300 && statusCode < 400) return 'redirection';\n    if (statusCode >= 400 && statusCode < 500) return 'client_error';\n    if (statusCode >= 500) return 'server_error';\n    return 'unknown';\n  }\n\n  // Get metrics collection for advanced usage\n  getMetrics(): ProviderMetricsCollection {\n    return this.metrics;\n  }\n\n  // Get the OpenTelemetry meter for advanced usage\n  getMeter(): Meter {\n    return this.meter;\n  }\n}\n\n// Global metrics instance (singleton)\nlet defaultProviderMetrics: ProviderMetricsManager | null = null;\n\n/**\n * Initialize provider metrics with OpenTelemetry\n * @returns ProviderMetricsManager instance\n */\nexport function initializeProviderMetrics(\n  config?: ProviderMetricsConfig,\n): ProviderMetricsManager {\n  defaultProviderMetrics ??= new ProviderMetricsManager(config);\n  return defaultProviderMetrics;\n}\n\n/**\n * Get default provider metrics instance\n * @returns ProviderMetricsManager instance or creates new one if not exists\n */\nexport function getProviderMetrics(): ProviderMetricsManager {\n  defaultProviderMetrics ??= new ProviderMetricsManager();\n  return defaultProviderMetrics;\n}\n","import { Logger } from '@universal-kit/logger';\nimport { trace, SpanKind, SpanStatusCode, context as otelContext, Tracer, Span } from '@opentelemetry/api';\nimport { ErrorContext, RequestInfo, ResponseInfo } from '../typing';\n\nexport interface RequestTraceConfig {\n  enabled?: boolean; // Default: true\n  tracingName?: string; // Default: 'api-provider-tracing'\n  tracingVersion?: string; // Default: '1.0.0'\n  traceFailedRequests?: boolean; // Default: true\n  logRequestEvents?: boolean; // Default: true\n  includeFailedRequestBody?: boolean; // Default: true\n}\n\ninterface RequestEvent extends RequestInfo {\n  type: 'start' | 'complete' | 'error' | 'retry';\n  timestamp: number;\n  statusCode?: number;\n  duration?: number;\n  error?: Error;\n  metadata?: Record<string, unknown>;\n}\n\nexport class RequestTracer {\n  private config: Required<RequestTraceConfig>;\n  private logger: Logger;\n  private tracer: Tracer;\n\n  constructor(config: RequestTraceConfig, logger: Logger) {\n    this.config = {\n      enabled: true,\n      tracingName: 'api-provider-tracing',\n      tracingVersion: '1.0.0',\n      traceFailedRequests: true,\n      logRequestEvents: true,\n      includeFailedRequestBody: true,\n      ...config,\n    };\n\n    this.logger = logger;\n\n    this.tracer = trace.getTracer(this.config.tracingName, this.config.tracingVersion);\n  }\n\n  createRequestSpan(\n    requestInfo: RequestInfo,\n  ): Span | null {\n    if (!this.config.enabled) return null;\n\n    const span = this.tracer.startSpan(\n      `HTTP ${requestInfo.method} ${requestInfo.path}`,\n      {\n        kind: SpanKind.CLIENT,\n        attributes: {\n          'request.id': requestInfo.requestId,\n          'api.provider': requestInfo.provider,\n          'api.key': requestInfo.apiKey,\n          'http.host': requestInfo.host,\n          'http.method': requestInfo.method,\n          'http.path': requestInfo.path,\n        },\n      },\n    );\n\n    return span;\n  }\n\n  logRequestEvent(event: RequestEvent): void {\n    if (!this.config.enabled || !this.config.logRequestEvents) return;\n\n    const baseMessage = `Request ${event.type.toUpperCase()} ${event.method} ${event.url}`;\n    const logData = {\n      requestId: event.requestId,\n      provider: event.provider,\n      apiKey: event.apiKey,\n      statusCode: event.statusCode,\n      duration: event.duration,\n      metadata: event.metadata,\n    };\n    const fullLogData = {\n      ...logData,\n      params: event.params,\n      headers: event.headers,\n    };\n\n    switch (event.type) {\n      case 'start':\n        this.logger.verbose(\n          baseMessage,\n          fullLogData,\n        );\n        break;\n\n      case 'complete':\n        this.logger.info(\n          `${baseMessage} (${event.statusCode})`,\n          { ...logData, statusCode: undefined },\n        );\n        break;\n\n      case 'error':\n        this.logger.error(\n          baseMessage,\n          event.error ?? new Error('Unknown error'),\n          { ...fullLogData, body: event.body },\n        );\n        break;\n\n      case 'retry':\n        this.logger.warn(\n          baseMessage,\n          logData,\n        );\n        break;\n    }\n  }\n\n  logFailedRequestDetails(\n    requestInfo: RequestInfo,\n    error: Error,\n    responseContext: ErrorContext,\n  ): void {\n    if (!this.config.enabled || !this.config.traceFailedRequests) return;\n\n    const errorDetails = {\n      requestId: requestInfo.requestId,\n      method: requestInfo.method,\n      responseContext,\n      url: requestInfo.url,\n      error: {\n        name: error.name,\n        message: error.message,\n        stack: error.stack,\n      },\n      request: this.config.includeFailedRequestBody ? this.sanitizeRequest(requestInfo) : undefined,\n      timestamp: Date.now(),\n    };\n\n    // Log the error summary\n    this.logger.error(\n      `Request failed`,\n      { name: error.name, message: error.message },\n      { requestId: requestInfo.requestId },\n    );\n\n    // Log the detailed error data as structured metadata\n    this.logger.info(\n      `Failed request details:`,\n      errorDetails,\n    );\n  }\n\n  finishRequestSpan(\n    span: Span | null, metrics: ResponseInfo, extraAttributes?: Record<string, string>,\n  ): void {\n    if (!span || !this.config.enabled) return;\n\n    span.setAttributes({\n      'http.status_code': metrics.statusCode,\n      'response.duration_ms': metrics.duration,\n      ...(metrics.provider && { 'api.provider': metrics.provider }),\n      ...(metrics.apiKey && { 'api.key': metrics.apiKey }),\n      ...(metrics.path && { 'http.target': metrics.path }),\n      ...(extraAttributes && { ...extraAttributes }),\n    });\n\n    if (metrics.statusCode && metrics.statusCode >= 400) {\n      span.setStatus({\n        code: SpanStatusCode.ERROR,\n        message: `HTTP ${metrics.statusCode}`,\n      });\n    } else {\n      span.setStatus({\n        code: SpanStatusCode.OK,\n      });\n    }\n\n    span.end();\n  }\n\n  private sanitizeRequest(request: RequestInfo): Record<string, unknown> | undefined {\n    if (!request) return undefined;\n\n    const sanitized: Record<string, unknown> = {\n      headers: request.headers,\n      data: undefined,\n    };\n\n    if (request.body) {\n      const requestData = JSON.stringify(request.body);\n      if (requestData.length <= 2048) { // 2KB limit for request body\n        sanitized.data = request.body;\n      } else {\n        sanitized.data = {\n          type: typeof request.body,\n          size: requestData.length,\n          truncated: true,\n        };\n      }\n    }\n\n    return sanitized;\n  }\n\n  // Get current span from context\n  getCurrentSpan(): Span | undefined {\n    return trace.getSpan(otelContext.active());\n  }\n\n  // Get configuration\n  getConfig(): RequestTraceConfig {\n    return { ...this.config };\n  }\n\n  // Update configuration\n  updateConfig(config: Partial<RequestTraceConfig>): void {\n    this.config = { ...this.config, ...config };\n  }\n}\n","import { Logger } from '@universal-kit/logger';\nimport { Span } from '@opentelemetry/api';\n\nimport { ProviderMetricsManager } from '../metrics/api-provider-metrics.js';\nimport { RequestTracer, type RequestTraceConfig } from '../tracing/api-provider-tracing.js';\nimport type { AxiosRequestMetadata, ErrorContext, RequestInfo, ResponseInfo } from '../typing.js';\n\nexport interface GeneralRequestConfig {\n  url: string;\n  method: string;\n  params?: URLSearchParams | Record<string, unknown>;\n  headers?: RequestInit['headers'];\n  body?: RequestInit['body'];\n}\n\n// eslint-disable-next-line no-unused-vars\ntype ApiKeyResolver = (arg: GeneralRequestConfig) => string;\n\nexport interface BaseWrapperConfig {\n  // name of the API\n  provider: string;\n  getApiKey?: ApiKeyResolver;\n  apiKeyHeader?: string; // Default: 'x-api-key'\n  apiKeyQueryParam?: string; // Default: 'x-api-key'\n  retryConfig?: { // Default: { attempts: 0, delay: 1000 }\n    attempts: number;\n    delay: number;\n  };\n  traceFailedRequests?: boolean; // Default: true\n  logRequestEvents?: boolean; // Default: true\n  redactedHeaders?: string[]; // Headers to redact in logs and traces\n}\n\nexport const defaultApiKey = 'NOT_FOUND_API_KEY';\n\nexport abstract class BaseHttpClient {\n  protected config: Required<BaseWrapperConfig>;\n  protected logger: Logger;\n  protected providerMetrics: ProviderMetricsManager;\n  protected requestTracer: RequestTracer;\n\n  constructor(config: BaseWrapperConfig, logger?: Logger) {\n    this.config = {\n      getApiKey: this.getDefaultApiKey.bind(this),\n      apiKeyHeader: 'x-api-key',\n      apiKeyQueryParam: 'x-api-key',\n      retryConfig: {\n        attempts: 0,\n        delay: 1000,\n      },\n      traceFailedRequests: true,\n      logRequestEvents: true,\n      redactedHeaders: [],\n      ...config,\n    };\n\n    this.logger = logger ?? new Logger({ library: this.config.provider });\n\n    this.providerMetrics = new ProviderMetricsManager({ enabled: true });\n\n    // Initialize request tracer\n    const traceConfig: RequestTraceConfig = {\n      traceFailedRequests: this.config.traceFailedRequests,\n      logRequestEvents: this.config.logRequestEvents,\n    };\n    this.requestTracer = new RequestTracer(traceConfig, this.logger);\n  }\n\n  // Common utility methods\n  protected hashApiKey(apiKey: string): string {\n    if (apiKey === defaultApiKey) return apiKey;\n    // Simple hash implementation for privacy\n    if (apiKey.length <= 8) return '****';\n    return `${apiKey.substring(0, 4)}****${apiKey.substring(apiKey.length - 4)}`;\n  }\n\n  protected normalizeHeaders(headers: RequestInit['headers']): Record<string, string> {\n    const result: Record<string, string> = {};\n\n    if (!headers) return result;\n\n    if (Array.isArray(headers)) {\n      for (const entry of headers) {\n        if (!Array.isArray(entry)) continue;\n        const [key, value] = entry;\n        if (key === undefined || value === undefined) continue;\n        result[String(key)] = String(value);\n      }\n      return result;\n    }\n\n    if ((typeof headers.forEach) === 'function') {\n      headers.forEach((value: string, key: string) => {\n        result[String(key)] = String(value);\n      });\n      return result;\n    }\n\n    for (const [key, value] of Object.entries(headers as Record<string, string>)) {\n      result[String(key)] = String(value);\n    }\n\n    return result;\n  }\n\n  private getDefaultApiKey(config: GeneralRequestConfig): string {\n    const normalizedHeaders = this.normalizeHeaders(config.headers);\n    // try lowercase, uppercase, and original case\n    if (this.config.apiKeyHeader === undefined && this.config.apiKeyQueryParam === undefined) {\n      return defaultApiKey;\n    }\n\n    // try to read from header\n    const headers = [\n      this.config.apiKeyHeader,\n      this.config.apiKeyHeader.toLowerCase(),\n      this.config.apiKeyHeader.toUpperCase(),\n    ];\n    const apiKey = headers.map(header => normalizedHeaders[header]).find(Boolean);\n    if (apiKey) return apiKey;\n\n    // try to read from query param\n    if (this.config.apiKeyQueryParam && config.params) {\n      const queryParamKey = this.config.apiKeyQueryParam;\n      let paramValue: string | null = null;\n\n      if (config.params instanceof URLSearchParams) {\n        paramValue = config.params.get(queryParamKey);\n      } else if (typeof config.params === 'object') {\n        const value = config.params[queryParamKey];\n        paramValue = value != null ? String(value) : null;\n      }\n\n      if (paramValue) return paramValue;\n    }\n\n    return defaultApiKey;\n  }\n\n  protected generateRequestId(): string {\n    return `req_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n\n  protected calculateRequestSize(data?: unknown): number | undefined {\n    if (!data) return undefined;\n\n    if (typeof data === 'string') {\n      return Buffer.byteLength(data, 'utf8');\n    } else if (data instanceof ArrayBuffer) {\n      return data.byteLength;\n    } else if (data instanceof Blob) {\n      return data.size;\n    } else if (data instanceof Uint8Array) {\n      return data.length;\n    } else {\n      // For objects, stringify and measure\n      try {\n        return Buffer.byteLength(JSON.stringify(data), 'utf8');\n      } catch {\n        return 0;\n      }\n    }\n  }\n\n  protected calculateResponseSizeFromHeaders(headers: Record<string, unknown>): number | undefined {\n    const contentLength = headers['content-length'] ?? headers['Content-Length'];\n    if (typeof contentLength === 'string' && contentLength.length > 0) {\n      return parseInt(contentLength, 10);\n    }\n    return undefined;\n  }\n\n  protected calculateResponseSizeFromData(data?: unknown): number | undefined {\n    if (!data) return undefined;\n\n    try {\n      return Buffer.byteLength(JSON.stringify(data), 'utf8');\n    } catch {\n      return undefined;\n    }\n  }\n\n  protected parseUrl(url: string): { host: string; pathname: string; params: Record<string, string> } {\n    try {\n      const parsedUrl = new URL(url);\n      const host = parsedUrl.hostname && parsedUrl.hostname.length > 0 ? parsedUrl.hostname : 'unknown';\n      const pathname = parsedUrl.pathname && parsedUrl.pathname.length > 0 ? parsedUrl.pathname : '/';\n      return {\n        host,\n        pathname,\n        params: Object.fromEntries(parsedUrl.searchParams.entries()),\n      };\n    } catch {\n      // Fallback for relative URLs\n      const [rawPath, rawQuery] = url.split('?');\n      const pathname = rawPath && rawPath.length > 0 ? rawPath : '/';\n      const query = rawQuery ?? '';\n      return {\n        host: 'localhost',\n        pathname,\n        params: Object.fromEntries(new URLSearchParams(query).entries()),\n      };\n    }\n  }\n\n  protected requestDataAttributes(request: Pick<RequestInfo, 'headers' | 'body'>): Record<string, string> {\n    if (!request) return {};\n    // create attributes for headers and body info\n    const sanitized: Record<string, string> = {};\n\n    if (request.headers) {\n      sanitized['request.headers'] = JSON.stringify(request.headers);\n    }\n\n    if (request.body) {\n      const bodyData = JSON.stringify(request.body);\n      if (bodyData.length <= 2048) { // 2KB limit for request body\n        sanitized['request.body'] = bodyData;\n      } else {\n        sanitized['request.body'] = `type: ${typeof request.body}, size: ${bodyData.length}, truncated: true`;\n      }\n    }\n\n    return sanitized;\n  }\n\n  protected createRequestInfo(\n    config: GeneralRequestConfig,\n  ): RequestInfo {\n    const url = config.url ?? '';\n    const requestId = this.generateRequestId();\n    const { host, pathname, params } = this.parseUrl(url);\n    // combine params read from URL and config.params\n    if (config.params) {\n      // Handle different types of params (URLSearchParams, plain object, etc.)\n      if (config.params instanceof URLSearchParams) {\n        for (const [key, value] of config.params.entries()) {\n          params[key] = value;\n        }\n      } else if (typeof config.params === 'object') {\n        // Handle plain object params (e.g., from Axios)\n        for (const [key, value] of Object.entries(config.params)) {\n          params[key] = String(value);\n        }\n      }\n      config.params = new URLSearchParams(params);\n    }\n\n    const _apikey = this.config.getApiKey(config);\n    const headersRecord = this.normalizeHeaders(config.headers);\n    const sanitizedHeaders = this.sanitizeHeaders(headersRecord, _apikey);\n\n    const apiKey = this.hashApiKey(_apikey);\n    const method = config.method ? config.method.toUpperCase() : 'GET';\n    const requestSize = this.calculateRequestSize(config.body);\n\n    return {\n      requestId,\n      provider: this.config.provider,\n      apiKey,\n      url,\n      host,\n      method,\n      path: pathname,\n      headers: sanitizedHeaders,\n      params,\n      body: config.body,\n      ...(requestSize !== undefined && { requestSize }),\n    };\n  }\n\n  protected sanitizeHeaders(headers: Record<string, string>, apiKey: string): Record<string, string> {\n    const sanitized: Record<string, string> = {};\n    const apiKeyHeader = this.config.apiKeyHeader?.toLowerCase();\n    const redactedHeaders = this.config.redactedHeaders?.map(header => header.toLowerCase()) ?? [];\n\n    for (const [key, value] of Object.entries(headers)) {\n      const lowerKey = key.toLowerCase();\n      let sanitizedValue = value;\n\n      if (apiKeyHeader && lowerKey === apiKeyHeader) {\n        sanitizedValue = '****';\n      } else if (redactedHeaders.includes(lowerKey)) {\n        sanitizedValue = '****';\n      } else if (value === apiKey) {\n        sanitizedValue = '****';\n      }\n\n      sanitized[key] = sanitizedValue;\n    }\n\n    return sanitized;\n  }\n\n  protected processRequestStart(\n    requestInfo: RequestInfo,\n  ): { span: Span | null; startTime: number } {\n    const startTime = Date.now();\n\n    // Create request span for tracing\n    const span = this.requestTracer.createRequestSpan(requestInfo);\n\n    // Log request start event\n    this.requestTracer.logRequestEvent({\n      ...requestInfo,\n      type: 'start',\n      timestamp: startTime,\n    });\n\n    // Record provider metrics start\n    this.providerMetrics.recordRequestStart(requestInfo);\n\n    return { span, startTime };\n  }\n\n  protected processRequestComplete(\n    requestMetadata: AxiosRequestMetadata,\n    statusCode: number,\n    responseSize: number,\n  ): ResponseInfo {\n    const duration = Date.now() - requestMetadata.startTime;\n    const responseInfo: ResponseInfo = {\n      ...requestMetadata.requestInfo,\n      duration,\n      statusCode,\n      responseSize,\n    };\n\n    // Record provider metrics\n    this.providerMetrics.recordRequestComplete(responseInfo);\n\n    // Log request completion\n    this.requestTracer.logRequestEvent({\n      ...responseInfo,\n      type: 'complete',\n      timestamp: Date.now(),\n    });\n\n    // Finish request span\n    this.requestTracer.finishRequestSpan(\n      requestMetadata.span,\n      responseInfo,\n    );\n\n    return responseInfo;\n  }\n\n  protected processRequestError(\n    requestMetadata: AxiosRequestMetadata,\n    error: Error,\n    responseContext?: ErrorContext,\n    spanAlreadyFinished: boolean = false,\n  ): RequestInfo {\n    const duration = Date.now() - requestMetadata.startTime;\n    const { requestInfo } = requestMetadata;\n\n    // Record provider error metrics\n    // If response was already processed (for Axios errors with response), don't decrement active requests again\n    const shouldDecrementActiveRequests = !responseContext?.responseAlreadyProcessed;\n    this.providerMetrics.recordRequestError(\n      requestInfo,\n      error.constructor.name,\n      shouldDecrementActiveRequests,\n    );\n\n    // Log request error\n    this.requestTracer.logRequestEvent({\n      ...requestInfo,\n      type: 'error',\n      timestamp: Date.now(),\n      duration,\n      error,\n    });\n\n    // Log detailed failed request information\n    if (this.config.traceFailedRequests) {\n      this.requestTracer.logFailedRequestDetails(\n        requestInfo,\n        error,\n        responseContext ?? {},\n      );\n    }\n\n    // Only finish the span if it hasn't been finished already\n    if (!spanAlreadyFinished) {\n      // axios error may have response with status code\n      const statusCode = (error as { response?: { status?: number } }).response?.status ?? 501;\n      // Finish request span with error\n      this.requestTracer.finishRequestSpan(\n        requestMetadata.span,\n        { ...requestInfo, duration, statusCode, responseSize: 0 },\n        this.requestDataAttributes(requestMetadata.requestInfo),\n      );\n    }\n\n    return requestInfo;\n  }\n\n  getProviderMetricsManager(): ProviderMetricsManager {\n    return this.providerMetrics;\n  }\n\n  getRequestTracer(): RequestTracer {\n    return this.requestTracer;\n  }\n}\n","import { Logger } from '@universal-kit/logger';\nimport { BaseHttpClient, type BaseWrapperConfig } from './common.js';\nimport type { AxiosRequestMetadata } from '../typing.js';\n\ntype InstrumentedRequest = Request & { skipMetrics?: boolean };\n\ninterface InstrumentedRequestInit extends RequestInit {\n  skipMetrics?: boolean;\n}\n\nexport class NodeFetchWrapper extends BaseHttpClient {\n  constructor(\n    config: BaseWrapperConfig,\n    logger?: Logger,\n  ) {\n    const baseConfig: BaseWrapperConfig = {\n      ...config,\n      provider: `${config.provider}:${NodeFetchWrapper.name}`,\n    };\n\n    super(baseConfig, logger);\n  }\n\n  private stripInstrumentationOptions(options: InstrumentedRequestInit): RequestInit {\n    const clonedOptions = { ...options };\n    delete clonedOptions.skipMetrics;\n    return clonedOptions;\n  }\n\n  private async determineResponseSize(response: Response): Promise<number> {\n    const headersRecord = this.normalizeHeaders(response.headers);\n    const headerSize = this.calculateResponseSizeFromHeaders(headersRecord);\n\n    if (headerSize !== undefined) {\n      return headerSize;\n    }\n\n    try {\n      const clone = response.clone();\n      const buffer = await clone.arrayBuffer();\n      return buffer.byteLength;\n    } catch {\n      return 0;\n    }\n  }\n\n  private async makeRequest(\n    method: string,\n    url: string,\n    options: InstrumentedRequestInit = {},\n  ): Promise<Response> {\n    const skipMetrics = options.skipMetrics ?? false;\n    const requestInit: RequestInit = { ...this.stripInstrumentationOptions(options), method };\n\n    if (skipMetrics) {\n      return fetch(url, requestInit);\n    }\n\n    const requestInfo = this.createRequestInfo({\n      method,\n      url,\n      headers: options.headers,\n      body: options.body,\n    });\n    const { span, startTime } = this.processRequestStart(requestInfo);\n    const metadata: AxiosRequestMetadata = {\n      startTime,\n      requestInfo,\n      span: span ?? null,\n    };\n\n    try {\n      const response = await fetch(url, requestInit);\n      const responseSize = await this.determineResponseSize(response);\n\n      this.processRequestComplete(metadata, response.status, responseSize);\n\n      return response;\n    } catch (error) {\n      const normalizedError = error instanceof Error ? error : new Error('Unknown error');\n      this.processRequestError(metadata, normalizedError);\n      throw normalizedError;\n    }\n  }\n\n  private async withRetry<T>(\n    operation: () => Promise<T>,\n    attempt: number = 1,\n  ): Promise<T> {\n    try {\n      return await operation();\n    } catch (error) {\n      if (\n        attempt < this.config.retryConfig.attempts &&\n        this.shouldRetry(error)\n      ) {\n        this.logger.warn(\n          `Request failed, retrying (${attempt}/${this.config.retryConfig.attempts})`,\n          {\n            attempt,\n            error: error instanceof Error ? error.message : 'Unknown error',\n          },\n        );\n\n        await this.delay(this.config.retryConfig.delay * attempt);\n        return this.withRetry(operation, attempt + 1);\n      }\n      throw error;\n    }\n  }\n\n  private shouldRetry(error: unknown): boolean {\n    if (error instanceof Error) {\n      const message = error.message.toLowerCase();\n      return (\n        error.name === 'AbortError' ||\n        message.includes('timeout') ||\n        message.includes('network') ||\n        message.includes('fetch')\n      );\n    }\n    return false;\n  }\n\n  private delay(ms: number): Promise<void> {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  }\n\n  async fetch(input: string | URL | Request, init?: InstrumentedRequestInit): Promise<Response> {\n    const baseOptions: InstrumentedRequestInit = { ...(init ?? {}) };\n    let url: string;\n\n    if (input instanceof Request) {\n      const request = input as InstrumentedRequest;\n      const {\n        url: requestUrl,\n        method: requestMethod,\n        headers: requestHeaders,\n        body: requestBody,\n        signal: requestSignal,\n        skipMetrics: requestSkipMetrics,\n      } = request;\n\n      url = requestUrl;\n      baseOptions.method = baseOptions.method ?? requestMethod;\n      baseOptions.headers = baseOptions.headers ?? requestHeaders;\n      if (baseOptions.body === undefined && requestBody !== null) {\n        baseOptions.body = requestBody;\n      }\n      if (baseOptions.signal === undefined) {\n        baseOptions.signal = requestSignal;\n      }\n      if (baseOptions.skipMetrics === undefined && requestSkipMetrics !== undefined) {\n        baseOptions.skipMetrics = requestSkipMetrics;\n      }\n    } else {\n      url = input instanceof URL ? input.toString() : input;\n    }\n\n    const method = (baseOptions.method ?? 'GET').toUpperCase();\n    const options: InstrumentedRequestInit = { ...baseOptions, method };\n\n    return await this.withRetry(() =>\n      this.makeRequest(method, url, options),\n    );\n  }\n}\n","import axios, {\n  AxiosInstance,\n  AxiosRequestConfig,\n  AxiosResponse,\n  AxiosError,\n  InternalAxiosRequestConfig,\n} from 'axios';\nimport { Logger } from '@universal-kit/logger';\nimport { BaseHttpClient, type BaseWrapperConfig, type GeneralRequestConfig } from './common.js';\nimport type { AxiosRequestMetadata, ErrorContext } from '../typing.js';\n\n// Axios-compatible interfaces\nexport interface AxiosWrapperRequestConfig<TData = unknown> extends AxiosRequestConfig<TData> {\n  skipMetrics?: boolean;\n}\n\n/**\n * Axios wrapper that provides automatic API usage measurement\n * while maintaining full compatibility with Axios API\n */\nexport class AxiosWrapper extends BaseHttpClient {\n  private axiosInstance: AxiosInstance;\n\n  constructor(config: BaseWrapperConfig, logger?: Logger) {\n    // Create a temporary bound function after super call\n    const baseConfig: BaseWrapperConfig = {\n      ...config,\n      provider: `${config.provider}:${AxiosWrapper.name}`,\n    };\n\n    super(baseConfig, logger);\n\n    // Create Axios instance with base configuration\n    this.axiosInstance = axios.create();\n\n    this.setupInterceptors();\n  }\n\n  private convertConfigToRequestInfo(config: InternalAxiosRequestConfig): GeneralRequestConfig {\n    return {\n      url: config.url ?? '',\n      method: config.method ?? 'GET',\n      headers: config.headers,\n      body: config.data,\n      params: config.params,\n    };\n  }\n\n  private setupInterceptors(): void {\n    // Request interceptor\n    this.axiosInstance.interceptors.request.use(\n      config => {\n        if (!config.skipMetrics) {\n          const requestInfo = this.createRequestInfo(this.convertConfigToRequestInfo(config));\n          const { span, startTime } = this.processRequestStart(requestInfo);\n\n          const existingMetadata = config.metadata ?? {};\n          config.metadata = {\n            ...existingMetadata,\n            startTime,\n            requestInfo,\n            span: span ?? null,\n          };\n        }\n        return config;\n      },\n      error => {\n        return Promise.reject(error);\n      },\n      { synchronous: true, runWhen: () => /* This function returns true */ true },\n    );\n\n    // Response interceptor\n    this.axiosInstance.interceptors.response.use(\n      response => {\n        if (!response.config.skipMetrics) {\n          this.processResponse(response);\n          // TODO process error, but the error should be null here\n          // this.processError(null, true);\n        }\n        return response;\n      },\n      (error: AxiosError) => {\n        if (!error.config?.skipMetrics) {\n          if (error.response) {\n            // TODO span should not closed by processResponse\n            // For errors with responses, process the response first to handle completion metrics\n            this.processResponse(error.response);\n            // Then process the error, but don't decrement active requests again\n            this.processError(error, true); // Pass flag indicating response was already processed\n          } else {\n            // For errors without responses, process the error normally\n            this.processError(error, false);\n          }\n        }\n        return Promise.reject(error);\n      },\n    );\n  }\n\n  private processResponse(response: AxiosResponse): void {\n    const requestMetadata: AxiosRequestMetadata | undefined = response.config.metadata;\n    if (!requestMetadata) {\n      return;\n    }\n    let responseSize: number = 0;\n    // Calculate response size if available\n    const contentLength = response.headers['content-length'];\n    if (contentLength) {\n      responseSize = parseInt(contentLength, 10);\n    } else if (response.data) {\n      try {\n        responseSize = Buffer.byteLength(JSON.stringify(response.data), 'utf8');\n      } catch {\n        responseSize = 0;\n      }\n    }\n    const statusCode = response.status;\n\n    this.processRequestComplete(requestMetadata, statusCode, responseSize);\n  }\n\n  private processError(error: AxiosError, responseAlreadyProcessed: boolean = false): void {\n    const requestMetadata: AxiosRequestMetadata | undefined = error.config?.metadata;\n    if (!requestMetadata) {\n      return;\n    }\n    const responseMessage = error.response?.statusText;\n    const responseStatus = error.response?.status;\n    const errorContext: ErrorContext = {\n      responseMessage,\n      responseStatus,\n      responseAlreadyProcessed,\n    };\n    const spanAlreadyFinished = responseAlreadyProcessed;\n\n    this.processRequestError(requestMetadata, error, {\n      ...errorContext,\n    }, spanAlreadyFinished);\n  }\n\n  request(config: AxiosWrapperRequestConfig): Promise<AxiosResponse> {\n    return this.axiosInstance.request(config);\n  }\n\n  get<T = unknown, R = AxiosResponse<T>>(url: string, config?: AxiosWrapperRequestConfig<T>): Promise<R> {\n    return this.axiosInstance.get<T, R>(url, config);\n  }\n\n  post<T = unknown, R = AxiosResponse<T>>(url: string, data?: T, config?: AxiosWrapperRequestConfig<T>): Promise<R> {\n    return this.axiosInstance.post<T, R>(url, data, config);\n  }\n\n  // Get underlying Axios instance for advanced usage\n  getAxiosInstance(): AxiosInstance {\n    return this.axiosInstance;\n  }\n}\n\n// Extend AxiosRequestConfig to include metadata\ndeclare module 'axios' {\n  interface AxiosRequestConfig {\n    metadata?: AxiosRequestMetadata;\n    skipMetrics?: boolean;\n  }\n\n  interface InternalAxiosRequestConfig {\n    metadata?: AxiosRequestMetadata;\n    skipMetrics?: boolean;\n  }\n}\n","import { HttpModule, HttpModuleAsyncOptions, HttpModuleOptions } from '@nestjs/axios';\nimport { AXIOS_INSTANCE_TOKEN } from '@nestjs/axios/dist/http.constants';\nimport { DynamicModule } from '@nestjs/common';\nimport { AxiosWrapper } from '../http-client/axios-wrapper.js';\n\nfunction getHttpModule(\n  options: {\n    provider: string\n    apiKeyHeader?: string\n    apiKeyQueryParam?: string\n    redactedHeaders?: string[]\n  },\n  httpModuleOptions?: HttpModuleAsyncOptions,\n  axiosWrapper?: AxiosWrapper,\n): DynamicModule {\n  axiosWrapper ??= new AxiosWrapper({\n    provider: options.provider,\n    apiKeyHeader: options.apiKeyHeader,\n    apiKeyQueryParam: options.apiKeyQueryParam,\n    redactedHeaders: options.redactedHeaders ?? [],\n  });\n\n  httpModuleOptions ??= {\n    useFactory: (): HttpModuleOptions => ({\n      timeout: 60000,\n    }),\n  };\n  httpModuleOptions.extraProviders = [\n    ...(httpModuleOptions.extraProviders ?? []),\n    {\n      provide: AXIOS_INSTANCE_TOKEN,\n      useValue: axiosWrapper.getAxiosInstance(),\n    },\n  ];\n\n  return HttpModule.registerAsync(httpModuleOptions);\n}\n\nexport { getHttpModule };\n"]}