endive-rpc
Version:
121 lines (101 loc) • 3.21 kB
JavaScript
var INCREMENT_SIZE = 2048;
var AutoBuffer = function( bufferSize ) {
bufferSize = bufferSize || INCREMENT_SIZE;
this.buffer = new Buffer ( bufferSize );
this.usedLength = 0;
};
module.exports = AutoBuffer;
AutoBuffer.prototype.getRemainSize = function() {
return (this.buffer.length - this.usedLength);
};
AutoBuffer.prototype.getLength = function() {
return this.usedLength;
};
AutoBuffer.prototype.getBuffer = function() {
return this.buffer;
};
AutoBuffer.prototype.append = function( buffer ) {
if ( Buffer.isBuffer ( buffer ) === false )
{
throw new Error( 'buffer is not instance of Buffer.' );
}
this.resize( buffer.length );
buffer.copy( this.buffer , this.usedLength );
this.usedLength += buffer.length;
};
AutoBuffer.prototype.peak = function( buffer , readSize , sourceStart ) {
if ( Buffer.isBuffer ( buffer ) === false )
{
throw new Error( 'buffer is not instance of Buffer.' );
}
sourceStart = sourceStart || 0;
readSize = readSize || buffer.length;
var sourceEnd = readSize + sourceStart;
if ( this.usedLength < sourceEnd )
{
sourceEnd = this.usedLength;
}
this.buffer.copy( buffer , 0 , sourceStart , sourceEnd );
return sourceEnd - sourceStart;
};
AutoBuffer.prototype.peakUInt16 = function( offset ) {
var buffer = this.buffer;
if ( this.getLength() < 2 )
{
return null;
}
return parseInt ( this.buffer.readUInt16BE( offset ) , 10 );
};
AutoBuffer.prototype.peakUInt8 = function( offset ) {
var buffer = this.buffer;
if ( this.getLength() < 1 + offset )
{
return null;
}
return parseInt ( buffer.readUInt8( offset ) , 10 );
};
AutoBuffer.prototype.pop = function( buffer , readSize , sourceStart ) {
readSize = readSize || buffer.length;
sourceStart = sourceStart || 0;
var realReadLength = this.peak( buffer , readSize , sourceStart );
var popSize = realReadLength + sourceStart;
this.remove( popSize );
return realReadLength;
};
AutoBuffer.prototype.resize = function( expectedRemainLength ) {
if ( this.getRemainSize() < expectedRemainLength )
{
var buffer = this.buffer;
var length = buffer.length;
var incrementSize = INCREMENT_SIZE;
if ( incrementSize < expectedRemainLength )
{
incrementSize = expectedRemainLength;
}
var newBuffer = new Buffer( length + incrementSize );
buffer.copy( newBuffer );
this.buffer = newBuffer;
}
};
AutoBuffer.prototype.remove = function( size ) {
if ( size <= 0 ) return;
if( size == this.usedLength )
{
this.usedLength = 0;
}
else
{
this.buffer.copy( this.buffer , 0 , size );
this.usedLength -= size;
}
};
AutoBuffer.prototype.reset = function( bufferSize ) {
if ( bufferSize != null )
{
if ( this.buffer.length != bufferSize )
{
this.buffer = new Buffer ( bufferSize );
}
}
this.usedLength = 0;
};