“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;

}