var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); var http = require('http'); require('dotenv').config(); const { DebugBuilder } = require("./utilities/debugBuilder"); const { checkIn } = require("./controllers/clientController"); var indexRouter = require('./routes/index'); var botRouter = require('./routes/bot'); var clientRouter = require('./routes/client'); var radioRouter = require('./routes/radio'); var { attachRadioSessionToRequest } = require('./controllers/radioController'); const log = new DebugBuilder("client", "app"); var app = express(); var port = process.env.CLIENT_PORT || '3010'; // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.set('port', port); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // Default route app.use('/', indexRouter); // Discord bot control route app.use('/bot', attachRadioSessionToRequest, botRouter); // Local client control route app.use("/client", clientRouter); // Local radio controller route app.use("/radio", attachRadioSessionToRequest, radioRouter); // catch 404 and forward to error handler app.use((req, res, next) => { next(createError(404)); }); // error handler app.use((err, req, res, next) => { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); /** * Start the HTTP background server */ async function runHTTPServer() { var server = http.createServer(app); server.listen(port); server.on('error', (error) => { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': log.ERROR(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': log.ERROR(bind + ' is already in use'); process.exit(1); break; default: throw error; } }); server.on('listening', () => { log.INFO("HTTP server started!"); }) } log.DEBUG(`Starting HTTP Server`); runHTTPServer(); log.DEBUG("Checking in with the master server") checkIn(true);