70 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
var Buffer = require('safe-buffer').Buffer;
 | 
						|
 | 
						|
var StreamReader = function() {
 | 
						|
  this._queue     = [];
 | 
						|
  this._queueSize = 0;
 | 
						|
  this._offset    = 0;
 | 
						|
};
 | 
						|
 | 
						|
StreamReader.prototype.put = function(buffer) {
 | 
						|
  if (!buffer || buffer.length === 0) return;
 | 
						|
  if (!Buffer.isBuffer(buffer)) buffer = Buffer.from(buffer);
 | 
						|
  this._queue.push(buffer);
 | 
						|
  this._queueSize += buffer.length;
 | 
						|
};
 | 
						|
 | 
						|
StreamReader.prototype.read = function(length) {
 | 
						|
  if (length > this._queueSize) return null;
 | 
						|
  if (length === 0) return Buffer.alloc(0);
 | 
						|
 | 
						|
  this._queueSize -= length;
 | 
						|
 | 
						|
  var queue  = this._queue,
 | 
						|
      remain = length,
 | 
						|
      first  = queue[0],
 | 
						|
      buffers, buffer;
 | 
						|
 | 
						|
  if (first.length >= length) {
 | 
						|
    if (first.length === length) {
 | 
						|
      return queue.shift();
 | 
						|
    } else {
 | 
						|
      buffer = first.slice(0, length);
 | 
						|
      queue[0] = first.slice(length);
 | 
						|
      return buffer;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  for (var i = 0, n = queue.length; i < n; i++) {
 | 
						|
    if (remain < queue[i].length) break;
 | 
						|
    remain -= queue[i].length;
 | 
						|
  }
 | 
						|
  buffers = queue.splice(0, i);
 | 
						|
 | 
						|
  if (remain > 0 && queue.length > 0) {
 | 
						|
    buffers.push(queue[0].slice(0, remain));
 | 
						|
    queue[0] = queue[0].slice(remain);
 | 
						|
  }
 | 
						|
  return Buffer.concat(buffers, length);
 | 
						|
};
 | 
						|
 | 
						|
StreamReader.prototype.eachByte = function(callback, context) {
 | 
						|
  var buffer, n, index;
 | 
						|
 | 
						|
  while (this._queue.length > 0) {
 | 
						|
    buffer = this._queue[0];
 | 
						|
    n = buffer.length;
 | 
						|
 | 
						|
    while (this._offset < n) {
 | 
						|
      index = this._offset;
 | 
						|
      this._offset += 1;
 | 
						|
      callback.call(context, buffer[index]);
 | 
						|
    }
 | 
						|
    this._offset = 0;
 | 
						|
    this._queue.shift();
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
module.exports = StreamReader;
 |