-
Notifications
You must be signed in to change notification settings - Fork 1
/
app.js
120 lines (98 loc) · 3.03 KB
/
app.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/*
* Nova Trauben (C) 2019
*
* This file is part of QuiteLive.
* https://www.github.com/1fabunicorn/QuiteLive-API
*
* QuiteLive is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* QuiteLive is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with QuiteLive. If not, see <https://www.gnu.org/licenses/>.
*/
if (process.env.NODE_ENV !== "production") {
require("dotenv").config();
const fs = require("fs");
}
const Express = require("express");
const WebSocket = require("ws");
const chalk = require("chalk");
// clear redis db at startup
const Redis = require("redis");
const client = Redis.createClient(process.env.REDIS_URL); // creates a new client
client.on("connect", function() {
client.flushall("ASYNC", _ => {
console.log(chalk.white.bold("[Quite Live] flushed redis"));
client.quit();
});
});
const api = require("./routes/api");
const messageActor = require("./src/messageActor");
// for sending seed back and forth
const ClassMessageSender = require("./src/interClassMessageSender");
const app = Express();
const PORT = process.env.PORT || 5000;
const server = app.listen(PORT, () => {
console.log(
chalk.white.bold("[Quite Live] Server running on port: " + chalk.red(`${PORT}`))
);
console.log(chalk.white.bold(`[Quite Live] Exit app with SIGTERM (^C)`));
});
// Exit on SIGTERM - aka (^c)
// Add the public directory
app.use(Express.static("public"));
// Add API routes
app.use("/api", api);
// Streams
const wss = new WebSocket.Server({ server }, undefined);
const messageSender = new ClassMessageSender();
const messages = new messageActor(messageSender);
messages.Clients.initWallet();
wss.on("connection", (ws, req) => {
messages
.addMessage("connect", {
wsKey: req.headers["sec-websocket-key"],
wsData: ws,
clientTime: req.url
})
.catch(e => {
throw e;
});
ws.on("message", data => {
messages
.addMessage(data, {
key: req.headers["sec-websocket-key"]
})
.catch(e => {
throw e;
});
if (messageSender.hasMessage()) {
ws.send(messageSender.getMessage());
}
});
ws.on("close", client => {
// TODO: Remove client from connectedClients
messages.addMessage("leave", req.headers["sec-websocket-key"]).then(_ => {
console.log("client left!");
});
});
});
// backend message dealer
messages.dispatchMessages();
app.get("/stream", (req, res) => {
res.sendFile(__dirname + "/public/htmls/stream.html");
});
process.on("SIGTERM", () => {
console.log("here");
server.close(() => {
console.log("Process terminated");
});
});
//TODO: clear redis on startup