fd-slicer
Advanced tools
Comparing version 0.3.2 to 0.4.0
97
index.js
@@ -6,2 +6,3 @@ var fs = require('fs'); | ||
var Writable = stream.Writable; | ||
var PassThrough = stream.PassThrough; | ||
var Pend = require('pend'); | ||
@@ -11,2 +12,4 @@ var EventEmitter = require('events').EventEmitter; | ||
module.exports = FdSlicer; | ||
FdSlicer.BufferSlicer = BufferSlicer; | ||
FdSlicer.createFromBuffer = createFromBuffer; | ||
@@ -86,3 +89,3 @@ util.inherits(FdSlicer, EventEmitter); | ||
this.start = options.start || 0; | ||
this.end = options.end; | ||
this.endOffset = options.end; | ||
this.pos = this.start; | ||
@@ -97,4 +100,4 @@ this.destroyed = false; | ||
var toRead = Math.min(self._readableState.highWaterMark, n); | ||
if (self.end != null) { | ||
toRead = Math.min(toRead, self.end - self.pos); | ||
if (self.endOffset != null) { | ||
toRead = Math.min(toRead, self.endOffset - self.pos); | ||
} | ||
@@ -185,1 +188,89 @@ if (toRead <= 0) { | ||
}; | ||
util.inherits(BufferSlicer, EventEmitter); | ||
function BufferSlicer(buffer) { | ||
EventEmitter.call(this); | ||
this.refCount = 0; | ||
this.buffer = buffer; | ||
} | ||
BufferSlicer.prototype.read = function(buffer, offset, length, position, callback) { | ||
var end = position + length; | ||
var delta = end - this.buffer.length; | ||
var written = (delta > 0) ? delta : length; | ||
this.buffer.copy(buffer, offset, position, end); | ||
process.nextTick(function() { | ||
callback(null, written); | ||
}); | ||
}; | ||
BufferSlicer.prototype.write = function(buffer, offset, length, position, callback) { | ||
buffer.copy(this.buffer, position, offset, offset + length); | ||
setImmediate(function() { | ||
callback(null, length, buffer); | ||
}); | ||
}; | ||
BufferSlicer.prototype.createReadStream = function(options) { | ||
options = options || {}; | ||
var readStream = new PassThrough(options); | ||
readStream.start = options.start || 0; | ||
readStream.endOffset = options.end; | ||
readStream.pos = readStream.endOffset || this.buffer.length; // yep, we're already done | ||
readStream.destroyed = false; | ||
readStream.write(this.buffer.slice(readStream.start, readStream.pos)); | ||
readStream.end(); | ||
readStream.destroy = function() { | ||
readStream.destroyed = true; | ||
}; | ||
return readStream; | ||
}; | ||
BufferSlicer.prototype.createWriteStream = function(options) { | ||
var bufferSlicer = this; | ||
options = options || {}; | ||
var writeStream = new WriteStream(options); | ||
writeStream.start = options.start || 0; | ||
writeStream.endOffset = options.end || Infinity; | ||
writeStream.bytesWritten = 0; | ||
writeStream.pos = writeStream.start; | ||
writeStream.destroyed = false; | ||
writeStream._write = function(buffer, encoding, callback) { | ||
if (writeStream.destroyed) return; | ||
var end = writeStream.pos + buffer.length; | ||
if (end > writeStream.endOffset) { | ||
var err = new Error("maximum file length exceeded"); | ||
err.code = 'ETOOBIG'; | ||
writeStream.destroyed = true; | ||
callback(err); | ||
return; | ||
} | ||
buffer.copy(bufferSlicer.buffer, writeStream.pos, 0, buffer.length); | ||
writeStream.bytesWritten += buffer.length; | ||
writeStream.pos = end; | ||
writeStream.emit('progress'); | ||
}; | ||
writeStream.destroy = function() { | ||
writeStream.destroyed = true; | ||
}; | ||
return writeStream; | ||
}; | ||
BufferSlicer.prototype.ref = function() { | ||
this.refCount += 1; | ||
}; | ||
BufferSlicer.prototype.unref = function() { | ||
this.refCount -= 1; | ||
if (this.refCount < 0) { | ||
throw new Error("invalid unref"); | ||
} | ||
}; | ||
function createFromBuffer(buffer) { | ||
return new BufferSlicer(buffer); | ||
} |
{ | ||
"name": "fd-slicer", | ||
"version": "0.3.2", | ||
"version": "0.4.0", | ||
"description": "safely create multiple ReadStream or WriteStream objects from the same file descriptor", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -39,2 +39,4 @@ # fd-slicer | ||
* Ability to set a maximum size and emit an error if this size is exceeded. | ||
* Ability to create an `FdSlicer` instance from a `Buffer`. This enables you | ||
to provide API for handling files as well as buffers using the same API. | ||
@@ -59,5 +61,18 @@ ## Usage | ||
You can also create from a buffer: | ||
```js | ||
var FdSlicer = require('fd-slicer'); | ||
var fdSlicer = FdSlicer.createFromBuffer(someBuffer); | ||
var firstPart = fdSlicer.createReadStream({start: 0, end: 100}); | ||
var secondPart = fdSlicer.createReadStream({start: 100}); | ||
var firstOut = fs.createWriteStream("first.txt"); | ||
var secondOut = fs.createWriteStream("second.txt"); | ||
firstPart.pipe(firstOut); | ||
secondPart.pipe(secondOut); | ||
``` | ||
## API Documentation | ||
### FdSlicer(fd, [options]) | ||
### new FdSlicer(fd, [options]) | ||
@@ -84,2 +99,10 @@ ```js | ||
### FdSlicer.createFromBuffer(buffer) | ||
```js | ||
var FdSlicer = require('fd-slicer'); | ||
var fdSlicer = FdSlicer.createFromBuffer(someBuffer); | ||
// ... | ||
``` | ||
#### Properties | ||
@@ -89,3 +112,3 @@ | ||
The file descriptor passed in. | ||
The file descriptor passed in. `undefined` if created from a buffer. | ||
@@ -166,2 +189,3 @@ #### Methods | ||
Emitted when fd-slicer closes the file descriptor due to `autoClose`. | ||
Emitted when fd-slicer closes the file descriptor due to `autoClose`. Never | ||
emitted if created from a buffer. |
24306
473
187