serve-lunasqu.ee/server.js

73 lines
1.7 KiB
JavaScript

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('Server error')
})
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