{"version":3,"sources":["../../src/utils/decompress.ts"],"sourcesContent":["// zlib is loaded lazily so this module is safe to import in Edge/fetch-only\n// runtimes where Node core modules are unavailable at load time.\nlet _zlib: typeof import('zlib') | null | undefined;\n\nasync function loadZlib(): Promise<typeof import('zlib') | null> {\n  if (_zlib !== undefined) { return _zlib; }\n  try {\n    _zlib = await import('zlib');\n  } catch {\n    _zlib = null;\n  }\n  return _zlib;\n}\n\n/**\n * Upper bound on decompressed/buffered response bodies, shared by zlib's\n * `maxOutputLength` here and by the raw response-chunk buffering in\n * global-monitor.ts / RequestMonitoringService.ts. Caps decompression-bomb\n * amplification and unbounded in-memory buffering to a single sane number.\n */\nexport const MAX_DECOMPRESSED_BYTES = 50 * 1024 * 1024; // 50 MB\n\n// A throw here would otherwise escape the zlib callback as an uncaughtException\n// (it runs after the wrapping Promise executor has already returned, so the\n// Promise machinery can't catch it) — guard it and degrade gracefully instead.\nfunction resolveDecompressed(result: Buffer, resolve: (value: string) => void, onWarn?: (msg: string) => void): void {\n  try {\n    resolve(result.toString('utf-8'));\n  } catch (err: any) {\n    onWarn?.(`⚠️ Decompressed output too large to convert to a string: ${err?.message}`);\n    resolve('');\n  }\n}\n\n/**\n * Decompresses a response buffer according to its Content-Encoding.\n * Handles gzip, x-gzip, deflate (RFC 1950 with raw RFC 1951 fallback), and br.\n * Unknown or absent encodings are returned as-is (UTF-8 string).\n * Falls back to the raw UTF-8 string when zlib is unavailable (Edge runtime).\n *\n * @param onWarn  Optional callback for decompression failure warnings.\n */\nexport async function decompressBuffer(\n  buffer: Buffer,\n  encoding: string | undefined,\n  onWarn?: (msg: string) => void\n): Promise<string> {\n  if (!encoding) { return buffer.toString('utf-8'); }\n\n  const zlib = await loadZlib();\n  if (!zlib) { return buffer.toString('utf-8'); }\n\n  const enc = encoding.trim().toLowerCase();\n\n  if (enc === 'gzip' || enc === 'x-gzip') {\n    return new Promise((resolve) => {\n      zlib.gunzip(buffer, { maxOutputLength: MAX_DECOMPRESSED_BYTES }, (err, result) => {\n        if (err) {\n          onWarn?.(`⚠️ Decompression failed for encoding '${enc}': ${err.message}`);\n          resolve(buffer.toString('utf-8'));\n        } else {\n          resolveDecompressed(result, resolve, onWarn);\n        }\n      });\n    });\n  }\n\n  if (enc === 'deflate') {\n    // RFC 1950 (zlib-wrapped) first; fall back to RFC 1951 (raw deflate)\n    // as some servers (older IIS, some load balancers) send raw deflate despite\n    // the content-encoding header implying the zlib wrapper.\n    return new Promise((resolve) => {\n      zlib.inflate(buffer, { maxOutputLength: MAX_DECOMPRESSED_BYTES }, (err, result) => {\n        if (!err) {\n            resolveDecompressed(result, resolve, onWarn);\n            return;\n          }\n        zlib.inflateRaw(buffer, { maxOutputLength: MAX_DECOMPRESSED_BYTES }, (rawErr, rawResult) => {\n          if (rawErr) {\n            onWarn?.(`⚠️ Decompression failed for encoding 'deflate': ${rawErr.message}`);\n            resolve(buffer.toString('utf-8'));\n          } else {\n            resolveDecompressed(rawResult, resolve, onWarn);\n          }\n        });\n      });\n    });\n  }\n\n  if (enc === 'br') {\n    return new Promise((resolve) => {\n      zlib.brotliDecompress(buffer, { maxOutputLength: MAX_DECOMPRESSED_BYTES }, (err, result) => {\n        if (err) {\n          onWarn?.(`⚠️ Decompression failed for encoding '${enc}': ${err.message}`);\n          resolve(buffer.toString('utf-8'));\n        } else {\n          resolveDecompressed(result, resolve, onWarn);\n        }\n      });\n    });\n  }\n\n  return buffer.toString('utf-8');\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAI;AAEJ,eAAe,WAAkD;AAC/D,MAAI,UAAU,QAAW;AAAE,WAAO;AAAA,EAAO;AACzC,MAAI;AACF,YAAQ,MAAM,OAAO,MAAM;AAAA,EAC7B,QAAQ;AACN,YAAQ;AAAA,EACV;AACA,SAAO;AACT;AAQO,MAAM,yBAAyB,KAAK,OAAO;AAKlD,SAAS,oBAAoB,QAAgB,SAAkC,QAAsC;AACnH,MAAI;AACF,YAAQ,OAAO,SAAS,OAAO,CAAC;AAAA,EAClC,SAAS,KAAU;AACjB,aAAS,sEAA4D,KAAK,OAAO,EAAE;AACnF,YAAQ,EAAE;AAAA,EACZ;AACF;AAUA,eAAsB,iBACpB,QACA,UACA,QACiB;AACjB,MAAI,CAAC,UAAU;AAAE,WAAO,OAAO,SAAS,OAAO;AAAA,EAAG;AAElD,QAAM,OAAO,MAAM,SAAS;AAC5B,MAAI,CAAC,MAAM;AAAE,WAAO,OAAO,SAAS,OAAO;AAAA,EAAG;AAE9C,QAAM,MAAM,SAAS,KAAK,EAAE,YAAY;AAExC,MAAI,QAAQ,UAAU,QAAQ,UAAU;AACtC,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,OAAO,QAAQ,EAAE,iBAAiB,uBAAuB,GAAG,CAAC,KAAK,WAAW;AAChF,YAAI,KAAK;AACP,mBAAS,mDAAyC,GAAG,MAAM,IAAI,OAAO,EAAE;AACxE,kBAAQ,OAAO,SAAS,OAAO,CAAC;AAAA,QAClC,OAAO;AACL,8BAAoB,QAAQ,SAAS,MAAM;AAAA,QAC7C;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,WAAW;AAIrB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,QAAQ,QAAQ,EAAE,iBAAiB,uBAAuB,GAAG,CAAC,KAAK,WAAW;AACjF,YAAI,CAAC,KAAK;AACN,8BAAoB,QAAQ,SAAS,MAAM;AAC3C;AAAA,QACF;AACF,aAAK,WAAW,QAAQ,EAAE,iBAAiB,uBAAuB,GAAG,CAAC,QAAQ,cAAc;AAC1F,cAAI,QAAQ;AACV,qBAAS,6DAAmD,OAAO,OAAO,EAAE;AAC5E,oBAAQ,OAAO,SAAS,OAAO,CAAC;AAAA,UAClC,OAAO;AACL,gCAAoB,WAAW,SAAS,MAAM;AAAA,UAChD;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,MAAM;AAChB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,iBAAiB,QAAQ,EAAE,iBAAiB,uBAAuB,GAAG,CAAC,KAAK,WAAW;AAC1F,YAAI,KAAK;AACP,mBAAS,mDAAyC,GAAG,MAAM,IAAI,OAAO,EAAE;AACxE,kBAAQ,OAAO,SAAS,OAAO,CAAC;AAAA,QAClC,OAAO;AACL,8BAAoB,QAAQ,SAAS,MAAM;AAAA,QAC7C;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO,OAAO,SAAS,OAAO;AAChC;","names":[]}