Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/commons/decodeBuffer.ts
1028 views
1
import * as zlib from 'zlib';
2
import { promisify } from 'util';
3
4
const inflateAsync = promisify<Buffer, Buffer>(zlib.inflate);
5
const inflateRawAsync = promisify<Buffer, Buffer>(zlib.inflateRaw);
6
const brotliDecompressAsync = promisify<Buffer, Buffer>(zlib.brotliDecompress);
7
const gunzipAsync = promisify<Buffer, zlib.ZlibOptions, Buffer>(zlib.gunzip);
8
9
export default function decodeBuffer(buffer: Buffer, encoding: string): Promise<Buffer> {
10
if (!buffer) return null;
11
if (!encoding) return Promise.resolve(buffer);
12
13
if (encoding === 'gzip' || encoding === 'x-gzip') {
14
// from node-fetch:
15
// Be less strict when decoding compressed responses, since sometimes
16
// servers send slightly invalid responses that are still accepted
17
// by common browsers.
18
const zlibOptions = {
19
flush: zlib.constants.Z_SYNC_FLUSH,
20
finishFlush: zlib.constants.Z_SYNC_FLUSH,
21
};
22
return gunzipAsync(buffer, zlibOptions);
23
}
24
if (encoding === 'deflate' || encoding === 'x-deflate') {
25
if ((buffer[0] & 0x0f) === 0x08) {
26
return inflateAsync(buffer);
27
}
28
return inflateRawAsync(buffer);
29
}
30
if (encoding === 'br') {
31
return brotliDecompressAsync(buffer);
32
}
33
34
return Promise.resolve(buffer);
35
}
36
37