|  | 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(); | 
|  | } | 
|  | } | 
|  | } |