import util from "util"; import zlib from "zlib"; import { PassThrough } from "stream"; const BUFFER_DECODER_MAP = { gzip: util.promisify(zlib.gunzip), deflate: util.promisify(zlib.inflate), br: util.promisify(zlib.brotliDecompress), text: (data: Buffer) => data, }; const STREAM_DECODER_MAP = { gzip: zlib.createGunzip, deflate: zlib.createInflate, br: zlib.createBrotliDecompress, text: () => new PassThrough(), }; type SupportedContentEncoding = keyof typeof BUFFER_DECODER_MAP; const isSupportedContentEncoding = ( encoding: string ): encoding is SupportedContentEncoding => encoding in BUFFER_DECODER_MAP; export async function decompressBuffer(buf: Buffer, encoding: string = "text") { if (isSupportedContentEncoding(encoding)) { return (await BUFFER_DECODER_MAP[encoding](buf)).toString(); } throw new Error(`Unsupported content-encoding: ${encoding}`); } export function getStreamDecompressor(encoding: string = "text") { if (isSupportedContentEncoding(encoding)) { return STREAM_DECODER_MAP[encoding](); } throw new Error(`Unsupported content-encoding: ${encoding}`); }