'use strict';
var util = require('util');
var Duplex = require('stream').Duplex;
var LinkedList = require('linkedlist');
util.inherits(CacheDuplexStream, Duplex);
function CacheDuplexStream(buffer, emitter) {
Duplex.call(this);
this.emitter = emitter;
this._offset = 0;
// this.chunks = new LinkedList();
this.unfullfilledReadCount = 0;
this.readOffset = 0;
this.on('finish', function onFinish() {
Iif (this.unfullfilledReadCount > 0) {
this.push(null);
// } else {
// this.chunks.push(null);
}
});
}
CacheDuplexStream.prototype._read = function _read(size) {
Iif(this.readOffset < this.emitter._buffer.length) {
var chunk = this.emitter._buffer[this.readOffset];
this.readOffset++
// if (this.chunks.length) {
// var chunk = this.chunks.shift();
this.push(chunk);
this.unfullfilledReadCount = (this.unfullfilledReadCount > 0) ? this.unfullfilledReadCount - 1 : this.unfullfilledReadCount;
} else {
this.unfullfilledReadCount = this.unfullfilledReadCount + 1;
}
//
// size = size || 24 * 1024;
// size = Math.min(size, this._object.length - this._offset);
//
// var buffer = Buffer.concat(self.emitters[key]._buffer);
//
// if (this._offset < buffer.length) {
// this.push(buffer.slice(this._offset, this._offset + size));
// this._offset += size;
// }
};
CacheDuplexStream.prototype._write = function _write(chunk, encoding, next) {
this.emitter._buffer.push(chunk);
this.emitter.emit('data', chunk);
if (this.unfullfilledReadCount > 0) {
this.readOffset++;
this.push(chunk);
this.unfullfilledReadCount = this.unfullfilledReadCount - 1;
} else {
this.readOffset++;
this.push(chunk);
this.unfullfilledReadCount = this.unfullfilledReadCount - 1;
// this.chunks.push(chunk);
}
next();
};
module.exports = CacheDuplexStream;
|