diff --git a/dist/events.d.ts b/dist/events.d.ts new file mode 100644 index 0000000..658153e --- /dev/null +++ b/dist/events.d.ts @@ -0,0 +1,16 @@ +export declare const PLAYER_CONNECT = "PLAYER_CONNECT"; +export declare const PLAYER_DISCONNECT = "PLAYER_DISCONNECT"; +export declare const LOBBY_CREATE = "LOBBY_CREATE"; +export declare const LOBBY_JOIN = "LOBBY_JOIN"; +export declare const TOURNAMENT_START = "TOURNAMENT_START"; +export declare const UPDATE_STATS = "UPDATE_STATS"; +export declare const LOG = "LOG"; +export declare const MATCH_START = "MATCH_START"; +export declare const MATCH_END = "MATCH_END"; +export declare const GAME_START = "GAME_START"; +export declare const GAME_END = "GAME_END"; +export declare const PLAYER_DATA = "PLAYER_DATA"; +export declare const SEND_PLAYER_DATA = "SEND_PLAYER_DATA"; +export declare const success: (event: string) => string; +export declare const pending: (event: string) => string; +export declare const failure: (event: string) => string; diff --git a/dist/events.js b/dist/events.js new file mode 100644 index 0000000..3f4c6d8 --- /dev/null +++ b/dist/events.js @@ -0,0 +1,19 @@ +"use strict"; +exports.__esModule = true; +exports.PLAYER_CONNECT = 'PLAYER_CONNECT'; +exports.PLAYER_DISCONNECT = 'PLAYER_DISCONNECT'; +exports.LOBBY_CREATE = 'LOBBY_CREATE'; +exports.LOBBY_JOIN = 'LOBBY_JOIN'; +exports.TOURNAMENT_START = 'TOURNAMENT_START'; +exports.UPDATE_STATS = 'UPDATE_STATS'; +exports.LOG = 'LOG'; +exports.MATCH_START = 'MATCH_START'; +exports.MATCH_END = 'MATCH_END'; +exports.GAME_START = 'GAME_START'; +exports.GAME_END = 'GAME_END'; +exports.PLAYER_DATA = 'PLAYER_DATA'; +exports.SEND_PLAYER_DATA = 'SEND_PLAYER_DATA'; +exports.success = function (event) { return event + "_SUCCESS"; }; +exports.pending = function (event) { return event + "_PENDING"; }; +exports.failure = function (event) { return event + "_FAILURE"; }; +//# sourceMappingURL=events.js.map \ No newline at end of file diff --git a/dist/events.js.map b/dist/events.js.map new file mode 100644 index 0000000..476e750 --- /dev/null +++ b/dist/events.js.map @@ -0,0 +1 @@ +{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":";;AAAa,QAAA,cAAc,GAAG,gBAAgB,CAAC;AAClC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAExC,QAAA,YAAY,GAAG,cAAc,CAAC;AAE9B,QAAA,UAAU,GAAG,YAAY,CAAC;AAE1B,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AAEtC,QAAA,YAAY,GAAG,cAAc,CAAC;AAC9B,QAAA,GAAG,GAAG,KAAK,CAAC;AAEZ,QAAA,WAAW,GAAG,aAAa,CAAC;AAC5B,QAAA,SAAS,GAAG,WAAW,CAAC;AAExB,QAAA,UAAU,GAAG,YAAY,CAAC;AAC1B,QAAA,QAAQ,GAAG,UAAU,CAAC;AAEtB,QAAA,WAAW,GAAG,aAAa,CAAC;AAC5B,QAAA,gBAAgB,GAAG,kBAAkB,CAAC;AAEtC,QAAA,OAAO,GAAG,UAAC,KAAa,IAAa,OAAG,KAAK,aAAU,EAAlB,CAAkB,CAAC;AACxD,QAAA,OAAO,GAAG,UAAC,KAAa,IAAa,OAAG,KAAK,aAAU,EAAlB,CAAkB,CAAC;AACxD,QAAA,OAAO,GAAG,UAAC,KAAa,IAAa,OAAG,KAAK,aAAU,EAAlB,CAAkB,CAAC"} \ No newline at end of file diff --git a/dist/server/Server.d.ts b/dist/server/Server.d.ts index b2c770c..1f615a2 100644 --- a/dist/server/Server.d.ts +++ b/dist/server/Server.d.ts @@ -1,5 +1,6 @@ import { Options } from "../lib/cli-options"; -export default class Server { +import PubSubber from "../tournament/model/Subscriber"; +export default class Server extends PubSubber { private options; private players; private lobbies; @@ -11,8 +12,6 @@ export default class Server { private onLobbyCreate; private onLobbyJoin; private onLobbyTournamentStart; - private updateStats; - private addPlayer; private removePlayer; private log; } diff --git a/dist/server/Server.js b/dist/server/Server.js index 628f588..0f07a3f 100644 --- a/dist/server/Server.js +++ b/dist/server/Server.js @@ -1,37 +1,50 @@ "use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); exports.__esModule = true; var GUI_1 = require("./GUI"); var SocketServer_1 = require("./SocketServer"); var Tournament_1 = require("../tournament/Tournament"); var Lobby_1 = require("../tournament/model/Lobby"); +var events = require("../events"); +var Subscriber_1 = require("../tournament/model/Subscriber"); var pjson = require('../../package.json'); -var Server = (function () { +var Server = (function (_super) { + __extends(Server, _super); function Server(options) { - var _this = this; - this.options = options; - this.onPlayerDisconnect = function (player) { + var _this = _super.call(this) || this; + _this.options = options; + _this.onPlayerDisconnect = function (player) { _this.log('Handle player disconnect on his active games'); + var lobbyList = []; _this.lobbies.forEach(function (lobby) { var playerIndex = lobby.players.findIndex(function (eachPlayer) { return eachPlayer.token === player.token; }); if (playerIndex < 0) { return; } lobby.players.splice(playerIndex, 1); - _this.socketServer.emitInLobby(lobby.token, 'lobby disconnected', { - type: 'player left', - payload: { - lobby: lobby.toObject() - } - }); + lobbyList.push(lobby); + }); + _this.publish(events.success(events.PLAYER_DISCONNECT), { + lobbyList: lobbyList, + player: player }); }; - this.onLobbyCreate = function (creator) { + _this.onLobbyCreate = function (creator) { var lobby = new Lobby_1.Lobby(creator); _this.lobbies.push(lobby); _this.log('Created lobby ' + lobby.token); return lobby; }; - this.onLobbyJoin = function (player, lobbyToken, spectating) { + _this.onLobbyJoin = function (player, lobbyToken, spectating) { if (spectating === void 0) { spectating = false; } _this.log('Player ' + player.token + ' wants to join ' + lobbyToken + ' - spectating? ' + spectating); var foundLobby = _this.lobbies.find(function (l) { return l.token === lobbyToken; }); @@ -43,34 +56,40 @@ var Server = (function () { foundLobby.players.push(player); _this.log('Player ' + player.token + ' joined ' + lobbyToken); } + _this.publish(events.success(events.LOBBY_JOIN), { + lobby: foundLobby, + player: player + }); return foundLobby; }; - this.players = []; - this.lobbies = []; - this.socketServer = new SocketServer_1["default"](this.options.port, { - onPlayerConnect: this.onPlayerConnect.bind(this), - onPlayerDisconnect: this.onPlayerDisconnect.bind(this), - onLobbyCreate: this.onLobbyCreate.bind(this), - onLobbyJoin: this.onLobbyJoin.bind(this), - onLobbyTournamentStart: this.onLobbyTournamentStart.bind(this), - updateStats: this.updateStats.bind(this) - }); + _this.players = []; + _this.lobbies = []; + _this.socketServer = new SocketServer_1["default"](_this.options.port); var title = "Ultimate TTT Algorithm Battle v" + pjson.version; if (options.gui) { - this.ui = new GUI_1["default"](title, this.options.port); + _this.ui = new GUI_1["default"](title, _this.options.port); } else { - this.log(title); - this.log("Listening on localhost:" + this.options.port); + _this.log(title); + _this.log("Listening on localhost:" + _this.options.port); } - this.log('Server started', true); - if (this.ui) { - this.ui.render(); + _this.log('Server started', true); + if (_this.ui) { + _this.ui.render(); } + _this.subscribe(events.PLAYER_CONNECT, _this.onPlayerConnect); + _this.subscribe(events.PLAYER_DISCONNECT, _this.onPlayerDisconnect); + _this.subscribe(events.LOBBY_CREATE, _this.onLobbyCreate); + _this.subscribe(events.LOBBY_JOIN, _this.onLobbyJoin); + _this.subscribe(events.TOURNAMENT_START, _this.onLobbyTournamentStart); + _this.subscribe(events.LOG, _this.log); + return _this; } Server.prototype.onPlayerConnect = function (player) { - this.addPlayer(player); - player.channel.send('waiting'); + if (this.players.filter(function (p) { return p.token === player.token; }).length === 0) { + this.players.push(player); + } + this.log("Connected \"" + player.token + "\"", true); }; Server.prototype.onLobbyTournamentStart = function (lobbyToken, tournamentOptions) { var foundLobby = this.lobbies.find(function (l) { return l.token === lobbyToken; }); @@ -84,28 +103,6 @@ var Server = (function () { } return foundLobby.tournament; }; - Server.prototype.updateStats = function () { - var payload = { players: this.players.map(function (p) { return p.token; }), games: [] }; - this.socketServer.emitPayload('stats', 'stats', payload); - }; - Server.prototype.addPlayer = function (player) { - var _this = this; - var matches = this.players.filter(function (p) { return p.token === player.token; }); - if (matches.length > 0) { - matches[0].channel.disconnect(); - this.removePlayer(matches[0]); - } - process.nextTick(function () { - if (_this.players.filter(function (p) { return p.token === player.token; }).length === 0) { - _this.players.push(player); - } - _this.log("Connected \"" + player.token + "\"", true); - _this.socketServer.emitPayload('stats', 'connect', player.token); - if (_this.ui) { - _this.ui.renderOnlinePlayers(_this.players.map(function (p) { return p.token; })); - } - }); - }; Server.prototype.removePlayer = function (player) { var index = this.players.indexOf(player); if (index > -1) { @@ -115,7 +112,6 @@ var Server = (function () { return; } this.log("Disconnected " + player.token, true); - this.socketServer.emitPayload('stats', 'disconnect', player.token); if (this.ui) { this.ui.renderOnlinePlayers(this.players.map(function (p) { return p.token; })); } @@ -131,6 +127,6 @@ var Server = (function () { } }; return Server; -}()); +}(Subscriber_1["default"])); exports["default"] = Server; //# sourceMappingURL=Server.js.map \ No newline at end of file diff --git a/dist/server/Server.js.map b/dist/server/Server.js.map index a106f78..ae678f8 100644 --- a/dist/server/Server.js.map +++ b/dist/server/Server.js.map @@ -1 +1 @@ -{"version":3,"file":"Server.js","sourceRoot":"","sources":["../../src/server/Server.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Server.js","sourceRoot":"","sources":["../../src/server/Server.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/server/SocketServer.d.ts b/dist/server/SocketServer.d.ts index d4d7dba..b36e735 100644 --- a/dist/server/SocketServer.d.ts +++ b/dist/server/SocketServer.d.ts @@ -1,23 +1,13 @@ -import Player from "../tournament/model/Player"; -import { Lobby } from '../tournament/model/Lobby'; -import { Tournament, TournamentOptions } from '../tournament/Tournament'; -export interface SocketEvents { - onPlayerConnect(player: Player): void; - onPlayerDisconnect(player: Player): void; - onLobbyCreate(player: Player): Lobby; - onLobbyJoin(player: Player, lobbyToken: string, spectating: boolean): Lobby; - onLobbyTournamentStart(lobbyToken: string, options: TournamentOptions): Tournament; - updateStats(): void; -} -export default class SocketServer { +import PubSubber from '../tournament/model/Subscriber'; +export default class SocketServer extends PubSubber { private io; - private socketEvents; - constructor(port: number, socketEvents: SocketEvents); - emit(type: string, data: { - type: string; - payload: any; - }): void; - emitInLobby(lobby: string, type: string, data: any): void; - emitPayload(emitType: string, type: string, payload: any): void; + private playerSockets; + constructor(port: number); + private onLobbyJoined; + private publishPlayerEvent; + private emitInLobby; + private emitPayload; + private emitToPlayer; + private onPlayerDisconnected; private handler; } diff --git a/dist/server/SocketServer.js b/dist/server/SocketServer.js index 78b796c..539bef5 100644 --- a/dist/server/SocketServer.js +++ b/dist/server/SocketServer.js @@ -1,19 +1,29 @@ "use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); exports.__esModule = true; var http = require("http"); var io = require("socket.io"); var fs = require("fs"); +var events = require("../events"); var Player_1 = require("../tournament/model/Player"); -var Channel_1 = require("../tournament/model/Channel"); -var constants_1 = require("./constants"); -var SocketServer = (function () { - function SocketServer(port, socketEvents) { - var _this = this; - var app = http.createServer(this.handler); - this.io = io(app); +var Subscriber_1 = require("../tournament/model/Subscriber"); +var SocketServer = (function (_super) { + __extends(SocketServer, _super); + function SocketServer(port) { + var _this = _super.call(this) || this; + var app = http.createServer(_this.handler); + _this.io = io(app); app.listen(port); - this.socketEvents = socketEvents; - this.io.use(function (socket, next) { + _this.io.use(function (socket, next) { var isClient = socket.request._query.client || false; if (isClient) { return next(); @@ -25,63 +35,68 @@ var SocketServer = (function () { socket.request.testToken = token; next(); }); - this.io.on('connection', function (socket) { - var playerChannel = new Channel_1["default"](socket); - var player = new Player_1["default"](socket.handshake.query.token, playerChannel); - socket.on('lobby create', function () { - var lobby = _this.socketEvents.onLobbyCreate(player); - socket.on('lobby tournament start', function (data) { - var options = Object.assign(constants_1.DEFAULT_TOURNAMENT_OPTIONS, data.options); - var tournament = _this.socketEvents.onLobbyTournamentStart(lobby.token, options); - if (tournament == null) { - socket.emit('exception', { error: 'Unable to start tournament' }); - } - else { - lobby.tournament = tournament; - _this.io["in"](lobby.token).emit('lobby tournament started', { - lobby: lobby.toObject() - }); - } - }); - if (lobby == null) { - socket.emit('exception', { error: 'Unable to create lobby' }); - } - else { - socket.join(lobby.token); - socket.emit('lobby created', { - lobby: lobby.toObject() - }); - } - }); - socket.on('lobby join', function (data) { - var lobby = _this.socketEvents.onLobbyJoin(player, data.token, data.spectating); - if (lobby == null) { - socket.emit('lobby exception', { error: 'Unable to join lobby, ensure token is correct' }); - return; - } - _this.io["in"](data.token).emit('connected', { - lobby: lobby.toObject() - }); - socket.join(lobby.token); - socket.emit('lobby joined', { - lobby: lobby.toObject(), - isAdmin: lobby.admin.token === player.token - }); + _this.io.on('connection', function (socket) { + var token = socket.handshake.query.token; + var player = new Player_1["default"](token); + _this.playerSockets[token] = socket; + socket.on('lobby create', _this.publishPlayerEvent(events.LOBBY_CREATE, token)); + socket.on('lobby tournament start', _this.publishPlayerEvent(events.TOURNAMENT_START, token)); + socket.on('lobby join', _this.publishPlayerEvent(events.LOBBY_JOIN, token)); + socket.on('game', function (data) { + _this.publishNamespaced(token, events.PLAYER_DATA, data); }); - socket.on('disconnect', function () { - _this.socketEvents.onPlayerDisconnect(player); + socket.on('disconnect', function (data) { + delete _this.playerSockets[token]; + _this.publishPlayerEvent(events.PLAYER_DISCONNECT, token)(data); }); - _this.socketEvents.onPlayerConnect(player); + _this.publish(events.PLAYER_CONNECT, player); }); + _this.subscribe(events.success(events.LOBBY_JOIN), _this.onLobbyJoined); + _this.subscribe(events.success(events.PLAYER_DISCONNECT), _this.onPlayerDisconnected); + return _this; } - SocketServer.prototype.emit = function (type, data) { - this.io.emit(type, data); + SocketServer.prototype.onLobbyJoined = function (data) { + this.io["in"](data.lobby.token).emit('connected', { + lobby: data.lobby.toObject() + }); + var socket = this.playerSockets[data.player.token]; + if (!socket) { + console.error('Unknown player', data.player.token); + return; + } + socket.join(data.lobby.token); + socket.emit('lobby joined', { + lobby: data.lobby.toObject(), + isAdmin: data.lobby.admin.token === data.player.token + }); + }; + SocketServer.prototype.publishPlayerEvent = function (event, token) { + var _this = this; + return function (data) { + _this.publish(event + "." + token, data); + }; }; SocketServer.prototype.emitInLobby = function (lobby, type, data) { this.io.to(lobby).emit(type, data); }; - SocketServer.prototype.emitPayload = function (emitType, type, payload) { - this.emit(emitType, { type: type, payload: payload }); + SocketServer.prototype.emitPayload = function (emitType, data) { + this.io.emit(emitType, data); + }; + SocketServer.prototype.emitToPlayer = function (playerToken, type, data) { + var socket = this.playerSockets[data.player.token]; + if (!socket) { + console.error('Unknown player', data.player.token); + return; + } + socket.emit(type, data); + }; + SocketServer.prototype.onPlayerDisconnected = function (data) { + var _this = this; + data.lobbyList.forEach(function (lobby) { + _this.emitInLobby(lobby.token, 'lobby disconnected', { + lobby: lobby.toObject() + }); + }); }; SocketServer.prototype.handler = function (req, res) { fs.readFile(__dirname + '/../../public/index.html', function (err, data) { @@ -94,6 +109,6 @@ var SocketServer = (function () { }); }; return SocketServer; -}()); +}(Subscriber_1["default"])); exports["default"] = SocketServer; //# sourceMappingURL=SocketServer.js.map \ No newline at end of file diff --git a/dist/server/SocketServer.js.map b/dist/server/SocketServer.js.map index 1169dce..c5917aa 100644 --- a/dist/server/SocketServer.js.map +++ b/dist/server/SocketServer.js.map @@ -1 +1 @@ -{"version":3,"file":"SocketServer.js","sourceRoot":"","sources":["../../src/server/SocketServer.ts"],"names":[],"mappings":";;AAAA,2BAA6B;AAC7B,8BAAgC;AAChC,uBAAyB;AACzB,qDAAgD;AAGhD,uDAAkD;AAClD,yCAAyD;AAsBzD;IAII,sBAAY,IAAY,EAAE,YAA0B;QAApD,iBAsEC;QArEG,IAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAClB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QAEjC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAC,MAAuB,EAAE,IAAc;YAChD,IAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;YACvD,IAAI,QAAQ,EAAE;gBACV,OAAO,IAAI,EAAE,CAAC;aACjB;YACO,IAAA,mCAAK,CAA2B;YACxC,IAAI,CAAC,KAAK,EAAE;gBACR,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;aAC3C;YACD,MAAM,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC;YACjC,IAAI,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,UAAC,MAAuB;YAC7C,IAAM,aAAa,GAAG,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAM,MAAM,GAAG,IAAI,mBAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;YAEvE,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE;gBACtB,IAAM,KAAK,GAAG,KAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBACtD,MAAM,CAAC,EAAE,CAAC,wBAAwB,EAAE,UAAC,IAAI;oBACrC,IAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,sCAA0B,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxE,IAAM,UAAU,GAAG,KAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBAClF,IAAG,UAAU,IAAI,IAAI,EAAE;wBACnB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAC,KAAK,EAAE,4BAA4B,EAAC,CAAC,CAAC;qBACnE;yBAAM;wBACH,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;wBAC9B,KAAI,CAAC,EAAE,CAAC,IAAE,CAAA,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,0BAA0B,EAAE;4BACrD,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;yBAC1B,CAAC,CAAC;qBACN;gBACL,CAAC,CAAC,CAAC;gBACH,IAAG,KAAK,IAAI,IAAI,EAAE;oBACd,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAC,KAAK,EAAE,wBAAwB,EAAC,CAAC,CAAA;iBAC9D;qBAAM;oBACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;wBACzB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;qBAC1B,CAAC,CAAC;iBACN;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,UAAC,IAAS;gBAC9B,IAAM,KAAK,GAAG,KAAI,CAAC,YAAY,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBACjF,IAAG,KAAK,IAAI,IAAI,EAAE;oBACd,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAC,KAAK,EAAE,+CAA+C,EAAC,CAAC,CAAA;oBACxF,OAAO;iBACV;gBACD,KAAI,CAAC,EAAE,CAAC,IAAE,CAAA,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE;oBACrC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;iBAC1B,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;oBACxB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;oBACvB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;iBAC9C,CAAC,CAAA;YACN,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE;gBACpB,KAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,KAAI,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC;IAOM,2BAAI,GAAX,UAAY,IAAY,EAAE,IAAoC;QAC1D,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAQM,kCAAW,GAAlB,UAAmB,KAAa,EAAE,IAAY,EAAE,IAAS;QACrD,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAEM,kCAAW,GAAlB,UAAmB,QAAgB,EAAE,IAAY,EAAE,OAAY;QAC3D,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,MAAA,EAAE,OAAO,SAAA,EAAE,CAAC,CAAC;IAC3C,CAAC;IAQO,8BAAO,GAAf,UAAgB,GAAyB,EAAE,GAAwB;QAC/D,EAAE,CAAC,QAAQ,CAAC,SAAS,GAAG,0BAA0B,EAC9C,UAAC,GAAQ,EAAE,IAAS;YAChB,IAAI,GAAG,EAAE;gBACL,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,OAAO,GAAG,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;aAC9C;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACX,CAAC;IACL,mBAAC;AAAD,CAAC,AArHD,IAqHC"} \ No newline at end of file +{"version":3,"file":"SocketServer.js","sourceRoot":"","sources":["../../src/server/SocketServer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tournament/Tournament.d.ts b/dist/tournament/Tournament.d.ts index 6da98d8..3bfa916 100644 --- a/dist/tournament/Tournament.d.ts +++ b/dist/tournament/Tournament.d.ts @@ -1,12 +1,12 @@ import SocketServer from '../server/SocketServer'; import Player from './model/Player'; -import Match from './match/Match'; +import PubSubber from './model/Subscriber'; export declare type TournamentOptions = { numberOfGames: number; type: string; timeout: number; }; -export declare class Tournament { +export declare class Tournament extends PubSubber { private options; private socket; players: Player[]; @@ -14,9 +14,13 @@ export declare class Tournament { private player; private stats; private matchmaker; + private tournamentID; constructor(options: TournamentOptions, socket: SocketServer, players: Player[], lobbyToken: string); - start(): Promise; - playMatches(matches: Match[]): Promise; + start(): void; + private playNextMatch; + private playNextMatches; + private onAllMatchesEnd; + private onTournamentEnd; isFinished(): boolean; getStats(): { options: TournamentOptions; @@ -30,5 +34,4 @@ export declare class Tournament { }[]; ranking: string[]; }; - private sendStats; } diff --git a/dist/tournament/Tournament.js b/dist/tournament/Tournament.js index d88a5a7..2324d7f 100644 --- a/dist/tournament/Tournament.js +++ b/dist/tournament/Tournament.js @@ -1,116 +1,74 @@ "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); exports.__esModule = true; +var uuid = require("uuid/v4"); var FreeForAllMatchmaker_1 = require("./matchmaker/FreeForAllMatchmaker"); -var Tournament = (function () { +var Subscriber_1 = require("./model/Subscriber"); +var events_1 = require("../events"); +var Tournament = (function (_super) { + __extends(Tournament, _super); function Tournament(options, socket, players, lobbyToken) { - var _this = this; - this.options = options; - this.socket = socket; - this.players = players; - this.lobbyToken = lobbyToken; - this.stats = { + var _this = _super.call(this) || this; + _this.options = options; + _this.socket = socket; + _this.players = players; + _this.lobbyToken = lobbyToken; + _this.stats = { started: false, finished: false, matches: [] }; - this.sendStats = function () { - _this.socket.emitInLobby(_this.lobbyToken, 'tournament stats', _this.getStats()); - }; + _this.tournamentID = uuid(); var matchOptions = { - maxGames: this.options.numberOfGames, - timeout: this.options.timeout + maxGames: _this.options.numberOfGames, + timeout: _this.options.timeout }; switch (options.type) { case 'FreeForAll': default: - this.matchmaker = new FreeForAllMatchmaker_1["default"](this.players, matchOptions, this.sendStats); + _this.matchmaker = new FreeForAllMatchmaker_1["default"](_this.players, matchOptions); break; } + _this.subscribeNamespaced(_this.tournamentID, events_1.MATCH_END, _this.playNextMatch); + return _this; } Tournament.prototype.start = function () { - return __awaiter(this, void 0, void 0, function () { - var matches; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!(!this.stats.started && !this.isFinished())) return [3, 4]; - this.stats.started = true; - _a.label = 1; - case 1: - if (!!this.matchmaker.isFinished()) return [3, 3]; - matches = this.matchmaker.getRemainingMatches(this.stats); - this.stats.matches = this.stats.matches.concat(matches); - return [4, this.playMatches(matches)]; - case 2: - _a.sent(); - this.sendStats(); - return [3, 1]; - case 3: - this.stats.finished = true; - this.sendStats(); - _a.label = 4; - case 4: return [2]; - } - }); - }); + this.stats.started = true; + this.playNextMatches(); + }; + Tournament.prototype.playNextMatch = function () { + var nextMatch = this.stats.matches.find(function (match) { return match.stats.state === 'upcoming'; }); + if (!nextMatch) { + return this.onAllMatchesEnd(); + } + nextMatch.start(); + }; + Tournament.prototype.playNextMatches = function () { + var matches = this.matchmaker.getRemainingMatches(this.tournamentID, this.stats); + if (matches.length < 1) { + return this.onTournamentEnd(); + } + this.stats.matches = this.stats.matches.concat(matches); + this.playNextMatch(); + }; + Tournament.prototype.onAllMatchesEnd = function () { + if (this.matchmaker.isFinished()) { + return this.onTournamentEnd(); + } + this.playNextMatches(); }; - Tournament.prototype.playMatches = function (matches) { - return __awaiter(this, void 0, void 0, function () { - var _i, matches_1, match; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _i = 0, matches_1 = matches; - _a.label = 1; - case 1: - if (!(_i < matches_1.length)) return [3, 4]; - match = matches_1[_i]; - return [4, match.playGames()]; - case 2: - _a.sent(); - _a.label = 3; - case 3: - _i++; - return [3, 1]; - case 4: return [2]; - } - }); - }); + Tournament.prototype.onTournamentEnd = function () { + this.stats.finished = true; + this.unsubscribeAll(); }; Tournament.prototype.isFinished = function () { return this.stats.finished; @@ -130,6 +88,6 @@ var Tournament = (function () { }; }; return Tournament; -}()); +}(Subscriber_1["default"])); exports.Tournament = Tournament; //# sourceMappingURL=Tournament.js.map \ No newline at end of file diff --git a/dist/tournament/Tournament.js.map b/dist/tournament/Tournament.js.map index 798ebb2..a07ff18 100644 --- a/dist/tournament/Tournament.js.map +++ b/dist/tournament/Tournament.js.map @@ -1 +1 @@ -{"version":3,"file":"Tournament.js","sourceRoot":"","sources":["../../src/tournament/Tournament.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Tournament.js","sourceRoot":"","sources":["../../src/tournament/Tournament.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tournament/match/Match.d.ts b/dist/tournament/match/Match.d.ts index 7083175..3a6f86b 100644 --- a/dist/tournament/match/Match.d.ts +++ b/dist/tournament/match/Match.d.ts @@ -2,12 +2,17 @@ import MatchOptions from './MatchOptions'; import Game from './game/Game'; import Player from '../model/Player'; import State from '../model/State'; -export default class Match { +import PubSubber from '../model/Subscriber'; +export default class Match extends PubSubber { + private tournmentId; players: Player[]; private options; - private sendStats; + private matchID; games: Game[]; stats: State; - constructor(players: Player[], options: MatchOptions, sendStats: Function); - playGames(): Promise; + constructor(tournmentId: string, players: Player[], options: MatchOptions); + start(): void; + private playNextGame; + private onGameEnd; + private onMatchEnd; } diff --git a/dist/tournament/match/Match.js b/dist/tournament/match/Match.js index 2ba5279..bd9327b 100644 --- a/dist/tournament/match/Match.js +++ b/dist/tournament/match/Match.js @@ -1,94 +1,74 @@ "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); exports.__esModule = true; +var uuid = require("uuid/v4"); var Game_1 = require("./game/Game"); var State_1 = require("../model/State"); -var Match = (function () { - function Match(players, options, sendStats) { - this.players = players; - this.options = options; - this.sendStats = sendStats; - this.games = []; - this.stats = new State_1["default"](); +var events_1 = require("../../events"); +var Subscriber_1 = require("../model/Subscriber"); +var Match = (function (_super) { + __extends(Match, _super); + function Match(tournmentId, players, options) { + var _this = _super.call(this) || this; + _this.tournmentId = tournmentId; + _this.players = players; + _this.options = options; + _this.games = []; + _this.stats = new State_1["default"](); + _this.matchID = uuid(); for (var i = 0; i < options.maxGames; i++) { - this.games[i] = new Game_1["default"](this.players, { + _this.games[i] = new Game_1["default"](_this.matchID, _this.players, { timeout: options.timeout, gameId: i }, { onGameStart: function () { } }, console.log); } + _this.subscribeNamespaced(_this.matchID, events_1.GAME_END, _this.onGameEnd); + return _this; } - Match.prototype.playGames = function () { - return __awaiter(this, void 0, void 0, function () { - var _i, _a, game; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - this.stats.state = 'playing'; - _i = 0, _a = this.games; - _b.label = 1; - case 1: - if (!(_i < _a.length)) return [3, 4]; - game = _a[_i]; - return [4, game.playGame()]; - case 2: - _b.sent(); - this.stats.times.push(game.gameTime); - this.stats.games++; - if (game.winnerIndex === -1) { - this.stats.ties++; - } - else { - this.stats.wins[game.winnerIndex]++; - } - this.sendStats(); - _b.label = 3; - case 3: - _i++; - return [3, 1]; - case 4: - this.stats.state = 'finished'; - return [2]; - } - }); - }); + Match.prototype.start = function () { + this.stats.state = 'playing'; + this.playNextGame(); + }; + Match.prototype.playNextGame = function () { + var game = this.games[this.stats.games]; + if (!game) { + console.error('Invalid game!', this); + this.onMatchEnd(); + return; + } + game.start(); + }; + Match.prototype.onGameEnd = function (game) { + this.stats.times.push(game.gameTime); + this.stats.games++; + if (game.winnerIndex === -1) { + this.stats.ties++; + } + else { + this.stats.wins[game.winnerIndex]++; + } + if (this.stats.games >= this.games.length) { + return this.onMatchEnd(); + } + this.playNextGame(); + }; + Match.prototype.onMatchEnd = function () { + this.stats.state = 'finished'; + this.publishNamespaced(this.tournmentId, events_1.MATCH_END, this); + this.unsubscribeAll(); }; return Match; -}()); +}(Subscriber_1["default"])); exports["default"] = Match; //# sourceMappingURL=Match.js.map \ No newline at end of file diff --git a/dist/tournament/match/Match.js.map b/dist/tournament/match/Match.js.map index ba111f9..938822b 100644 --- a/dist/tournament/match/Match.js.map +++ b/dist/tournament/match/Match.js.map @@ -1 +1 @@ -{"version":3,"file":"Match.js","sourceRoot":"","sources":["../../../src/tournament/match/Match.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,oCAA+B;AAE/B,wCAAmC;AAKnC;IAII,eAAmB,OAAiB,EAAU,OAAqB,EAAU,SAAmB;QAA7E,YAAO,GAAP,OAAO,CAAU;QAAU,YAAO,GAAP,OAAO,CAAc;QAAU,cAAS,GAAT,SAAS,CAAU;QAC5F,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,kBAAK,EAAE,CAAC;QAEzB,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;YACtC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,iBAAI,CACpB,IAAI,CAAC,OAAO,EACZ;gBACI,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,CAAC;aACZ,EACD;gBACI,WAAW,EAAE,cAAO,CAAC;aACxB,EACD,OAAO,CAAC,GAAG,CACd,CAAA;SACJ;IACL,CAAC;IAKY,yBAAS,GAAtB;;;;;;wBACI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;8BACF,EAAV,KAAA,IAAI,CAAC,KAAK;;;6BAAV,CAAA,cAAU,CAAA;wBAAlB,IAAI;wBACT,WAAM,IAAI,CAAC,QAAQ,EAAE,EAAA;;wBAArB,SAAqB,CAAC;wBACtB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;wBACrC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;wBACnB,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE;4BACzB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;yBACrB;6BAAM;4BACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;yBACvC;wBACD,IAAI,CAAC,SAAS,EAAE,CAAC;;;wBATJ,IAAU,CAAA;;;wBAW3B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;;;;;KACjC;IACL,YAAC;AAAD,CAAC,AAzCD,IAyCC"} \ No newline at end of file +{"version":3,"file":"Match.js","sourceRoot":"","sources":["../../../src/tournament/match/Match.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8BAAgC;AAGhC,oCAA+B;AAE/B,wCAAmC;AACnC,uCAAmD;AACnD,kDAA4C;AAK5C;IAAmC,yBAAS;IAKxC,eAAoB,WAAmB,EAAS,OAAiB,EAAU,OAAqB;QAAhG,YACI,iBAAO,SAqBV;QAtBmB,iBAAW,GAAX,WAAW,CAAQ;QAAS,aAAO,GAAP,OAAO,CAAU;QAAU,aAAO,GAAP,OAAO,CAAc;QAE5F,KAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,KAAI,CAAC,KAAK,GAAG,IAAI,kBAAK,EAAE,CAAC;QACzB,KAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAEtB,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE;YACtC,KAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,iBAAI,CACpB,KAAI,CAAC,OAAO,EACZ,KAAI,CAAC,OAAO,EACZ;gBACI,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,MAAM,EAAE,CAAC;aACZ,EACD;gBACI,WAAW,EAAE,cAAO,CAAC;aACxB,EACD,OAAO,CAAC,GAAG,CACd,CAAA;SACJ;QAED,KAAI,CAAC,mBAAmB,CAAC,KAAI,CAAC,OAAO,EAAE,iBAAQ,EAAE,KAAI,CAAC,SAAS,CAAC,CAAC;;IACrE,CAAC;IAEM,qBAAK,GAAZ;QACI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAEO,4BAAY,GAApB;QACI,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE;YACP,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,OAAO;SACV;QACD,IAAI,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAEO,yBAAS,GAAjB,UAAkB,IAAU;QACxB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,WAAW,KAAK,CAAC,CAAC,EAAE;YACzB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SACrB;aAAM;YACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;SACvC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACvC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;SAC5B;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAEO,0BAAU,GAAlB;QACI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;QAC9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAS,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IACL,YAAC;AAAD,CAAC,AA/DD,CAAmC,uBAAS,GA+D3C"} \ No newline at end of file diff --git a/dist/tournament/match/game/Game.d.ts b/dist/tournament/match/game/Game.d.ts index 7cc8826..5082f06 100644 --- a/dist/tournament/match/game/Game.d.ts +++ b/dist/tournament/match/game/Game.d.ts @@ -1,8 +1,10 @@ -import { PlayerNumber, PlayerOrTie } from "@socialgorithm/ultimate-ttt/dist/model/constants"; +import { PlayerOrTie } from "@socialgorithm/ultimate-ttt/dist/model/constants"; import Player from '../../model/Player'; import GameOptions from './GameOptions'; import GameEvents from './GameEvents'; -export default class Game { +import PubSubber from '../../model/Subscriber'; +export default class Game extends PubSubber { + private matchID; private players; private options; private events; @@ -10,19 +12,17 @@ export default class Game { private game; private currentPlayerIndex; private gameStart; - private gamePromise; - private resolve; winnerIndex: PlayerOrTie; gameTime: number; - constructor(players: Player[], options: GameOptions, events: GameEvents, log: any); - playGame(): Promise; - handlePlayerMove(player: Player, playerIndex: number): (data: string) => void; - handleGameWon(winnerIndex: PlayerNumber): void; - handleGameTied(): void; + constructor(matchID: string, players: Player[], options: GameOptions, events: GameEvents, log: any); + start(): void; + private onFinish; + private handlePlayerMove; + private handleGameWon; + private handleGameTied; private handleGameEnd; + private sendToPlayer; private parseMove; private writeMove; private switchPlayer; - private playerZero; - private playerOne; } diff --git a/dist/tournament/match/game/Game.js b/dist/tournament/match/game/Game.js index 42b2c15..412d8fd 100644 --- a/dist/tournament/match/game/Game.js +++ b/dist/tournament/match/game/Game.js @@ -1,28 +1,44 @@ "use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); exports.__esModule = true; var UTTT_1 = require("@socialgorithm/ultimate-ttt/dist/UTTT"); var funcs = require("../../../lib/funcs"); -var Game = (function () { - function Game(players, options, events, log) { - var _this = this; - this.players = players; - this.options = options; - this.events = events; - this.log = log; - this.game = new UTTT_1["default"](); - this.gamePromise = new Promise(function (resolve) { - _this.resolve = resolve; +var Subscriber_1 = require("../../model/Subscriber"); +var events_1 = require("../../../events"); +var Game = (function (_super) { + __extends(Game, _super); + function Game(matchID, players, options, events, log) { + var _this = _super.call(this) || this; + _this.matchID = matchID; + _this.players = players; + _this.options = options; + _this.events = events; + _this.log = log; + _this.game = new UTTT_1["default"](); + _this.players.forEach(function (player, index) { + _this.subscribeNamespaced(player.token, events_1.PLAYER_DATA, _this.handlePlayerMove(player, index)); }); + return _this; } - Game.prototype.playGame = function () { + Game.prototype.start = function () { this.gameStart = process.hrtime(); this.currentPlayerIndex = 0; - this.playerZero().channel.registerHandler('game', this.handlePlayerMove(this.playerZero(), 0)); - this.playerOne().channel.registerHandler('game', this.handlePlayerMove(this.playerOne(), 1)); - this.playerZero().channel.send('game', 'init'); - this.playerOne().channel.send('game', 'init'); - this.players[this.currentPlayerIndex].channel.send('game', 'move'); - return this.gamePromise; + this.sendToPlayer(this.players[0], 'game', 'init'); + this.sendToPlayer(this.players[1], 'game', 'init'); + this.sendToPlayer(this.players[this.currentPlayerIndex], 'game', 'move'); + }; + Game.prototype.onFinish = function () { + this.unsubscribeAll(); + this.publishNamespaced(this.matchID, events_1.GAME_END, this); }; Game.prototype.handlePlayerMove = function (player, playerIndex) { var _this = this; @@ -40,7 +56,7 @@ var Game = (function () { var coords = _this.parseMove(data); _this.game = _this.game.move(_this.currentPlayerIndex, coords.board, coords.move); _this.currentPlayerIndex = _this.switchPlayer(_this.currentPlayerIndex); - _this.players[_this.currentPlayerIndex].channel.send('game', "opponent " + _this.writeMove(coords)); + _this.sendToPlayer(_this.players[_this.currentPlayerIndex], 'game', "opponent " + _this.writeMove(coords)); if (_this.game.isFinished()) { if (_this.game.winner === -1) { _this.handleGameTied(); @@ -78,10 +94,15 @@ var Game = (function () { gameState = 'lost'; } } - player.channel.send('game', "end " + gameState); - player.channel.removeAllHandlers(); + _this.sendToPlayer(player, 'game', "end " + gameState); + }); + this.onFinish(); + }; + Game.prototype.sendToPlayer = function (player, type, data) { + this.publishNamespaced(player.token, events_1.SEND_PLAYER_DATA, { + type: type, + data: data }); - this.resolve(true); }; Game.prototype.parseMove = function (data) { var _a = data.trim().split(';') @@ -95,13 +116,7 @@ var Game = (function () { Game.prototype.switchPlayer = function (playerNumber) { return playerNumber === 0 ? 1 : 0; }; - Game.prototype.playerZero = function () { - return this.players[0]; - }; - Game.prototype.playerOne = function () { - return this.players[1]; - }; return Game; -}()); +}(Subscriber_1["default"])); exports["default"] = Game; //# sourceMappingURL=Game.js.map \ No newline at end of file diff --git a/dist/tournament/match/game/Game.js.map b/dist/tournament/match/game/Game.js.map index d4f53b0..b296ec0 100644 --- a/dist/tournament/match/game/Game.js.map +++ b/dist/tournament/match/game/Game.js.map @@ -1 +1 @@ -{"version":3,"file":"Game.js","sourceRoot":"","sources":["../../../../src/tournament/match/game/Game.ts"],"names":[],"mappings":";;AAAA,8DAAyD;AAGzD,0CAA4C;AAQ5C;IAaI,cAAoB,OAAiB,EAAU,OAAoB,EAAU,MAAkB,EAAU,GAAQ;QAAjH,iBAKC;QALmB,YAAO,GAAP,OAAO,CAAU;QAAU,YAAO,GAAP,OAAO,CAAa;QAAU,WAAM,GAAN,MAAM,CAAY;QAAU,QAAG,GAAH,GAAG,CAAK;QAC7G,IAAI,CAAC,IAAI,GAAG,IAAI,iBAAI,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,UAAC,OAAO;YACnC,KAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC;IAKM,uBAAQ,GAAf;QACI,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC;QAE5B,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAE7F,IAAI,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAQM,+BAAgB,GAAvB,UAAwB,MAAc,EAAE,WAAmB;QAA3D,iBAgCC;QA/BG,OAAO,UAAC,IAAY;YAChB,IAAI,KAAI,CAAC,kBAAkB,KAAK,WAAW,EAAE;gBACzC,KAAI,CAAC,GAAG,CAAC,UAAQ,KAAI,CAAC,OAAO,CAAC,MAAM,iBAAY,MAAM,CAAC,KAAK,oCAA+B,KAAI,CAAC,OAAO,CAAC,KAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,aAAU,CAAC,CAAC;gBAClJ,KAAI,CAAC,aAAa,CAAC,KAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC5C,OAAO;aACV;YACD,IAAI,IAAI,KAAK,MAAM,EAAE;gBAEjB,KAAI,CAAC,aAAa,CAAC,KAAI,CAAC,YAAY,CAAC,KAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBAC/D,OAAO;aACV;YACD,IAAI;gBACA,IAAM,MAAM,GAAG,KAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACpC,KAAI,CAAC,IAAI,GAAG,KAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAE/E,KAAI,CAAC,kBAAkB,GAAG,KAAI,CAAC,YAAY,CAAC,KAAI,CAAC,kBAAkB,CAAC,CAAC;gBACrE,KAAI,CAAC,OAAO,CAAC,KAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,cAAY,KAAI,CAAC,SAAS,CAAC,MAAM,CAAG,CAAC,CAAC;gBAEjG,IAAI,KAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;oBACxB,IAAG,KAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE;wBACxB,KAAI,CAAC,cAAc,EAAE,CAAA;qBACxB;yBAAM;wBACH,KAAI,CAAC,aAAa,CAAC,KAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;qBACxC;oBACD,OAAO;iBACV;aACJ;YAAC,OAAO,CAAC,EAAE;gBAER,KAAI,CAAC,aAAa,CAAC,KAAI,CAAC,YAAY,CAAC,KAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;aAClE;QACL,CAAC,CAAC;IACN,CAAC;IAOM,4BAAa,GAApB,UAAqB,WAAyB;QAC1C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAEM,6BAAc,GAArB;QACI,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,aAAa,EAAE,CAAA;IACxB,CAAC;IAEO,4BAAa,GAArB;QAAA,iBAgBC;QAfG,IAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAC,MAAM,EAAE,KAAK;YAC/B,IAAI,SAAS,GAAG,MAAM,CAAC;YACvB,IAAI,KAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE;gBACvB,IAAI,KAAI,CAAC,WAAW,KAAK,KAAK,EAAE;oBAC5B,SAAS,GAAG,KAAK,CAAC;iBACrB;qBAAM;oBACH,SAAS,GAAG,MAAM,CAAC;iBACtB;aACJ;YACD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,SAAO,SAAW,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAQO,wBAAS,GAAjB,UAAkB,IAAY;QACpB,IAAA;uGACqE,EADpE,aAAK,EAAE,YAAI,CAC0D;QAC5E,OAAO,EAAE,KAAK,OAAA,EAAE,IAAI,MAAA,EAAE,CAAC;IAC3B,CAAC;IAOO,wBAAS,GAAjB,UAAkB,MAAc;QACrB,IAAA,oBAAK,EAAE,kBAAI,CAAW;QAC7B,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAX,CAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAKO,2BAAY,GAApB,UAAqB,YAA0B;QAC3C,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IAEO,yBAAU,GAAlB;QACI,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAEO,wBAAS,GAAjB;QACI,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACL,WAAC;AAAD,CAAC,AAjJD,IAiJC"} \ No newline at end of file +{"version":3,"file":"Game.js","sourceRoot":"","sources":["../../../../src/tournament/match/game/Game.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tournament/matchmaker/FreeForAllMatchmaker.d.ts b/dist/tournament/matchmaker/FreeForAllMatchmaker.d.ts index 531d8a4..5ed855c 100644 --- a/dist/tournament/matchmaker/FreeForAllMatchmaker.d.ts +++ b/dist/tournament/matchmaker/FreeForAllMatchmaker.d.ts @@ -6,11 +6,10 @@ import MatchOptions from "../match/MatchOptions"; export default class FreeForAllMatchmaker implements Matchmaker { private players; private options; - private sendStats; private maxMatches; private finished; - constructor(players: Player[], options: MatchOptions, sendStats: Function); + constructor(players: Player[], options: MatchOptions); isFinished(): boolean; - getRemainingMatches(tournamentStats: TournamentStats): Match[]; + getRemainingMatches(tournamentId: string, tournamentStats: TournamentStats): Match[]; getRanking(stats: TournamentStats): string[]; } diff --git a/dist/tournament/matchmaker/FreeForAllMatchmaker.js b/dist/tournament/matchmaker/FreeForAllMatchmaker.js index 5bd11ef..7c9191c 100644 --- a/dist/tournament/matchmaker/FreeForAllMatchmaker.js +++ b/dist/tournament/matchmaker/FreeForAllMatchmaker.js @@ -2,25 +2,24 @@ exports.__esModule = true; var Match_1 = require("../match/Match"); var FreeForAllMatchmaker = (function () { - function FreeForAllMatchmaker(players, options, sendStats) { + function FreeForAllMatchmaker(players, options) { this.players = players; this.options = options; - this.sendStats = sendStats; this.maxMatches = Math.pow(players.length, players.length); } FreeForAllMatchmaker.prototype.isFinished = function () { return this.finished; }; - FreeForAllMatchmaker.prototype.getRemainingMatches = function (tournamentStats) { + FreeForAllMatchmaker.prototype.getRemainingMatches = function (tournamentId, tournamentStats) { var _this = this; var match = []; this.finished = true; return this.players.map(function (playerA, $index) { return _this.players.slice($index + 1).map(function (playerB) { - return new Match_1["default"]([playerA, playerB], { + return new Match_1["default"](tournamentId, [playerA, playerB], { maxGames: _this.options.maxGames, timeout: _this.options.timeout - }, _this.sendStats); + }); }); }).reduce(function (result, current, idx) { return result.concat(current); diff --git a/dist/tournament/matchmaker/FreeForAllMatchmaker.js.map b/dist/tournament/matchmaker/FreeForAllMatchmaker.js.map index 10cc03a..ab9cfc4 100644 --- a/dist/tournament/matchmaker/FreeForAllMatchmaker.js.map +++ b/dist/tournament/matchmaker/FreeForAllMatchmaker.js.map @@ -1 +1 @@ -{"version":3,"file":"FreeForAllMatchmaker.js","sourceRoot":"","sources":["../../../src/tournament/matchmaker/FreeForAllMatchmaker.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"FreeForAllMatchmaker.js","sourceRoot":"","sources":["../../../src/tournament/matchmaker/FreeForAllMatchmaker.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/tournament/matchmaker/Matchmaker.d.ts b/dist/tournament/matchmaker/Matchmaker.d.ts index 8ccb2e8..82d1fbc 100644 --- a/dist/tournament/matchmaker/Matchmaker.d.ts +++ b/dist/tournament/matchmaker/Matchmaker.d.ts @@ -2,6 +2,6 @@ import { TournamentStats } from "../model/TournamentStats"; import Match from "../match/Match"; export default interface Matchmaker { isFinished(): Boolean; - getRemainingMatches(stats: TournamentStats): Match[]; + getRemainingMatches(tournamentId: string, stats: TournamentStats): Match[]; getRanking(stats: TournamentStats): string[]; } diff --git a/dist/tournament/model/Player.d.ts b/dist/tournament/model/Player.d.ts index d968c7b..4bc4d0b 100644 --- a/dist/tournament/model/Player.d.ts +++ b/dist/tournament/model/Player.d.ts @@ -1,7 +1,4 @@ -import Channel from './Channel'; export default class Player { token: string; - channel: Channel; - constructor(token: string, channel: Channel); - alive(): boolean; + constructor(token: string); } diff --git a/dist/tournament/model/Player.js b/dist/tournament/model/Player.js index 3feff2f..0ef2e9d 100644 --- a/dist/tournament/model/Player.js +++ b/dist/tournament/model/Player.js @@ -1,13 +1,9 @@ "use strict"; exports.__esModule = true; var Player = (function () { - function Player(token, channel) { + function Player(token) { this.token = token; - this.channel = channel; } - Player.prototype.alive = function () { - return this.channel.isConnected(); - }; return Player; }()); exports["default"] = Player; diff --git a/dist/tournament/model/Player.js.map b/dist/tournament/model/Player.js.map index db54c22..0632793 100644 --- a/dist/tournament/model/Player.js.map +++ b/dist/tournament/model/Player.js.map @@ -1 +1 @@ -{"version":3,"file":"Player.js","sourceRoot":"","sources":["../../../src/tournament/model/Player.ts"],"names":[],"mappings":";;AAEA;IAEI,gBAAmB,KAAa,EAAS,OAAgB;QAAtC,UAAK,GAAL,KAAK,CAAQ;QAAS,YAAO,GAAP,OAAO,CAAS;IAAI,CAAC;IAE9D,sBAAK,GAAL;QACI,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAEL,aAAC;AAAD,CAAC,AARD,IAQC"} \ No newline at end of file +{"version":3,"file":"Player.js","sourceRoot":"","sources":["../../../src/tournament/model/Player.ts"],"names":[],"mappings":";;AAAA;IAEI,gBAAmB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;IAExC,aAAC;AAAD,CAAC,AAJD,IAIC"} \ No newline at end of file diff --git a/dist/tournament/model/Subscriber.d.ts b/dist/tournament/model/Subscriber.d.ts new file mode 100644 index 0000000..0799d62 --- /dev/null +++ b/dist/tournament/model/Subscriber.d.ts @@ -0,0 +1,9 @@ +export default class PubSubber { + private subscriptionTokens; + protected publish(event: string, data: any): void; + protected publishNamespaced(namespace: string, event: string, data: any): void; + protected subscribeNamespaced(namespace: string, event: string, fn: Function): void; + protected subscribe(event: string, fn: Function): void; + protected unsubscribeAll(): void; + private makeNamespace; +} diff --git a/dist/tournament/model/Subscriber.js b/dist/tournament/model/Subscriber.js new file mode 100644 index 0000000..bfaf483 --- /dev/null +++ b/dist/tournament/model/Subscriber.js @@ -0,0 +1,32 @@ +"use strict"; +exports.__esModule = true; +var PubSub = require("pubsub-js"); +var PubSubber = (function () { + function PubSubber() { + this.subscriptionTokens = []; + } + PubSubber.prototype.publish = function (event, data) { + PubSub.publish(event, data); + }; + PubSubber.prototype.publishNamespaced = function (namespace, event, data) { + this.publish(this.makeNamespace(namespace, event), data); + }; + PubSubber.prototype.subscribeNamespaced = function (namespace, event, fn) { + this.subscribe(this.makeNamespace(namespace, event), fn); + }; + PubSubber.prototype.subscribe = function (event, fn) { + var token = PubSub.subscribe(event, fn); + this.subscriptionTokens.push(token); + }; + PubSubber.prototype.unsubscribeAll = function () { + this.subscriptionTokens.forEach(function (token) { + PubSub.unsubscribe(token); + }); + }; + PubSubber.prototype.makeNamespace = function (namespace, event) { + return event + "--" + namespace; + }; + return PubSubber; +}()); +exports["default"] = PubSubber; +//# sourceMappingURL=Subscriber.js.map \ No newline at end of file diff --git a/dist/tournament/model/Subscriber.js.map b/dist/tournament/model/Subscriber.js.map new file mode 100644 index 0000000..031ebe4 --- /dev/null +++ b/dist/tournament/model/Subscriber.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Subscriber.js","sourceRoot":"","sources":["../../../src/tournament/model/Subscriber.ts"],"names":[],"mappings":";;AAAA,kCAAoC;AAMpC;IAAA;QACY,uBAAkB,GAAkB,EAAE,CAAC;IA4BnD,CAAC;IA1Ba,2BAAO,GAAjB,UAAkB,KAAa,EAAE,IAAS;QACtC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAES,qCAAiB,GAA3B,UAA4B,SAAiB,EAAE,KAAa,EAAE,IAAS;QACnE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IAES,uCAAmB,GAA7B,UAA8B,SAAiB,EAAE,KAAa,EAAE,EAAY;QACxE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAES,6BAAS,GAAnB,UAAoB,KAAa,EAAE,EAAY;QAC3C,IAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAES,kCAAc,GAAxB;QACI,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,UAAA,KAAK;YACjC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,iCAAa,GAArB,UAAsB,SAAiB,EAAE,KAAa;QAClD,OAAU,KAAK,UAAK,SAAW,CAAC;IACpC,CAAC;IACL,gBAAC;AAAD,CAAC,AA7BD,IA6BC"} \ No newline at end of file diff --git a/package.json b/package.json index 27a4f2e..aa7d315 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "docs": "typedoc --out docs/ --mode modules ./src" }, "engines": { - "node" : ">= 8" + "node": ">= 8" }, "bin": { "uttt": "bin/index.js" @@ -38,14 +38,18 @@ "dependencies": { "@socialgorithm/ultimate-ttt": "^4.19.0", "@types/ip": "0.0.31", - "@types/node": "^10.5.1", + "@types/node": "^10.5.3", + "@types/pubsub-js": "^1.5.18", "@types/socket.io": "^1.4.36", + "@types/uuid": "^3.4.3", "blessed": "^0.1.81", "command-line-args": "^4.0.6", "command-line-usage": "^4.0.0", "ip": "^1.1.5", + "pubsub-js": "^1.6.0", "random-word": "^2.0.0", - "socket.io": "^2.0.1" + "socket.io": "^2.0.1", + "uuid": "^3.3.2" }, "devDependencies": { "@types/blessed": "^0.1.10", @@ -53,11 +57,11 @@ "@types/mocha": "^2.2.41", "chai": "^4.0.0", "coveralls": "^2.13.1", - "gulp-file": "^0.3.0", "mocha": "^3.4.2", "nyc": "^10.3.2", "socket.io-client": "^2.1.1", "ts-node": "^7.0.0", + "tslint": "^5.11.0", "typedoc": "^0.11.1", "typescript": "^2.3.4" }, diff --git a/src/events.ts b/src/events.ts new file mode 100644 index 0000000..890f73b --- /dev/null +++ b/src/events.ts @@ -0,0 +1,24 @@ +export const PLAYER_CONNECT = 'PLAYER_CONNECT'; +export const PLAYER_DISCONNECT = 'PLAYER_DISCONNECT'; + +export const LOBBY_CREATE = 'LOBBY_CREATE'; + +export const LOBBY_JOIN = 'LOBBY_JOIN'; + +export const TOURNAMENT_START = 'TOURNAMENT_START'; + +export const UPDATE_STATS = 'UPDATE_STATS'; +export const LOG = 'LOG'; + +export const MATCH_START = 'MATCH_START'; +export const MATCH_END = 'MATCH_END'; + +export const GAME_START = 'GAME_START'; +export const GAME_END = 'GAME_END'; + +export const PLAYER_DATA = 'PLAYER_DATA'; +export const SEND_PLAYER_DATA = 'SEND_PLAYER_DATA'; + +export const success = (event: string): string => `${event}_SUCCESS`; +export const pending = (event: string): string => `${event}_PENDING`; +export const failure = (event: string): string => `${event}_FAILURE`; \ No newline at end of file diff --git a/src/server/Server.ts b/src/server/Server.ts index 194eba5..8a95a2a 100644 --- a/src/server/Server.ts +++ b/src/server/Server.ts @@ -4,6 +4,8 @@ import SocketServer from "./SocketServer"; import Player from "../tournament/model/Player"; import { Tournament, TournamentOptions } from '../tournament/Tournament'; import { Lobby } from "../tournament/model/Lobby"; +import * as events from '../events'; +import PubSubber from "../tournament/model/Subscriber"; /** * Load the package.json to get the version number @@ -14,7 +16,7 @@ const pjson = require('../../package.json'); * Online Server class * Handles the sockets, players, games... */ -export default class Server { +export default class Server extends PubSubber { /** * List of players in the server @@ -34,17 +36,11 @@ export default class Server { private socketServer: SocketServer; constructor(private options: Options) { + super(); this.players = []; this.lobbies = []; - this.socketServer = new SocketServer(this.options.port, { - onPlayerConnect: this.onPlayerConnect.bind(this), - onPlayerDisconnect: this.onPlayerDisconnect.bind(this), - onLobbyCreate: this.onLobbyCreate.bind(this), - onLobbyJoin: this.onLobbyJoin.bind(this), - onLobbyTournamentStart: this.onLobbyTournamentStart.bind(this), - updateStats: this.updateStats.bind(this), - }); + this.socketServer = new SocketServer(this.options.port); const title = `Ultimate TTT Algorithm Battle v${pjson.version}`; @@ -60,16 +56,33 @@ export default class Server { if (this.ui) { this.ui.render(); } + + // Setup the listeners + this.subscribe(events.PLAYER_CONNECT, this.onPlayerConnect); + this.subscribe(events.PLAYER_DISCONNECT, this.onPlayerDisconnect); + this.subscribe(events.LOBBY_CREATE, this.onLobbyCreate); + this.subscribe(events.LOBBY_JOIN, this.onLobbyJoin); + this.subscribe(events.TOURNAMENT_START, this.onLobbyTournamentStart); + // this.subscribe(events.UPDATE_STATS, this.updateStats); + this.subscribe(events.LOG, this.log); } private onPlayerConnect(player: Player): void { - this.addPlayer(player); - player.channel.send('waiting'); + // const matches = this.players.filter(p => p.token === player.token); + // if (matches.length > 0) { + // matches[0].channel.disconnect(); + // this.removePlayer(matches[0]); + // } + + if (this.players.filter(p => p.token === player.token).length === 0) { + this.players.push(player); + } + this.log(`Connected "${player.token}"`, true); } private onPlayerDisconnect = (player: Player): void => { this.log('Handle player disconnect on his active games'); - // TODO Remove the player from any lobbies + const lobbyList: Array = []; this.lobbies.forEach(lobby => { const playerIndex = lobby.players.findIndex(eachPlayer => eachPlayer.token === player.token); if (playerIndex < 0) { @@ -77,12 +90,12 @@ export default class Server { } // Remove the player, and notify lobby of changes lobby.players.splice(playerIndex, 1); - this.socketServer.emitInLobby(lobby.token, 'lobby disconnected', { - type: 'player left', - payload: { - lobby: lobby.toObject(), - }, - }); + lobbyList.push(lobby); + }); + + this.publish(events.success(events.PLAYER_DISCONNECT), { + lobbyList, + player, }); } @@ -106,6 +119,11 @@ export default class Server { foundLobby.players.push(player) this.log('Player ' + player.token + ' joined ' + lobbyToken); } + + this.publish(events.success(events.LOBBY_JOIN), { + lobby: foundLobby, + player, + }); return foundLobby; } @@ -125,33 +143,10 @@ export default class Server { return foundLobby.tournament } - private updateStats(): void { - const payload = { players: this.players.map(p => p.token), games: [] as any[] }; - this.socketServer.emitPayload('stats', 'stats', payload); - } - - /** - * Add a player to the server - * @param player Player token - */ - private addPlayer(player: Player): void { - const matches = this.players.filter(p => p.token === player.token); - if (matches.length > 0) { - matches[0].channel.disconnect(); - this.removePlayer(matches[0]); - } - - process.nextTick(() => { - if (this.players.filter(p => p.token === player.token).length === 0) { - this.players.push(player); - } - this.log(`Connected "${player.token}"`, true); - this.socketServer.emitPayload('stats', 'connect', player.token); - if (this.ui) { - this.ui.renderOnlinePlayers(this.players.map(p => p.token)); - } - }); - } + // private updateStats(): void { + // const payload = { players: this.players.map(p => p.token), games: [] as any[] }; + // this.socketServer.emitPayload('stats', 'stats', payload); + // } /** * Remove a player from the server @@ -165,7 +160,6 @@ export default class Server { return; } this.log(`Disconnected ${player.token}`, true); - this.socketServer.emitPayload('stats', 'disconnect', player.token); if (this.ui) { this.ui.renderOnlinePlayers(this.players.map(p => p.token)); } diff --git a/src/server/SocketServer.ts b/src/server/SocketServer.ts index 0ac3aaf..ea1661c 100644 --- a/src/server/SocketServer.ts +++ b/src/server/SocketServer.ts @@ -1,23 +1,11 @@ import * as http from 'http'; import * as io from 'socket.io'; import * as fs from 'fs'; + +import * as events from '../events'; import Player from "../tournament/model/Player"; import { Lobby } from '../tournament/model/Lobby'; -import { Tournament, TournamentOptions } from '../tournament/Tournament' -import Channel from '../tournament/model/Channel'; -import { DEFAULT_TOURNAMENT_OPTIONS } from './constants'; - -/** - * Interface between the Server and the Socket - */ -export interface SocketEvents { - onPlayerConnect(player: Player): void; - onPlayerDisconnect(player: Player): void; - onLobbyCreate(player: Player): Lobby; - onLobbyJoin(player: Player, lobbyToken: string, spectating: boolean): Lobby; - onLobbyTournamentStart(lobbyToken: string, options: TournamentOptions): Tournament; - updateStats(): void; -} +import PubSubber from '../tournament/model/Subscriber'; /** * SocketServer performs all the necessary work around sockets @@ -27,17 +15,18 @@ export interface SocketEvents { * and preserve all the server functionality independent of it. Testing should * become easier because of that for example. */ -export default class SocketServer { +export default class SocketServer extends PubSubber { private io: SocketIO.Server; - private socketEvents: SocketEvents; + private playerSockets: { + [ key: string ]: SocketIO.Socket, + }; - constructor(port: number, socketEvents: SocketEvents) { + constructor(port: number) { + super(); const app = http.createServer(this.handler); this.io = io(app); app.listen(port); - this.socketEvents = socketEvents; - this.io.use((socket: SocketIO.Socket, next: Function) => { const isClient = socket.request._query.client || false; if (isClient) { @@ -52,64 +41,53 @@ export default class SocketServer { }); this.io.on('connection', (socket: SocketIO.Socket) => { - const playerChannel = new Channel(socket); - const player = new Player(socket.handshake.query.token, playerChannel); - - socket.on('lobby create', () => { - const lobby = this.socketEvents.onLobbyCreate(player); - socket.on('lobby tournament start', (data) => { - const options = Object.assign(DEFAULT_TOURNAMENT_OPTIONS, data.options); - const tournament = this.socketEvents.onLobbyTournamentStart(lobby.token, options); - if(tournament == null) { - socket.emit('exception', {error: 'Unable to start tournament'}); - } else { - lobby.tournament = tournament; - this.io.in(lobby.token).emit('lobby tournament started', { - lobby: lobby.toObject(), - }); - } - }); - if(lobby == null) { - socket.emit('exception', {error: 'Unable to create lobby'}) - } else { - socket.join(lobby.token); - socket.emit('lobby created', { - lobby: lobby.toObject() - }); - } - }); + const token = socket.handshake.query.token; + const player = new Player(token); + + // Store the socket + this.playerSockets[token] = socket; - socket.on('lobby join', (data: any) => { - const lobby = this.socketEvents.onLobbyJoin(player, data.token, data.spectating); - if(lobby == null) { - socket.emit('lobby exception', {error: 'Unable to join lobby, ensure token is correct'}) - return; - } - this.io.in(data.token).emit('connected', { - lobby: lobby.toObject() - }); - socket.join(lobby.token); - socket.emit('lobby joined', { - lobby: lobby.toObject(), - isAdmin: lobby.admin.token === player.token, - }) + // Forward the socket events to the PubSub system + socket.on('lobby create', this.publishPlayerEvent(events.LOBBY_CREATE, token)); + socket.on('lobby tournament start', this.publishPlayerEvent(events.TOURNAMENT_START, token)); + socket.on('lobby join', this.publishPlayerEvent(events.LOBBY_JOIN, token)); + socket.on('game', (data) => { + this.publishNamespaced(token, events.PLAYER_DATA, data); }); - - socket.on('disconnect', () => { - this.socketEvents.onPlayerDisconnect(player); + socket.on('disconnect', (data) => { + // Remove the player socket + delete this.playerSockets[token]; + this.publishPlayerEvent(events.PLAYER_DISCONNECT, token)(data); }); - this.socketEvents.onPlayerConnect(player); + this.publish(events.PLAYER_CONNECT, player); }); + + // Subscribe to events + this.subscribe(events.success(events.LOBBY_JOIN), this.onLobbyJoined); + this.subscribe(events.success(events.PLAYER_DISCONNECT), this.onPlayerDisconnected); } - /** - * Send a message to any client listening on the socket - * @param type Message type (determines who receives the data) - * @param data Data to be sent - */ - public emit(type: string, data: { type: string, payload: any }): void { - this.io.emit(type, data); + private onLobbyJoined(data: { lobby: Lobby, player: Player }) { + this.io.in(data.lobby.token).emit('connected', { + lobby: data.lobby.toObject() + }); + const socket = this.playerSockets[data.player.token]; + if (!socket) { + console.error('Unknown player', data.player.token); + return; + } + socket.join(data.lobby.token); + socket.emit('lobby joined', { + lobby: data.lobby.toObject(), + isAdmin: data.lobby.admin.token === data.player.token, + }) + } + + private publishPlayerEvent(event: string, token: string) { + return (data: any) => { + this.publish(`${event}.${token}`, data); + }; } /** @@ -118,12 +96,46 @@ export default class SocketServer { * @param type Message type (determines who receives the data) * @param data Data to be sent */ - public emitInLobby(lobby: string, type: string, data: any): void { + private emitInLobby(lobby: string, type: string, data: any): void { this.io.to(lobby).emit(type, data); } - public emitPayload(emitType: string, type: string, payload: any): void { - this.emit(emitType, { type, payload }); + /** + * Send a message to everyone + * @param emitType + * @param data + */ + private emitPayload(emitType: string, data: any): void { + this.io.emit(emitType, data); + } + + /** + * Send a message to a specific player + * @param playerToken + * @param type + * @param data + */ + private emitToPlayer(playerToken: string, type: string, data: any): void { + // TODO find player and emit something to them + const socket = this.playerSockets[data.player.token]; + if (!socket) { + console.error('Unknown player', data.player.token); + return; + } + socket.emit(type, data); + } + + /** + * After a player has successfully disconnected, we need to notify + * all the lobbies the player belonged to + * @param data + */ + private onPlayerDisconnected(data: { player: Player, lobbyList: Array }) { + data.lobbyList.forEach(lobby => { + this.emitInLobby(lobby.token, 'lobby disconnected', { + lobby: lobby.toObject(), + }); + }); } /** diff --git a/src/tournament/Tournament.ts b/src/tournament/Tournament.ts index 07a2018..57d65fd 100644 --- a/src/tournament/Tournament.ts +++ b/src/tournament/Tournament.ts @@ -1,3 +1,5 @@ +import * as uuid from 'uuid/v4'; + import SocketServer from '../server/SocketServer'; import Player from './model/Player'; import {TournamentStats} from "./model/TournamentStats"; @@ -5,6 +7,8 @@ import Matchmaker from './matchmaker/Matchmaker'; import Match from './match/Match'; import FreeForAllMatchmaker from './matchmaker/FreeForAllMatchmaker'; import { MatchOptions } from './match/MatchOptions'; +import PubSubber from './model/Subscriber'; +import { MATCH_END } from '../events'; /** * Tournament Options, these can be modified by the web interface @@ -20,7 +24,7 @@ export type TournamentOptions = { * Represents a tournament within a lobby, when given a matching strategy, it matches players according to that strategy, * runs the games between matched players and broadcasts game stats */ -export class Tournament { +export class Tournament extends PubSubber { private player: Player[]; private stats: TournamentStats = { started: false, @@ -28,8 +32,11 @@ export class Tournament { matches: [], }; private matchmaker: Matchmaker; + private tournamentID: string; constructor(private options: TournamentOptions, private socket: SocketServer, public players: Player[], private lobbyToken: string) { + super(); + this.tournamentID = uuid(); const matchOptions: MatchOptions = { maxGames: this.options.numberOfGames, timeout: this.options.timeout, @@ -37,29 +44,46 @@ export class Tournament { switch (options.type) { case 'FreeForAll': default: - this.matchmaker = new FreeForAllMatchmaker(this.players, matchOptions, this.sendStats); + this.matchmaker = new FreeForAllMatchmaker(this.players, matchOptions); break; } + + this.subscribeNamespaced(this.tournamentID, MATCH_END, this.playNextMatch); + } + + public start() { + this.stats.started = true; + this.playNextMatches(); + } + + private playNextMatch() { + const nextMatch = this.stats.matches.find(match => match.stats.state === 'upcoming'); + if (!nextMatch) { + return this.onAllMatchesEnd(); + } + nextMatch.start(); } - async start() { - if (!this.stats.started && !this.isFinished()) { - this.stats.started = true; - while(!this.matchmaker.isFinished()) { - const matches = this.matchmaker.getRemainingMatches(this.stats); - this.stats.matches = this.stats.matches.concat(matches); - await this.playMatches(matches); - this.sendStats(); - } - this.stats.finished = true; - this.sendStats(); + private playNextMatches() { + const matches = this.matchmaker.getRemainingMatches(this.tournamentID, this.stats); + if (matches.length < 1) { + // potential bug in the matchmaker (no more matches, yet not finished) + return this.onTournamentEnd(); } + this.stats.matches = this.stats.matches.concat(matches); + this.playNextMatch(); } - async playMatches(matches: Match[]) { - for(let match of matches) { - await match.playGames(); + private onAllMatchesEnd() { + if (this.matchmaker.isFinished()) { + return this.onTournamentEnd(); } + this.playNextMatches(); + } + + private onTournamentEnd() { + this.stats.finished = true; + this.unsubscribeAll(); } isFinished(): boolean { @@ -81,7 +105,7 @@ export class Tournament { }; } - private sendStats = (): void => { - this.socket.emitInLobby(this.lobbyToken, 'tournament stats', this.getStats()); - } + // private sendStats = (): void => { + // this.socket.emitInLobby(this.lobbyToken, 'tournament stats', this.getStats()); + // } } \ No newline at end of file diff --git a/src/tournament/match/Match.ts b/src/tournament/match/Match.ts index 0d0175b..13ed4a2 100644 --- a/src/tournament/match/Match.ts +++ b/src/tournament/match/Match.ts @@ -1,21 +1,29 @@ +import * as uuid from 'uuid/v4'; + import MatchOptions from './MatchOptions'; import Game from './game/Game'; import Player from '../model/Player'; import State from '../model/State'; +import { GAME_END, MATCH_END } from '../../events'; +import PubSubber from '../model/Subscriber'; /** * A set of games between two players */ -export default class Match { +export default class Match extends PubSubber { + private matchID: string; public games: Game[]; public stats: State; - constructor(public players: Player[], private options: MatchOptions, private sendStats: Function) { + constructor(private tournmentId: string, public players: Player[], private options: MatchOptions) { + super(); this.games = []; this.stats = new State(); + this.matchID = uuid(); for(let i = 0; i < options.maxGames; i++) { this.games[i] = new Game( + this.matchID, this.players, { timeout: options.timeout, @@ -27,24 +35,42 @@ export default class Match { console.log ) } + + this.subscribeNamespaced(this.matchID, GAME_END, this.onGameEnd); } - /** - * Play all the games in this match - */ - public async playGames() { + public start() { this.stats.state = 'playing'; - for (let game of this.games) { - await game.playGame(); - this.stats.times.push(game.gameTime); - this.stats.games++; - if (game.winnerIndex === -1) { - this.stats.ties++; - } else { - this.stats.wins[game.winnerIndex]++; - } - this.sendStats(); + this.playNextGame(); + } + + private playNextGame() { + const game = this.games[this.stats.games]; + if (!game) { + console.error('Invalid game!', this); + this.onMatchEnd(); + return; + } + game.start(); + } + + private onGameEnd(game: Game) { + this.stats.times.push(game.gameTime); + this.stats.games++; + if (game.winnerIndex === -1) { + this.stats.ties++; + } else { + this.stats.wins[game.winnerIndex]++; + } + if (this.stats.games >= this.games.length) { + return this.onMatchEnd(); } + this.playNextGame(); + } + + private onMatchEnd() { this.stats.state = 'finished'; + this.publishNamespaced(this.tournmentId, MATCH_END, this); + this.unsubscribeAll(); } } \ No newline at end of file diff --git a/src/tournament/match/game/Game.ts b/src/tournament/match/game/Game.ts index 72f7a1f..517f0de 100644 --- a/src/tournament/match/game/Game.ts +++ b/src/tournament/match/game/Game.ts @@ -5,16 +5,16 @@ import * as funcs from '../../../lib/funcs'; import Player from '../../model/Player'; import GameOptions from './GameOptions'; import GameEvents from './GameEvents'; +import PubSubber from '../../model/Subscriber'; +import { GAME_END, PLAYER_DATA, SEND_PLAYER_DATA } from '../../../events'; -/* +/** * A game between two players */ -export default class Game { +export default class Game extends PubSubber { private game: UTTT; private currentPlayerIndex: PlayerNumber; private gameStart: [number, number]; - private gamePromise: Promise; - private resolve: Function; public winnerIndex: PlayerOrTie; public gameTime: number; @@ -22,27 +22,31 @@ export default class Game { * Create a game between two players * * @param options Options for gameplay */ - constructor(private players: Player[], private options: GameOptions, private events: GameEvents, private log: any) { + constructor(private matchID: string, private players: Player[], private options: GameOptions, private events: GameEvents, private log: any) { + super(); this.game = new UTTT(); - this.gamePromise = new Promise((resolve) => { - this.resolve = resolve; + + // Subscribe to player events for this game + this.players.forEach((player, index) => { + this.subscribeNamespaced(player.token, PLAYER_DATA, this.handlePlayerMove(player, index)); }); } /** * Play an individual game between two players */ - public playGame(): Promise { + public start() { this.gameStart = process.hrtime(); this.currentPlayerIndex = 0; - this.playerZero().channel.registerHandler('game', this.handlePlayerMove(this.playerZero(), 0)); - this.playerOne().channel.registerHandler('game', this.handlePlayerMove(this.playerOne(), 1)); + this.sendToPlayer(this.players[0], 'game', 'init'); + this.sendToPlayer(this.players[1], 'game', 'init'); + this.sendToPlayer(this.players[this.currentPlayerIndex], 'game', 'move'); + } - this.playerZero().channel.send('game', 'init'); - this.playerOne().channel.send('game', 'init'); - this.players[this.currentPlayerIndex].channel.send('game', 'move'); - return this.gamePromise; + private onFinish() { + this.unsubscribeAll(); + this.publishNamespaced(this.matchID, GAME_END, this); } /** @@ -51,7 +55,7 @@ export default class Game { * @param player Player number (0-1) * @returns {Function} Move handler with the player number embedded for logging */ - public handlePlayerMove(player: Player, playerIndex: number) { + private handlePlayerMove(player: Player, playerIndex: number) { return (data: string) => { if (this.currentPlayerIndex !== playerIndex) { this.log(`Game ${this.options.gameId}: Player ${player.token} played out of turn (it was ${this.players[this.currentPlayerIndex].token}'s turn)`); @@ -68,7 +72,7 @@ export default class Game { this.game = this.game.move(this.currentPlayerIndex, coords.board, coords.move); this.currentPlayerIndex = this.switchPlayer(this.currentPlayerIndex); - this.players[this.currentPlayerIndex].channel.send('game', `opponent ${this.writeMove(coords)}`); + this.sendToPlayer(this.players[this.currentPlayerIndex], 'game', `opponent ${this.writeMove(coords)}`); if (this.game.isFinished()) { if(this.game.winner === -1) { @@ -90,12 +94,12 @@ export default class Game { * @param winnerIndex Game's winner, used to update the state * @param playerDisconnected Whether the game was stopped due to a player disconnecting. If true, the session will be finished */ - public handleGameWon(winnerIndex: PlayerNumber) { + private handleGameWon(winnerIndex: PlayerNumber) { this.winnerIndex = this.switchPlayer(winnerIndex); // necessary because the winner is recorded inversely this.handleGameEnd(); } - public handleGameTied() { + private handleGameTied() { this.winnerIndex = -1; this.handleGameEnd() } @@ -112,10 +116,16 @@ export default class Game { gameState = 'lost'; } } - player.channel.send('game', `end ${gameState}`); - player.channel.removeAllHandlers(); + this.sendToPlayer(player, 'game', `end ${gameState}`); + }); + this.onFinish(); + } + + private sendToPlayer(player: Player, type: string, data: string) { + this.publishNamespaced(player.token, SEND_PLAYER_DATA, { + type, + data, }); - this.resolve(true); } /** @@ -146,12 +156,4 @@ export default class Game { private switchPlayer(playerNumber: PlayerNumber): PlayerNumber { return playerNumber === 0 ? 1 : 0; } - - private playerZero(): Player { - return this.players[0]; - } - - private playerOne(): Player { - return this.players[1]; - } } \ No newline at end of file diff --git a/src/tournament/matchmaker/FreeForAllMatchmaker.ts b/src/tournament/matchmaker/FreeForAllMatchmaker.ts index 66cb5b1..84ab03a 100644 --- a/src/tournament/matchmaker/FreeForAllMatchmaker.ts +++ b/src/tournament/matchmaker/FreeForAllMatchmaker.ts @@ -17,7 +17,7 @@ export default class FreeForAllMatchmaker implements Matchmaker { private maxMatches: number; private finished: boolean; - constructor(private players: Player[], private options: MatchOptions, private sendStats: Function) { + constructor(private players: Player[], private options: MatchOptions) { this.maxMatches = Math.pow(players.length, players.length) } @@ -25,19 +25,20 @@ export default class FreeForAllMatchmaker implements Matchmaker { return this.finished; } - getRemainingMatches(tournamentStats: TournamentStats): Match[] { + getRemainingMatches(tournamentId: string, tournamentStats: TournamentStats): Match[] { let match: Match[] = []; this.finished = true; // Free for all only runs matchmaking once return this.players.map((playerA, $index) => { return this.players.slice($index + 1).map( playerB => { return new Match( + tournamentId, [playerA, playerB], { maxGames: this.options.maxGames, timeout: this.options.timeout, }, - this.sendStats + //this.sendStats ); } ) diff --git a/src/tournament/matchmaker/Matchmaker.ts b/src/tournament/matchmaker/Matchmaker.ts index 2753e1f..1165965 100644 --- a/src/tournament/matchmaker/Matchmaker.ts +++ b/src/tournament/matchmaker/Matchmaker.ts @@ -9,6 +9,6 @@ import Match from "../match/Match"; */ export default interface Matchmaker { isFinished(): Boolean, - getRemainingMatches(stats: TournamentStats): Match[], + getRemainingMatches(tournamentId: string, stats: TournamentStats): Match[], getRanking(stats: TournamentStats): string[], } \ No newline at end of file diff --git a/src/tournament/model/Channel.ts b/src/tournament/model/Channel.ts deleted file mode 100644 index 2e67db7..0000000 --- a/src/tournament/model/Channel.ts +++ /dev/null @@ -1,39 +0,0 @@ -import Player from './Player'; -import State, {Stats} from "./State"; - -type Handler = (...args: any[]) => void; - -/** - * Used to communicate with the player and receive messages from the player - * Abstracts the players socket - */ -export default class Channel { - - private handlers: [string, Handler][] = []; - - constructor(private socket: SocketIO.Socket) { } - - registerHandler(type: string, handler: Handler) { - this.handlers.push([type, handler]); - this.socket.on(type, handler); - } - - removeAllHandlers() { - for (let [type, handler] of this.handlers) { - this.socket.removeListener(type, handler); - } - } - - send(type: string, ...args: any[]) { - this.socket.emit(type, ...args) - } - - isConnected(): boolean { - return this.socket.connected - } - - disconnect(): void { - this.socket.disconnect(); - } - -} \ No newline at end of file diff --git a/src/tournament/model/Player.ts b/src/tournament/model/Player.ts index 2ee90ac..d38d1d7 100644 --- a/src/tournament/model/Player.ts +++ b/src/tournament/model/Player.ts @@ -1,11 +1,5 @@ -import Channel from './Channel'; - export default class Player { - constructor(public token: string, public channel: Channel) { } - - alive(): boolean { - return this.channel.isConnected(); - } + constructor(public token: string) {} } \ No newline at end of file diff --git a/src/tournament/model/Subscriber.ts b/src/tournament/model/Subscriber.ts new file mode 100644 index 0000000..71bb441 --- /dev/null +++ b/src/tournament/model/Subscriber.ts @@ -0,0 +1,36 @@ +import * as PubSub from 'pubsub-js'; + +/** + * Any class that wants to use the PubSub bus needs to extend this class. + * No one should use PubSub directly!! + */ +export default class PubSubber { + private subscriptionTokens: Array = []; + + protected publish(event: string, data: any) { + PubSub.publish(event, data); + } + + protected publishNamespaced(namespace: string, event: string, data: any) { + this.publish(this.makeNamespace(namespace, event), data); + } + + protected subscribeNamespaced(namespace: string, event: string, fn: Function) { + this.subscribe(this.makeNamespace(namespace, event), fn); + } + + protected subscribe(event: string, fn: Function): void { + const token = PubSub.subscribe(event, fn); + this.subscriptionTokens.push(token); + } + + protected unsubscribeAll() { + this.subscriptionTokens.forEach(token => { + PubSub.unsubscribe(token); + }); + } + + private makeNamespace(namespace: string, event: string): string { + return `${event}--${namespace}`; + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 9e7d77d..6c67a6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -69,9 +69,13 @@ version "10.3.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.3.4.tgz#c74e8aec19e555df44609b8057311052a2c84d9e" -"@types/node@^10.5.1": - version "10.5.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.1.tgz#d578446f4abff5c0b49ade9b4e5274f6badaadfc" +"@types/node@^10.5.3": + version "10.5.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz#5bcfaf088ad17894232012877669634c06b20cc5" + +"@types/pubsub-js@^1.5.18": + version "1.5.18" + resolved "https://registry.yarnpkg.com/@types/pubsub-js/-/pubsub-js-1.5.18.tgz#dd12284c5e93b39874e62675702bf50c6f55e9ec" "@types/shelljs@0.7.8": version "0.7.8" @@ -86,6 +90,12 @@ dependencies: "@types/node" "*" +"@types/uuid@^3.4.3": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.3.tgz#121ace265f5569ce40f4f6d0ff78a338c732a754" + dependencies: + "@types/node" "*" + accepts@~1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" @@ -115,22 +125,20 @@ ansi-escape-sequences@^4.0.0: dependencies: array-back "^2.0.0" -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" @@ -169,10 +177,6 @@ array-back@^2.0.0: dependencies: typical "^2.6.1" -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -357,7 +361,7 @@ buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" -builtin-modules@^1.0.0: +builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -373,21 +377,10 @@ callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" @@ -414,16 +407,6 @@ chai@^4.0.0: pathval "^1.0.0" type-detect "^4.0.0" -chalk@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - chalk@^1.1.0, chalk@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -434,6 +417,14 @@ chalk@^1.1.0, chalk@^1.1.1: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -454,14 +445,20 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -clone-stats@~0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +color-convert@^1.9.0: + version "1.9.2" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + dependencies: + color-name "1.1.1" + +color-name@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" @@ -491,6 +488,10 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.12.1: + version "2.16.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" + commander@^2.9.0: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" @@ -527,7 +528,7 @@ core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -554,25 +555,12 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" dependencies: assert-plus "^1.0.0" -dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" @@ -589,7 +577,7 @@ debug@~3.1.0: dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -623,16 +611,10 @@ diff@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" -diff@^3.1.0: +diff@^3.1.0, diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -682,7 +664,7 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -690,6 +672,10 @@ esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -819,10 +805,6 @@ get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -853,7 +835,7 @@ glob@7.1.1, glob@^7.0.5, glob@^7.0.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0: +glob@^7.0.0, glob@^7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -880,26 +862,6 @@ growl@1.9.2: version "1.9.2" resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" -gulp-file@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/gulp-file/-/gulp-file-0.3.0.tgz#e8c4d763f126fb3332fc416e3d1ef46ed67d8d0d" - dependencies: - gulp-util "^2.2.14" - through2 "^0.4.1" - -gulp-util@^2.2.14: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - handlebars@^4.0.3: version "4.0.10" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" @@ -929,12 +891,6 @@ har-validator@~2.0.6: is-my-json-valid "^2.12.4" pinkie-promise "^2.0.0" -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -955,6 +911,10 @@ has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -992,12 +952,6 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -1009,7 +963,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.1: +inherits@2: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -1121,10 +1075,6 @@ is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - isarray@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -1205,6 +1155,13 @@ js-yaml@3.6.1: argparse "^1.0.7" esprima "^2.6.0" +js-yaml@^3.7.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -1289,53 +1246,14 @@ lodash._basecreate@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - lodash._isiterateecall@^3.0.0: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.create@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" @@ -1344,21 +1262,6 @@ lodash.create@3.1.1: lodash._basecreate "^3.0.0" lodash._isiterateecall "^3.0.0" -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -1367,12 +1270,6 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -1381,43 +1278,10 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - lodash.padend@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" - -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - dependencies: - lodash.keys "~2.4.1" - lodash@^4.17.5: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -1440,13 +1304,6 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lru-cache@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" @@ -1458,10 +1315,6 @@ make-error@^1.1.1: version "1.3.4" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - marked@^0.3.17: version "0.3.19" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" @@ -1476,21 +1329,6 @@ md5-o-matic@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-source-map@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.3.tgz#da1415f2722a5119db07b14c4f973410863a2abf" @@ -1535,14 +1373,10 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@1.2.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -1574,17 +1408,11 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -multipipe@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2: version "2.3.8" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" dependencies: @@ -1639,7 +1467,7 @@ oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -1647,10 +1475,6 @@ object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" -object-keys@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" - object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -1766,6 +1590,10 @@ pseudomap@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +pubsub-js@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/pubsub-js/-/pubsub-js-1.6.0.tgz#232d36485ce7905a54629ec5783d9f6f4c638026" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -1803,37 +1631,12 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@~1.0.17: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" dependencies: resolve "^1.1.6" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - reduce-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-1.0.1.tgz#258c78efd153ddf93cb561237f61184f3696e327" @@ -1904,7 +1707,7 @@ resolve-from@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" -resolve@^1.1.6: +resolve@^1.1.6, resolve@^1.3.2: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" dependencies: @@ -2083,20 +1886,10 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - stringstream@~0.0.4: version "0.0.6" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -2109,26 +1902,22 @@ strip-bom@^2.0.0: dependencies: is-utf8 "^0.2.0" -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - supports-color@3.1.2, supports-color@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" dependencies: has-flag "^1.0.0" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +supports-color@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + dependencies: + has-flag "^3.0.0" + table-layout@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-0.4.4.tgz#bc5398b2a05e58b67b05dd9238354b89ef27be0f" @@ -2156,20 +1945,6 @@ test-value@^2.1.0: array-back "^1.0.3" typical "^2.6.0" -through2@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" - dependencies: - readable-stream "~1.0.17" - xtend "~2.1.1" - -through2@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -2184,10 +1959,6 @@ tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -2205,6 +1976,33 @@ ts-node@^7.0.0: source-map-support "^0.5.6" yn "^2.0.0" +tslib@^1.8.0, tslib@^1.8.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + +tslint@^5.11.0: + version "5.11.0" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" + dependencies: + babel-code-frame "^6.22.0" + builtin-modules "^1.1.1" + chalk "^2.3.0" + commander "^2.12.1" + diff "^3.2.0" + glob "^7.1.1" + js-yaml "^3.7.0" + minimatch "^3.0.4" + resolve "^1.3.2" + semver "^5.3.0" + tslib "^1.8.0" + tsutils "^2.27.2" + +tsutils@^2.27.2: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + dependencies: + tslib "^1.8.1" + tunnel-agent@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -2290,6 +2088,10 @@ uuid@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -2305,12 +2107,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - dependencies: - clone-stats "~0.0.1" - which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" @@ -2379,16 +2175,6 @@ xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" -xtend@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" - dependencies: - object-keys "~0.4.0" - -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"