Path: blob/main/tests/integration/playwright/multiplex-server/index.js
12922 views
let http = require("http");1let express = require("express");2let cors = require("cors");3let fs = require("fs");4let io = require("socket.io");5let crypto = require("crypto");67let app = express();8let staticDir = express.static;910app.use(cors()); // enable cors for all origins1112let server = http.createServer(app);1314let socketsIO = io(server, {15cors: {16origin: "*",17methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],18},19});2021let opts = {22port: process.env.PORT || 1948,23baseDir: process.cwd(),24};2526socketsIO.on("connection", (socket) => {27console.debug("Connection opened");28socket.on("multiplex-statechanged", (data) => {29if (30typeof data.secret == "undefined" ||31data.secret == null ||32data.secret === ""33)34return;35if (createHash(data.secret) === data.socketId) {36console.debug("Broadcasting state change");37data.secret = null;38socket.broadcast.emit(data.socketId, data);39} else {40console.warn("Secret and socketId do not match");41}42});43});4445app.use(express.static(opts.baseDir));4647app.get("/", (req, res) => {48res.writeHead(200, { "Content-Type": "text/html" });4950let stream = fs.createReadStream(opts.baseDir + "/index.html");51stream.on("error", (error) => {52res.write(53'<style>body{font-family: sans-serif;}</style><h2>reveal.js multiplex server.</h2><a href="/token">Generate token</a>'54);55res.end();56});57stream.on("open", () => {58stream.pipe(res);59});60});6162app.get("/token", (req, res) => {63let secret = crypto.randomBytes(16).toString("hex");64res.send({ secret: secret, socketId: createHash(secret) });65});6667let createHash = (secret) => {68let hash = crypto.createHash("sha256").update(secret);69return hash.digest("hex");70};7172// Open the listening port73server.listen(opts.port || null);7475console.log(`reveal.js: Multiplex running on port: ${opts.port}`);767778