You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					122 lines
				
				3.3 KiB
			
		
		
			
		
	
	
					122 lines
				
				3.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Buffer = require("buffer").Buffer,
							 | 
						||
| 
								 | 
							
								    Transform = require("stream").Transform;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// == 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;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |