Update Files
This commit is contained in:
71
Kha/Tools/khamake/Data/node/server.js
Normal file
71
Kha/Tools/khamake/Data/node/server.js
Normal file
@ -0,0 +1,71 @@
|
||||
const port = 6789;
|
||||
const playersPerSession = 2;
|
||||
|
||||
const child_process = require('child_process');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
if (!fs.existsSync('node_modules')) {
|
||||
console.log('Please run npm install.')
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const express = require('express');
|
||||
app = express();
|
||||
require('express-ws')(app);
|
||||
|
||||
if (!fs.existsSync(path.join('..', 'html5'))) {
|
||||
console.log('Please compile for html5 before running the server.');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
app.use('/', express.static('../html5'));
|
||||
|
||||
app.use((err, req, res, next) => {
|
||||
console.error(err.stack);
|
||||
});
|
||||
|
||||
class Session {
|
||||
constructor() {
|
||||
this.clients = [];
|
||||
this.instance = child_process.fork('./kha.js');
|
||||
this.instance.on('message', (message) => {
|
||||
this.clients[message.id].send(Buffer.from(message.data));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let sessions = [];
|
||||
let pendingSession = new Session();
|
||||
|
||||
app.ws('/', (socket, req) => {
|
||||
console.log('Client connected.');
|
||||
|
||||
socket.session = pendingSession;
|
||||
socket.id = socket.session.clients.length;
|
||||
socket.session.clients.push(socket);
|
||||
socket.session.instance.send({message: 'connect', id: socket.id});
|
||||
|
||||
socket.on('message', function (message) {
|
||||
socket.session.instance.send({message: 'message', data: message, id: socket.id});
|
||||
});
|
||||
|
||||
socket.onclose = () => {
|
||||
console.log('Removing client ' + socket.id + '.');
|
||||
socket.session.instance.send({message: 'disconnect', id: socket.id});
|
||||
socket.session.clients.remove(socket);
|
||||
if (socket.session.clients.length === 0) {
|
||||
socket.session.instance.kill();
|
||||
sessions.remove(socket.session);
|
||||
}
|
||||
};
|
||||
|
||||
if (pendingSession.clients.length === playersPerSession) {
|
||||
console.log('Starting session.');
|
||||
sessions.push(pendingSession);
|
||||
pendingSession = new Session();
|
||||
}
|
||||
});
|
||||
|
||||
console.log('Starting server at ' + port + '.');
|
||||
app.listen(port);
|
Reference in New Issue
Block a user