| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | var assert = require('assert')var Reader = module.exports = function(options) {  //TODO - remove for version 1.0  if(typeof options == 'number') {    options = { headerSize: options }  }  options = options || {}  this.offset = 0  this.lastChunk = false  this.chunk = null  this.chunkLength = 0  this.headerSize = options.headerSize || 0  this.lengthPadding = options.lengthPadding || 0  this.header = null  assert(this.headerSize < 2, 'pre-length header of more than 1 byte length not currently supported')}Reader.prototype.addChunk = function(chunk) {  if (!this.chunk || this.offset === this.chunkLength) {    this.chunk = chunk    this.chunkLength = chunk.length    this.offset = 0    return  }  var newChunkLength = chunk.length  var newLength = this.chunkLength + newChunkLength  if (newLength > this.chunk.length) {    var newBufferLength = this.chunk.length * 2    while (newLength >= newBufferLength) {      newBufferLength *= 2    }    var newBuffer = Buffer.alloc(newBufferLength)    this.chunk.copy(newBuffer)    this.chunk = newBuffer  }  chunk.copy(this.chunk, this.chunkLength)  this.chunkLength = newLength}Reader.prototype.read = function() {  if(this.chunkLength < (this.headerSize + 4 + this.offset)) {    return false  }  if(this.headerSize) {    this.header = this.chunk[this.offset]  }  //read length of next item  var length = this.chunk.readUInt32BE(this.offset + this.headerSize) + this.lengthPadding  //next item spans more chunks than we have  var remaining = this.chunkLength - (this.offset + 4 + this.headerSize)  if(length > remaining) {    return false  }  this.offset += (this.headerSize + 4)  var result = this.chunk.slice(this.offset, this.offset + length)  this.offset += length  return result}
 |