read-xml
Version:
Read a xml file respecting its encoding information
114 lines (79 loc) • 3.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _debug = require('debug');
var _debug2 = _interopRequireDefault(_debug);
var _stream = require('stream');
var _stream2 = _interopRequireDefault(_stream);
var _iconvLite = require('iconv-lite');
var _iconvLite2 = _interopRequireDefault(_iconvLite);
var _findEncoding = require('./findEncoding');
var _findEncoding2 = _interopRequireDefault(_findEncoding);
var _defaultEncoding = require('./defaultEncoding');
var _defaultEncoding2 = _interopRequireDefault(_defaultEncoding);
var _package = require('../package.json');
var _package2 = _interopRequireDefault(_package);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var Transform = _stream2.default.Transform;
var debugMe = (0, _debug2.default)(_package2.default.name + ':stream');
function concatBuffers(chunks) {
var totalLength = chunks.reduce(function (previousValue, chunk) {
return previousValue + chunk.length;
}, 0);
return Buffer.concat(chunks, totalLength);
}
function DecoderXMLStream(streamOpts) {
var options = streamOpts || {};
// eslint-disable-next-line no-multi-assign
options.encoding = this.encoding = _defaultEncoding2.default; // we output strings
this.chunks = [];
this.bufContent = null;
this.encodingDetected = null;
Transform.call(this, options);
}
DecoderXMLStream.prototype = Object.create(Transform.prototype, {
constructor: {
value: DecoderXMLStream
}
});
// eslint-disable-next-line no-underscore-dangle
DecoderXMLStream.prototype._transform = function (chunk, encoding, done) {
var _this = this;
if (!Buffer.isBuffer(chunk)) {
return done(new Error('read-xml#createStream needs buffers as its input'));
}
debugMe('receiving chunk..');
try {
if (this.encodingDetected) {
debugMe('encoding was detected before, decoding chunk to ' + this.encodingDetected + '..');
this.push(_iconvLite2.default.decode(chunk, this.encodingDetected), this.encoding);
return done();
}
this.chunks.push(chunk);
this.bufContent = concatBuffers(this.chunks);
debugMe('trying to find encoding..');
(0, _findEncoding2.default)(this.bufContent, _defaultEncoding2.default, function (err, detectedEncoding) {
if (err) {
return done(err);
}
if (detectedEncoding == null) {
debugMe('could not find encoding in chunk, decoding to default ' + _this.encoding + '..');
_this.push(_iconvLite2.default.decode(chunk, _this.encoding), _this.encoding);
return done();
}
if (!_iconvLite2.default.encodingExists(detectedEncoding)) {
return done(new Error(detectedEncoding + ' is not supported'));
}
debugMe('encoding detected, decoding chunk to ' + detectedEncoding + '..');
_this.emit('encodingDetected', detectedEncoding);
_this.encodingDetected = detectedEncoding;
_this.push(_iconvLite2.default.decode(chunk, detectedEncoding), _this.encoding);
done();
});
} catch (err) {
done(err);
}
};
exports.default = DecoderXMLStream;
module.exports = exports['default'];