Skip to content

Commit 38f5d3b

Browse files
committed
Added WebSockets with funcionality to send messages from any module
1 parent 4510a70 commit 38f5d3b

File tree

7 files changed

+84
-21
lines changed

7 files changed

+84
-21
lines changed

Socket.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const WebSocket = require('ws');
2+
3+
class Socket {
4+
constructor(server) {
5+
this.webSocketServer = new WebSocket.Server({ server })
6+
7+
this.webSocketServer.on('listening', () => {
8+
console.log('socket listen');
9+
})
10+
11+
this.webSocketServer.on('connection', (webSocketClient) => {
12+
console.log('new connection');
13+
})
14+
}
15+
16+
send(msg) {
17+
this.webSocketServer.clients.forEach(client => client.send(msg));
18+
}
19+
}
20+
21+
module.exports = Socket;

Sockets.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Sockets {
2+
constructor() {
3+
this.sockets = [];
4+
}
5+
6+
registerSocket(name, socket) {
7+
this.sockets.push({ name, socket });
8+
}
9+
10+
getAllSockets() {
11+
return this.sockets;
12+
}
13+
14+
getSocket(name) {
15+
const socket = this.sockets.find(socket => socket.name === name);
16+
return socket;
17+
}
18+
}
19+
20+
module.exports = new Sockets();

api.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
const express = require('express');
2+
const errorHandler = require('./middleware/errorHandler');
3+
4+
const api = express();
5+
6+
api.get('/', (req, res) => {
7+
res.send('Server is working');
8+
})
9+
10+
// Body parser
11+
api.use(express.json());
12+
13+
// Link controllers with routes
14+
api.use('/api/apps', require('./routes/apps'));
15+
api.use('/api/config', require('./routes/config'));
16+
api.use('/api/weather', require('./routes/weather'));
17+
18+
// Custom error handler
19+
api.use(errorHandler);
20+
21+
module.exports = api;

package-lock.json

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
"express": "^4.17.1",
2121
"node-schedule": "^2.0.0",
2222
"sequelize": "^6.6.2",
23-
"sqlite3": "^5.0.2"
23+
"sqlite3": "^5.0.2",
24+
"ws": "^7.4.5"
2425
},
2526
"devDependencies": {
2627
"nodemon": "^2.0.7"

server.js

+13-20
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,23 @@
1-
const express = require('express');
1+
const http = require('http');
22
const { connectDB } = require('./db');
3-
const errorHandler = require('./middleware/errorHandler');
3+
const api = require('./api');
44
const jobs = require('./utils/jobs');
5-
const colors = require('colors');
6-
require('dotenv').config();
7-
8-
connectDB();
5+
const Socket = require('./Socket');
6+
const Sockets = require('./Sockets');
97

10-
const app = express();
8+
require('dotenv').config();
119
const PORT = process.env.PORT || 5005;
1210

13-
app.get('/', (req, res) => {
14-
res.send('Server is working');
15-
})
16-
17-
// Body parser
18-
app.use(express.json());
11+
connectDB();
1912

20-
// Link controllers with routes
21-
app.use('/api/apps', require('./routes/apps'));
22-
app.use('/api/config', require('./routes/config'));
23-
app.use('/api/weather', require('./routes/weather'));
13+
// Create server for Express API and WebSockets
14+
const server = http.createServer();
15+
server.on('request', api);
2416

25-
// Custom error handler
26-
app.use(errorHandler);
17+
// Register weatherSocket
18+
const weatherSocket = new Socket(server);
19+
Sockets.registerSocket('weather', weatherSocket);
2720

28-
app.listen(PORT, () => {
21+
server.listen(PORT, () => {
2922
console.log(`Server is running on port ${PORT} in ${process.env.NODE_ENV} mode`.yellow.bold);
3023
})

utils/jobs.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
const schedule = require('node-schedule');
22
const getExternalWeather = require('./getExternalWeather');
3+
const Sockets = require('../Sockets');
34

45
const weatherJob = schedule.scheduleJob('updateWeather', '0 */15 * * * *', async () => {
56
try {
67
await getExternalWeather();
78
console.log('weather updated');
9+
Sockets.getSocket('weather').socket.send('weather updated');
810
} catch (err) {
911
console.log(err);
1012
}

0 commit comments

Comments
 (0)