webxoss-core/test.js

192 lines
4.6 KiB
JavaScript
Raw Normal View History

2016-10-23 07:56:45 +02:00
'use strict';
if (!global.window) {
global.Random = require("random-js");
require("./util.js");
require("./Callback.js");
require("./Game.js");
require("./Phase.js");
require("./IO.js");
require("./Player.js");
require("./Card.js");
require("./Zone.js");
require("./CardInfo.js");
require("./Timming.js");
require("./Mask.js");
require("./ConstEffect.js");
require("./ConstEffectManager.js");
require("./Effect.js");
require("./EffectManager.js");
require("./Client.js");
require("./Room.js");
require("./RoomManager.js");
}
var io;
if (global.window) {
io = {
on: function (name,handler) {
io._handler = handler;
},
use: function () {}
};
global.window.newClient = function () {
var win = window.open('./webxoss-client/?local=true');
win.addEventListener('load',function () {
var socket = new FakeSocket(win);
win.addEventListener('unload',function () {
socket._doEmit('disconnect');
});
win.document.title = 'Client' + socket.id;
io._handler(socket);
});
}
} else {
2017-03-05 07:14:50 +01:00
var noStaticServe = process.argv.slice(2).some(function (arg) {
return arg === 'no-static-server';
2017-03-05 07:14:50 +01:00
});
// static server
if (!noStaticServe) {
var express = require('express');
var compression = require('compression');
var app = express();
var server = require('http').Server(app);
app.use(compression());
app.use('/background',express.static(__dirname + '/webxoss-client/images',{
maxAge: '2h'
}));
app.use('/images',express.static(__dirname + '/webxoss-client/images',{
maxAge: '30d'
}));
app.use(express.static(__dirname + '/webxoss-client'));
var port = 80;
process.argv.slice(2).forEach(function (arg) {
var match = arg.match(/^port=(\d+)/)
if (match) {
port = +match[1];
}
});
server.listen(port);
}
// game server
2017-03-05 08:13:21 +01:00
var getArg = function (key) {
var value = '';
process.argv.slice(2).forEach(function (arg) {
if (arg.indexOf(key + '=') === 0) {
value = arg.replace(key + '=', '');
}
});
return value;
};
var gameServer
if (getArg('key')) {
var fs = require('fs');
gameServer = require('https').createServer({
key: fs.readFileSync(getArg('key')),
cert: fs.readFileSync(getArg('cert')),
ca: fs.readFileSync(getArg('ca')),
});
} else {
gameServer = require('http').createServer();
}
2017-03-05 07:14:50 +01:00
io = require('socket.io')(gameServer,{
2016-10-23 07:56:45 +02:00
pingTimeout: 30000,
maxHttpBufferSize: 1024*1024,
});
2017-03-05 07:14:50 +01:00
gameServer.listen(2015);
2016-10-23 07:56:45 +02:00
}
var cfg = {
MAX_ROOMS: 100,
MAX_CLIENTS: 500,
MAX_ROOM_NAME_LENGTH: 15,
MAX_NICKNAME_LENGTH: 10,
MAX_PASSWORD_LENGTH: 15
};
var roomManager = new RoomManager(cfg);
var MAX_SOCKETS = 500;
// var MAX_SOCKETS_PER_IP = 50;
// var ipTable = {};
function getSocketCount () {
if (!io.sockets) return 0;
return Object.keys(io.sockets.connected).length;
}
io.use(function (socket,next) {
if (getSocketCount() >= MAX_SOCKETS) {
next(new Error('MAX_SOCKETS'));
return;
}
// var handshake = socket.request;
// var ip = handshake.connection.remoteAddress;
// if (!ip) {
// next();
// return;
// }
// if (ip in ipTable) {
// if (ipTable[ip] >= MAX_SOCKETS_PER_IP) {
// console.log('MAX_SOCKETS_PER_IP: %s',ip);
// next(new Error('MAX_SOCKETS_PER_IP'));
// return;
// } else {
// ipTable[ip]++;
// }
// } else {
// ipTable[ip] = 1;
// }
// socket.on('disconnect',function () {
// console.log('disconnect: %s, count: %s',ip,getSocketCount());
// if (ip in ipTable) {
// if (ipTable[ip] <= 1) {
// delete ipTable[ip];
// } else {
// ipTable[ip]--;
// }
// }
// });
next();
});
io.on('connect',function (socket) {
if (global.window) {
return roomManager.createClient(socket);
}
var req = socket.request;
if (req.connection.destroyed) {
console.log('req.connection.destroyed');
return;
}
var query = require('url').parse(req.url,true).query;
// console.log('connect: %s, count: %s',req.connection.remoteAddress,getSocketCount());
// console.log(query.clientId);
roomManager.createClient(socket,+query.clientId);
// test
// socket.on('force disconnect',function () {
// socket.disconnect();
// });
// for debug
if (typeof process === 'undefined') return;
var password = '';
process.argv.slice(2).forEach(function (arg) {
var match = arg.match(/^debug_password=(\S+)/)
if (match) {
password = match[1];
}
});
if (!password) return;
socket.on('debug',function (psw) {
if (psw !== password) return;
try {
var path = require('path');
var filePath = './debug.js';
delete require.cache[path.resolve(filePath)];
require(filePath);
} catch (e) {
console.log(e);
}
});
});
if (!global.window) {
exports.roomManager = roomManager;
}