Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/tests/integration/playwright/multiplex-server/index.js
12922 views
1
let http = require("http");
2
let express = require("express");
3
let cors = require("cors");
4
let fs = require("fs");
5
let io = require("socket.io");
6
let crypto = require("crypto");
7
8
let app = express();
9
let staticDir = express.static;
10
11
app.use(cors()); // enable cors for all origins
12
13
let server = http.createServer(app);
14
15
let socketsIO = io(server, {
16
cors: {
17
origin: "*",
18
methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
19
},
20
});
21
22
let opts = {
23
port: process.env.PORT || 1948,
24
baseDir: process.cwd(),
25
};
26
27
socketsIO.on("connection", (socket) => {
28
console.debug("Connection opened");
29
socket.on("multiplex-statechanged", (data) => {
30
if (
31
typeof data.secret == "undefined" ||
32
data.secret == null ||
33
data.secret === ""
34
)
35
return;
36
if (createHash(data.secret) === data.socketId) {
37
console.debug("Broadcasting state change");
38
data.secret = null;
39
socket.broadcast.emit(data.socketId, data);
40
} else {
41
console.warn("Secret and socketId do not match");
42
}
43
});
44
});
45
46
app.use(express.static(opts.baseDir));
47
48
app.get("/", (req, res) => {
49
res.writeHead(200, { "Content-Type": "text/html" });
50
51
let stream = fs.createReadStream(opts.baseDir + "/index.html");
52
stream.on("error", (error) => {
53
res.write(
54
'<style>body{font-family: sans-serif;}</style><h2>reveal.js multiplex server.</h2><a href="/token">Generate token</a>'
55
);
56
res.end();
57
});
58
stream.on("open", () => {
59
stream.pipe(res);
60
});
61
});
62
63
app.get("/token", (req, res) => {
64
let secret = crypto.randomBytes(16).toString("hex");
65
res.send({ secret: secret, socketId: createHash(secret) });
66
});
67
68
let createHash = (secret) => {
69
let hash = crypto.createHash("sha256").update(secret);
70
return hash.digest("hex");
71
};
72
73
// Open the listening port
74
server.listen(opts.port || null);
75
76
console.log(`reveal.js: Multiplex running on port: ${opts.port}`);
77
78