initial commit

This commit is contained in:
2022-06-28 13:02:50 +02:00
commit a4e6b655b7
16 changed files with 7870 additions and 0 deletions

92
server/SocketHandler.js Normal file
View File

@@ -0,0 +1,92 @@
import {tinyws} from "tinyws";
import { randomUUID } from 'crypto';
export default class SocketHandler {
constructor(path, args) {
this.path = path;
this.connections = {};
this.handlers = {
'join': [],
'leave': [],
'message': [],
};
this.pingInterval = null;
}
start(express) {
express.use(tinyws());
express.use(this.path, this._receiveRequest.bind(this));
this.pingInterval = setInterval(() => {
Object.values(this.connections).forEach(client => {
if (++client.failedPings > 3) {
this.terminateClient(client.id);
} else {
client.ws.ping();
}
});
}, 30000);
// this.pingInterval
}
stop() {
clearInterval(this.pingInterval);
}
broadcast(msg) {
Object.values(this.connections).forEach(client => {
client.ws.send(msg);
});
}
async _receiveRequest(req, res) {
if (req.ws) {
const ws = await req.ws()
return this._receiveWebsocket(req, res, ws);
} else {
// not handling HTTP
}
}
async _receiveWebsocket(req, res, ws) {
ws.id = randomUUID();
this.connections[ws.id] = {
ws: ws,
id: ws.id,
joined: new Date(),
failedPings: 0,
};
ws.on('close', () => {
this._fire('leave', ws);
delete this.connections[ws.id];
});
ws.on('message', (data, ...args) => {
this._fire('message', ws, data, ...args);
});
ws.on('pong', () => {
this.failedPings = 0;
});
this._fire('join', ws);
}
terminateClient(uuid) {
this.connections[uuid].ws.terminate();
delete this.connections[uuid];
}
on(event, callback) {
this.handlers[event].push(callback);
}
_fire(event, ...args) {
this.handlers[event].forEach(cb => cb(...args));
}
}