const express = require('express') const bodyParser = require('body-parser') const path = require('path') const fs = require('fs') const fsPromises = fs.promises const app = express() require('express-async-errors') let apps = process.env.APPS ? JSON.parse(process.env.APPS) : ['highlight-termbin', 'dyndns', 'tempfiles'] let sock = process.env.SOCKET || '/tmp/serve-lunasqu.ee.t.sock' app.enable('trust proxy', 1) app.disable('x-powered-by') app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) function requireNoCache (file) { let fullPath = path.resolve(file) let data = require(fullPath) if (require.cache && require.cache[fullPath]) { delete require.cache[fullPath] } return data } async function enableApp (name) { let papp = path.join(__dirname, 'applications', name) await fsPromises.access(papp, fs.constants.F_OK) let runner = requireNoCache(papp) if (!runner) throw new Error('No such application.') let router = await runner() app.use('/' + name, router) } async function init () { for (let i in apps) { let papp = apps[i] try { await enableApp(papp) console.log(' =>', papp, 'was enabled successfully.') } catch (e) { console.error('Failed to start application', papp) console.error(e.stack) } } try { await fsPromises.unlink(sock) } catch (e) {} app.use(function (err, req, res, next) { console.error(err) res.status(500).end(err.message) }) app.listen(sock, function () { console.log('Started server on', sock) }) try { await fsPromises.access(sock, fs.constants.F_OK) await fsPromises.chmod(sock, 0o777) } catch (e) {} } module.exports = init