2012-09-28 08:20:43 +00:00
|
|
|
// The wrapper around the web-socket connection to the server
|
2012-10-14 15:48:56 +00:00
|
|
|
(function(context, $) {
|
2012-12-06 23:59:17 +00:00
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
2012-10-15 09:23:58 +00:00
|
|
|
context.JK = context.JK || {};
|
|
|
|
|
|
2012-10-14 15:48:56 +00:00
|
|
|
var logger = context.JK.logger;
|
2012-10-15 09:23:58 +00:00
|
|
|
var msg_factory = context.JK.MessageFactory;
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
// Let socket.io know where WebSocketMain.swf is
|
2012-12-06 23:59:17 +00:00
|
|
|
context.WEB_SOCKET_SWF_LOCATION = "assets/flash/WebSocketMain.swf";
|
2012-09-28 08:20:43 +00:00
|
|
|
|
2012-10-15 09:23:58 +00:00
|
|
|
var server = {};
|
2012-09-28 08:20:43 +00:00
|
|
|
server.socket = {};
|
2012-10-16 08:44:33 +00:00
|
|
|
server.signedIn = false;
|
|
|
|
|
server.clientID = "";
|
|
|
|
|
server.publicIP = "";
|
2012-09-28 08:20:43 +00:00
|
|
|
server.dispatchTable = {};
|
2013-09-01 17:36:07 +00:00
|
|
|
server.socketClosedListeners = [];
|
2013-09-01 16:28:03 +00:00
|
|
|
server.connected = false;
|
2012-09-28 08:20:43 +00:00
|
|
|
|
2013-09-01 16:28:03 +00:00
|
|
|
|
|
|
|
|
// handles logic if the websocket connection closes, and if it was in error then also prompt for reconnect
|
|
|
|
|
function closedCleanup(in_error) {
|
|
|
|
|
if(server.connected) {
|
|
|
|
|
server.connected = false;
|
2013-09-01 19:23:09 +00:00
|
|
|
|
|
|
|
|
context.JK.CurrentSessionModel.onWebsocketDisconnected(in_error);
|
2013-09-01 17:36:07 +00:00
|
|
|
|
|
|
|
|
// notify anyone listening that the socket closed
|
|
|
|
|
var len = server.socketClosedListeners.length;
|
|
|
|
|
for(var i = 0; i < len; i++) {
|
|
|
|
|
try {
|
|
|
|
|
server.socketClosedListeners[i](in_error);
|
|
|
|
|
} catch (ex) {
|
|
|
|
|
logger.warn('exception in callback for websocket closed event:' + ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-09-01 16:28:03 +00:00
|
|
|
}
|
|
|
|
|
}
|
2013-09-01 17:36:07 +00:00
|
|
|
|
|
|
|
|
server.registerOnSocketClosed = function(callback) {
|
|
|
|
|
server.socketClosedListeners.push(callback);
|
|
|
|
|
}
|
|
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
server.registerMessageCallback = function(messageType, callback) {
|
|
|
|
|
if (server.dispatchTable[messageType] === undefined) {
|
|
|
|
|
server.dispatchTable[messageType] = [];
|
|
|
|
|
}
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
server.dispatchTable[messageType].push(callback);
|
|
|
|
|
};
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
server.unregisterMessageCallback = function(messageType, callback) {
|
|
|
|
|
if (server.dispatchTable[messageType] !== undefined) {
|
2013-03-02 19:02:42 +00:00
|
|
|
for(var i = server.dispatchTable[messageType].length; i--;) {
|
2012-09-28 08:20:43 +00:00
|
|
|
if (server.dispatchTable[messageType][i] === callback)
|
|
|
|
|
{
|
|
|
|
|
server.dispatchTable[messageType].splice(i, 1);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2012-10-14 15:48:56 +00:00
|
|
|
|
|
|
|
|
if (server.dispatchTable[messageType].length === 0) {
|
2012-09-28 08:20:43 +00:00
|
|
|
delete server.dispatchTable[messageType];
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
server.connect = function() {
|
2012-10-15 09:23:58 +00:00
|
|
|
logger.log("server.connect");
|
2012-12-09 01:54:07 +00:00
|
|
|
var uri = context.JK.websocket_gateway_uri; // Set in index.html.erb.
|
|
|
|
|
//var uri = context.gon.websocket_gateway_uri; // Leaving here for now, as we're looking for a better solution.
|
2012-12-06 23:59:17 +00:00
|
|
|
server.socket = new context.WebSocket(uri);
|
2012-09-28 08:20:43 +00:00
|
|
|
server.socket.onopen = server.onOpen;
|
|
|
|
|
server.socket.onmessage = server.onMessage;
|
|
|
|
|
server.socket.onclose = server.onClose;
|
|
|
|
|
};
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2013-09-01 02:24:47 +00:00
|
|
|
server.close = function(in_error) {
|
2013-09-01 02:18:23 +00:00
|
|
|
logger.log("closing websocket");
|
|
|
|
|
|
|
|
|
|
server.socket.close();
|
|
|
|
|
|
2013-09-01 16:28:03 +00:00
|
|
|
closedCleanup(in_error);
|
2013-09-01 02:18:23 +00:00
|
|
|
}
|
2013-09-01 16:28:03 +00:00
|
|
|
|
2013-02-28 15:44:34 +00:00
|
|
|
server.rememberLogin = function() {
|
2012-09-28 08:20:43 +00:00
|
|
|
var token, loginMessage;
|
|
|
|
|
token = $.cookie("remember_token");
|
2013-08-07 15:39:34 +00:00
|
|
|
loginMessage = msg_factory.login_with_token(token, null);
|
2012-09-28 08:20:43 +00:00
|
|
|
server.send(loginMessage);
|
2013-03-08 15:34:05 +00:00
|
|
|
};
|
|
|
|
|
|
2013-02-28 15:44:34 +00:00
|
|
|
server.onOpen = function() {
|
|
|
|
|
logger.log("server.onOpen");
|
2013-03-08 15:34:05 +00:00
|
|
|
server.rememberLogin();
|
2012-09-28 08:20:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
server.onMessage = function(e) {
|
|
|
|
|
var message = JSON.parse(e.data),
|
2012-10-14 15:48:56 +00:00
|
|
|
messageType = message.type.toLowerCase(),
|
|
|
|
|
payload = message[messageType],
|
2012-09-28 08:20:43 +00:00
|
|
|
callbacks = server.dispatchTable[message.type];
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2013-11-16 04:35:40 +00:00
|
|
|
if(message.type != context.JK.MessageType.HEARTBEAT_ACK) {
|
|
|
|
|
logger.log("server.onMessage:" + messageType + " payload:" + JSON.stringify(payload));
|
|
|
|
|
}
|
2013-03-08 15:34:05 +00:00
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
if (callbacks !== undefined) {
|
2012-10-15 09:23:58 +00:00
|
|
|
var len = callbacks.length;
|
|
|
|
|
for(var i = 0; i < len; i++) {
|
2013-02-26 04:32:02 +00:00
|
|
|
try {
|
|
|
|
|
callbacks[i](message, payload);
|
|
|
|
|
} catch (ex) {
|
|
|
|
|
logger.warn('exception in callback for websocket message:' + ex);
|
2013-11-03 20:55:55 +00:00
|
|
|
throw ex;
|
2013-02-26 04:32:02 +00:00
|
|
|
}
|
2012-09-28 08:20:43 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
2012-10-14 15:48:56 +00:00
|
|
|
logger.log("Unexpected message type %s.", message.type);
|
2012-09-28 08:20:43 +00:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
server.onClose = function() {
|
2012-10-14 15:48:56 +00:00
|
|
|
logger.log("Socket to server closed.");
|
2012-10-15 09:23:58 +00:00
|
|
|
|
2013-09-01 16:28:03 +00:00
|
|
|
closedCleanup(true);
|
2012-09-28 08:20:43 +00:00
|
|
|
};
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
server.send = function(message) {
|
2013-02-09 22:20:25 +00:00
|
|
|
|
2012-10-14 15:48:56 +00:00
|
|
|
var jsMessage = JSON.stringify(message);
|
2012-10-15 09:23:58 +00:00
|
|
|
|
2013-11-16 04:35:40 +00:00
|
|
|
if(message.type != context.JK.MessageType.HEARTBEAT) {
|
|
|
|
|
logger.log("server.send(" + jsMessage + ")");
|
|
|
|
|
}
|
2013-02-13 05:30:07 +00:00
|
|
|
if (server !== undefined && server.socket !== undefined && server.socket.send !== undefined) {
|
|
|
|
|
server.socket.send(jsMessage);
|
|
|
|
|
} else {
|
|
|
|
|
logger.log("Dropped message because server connection is closed.");
|
2013-02-09 22:20:25 +00:00
|
|
|
}
|
2012-09-28 08:20:43 +00:00
|
|
|
};
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
server.loginSession = function(sessionId) {
|
|
|
|
|
var loginMessage;
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2012-12-06 23:59:17 +00:00
|
|
|
if (!server.signedIn) {
|
2012-10-14 15:48:56 +00:00
|
|
|
logger.log("Not signed in!");
|
2012-09-28 08:20:43 +00:00
|
|
|
// TODO: surface the error
|
|
|
|
|
return;
|
|
|
|
|
}
|
2012-10-14 15:48:56 +00:00
|
|
|
|
2012-10-15 09:23:58 +00:00
|
|
|
loginMessage = msg_factory.login_jam_session(sessionId);
|
2012-09-28 08:20:43 +00:00
|
|
|
server.send(loginMessage);
|
|
|
|
|
};
|
|
|
|
|
|
2013-11-03 20:55:55 +00:00
|
|
|
/** with the advent of the reliable UDP channel, this is no longer how messages are sent from client-to-clent
|
|
|
|
|
* however, the mechanism still exists and is useful in test contexts; and maybe in the future
|
|
|
|
|
* @param receiver_id client ID of message to send
|
|
|
|
|
* @param message the actual message
|
|
|
|
|
*/
|
2012-10-15 09:23:58 +00:00
|
|
|
server.sendP2PMessage = function(receiver_id, message) {
|
|
|
|
|
logger.log("P2P message from [" + server.clientID + "] to [" + receiver_id + "]: " + message);
|
|
|
|
|
var outgoing_msg = msg_factory.client_p2p_message(server.clientID, receiver_id, message);
|
|
|
|
|
server.send(outgoing_msg);
|
|
|
|
|
};
|
2012-11-03 00:29:58 +00:00
|
|
|
|
2012-10-15 09:23:58 +00:00
|
|
|
context.JK.JamServer = server;
|
|
|
|
|
|
|
|
|
|
// Message callbacks
|
2012-11-03 00:29:58 +00:00
|
|
|
server.registerMessageCallback(context.JK.MessageType.LOGIN_ACK, function(header, payload) {
|
|
|
|
|
server.signedIn = true;
|
2013-03-08 15:34:05 +00:00
|
|
|
logger.debug("Handling LOGIN_ACK. Updating client id to " + payload.client_id);
|
2012-10-15 09:23:58 +00:00
|
|
|
server.clientID = payload.client_id;
|
2012-10-16 08:44:33 +00:00
|
|
|
server.publicIP = payload.public_ip;
|
2013-09-01 16:28:03 +00:00
|
|
|
server.connected = true;
|
2012-10-15 09:23:58 +00:00
|
|
|
|
|
|
|
|
if (context.jamClient !== undefined)
|
|
|
|
|
{
|
2013-03-08 15:34:05 +00:00
|
|
|
logger.debug("... (handling LOGIN_ACK) Updating backend client, connected to true and clientID to " +
|
2013-02-26 03:54:09 +00:00
|
|
|
payload.client_id);
|
2012-10-15 09:23:58 +00:00
|
|
|
context.jamClient.connected = true;
|
|
|
|
|
context.jamClient.clientID = server.clientID;
|
|
|
|
|
}
|
|
|
|
|
});
|
2012-11-03 00:29:58 +00:00
|
|
|
|
2012-10-16 08:44:33 +00:00
|
|
|
server.registerMessageCallback(context.JK.MessageType.PEER_MESSAGE, function(header, payload) {
|
2012-10-15 09:23:58 +00:00
|
|
|
if (context.jamClient !== undefined)
|
|
|
|
|
{
|
2012-10-16 08:44:33 +00:00
|
|
|
context.jamClient.P2PMessageReceived(header.from, payload.message);
|
2012-10-15 09:23:58 +00:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Callbacks from jamClient
|
|
|
|
|
if (context.jamClient !== undefined)
|
|
|
|
|
{
|
|
|
|
|
context.jamClient.SendP2PMessage.connect(server.sendP2PMessage);
|
|
|
|
|
}
|
2012-09-28 08:20:43 +00:00
|
|
|
|
2013-02-10 18:51:37 +00:00
|
|
|
|
2013-11-03 20:55:55 +00:00
|
|
|
|
2012-10-14 15:48:56 +00:00
|
|
|
})(window, jQuery);
|