jeansaad/hotel

View on GitHub
src/daemon/routers/api/events.js

Summary

Maintainability
A
0 mins
Test Coverage
const express = require("express");
const connectSSE = require("connect-sse");
const sse = connectSSE();

function listen(res, group, groupEvent, handler) {
  function removeListener() {
    // Remove group handler
    group.removeListener(groupEvent, handler);

    // Remove self
    res.removeListener("close", removeListener);
    res.removeListener("finish", removeListener);
  }

  group.on(groupEvent, handler);

  res.on("close", removeListener);
  res.on("finish", removeListener);
}

module.exports = group => {
  const router = express.Router();

  router.get("/", sse, (req, res) => {
    // Handler
    function sendState() {
      res.json(group.list());
    }

    // Bootstrap
    sendState();

    // Listen
    listen(res, group, "change", sendState);
  });

  router.get("/output", sse, (req, res) => {
    function sendOutput(id, data) {
      res.json({
        id,
        output: data.toString()
      });
    }

    // Bootstrap
    const list = group.list();
    Object.keys(list).forEach(id => {
      var mon = list[id];
      if (mon && mon.tail) {
        sendOutput(id, mon.tail);
      }
    });

    // Listen
    listen(res, group, "output", sendOutput);
  });

  return router;
};