Skip to content
Snippets Groups Projects
Select Git revision
  • a9f44745718b49f4cae4068a6ccc1e09cb810390
  • master default
  • feat/pull_changes
3 results

socket.js

Blame
  • socket.js 1.88 KiB
    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) => {
      if (version && version !== newVersion) {
        console.log('Update code');
        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) => {
          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));
      });
    };