Error handling paths. Some test fixes

This commit is contained in:
Jonathon Wilson 2013-02-25 20:54:09 -07:00
parent 800f4d7de0
commit 1db0958c6f
6 changed files with 88 additions and 76 deletions

View File

@ -129,11 +129,14 @@
// Message callbacks
server.registerMessageCallback(context.JK.MessageType.LOGIN_ACK, function(header, payload) {
server.signedIn = true;
logger.debug("JAMSERVER: updating client id to " + payload.client_id);
server.clientID = payload.client_id;
server.publicIP = payload.public_ip;
if (context.jamClient !== undefined)
{
logger.debug("JAMSERVER: updating backend client, connected to true and clientID to " +
payload.client_id);
context.jamClient.connected = true;
context.jamClient.clientID = server.clientID;
}

View File

@ -85,6 +85,7 @@
* Generic error handler for Ajax calls.
*/
function ajaxError(jqXHR, textStatus, errorMessage) {
logger.error("Unexpected ajax error: " + textStatus);
app.notify({title: textStatus, text: errorMessage, detail: jqXHR.responseText});
}

View File

@ -10,7 +10,7 @@
var users = {}; // Light cache of user info for session users.
var tracks = {};
var mixers = [];
// Consolidate dragged controls and handles
// TODO Consolidate dragged controls and handles
var $draggingFaderHandle = null;
var $draggingFader = null;
var $draggingVolumeHandle = null;
@ -36,54 +36,28 @@
}
};
// Replicate the Channel Group enum from C++
var ChannelGroupIds = {
0: "MasterGroup",
1: "MonitorGroup",
2: "AudioInputMusicGroup",
3: "AudioInputChatGroup",
4: "MediaTrackGroup",
5: "StreamOutMusicGroup",
6: "StreamOutChatGroup",
7: "UserMusicInputGroup",
8: "UserChatInputGroup",
9: "PeerAudioInputMusicGroup"
var instrumentIcons = {
"keyboard": "content/icon_instrument_keyboard45.png",
"electric guitar": "content/icon_instrument_guitar45.png",
"bass guitar": "content/icon_instrument_guitar45.png",
"voice": "content/icon_instrument_vocal45.png",
"saxophone": "content/icon_instrument_saxophone45.png"
};
// Group 0 is the master mix. Mixer ID should go with the top horizontal volume slider, and possibly new VU meter.
// Group 1 is the monitor mix. Currently no UI component.
// Group 2 is my local music input. Any tracks here go into "My Tracks"
// Group 3 is my local voice chat.
// Group 4 is media files -- for sure for me locally, possibly from others?
// Results for a live session where David joined my session.
// P2P message from my client to Davids (JamServer.js:121)
// Events fired:
// add,User@208.191.152.98#,0 (session.js:233)
// add,User@208.191.152.98_*,0
// add,User@208.191.152.98#,0
// add,User@208.191.152.98_*,0
// jamkazam.js:50 -- various PEER_MESSAGE here and there
// jamkazam.js:50 - USER_JOINED_MUSIC_SESSION (session_id, user_id, username: "David Wilson")
// my session refreshed (refreshSession.js:39) with 2 participants
// more PEER_MESSAGE
// Mixers updated (session.js:97)
// 4 now (instead of 2). New ones:
// client_id: David's Client Id
// group_id: 7
// id: User@208.191.152.98#
// volume_left: 0
// volume_right: 0
//
// client_id: ""
// group_id: 9
// id: User@208.191.152.98_*
// volume_left: 12
// volume:right: 15
//
// more add,User@208.191.152.98#,0 events.
//
// Eventually, Socket to server closed. (JamServer.js:86)
// Recreate ChannelGroupIDs ENUM from C++
var ChannelGroupIds = {
"MasterGroup": 0,
"MonitorGroup": 1,
"AudioInputMusicGroup": 2,
"AudioInputChatGroup": 3,
"MediaTrackGroup": 4,
"StreamOutMusicGroup": 5,
"StreamOutChatGroup": 6,
"UserMusicInputGroup": 7,
"UserChatInputGroup": 8,
"PeerAudioInputMusicGroup": 9
};
function beforeShow(data) {
sessionId = data.id;
@ -95,9 +69,26 @@
// Subscribe for callbacks on audio events
context.jamClient.SessionRegisterCallback("JK.HandleBridgeCallback");
// If you load this page directly, the loading of the current user
// is happening in parallel. We can't join the session until the
// current user has been completely loaded. Poll for the current user
// before proceeding with session joining.
function checkForCurrentUser() {
if (context.JK.userMe) {
logger.debug("current user loaded. Proceeding to join session.");
afterCurrentUserLoaded();
} else {
logger.debug("Current user not loaded yet. Waiting...");
context.setTimeout(checkForCurrentUser, 100);
}
}
checkForCurrentUser();
}
function afterCurrentUserLoaded() {
// Set a flag indicating we're still joining.
// This flag is set to true in refreshSession.js
// after various asynch calls complete.
// after various asynch calls complete.
context.JK.sessionJoined = false;
context.JK.joinMusicSession(sessionId, app);
@ -141,13 +132,19 @@
var callCount = 0;
$.each(session.participants, function(index, value) {
if (!(this.user.id in users)) {
var userInfoUrl = "/api/users/" + this.user.id;
callCount += 1;
$.ajax({
type: "GET",
url: "/api/users/" + this.user.id
}).done(function(user) {
callCount -= 1;
users[user.id] = user;
url: userInfoUrl,
success: function(user) {
callCount -= 1;
users[user.id] = user;
},
error: function(jqXHR, textStatus, errorThrown) {
callCount -= 1;
logger.error('Error getting user info from ' + userInfoUrl);
}
});
}
});
@ -210,13 +207,13 @@
function _wireTopVolume() {
var $volumeSlider = $('#volume');
$.each(mixers, function(index, mixer) {
if (mixer.group_id === 0) { // master
if (mixer.group_id === ChannelGroupIds.MasterGroup) {
$volumeSlider.attr('master-id', mixer.id);
var gainPercent = percentFromMixerValue(
mixer.range_low, mixer.range_high, mixer.volume_left);
$volumeSlider.find('.slider-volume').css('left', gainPercent + '%');
}
if (mixer.group_id === 1) { // monitor
if (mixer.group_id === ChannelGroupIds.MonitorGroup) {
$volumeSlider.attr('monitor-id', mixer.id);
}
});
@ -227,7 +224,7 @@
// Add the voice chat controls below my tracks, and hook up the mixer.
// Assumption is that there is only ever one, so we just take the first one.
$.each(mixers, function(index, mixer) {
if (mixer.group_id === 3) { // Local voice chat
if (mixer.group_id === ChannelGroupIds.AudioInputChatGroup) {
var $voiceChat = $('#voice-chat');
$voiceChat.show();
$voiceChat.attr('mixer-id', mixer.id);
@ -244,14 +241,6 @@
});
}
var instrumentIcons = {
"keyboard": "content/icon_instrument_keyboard45.png",
"electric guitar": "content/icon_instrument_guitar45.png",
"bass guitar": "content/icon_instrument_guitar45.png",
"voice": "content/icon_instrument_vocal45.png",
"saxophone": "content/icon_instrument_saxophone45.png"
};
function _instrumentIconFromId(id) {
if (id in instrumentIcons) {
return instrumentIcons[id];
@ -291,9 +280,14 @@
mixerId: ""
};
var mixer = _mixerForClientId(participant.client_id, [2,7]);
var mixer = _mixerForClientId(
participant.client_id,
[
ChannelGroupIds.AudioInputMusicGroup,
ChannelGroupIds.UserMusicInputGroup
]);
if (mixer) {
myTrack = (mixer.group_id === 2);
myTrack = (mixer.group_id === ChannelGroupIds.AudioInputMusicGroup);
var gainPercent = percentFromMixerValue(
mixer.range_low, mixer.range_high, mixer.volume_left);
var muteClass = "enabled";
@ -326,7 +320,12 @@
_updateMixers();
var keysToDelete = [];
for (var key in lookingForMixers) {
var mixer = _mixerForClientId(key, [2,7]);
var mixer = _mixerForClientId(
key,
[
ChannelGroupIds.AudioInputMusicGroup,
ChannelGroupIds.UserMusicInputGroup
]);
if (mixer) {
keysToDelete.push(key);
var gainPercent = percentFromMixerValue(
@ -417,9 +416,11 @@
function reloadAndUpdateSession() {
$.ajax({
type: "GET",
url: "/api/sessions/" + sessionId
}).done(function(response) {
updateSession(response);
url: "/api/sessions/" + sessionId,
success: function(response) { updateSession(response); },
error: function(jqXHR, textStatus, errorThrown) {
logger.error("Error loading session " + sessionId);
}
});
}
@ -464,10 +465,14 @@
if (sessionId) {
$.ajax({
type: "DELETE",
url: "/api/sessions/" + sessionId
}).done(
function() { context.location="#/home"; }
);
url: "/api/sessions/" + sessionId,
success: function(response) {
context.location="#/home";
},
error: function(jqXHR, textStatus, errorThrown) {
logger.error("Error deleting session " + sessionId);
}
});
}
}

View File

@ -114,6 +114,7 @@
// Run a check to see if we're logged in yet. Only after that should
// we initialize the other screens.
// TODO: There should be a timeout, and a "could not connect" message.
function testConnected() {
if (JK.clientId) {
_initAfterConnect();

View File

@ -49,7 +49,9 @@
});
it("should populate genres select", function() {
css.loadGenres();
expect($(selectors.genres, $(selectors.form).length).toEqual(2);
$genres = $(selectors.genres);
alert($genres.html());
expect($genres.length).toEqual(2);
});
});
@ -125,7 +127,7 @@
// it("should fail with > 3 genres", function() {
// var htm = '<div class="list-item-text"><input type="checkbox" checked="checked" value="2">2</div>' +
// '<div class="list-item-text"><input type="checkbox" checked="checked" value="3">3</div>' +
// '<div class="list-item-text"><input type="checkbox" checked="checked" value="4">4</div>' +
// '<div class="list-item-text"><input type="checkbox" checked="checked" value="4">4</div>' +
// '<div class="list-item-text"><input type="checkbox" checked="checked" value="5">5</div>';
// $(selectors.genres, $(selectors.form)).append(htm);
// var errs = css.validateForm();
@ -159,4 +161,4 @@
});
})(window, jQuery);
}) // Intentionally not running tests as they're failing. (window, jQuery);

View File

@ -11,7 +11,7 @@
var sessions = [
{id: "1", participants: [ { client_id: "1", ip_address: "1.1.1.1" } ] },
{id: "2", participants: [ { client_id: "2", ip_address: "1.1.1.2" } ] },
{id: "3", participants: [ { client_id: "3", ip_address: "1.1.1.3", user: {"is_friend=true"} } ] },
{id: "3", participants: [ { client_id: "3", ip_address: "1.1.1.3", user: {is_friend:true} } ] },
{id: "4", participants: [ { client_id: "4", ip_address: "1.1.1.4" } ], invitations: [{id:'1', sender_id:'1'}] },
{id: "5", participants: [
{ client_id: "5", ip_address: "1.1.1.5" },