54 lines
1.2 KiB
JavaScript
54 lines
1.2 KiB
JavaScript
'use strict';
|
|
|
|
const {Transform} = require('stream');
|
|
const {StringDecoder} = require('string_decoder');
|
|
|
|
class Utf8Stream extends Transform {
|
|
constructor(options) {
|
|
super(Object.assign({}, options, {writableObjectMode: false}));
|
|
this._buffer = '';
|
|
}
|
|
|
|
_transform(chunk, encoding, callback) {
|
|
if (typeof chunk == 'string') {
|
|
this._transform = this._transformString;
|
|
} else {
|
|
this._stringDecoder = new StringDecoder();
|
|
this._transform = this._transformBuffer;
|
|
}
|
|
this._transform(chunk, encoding, callback);
|
|
}
|
|
|
|
_transformBuffer(chunk, _, callback) {
|
|
this._buffer += this._stringDecoder.write(chunk);
|
|
this._processBuffer(callback);
|
|
}
|
|
|
|
_transformString(chunk, _, callback) {
|
|
this._buffer += chunk.toString();
|
|
this._processBuffer(callback);
|
|
}
|
|
|
|
_processBuffer(callback) {
|
|
if (this._buffer) {
|
|
this.push(this._buffer, 'utf8');
|
|
this._buffer = '';
|
|
}
|
|
callback(null);
|
|
}
|
|
|
|
_flushInput() {
|
|
// meant to be called from _flush()
|
|
if (this._stringDecoder) {
|
|
this._buffer += this._stringDecoder.end();
|
|
}
|
|
}
|
|
|
|
_flush(callback) {
|
|
this._flushInput();
|
|
this._processBuffer(callback);
|
|
}
|
|
}
|
|
|
|
module.exports = Utf8Stream;
|