-
-
Notifications
You must be signed in to change notification settings - Fork 20
/
index.js
65 lines (52 loc) · 1.52 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import fs from 'node:fs';
import stream from 'node:stream';
import zlib from 'node:zlib';
import {promisify} from 'node:util';
import duplexer from 'duplexer';
const getOptions = options => ({level: 9, ...options});
const gzip = promisify(zlib.gzip);
export async function gzipSize(input, options) {
if (!input) {
return 0;
}
const data = await gzip(input, getOptions(options));
return data.length;
}
export function gzipSizeSync(input, options) {
return zlib.gzipSync(input, getOptions(options)).length;
}
export function gzipSizeFromFile(path, options) {
// TODO: Use `stream.pipeline` here.
return new Promise((resolve, reject) => {
const stream = fs.createReadStream(path);
stream.on('error', reject);
const gzipStream = stream.pipe(gzipSizeStream(options));
gzipStream.on('error', reject);
gzipStream.on('gzip-size', resolve);
});
}
export function gzipSizeFromFileSync(path, options) {
return gzipSizeSync(fs.readFileSync(path), options);
}
export function gzipSizeStream(options) {
// TODO: Use `stream.pipeline` here.
const input = new stream.PassThrough();
const output = new stream.PassThrough();
const wrapper = duplexer(input, output);
let gzipSize = 0;
const gzip = zlib.createGzip(getOptions(options))
.on('data', buf => {
gzipSize += buf.length;
})
.on('error', () => {
wrapper.gzipSize = 0;
})
.on('end', () => {
wrapper.gzipSize = gzipSize;
wrapper.emit('gzip-size', gzipSize);
output.end();
});
input.pipe(gzip);
input.pipe(output, {end: false});
return wrapper;
}