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
			| 
								 
											3 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,
							 | 
						||
| 
								 | 
							
								};
							 |