You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.0 KiB
88 lines
2.0 KiB
2 years ago
|
const events = require('events');
|
||
|
const JSZip = require('jszip');
|
||
|
|
||
|
const StreamBuf = require('./stream-buf');
|
||
|
const {stringToBuffer} = require('./browser-buffer-encode');
|
||
|
|
||
|
// =============================================================================
|
||
|
// The ZipWriter class
|
||
|
// Packs streamed data into an output zip stream
|
||
|
class ZipWriter extends events.EventEmitter {
|
||
|
constructor(options) {
|
||
|
super();
|
||
|
this.options = Object.assign(
|
||
|
{
|
||
|
type: 'nodebuffer',
|
||
|
compression: 'DEFLATE',
|
||
|
},
|
||
|
options
|
||
|
);
|
||
|
|
||
|
this.zip = new JSZip();
|
||
|
this.stream = new StreamBuf();
|
||
|
}
|
||
|
|
||
|
append(data, options) {
|
||
|
if (options.hasOwnProperty('base64') && options.base64) {
|
||
|
this.zip.file(options.name, data, {base64: true});
|
||
|
} else {
|
||
|
// https://www.npmjs.com/package/process
|
||
|
if (process.browser && typeof data === 'string') {
|
||
|
// use TextEncoder in browser
|
||
|
data = stringToBuffer(data);
|
||
|
}
|
||
|
this.zip.file(options.name, data);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async finalize() {
|
||
|
const content = await this.zip.generateAsync(this.options);
|
||
|
this.stream.end(content);
|
||
|
this.emit('finish');
|
||
|
}
|
||
|
|
||
|
// ==========================================================================
|
||
|
// Stream.Readable interface
|
||
|
read(size) {
|
||
|
return this.stream.read(size);
|
||
|
}
|
||
|
|
||
|
setEncoding(encoding) {
|
||
|
return this.stream.setEncoding(encoding);
|
||
|
}
|
||
|
|
||
|
pause() {
|
||
|
return this.stream.pause();
|
||
|
}
|
||
|
|
||
|
resume() {
|
||
|
return this.stream.resume();
|
||
|
}
|
||
|
|
||
|
isPaused() {
|
||
|
return this.stream.isPaused();
|
||
|
}
|
||
|
|
||
|
pipe(destination, options) {
|
||
|
return this.stream.pipe(destination, options);
|
||
|
}
|
||
|
|
||
|
unpipe(destination) {
|
||
|
return this.stream.unpipe(destination);
|
||
|
}
|
||
|
|
||
|
unshift(chunk) {
|
||
|
return this.stream.unshift(chunk);
|
||
|
}
|
||
|
|
||
|
wrap(stream) {
|
||
|
return this.stream.wrap(stream);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// =============================================================================
|
||
|
|
||
|
module.exports = {
|
||
|
ZipWriter,
|
||
|
};
|