UNPKG

odataserver2

Version:

OData server on top of MySQL and LeveDb

157 lines (120 loc) 3.67 kB
// imports // ======== var ConnectLight = require('connectlight'); var ODServerMysql = require('./odservermysql.js'); var ODServerLevelDb = require('./odserverleveldb.js'); var OdParser = require('odparser').OdParser; var OdAcl = require('odacl'); var basicAuth = require('connectbasicauth'); // constants // ========= var LEVELDB_PATH = './mydb' // Setup logging // ============= var log = console.log.bind(console); var info = console.info.bind(console, 'INFO'); var error = console.error.bind(console, 'ERROR'); var DEV_MODE = true; var debug; if (DEV_MODE) { debug = console.log.bind(console, 'DEBUG'); } else { debug = function () {}; } // Setup Odata Server Modules // ========================== var mws = new ConnectLight(); var odsMysql = new ODServerMysql(); var odsLevelDb = new ODServerLevelDb(LEVELDB_PATH); // Allow CORS mws.use( function(req, res, next) { if (req.headers['origin']) { var origin = req.headers['origin']; debug('CORS headers set. Allowing the clients origin: ' + origin); res.setHeader('Access-Control-Allow-Origin', origin); res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, ' + 'user, password'); res.setHeader('Access-Control-Expose-Headers', 'ETag'); res.setHeader('Access-Control-Allow-Credentials', 'true'); res.setHeader('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS'); } // The response to `OPTIONS` requests is always the same empty message if (req.method == 'OPTIONS') { res.end(); } next(); }); mws.use('/help', function (req, res, next) { var path = require('path'); var fs = require('fs'); var dir = path.join(path.dirname(fs.realpathSync(__filename)), './'); var fileStream = fs.createReadStream(dir + 'Usage.md'); res.writeHead(200, { 'Content-Type': 'text/plain' }); fileStream.on('end', function () { res.end(); }); fileStream.pipe(res); }); mws.use('/help2', function (req, res, next) { var path = require('path'); var fs = require('fs'); var dir = path.join(path.dirname(fs.realpathSync(__filename)), './'); var fileStream = fs.createReadStream(dir + 'Usage2.md'); res.writeHead(200, { 'Content-Type': 'text/plain' }); fileStream.on('end', function () { res.end(); }); fileStream.pipe(res); }); mws.use(OdParser.handleRequest); var handleError = function (req, res, next, err) { res.writeHead(406, { "Content-Type": "application/json" }); res.write(JSON.stringify({ err: err })); error(err); //next(); res.end(); }; mws.use(function (req, res, next) { var contentLength = parseInt(req.headers['content-length']); contentLength = (!isNaN(contentLength)) ? contentLength : 0; log('processing request: ', req.url, ' content length: ' + contentLength); if (!req.ast) handleError(req, res, next, 'Unknown operation: ' + req.url); else { debug(req.ast); next(); } }); mws.use(basicAuth); mws.use(odsMysql.handleRequest()); var acl = new OdAcl('perms', { host: process.env.DB_HOST, parseChar: '$', connectFromHost: (process.env.DB_HOST === 'localhost') ? 'localhost' : '%' }, handleError); mws.use(acl.handleRequest()); mws.use(odsLevelDb.handleRequest()); mws.listen(3000); process.on('SIGINT', function () { log("Caught interrupt signal"); mws.close(); setTimeout(process.exit, 1000); }); process.on('exit', function (code) { log('About to exit with code:', code); }); process.on('uncaughtException', function (code) { error('uncaughtException error:', code); /*mws.close(function(){ mws.listen(3000); });*/ }); log('server running on port 3000');