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