diff --git a/api/server.mjs b/api/server.mjs index 88bb8ec..1eb8449 100644 --- a/api/server.mjs +++ b/api/server.mjs @@ -1,75 +1,75 @@ +import path from 'path' +import fs from 'fs/promises' import socket from 'socket.io-serveronly' -import nStatic from 'node-static' +import { Flaska, FileResponse } from 'flaska' import coremonitor from './core/coremonitor.mjs' import onConnection from './routerio.mjs' -export function run(http, port, ctx) { - let localUtil = new ctx.sc.Util(import.meta.url) - +export function run(http, port, orgCtx) { + let localUtil = new orgCtx.sc.Util(import.meta.url) const staticRoot = localUtil.getPathFromRoot('../public') - const fileServer = new nStatic.Server(staticRoot) - const server = http.createServer(function (req, res) { - const child = ctx.log.child({}) + const flaska = new Flaska({ + log: orgCtx.log, + }, http) - const d1 = new Date().getTime() - - let finishedRequest = false - var done = function () { - if (finishedRequest) return - finishedRequest = true - if (req.url === '/main.css.map') return - var requestTime = new Date().getTime() - d1 - - let level = 'debug' - if (res.statusCode >= 400) { - level = 'warn' - } - if (res.statusCode >= 500) { - level = 'error' - } - - let status = '' - if (res.statusCode >= 400) { - status = res.statusCode + ' ' - } - - child[level]({ - duration: requestTime, - status: res.statusCode, - }, `<-- ${status}${req.method} ${req.url}`) - } - - res.addListener('finish', done); - res.addListener('close', done); - - req.addListener('end', function () { - if (req.url === '/') { - res.writeHead(302, { Location: '/index.html' }) - return res.end() - } - - fileServer.serve(req, res, function (err) { - if (err) { - if (err.status !== 404) { - ctx.log.error(err, req.url); - } - - res.writeHead(err.status, err.headers); - res.end(err.message); - } - }); - }).resume() + flaska.before(function(ctx) { + ctx.state.started = new Date().getTime() }) - const io = new socket(server) - io.on('connection', onConnection.bind(this, io, ctx)) + flaska.onreqerror(function(err, ctx) { + if (ctx.aborted) { + flaska.log.info('Request aborted') + } else { + flaska.log.error(err) + } + }) - coremonitor(io, ctx) + flaska.after(function(ctx) { + let ended = new Date().getTime() + var requestTime = ended - ctx.state.started - return server.listenAsync(port) - .then(function() { - ctx.log.info('Server is listening on port ' + port) + let status = '' + let level = 'debug' + if (ctx.status >= 400) { + status = ctx.status + ' ' + level = 'warn' + } + if (ctx.status >= 500) { + level = 'error' + } + + ctx.log[level]({ + duration: requestTime, + status: ctx.status, + }, `<-- ${status}${ctx.method} ${ctx.url}`) + }) + + flaska.on404(function(ctx) { + let file = path.resolve(path.join(staticRoot, ctx.url === '/' ? 'index.html' : ctx.url)) + if (!file.startsWith(staticRoot)) { + ctx.status = 404 + ctx.body = 'HTTP 404 Error' + return + } + + return fs.stat(file).then(function(stat) { + if (!stat) { + ctx.status = 404 + ctx.body = 'HTTP 404 Error' + return + } + ctx.body = new FileResponse(file, stat) }) + }) + + return flaska.listenAsync(port).then(function() { + orgCtx.log.info('Server is listening on port ' + port) + + const io = new socket(flaska.server) + io.on('connection', onConnection.bind(this, io, orgCtx)) + + coremonitor(io, orgCtx) + }) } \ No newline at end of file diff --git a/package.json b/package.json index 3a6dc17..f502384 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "license": "WTFPL", "dependencies": { "flaska": "^1.2.1", - "node-static": "^0.7.11", "socket.io-serveronly": "^2.3.0" }, "devDependencies": {