Created
October 16, 2018 23:04
-
-
Save whitehat101/cb5696d669a94b11ab156b81b6392ead to your computer and use it in GitHub Desktop.
quick and dirty fix for Webpack and iconv-lite streams
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
var Buffer = require("buffer").Buffer, | |
Transform = require("stream").Transform, | |
iconv = require('iconv-lite'); | |
// == Exports ================================================================== | |
// module.exports = function(iconv) { | |
// Additional Public API. | |
iconv.encodeStream = function encodeStream(encoding, options) { | |
return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options); | |
} | |
iconv.decodeStream = function decodeStream(encoding, options) { | |
return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options); | |
} | |
iconv.supportsStreams = true; | |
// Not published yet. | |
iconv.IconvLiteEncoderStream = IconvLiteEncoderStream; | |
iconv.IconvLiteDecoderStream = IconvLiteDecoderStream; | |
iconv._collect = IconvLiteDecoderStream.prototype.collect; | |
// }; | |
// == Encoder stream ======================================================= | |
function IconvLiteEncoderStream(conv, options) { | |
this.conv = conv; | |
options = options || {}; | |
options.decodeStrings = false; // We accept only strings, so we don't need to decode them. | |
Transform.call(this, options); | |
} | |
IconvLiteEncoderStream.prototype = Object.create(Transform.prototype, { | |
constructor: { value: IconvLiteEncoderStream } | |
}); | |
IconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) { | |
if (typeof chunk != 'string') | |
return done(new Error("Iconv encoding stream needs strings as its input.")); | |
try { | |
var res = this.conv.write(chunk); | |
if (res && res.length) this.push(res); | |
done(); | |
} | |
catch (e) { | |
done(e); | |
} | |
} | |
IconvLiteEncoderStream.prototype._flush = function(done) { | |
try { | |
var res = this.conv.end(); | |
if (res && res.length) this.push(res); | |
done(); | |
} | |
catch (e) { | |
done(e); | |
} | |
} | |
IconvLiteEncoderStream.prototype.collect = function(cb) { | |
var chunks = []; | |
this.on('error', cb); | |
this.on('data', function(chunk) { chunks.push(chunk); }); | |
this.on('end', function() { | |
cb(null, Buffer.concat(chunks)); | |
}); | |
return this; | |
} | |
// == Decoder stream ======================================================= | |
function IconvLiteDecoderStream(conv, options) { | |
this.conv = conv; | |
options = options || {}; | |
options.encoding = this.encoding = 'utf8'; // We output strings. | |
Transform.call(this, options); | |
} | |
IconvLiteDecoderStream.prototype = Object.create(Transform.prototype, { | |
constructor: { value: IconvLiteDecoderStream } | |
}); | |
IconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) { | |
if (!Buffer.isBuffer(chunk)) | |
return done(new Error("Iconv decoding stream needs buffers as its input.")); | |
try { | |
var res = this.conv.write(chunk); | |
if (res && res.length) this.push(res, this.encoding); | |
done(); | |
} | |
catch (e) { | |
done(e); | |
} | |
} | |
IconvLiteDecoderStream.prototype._flush = function(done) { | |
try { | |
var res = this.conv.end(); | |
if (res && res.length) this.push(res, this.encoding); | |
done(); | |
} | |
catch (e) { | |
done(e); | |
} | |
} | |
IconvLiteDecoderStream.prototype.collect = function(cb) { | |
var res = ''; | |
this.on('error', cb); | |
this.on('data', function(chunk) { res += chunk; }); | |
this.on('end', function() { | |
cb(null, res); | |
}); | |
return this; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment