81 lines
1.9 KiB
JavaScript
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])
|
|
}));
|
|
}
|
|
}
|