diff --git a/server/index.js b/server/index.js index c07cb55bcd97e902b911571c1802708a0010a648..70c1aa05ee2b48a3136897fbcf29bf0d4333577c 100644 --- a/server/index.js +++ b/server/index.js @@ -1,76 +1,35 @@ -const fetch = require('node-fetch'); +const http = require('http'); +const fs = require('fs'); const path = require('path'); +const socketIO = require('socket.io'); +const { port } = require('./config'); +const socket = require('./socket'); -const { - uuid, fontSize, rowHeight, port, api, -} = require('./config'); +const indexPath = path.resolve(__dirname, '../front/build/index.html'); -const io = require('socket.io')(port || 3000); -const { createSignedJWT, interval } = require('./utils'); - -const { spawn } = require('child_process'); - -const dummyResponse = require('./dummyResponse.json'); - -const useDummy = false; - -let version; - -const checkVersion = (newVersion) => { - console.log(version !== newVersion ? 'Update code' : ''); - if (version && version !== newVersion) { - const updateServer = spawn(path.resolve(__dirname, '../scripts/update_server.sh')); - updateServer.stdout.on('data', (data) => { - process.stdout.write(data); - }); - } - version = newVersion; -}; - -const doScreenApiRequest = (socket, userid = null) => { - const query = userid ? `?userid=${userid}` : ''; - return fetch(`${api.url}/${api.version}/screen/${uuid}${query}`, { - headers: { - Autorization: `Bearer ${createSignedJWT()}`, - }, - }) - .then(rawRes => rawRes.json()) - .then((res) => { - checkVersion(res.version); - socket.emit('panel_data', res); - return res.ttl; - }) - .catch(console.log); -}; - -const setChrono = (socket) => { - if (useDummy) { - return interval(() => socket.emit('panel_data', dummyResponse), 10000); +const server = (req, res) => { + let url = req.url.replace(/(^\/|\/$)/g, '').trim(); + if (url === '') { + url = 'index.html'; } - return interval(() => doScreenApiRequest(socket), 10000); -}; - -io.of('/').on('connection', (socket) => { - socket.emit('config', { fontSize, rowHeight }); - - const chrono = setChrono(socket); - chrono.startNow(); - - // Respond to date message with the date - socket.on('date', () => { - socket.emit('date', { date: Date.now() }); - }); - - socket.on('disconnect', () => { - chrono.stop(); + console.log(url); + const askedPath = path.resolve(__dirname, `../front/build/${url}`); + const filePath = fs.existsSync(askedPath) ? askedPath : indexPath; + fs.readFile(filePath, (err, data) => { + if (err) { + res.writeHead(500); + res.end('Error loading index.html'); + return; + } + + res.writeHead(200); + res.end(data); }); +}; - const badgeChild = spawn(path.resolve(__dirname, '../scripts/nfc-poll-wrapper.sh')); +const app = http.createServer(server); +app.listen(port || 3000); - badgeChild.stdout.on('data', (data0) => { - const userid = data0.toString().trim(); - console.log(`child stdout: ${userid}`); +const io = socketIO(app); - doScreenApiRequest(socket, userid).then(ttl => chrono.restart(ttl)); - }); -}); +io.of('/').on('connection', socket); diff --git a/server/socket.js b/server/socket.js new file mode 100644 index 0000000000000000000000000000000000000000..b9da6466b124993b0719a761e43a1c5915a8164c --- /dev/null +++ b/server/socket.js @@ -0,0 +1,75 @@ +const fetch = require('node-fetch'); +const path = require('path'); + +const { + uuid, fontSize, rowHeight, api, +} = require('./config'); + +const { spawn } = require('child_process'); + +const dummyResponse = require('./dummyResponse.json'); + +const { createSignedJWT, interval } = require('./utils'); + +const useDummy = false; + +let version; + +const checkVersion = (newVersion) => { + console.log(version !== newVersion ? 'Update code' : ''); + if (version && version !== newVersion) { + const updateServer = spawn(path.resolve(__dirname, '../scripts/update_server.sh')); + updateServer.stdout.on('data', (data) => { + process.stdout.write(data); + }); + } + version = newVersion; +}; + +const doScreenApiRequest = (socket, userid = null) => { + const query = userid ? `?userid=${userid}` : ''; + return fetch(`${api.url}/${api.version}/screen/${uuid}${query}`, { + headers: { + Autorization: `Bearer ${createSignedJWT()}`, + }, + }) + .then(rawRes => rawRes.json()) + .then(async (res) => { + await checkVersion(res.version); + socket.emit('panel_data', res); + return res.ttl; + }) + .catch(console.log); +}; + +const setChrono = (socket) => { + if (useDummy) { + return interval(() => socket.emit('panel_data', dummyResponse), 10000); + } + return interval(() => doScreenApiRequest(socket), 10000); +}; + +module.exports = (socket) => { + socket.emit('config', { fontSize, rowHeight }); + + const chrono = setChrono(socket); + chrono.startNow(); + + // Respond to date message with the date + socket.on('date', () => { + socket.emit('date', { date: Date.now() }); + }); + + socket.on('disconnect', () => { + chrono.stop(); + }); + + const badgeChild = spawn(path.resolve(__dirname, '../scripts/nfc-poll-wrapper.sh')); + + badgeChild.stdout.on('data', (data0) => { + const userid = data0.toString().trim(); + console.log(`child stdout: ${userid}`); + + doScreenApiRequest(socket, userid).then(ttl => chrono.restart(ttl)); + }); +};