diff --git a/app/assets/javascripts/message_factory.js b/app/assets/javascripts/message_factory.js index 663943e97..d68109037 100644 --- a/app/assets/javascripts/message_factory.js +++ b/app/assets/javascripts/message_factory.js @@ -19,6 +19,8 @@ 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" }; @@ -32,6 +34,13 @@ return body; } + // ping the provided client_id + message_factory.ping = function(client_id) { + var data = {}; + var target = CLIENT_TARGET_PREFIX + client_id; + return client_container(msg.PING_REQUEST, target, data); + }; + // create a login message using user/pass message_factory.login_with_user_pass = function(username, password) { var login = { username : username , password : password }; diff --git a/app/assets/javascripts/messaging.js b/app/assets/javascripts/messaging.js index 44b0319d7..9688f7500 100644 --- a/app/assets/javascripts/messaging.js +++ b/app/assets/javascripts/messaging.js @@ -11,20 +11,54 @@ if ("undefined" === typeof(context.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 myClientId = null; + var myPingTimer = null; + var pingCount = 0; + var maxPings = 5; function logMessage(messageType, payload) { logger.debug(messageType + ": " + JSON.stringify(payload)); } + function pingMyself() { + if (!myClientId) + return; + pingCount++; + message = msg_factory.ping(myClientId); + server.send(message); + if (pingCount > maxPings) { + context.clearInterval(myPingTimer); + myPingTimer = null; + } + } + + function loggedIn(messageType, payload) { + logger.debug('Logged In handler: ' + messageType + ':' + JSON.stringify(payload)); + myClientId = payload.client_id; + myPingTimer = context.setInterval(pingMyself, 1000); + } + + function registerLoginPinger() { + logger.debug("registering login -> pinger"); + server.registerMessageCallback(messages.LOGIN_ACK, loggedIn); + } + /** * Register a simple console logger for all known message types. */ this.register = function() { - for (var msg in context.Messages) { - logger.debug("registering " + msg); - context.JamServer.registerMessageCallback(msg, logMessage); + for (var message in messages) { + logger.debug("registering " + message); + context.JamServer.registerMessageCallback(message, logMessage); } + + registerLoginPinger(); }; };