66 lines
1.4 KiB
JavaScript
66 lines
1.4 KiB
JavaScript
|
|
|
|
class ResizeableBuffer{
|
|
constructor(size=100){
|
|
this.size = size
|
|
this.length = 0
|
|
this.buf = Buffer.alloc(size)
|
|
}
|
|
prepend(val){
|
|
if(Buffer.isBuffer(val)){
|
|
const length = this.length + val.length
|
|
if(length >= this.size){
|
|
this.resize()
|
|
if(length >= this.size){
|
|
throw Error('INVALID_BUFFER_STATE')
|
|
}
|
|
}
|
|
const buf = this.buf
|
|
this.buf = Buffer.alloc(this.size)
|
|
val.copy(this.buf, 0)
|
|
buf.copy(this.buf, val.length)
|
|
this.length += val.length
|
|
}else{
|
|
const length = this.length++
|
|
if(length === this.size){
|
|
this.resize()
|
|
}
|
|
const buf = this.clone()
|
|
this.buf[0] = val
|
|
buf.copy(this.buf,1, 0, length)
|
|
}
|
|
}
|
|
append(val){
|
|
const length = this.length++
|
|
if(length === this.size){
|
|
this.resize()
|
|
}
|
|
this.buf[length] = val
|
|
}
|
|
clone(){
|
|
return Buffer.from(this.buf.slice(0, this.length))
|
|
}
|
|
resize(){
|
|
const length = this.length
|
|
this.size = this.size * 2
|
|
const buf = Buffer.alloc(this.size)
|
|
this.buf.copy(buf,0, 0, length)
|
|
this.buf = buf
|
|
}
|
|
toString(encoding){
|
|
if(encoding){
|
|
return this.buf.slice(0, this.length).toString(encoding)
|
|
}else{
|
|
return Uint8Array.prototype.slice.call(this.buf.slice(0, this.length))
|
|
}
|
|
}
|
|
toJSON(){
|
|
return this.toString('utf8')
|
|
}
|
|
reset(){
|
|
this.length = 0
|
|
}
|
|
}
|
|
|
|
module.exports = ResizeableBuffer
|