#!/usr/bin/env node require('nocamel'); const Logger = require('logplease'); const express = require('express'); const globals = require('./globals'); const config = require('./config'); const path = require('path'); const fs = require('fs/promises'); const fss = require('fs'); const body_parser = require('body-parser'); const runtime = require('./runtime'); const logger = Logger.create('index'); const app = express(); (async () => { logger.info('Setting loglevel to',config.log_level); Logger.setLogLevel(config.log_level); logger.debug('Ensuring data directories exist'); Object.values(globals.data_directories).for_each(dir => { let data_path = path.join(config.data_directory, dir); logger.debug(`Ensuring ${data_path} exists`); if (!fss.exists_sync(data_path)) { logger.info(`${data_path} does not exist.. Creating..`); try { fss.mkdir_sync(data_path); } catch(e) { logger.error(`Failed to create ${data_path}: `, e.message); } } }); logger.info('Loading packages'); const pkgdir = path.join(config.data_directory,globals.data_directories.packages); const pkglist = await fs.readdir(pkgdir); const languages = await Promise.all( pkglist.map(lang=> fs.readdir(path.join(pkgdir,lang)) .then(x=>x.map(y=>path.join(pkgdir, lang, y))) )); const installed_languages = languages .flat() .filter(pkg => fss.exists_sync(path.join(pkg, globals.pkg_installed_file))); installed_languages.forEach(pkg => runtime.load_package(pkg)); logger.info('Starting API Server'); logger.debug('Constructing Express App'); logger.debug('Registering middleware'); app.use(body_parser.urlencoded({ extended: true })); app.use(body_parser.json()); app.use(function (err, req, res, next) { return res .status(400) .send({ stack: err.stack }) }) logger.debug('Registering Routes'); const api_v2 = require('./api/v2') app.use('/api/v1', api_v2); app.use('/api/v2', api_v2); app.use(function (req,res,next){ return res.status(404).send({message: 'Not Found'}); }); logger.debug('Calling app.listen'); const [ address, port ] = config.bind_address.split(':'); app.listen(port, address, () => { logger.info('API server started on', config.bind_address); }); })();