{"version":3,"sources":["../../src/services/RequestMonitoringService.ts"],"sourcesContent":["import { PassThrough } from 'stream';\nimport type { IncomingMessage, ClientRequest } from 'http';\nimport { CoolhandCallData, CoolhandRequestOptions, CoolhandMatchedPattern } from '../types';\nimport { PatternMatchingService } from './PatternMatchingService.js';\nimport { parseBody } from '../utils/parse-body.js';\nimport { decompressBuffer, MAX_DECOMPRESSED_BYTES } from '../utils/decompress.js';\nimport { CappedBuffer } from '../utils/capped-buffer.js';\nimport { isNonInferenceURL } from '../non-inference-filter.js';\nimport { createResponseTee } from '../utils/tee-response.js';\nimport { normalizeRequestArgs } from '../utils/normalize-request-args.js';\n\ntype OriginalRequestFn = typeof import('http').request | typeof import('https').request;\n\n// Node.js http/https modules — loaded via createRequire rather than a static\n// `import * as https from 'https'`. tsup's CJS output compiles a static import to\n// `__toESM(require(\"https\"))`, whose __copyProps helper defines properties without\n// `configurable: true` (defaults to false), so the Object.defineProperty patching\n// below would silently no-op. createRequire returns the real, mutable CJS module\n// object instead. See global-monitor.ts's loadNodeModulesSync for the sibling fix\n// (issue #25) this mirrors — the synchronous half only, since setupMonitoring()\n// below is called synchronously from Coolhand's constructor and has no async path.\nlet https: any = null;\nlet http: any = null;\n\nlet _createRequire: ((id: string) => any) | null = null;\ntry { _createRequire = (require as any)('module').createRequire; } catch { /* not available in native ESM */ }\n\n// createRequire accepts a file URL string or an absolute path. The fallback is an\n// absolute path, not a hand-built 'file://' + process.cwd(): that produces\n// 'file://C:\\Users\\...' on Windows (drive letter in the URL host slot), and building\n// a valid URL would need url.pathToFileURL — a Node import this file must not take.\n// eval() keeps import.meta.url out of the CJS build, where it is a compile error.\nconst createRequireBase = (): string => {\n  try { return eval('import.meta.url') as string; } catch { /* CJS — no import.meta */ }\n  return process.cwd() + '/';\n};\n\nconst loadNodeModules = (): boolean => {\n  if (!_createRequire) { return false; } // native ESM — no synchronous fallback available\n  try {\n    const req = _createRequire(createRequireBase());\n    https = req('https');\n    http = req('http');\n    return true;\n  } catch {\n    return false;\n  }\n};\n\nexport class RequestMonitoringService {\n  private callCounter: number = 0;\n  private interceptedCalls: number = 0;\n  private silent: boolean;\n  private patternMatchingService: PatternMatchingService;\n  private static isPatched: boolean = false;\n  public excludeApiPatterns: string[] = [];\n\n  constructor(\n    patternMatchingService: PatternMatchingService,\n    silent: boolean = true\n  ) {\n    this.patternMatchingService = patternMatchingService;\n    this.silent = silent;\n  }\n\n  public setupMonitoring(): void {\n    if (!RequestMonitoringService.isPatched) {\n      if (loadNodeModules()) {\n        // Patch HTTPS\n        this.patchHTTPS();\n\n        // Patch HTTP (some libraries might use HTTP with upgrade)\n        this.patchHTTP();\n      } else {\n        console.warn('⚠️  Node.js HTTP modules not available - HTTP/HTTPS interception disabled (fetch() interception still active)');\n      }\n\n      // Patch fetch if available (Node 18+)\n      this.patchFetch();\n\n      RequestMonitoringService.isPatched = true;\n    }\n\n    // Debug: Log when any request happens\n    this.log('📡 Monitoring all outbound requests...');\n  }\n\n  private patchHTTPS(): void {\n    const originalRequest = https.request;\n    const originalGet = https.get;\n    const monitor = this;\n\n    try {\n      const requestDescriptor = Object.getOwnPropertyDescriptor(https, 'request');\n      if (!requestDescriptor || requestDescriptor.configurable !== false) {\n        Object.defineProperty(https, 'request', {\n          value: function(\n            urlOrOptions: CoolhandRequestOptions | string | URL,\n            optionsOrCallback?: CoolhandRequestOptions | ((res: IncomingMessage) => void),\n            extraCallback?: (res: IncomingMessage) => void\n          ) {\n            const { options, callback } = normalizeRequestArgs(urlOrOptions, optionsOrCallback, extraCallback);\n            monitor.debugRequest('HTTPS REQUEST', options);\n\n            // Check if this matches any API pattern\n            const matchedPattern = monitor.patternMatchingService.matchesAPIPatternSync(options);\n\n            if (matchedPattern) {\n              if (monitor.isExcluded(options, 'https')) {\n                return originalRequest.call(this, options as any, callback as any);\n              }\n              const method = typeof options === 'object' && 'method' in options ? (options as any).method || 'GET' : 'GET';\n              if (isNonInferenceURL(monitor.buildURL(options, 'https'), method)) {\n                return originalRequest.call(this, options as any, callback as any);\n              }\n              monitor.log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} HTTPS call`);\n              return monitor.interceptRequest(originalRequest, options, callback, 'https', matchedPattern);\n            }\n\n            return originalRequest.call(this, options as any, callback as any);\n          },\n          writable: true,\n          configurable: true\n        });\n      } else {\n        console.warn('⚠️  Could not patch https.request: property is non-configurable');\n      }\n    } catch {\n      // Silently ignore if we can't patch\n      monitor.log('Warning: Could not patch https.request');\n    }\n\n    try {\n      const getDescriptor = Object.getOwnPropertyDescriptor(https, 'get');\n      if (!getDescriptor || getDescriptor.configurable !== false) {\n        Object.defineProperty(https, 'get', {\n          value: function(\n            urlOrOptions: CoolhandRequestOptions | string | URL,\n            optionsOrCallback?: CoolhandRequestOptions | ((res: IncomingMessage) => void),\n            extraCallback?: (res: IncomingMessage) => void\n          ) {\n            const { options, callback } = normalizeRequestArgs(urlOrOptions, optionsOrCallback, extraCallback);\n            monitor.debugRequest('HTTPS GET', options);\n            const matchedPattern = monitor.patternMatchingService.matchesAPIPatternSync(options);\n\n            if (matchedPattern) {\n              if (monitor.isExcluded(options, 'https')) {\n                return originalGet.call(this, options as any, callback as any);\n              }\n              if (isNonInferenceURL(monitor.buildURL(options, 'https'), 'GET')) {\n                return originalGet.call(this, options as any, callback as any);\n              }\n              monitor.log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} HTTPS GET`);\n              return monitor.interceptRequest(originalGet, options, callback, 'https', matchedPattern);\n            }\n\n            return originalGet.call(this, options as any, callback as any);\n          },\n          writable: true,\n          configurable: true\n        });\n      } else {\n        console.warn('⚠️  Could not patch https.get: property is non-configurable');\n      }\n    } catch {\n      // Silently ignore if we can't patch\n      monitor.log('Warning: Could not patch https.get');\n    }\n  }\n\n  private patchHTTP(): void {\n    const originalRequest = http.request;\n    const originalGet = http.get;\n    const monitor = this;\n\n    try {\n      const requestDescriptor = Object.getOwnPropertyDescriptor(http, 'request');\n      if (!requestDescriptor || requestDescriptor.configurable !== false) {\n        Object.defineProperty(http, 'request', {\n          value: function(\n            urlOrOptions: CoolhandRequestOptions | string | URL,\n            optionsOrCallback?: CoolhandRequestOptions | ((res: IncomingMessage) => void),\n            extraCallback?: (res: IncomingMessage) => void\n          ) {\n            const { options, callback } = normalizeRequestArgs(urlOrOptions, optionsOrCallback, extraCallback);\n            monitor.debugRequest('HTTP REQUEST', options);\n            const matchedPattern = monitor.patternMatchingService.matchesAPIPatternSync(options);\n\n            if (matchedPattern) {\n              if (monitor.isExcluded(options, 'http')) {\n                return originalRequest.call(this, options as any, callback as any);\n              }\n              const method = typeof options === 'object' && 'method' in options ? (options as any).method || 'GET' : 'GET';\n              if (isNonInferenceURL(monitor.buildURL(options, 'http'), method)) {\n                return originalRequest.call(this, options as any, callback as any);\n              }\n              monitor.log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} HTTP call`);\n              return monitor.interceptRequest(originalRequest, options, callback, 'http', matchedPattern);\n            }\n\n            return originalRequest.call(this, options as any, callback as any);\n          },\n          writable: true,\n          configurable: true\n        });\n      } else {\n        console.warn('⚠️  Could not patch http.request: property is non-configurable');\n      }\n    } catch {\n      // Silently ignore if we can't patch\n      monitor.log('Warning: Could not patch http.request');\n    }\n\n    try {\n      const getDescriptor = Object.getOwnPropertyDescriptor(http, 'get');\n      if (!getDescriptor || getDescriptor.configurable !== false) {\n        Object.defineProperty(http, 'get', {\n          value: function(\n            urlOrOptions: CoolhandRequestOptions | string | URL,\n            optionsOrCallback?: CoolhandRequestOptions | ((res: IncomingMessage) => void),\n            extraCallback?: (res: IncomingMessage) => void\n          ) {\n            const { options, callback } = normalizeRequestArgs(urlOrOptions, optionsOrCallback, extraCallback);\n            monitor.debugRequest('HTTP GET', options);\n            const matchedPattern = monitor.patternMatchingService.matchesAPIPatternSync(options);\n\n            if (matchedPattern) {\n              if (monitor.isExcluded(options, 'http')) {\n                return originalGet.call(this, options as any, callback as any);\n              }\n              if (isNonInferenceURL(monitor.buildURL(options, 'http'), 'GET')) {\n                return originalGet.call(this, options as any, callback as any);\n              }\n              monitor.log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} HTTP GET`);\n              return monitor.interceptRequest(originalGet, options, callback, 'http', matchedPattern);\n            }\n\n            return originalGet.call(this, options as any, callback as any);\n          },\n          writable: true,\n          configurable: true\n        });\n      } else {\n        console.warn('⚠️  Could not patch http.get: property is non-configurable');\n      }\n    } catch {\n      // Silently ignore if we can't patch\n      monitor.log('Warning: Could not patch http.get');\n    }\n  }\n\n  private patchFetch(): void {\n    if (typeof globalThis.fetch === 'function') {\n      const originalFetch = globalThis.fetch;\n      const monitor = this;\n\n      globalThis.fetch = async function(url: string | URL | Request, options: RequestInit = {}) {\n        const urlStr = typeof url === 'string' ? url : url.toString();\n\n        monitor.debugRequest('FETCH', { url: urlStr, ...options });\n\n        const matchedPattern = monitor.patternMatchingService.matchesAPIPatternFromURL(urlStr);\n\n        if (matchedPattern) {\n          if (monitor.isExcluded(urlStr, 'https')) {\n            return originalFetch.call(this, url, options);\n          }\n          const method = (options as RequestInit)?.method || 'GET';\n          if (isNonInferenceURL(urlStr, method)) {\n            return originalFetch.call(this, url, options);\n          }\n          monitor.log(`🎯 INTERCEPTING ${matchedPattern.pattern.name} FETCH call`);\n          return monitor.interceptFetch(originalFetch, url, options, matchedPattern);\n        }\n\n        return originalFetch.call(this, url, options);\n      };\n    }\n  }\n\n  private interceptRequest(\n    originalRequest: OriginalRequestFn,\n    options: CoolhandRequestOptions | string | URL,\n    callback?: (res: IncomingMessage) => void,\n    protocol: 'https' | 'http' = 'https',\n    matchedPattern?: CoolhandMatchedPattern\n  ): ClientRequest {\n    this.interceptedCalls++;\n\n    const url = this.buildURL(options, protocol);\n\n    const callData: CoolhandCallData = {\n      id: this.interceptedCalls,\n      timestamp: new Date().toISOString(),\n      method: typeof options === 'object' && 'method' in options ? options.method || 'GET' : 'GET',\n      url: this.patternMatchingService.sanitizeURL(url),\n      headers: this.patternMatchingService.sanitizeHeaders(\n        typeof options === 'object' && 'headers' in options ? options.headers || {} : {},\n        matchedPattern?.pattern\n      ),\n      request_body: null,\n      response_body: null,\n      response_headers: null,\n      status_code: null,\n      protocol: protocol\n    };\n\n    this.log(`📞 Starting API call #${callData.id} to ${url}`);\n\n    let requestBody = '';\n\n    const req = originalRequest(options as any, (res: IncomingMessage) => {\n      this.log(`📥 Response received for call #${callData.id}, status: ${res.statusCode}`);\n\n      const responseBuffer = new CappedBuffer(MAX_DECOMPRESSED_BYTES, () => {\n        this.log(`⚠️ Response body for call #${callData.id} exceeded ${MAX_DECOMPRESSED_BYTES} bytes; truncating capture`);\n      });\n\n      // See createResponseTee: hands the host an independent stream so the interceptor's own\n      // capture below can't starve a host callback that consumes `res` asynchronously. Only\n      // created when there's a callback to hand it to — an unread tee must never be constructed,\n      // since createResponseTee's backpressure guard only activates once *something* reads it.\n      const hostStream = callback ? createResponseTee(res, PassThrough) : null;\n\n      res.on('data', (chunk: any) => {\n        responseBuffer.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n      });\n\n      res.on('end', async () => {\n        try {\n          const rawBuffer = responseBuffer.concat();\n          const contentEncoding = res.headers?.['content-encoding'];\n          const responseBody = await decompressBuffer(rawBuffer, contentEncoding, this.log.bind(this));\n          callData.response_body = parseBody(responseBody);\n        } catch (err: any) {\n          this.log(`⚠️ Response body capture failed for call #${callData.id}: ${err?.message}`);\n          callData.response_body = null;\n        }\n        callData.response_headers = this.patternMatchingService.sanitizeHeaders(res.headers, matchedPattern?.pattern);\n        callData.status_code = res.statusCode || null;\n\n        // Emit event for the logging service to handle\n        this.onRequestComplete(callData, matchedPattern);\n      });\n\n      // hostStream is duck-typed to match http.IncomingMessage at runtime (see createResponseTee).\n      if (callback) {callback(hostStream as unknown as IncomingMessage);}\n    });\n\n    // Intercept request body\n    const originalWrite = req.write.bind(req);\n    const originalEnd = req.end.bind(req);\n\n    req.write = function(chunk: any, encoding?: any, callback?: any) {\n      if (chunk) {\n        requestBody += chunk.toString();\n      }\n      return originalWrite(chunk, encoding, callback);\n    };\n\n    req.end = ((chunk?: any, encoding?: any, callback?: any) => {\n      if (chunk) {\n        requestBody += chunk.toString();\n      }\n      callData.request_body = parseBody(requestBody);\n      this.log(`📤 Request complete for call #${callData.id}`);\n      return originalEnd(chunk, encoding, callback);\n    }).bind(this);\n\n    req.on('error', (err) => {\n      this.log(`❌ Request error for call #${callData.id}:`, err.message);\n    });\n\n    return req;\n  }\n\n  private async interceptFetch(\n    originalFetch: typeof fetch,\n    url: string | URL | Request,\n    options: RequestInit,\n    matchedPattern?: CoolhandMatchedPattern\n  ): Promise<Response> {\n    this.interceptedCalls++;\n\n    const callData: CoolhandCallData = {\n      id: this.interceptedCalls,\n      timestamp: new Date().toISOString(),\n      method: options.method || 'GET',\n      url: this.patternMatchingService.sanitizeURL(url.toString()),\n      headers: this.patternMatchingService.sanitizeHeaders(\n        options.headers instanceof Headers\n          ? Object.fromEntries(options.headers.entries())\n          : (options.headers || {}),\n        matchedPattern?.pattern\n      ),\n      request_body: options.body ? parseBody(options.body as string) : null,\n      response_body: null,\n      response_headers: null,\n      status_code: null,\n      protocol: 'fetch'\n    };\n\n    this.log(`📞 Starting FETCH call #${callData.id} to ${url}`);\n\n    try {\n      const response = await originalFetch.call(globalThis, url, options);\n\n      callData.status_code = response.status;\n      callData.response_headers = this.patternMatchingService.sanitizeHeaders(\n        Object.fromEntries(response.headers.entries()),\n        matchedPattern?.pattern\n      );\n\n      // Clone response to read body without consuming it. Drain and log in the\n      // background so a slow/streaming body doesn't delay the caller's fetch() —\n      // same reasoning as the res.on('data')/'end' handling on the http/https side.\n      const responseClone = response.clone();\n      responseClone\n        .text()\n        .then((responseText) => {\n          callData.response_body = parseBody(responseText);\n        })\n        .catch((err) => {\n          this.log(`⚠️ Response body capture failed for call #${callData.id}:`, (err as Error)?.message);\n          callData.response_body = null;\n        })\n        .finally(() => {\n          this.onRequestComplete(callData, matchedPattern);\n        });\n\n      return response;\n    } catch (error) {\n      this.log(`❌ Fetch error for call #${callData.id}:`, (error as Error).message);\n      throw error;\n    }\n  }\n\n  private isExcluded(options: CoolhandRequestOptions | string | URL, protocol: string): boolean {\n    if (this.excludeApiPatterns.length === 0) { return false; }\n    const url = this.buildURL(options, protocol);\n    return this.excludeApiPatterns.some(p => url.includes(p));\n  }\n\n  private buildURL(options: CoolhandRequestOptions | string | URL, protocol: string): string {\n    if (typeof options === 'string') {\n      return options;\n    }\n\n    if (options instanceof URL) {\n      return options.toString();\n    }\n\n    if (options.href) {return options.href;}\n\n    const hostname = options.hostname || options.host || 'unknown';\n    const path = options.path || '/';\n    const port = options.port ? `:${options.port}` : '';\n\n    return `${protocol}://${hostname}${port}${path}`;\n  }\n\n  private debugRequest(type: string, options: CoolhandRequestOptions | string | URL | any): void {\n    const hostname = typeof options === 'string' ? options :\n                    options instanceof URL ? options.hostname :\n                    options.hostname || options.host || options.url || 'unknown';\n    this.log(`🌐 ${type} to: ${hostname}`);\n\n    // Count all requests\n    this.callCounter++;\n  }\n\n  private log(...args: any[]): void {\n    if (!this.silent) {\n      console.log(...args);\n    }\n  }\n\n  // Event handler that will be overridden by the main class\n  public onRequestComplete: (callData: CoolhandCallData, matchedPattern?: CoolhandMatchedPattern) => void = () => {};\n\n  public getStats() {\n    return {\n      totalRequests: this.callCounter,\n      interceptedCalls: this.interceptedCalls\n    };\n  }\n}"],"mappings":"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","names":["callback"]}