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.
96 lines
2.3 KiB
96 lines
2.3 KiB
|
|
function FlexBuffer(){ |
|
this.originalArgs = arguments |
|
|
|
if (arguments[0] && typeof arguments[0] === "number") |
|
this.buffer = new Buffer (arguments[0]); |
|
else |
|
this.buffer = Buffer.call(this,arguments); |
|
this.length = this.buffer.length |
|
this.tail = 0 |
|
} |
|
|
|
FlexBuffer.prototype.rewind = function(){ |
|
this.tail = 0 |
|
} |
|
|
|
FlexBuffer.prototype.reset = function(){ |
|
this.buffer = Buffer.call(this,this.originalArgs) |
|
this.length = this.buffer.length |
|
this.tail = 0 |
|
} |
|
|
|
FlexBuffer.prototype.resizeBuffer = function(minLen){ |
|
if(this.length == 0){ |
|
this.length = 1 |
|
} |
|
this.length = (this.length + minLen) * 2 |
|
var oldBuffer = this.buffer |
|
this.buffer = new Buffer(this.length) |
|
oldBuffer.copy(this.buffer,0, 0, this.tail) |
|
} |
|
|
|
FlexBuffer.prototype.write = function(arg){ |
|
if(!arg) |
|
return; |
|
if(!arg.length){ |
|
arg = String(arg) |
|
} |
|
|
|
if(typeof arg === "string") |
|
var len = Buffer.byteLength(arg); |
|
else |
|
var len = arg.length; |
|
|
|
if(this.tail+len >= this.length) |
|
this.resizeBuffer(len) |
|
|
|
if(Buffer.isBuffer(arg)){ |
|
arg.copy(this.buffer,this.tail) |
|
}else{ |
|
this.buffer.write(arg,this.tail) |
|
} |
|
this.tail+=len |
|
} |
|
|
|
FlexBuffer.prototype.getBufferReference = function(){ |
|
return this.buffer.slice(0,this.tail) |
|
} |
|
|
|
FlexBuffer.prototype.getBuffer = function(){ |
|
var buff = this.buffer.slice(0,this.tail) |
|
var b = new Buffer(buff.length) |
|
buff.copy(b) |
|
return b |
|
} |
|
|
|
FlexBuffer.prototype.delete = function(start, end) { |
|
checkParams(start, end, this.tail); |
|
var copy = this.buffer.slice(end, this.tail).copy(this.buffer, start) |
|
this.tail = this.tail - end + start |
|
} |
|
|
|
var checkParams = function (start, end, size) { |
|
if (end > size || start > size || start < 0 || end < 0 || start > end) { |
|
throw new Error("Start and end not valid. start:["+start+"], end:["+end+"], size:["+size+"]"); |
|
} |
|
|
|
} |
|
|
|
FlexBuffer.prototype.deleteAndGet = function(start, end) { |
|
var b = new Buffer(end - start); |
|
this.buffer.slice(start, end).copy(b); |
|
this.delete(start, end); |
|
return b; |
|
} |
|
|
|
FlexBuffer.prototype.getLength = function() { |
|
return this.tail |
|
} |
|
|
|
FlexBuffer.prototype.getBufferLength = function() { |
|
return this.buffer.length; |
|
} |
|
|
|
module.exports.FlexBuffer = FlexBuffer |
|
|
|
|