1
0
mirror of synced 2025-02-21 15:19:29 +01:00
shadowtenpo/server.js
2022-02-21 16:31:55 -08:00

81 lines
1.9 KiB
JavaScript

const cfg = require('./config');
const ws = require('ws');
const enc = require('./ccencap');
var server = new ws.WebSocketServer({
port: cfg.server_port,
perMessageDeflate: false
});
var subnet = '192.168.139.';
var occupancy = [0, 0, 0, 0];
var suffixes = [11, 12, 13, 14];
var clients = {};
function allocateClient() {
var slot = -1;
for (var i = 0; i < occupancy.length; i++) {
if (!occupancy[i]) {
slot = i;
occupancy[slot] = 1;
break;
}
}
return slot;
}
server.on('connection', function(conn, req) {
var slot = allocateClient();
var realip = req.socket.remoteAddress;
if (slot < 0) {
console.log('Dropping ' + realip + ' due to no party vacancy');
conn.close();
return;
}
var suffix = suffixes[slot];
clients[suffix] = conn;
console.log("[Client #" + slot + "] Allocated. Welcome " + realip);
conn.on('message', function(data) {
var msg = enc.decode(data);
switch(msg.op) {
case 'party_hello':
sendMemberChange();
break;
case 'net_tcp':
case 'net_udp':
var dstconn = clients[msg.dst];
if (!dstconn) {
console.warn('Invalid dst: ' + msg.src + '->' + msg.dst);
} else {
dstconn.send(data);
}
break;
}
});
conn.on('close', function() {
console.log("[Client #" + slot + "] Dropped.");
delete clients[suffix];
occupancy[slot] = 0;
});
conn.on('error', function(e) {
console.log("[Client #" + slot + "] Error ", e);
conn.close();
delete clients[suffix];
occupancy[slot] = 0;
});
});
function sendMemberChange() {
// var members = suffixes.filter((suffix, slot) => occupancy[slot]);
// Pre-allocate all members on the client to prevent late joiner crash
var members = suffixes;
for (var i = 0; i < occupancy.length; i++) {
if (!occupancy[i]) continue;
clients[suffixes[i]].send(enc.encodePartyUpdate({
subnet: subnet,
suffix: suffixes[i],
members: members.filter(suffix => suffix != suffixes[i])
}));
}
}