Hooking up the JS bridge to C++ and p2p messages.

This commit is contained in:
tihot_jk 2012-10-15 02:23:58 -07:00
parent 8397291ab1
commit b96a4b8f36
4 changed files with 133 additions and 59 deletions

View File

@ -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);
context.JK.MessageFactory = factory;
})(window, jQuery);

View File

@ -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);

View File

@ -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();

View File

@ -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();
})
</script>