Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | /**
* @module Server
* Server Index
*/
import { IStateServer } from '@engine/reducers';
import { ExpressServer } from '@server/express';
import { startSocket } from '@server/socket';
import * as http from 'http';
import { Store } from 'redux';
// tslint:disable-next-line: no-var-requires
const debug = require('debug')('express:server');
declare global {
namespace Express {
interface Request {
reduxStore: Store<IStateServer>;
}
}
}
export class GameServer {
public readonly express: ExpressServer;
private server: http.Server;
private readonly port: number | string | false;
private readonly store: Store;
public constructor(store: Store<IStateServer>) {
const reduxStoreMiddleware = (iStore: Store) => (req, _res, next) => {
req.reduxStore = iStore;
next();
};
this.express = new ExpressServer(reduxStoreMiddleware(store));
this.port = this.normalizePort(process.env.SERVER_PORT || '3000');
this.store = store;
this.onError = this.onError.bind(this);
this.onListening = this.onListening.bind(this);
}
public launch() {
this.express.app.set('port', this.port);
this.server = http.createServer(this.express.app);
this.server.listen(this.port);
this.server.on('error', this.onError);
this.server.on('listening', this.onListening);
startSocket(this.server, this.express.session, this.store);
}
/**
* Normalize a port into a number, string, or false.
* @param val
*/
private normalizePort(val): number | string | false {
const port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
* @param error
*/
private onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
const port = this.port;
const bind = typeof port === 'string'
? `Pipe ${port}`
: `Port ${port}`;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(`${bind} requires elevated privileges`);
process.exit(1);
break;
case 'EADDRINUSE':
console.error(`${bind} is already in use`);
process.exit(1);
break;
default:
throw error;
}
}
/**
*
*/
private onListening() {
const addr = this.server.address();
if (addr === null || addr === undefined) {
debug('Error on listening, no address found');
console.log('Error on listening, no address found');
return;
}
const bind = typeof addr === 'string'
? `pipe ${addr}`
: `port ${addr.port}`;
debug(`Listening on ${bind}`);
console.log(`Listening on ${bind}`);
}
}
|