72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 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); |