123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- "use strict";
- let 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) {
- let 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
- let 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");
- }
- };
|