define([ 'socket', 'js/system/events' ], function ( io, events ) { let client = { doneConnect: false, init: function (onReady) { this.socket = io({ transports: ['websocket'] }); this.socket.on('connect', this.onConnected.bind(this, onReady)); this.socket.on('handshake', this.onHandshake.bind(this)); this.socket.on('event', this.onEvent.bind(this)); this.socket.on('events', this.onEvents.bind(this)); this.socket.on('dc', this.onDisconnect.bind(this)); }, onConnected: function (onReady) { if (this.doneConnect) this.onDisconnect(); else this.doneConnect = true; if (onReady) onReady(); }, onDisconnect: function () { window.location = window.location; }, onHandshake: function () { events.emit('onHandshake'); this.socket.emit('handshake'); }, request: function (msg) { this.socket.emit('request', msg, msg.callback); }, onEvent: function (response) { events.emit(response.event, response.data); }, onEvents: function (response) { //If we get objects, self needs to be first // otherwise we might create the object (setting his position or attack animation) // before instantiating it let oList = response.onGetObject; if (oList) { let prepend = oList.filter(o => o.self); oList.spliceWhere(o => prepend.some(p => p === o)); oList.unshift.apply(oList, prepend); } for (let e in response) { let r = response[e]; //Certain messages expect to be performed last (because the object they act on hasn't been created when they get queued) r.sort(function (a, b) { if (a.performLast) return 1; else if (b.performLast) return -1; return 0; }); r.forEach(function (o) { events.emit(e, o); }); } } }; return client; });