2012-10-17 02:30:00 +00:00
|
|
|
// TODO: Rename? This is really only the websocket/messaging
|
|
|
|
|
// part of the server (none of the REST calls go through this).
|
|
|
|
|
// perhaps something like RealTimeMessages or something...
|
|
|
|
|
//
|
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 = {};
|
|
|
|
|
|
|
|
|
|
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) {
|
|
|
|
|
for(var i = server.dispatchTable.length; i--;) {
|
|
|
|
|
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
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
server.onOpen = function() {
|
2012-10-15 09:23:58 +00:00
|
|
|
logger.log("server.onOpen");
|
2012-09-28 08:20:43 +00:00
|
|
|
var token, loginMessage;
|
|
|
|
|
token = $.cookie("remember_token");
|
2012-10-15 09:23:58 +00:00
|
|
|
loginMessage = msg_factory.login_with_token(token);
|
2012-09-28 08:20:43 +00:00
|
|
|
server.send(loginMessage);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
server.onMessage = function(e) {
|
2012-10-15 09:23:58 +00:00
|
|
|
logger.log("server.onMessage");
|
2012-09-28 08:20:43 +00:00
|
|
|
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
|
|
|
|
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++) {
|
2012-10-16 08:44:33 +00:00
|
|
|
callbacks[i](message, payload);
|
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
|
|
|
|
|
|
|
|
if (context.jamClient !== undefined)
|
|
|
|
|
{
|
|
|
|
|
context.jamClient.connected = false;
|
|
|
|
|
}
|
2012-11-03 00:29:58 +00:00
|
|
|
|
2012-09-28 08:20:43 +00:00
|
|
|
// TODO: reconnect
|
|
|
|
|
};
|
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-02-09 22:20:25 +00:00
|
|
|
// make sure we're connected before sending
|
2013-02-10 06:58:00 +00:00
|
|
|
if (context.jamClient.connected === true) {
|
2013-02-09 22:20:25 +00:00
|
|
|
logger.log("server.send(" + jsMessage + ")");
|
|
|
|
|
if (server !== undefined && server.socket !== undefined && server.socket.send !== undefined) {
|
|
|
|
|
server.socket.send(jsMessage);
|
|
|
|
|
} else {
|
|
|
|
|
logger.log("Dropped message because server connection is closed.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
logger.log("Could not send " + jsMessage + " since we're not connected yet.");
|
|
|
|
|
}
|
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);
|
|
|
|
|
};
|
|
|
|
|
|
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;
|
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;
|
2012-10-15 09:23:58 +00:00
|
|
|
|
|
|
|
|
if (context.jamClient !== undefined)
|
|
|
|
|
{
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2012-10-29 00:37:59 +00:00
|
|
|
server.registerMessageCallback(context.JK.MessageType.USER_JOINED_MUSIC_SESSION, function(header, payload) {
|
|
|
|
|
context.JK.refreshMusicSession(payload.session_id);
|
|
|
|
|
});
|
2012-11-03 00:29:58 +00:00
|
|
|
|
2012-10-29 00:37:59 +00:00
|
|
|
// TODO: not used
|
2012-10-16 08:44:33 +00:00
|
|
|
server.registerMessageCallback(context.JK.MessageType.LOGIN_MUSIC_SESSION_ACK, function(header, payload) {
|
2012-10-15 09:23:58 +00:00
|
|
|
if (context.jamClient !== undefined)
|
|
|
|
|
{
|
|
|
|
|
// TODO: modify the LOGIN_MUSIC_SESSION_ACK message to include session_id
|
|
|
|
|
context.jamClient.JoinSession({ sessionID : payload.session_id});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Callbacks from jamClient
|
|
|
|
|
if (context.jamClient !== undefined)
|
|
|
|
|
{
|
|
|
|
|
context.jamClient.SendP2PMessage.connect(server.sendP2PMessage);
|
|
|
|
|
}
|
2012-09-28 08:20:43 +00:00
|
|
|
|
2012-10-14 15:48:56 +00:00
|
|
|
})(window, jQuery);
|