summaryrefslogtreecommitdiff
path: root/includes/external/addressbook/node_modules/decompress-response/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'includes/external/addressbook/node_modules/decompress-response/index.js')
-rw-r--r--includes/external/addressbook/node_modules/decompress-response/index.js58
1 files changed, 58 insertions, 0 deletions
diff --git a/includes/external/addressbook/node_modules/decompress-response/index.js b/includes/external/addressbook/node_modules/decompress-response/index.js
new file mode 100644
index 0000000..c861036
--- /dev/null
+++ b/includes/external/addressbook/node_modules/decompress-response/index.js
@@ -0,0 +1,58 @@
+'use strict';
+const {Transform, PassThrough} = require('stream');
+const zlib = require('zlib');
+const mimicResponse = require('mimic-response');
+
+module.exports = 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') {
+ response.destroy(new Error('Brotli is not supported on Node.js < 12'));
+ return response;
+ }
+
+ let isEmpty = true;
+
+ const checker = new Transform({
+ transform(data, _encoding, callback) {
+ isEmpty = false;
+
+ callback(null, data);
+ },
+
+ flush(callback) {
+ callback();
+ }
+ });
+
+ const finalStream = new PassThrough({
+ autoDestroy: false,
+ destroy(error, callback) {
+ response.destroy();
+
+ callback(error);
+ }
+ });
+
+ const decompressStream = isBrotli ? zlib.createBrotliDecompress() : zlib.createUnzip();
+
+ decompressStream.once('error', error => {
+ if (isEmpty && !response.readable) {
+ finalStream.end();
+ return;
+ }
+
+ finalStream.destroy(error);
+ });
+
+ mimicResponse(response, finalStream);
+ response.pipe(checker).pipe(decompressStream).pipe(finalStream);
+
+ return finalStream;
+};