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.
		
		
		
		
			
				
					119 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					119 lines
				
				2.6 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var Stream = require('stream').Stream
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = legacy
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function legacy (fs) {
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    ReadStream: ReadStream,
							 | 
						||
| 
								 | 
							
								    WriteStream: WriteStream
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function ReadStream (path, options) {
							 | 
						||
| 
								 | 
							
								    if (!(this instanceof ReadStream)) return new ReadStream(path, options);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Stream.call(this);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var self = this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.path = path;
							 | 
						||
| 
								 | 
							
								    this.fd = null;
							 | 
						||
| 
								 | 
							
								    this.readable = true;
							 | 
						||
| 
								 | 
							
								    this.paused = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.flags = 'r';
							 | 
						||
| 
								 | 
							
								    this.mode = 438; /*=0666*/
							 | 
						||
| 
								 | 
							
								    this.bufferSize = 64 * 1024;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    options = options || {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Mixin options into this
							 | 
						||
| 
								 | 
							
								    var keys = Object.keys(options);
							 | 
						||
| 
								 | 
							
								    for (var index = 0, length = keys.length; index < length; index++) {
							 | 
						||
| 
								 | 
							
								      var key = keys[index];
							 | 
						||
| 
								 | 
							
								      this[key] = options[key];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.encoding) this.setEncoding(this.encoding);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.start !== undefined) {
							 | 
						||
| 
								 | 
							
								      if ('number' !== typeof this.start) {
							 | 
						||
| 
								 | 
							
								        throw TypeError('start must be a Number');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (this.end === undefined) {
							 | 
						||
| 
								 | 
							
								        this.end = Infinity;
							 | 
						||
| 
								 | 
							
								      } else if ('number' !== typeof this.end) {
							 | 
						||
| 
								 | 
							
								        throw TypeError('end must be a Number');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (this.start > this.end) {
							 | 
						||
| 
								 | 
							
								        throw new Error('start must be <= end');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      this.pos = this.start;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.fd !== null) {
							 | 
						||
| 
								 | 
							
								      process.nextTick(function() {
							 | 
						||
| 
								 | 
							
								        self._read();
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    fs.open(this.path, this.flags, this.mode, function (err, fd) {
							 | 
						||
| 
								 | 
							
								      if (err) {
							 | 
						||
| 
								 | 
							
								        self.emit('error', err);
							 | 
						||
| 
								 | 
							
								        self.readable = false;
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      self.fd = fd;
							 | 
						||
| 
								 | 
							
								      self.emit('open', fd);
							 | 
						||
| 
								 | 
							
								      self._read();
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function WriteStream (path, options) {
							 | 
						||
| 
								 | 
							
								    if (!(this instanceof WriteStream)) return new WriteStream(path, options);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Stream.call(this);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.path = path;
							 | 
						||
| 
								 | 
							
								    this.fd = null;
							 | 
						||
| 
								 | 
							
								    this.writable = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.flags = 'w';
							 | 
						||
| 
								 | 
							
								    this.encoding = 'binary';
							 | 
						||
| 
								 | 
							
								    this.mode = 438; /*=0666*/
							 | 
						||
| 
								 | 
							
								    this.bytesWritten = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    options = options || {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Mixin options into this
							 | 
						||
| 
								 | 
							
								    var keys = Object.keys(options);
							 | 
						||
| 
								 | 
							
								    for (var index = 0, length = keys.length; index < length; index++) {
							 | 
						||
| 
								 | 
							
								      var key = keys[index];
							 | 
						||
| 
								 | 
							
								      this[key] = options[key];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.start !== undefined) {
							 | 
						||
| 
								 | 
							
								      if ('number' !== typeof this.start) {
							 | 
						||
| 
								 | 
							
								        throw TypeError('start must be a Number');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      if (this.start < 0) {
							 | 
						||
| 
								 | 
							
								        throw new Error('start must be >= zero');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      this.pos = this.start;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    this.busy = false;
							 | 
						||
| 
								 | 
							
								    this._queue = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (this.fd === null) {
							 | 
						||
| 
								 | 
							
								      this._open = fs.open;
							 | 
						||
| 
								 | 
							
								      this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);
							 | 
						||
| 
								 | 
							
								      this.flush();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |