-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathuncompress_stream.js
More file actions
53 lines (44 loc) · 1.47 KB
/
uncompress_stream.js
File metadata and controls
53 lines (44 loc) · 1.47 KB
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
'use strict';
const fs = require('fs');
const lzma = require('lzma-native');
const utils = require('../utils');
const streamifier = require('streamifier');
const { PassThrough } = require('stream');
class XzUncompressStream extends PassThrough {
constructor(opts) {
opts = opts || {};
super(opts);
const sourceType = utils.sourceType(opts.source);
// Set text mode to true to handle line endings correctly on Windows
const decompressor = lzma.createDecompressor({
...opts.lzma,
textMode: true,
});
decompressor.on('error', err => this.emit('error', err));
decompressor.on('end', () => this.end());
// Handle single file decompression
if (sourceType === 'file') {
const stream = fs.createReadStream(opts.source, opts.fs);
stream.on('error', err => this.emit('error', err));
stream.pipe(decompressor).pipe(this);
return;
}
if (sourceType === 'buffer') {
const stream = streamifier.createReadStream(opts.source, opts.streamifier);
stream.on('error', err => this.emit('error', err));
stream.pipe(decompressor).pipe(this);
return;
}
if (sourceType === 'stream') {
opts.source.on('error', err => this.emit('error', err));
opts.source.pipe(decompressor).pipe(this);
return;
}
// For streaming input
this.on('pipe', srcStream => {
srcStream.unpipe(this);
srcStream.pipe(decompressor).pipe(this);
});
}
}
module.exports = XzUncompressStream;