Files
desktop-app/node_modules/needle/lib/parsers.js
2015-01-20 10:41:03 +08:00

74 lines
1.8 KiB
JavaScript

//////////////////////////////////////////
// Defines mappings between content-type
// and the appropriate parsers.
//////////////////////////////////////////
var Transform = require('stream').Transform;
function parserFactory(fn) {
return function() {
var chunks = [],
stream = new Transform({ objectMode: true });
// Buffer all our data
stream._transform = function(chunk, encoding, done) {
chunks.push(chunk);
done();
}
// And call the parser when all is there.
stream._flush = function(done) {
var self = this,
data = Buffer.concat(chunks);
try {
fn(data, function(err, result) {
if (err) throw err;
self.push(result);
});
} catch (err) {
// console.error('Error while processing: ', err);
self.push(data); // just pass the original data
} finally {
done();
}
}
return stream;
}
}
module.exports['application/json'] = parserFactory(function(buffer, callback) {
var err, data;
try {
data = JSON.parse(buffer);
} catch (e) {
err = e;
}
callback(err, data);
});
module.exports['text/javascript'] = module.exports['application/json'];
try {
var xml2js = require('xml2js');
// xml2js.Parser.parseString() has the exact same function signature
// as our ParseStream expects, so we can reuse this.
module.exports['application/xml'] = parserFactory(new xml2js.Parser({
explicitRoot : true,
explicitArray: false
}).parseString, true);
// aliases for other XML content types
module.exports['text/xml'] = module.exports['application/xml'];
module.exports['application/rss+xml'] = module.exports['application/xml'];
module.exports['application/atom+xml'] = module.exports['application/xml'];
} catch(e) { /* xml2js not found */ }