1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- 'use strict';
- const path = require('path');
- const yazl = require('yazl');
- const assert = require('assert');
- const stream = require('stream');
- const utils = require('../utils');
- const ready = require('get-ready');
- class ZipFileStream extends stream.Transform {
- constructor(opts) {
- super(opts);
- const sourceType = utils.sourceType(opts.source);
- const zipfile = new yazl.ZipFile();
- const zipStream = zipfile.outputStream;
- zipStream.on('data', data => this.push(data));
- zipStream.on('end', () => this.ready(true));
- zipfile.on('error', err => this.emit('error', err));
- if (sourceType !== 'file') {
- assert(opts.relativePath, 'opts.relativePath is required when compressing a buffer, or a stream');
- }
- if (sourceType) {
- this.end();
- }
- if (sourceType === 'file') {
- zipfile.addFile(opts.source, opts.relativePath || path.basename(opts.source), opts.yazl);
- } else if (sourceType === 'buffer') {
- zipfile.addBuffer(opts.source, opts.relativePath, opts.yazl);
- } else if (sourceType === 'stream') {
- zipfile.addReadStream(opts.source, opts.relativePath, opts.yazl);
- } else { // undefined
- const passThrough = this._passThrough = new stream.PassThrough();
- this.on('finish', () => passThrough.end());
- zipfile.addReadStream(passThrough, opts.relativePath, opts.yazl);
- }
- zipfile.end(opts.yazl);
- }
- _transform(chunk, encoding, callback) {
- if (this._passThrough) {
- this._passThrough.write(chunk, encoding, callback);
- }
- }
- _flush(callback) {
- this.ready(callback);
- }
- }
- ready.mixin(ZipFileStream.prototype);
- module.exports = ZipFileStream;
|