| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- '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;
|