-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathserver.js
More file actions
122 lines (107 loc) · 3.23 KB
/
server.js
File metadata and controls
122 lines (107 loc) · 3.23 KB
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
const express = require("express");
const app = express();
const server = require("http").Server(app);
const io = require("socket.io")(server);
const next = require("next");
const crypto = require("crypto");
const dev = process.env.NODE_ENV !== "production";
const nextApp = next({ dev });
const nextHandler = nextApp.getRequestHandler();
app.use(express.json()); // for parsing application/json
app.use(express.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
// fake DB
const messages = ["hellur!"];
const rooms = {};
// socket.io server
io.on("connection", (socket) => {
console.log("A user connected");
var userroom = "/";
socket.join(userroom);
socket.on("joinroom", (data) => {
socket.leave(userroom);
userroom = data.roomname;
if (!rooms[userroom]) {
console.log("Room does not exist, creating it");
console.log("Host is: ", socket.id);
var { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
modulusLength: 1024,
});
rooms[userroom] = {
users: [socket.id],
messages: [],
host: socket.id,
publicKey,
};
io.to(socket.id).emit("host", {
privateKey: privateKey.export({
type: "pkcs1",
format: "pem",
}),
publicKey: publicKey.export({
type: "pkcs1",
format: "pem",
}),
});
} else {
console.log("Room exists");
rooms[userroom].users.push(socket.id);
//Catch user up on messages
socket.emit("messages", { messages: rooms[userroom].messages });
}
socket.join(data.roomname, (err) =>
err ? console.log("Could not join room") : console.log("Success")
);
console.log("A user has joined room ", data.roomname);
console.log("Current room state", rooms);
});
socket.on("message", (data) => {
const encryptedMsg = crypto.publicEncrypt(
{
key: rooms[userroom].publicKey,
padding: crypto.constants.RSA_PKCS1_PADDING,
},
Buffer.from(data.message)
);
var newData = data;
newData.message = encryptedMsg.toString("base64");
rooms[userroom].messages.push(newData);
io.to(userroom).emit("messages", { messages: rooms[userroom].messages });
console.log("A message was received:", data);
});
socket.on("disconnect", () => {
if (!rooms[userroom]) {
return;
}
rooms[userroom]["users"] = rooms[userroom]["users"].filter(
(user) => user != socket.id
);
if (rooms[userroom]["users"].length == 0) {
delete rooms[userroom];
}
console.log("A user has left room ", userroom);
console.log("Current rooms state", rooms);
});
});
nextApp.prepare().then(() => {
app.get("/messages", (req, res) => {
io.emit("message", { text: "Test ping!" });
res.json(messages);
});
app.post("/genkey", (req, res) => {
var newkey = crypto.createPrivateKey(req.body.privateKey);
console.log("New private key created");
res.json({
privateKey: newkey.export({
type: "pkcs1",
format: "pem",
}),
});
});
app.get("*", (req, res) => {
return nextHandler(req, res);
});
server.listen(3000, (err) => {
if (err) throw err;
console.log("Listenin on port 3k");
});
});