diff --git a/app/assets/javascripts/AAB_message_factory.js b/app/assets/javascripts/AAB_message_factory.js index d68109037..b3aaaeefe 100644 --- a/app/assets/javascripts/AAB_message_factory.js +++ b/app/assets/javascripts/AAB_message_factory.js @@ -1,31 +1,35 @@ /* Message builder for communicating over the websocket */ -(function(context) { +(function(context, $) { - var CLIENT_TARGET = "client"; - var SERVER_TARGET = "server"; - var SESSION_TARGET_PREFIX = "session:"; - var USER_TARGET_PREFIX = "user:"; - var CLIENT_TARGET_PREFIX = "client:"; + context.JK = context.JK || {}; - var msg = context.Messages = { - LOGIN : "LOGIN", - LOGIN_ACK : "LOGIN_ACK", - LOGIN_MUSIC_SESSION : "LOGIN_MUSIC_SESSION", - LOGIN_MUSIC_SESSION_ACK : "LOGIN_MUSIC_SESSION_ACK", + var msg = context.JK.MessageType = { + LOGIN : "LOGIN", + LOGIN_ACK : "LOGIN_ACK", + LOGIN_MUSIC_SESSION : "LOGIN_MUSIC_SESSION", + LOGIN_MUSIC_SESSION_ACK : "LOGIN_MUSIC_SESSION_ACK", USER_JOINED_MUSIC_SESSION : "USER_JOINED_MUSIC_SESSION", - LEAVE_MUSIC_SESSION : "LEAVE_MUSIC_SESSION", - LEAVE_MUSIC_SESSION_ACK : "LEAVE_MUSIC_SESSION_ACK", - HEARTBEAT : "HEARTBEAT", - TEST_SESSION_MESSAGE : "TEST_SESSION_MESSAGE", - PING_REQUEST: "PING_REQUEST", - PING_ACK: "PING_ACK", - SERVER_GENERIC_ERROR : "SERVER_GENERIC_ERROR", - SERVER_REJECTION_ERROR : "SERVER_REJECTION_ERROR" + LEAVE_MUSIC_SESSION : "LEAVE_MUSIC_SESSION", + LEAVE_MUSIC_SESSION_ACK : "LEAVE_MUSIC_SESSION_ACK", + HEARTBEAT : "HEARTBEAT", + TEST_SESSION_MESSAGE : "TEST_SESSION_MESSAGE", + PING_REQUEST : "PING_REQUEST", + PING_ACK : "PING_ACK", + PEER_MESSAGE : "PEER_MESSAGE", + SERVER_GENERIC_ERROR : "SERVER_GENERIC_ERROR", + SERVER_REJECTION_ERROR : "SERVER_REJECTION_ERROR" }; - var message_factory = {}; + var route_to = context.JK.RouteToPrefix = { + CLIENT : "client", + SESSION : "session", + SERVER : "server", + USER : "user" + }; + + var factory = {}; function client_container(type, target, inner) { var type_field = type.toLowerCase(); @@ -34,31 +38,46 @@ return body; } + function route_to_client(client_id) { + return route_to.CLIENT + ":" + client_id; + } + + function route_to_session(session_id) { + return route_to.SESSION + ":" + session_id; + } + // ping the provided client_id - message_factory.ping = function(client_id) { + factory.ping = function(client_id) { var data = {}; - var target = CLIENT_TARGET_PREFIX + client_id; - return client_container(msg.PING_REQUEST, target, data); + return client_container(msg.PING_REQUEST, route_to_client(client_id), data); }; // create a login message using user/pass - message_factory.login_with_user_pass = function(username, password) { + factory.login_with_user_pass = function(username, password) { var login = { username : username , password : password }; - return client_container(msg.LOGIN, SERVER_TARGET, login); + return client_container(msg.LOGIN, route_to.SERVER, login); }; // create a login message using token (a cookie or similiar) - message_factory.login_with_token = function(token) { + factory.login_with_token = function(token) { var login = { token : token }; - return client_container(msg.LOGIN, SERVER_TARGET, login); + return client_container(msg.LOGIN, route_to.SERVER, login); }; // create a music session login message - message_factory.login_music_session = function(music_session) { - var login_music_session = { music_session : music_session }; - return client_container(msg.LOGIN_MUSIC_SESSION, SERVER_TARGET, login_music_session); + factory.login_music_session = function(music_session) { + var login_music_session = { music_session : music_session }; + return client_container(msg.LOGIN_MUSIC_SESSION, route_to.SERVER, login_music_session); }; - window.message_factory = message_factory; + // client-to-client message + factory.client_p2p_message = function(sender_client_id, receiver_client_id, message) { + var peer_message = { "message" : message }; + var result = client_container(msg.PEER_MESSAGE, route_to_client(receiver_client_id), peer_message); + result.from = sender_client_id; + return result; + }; -})(window); \ No newline at end of file + context.JK.MessageFactory = factory; + +})(window, jQuery); \ No newline at end of file diff --git a/app/assets/javascripts/JamServer.js b/app/assets/javascripts/JamServer.js index 25230ef25..c5f5889a3 100644 --- a/app/assets/javascripts/JamServer.js +++ b/app/assets/javascripts/JamServer.js @@ -1,18 +1,18 @@ // The wrapper around the web-socket connection to the server (function(context, $) { - var server = {}; + context.JK = context.JK || {}; + var logger = context.JK.logger; + var msg_factory = context.JK.MessageFactory; // Let socket.io know where WebSocketMain.swf is WEB_SOCKET_SWF_LOCATION = "assets/flash/WebSocketMain.swf"; + var server = {}; server.socket = {}; server.singedIn = false; server.dispatchTable = {}; - // TODO: Create the message factory here - //server.messageFactory = context.message_factory; - server.registerMessageCallback = function(messageType, callback) { if (server.dispatchTable[messageType] === undefined) { server.dispatchTable[messageType] = []; @@ -38,11 +38,7 @@ }; server.connect = function() { - server.registerMessageCallback( - context.Messages.LOGIN_ACK, - function() { server.signedIn = true; } - ); - + logger.log("server.connect"); server.socket = new WebSocket(gon.websocket_gateway_uri); server.socket.onopen = server.onOpen; server.socket.onmessage = server.onMessage; @@ -50,24 +46,23 @@ }; server.onOpen = function() { - logger.log('server.onOpen'); + logger.log("server.onOpen"); var token, loginMessage; - token = $.cookie("remember_token"); - loginMessage = context.message_factory.login_with_token(token); - + loginMessage = msg_factory.login_with_token(token); server.send(loginMessage); }; server.onMessage = function(e) { - logger.log('server.onMessage'); + logger.log("server.onMessage"); var message = JSON.parse(e.data), messageType = message.type.toLowerCase(), payload = message[messageType], callbacks = server.dispatchTable[message.type]; if (callbacks !== undefined) { - for(var i = callbacks.length; i--;) { + var len = callbacks.length; + for(var i = 0; i < len; i++) { callbacks[i](messageType, payload); } } @@ -78,13 +73,24 @@ server.onClose = function() { logger.log("Socket to server closed."); + + if (context.jamClient !== undefined) + { + context.jamClient.connected = false; + } + // TODO: reconnect }; server.send = function(message) { var jsMessage = JSON.stringify(message); - logger.log('server.send(' + jsMessage + ')'); - server.socket.send(jsMessage); + 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."); + } + }; server.loginSession = function(sessionId) { @@ -96,10 +102,49 @@ return; } - loginMessage = context.message_factory.login_jam_session(sessionId); + loginMessage = msg_factory.login_jam_session(sessionId); server.send(loginMessage); }; - context.JamServer = server; + 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); + }; + + context.JK.JamServer = server; + + // Message callbacks + server.registerMessageCallback(context.JK.MessageType.LOGIN_ACK, function(type, payload) { + server.signedIn = true; + server.clientID = payload.client_id; + + if (context.jamClient !== undefined) + { + context.jamClient.connected = true; + context.jamClient.clientID = server.clientID; + } + }); + + server.registerMessageCallback(context.JK.MessageType.PEER_MESSAGE, function(type, payload) { + if (context.jamClient !== undefined) + { + context.jamClient.P2PMessageReceived(payload.sender_id, payload.message); + } + }); + + server.registerMessageCallback(context.JK.MessageType.LOGIN_MUSIC_SESSION_ACK, function(type, payload) { + 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); + } })(window, jQuery); \ No newline at end of file diff --git a/app/assets/javascripts/messaging.js b/app/assets/javascripts/messaging.js index 9688f7500..3e3a6f220 100644 --- a/app/assets/javascripts/messaging.js +++ b/app/assets/javascripts/messaging.js @@ -8,14 +8,14 @@ context.JK = context.JK || {}; context.JK.Messaging = function(app) { - if ("undefined" === typeof(context.JamServer)) + if ("undefined" === typeof(context.JK.JamServer)) return; // Alias some of the globals for less typing. var logger = context.JK.logger; - var server = context.JamServer; - var messages = context.Messages; - var msg_factory = context.message_factory; + var server = context.JK.JamServer; + var messages = context.JK.MessageType; + var msg_factory = context.JK.MessageFactory; var myClientId = null; var myPingTimer = null; @@ -55,7 +55,7 @@ this.register = function() { for (var message in messages) { logger.debug("registering " + message); - context.JamServer.registerMessageCallback(message, logMessage); + server.registerMessageCallback(message, logMessage); } registerLoginPinger(); diff --git a/app/views/clients/index.html.erb b/app/views/clients/index.html.erb index 8f5789e41..6abba08fe 100644 --- a/app/views/clients/index.html.erb +++ b/app/views/clients/index.html.erb @@ -451,10 +451,20 @@ var sessionScreen = new JK.SessionScreen(jk); sessionScreen.initialize(); - var messaging = new JK.Messaging(jk); - messaging.register(); + // Disabled for now to debug p2p messaging + //var messaging = new JK.Messaging(jk); + //messaging.register(); - window.JamServer.connect(); + var jam_server = JK.JamServer; + + if (jamClient !== undefined) { + jam_server.registerMessageCallback(JK.MessageType.LOGIN_ACK, function(type, payload) { + // This is just a test to kick off sending a few messages to self + jamClient.JoinSession({ sessionID : 'just a test'}); + }); + } + + jam_server.connect(); })