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.
		
		
		
		
		
			
		
			
				
					117 lines
				
				2.7 KiB
			
		
		
			
		
	
	
					117 lines
				
				2.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * node-compress-commons
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2014 Chris Talkington, contributors.
							 | 
						||
| 
								 | 
							
								 * Licensed under the MIT license.
							 | 
						||
| 
								 | 
							
								 * https://github.com/archiverjs/node-compress-commons/blob/master/LICENSE-MIT
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								var inherits = require('util').inherits;
							 | 
						||
| 
								 | 
							
								var Transform = require('readable-stream').Transform;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var ArchiveEntry = require('./archive-entry');
							 | 
						||
| 
								 | 
							
								var util = require('../util');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var ArchiveOutputStream = module.exports = function(options) {
							 | 
						||
| 
								 | 
							
								  if (!(this instanceof ArchiveOutputStream)) {
							 | 
						||
| 
								 | 
							
								    return new ArchiveOutputStream(options);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Transform.call(this, options);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this.offset = 0;
							 | 
						||
| 
								 | 
							
								  this._archive = {
							 | 
						||
| 
								 | 
							
								    finish: false,
							 | 
						||
| 
								 | 
							
								    finished: false,
							 | 
						||
| 
								 | 
							
								    processing: false
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								inherits(ArchiveOutputStream, Transform);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype._appendBuffer = function(zae, source, callback) {
							 | 
						||
| 
								 | 
							
								  // scaffold only
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype._appendStream = function(zae, source, callback) {
							 | 
						||
| 
								 | 
							
								  // scaffold only
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype._emitErrorCallback = function(err) {
							 | 
						||
| 
								 | 
							
								  if (err) {
							 | 
						||
| 
								 | 
							
								    this.emit('error', err);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype._finish = function(ae) {
							 | 
						||
| 
								 | 
							
								  // scaffold only
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype._normalizeEntry = function(ae) {
							 | 
						||
| 
								 | 
							
								  // scaffold only
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype._transform = function(chunk, encoding, callback) {
							 | 
						||
| 
								 | 
							
								  callback(null, chunk);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype.entry = function(ae, source, callback) {
							 | 
						||
| 
								 | 
							
								  source = source || null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (typeof callback !== 'function') {
							 | 
						||
| 
								 | 
							
								    callback = this._emitErrorCallback.bind(this);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!(ae instanceof ArchiveEntry)) {
							 | 
						||
| 
								 | 
							
								    callback(new Error('not a valid instance of ArchiveEntry'));
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (this._archive.finish || this._archive.finished) {
							 | 
						||
| 
								 | 
							
								    callback(new Error('unacceptable entry after finish'));
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (this._archive.processing) {
							 | 
						||
| 
								 | 
							
								    callback(new Error('already processing an entry'));
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this._archive.processing = true;
							 | 
						||
| 
								 | 
							
								  this._normalizeEntry(ae);
							 | 
						||
| 
								 | 
							
								  this._entry = ae;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  source = util.normalizeInputSource(source);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (Buffer.isBuffer(source)) {
							 | 
						||
| 
								 | 
							
								    this._appendBuffer(ae, source, callback);
							 | 
						||
| 
								 | 
							
								  } else if (util.isStream(source)) {
							 | 
						||
| 
								 | 
							
								    this._appendStream(ae, source, callback);
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    this._archive.processing = false;
							 | 
						||
| 
								 | 
							
								    callback(new Error('input source must be valid Stream or Buffer instance'));
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return this;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype.finish = function() {
							 | 
						||
| 
								 | 
							
								  if (this._archive.processing) {
							 | 
						||
| 
								 | 
							
								    this._archive.finish = true;
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this._finish();
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype.getBytesWritten = function() {
							 | 
						||
| 
								 | 
							
								  return this.offset;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ArchiveOutputStream.prototype.write = function(chunk, cb) {
							 | 
						||
| 
								 | 
							
								  if (chunk) {
							 | 
						||
| 
								 | 
							
								    this.offset += chunk.length;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return Transform.prototype.write.call(this, chunk, cb);
							 | 
						||
| 
								 | 
							
								};
							 |