Index: lams_learning/web/includes/javascript/presence.js =================================================================== diff -u -rc0afa34ef8004a73b35f396bfb30285043ebce31 -r9496ff3ffe5e98272f7939a2cf4e8c6dbb2901f7 --- lams_learning/web/includes/javascript/presence.js (.../presence.js) (revision c0afa34ef8004a73b35f396bfb30285043ebce31) +++ lams_learning/web/includes/javascript/presence.js (.../presence.js) (revision 9496ff3ffe5e98272f7939a2cf4e8c6dbb2901f7) @@ -89,95 +89,68 @@ $("#presenceUserCount").html(labelUsers + " (" + users.length + ")"); } }, - - presenceWebsocketInitTime = Date.now(), - // init the connection with server using server URL but with different protocol - presenceWebsocket = new WebSocket(APP_URL.replace('http', 'ws') + 'presenceChatWebsocket?lessonID=' + lessonId), - presenceWebsocketPingTimeout = null, - presenceWebsocketPingFunc = null; - - presenceWebsocket.onclose = function(e){ - // react only on abnormal close - if (e.code === 1006 && - Date.now() - presenceWebsocketInitTime > 1000) { - location.reload(); - } - }; - - presenceWebsocketPingFunc = function(skipPing){ - if (presenceWebsocket.readyState == presenceWebsocket.CLOSING || presenceWebsocket.readyState == presenceWebsocket.CLOSED) { - return; - } - - // check and ping every 3 minutes - presenceWebsocketPingTimeout = setTimeout(presenceWebsocketPingFunc, 3*60*1000); - // initial set up does not send ping - if (!skipPing) { - presenceWebsocket.send("ping"); - } - }; - // set up timer for the first time - presenceWebsocketPingFunc(true); - + presenceWebsocket = initWebsocket('presence' + lessonId, + APP_URL.replace('http', 'ws') + 'presenceChatWebsocket?lessonID=' + lessonId); - // when the server pushes new messages and roster to the learner's browser - presenceWebsocket.onmessage = function(e){ - // reset ping timer - clearTimeout(presenceWebsocketPingTimeout); - presenceWebsocketPingFunc(true); - - // create JSON object - var input = JSON.parse(e.data); - if (input.roster) { - roster.updateDisplay(input.roster); - } - - if (input.messages) { - var activeNick = getUserFromTabIndex(presenceChatTabs.tabs('option','active')), - selectedTabTag = nickToTag(activeNick); - - jQuery.each(input.messages, function(){ - // which tab are we talking about? - var from = this.to ? (this.from == nickname ? this.to : this.from) : groupChatInfo.nick, - lastMessageUid = roster.lastMessageUids[from] || 0; - - // are the messages new? - if (this.uid > lastMessageUid) { - var tag = nickToTag(from); - if (tag != selectedTabTag) { - var tab = $("#" + tagToTabLabel(tag)); - if (tab.length == 0) { - // no tab opened yet, create it - tab = addTab(from, tag); + if (presenceWebsocket) { + // when the server pushes new inputs + presenceWebsocket.onmessage = function (e) { + + // create JSON object + var input = JSON.parse(e.data); + if (input.roster) { + roster.updateDisplay(input.roster); + } + + if (input.messages) { + var activeNick = getUserFromTabIndex(presenceChatTabs.tabs('option','active')), + selectedTabTag = nickToTag(activeNick); + + jQuery.each(input.messages, function(){ + // which tab are we talking about? + var from = this.to ? (this.from == nickname ? this.to : this.from) : groupChatInfo.nick, + lastMessageUid = roster.lastMessageUids[from] || 0; + + // are the messages new? + if (this.uid > lastMessageUid) { + var tag = nickToTag(from); + if (tag != selectedTabTag) { + var tab = $("#" + tagToTabLabel(tag)); + if (tab.length == 0) { + // no tab opened yet, create it + tab = addTab(from, tag); + } + + // notify of new message + tab.addClass('presenceTabNewMessage'); + if (tag != groupChatInfo.tag) { + $("#" + tagToListing(tag)).addClass('presenceListingNewMessage'); + } + } + + roster.lastMessageUids[from] = this.uid; + var messageArea = $("#" + (nickToMessageArea(from))); + messageArea.append(generateMessageHTML(this.from, this.message, this.dateSent)); + messageArea.scrollTop(messageArea.prop('scrollHeight')); } - - // notify of new message - tab.addClass('presenceTabNewMessage'); - if (tag != groupChatInfo.tag) { - $("#" + tagToListing(tag)).addClass('presenceListingNewMessage'); - } - } - - roster.lastMessageUids[from] = this.uid; - var messageArea = $("#" + (nickToMessageArea(from))); - messageArea.append(generateMessageHTML(this.from, this.message, this.dateSent)); - messageArea.scrollTop(messageArea.prop('scrollHeight')); - } - }); - } - - // remove conversation tabs with learners who are gone - $('li a', presenceChatTabs).each(function() { - var nick = $(this).text(); - if (nick != groupChatInfo.nick && !roster.users[nick]) { - var tag = $(this).attr('href'); - $(tag).remove(); - $(this).parent().remove(); - presenceChatTabs.tabs('refresh'); - } - }); - }; + }); + } + // remove conversation tabs with learners who are gone + $('li a', presenceChatTabs).each(function() { + var nick = $(this).text(); + if (nick != groupChatInfo.nick && !roster.users[nick]) { + var tag = $(this).attr('href'); + $(tag).remove(); + $(this).parent().remove(); + presenceChatTabs.tabs('refresh'); + } + }); + + // reset ping timer + websocketPing('presence' + lessonId, true); + }; + } }); @@ -307,8 +280,7 @@ presenceWebsocket.send(JSON.stringify(data)); // reset ping timer - clearTimeout(presenceWebsocketPingTimeout); - presenceWebsocketPingFunc(true); + websocketPing('presence' + lessonId, true); } /* ******* Click handlers ******* */