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.
118 lines
2.6 KiB
118 lines
2.6 KiB
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(); |
|
} |
|
} |
|
}
|
|
|