{"version":3,"sources":["jsdelivr-header.js","/npm/odataserver@0.3.0/src/main.js"],"names":[],"mappings":"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","file":"/npm/odataserver@0.3.0/src/main.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/odataserver@0.3.0/src/main.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// main.js\n//--------\n//\n// 2014-12-06, Jonas Colmsjö\n//------------------------------\n//\n// This is the top file in the hierarchy. The architedture looks like this:\n//\n//       +-------------------+\n//       |        main       |\n//       +------+---------+--+\n//              |         |\n//              v         |\n//       +-------------+  |\n//       | odataserver |  |\n//       +--+----------+  |\n//          |             |\n//          |             |\n//          |             |\n//          v             v\n//      +-------+    +---------+\n//      | mysql |<---| leveldb |\n//      +-------+    +---------+\n//\n//\n// LevelDB is an in-process library key/value store is currently used for buckets.\n// This means that there only can be one process for each accountId (i.e.\n// ordinary application server clusters are not supported but a sharded setup\n// can be used).\n//\n// Using\n// [Google JavaScript Style Guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml)\n//\n\n\nvar moduleSelf = this;\n\nvar https = require('https');\nvar http = require('http');\nvar url = require('url');\nvar fs = require('fs');\n\nvar config = require('./config.js');\nvar CONSTANTS = require('./constants.js');\nvar odata = require('./odataserver.js');\nvar h = require('./helpers.js');\n\nvar log = new h.log0(CONSTANTS.mainLoggerOptions);\n\nvar rdbms = require(CONSTANTS.ODATA.RDBMS_BACKEND);\nvar buckets = require(CONSTANTS.ODATA.BUCKET_BACKEND);\nvar middleware = require('./middleware.js');\n\nvar server;\n\n//\n// Module helpers\n// --------------\n\n// Experimental - the RDBMS is likely the bottleneck, **not** this\n// NodeJS process\nmoduleSelf.tooBusy = false;\nvar setupTooBusy = function() {\n  var ts = Date.now();\n  var lastTs = ts;\n  setInterval(function() {\n    ts = Date.now();\n    moduleSelf.tooBusy = (ts - lastTs) > 505;\n    lastTs = ts;\n\n    if (moduleSelf.tooBusy) {\n      log.log(\"ALERT: Server tooBusy!\");\n    }\n\n  }, 500);\n};\n\nvar tokenize = h.tokenize;\n\n//\n// Middleware\n// ----------\n\nvar checkMethod = function(req, res, next) {\n\n  // do nothing if the response is closed\n  if (res.finished) {\n    next();\n    return;\n  }\n\n  // Only GET, POST, PUT and DELETE supported\n  if (!(req.method == 'GET' ||\n      req.method == 'POST' ||\n      req.method == 'PUT' ||\n      req.method == 'DELETE' ||\n      req.method == 'OPTIONS')) {\n\n    h.writeError(res, req.method + ' not supported.');\n  }\n\n  next();\n};\n\nvar allowCors = function(req, res, next) {\n\n  // do nothing if the response is closed\n  if (res.finished) {\n    next();\n    return;\n  }\n\n  // Allow CORS\n  if (global.CONFIG.ODATA.ALLOW_CORS && req.headers['origin']) {\n    var origin = req.headers['origin'];\n    log.debug('CORS headers set. Allowing the clients origin: ' + origin);\n\n    res.setHeader('Access-Control-Allow-Origin', origin);\n\n    res.setHeader('Access-Control-Allow-Headers',\n      'Origin, X-Requested-With, Content-Type, Accept, ' +\n      'user, password');\n\n    res.setHeader('Access-Control-Allow-Credentials', 'true');\n\n    res.setHeader('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS');\n  }\n\n  // The response to `OPTIONS` requests is always the same empty message\n  if (req.method == 'OPTIONS') {\n    res.end();\n  }\n\n  next();\n};\n\nvar logRequest = function(req, res, next) {\n\n  // do nothing if the response is closed\n  if (res.finished) {\n    next();\n    return;\n  }\n\n  var str = \"Processing request: \" +\n    JSON.stringify(req.method) + \" - \" +\n    JSON.stringify(req.url) + \" - \" +\n    JSON.stringify(req.headers);\n\n  // log and fire dtrace probe\n  log.log(str);\n  h.fireProbe(str);\n\n  next();\n};\n\nvar isHelpOp = function(url) {\n  var tokens = tokenize(url);\n\n  return (tokens[0] === global.CONFIG.ODATA.HELP_PATH);\n};\n\nvar matchHelp = function(req, res, next) {\n\n  // do nothing if the response is closed\n  if (res.finished) {\n    next();\n    return;\n  }\n\n  var tokens = tokenize(req.url);\n\n  // Show the help\n  if (isHelpOp(req.url)) {\n    log.debug('Showing help');\n\n    var path = require('path');\n    var fs = require('fs');\n    var dir = path.join(path.dirname(fs.realpathSync(__filename)), '../');\n\n    var fileStream = fs.createReadStream(dir + CONSTANTS.ODATA.HELP_FILE);\n    res.writeHead(200, {\n      'Content-Type': 'text/plain'\n    });\n\n    fileStream.on('end', function() {\n      next();\n    });\n\n    fileStream.pipe(res);\n    return;\n  }\n\n  next();\n};\n\nvar isValidSystemOp = function(url) {\n  var tokens = tokenize(url);\n\n  return (tokens.length === 3 &&\n    tokens[1] === global.CONFIG.ODATA.SYS_PATH &&\n    !odata.isAdminOp(tokens[2]) &&\n    !buckets.isAdminOp(tokens[2]));\n};\n\nvar performChecks = function(req, res, next) {\n  // do nothing if the response is closed\n  if (res.finished) {\n    next();\n    return;\n  }\n\n  /*\n  Breaks service_def\n  // Check that the url has table/bucket or system operation\n  if (tokens_[0] !== 'create_account' &&\n  tokens_[0] !== 'delete_account' &&\n  tokens_.length <= 1) {\n  h.writeError(response, 'Invalid operation: ' + request.method +\n  ' ' + request.url);\n  return;\n  }\n  */\n\n  // `tokens_` should contain `[ account, table ]` or\n  // `[ account, 's', system_operation ]` now\n  var tokens = tokenize(req.url);\n\n  // Check that the system operations are valid\n  if (isValidSystemOp(req.url)) {\n    h.writeError(res, {\n      message: \"Invalid system operation. \" + tokens[2]\n    });\n  }\n\n  next();\n};\n\n\n//\n// Constructor\n// ---------------------\n\nmain = function(conf) {\n  if (!(this instanceof main)) return new main(conf);\n\n  global.CONFIG = new config(conf);\n\n  var fs = require('fs');\n  fs.writeFile(\"/tmp/odataserver.pid\", \"PID=\"+process.pid, function(err) {\n    if(err) {\n      return log.log(err);\n    }\n  });\n};\n\n//\n// Start the OData server\n// ---------------------\n\nmain.prototype.start = function() {\n  var self = this;\n\n  if (CONSTANTS.enableTooBusy) {\n    setupTooBusy();\n  }\n\n  // setup the middleware\n  // --------------------\n\n  moduleSelf.server = new middleware();\n  self.init(moduleSelf.server);\n\n  // start http server\n  // -----------------\n\n  if (CONSTANTS.HTTPS_OPTIONS.USE_HTTPS) {\n\n    log.log('Use HTTPS.');\n\n    var httpsOptions = {\n      key: fs.readFileSync(CONSTANTS.HTTPS_OPTIONS.KEY_FILE),\n      cert: fs.readFileSync(CONSTANTS.HTTPS_OPTIONS.CERT_FILE)\n    };\n\n    moduleSelf.server.listen(global.CONFIG.ODATA.PORT, httpsOptions);\n\n  } else {\n    log.log('Use HTTP.');\n    moduleSelf.server.listen(global.CONFIG.ODATA.PORT);\n  }\n\n  log.log(\"Server is listening on port \" + global.CONFIG.ODATA.PORT);\n};\n\n//\n// Stop the OData server\n// ---------------------\n\nmain.prototype.stop = function() {\n  if (moduleSelf.server) moduleSelf.server.close();\n};\n\n//\n// Expose the buckets and odataserver classes to they can be used with express\n// ---------------------------------------------------------------------------\n//\n//```\n// var express = require('express');\n// var app = express();\n//\n// var odataserver = require('odataserver');\n// odataserver.init(app);\n//\n// var server = app.listen(3000, function () {\n//\n//   var host = server.address().address;\n//   var port = server.address().port;\n//\n//   console.log('Example app listening at http://%s:%s', host, port);\n//\n// });\n//```\n\nmain.prototype.init = function(mws) {\n  var self = this;\n\n  var odataServer = new odata.ODataServer();\n  var bucketServer = new buckets.BucketHttpServer();\n\n  mws.use(checkMethod);\n  mws.use(allowCors);\n  mws.use(logRequest);\n  mws.use(matchHelp);\n  mws.use(performChecks);\n  mws.use(bucketServer.main.bind(bucketServer));\n  mws.use(odataServer.main.bind(odataServer));\n};\n\nmain.buckets = buckets.BucketHttpServer;\nmain.rdbms = odata.ODataServer;\n\nmodule.exports = main;\n"]}