import { router as analyticUnitsRouter } from './routes/analytic_units_router'; import { router as segmentsRouter } from './routes/segments_router'; import { router as dataRouter } from './routes/data_router'; import { router as detectionsRouter } from './routes/detections_router'; import { router as panelRouter } from './routes/panel_router'; import * as AnalyticsController from './controllers/analytics_controller'; import * as ProcessService from './services/process_service'; import { HASTIC_PORT, PACKAGE_VERSION, GIT_INFO, HASTIC_INSTANCE_NAME } from './config'; import { applyDBMigrations } from './services/data_service/migrations'; import * as Koa from 'koa'; import * as Router from 'koa-router'; import * as bodyParser from 'koa-bodyparser'; import { createServer } from 'http'; init(); async function init() { await applyDBMigrations(); const app = new Koa(); let httpServer = createServer(app.callback()); AnalyticsController.init(); ProcessService.registerExitHandler(AnalyticsController.terminate); app.on('error', (err, ctx) => { console.log('got server error:'); console.log(err); }); app.use(bodyParser()); app.use(async function(ctx, next) { ctx.set('Access-Control-Allow-Origin', '*'); ctx.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS'); ctx.set('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); await next(); }); app.use(async function(ctx, next) { try { await next(); } catch (e) { console.error(e); ctx.response.status = 500; ctx.response.body = { code: 500, message: `${ctx.method} ${ctx.url} error: ${e.message}` }; } }); const rootRouter = new Router(); rootRouter.use('/analyticUnits', analyticUnitsRouter.routes(), analyticUnitsRouter.allowedMethods()); rootRouter.use('/segments', segmentsRouter.routes(), segmentsRouter.allowedMethods()); rootRouter.use('/query', dataRouter.routes(), dataRouter.allowedMethods()); rootRouter.use('/detections', detectionsRouter.routes(), detectionsRouter.allowedMethods()); rootRouter.use('/panels', panelRouter.routes(), panelRouter.allowedMethods()); rootRouter.get('/', async (ctx) => { const activeWebhooks = await AnalyticsController.getActiveWebhooks(); ctx.response.body = { server: 'OK', analytics: { ready: AnalyticsController.isAnalyticReady(), lastAlive: AnalyticsController.analyticsLastAlive(), tasksQueueLength: AnalyticsController.getQueueLength() }, instanceName: HASTIC_INSTANCE_NAME, awaitedTasksNumber: AnalyticsController.getTaskResolversLength(), detectionsCount: AnalyticsController.getDetectionsCount(), nodeVersion: process.version, packageVersion: PACKAGE_VERSION, npmUserAgent: process.env.npm_config_user_agent, docker: process.env.INSIDE_DOCKER !== undefined, serverPort: HASTIC_PORT, git: GIT_INFO, activeWebhooks: activeWebhooks.length, timestamp: new Date(Date.now()) }; }); app .use(rootRouter.routes()) .use(rootRouter.allowedMethods()); httpServer.listen({ port: HASTIC_PORT, exclusive: true }, () => { console.log(`Server is running on :${HASTIC_PORT}`); }); httpServer.on('error', (err) => { console.error(`Http server error: ${err.message}`) }); ProcessService.registerExitHandler(() => { httpServer.close(); }); }