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.
51 lines
1.1 KiB
51 lines
1.1 KiB
'use strict'; |
|
|
|
var SyncReader = module.exports = function(buffer) { |
|
|
|
this._buffer = buffer; |
|
this._reads = []; |
|
}; |
|
|
|
SyncReader.prototype.read = function(length, callback) { |
|
|
|
this._reads.push({ |
|
length: Math.abs(length), // if length < 0 then at most this length |
|
allowLess: length < 0, |
|
func: callback |
|
}); |
|
}; |
|
|
|
SyncReader.prototype.process = function() { |
|
|
|
// as long as there is any data and read requests |
|
while (this._reads.length > 0 && this._buffer.length) { |
|
|
|
var read = this._reads[0]; |
|
|
|
if (this._buffer.length && (this._buffer.length >= read.length || read.allowLess)) { |
|
|
|
// ok there is any data so that we can satisfy this request |
|
this._reads.shift(); // == read |
|
|
|
var buf = this._buffer; |
|
|
|
this._buffer = buf.slice(read.length); |
|
|
|
read.func.call(this, buf.slice(0, read.length)); |
|
|
|
} |
|
else { |
|
break; |
|
} |
|
|
|
} |
|
|
|
if (this._reads.length > 0) { |
|
return new Error('There are some read requests waitng on finished stream'); |
|
} |
|
|
|
if (this._buffer.length > 0) { |
|
return new Error('unrecognised content at end of stream'); |
|
} |
|
|
|
};
|
|
|