-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathserver.js
102 lines (78 loc) · 2.48 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
if (process.env.NODE_ENV !== 'production') {
require('dotenv').config();
}
const appID = process.env.APP_ID
const appCertificate = process.env.APP_CERTIFICATE
const express = require('express')
const app = express()
const server = require("http").Server(app);
const io = require("socket.io")(server);
const { RtcTokenBuilder, RtcRole } = require('agora-access-token');
app.set("view engine", "ejs");
app.use(express.static("public"));
app.get("/", (req, res) => {
res.render("home", {});
});
app.get("/:room", (req, res) => {
res.render("room", {
roomId: req.params.room
});
});
app.get("/getToken/:channel", (req, res) => {
const channelName = req.params.channel;
const uid = getRandInteger(1, 230);
const role = RtcRole.PUBLISHER;
const expirationTimeInSeconds = 3600 * 24;
const currentTimestamp = Math.floor(Date.now() / 1000);
const privilegeExpiredTs = currentTimestamp + expirationTimeInSeconds;
const token = RtcTokenBuilder.buildTokenWithUid(appID, appCertificate, channelName, uid, role, privilegeExpiredTs);
res.json({
token: token,
uid: uid
});
})
io.on("connection", socket => {
socket.on("join-room", (roomId, userId) => {
socket.join(roomId);
socket.broadcast.to(roomId).emit("user-connected", userId);
socket.on("disconnect", () => {
socket.broadcast.to(roomId).emit("user-disconnected", userId);
})
socket.on("code-change", (delta) => {
socket.broadcast.to(roomId).emit("code-change", delta);
})
socket.on("code-output", (output) => {
socket.broadcast.to(roomId).emit("code-output", output);
})
socket.on("language-change", (language) => {
socket.broadcast.to(roomId).emit("language-change", language);
})
// live board related events
let clientSet = io.sockets.adapter.rooms.get(roomId)
let host
if (clientSet)
host = [...clientSet][0]
socket.join(roomId)
if (host)
socket.to(host).emit('send-state', socket.id)
socket.on("send-canvas-state", (user, data, undoStack, redoStack) => {
socket.to(user).emit("get-canvas-state", data, undoStack, redoStack)
})
socket.on("trigger-clear-canvas", roomId => {
socket.to(roomId).emit('clear-canvas')
})
socket.on("send-paint-path", paintObject => {
socket.to(roomId).emit("paint", paintObject)
})
socket.on("undo-triggered", () => {
socket.to(roomId).emit("undo")
})
socket.on("redo-triggered", () => {
socket.to(roomId).emit("redo")
})
})
})
server.listen(3000);
function getRandInteger(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
}