Index: lams_tool_chat/web/includes/javascript/learning.js =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r9496ff3ffe5e98272f7939a2cf4e8c6dbb2901f7 --- lams_tool_chat/web/includes/javascript/learning.js (.../learning.js) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_chat/web/includes/javascript/learning.js (.../learning.js) (revision 9496ff3ffe5e98272f7939a2cf4e8c6dbb2901f7) @@ -15,97 +15,70 @@ sendChatToolMessage(); } }); - + // only Monitor can send a personal message - var selectedUser = null, - chatWebsocketInitTime = Date.now(), - // init the connection with server using server URL but with different protocol - chatWebsocket = new WebSocket(APP_URL.replace('http', 'ws') - + 'learningWebsocket?toolSessionID=' + TOOL_SESSION_ID), - chatWebsocketPingTimeout = null, - chatWebsocketPingFunc = null; - - chatWebsocket.onclose = function(e){ - // react only on abnormal close - if (e.code === 1006 && - Date.now() - chatWebsocketInitTime > 1000) { - location.reload(); - } - }; - - chatWebsocketPingFunc = function(skipPing){ - if (chatWebsocket.readyState == chatWebsocket.CLOSING - || chatWebsocket.readyState == chatWebsocket.CLOSED){ - return; - } - - // check and ping every 3 minutes - chatWebsocketPingTimeout = setTimeout(chatWebsocketPingFunc, 3*60*1000); - // initial set up does not send ping - if (!skipPing) { - chatWebsocket.send("ping"); - } - }; - // set up timer for the first time - chatWebsocketPingFunc(true); + let selectedUser = null, + websocket = initWebsocket('chat' + TOOL_SESSION_ID, + APP_URL.replace('http', 'ws') + + 'learningWebsocket?toolSessionID=' + TOOL_SESSION_ID); + if (websocket) { + // when the server pushes new inputs + websocket.onmessage = function (e) { + // create JSON object + var input = JSON.parse(e.data); + // clear old messages + messageDiv.html(''); - chatWebsocket.onmessage = function(e){ - // reset ping timer - clearTimeout(chatWebsocketPingTimeout); - chatWebsocketPingFunc(true); - - // create JSON object - var input = JSON.parse(e.data); - // clear old messages - messageDiv.html(''); - - // all messasges need to be written out, not only new ones, - // as old ones could have been edited or hidden by Monitor - jQuery.each(input.messages, function(){ - var container = $('
',{ - 'class' : 'message ' + (this.type == 'chat' ? 'private_message' : '') + // all messasges need to be written out, not only new ones, + // as old ones could have been edited or hidden by Monitor + jQuery.each(input.messages, function(){ + var container = $('
',{ + 'class' : 'message ' + (this.type == 'chat' ? 'private_message' : '') + }); + $('
',{ + 'class' : 'messageFrom '+getPortraitColourClass(this.lamsUserId), + 'text' : this.from + }).appendTo(container); + $('',{ + 'text' : this.body + }).appendTo(container); + + container.appendTo(messageDiv); }); - $('
',{ - 'class' : 'messageFrom '+getPortraitColourClass(this.lamsUserId), - 'text' : this.from - }).appendTo(container); - $('',{ - 'text' : this.body - }).appendTo(container); - - container.appendTo(messageDiv); - }); - - // move to the bottom - messageDiv.scrollTop(messageDiv.prop('scrollHeight')); - rosterDiv.html(''); - jQuery.each(input.roster, function(index, value){ - var userDiv = $('
', { - 'class' : (value.nickName == selectedUser ? 'selected' : 'unselected'), - }) - .appendTo(rosterDiv); - var pictureDivId = 'roster-'+value.lamsUserId; - $('
', { - 'id' : pictureDivId - }).appendTo(userDiv); - addPortrait(jQuery('#'+pictureDivId), value.portraitId, value.lamsUserId, 'small', true, LAMS_URL); + // move to the bottom + messageDiv.scrollTop(messageDiv.prop('scrollHeight')); + rosterDiv.html(''); + jQuery.each(input.roster, function(index, value){ + var userDiv = $('
', { + 'class' : (value.nickName == selectedUser ? 'selected' : 'unselected'), + }) + .appendTo(rosterDiv); - $('', { - 'class' : getPortraitColourClass(value.lamsUserId), - 'text' : value.nickName - }).appendTo(userDiv); + var pictureDivId = 'roster-'+value.lamsUserId; + $('
', { + 'id' : pictureDivId + }).appendTo(userDiv); + addPortrait(jQuery('#'+pictureDivId), value.portraitId, value.lamsUserId, 'small', true, LAMS_URL); - - // only Monitor can send a personal message - if (MODE == 'teacher') { - userDiv.click(function(){ - userSelected($(this)); - }); - } - }); - + $('', { + 'class' : getPortraitColourClass(value.lamsUserId), + 'text' : value.nickName + }).appendTo(userDiv); + + + // only Monitor can send a personal message + if (MODE == 'teacher') { + userDiv.click(function(){ + userSelected($(this)); + }); + } + }); + + // reset ping timer + websocketPing('chat' + TOOL_SESSION_ID, true); + }; } function userSelected(userDiv) { @@ -138,10 +111,9 @@ }; // send it to server - chatWebsocket.send(JSON.stringify(output)); - + websocket.send(JSON.stringify(output)); + // reset ping timer - clearTimeout(chatWebsocketPingTimeout); - chatWebsocketPingFunc(true); + websocketPing('chat' + TOOL_SESSION_ID, true); } -}); +}); \ No newline at end of file