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.
53 lines
1.2 KiB
53 lines
1.2 KiB
|
|
var util = require('util');
|
|
var Transform = require('stream').Transform;
|
|
|
|
util.inherits(SliceStream, Transform);
|
|
function SliceStream(start, end) {
|
|
|
|
if (!(this instanceof SliceStream)) {
|
|
return new SliceStream();
|
|
}
|
|
|
|
Transform.call(this);
|
|
this._start = start || 0;
|
|
this._end = end || Infinity;
|
|
this._offset = 0;
|
|
this._state = 0;
|
|
|
|
this._emitUp = false;
|
|
this._emitDown = false;
|
|
}
|
|
|
|
SliceStream.prototype._transform = function(chunk, encoding, done) {
|
|
this._offset += chunk.length;
|
|
if (!this._emitUp && this._offset >= this._start) {
|
|
this._emitUp = true;
|
|
var start = chunk.length - (this._offset - this._start);
|
|
if(this._offset > this._end)
|
|
{
|
|
var end = chunk.length - (this._offset - this._end);
|
|
this._emitDown = true;
|
|
this.push(chunk.slice(start, end));
|
|
}
|
|
else
|
|
{
|
|
this.push(chunk.slice(start, chunk.length));
|
|
}
|
|
return done();
|
|
}
|
|
if (this._emitUp && !this._emitDown) {
|
|
if (this._offset >= this._end) {
|
|
this._emitDown = true;
|
|
this.push(chunk.slice(0, chunk.length - (this._offset - this._end)));
|
|
} else {
|
|
this.push(chunk);
|
|
}
|
|
return done();
|
|
}
|
|
return done();
|
|
}
|
|
|
|
exports.slice = function(start, end) {
|
|
return new SliceStream(start, end);
|
|
}
|
|
|