diff --git a/Makefile b/Makefile index 0d8a9581..7b278ea4 100644 --- a/Makefile +++ b/Makefile @@ -63,11 +63,11 @@ _services-shutdown: @env MY_IP=${MY_IP} docker-compose -p marathon -f ./docker-compose.yaml stop @env MY_IP=${MY_IP} docker-compose -p marathon -f ./docker-compose.yaml rm -f -docker-build: +docker-build: build @docker build -t marathon . docker-run: - @docker run -i -t \ + @docker run -d -t \ -e "NODE_ENV=development" \ -e "PORT=8000" \ -e "PG_URL=postgresql://marathon@${MY_IP}:22222/marathon" \ diff --git a/lib/marathon.js b/lib/marathon.js index a81909c8..a20476d6 100644 --- a/lib/marathon.js +++ b/lib/marathon.js @@ -204,9 +204,9 @@ var _postgresql = __webpack_require__(21); - var _kafkaClient = __webpack_require__(24); + var _kafkaClient = __webpack_require__(25); - var _kafkaProducer = __webpack_require__(26); + var _kafkaProducer = __webpack_require__(27); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -779,9 +779,9 @@ var _postgresql = __webpack_require__(21); - var _kafkaClient = __webpack_require__(24); + var _kafkaClient = __webpack_require__(25); - var _kafkaProducer = __webpack_require__(26); + var _kafkaProducer = __webpack_require__(27); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } @@ -1115,7 +1115,7 @@ /* 21 */ /***/ function(module, exports, __webpack_require__) { - /* WEBPACK VAR INJECTION */(function(__dirname) {'use strict'; + 'use strict'; Object.defineProperty(exports, "__esModule", { value: true @@ -1261,14 +1261,9 @@ case 10: logr.debug('Loading models...'); - _fs2.default.readdirSync(basename).filter(function (file) { - return file.indexOf('.') !== 0 && file !== basename && file.slice(-3) === '.js' && file !== 'index.js'; - }).forEach(function (file) { - var modelPath = _path2.default.join(basename, file); - logr.debug({ modelPath: modelPath }, 'Loading model...'); - var model = client.import(modelPath); - logr.debug({ modelPath: modelPath }, 'Model loaded successfully.'); + _index2.default.forEach(function (model) { db[model.name] = model; + logr.debug({ model: model.name }, 'Model loaded successfully.'); }); logr.debug('All models loaded successfully.'); @@ -1334,20 +1329,13 @@ var _sequelize2 = _interopRequireDefault(_sequelize); - var _fs = __webpack_require__(23); - - var _fs2 = _interopRequireDefault(_fs); - - var _path = __webpack_require__(8); - - var _path2 = _interopRequireDefault(_path); + var _index = __webpack_require__(23); + var _index2 = _interopRequireDefault(_index); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - + function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } - - var basename = _path2.default.join(_path2.default.resolve(__dirname, '../models')); - /* WEBPACK VAR INJECTION */}.call(exports, "/")) /***/ }, /* 22 */ @@ -1357,9 +1345,22 @@ /***/ }, /* 23 */ -/***/ function(module, exports) { +/***/ function(module, exports, __webpack_require__) { - module.exports = require("fs"); + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _app = __webpack_require__(24); + + var _app2 = _interopRequireDefault(_app); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + var models = [_app2.default]; + exports.default = models; /***/ }, /* 24 */ @@ -1367,6 +1368,38 @@ 'use strict'; + var Sequelize = __webpack_require__(22); + + module.exports = function (sequelize) { + return sequelize.define('app', { + key: { + type: Sequelize.STRING, + allowNull: false, + validate: { len: [1, 255] } + }, + bundleId: { + type: Sequelize.STRING, + allowNull: false, + validate: { len: [1, 2000] } + }, + createdBy: { + type: Sequelize.STRING, + allowNull: false, + validate: { len: [1, 2000] } + } + }, { + timestamps: true, + underscored: true, + indexes: [{ fields: ['key'], unique: true }] + }); + }; + +/***/ }, +/* 25 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + Object.defineProperty(exports, "__esModule", { value: true }); @@ -1447,18 +1480,18 @@ }; }(); - var _kafkaNode = __webpack_require__(25); + var _kafkaNode = __webpack_require__(26); function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } /***/ }, -/* 25 */ +/* 26 */ /***/ function(module, exports) { module.exports = require("kafka-node"); /***/ }, -/* 26 */ +/* 27 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1553,7 +1586,7 @@ }; }(); - var _kafkaNode = __webpack_require__(25); + var _kafkaNode = __webpack_require__(26); var _kafkaNode2 = _interopRequireDefault(_kafkaNode); diff --git a/lib/marathon.js.map b/lib/marathon.js.map index 82451fc2..8270e1d8 100644 --- a/lib/marathon.js.map +++ b/lib/marathon.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap b5e3c5a36cacf0503a50","webpack:///external \"babel-polyfill\"","webpack:///./src/index.js","webpack:///(webpack)/buildin/module.js","webpack:///external \"commander\"","webpack:///./src/cmd/start.js","webpack:///external \"config\"","webpack:///./src/api/app.js","webpack:///external \"path\"","webpack:///external \"koa\"","webpack:///external \"koa-route\"","webpack:///./src/extensions/logger.js","webpack:///external \"bunyan\"","webpack:///./src/extensions/version.js","webpack:///./package.json","webpack:///./src/api/handlers/healthcheck.js","webpack:///./src/extensions/redis.js","webpack:///external \"redis\"","webpack:///external \"bluebird\"","webpack:///external \"redis-info\"","webpack:///external \"redlock\"","webpack:///./src/extensions/postgresql.js","webpack:///external \"sequelize\"","webpack:///external \"fs\"","webpack:///./src/extensions/kafkaClient.js","webpack:///external \"kafka-node\"","webpack:///./src/extensions/kafkaProducer.js"],"names":["RootCmd","rootCmd","version","args","parse","module","parent","cmd","run","process","argv","StartCmd","command","description","action","app","MarathonApp","config","allowedMethods","koaApp","configureLogger","configureMiddleware","handlersPath","join","__dirname","handlers","getHandlers","redisConfig","get","pgConfig","self","push","err","env","NODE_ENV","logger","fatal","exit","child","source","redisOptions","db","shouldReconnect","password","url","redisClient","options","debug","cfg","clientId","apiKafkaClient","producerCfg","apiKafkaProducer","configureRedis","configurePostgreSQL","configureKafka","use","ctx","next","start","Date","ms","set","initializeServices","forEach","handler","methodName","handlerMethod","bind","method","route","PORT","initializeApp","info","listen","Logger","logLevel","logToStdOut","logToFile","logFile","streams","stream","stdout","level","path","createLogger","name","src","getStreams","serializers","stdSerializers","HealthcheckHandler","resetServices","services","redis","up","postgreSQL","body","JSON","stringify","hasFailed","status","result","error","uptime","connectedClients","blockedClients","usedMemory","totalSystemMemory","maxMemory","rejectedConnections","cpuUsage","infoAsync","res","uptime_in_seconds","connected_clients","blocked_clients","used_memory_human","total_system_memory_human","maxmemory_human","rejected_connections","used_cpu_user","message","check","redisUrl","logr","retry_strategy","undefined","createClient","hasConnected","Promise","resolve","reject","ready","on","Error","pingAsync","connect","f","Lock","retryCount","retryDelay","lock","LockKey","LockTTL","rlock","unlock","withCriticalSection","promisifyAll","RedisClient","prototype","Multi","query","deadlockQuery","client","type","QueryTypes","SELECT","activeOperations","length","deadlock","deadlockOperations","row","blocked","pid","blocked_pid","txId","blocked_transaction_id","user","blocked_user","statement","blocked_statement","blocking","blocking_pid","blocking_transaction_id","blocking_user","blocking_statement","pgUrl","opt","dialect","readdirSync","basename","filter","file","indexOf","slice","modelPath","model","import","Object","keys","modelName","associate","kafkaClient","producer","Producer"],"mappings":"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","file":"marathon.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b5e3c5a36cacf0503a50","module.exports = require(\"babel-polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"babel-polyfill\"\n// module id = 1\n// module chunks = 0","import program from 'commander'\nimport StartCmd from './cmd/start'\nimport { version } from './extensions/version'\n\nexport default class RootCmd {\n constructor() {\n this.rootCmd = program\n .version(version)\n }\n\n run(args) {\n this.rootCmd.parse(args)\n }\n}\n\nif (!module.parent) {\n const cmd = new RootCmd()\n new StartCmd(cmd.rootCmd) //eslint-disable-line\n cmd.run(process.argv)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","module.exports = function(module) {\n\tif(!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tmodule.children = [];\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/module.js\n// module id = 3\n// module chunks = 0","module.exports = require(\"commander\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"commander\"\n// module id = 4\n// module chunks = 0","import config from 'config'\nimport MarathonApp from '../api/app'\n\nexport default class StartCmd {\n constructor(rootCmd) {\n rootCmd\n .command('start')\n .description('Start API')\n .action(() => {\n const app = new MarathonApp(config)\n app.run()\n })\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/cmd/start.js","module.exports = require(\"config\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"config\"\n// module id = 6\n// module chunks = 0","import path from 'path'\nimport Koa from 'koa'\nimport _ from 'koa-route'\nimport Logger from '../extensions/logger'\nimport HealthcheckHandler from './handlers/healthcheck'\nimport { connect as redisConnect } from '../extensions/redis'\nimport { connect as pgConnect } from '../extensions/postgresql'\nimport { connect as kafkaClientConnect } from '../extensions/kafkaClient'\nimport { connect as kafkaProducerConnect } from '../extensions/kafkaProducer'\n\n\nexport default class MarathonApp {\n constructor(config) {\n this.config = config\n this.allowedMethods = ['get', 'post', 'put', 'delete']\n this.koaApp = new Koa()\n this.configureLogger()\n this.configureMiddleware()\n\n this.handlersPath = path.join(__dirname, '../api/handlers')\n this.handlers = this.getHandlers()\n this.redisConfig = config.get('app.services.redis')\n this.pgConfig = config.get('app.services.postgresql')\n }\n\n getHandlers() {\n const self = this\n const handlers = []\n\n // Include handlers here\n handlers.push(new HealthcheckHandler(self))\n\n return handlers\n }\n\n exit(err) {\n if (process.env.NODE_ENV === 'test') {\n throw err\n }\n this.logger.fatal({ err })\n process.exit(1)\n }\n\n configureLogger() {\n this.logger = new Logger(this.config).logger.child({\n source: 'app',\n })\n }\n\n async configureRedis() {\n const redisOptions = {\n db: this.redisConfig.db,\n shouldReconnect: this.redisConfig.shouldReconnect,\n password: this.redisConfig.password,\n }\n if (!redisOptions.password) delete redisOptions.password\n try {\n this.redisClient = await redisConnect(\n this.redisConfig.url,\n redisOptions,\n this.logger\n )\n } catch (err) {\n this.exit(err)\n }\n }\n\n async configurePostgreSQL() {\n try {\n this.db = await pgConnect(\n this.pgConfig.url,\n this.pgConfig.options,\n this.logger\n )\n } catch (err) {\n this.exit(err)\n }\n }\n\n async configureKafka() {\n try {\n this.logger.debug('Connecting API Kafka client...')\n const cfg = this.config.get('app.services.kafka.api.client')\n this.apiKafkaClient = await kafkaClientConnect(cfg.url, cfg.clientId, this.logger)\n\n this.logger.debug('Connecting API Kafka producer...')\n const producerCfg = this.config.get('app.services.kafka.api.producer')\n this.apiKafkaProducer = await kafkaProducerConnect(\n this.apiKafkaClient,\n producerCfg,\n this.logger\n )\n } catch (err) {\n this.exit(err)\n }\n }\n\n async initializeServices() {\n try {\n this.logger.debug('Starting redis configuration...')\n await this.configureRedis()\n this.logger.debug('Starting PostgreSQL configuration...')\n await this.configurePostgreSQL()\n this.logger.debug('Starting Kafka configuration...')\n await this.configureKafka()\n } catch (err) {\n this.exit(err)\n }\n }\n\n configureMiddleware() {\n this.koaApp.use(async (ctx, next) => {\n const start = new Date()\n await next()\n const ms = new Date() - start\n ctx.set('X-Response-Time', `${ms}ms`)\n })\n }\n\n async initializeApp() {\n await this.initializeServices()\n this.handlers.forEach((handler) => {\n this.allowedMethods.forEach((methodName) => {\n if (!handler[methodName]) {\n return\n }\n const handlerMethod = handler[methodName].bind(handler)\n const method = _[methodName]\n this.koaApp.use(\n method(handler.route, async (ctx) => {\n await handlerMethod(ctx)\n })\n )\n })\n })\n }\n\n async run() {\n const PORT = this.config.get('app.port')\n await this.initializeApp()\n\n this.logger.info(`Listening on port ${PORT}...`)\n this.koaApp.listen(PORT)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/api/app.js","module.exports = require(\"path\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"path\"\n// module id = 8\n// module chunks = 0","module.exports = require(\"koa\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"koa\"\n// module id = 9\n// module chunks = 0","module.exports = require(\"koa-route\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"koa-route\"\n// module id = 10\n// module chunks = 0","import bunyan from 'bunyan'\nimport version from '../extensions/version'\n\nexport default class Logger {\n constructor(config) {\n this.config = config\n this.logLevel = config.get('app.log.level')\n this.logToStdOut = this.config.get('app.log.logToStdOut')\n this.logToFile = this.config.get('app.log.logToFile')\n this.logFile = this.config.get('app.log.file')\n this.configureLogger()\n }\n\n getStreams() {\n const streams = []\n if (this.logToStdOut) {\n streams.push({\n stream: process.stdout,\n level: this.logLevel,\n })\n }\n if (this.logToFile) {\n streams.push({\n path: this.logFile,\n level: this.logLevel,\n })\n }\n return streams\n }\n\n configureLogger() {\n this.logger = bunyan.createLogger({\n name: this.config.get('app.name'),\n src: false,\n streams: this.getStreams(),\n serializers: { err: bunyan.stdSerializers.err },\n }).child({ version }, true)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/logger.js","module.exports = require(\"bunyan\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"bunyan\"\n// module id = 12\n// module chunks = 0","import pjson from '../../package.json'\n\nconst version = pjson.version\n\nexport default version\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/version.js","module.exports = {\n\t\"name\": \"marathon\",\n\t\"version\": \"0.1.0\",\n\t\"description\": \"Marathon push processing system\",\n\t\"main\": \"src/index.js\",\n\t\"scripts\": {\n\t\t\"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git@git.topfreegames.com:topfreegames/marathon.git\"\n\t},\n\t\"author\": \"TFG Co\",\n\t\"license\": \"ISC\",\n\t\"devDependencies\": {\n\t\t\"babel-cli\": \"^6.16.0\",\n\t\t\"babel-core\": \"^6.17.0\",\n\t\t\"babel-istanbul\": \"^0.11.0\",\n\t\t\"babel-loader\": \"^6.2.5\",\n\t\t\"babel-plugin-syntax-async-functions\": \"^6.13.0\",\n\t\t\"babel-plugin-transform-async-to-generator\": \"^6.16.0\",\n\t\t\"babel-plugin-transform-regenerator\": \"^6.16.1\",\n\t\t\"babel-plugin-transform-runtime\": \"^6.15.0\",\n\t\t\"babel-polyfill\": \"^6.16.0\",\n\t\t\"babel-preset-es2015\": \"^6.16.0\",\n\t\t\"babel-register\": \"^6.16.3\",\n\t\t\"chai\": \"^3.5.0\",\n\t\t\"chai-http\": \"^3.0.0\",\n\t\t\"coveralls\": \"^2.11.14\",\n\t\t\"dirty-chai\": \"^1.2.2\",\n\t\t\"eslint\": \"^3.9.1\",\n\t\t\"eslint-config-airbnb-base\": \"^8.0.0\",\n\t\t\"eslint-plugin-import\": \"^1.16.0\",\n\t\t\"flow-bin\": \"^0.34.0\",\n\t\t\"graceful-fs\": \"^4.1.10\",\n\t\t\"istanbul\": \"^0.4.5\",\n\t\t\"mocha\": \"^3.1.2\",\n\t\t\"mocha-lcov-reporter\": \"^1.2.0\",\n\t\t\"plato\": \"^1.7.0\",\n\t\t\"stylish\": \"^1.0.0\",\n\t\t\"stylus\": \"^0.54.5\",\n\t\t\"supertest\": \"^2.0.0\",\n\t\t\"supertest-as-promised\": \"^4.0.0\",\n\t\t\"uuid\": \"^2.0.3\",\n\t\t\"webpack\": \"^1.13.2\"\n\t},\n\t\"dependencies\": {\n\t\t\"babel-runtime\": \"^6.11.6\",\n\t\t\"bluebird\": \"^3.4.6\",\n\t\t\"bufferutil\": \"^1.2.1\",\n\t\t\"bunyan\": \"^1.8.1\",\n\t\t\"commander\": \"^2.9.0\",\n\t\t\"config\": \"^1.21.0\",\n\t\t\"js-yaml\": \"^3.6.1\",\n\t\t\"json-loader\": \"^0.5.4\",\n\t\t\"kafka-node\": \"^1.0.5\",\n\t\t\"koa\": \"^2.0.0-alpha.7\",\n\t\t\"koa-route\": \"^3.2.0\",\n\t\t\"mongoose\": \"^4.6.5\",\n\t\t\"pg\": \"^6.1.0\",\n\t\t\"pg-hstore\": \"^2.3.2\",\n\t\t\"pg-native\": \"^1.10.0\",\n\t\t\"redis\": \"^2.6.2\",\n\t\t\"redis-info\": \"^3.0.6\",\n\t\t\"redlock\": \"^2.0.1\",\n\t\t\"sequelize\": \"^3.24.7\",\n\t\t\"utf-8-validate\": \"^1.2.1\",\n\t\t\"validator\": \"^6.0.0\"\n\t},\n\t\"bin\": {\n\t\t\"marathon\": \"./lib/marathon.js\"\n\t}\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./package.json\n// module id = 14\n// module chunks = 0","import { check as redisCheck } from '../../extensions/redis'\nimport { check as pgCheck } from '../../extensions/postgresql'\nimport { check as kafkaClientCheck } from '../../extensions/kafkaClient'\nimport { check as kafkaProducerCheck } from '../../extensions/kafkaProducer'\n\nexport default class HealthcheckHandler {\n constructor(app) {\n this.app = app\n this.route = '/healthcheck'\n this.resetServices()\n }\n\n resetServices() {\n this.services = {\n redis: { up: false },\n postgreSQL: { up: false },\n apiKafkaClient: { up: false },\n apiKafkaProducer: { up: false },\n }\n }\n\n hasFailed() {\n return (\n !this.services.redis.up ||\n !this.services.postgreSQL.up ||\n !this.services.apiKafkaClient.up ||\n !this.services.apiKafkaProducer.up\n )\n }\n\n async get(ctx) {\n this.services.redis = await redisCheck(this.app.redisClient)\n this.services.postgreSQL = await pgCheck(this.app.db)\n this.services.apiKafkaClient = await kafkaClientCheck(this.app.apiKafkaClient)\n this.services.apiKafkaProducer = await kafkaProducerCheck(this.app.apiKafkaProducer)\n ctx.body = JSON.stringify(this.services)\n\n if (this.hasFailed()) {\n ctx.status = 500\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/api/handlers/healthcheck.js","import redis from 'redis'\nimport bluebird from 'bluebird'\nimport parser from 'redis-info'\nimport Redlock from 'redlock'\n\nbluebird.promisifyAll(redis.RedisClient.prototype)\nbluebird.promisifyAll(redis.Multi.prototype)\n\nlet Lock = null\nexport const LockKey = 'lock::matchmaking'\nexport const LockTTL = 100\n\nexport async function check(redisClient) {\n const result = {\n up: false,\n error: null,\n uptime: null,\n connectedClients: null,\n blockedClients: null,\n usedMemory: null,\n totalSystemMemory: null,\n maxMemory: null,\n rejectedConnections: 0,\n cpuUsage: 0,\n }\n\n try {\n const res = await redisClient.infoAsync()\n if (res) {\n const info = parser.parse(res)\n result.up = true\n result.uptime = info.uptime_in_seconds\n result.connectedClients = info.connected_clients\n result.blockedClients = info.blocked_clients\n result.usedMemory = info.used_memory_human\n result.totalSystemMemory = info.total_system_memory_human\n result.maxMemory = info.maxmemory_human\n result.rejectedConnections = info.rejected_connections\n result.cpuUsage = info.used_cpu_user\n } else {\n result.error = 'Could not get server status!'\n }\n } catch (error) {\n result.error = error.message\n }\n\n return result\n}\n\nexport async function connect(redisUrl, options, logger) {\n const logr = logger.child({\n redisUrl,\n options,\n source: 'redis-extension',\n })\n logr.debug({ redisUrl, options }, 'connecting to redis...')\n if (!options.shouldReconnect) {\n options.retry_strategy = () => undefined\n }\n const redisClient = redis.createClient(redisUrl, options)\n\n const hasConnected = new Promise((resolve, reject) => {\n if (redisClient.ready) {\n resolve(redisClient)\n return\n }\n\n redisClient.on('ready', () => {\n logr.debug('Connection to redis has been established successfully.')\n resolve(redisClient)\n })\n\n redisClient.on('error', (err) => {\n logr.error({ err }, 'Redis error connecting.')\n reject(err)\n })\n\n redisClient.on('end', () => {\n logr.error('Redis connection closed.')\n reject(new Error('Redis connection closed.'))\n })\n })\n\n await hasConnected\n\n const result = await redisClient.pingAsync()\n if (!result) {\n throw new Error('Failed to get server status from redis.')\n }\n logr.info({ redisUrl }, 'Successfully connected to redis.')\n return redisClient\n}\n\nexport async function withCriticalSection(redisClient, f) {\n if (!Lock) {\n const options = { retryCount: 50, retryDelay: 10 }\n Lock = new Redlock([redisClient], options)\n }\n const rlock = await Lock.lock(LockKey, LockTTL)\n const res = await f()\n await rlock.unlock()\n return res\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/redis.js","module.exports = require(\"redis\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redis\"\n// module id = 17\n// module chunks = 0","module.exports = require(\"bluebird\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"bluebird\"\n// module id = 18\n// module chunks = 0","module.exports = require(\"redis-info\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redis-info\"\n// module id = 19\n// module chunks = 0","module.exports = require(\"redlock\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redlock\"\n// module id = 20\n// module chunks = 0","import Sequelize from 'sequelize'\nimport fs from 'fs'\nimport path from 'path'\n\nconst basename = path.join(path.resolve(__dirname, '../models'))\n\nexport async function check(db) {\n const result = {\n up: false,\n }\n\n try {\n const query = \"select * from pg_stat_activity where state='active';\"\n const deadlockQuery = 'SELECT blocked_locks.pid AS blocked_pid, ' +\n 'blocked_locks.virtualtransaction as blocked_transaction_id, ' +\n 'blocked_activity.usename AS blocked_user, ' +\n 'blocking_locks.pid AS blocking_pid, ' +\n 'blocking_locks.virtualtransaction as blocking_transaction_id, ' +\n 'blocking_activity.usename AS blocking_user, ' +\n 'blocked_activity.query AS blocked_statement, ' +\n 'blocking_activity.query AS blocking_statement ' +\n 'FROM pg_catalog.pg_locks blocked_locks ' +\n 'JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid ' +\n 'JOIN pg_catalog.pg_locks blocking_locks ' +\n 'ON blocking_locks.locktype = blocked_locks.locktype ' +\n 'AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE ' +\n 'AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation ' +\n 'AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page ' +\n 'AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple ' +\n 'AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid ' +\n 'AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid ' +\n 'AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid ' +\n 'AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid ' +\n 'AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid ' +\n 'AND blocking_locks.pid != blocked_locks.pid ' +\n 'JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid ' +\n 'WHERE NOT blocked_locks.GRANTED; '\n const res = await db.client.query(query, { type: Sequelize.QueryTypes.SELECT })\n if (res) {\n result.activeOperations = res.length\n const deadlock = await db.client.query(deadlockQuery, { type: Sequelize.QueryTypes.SELECT })\n result.deadlock = deadlock.length === 0\n result.deadlockOperations = []\n deadlock.forEach((row) => {\n result.deadlockOperations.push({\n blocked: {\n pid: row.blocked_pid,\n txId: row.blocked_transaction_id,\n user: row.blocked_user,\n statement: row.blocked_statement,\n },\n blocking: {\n pid: row.blocking_pid,\n txId: row.blocking_transaction_id,\n user: row.blocking_user,\n statement: row.blocking_statement,\n },\n })\n })\n result.up = true\n } else {\n result.error = 'Could not get server status!'\n }\n } catch (error) {\n result.error = error.message\n }\n\n return result\n}\n\nexport async function connect(pgUrl, options, logger) {\n let opt = options\n if (!options) {\n opt = {}\n }\n\n const logr = logger.child({\n pgUrl,\n options,\n source: 'postgresql-extension',\n })\n opt.dialect = 'postgres'\n\n logr.debug({ pgUrl, opt }, 'Connecting to PostgreSQL...')\n\n try {\n const db = {}\n const client = new Sequelize(pgUrl, opt)\n const query = 'select 1;'\n const res = await client.query(query, { type: Sequelize.QueryTypes.SELECT })\n if (!res) {\n const err = new Error('Failed to connect to PostgreSQL.')\n logr.error({ pgUrl, err }, err.message)\n throw err\n }\n\n logr.debug('Loading models...')\n fs.readdirSync(basename)\n .filter(file =>\n (file.indexOf('.') !== 0) &&\n (file !== basename) &&\n (file.slice(-3) === '.js') &&\n (file !== 'index.js')\n )\n .forEach((file) => {\n const modelPath = path.join(basename, file)\n logr.debug({ modelPath }, 'Loading model...')\n const model = client.import(modelPath)\n logr.debug({ modelPath }, 'Model loaded successfully.')\n db[model.name] = model\n })\n\n logr.debug('All models loaded successfully.')\n\n logr.debug('Loading model associations...')\n Object.keys(db).forEach((modelName) => {\n if (db[modelName].associate) {\n logr.debug({ modelName }, 'Loading model associations...')\n db[modelName].associate(db)\n logr.debug({ modelName }, 'Model associations loaded successfully.')\n }\n })\n\n db.client = client\n logger.info({ pgUrl }, 'Successfully connected to PostgreSQL.')\n return db\n } catch (err) {\n logger.error({ pgUrl, err }, 'Failed to connect to PostgreSQL.')\n throw err\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/postgresql.js","module.exports = require(\"sequelize\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"sequelize\"\n// module id = 22\n// module chunks = 0","module.exports = require(\"fs\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"fs\"\n// module id = 23\n// module chunks = 0","import { Client } from 'kafka-node'\n\nexport async function check(kafkaClient) {\n const result = {\n up: kafkaClient.ready,\n error: null,\n }\n\n return result\n}\n\nexport async function connect(url, clientId, logger) {\n const logr = logger.child({\n url,\n clientId,\n source: 'kafka-client-extension',\n })\n logr.debug('Connecting to Kafka...')\n const kafkaClient = new Client(url, clientId)\n const hasConnected = new Promise((resolve, reject) => {\n kafkaClient.on('ready', () => {\n logr.debug('Kafka is ready.')\n resolve(kafkaClient)\n })\n kafkaClient.on('error', (err) => {\n logr.error({ err }, 'Failed to connect to kafka.')\n reject(err)\n })\n })\n\n logr.debug('Waiting for connection...')\n await hasConnected\n\n logr.info('Successfully connected to kafka.')\n return kafkaClient\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/kafkaClient.js","module.exports = require(\"kafka-node\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"kafka-node\"\n// module id = 25\n// module chunks = 0","import kafka from 'kafka-node'\n\nexport async function check(producer) {\n const result = {\n up: false,\n error: null,\n }\n\n try {\n result.up = producer.ready\n } catch (error) {\n result.error = error.message\n }\n\n return result\n}\n\nexport async function connect(client, options, logger) {\n const logr = logger.child({\n source: 'kafka-producer-extension',\n options,\n })\n logr.debug('Connecting to kafka producer...')\n const producer = new kafka.Producer(client, options)\n\n const hasConnected = new Promise((resolve, reject) => {\n if (producer.ready) {\n logr.debug('Connection to Kafka producer has been established successfully.')\n resolve(producer)\n return\n }\n\n producer.on('ready', () => {\n logr.debug('Connection to Kafka producer has been established successfully.')\n resolve(producer)\n })\n producer.on('error', (err) => {\n logr.error({ err }, 'Connection to Kafka producer failed.')\n reject(err)\n })\n })\n\n await hasConnected\n\n logr.info('Successfully connected to Kafka producer.')\n return producer\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/kafkaProducer.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap c748c493ba2eccd82c8a","webpack:///external \"babel-polyfill\"","webpack:///./src/index.js","webpack:///(webpack)/buildin/module.js","webpack:///external \"commander\"","webpack:///./src/cmd/start.js","webpack:///external \"config\"","webpack:///./src/api/app.js","webpack:///external \"path\"","webpack:///external \"koa\"","webpack:///external \"koa-route\"","webpack:///./src/extensions/logger.js","webpack:///external \"bunyan\"","webpack:///./src/extensions/version.js","webpack:///./package.json","webpack:///./src/api/handlers/healthcheck.js","webpack:///./src/extensions/redis.js","webpack:///external \"redis\"","webpack:///external \"bluebird\"","webpack:///external \"redis-info\"","webpack:///external \"redlock\"","webpack:///./src/extensions/postgresql.js","webpack:///external \"sequelize\"","webpack:///./src/models/index.js","webpack:///./src/models/app.js","webpack:///./src/extensions/kafkaClient.js","webpack:///external \"kafka-node\"","webpack:///./src/extensions/kafkaProducer.js"],"names":["RootCmd","rootCmd","version","args","parse","module","parent","cmd","run","process","argv","StartCmd","command","description","action","app","MarathonApp","config","allowedMethods","koaApp","configureLogger","configureMiddleware","handlersPath","join","__dirname","handlers","getHandlers","redisConfig","get","pgConfig","self","push","err","env","NODE_ENV","logger","fatal","exit","child","source","redisOptions","db","shouldReconnect","password","url","redisClient","options","debug","cfg","clientId","apiKafkaClient","producerCfg","apiKafkaProducer","configureRedis","configurePostgreSQL","configureKafka","use","ctx","next","start","Date","ms","set","initializeServices","forEach","handler","methodName","handlerMethod","bind","method","route","PORT","initializeApp","info","listen","Logger","logLevel","logToStdOut","logToFile","logFile","streams","stream","stdout","level","path","createLogger","name","src","getStreams","serializers","stdSerializers","HealthcheckHandler","resetServices","services","redis","up","postgreSQL","body","JSON","stringify","hasFailed","status","result","error","uptime","connectedClients","blockedClients","usedMemory","totalSystemMemory","maxMemory","rejectedConnections","cpuUsage","infoAsync","res","uptime_in_seconds","connected_clients","blocked_clients","used_memory_human","total_system_memory_human","maxmemory_human","rejected_connections","used_cpu_user","message","check","redisUrl","logr","retry_strategy","undefined","createClient","hasConnected","Promise","resolve","reject","ready","on","Error","pingAsync","connect","f","Lock","retryCount","retryDelay","lock","LockKey","LockTTL","rlock","unlock","withCriticalSection","promisifyAll","RedisClient","prototype","Multi","query","deadlockQuery","client","type","QueryTypes","SELECT","activeOperations","length","deadlock","deadlockOperations","row","blocked","pid","blocked_pid","txId","blocked_transaction_id","user","blocked_user","statement","blocked_statement","blocking","blocking_pid","blocking_transaction_id","blocking_user","blocking_statement","pgUrl","opt","dialect","model","Object","keys","modelName","associate","models","Sequelize","require","exports","sequelize","define","key","STRING","allowNull","validate","len","bundleId","createdBy","timestamps","underscored","indexes","fields","unique","kafkaClient","producer","Producer"],"mappings":"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","file":"marathon.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c748c493ba2eccd82c8a","module.exports = require(\"babel-polyfill\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"babel-polyfill\"\n// module id = 1\n// module chunks = 0","import program from 'commander'\nimport StartCmd from './cmd/start'\nimport { version } from './extensions/version'\n\nexport default class RootCmd {\n constructor() {\n this.rootCmd = program\n .version(version)\n }\n\n run(args) {\n this.rootCmd.parse(args)\n }\n}\n\nif (!module.parent) {\n const cmd = new RootCmd()\n new StartCmd(cmd.rootCmd) //eslint-disable-line\n cmd.run(process.argv)\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","module.exports = function(module) {\n\tif(!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tmodule.children = [];\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/module.js\n// module id = 3\n// module chunks = 0","module.exports = require(\"commander\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"commander\"\n// module id = 4\n// module chunks = 0","import config from 'config'\nimport MarathonApp from '../api/app'\n\nexport default class StartCmd {\n constructor(rootCmd) {\n rootCmd\n .command('start')\n .description('Start API')\n .action(() => {\n const app = new MarathonApp(config)\n app.run()\n })\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/cmd/start.js","module.exports = require(\"config\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"config\"\n// module id = 6\n// module chunks = 0","import path from 'path'\nimport Koa from 'koa'\nimport _ from 'koa-route'\nimport Logger from '../extensions/logger'\nimport HealthcheckHandler from './handlers/healthcheck'\nimport { connect as redisConnect } from '../extensions/redis'\nimport { connect as pgConnect } from '../extensions/postgresql'\nimport { connect as kafkaClientConnect } from '../extensions/kafkaClient'\nimport { connect as kafkaProducerConnect } from '../extensions/kafkaProducer'\n\n\nexport default class MarathonApp {\n constructor(config) {\n this.config = config\n this.allowedMethods = ['get', 'post', 'put', 'delete']\n this.koaApp = new Koa()\n this.configureLogger()\n this.configureMiddleware()\n\n this.handlersPath = path.join(__dirname, '../api/handlers')\n this.handlers = this.getHandlers()\n this.redisConfig = config.get('app.services.redis')\n this.pgConfig = config.get('app.services.postgresql')\n }\n\n getHandlers() {\n const self = this\n const handlers = []\n\n // Include handlers here\n handlers.push(new HealthcheckHandler(self))\n\n return handlers\n }\n\n exit(err) {\n if (process.env.NODE_ENV === 'test') {\n throw err\n }\n this.logger.fatal({ err })\n process.exit(1)\n }\n\n configureLogger() {\n this.logger = new Logger(this.config).logger.child({\n source: 'app',\n })\n }\n\n async configureRedis() {\n const redisOptions = {\n db: this.redisConfig.db,\n shouldReconnect: this.redisConfig.shouldReconnect,\n password: this.redisConfig.password,\n }\n if (!redisOptions.password) delete redisOptions.password\n try {\n this.redisClient = await redisConnect(\n this.redisConfig.url,\n redisOptions,\n this.logger\n )\n } catch (err) {\n this.exit(err)\n }\n }\n\n async configurePostgreSQL() {\n try {\n this.db = await pgConnect(\n this.pgConfig.url,\n this.pgConfig.options,\n this.logger\n )\n } catch (err) {\n this.exit(err)\n }\n }\n\n async configureKafka() {\n try {\n this.logger.debug('Connecting API Kafka client...')\n const cfg = this.config.get('app.services.kafka.api.client')\n this.apiKafkaClient = await kafkaClientConnect(cfg.url, cfg.clientId, this.logger)\n\n this.logger.debug('Connecting API Kafka producer...')\n const producerCfg = this.config.get('app.services.kafka.api.producer')\n this.apiKafkaProducer = await kafkaProducerConnect(\n this.apiKafkaClient,\n producerCfg,\n this.logger\n )\n } catch (err) {\n this.exit(err)\n }\n }\n\n async initializeServices() {\n try {\n this.logger.debug('Starting redis configuration...')\n await this.configureRedis()\n this.logger.debug('Starting PostgreSQL configuration...')\n await this.configurePostgreSQL()\n this.logger.debug('Starting Kafka configuration...')\n await this.configureKafka()\n } catch (err) {\n this.exit(err)\n }\n }\n\n configureMiddleware() {\n this.koaApp.use(async (ctx, next) => {\n const start = new Date()\n await next()\n const ms = new Date() - start\n ctx.set('X-Response-Time', `${ms}ms`)\n })\n }\n\n async initializeApp() {\n await this.initializeServices()\n this.handlers.forEach((handler) => {\n this.allowedMethods.forEach((methodName) => {\n if (!handler[methodName]) {\n return\n }\n const handlerMethod = handler[methodName].bind(handler)\n const method = _[methodName]\n this.koaApp.use(\n method(handler.route, async (ctx) => {\n await handlerMethod(ctx)\n })\n )\n })\n })\n }\n\n async run() {\n const PORT = this.config.get('app.port')\n await this.initializeApp()\n\n this.logger.info(`Listening on port ${PORT}...`)\n this.koaApp.listen(PORT)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/api/app.js","module.exports = require(\"path\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"path\"\n// module id = 8\n// module chunks = 0","module.exports = require(\"koa\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"koa\"\n// module id = 9\n// module chunks = 0","module.exports = require(\"koa-route\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"koa-route\"\n// module id = 10\n// module chunks = 0","import bunyan from 'bunyan'\nimport version from '../extensions/version'\n\nexport default class Logger {\n constructor(config) {\n this.config = config\n this.logLevel = config.get('app.log.level')\n this.logToStdOut = this.config.get('app.log.logToStdOut')\n this.logToFile = this.config.get('app.log.logToFile')\n this.logFile = this.config.get('app.log.file')\n this.configureLogger()\n }\n\n getStreams() {\n const streams = []\n if (this.logToStdOut) {\n streams.push({\n stream: process.stdout,\n level: this.logLevel,\n })\n }\n if (this.logToFile) {\n streams.push({\n path: this.logFile,\n level: this.logLevel,\n })\n }\n return streams\n }\n\n configureLogger() {\n this.logger = bunyan.createLogger({\n name: this.config.get('app.name'),\n src: false,\n streams: this.getStreams(),\n serializers: { err: bunyan.stdSerializers.err },\n }).child({ version }, true)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/logger.js","module.exports = require(\"bunyan\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"bunyan\"\n// module id = 12\n// module chunks = 0","import pjson from '../../package.json'\n\nconst version = pjson.version\n\nexport default version\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/version.js","module.exports = {\n\t\"name\": \"marathon\",\n\t\"version\": \"0.1.0\",\n\t\"description\": \"Marathon push processing system\",\n\t\"main\": \"src/index.js\",\n\t\"scripts\": {\n\t\t\"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"git@git.topfreegames.com:topfreegames/marathon.git\"\n\t},\n\t\"author\": \"TFG Co\",\n\t\"license\": \"ISC\",\n\t\"devDependencies\": {\n\t\t\"babel-cli\": \"^6.16.0\",\n\t\t\"babel-core\": \"^6.17.0\",\n\t\t\"babel-istanbul\": \"^0.11.0\",\n\t\t\"babel-loader\": \"^6.2.5\",\n\t\t\"babel-plugin-syntax-async-functions\": \"^6.13.0\",\n\t\t\"babel-plugin-transform-async-to-generator\": \"^6.16.0\",\n\t\t\"babel-plugin-transform-regenerator\": \"^6.16.1\",\n\t\t\"babel-plugin-transform-runtime\": \"^6.15.0\",\n\t\t\"babel-polyfill\": \"^6.16.0\",\n\t\t\"babel-preset-es2015\": \"^6.16.0\",\n\t\t\"babel-register\": \"^6.16.3\",\n\t\t\"chai\": \"^3.5.0\",\n\t\t\"chai-http\": \"^3.0.0\",\n\t\t\"coveralls\": \"^2.11.14\",\n\t\t\"dirty-chai\": \"^1.2.2\",\n\t\t\"eslint\": \"^3.9.1\",\n\t\t\"eslint-config-airbnb-base\": \"^8.0.0\",\n\t\t\"eslint-plugin-import\": \"^1.16.0\",\n\t\t\"flow-bin\": \"^0.34.0\",\n\t\t\"graceful-fs\": \"^4.1.10\",\n\t\t\"istanbul\": \"^0.4.5\",\n\t\t\"mocha\": \"^3.1.2\",\n\t\t\"mocha-lcov-reporter\": \"^1.2.0\",\n\t\t\"plato\": \"^1.7.0\",\n\t\t\"stylish\": \"^1.0.0\",\n\t\t\"stylus\": \"^0.54.5\",\n\t\t\"supertest\": \"^2.0.0\",\n\t\t\"supertest-as-promised\": \"^4.0.0\",\n\t\t\"uuid\": \"^2.0.3\",\n\t\t\"webpack\": \"^1.13.2\"\n\t},\n\t\"dependencies\": {\n\t\t\"babel-runtime\": \"^6.11.6\",\n\t\t\"bluebird\": \"^3.4.6\",\n\t\t\"bufferutil\": \"^1.2.1\",\n\t\t\"bunyan\": \"^1.8.1\",\n\t\t\"commander\": \"^2.9.0\",\n\t\t\"config\": \"^1.21.0\",\n\t\t\"js-yaml\": \"^3.6.1\",\n\t\t\"json-loader\": \"^0.5.4\",\n\t\t\"kafka-node\": \"^1.0.5\",\n\t\t\"koa\": \"^2.0.0-alpha.7\",\n\t\t\"koa-route\": \"^3.2.0\",\n\t\t\"mongoose\": \"^4.6.5\",\n\t\t\"pg\": \"^6.1.0\",\n\t\t\"pg-hstore\": \"^2.3.2\",\n\t\t\"pg-native\": \"^1.10.0\",\n\t\t\"redis\": \"^2.6.2\",\n\t\t\"redis-info\": \"^3.0.6\",\n\t\t\"redlock\": \"^2.0.1\",\n\t\t\"sequelize\": \"^3.24.7\",\n\t\t\"utf-8-validate\": \"^1.2.1\",\n\t\t\"validator\": \"^6.0.0\"\n\t},\n\t\"bin\": {\n\t\t\"marathon\": \"./lib/marathon.js\"\n\t}\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./package.json\n// module id = 14\n// module chunks = 0","import { check as redisCheck } from '../../extensions/redis'\nimport { check as pgCheck } from '../../extensions/postgresql'\nimport { check as kafkaClientCheck } from '../../extensions/kafkaClient'\nimport { check as kafkaProducerCheck } from '../../extensions/kafkaProducer'\n\nexport default class HealthcheckHandler {\n constructor(app) {\n this.app = app\n this.route = '/healthcheck'\n this.resetServices()\n }\n\n resetServices() {\n this.services = {\n redis: { up: false },\n postgreSQL: { up: false },\n apiKafkaClient: { up: false },\n apiKafkaProducer: { up: false },\n }\n }\n\n hasFailed() {\n return (\n !this.services.redis.up ||\n !this.services.postgreSQL.up ||\n !this.services.apiKafkaClient.up ||\n !this.services.apiKafkaProducer.up\n )\n }\n\n async get(ctx) {\n this.services.redis = await redisCheck(this.app.redisClient)\n this.services.postgreSQL = await pgCheck(this.app.db)\n this.services.apiKafkaClient = await kafkaClientCheck(this.app.apiKafkaClient)\n this.services.apiKafkaProducer = await kafkaProducerCheck(this.app.apiKafkaProducer)\n ctx.body = JSON.stringify(this.services)\n\n if (this.hasFailed()) {\n ctx.status = 500\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/api/handlers/healthcheck.js","import redis from 'redis'\nimport bluebird from 'bluebird'\nimport parser from 'redis-info'\nimport Redlock from 'redlock'\n\nbluebird.promisifyAll(redis.RedisClient.prototype)\nbluebird.promisifyAll(redis.Multi.prototype)\n\nlet Lock = null\nexport const LockKey = 'lock::matchmaking'\nexport const LockTTL = 100\n\nexport async function check(redisClient) {\n const result = {\n up: false,\n error: null,\n uptime: null,\n connectedClients: null,\n blockedClients: null,\n usedMemory: null,\n totalSystemMemory: null,\n maxMemory: null,\n rejectedConnections: 0,\n cpuUsage: 0,\n }\n\n try {\n const res = await redisClient.infoAsync()\n if (res) {\n const info = parser.parse(res)\n result.up = true\n result.uptime = info.uptime_in_seconds\n result.connectedClients = info.connected_clients\n result.blockedClients = info.blocked_clients\n result.usedMemory = info.used_memory_human\n result.totalSystemMemory = info.total_system_memory_human\n result.maxMemory = info.maxmemory_human\n result.rejectedConnections = info.rejected_connections\n result.cpuUsage = info.used_cpu_user\n } else {\n result.error = 'Could not get server status!'\n }\n } catch (error) {\n result.error = error.message\n }\n\n return result\n}\n\nexport async function connect(redisUrl, options, logger) {\n const logr = logger.child({\n redisUrl,\n options,\n source: 'redis-extension',\n })\n logr.debug({ redisUrl, options }, 'connecting to redis...')\n if (!options.shouldReconnect) {\n options.retry_strategy = () => undefined\n }\n const redisClient = redis.createClient(redisUrl, options)\n\n const hasConnected = new Promise((resolve, reject) => {\n if (redisClient.ready) {\n resolve(redisClient)\n return\n }\n\n redisClient.on('ready', () => {\n logr.debug('Connection to redis has been established successfully.')\n resolve(redisClient)\n })\n\n redisClient.on('error', (err) => {\n logr.error({ err }, 'Redis error connecting.')\n reject(err)\n })\n\n redisClient.on('end', () => {\n logr.error('Redis connection closed.')\n reject(new Error('Redis connection closed.'))\n })\n })\n\n await hasConnected\n\n const result = await redisClient.pingAsync()\n if (!result) {\n throw new Error('Failed to get server status from redis.')\n }\n logr.info({ redisUrl }, 'Successfully connected to redis.')\n return redisClient\n}\n\nexport async function withCriticalSection(redisClient, f) {\n if (!Lock) {\n const options = { retryCount: 50, retryDelay: 10 }\n Lock = new Redlock([redisClient], options)\n }\n const rlock = await Lock.lock(LockKey, LockTTL)\n const res = await f()\n await rlock.unlock()\n return res\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/redis.js","module.exports = require(\"redis\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redis\"\n// module id = 17\n// module chunks = 0","module.exports = require(\"bluebird\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"bluebird\"\n// module id = 18\n// module chunks = 0","module.exports = require(\"redis-info\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redis-info\"\n// module id = 19\n// module chunks = 0","module.exports = require(\"redlock\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"redlock\"\n// module id = 20\n// module chunks = 0","import Sequelize from 'sequelize'\nimport models from '../models/index'\n\nexport async function check(db) {\n const result = {\n up: false,\n }\n\n try {\n const query = \"select * from pg_stat_activity where state='active';\"\n const deadlockQuery = 'SELECT blocked_locks.pid AS blocked_pid, ' +\n 'blocked_locks.virtualtransaction as blocked_transaction_id, ' +\n 'blocked_activity.usename AS blocked_user, ' +\n 'blocking_locks.pid AS blocking_pid, ' +\n 'blocking_locks.virtualtransaction as blocking_transaction_id, ' +\n 'blocking_activity.usename AS blocking_user, ' +\n 'blocked_activity.query AS blocked_statement, ' +\n 'blocking_activity.query AS blocking_statement ' +\n 'FROM pg_catalog.pg_locks blocked_locks ' +\n 'JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid ' +\n 'JOIN pg_catalog.pg_locks blocking_locks ' +\n 'ON blocking_locks.locktype = blocked_locks.locktype ' +\n 'AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE ' +\n 'AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation ' +\n 'AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page ' +\n 'AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple ' +\n 'AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid ' +\n 'AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid ' +\n 'AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid ' +\n 'AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid ' +\n 'AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid ' +\n 'AND blocking_locks.pid != blocked_locks.pid ' +\n 'JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid ' +\n 'WHERE NOT blocked_locks.GRANTED; '\n const res = await db.client.query(query, { type: Sequelize.QueryTypes.SELECT })\n if (res) {\n result.activeOperations = res.length\n const deadlock = await db.client.query(deadlockQuery, { type: Sequelize.QueryTypes.SELECT })\n result.deadlock = deadlock.length === 0\n result.deadlockOperations = []\n deadlock.forEach((row) => {\n result.deadlockOperations.push({\n blocked: {\n pid: row.blocked_pid,\n txId: row.blocked_transaction_id,\n user: row.blocked_user,\n statement: row.blocked_statement,\n },\n blocking: {\n pid: row.blocking_pid,\n txId: row.blocking_transaction_id,\n user: row.blocking_user,\n statement: row.blocking_statement,\n },\n })\n })\n result.up = true\n } else {\n result.error = 'Could not get server status!'\n }\n } catch (error) {\n result.error = error.message\n }\n\n return result\n}\n\nexport async function connect(pgUrl, options, logger) {\n let opt = options\n if (!options) {\n opt = {}\n }\n\n const logr = logger.child({\n pgUrl,\n options,\n source: 'postgresql-extension',\n })\n opt.dialect = 'postgres'\n\n logr.debug({ pgUrl, opt }, 'Connecting to PostgreSQL...')\n\n try {\n const db = {}\n const client = new Sequelize(pgUrl, opt)\n const query = 'select 1;'\n const res = await client.query(query, { type: Sequelize.QueryTypes.SELECT })\n if (!res) {\n const err = new Error('Failed to connect to PostgreSQL.')\n logr.error({ pgUrl, err }, err.message)\n throw err\n }\n\n logr.debug('Loading models...')\n models.forEach((model) => {\n db[model.name] = model\n logr.debug({ model: model.name }, 'Model loaded successfully.')\n })\n\n logr.debug('All models loaded successfully.')\n\n logr.debug('Loading model associations...')\n Object.keys(db).forEach((modelName) => {\n if (db[modelName].associate) {\n logr.debug({ modelName }, 'Loading model associations...')\n db[modelName].associate(db)\n logr.debug({ modelName }, 'Model associations loaded successfully.')\n }\n })\n\n db.client = client\n logger.info({ pgUrl }, 'Successfully connected to PostgreSQL.')\n return db\n } catch (err) {\n logger.error({ pgUrl, err }, 'Failed to connect to PostgreSQL.')\n throw err\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/postgresql.js","module.exports = require(\"sequelize\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"sequelize\"\n// module id = 22\n// module chunks = 0","import App from './app'\n\nconst models = [\n App,\n]\nexport default models\n\n\n\n// WEBPACK FOOTER //\n// ./src/models/index.js","const Sequelize = require('sequelize')\n\nmodule.exports = sequelize => (\n sequelize.define('app', {\n key: {\n type: Sequelize.STRING,\n allowNull: false,\n validate: { len: [1, 255] },\n },\n bundleId: {\n type: Sequelize.STRING,\n allowNull: false,\n validate: { len: [1, 2000] },\n },\n createdBy: {\n type: Sequelize.STRING,\n allowNull: false,\n validate: { len: [1, 2000] },\n },\n }, {\n timestamps: true,\n underscored: true,\n indexes: [\n { fields: ['key'], unique: true },\n ],\n })\n)\n\n\n\n// WEBPACK FOOTER //\n// ./src/models/app.js","import { Client } from 'kafka-node'\n\nexport async function check(kafkaClient) {\n const result = {\n up: kafkaClient.ready,\n error: null,\n }\n\n return result\n}\n\nexport async function connect(url, clientId, logger) {\n const logr = logger.child({\n url,\n clientId,\n source: 'kafka-client-extension',\n })\n logr.debug('Connecting to Kafka...')\n const kafkaClient = new Client(url, clientId)\n const hasConnected = new Promise((resolve, reject) => {\n kafkaClient.on('ready', () => {\n logr.debug('Kafka is ready.')\n resolve(kafkaClient)\n })\n kafkaClient.on('error', (err) => {\n logr.error({ err }, 'Failed to connect to kafka.')\n reject(err)\n })\n })\n\n logr.debug('Waiting for connection...')\n await hasConnected\n\n logr.info('Successfully connected to kafka.')\n return kafkaClient\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/kafkaClient.js","module.exports = require(\"kafka-node\");\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"kafka-node\"\n// module id = 26\n// module chunks = 0","import kafka from 'kafka-node'\n\nexport async function check(producer) {\n const result = {\n up: false,\n error: null,\n }\n\n try {\n result.up = producer.ready\n } catch (error) {\n result.error = error.message\n }\n\n return result\n}\n\nexport async function connect(client, options, logger) {\n const logr = logger.child({\n source: 'kafka-producer-extension',\n options,\n })\n logr.debug('Connecting to kafka producer...')\n const producer = new kafka.Producer(client, options)\n\n const hasConnected = new Promise((resolve, reject) => {\n if (producer.ready) {\n logr.debug('Connection to Kafka producer has been established successfully.')\n resolve(producer)\n return\n }\n\n producer.on('ready', () => {\n logr.debug('Connection to Kafka producer has been established successfully.')\n resolve(producer)\n })\n producer.on('error', (err) => {\n logr.error({ err }, 'Connection to Kafka producer failed.')\n reject(err)\n })\n })\n\n await hasConnected\n\n logr.info('Successfully connected to Kafka producer.')\n return producer\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/kafkaProducer.js"],"sourceRoot":""} \ No newline at end of file