mirror of
https://github.com/leanote/desktop-app.git
synced 2025-10-18 17:52:17 +00:00
74 lines
1.8 KiB
JavaScript
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 */ }
|