diff --git a/.eslintrc.json b/.eslintrc.json index f02211f..6bc5934 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -11,6 +11,6 @@ }, "rules": {}, "ignorePatterns": [ - "src/assets/**/*" + "src/user/assets/**/*" ] } diff --git a/src/config.js b/config.js similarity index 64% rename from src/config.js rename to config.js index bb625f7..dcbc42a 100644 --- a/src/config.js +++ b/config.js @@ -1,5 +1,4 @@ module.exports = Object.freeze({ root: __dirname, - sessionSecret: process.env.SESSION_SECRET || 'secret', supportedVideoFormats: ['mp4', 'mkv', 'avi'], }); diff --git a/server.js b/server.js index e6a8445..8c65e80 100644 --- a/server.js +++ b/server.js @@ -1,14 +1,15 @@ -const {networkInterfaces} = require('os'); const path = require('path'); const yargs = require('yargs/yargs'); const {hideBin} = require('yargs/helpers'); require('dotenv').config(); -const userSettings = require(__dirname + '/src/user-settings'); -// const argv = parseArgs(process.argv.slice(2)); +global.__config = require(__dirname + '/config'); +const config = global.__config; -const nets = networkInterfaces(); +const settings = require(config.root + '/src/settings'); +const startServer = require(config.root + '/src/utility/startServer.js'); +// const argv = parseArgs(process.argv.slice(2)); const argv = yargs(hideBin(process.argv)) .scriptName('media-server') @@ -29,23 +30,37 @@ const argv = yargs(hideBin(process.argv)) type: 'number', description: 'the port to run server on', }); + yargs.option('gui', { + alias: 'g', + type: 'boolean', + description: 'open gui mode for configuring settings', + }); }) .alias('h', 'help') .version(false).argv; -Object.assign(userSettings, argv); -const app = require(path.join(__dirname, 'src', 'index.js')); +Object.assign(settings, argv); + +console.log(process.argv.slice(2).length && settings.location == undefined); +if (process.argv.slice(2).length === 0 && settings.location == undefined) { + argv.g = true; +} const PORT = argv.port || process.env.PORT || 3000; -app.listen(PORT, () => { - console.log('server is up'); - for (const name of Object.keys(nets)) { - for (const net of nets[name]) { - // skip over non-ipv4 and internal (i.e. 127.0.0.1) addresses - if (net.family === 'IPv4' && !net.internal) { - console.log('listening at http://' + net.address + ':' + PORT); - } - } - } -}); +if (argv.g) { + const admin = require(config.root + '/src/admin/index.js'); + const adminServer = admin.listen(parseInt(PORT) + 1, 'localhost', () => { + console.log('admin server is up'); + console.log( + 'listening at http://' + + adminServer.address().address + + ':' + + adminServer.address().port, + ); + }); + admin.on('close', () => {}); +} else { + const app = require(config.root + '/src/user/index.js'); + startServer(app, PORT); +} diff --git a/src/admin/admin-session-config.js b/src/admin/admin-session-config.js new file mode 100644 index 0000000..9c82918 --- /dev/null +++ b/src/admin/admin-session-config.js @@ -0,0 +1,3 @@ +module.exports = { + sessionSecret: process.env.ADMIN_SESSION_SECRET || 'secr3t', +}; diff --git a/src/admin/index.js b/src/admin/index.js new file mode 100644 index 0000000..d95ea7f --- /dev/null +++ b/src/admin/index.js @@ -0,0 +1,34 @@ +const config = global.__config; + +const express = require('express'); +const session = require('express-session'); +const startServer = require(config.root + '/src/utility/startServer'); +const FileStore = require('session-file-store')(session); + +const adminSessionConfig = require(config.root + + '/src/admin/admin-session-config'); + +const app = express(); + +app.use(express.json()); +app.use(express.urlencoded({extended: true})); +app.use( + session({ + secret: [adminSessionConfig.sessionSecret], + resave: false, + saveUninitialized: true, + cookie: { + maxAge: 30 * 24 * 60 * 60 * 1000, // milliseconds in 30 days + }, + store: new FileStore(), + }), +); + +app.get('/start', (req, res) => { + delete require.cache[require.resolve(config.root + '/src/user/index.js')]; + const app = require(config.root + '/src/user/index.js'); + startServer(app, adminSessionConfig.port); + res.send('Done'); +}); + +module.exports = app; diff --git a/src/routes/api/index.js b/src/routes/api/index.js deleted file mode 100644 index 5a338c6..0000000 --- a/src/routes/api/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const express = require('express'); -const root = require(__dirname + '/../../config').root; - -// eslint-disable-next-line new-cap -const router = express.Router(); - -router.use('/video', require(root + '/routes/api/video')); -router.use(require(root + '/routes/api/info')); - -module.exports = router; diff --git a/src/services/index.js b/src/services/index.js deleted file mode 100644 index faaab4a..0000000 --- a/src/services/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const root = require(__dirname + '/../config').root; -const customRequireDirectory = require(root + - '/utility/customRequireDirectory'); - -module.exports = customRequireDirectory(__dirname); diff --git a/src/user-settings.js b/src/settings.js similarity index 68% rename from src/user-settings.js rename to src/settings.js index 77bd4de..a892fd2 100644 --- a/src/user-settings.js +++ b/src/settings.js @@ -1,3 +1,4 @@ module.exports = { location: process.env.LOCATION, + port: process.env.PORT, }; diff --git a/src/assets/js/vtt.js b/src/user/assets/js/vtt.js similarity index 100% rename from src/assets/js/vtt.js rename to src/user/assets/js/vtt.js diff --git a/src/index.js b/src/user/index.js similarity index 57% rename from src/index.js rename to src/user/index.js index ffb6bac..99a8913 100644 --- a/src/index.js +++ b/src/user/index.js @@ -5,10 +5,12 @@ const mustacheExpress = require('mustache-express'); const FileStore = require('session-file-store')(session); const favicon = require('serve-favicon'); -const config = require(__dirname + '/config'); -const apiRouter = require(config.root + '/routes/api'); -const contentRouter = require(config.root + '/routes/content'); -const userSettings = require(config.root + '/user-settings'); +const config = global.__config; +const apiRouter = require(config.root + '/src/user/routes/api'); +const contentRouter = require(config.root + '/src/user/routes/content'); +const settings = require(config.root + '/src/settings'); +const userSessionConfig = require(config.root + + '/src/user/user-session-config'); const app = express(); @@ -20,7 +22,7 @@ app.use(express.json()); app.use(express.urlencoded({extended: true})); app.use( session({ - secret: [config.sessionSecret], + secret: [userSessionConfig.sessionSecret], resave: false, saveUninitialized: true, cookie: { @@ -30,19 +32,19 @@ app.use( }), ); -app.use(favicon(config.root + '/public/favicon.ico')); +app.use(favicon(config.root + '/src/user/public/favicon.ico')); app.get('/', (req, res) => { res.redirect('/content'); }); -if (userSettings.verbose == 1) morganBody(app, {logAllReqHeader: false}); -if (userSettings.verbose >= 2) morganBody(app, {logAllReqHeader: true}); +if (settings.verbose == 1) morganBody(app, {logAllReqHeader: false}); +if (settings.verbose >= 2) morganBody(app, {logAllReqHeader: true}); app.use('/api', apiRouter); app.use('/content', contentRouter); -const content = userSettings.location; +const content = settings.location; app.use('/public', express.static(content)); -app.use('/static', express.static(config.root + '/assets')); +app.use('/static', express.static(config.root + 'src/user/assets')); module.exports = app; diff --git a/src/public/favicon.ico b/src/user/public/favicon.ico similarity index 100% rename from src/public/favicon.ico rename to src/user/public/favicon.ico diff --git a/src/user/routes/api/index.js b/src/user/routes/api/index.js new file mode 100644 index 0000000..c7a81bf --- /dev/null +++ b/src/user/routes/api/index.js @@ -0,0 +1,11 @@ +const express = require('express'); +const config = global.__config; +const root = config.root; + +// eslint-disable-next-line new-cap +const router = express.Router(); + +router.use('/video', require(root + '/src/user/routes/api/video')); +router.use(require(root + '/src/user/routes/api/info')); + +module.exports = router; diff --git a/src/routes/api/info.js b/src/user/routes/api/info.js similarity index 100% rename from src/routes/api/info.js rename to src/user/routes/api/info.js diff --git a/src/routes/api/video.js b/src/user/routes/api/video.js similarity index 92% rename from src/routes/api/video.js rename to src/user/routes/api/video.js index 292d4be..69bf70f 100644 --- a/src/routes/api/video.js +++ b/src/user/routes/api/video.js @@ -1,8 +1,9 @@ const express = require('express'); const {StatusCodes} = require('http-status-codes'); -const root = require(__dirname + '/../../config').root; -const utility = require(root + '/utility'); +const config = global.__config; +const root = config.root; +const utility = require(root + '/src/utility'); // eslint-disable-next-line new-cap const router = express.Router(); diff --git a/src/routes/content.js b/src/user/routes/content.js similarity index 89% rename from src/routes/content.js rename to src/user/routes/content.js index 73b0b2d..c73c28b 100644 --- a/src/routes/content.js +++ b/src/user/routes/content.js @@ -4,14 +4,14 @@ const path = require('path'); const express = require('express'); const serveIndex = require('serve-index'); -const config = require(__dirname + '/../config'); -const services = require(config.root + '/services'); -const userSettings = require(config.root + '/user-settings'); +const config = global.__config; +const services = require(config.root + '/src/user/services'); +const settings = require(config.root + '/src/settings'); // eslint-disable-next-line new-cap const router = express.Router(); -const content = userSettings.location; +const content = settings.location; const supportedVideoFormatsReg = services.video.supportedVideoFormatsReg; router.get( diff --git a/src/user/services/index.js b/src/user/services/index.js new file mode 100644 index 0000000..bd1b769 --- /dev/null +++ b/src/user/services/index.js @@ -0,0 +1,6 @@ +const config = global.__config; +const root = config.root; +const customRequireDirectory = require(root + + '/src/utility/customRequireDirectory'); + +module.exports = customRequireDirectory(__dirname); diff --git a/src/services/video.js b/src/user/services/video.js similarity index 93% rename from src/services/video.js rename to src/user/services/video.js index 380d2b3..716c864 100644 --- a/src/services/video.js +++ b/src/user/services/video.js @@ -1,6 +1,6 @@ const fs = require('fs'); -const config = require(__dirname + '/../config'); +const config = global.__config; const supportedVideoFormatsReg = new RegExp( '\\.' + '(' + config.supportedVideoFormats.join('|') + ')' + '$', diff --git a/src/user/user-session-config.js b/src/user/user-session-config.js new file mode 100644 index 0000000..898366e --- /dev/null +++ b/src/user/user-session-config.js @@ -0,0 +1,3 @@ +module.exports = Object.freeze({ + sessionSecret: process.env.USER_SESSION_SECRET || 'secret', +}); diff --git a/src/views/displayDirectory.mustache b/src/user/views/displayDirectory.mustache similarity index 100% rename from src/views/displayDirectory.mustache rename to src/user/views/displayDirectory.mustache diff --git a/src/views/displayVideo.mustache b/src/user/views/displayVideo.mustache similarity index 100% rename from src/views/displayVideo.mustache rename to src/user/views/displayVideo.mustache diff --git a/src/utility/index.js b/src/utility/index.js index faaab4a..b18fbe7 100644 --- a/src/utility/index.js +++ b/src/utility/index.js @@ -1,5 +1,7 @@ -const root = require(__dirname + '/../config').root; +const config = global.__config; +const root = config.root; + const customRequireDirectory = require(root + - '/utility/customRequireDirectory'); + '/src/utility/customRequireDirectory'); module.exports = customRequireDirectory(__dirname); diff --git a/src/utility/request-util/index.js b/src/utility/request-util/index.js index d322c74..bd1b769 100644 --- a/src/utility/request-util/index.js +++ b/src/utility/request-util/index.js @@ -1,5 +1,6 @@ -const root = require(__dirname + '/../../config').root; +const config = global.__config; +const root = config.root; const customRequireDirectory = require(root + - '/utility/customRequireDirectory'); + '/src/utility/customRequireDirectory'); module.exports = customRequireDirectory(__dirname); diff --git a/src/utility/response-util/index.js b/src/utility/response-util/index.js index d322c74..bd1b769 100644 --- a/src/utility/response-util/index.js +++ b/src/utility/response-util/index.js @@ -1,5 +1,6 @@ -const root = require(__dirname + '/../../config').root; +const config = global.__config; +const root = config.root; const customRequireDirectory = require(root + - '/utility/customRequireDirectory'); + '/src/utility/customRequireDirectory'); module.exports = customRequireDirectory(__dirname); diff --git a/src/utility/startServer.js b/src/utility/startServer.js new file mode 100644 index 0000000..24b222f --- /dev/null +++ b/src/utility/startServer.js @@ -0,0 +1,15 @@ +module.exports = function(app, port) { + const {networkInterfaces} = require('os'); + const nets = networkInterfaces(); + app.listen(port, () => { + console.log('server is up'); + for (const name of Object.keys(nets)) { + for (const net of nets[name]) { + // skip over non-ipv4 and internal (i.e. 127.0.0.1) addresses + if (net.family === 'IPv4' && !net.internal) { + console.log('listening at http://' + net.address + ':' + port); + } + } + } + }); +};