66 lines
1.1 KiB
JavaScript
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;
|