'use strict'; const { pipeline: streamPipeline, PassThrough: PassThroughStream } = require('stream'); const zlib = require('zlib'); const mimicResponse = require('mimic-response'); const decompressResponse = response => { const contentEncoding = (response.headers['content-encoding'] || '').toLowerCase(); if (!['gzip', 'deflate', 'br'].includes(contentEncoding)) { return response; } // TODO: Remove this when targeting Node.js 12. const isBrotli = contentEncoding === 'br'; if (isBrotli && typeof zlib.createBrotliDecompress !== 'function') { return response; } const decompress = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip(); const stream = new PassThroughStream(); decompress.on('error', error => { // Ignore empty response if (error.code === 'Z_BUF_ERROR') { stream.end(); return; } stream.emit('error', error); }); const finalStream = streamPipeline(response, decompress, stream, () => {}); mimicResponse(response, finalStream); return finalStream; }; module.exports = decompressResponse;