addon-tools-el/js/writable-buffer.js

66 lines
1.1 KiB
JavaScript

'use strict';
const { Writable } = require('stream');
const CHUNK_SIZE = 1024;
const INITIAL_SIZE = 8 * CHUNK_SIZE;
const INCREMENT_SIZE = 8 * CHUNK_SIZE;
class WritableBuffer extends Writable {
constructor() {
super();
this._buffer = new Buffer(INITIAL_SIZE);
this._size = 0;
}
get() {
if ( ! this._size ) {
return null;
}
const data = new Buffer(this._size);
this._buffer.copy(data, 0, 0, this._size);
return data;
}
_increaseAsNeeded(incomingSize) {
if ( (this._buffer.length - this._size) >= incomingSize ) {
return;
}
const freeSpace = this._buffer.length - this._size;
const factor = Math.ceil((incomingSize - freeSpace) / INCREMENT_SIZE);
const newBuffer = new Buffer(this._buffer.length + (INCREMENT_SIZE * factor));
this._buffer.copy(newBuffer, 0, 0, this._size);
this._buffer = newBuffer;
}
_write(chunk, encoding, callback) {
this._increaseAsNeeded(chunk.length);
chunk.copy(this._buffer, this._size, 0);
this._size += chunk.length;
callback();
}
}
module.exports = WritableBuffer;