var DBG = DBG || false; var DBG1 = 1; var _sesTimerEl = null; var _sesExpireTimer = USER_SESSION_EXPIRE || 1200; var _sesExpireCheck = false; if (!BASE_URL) throw "Mising BASE_URL"; if (!SESSION_TIMER_URL) throw "Mising SESSION_TIMER_URL"; // if (!SESSION_AUTH_STATUS_URL) throw "Mising SESSION_AUTH_STATUS_URL"; if (!USER_LOGIN) throw "Mising USER_LOGIN"; /** IAuthStatus { type: string "expired" | "logged_in" | "logged_in_again" login: string expire: int time: timestamp (seconds) } */ function sesExpireTimeoutUpdate() { //console.log('sesExpireTimeoutUpdate: ' + _sesExpireTimer); if (!_sesTimerEl) return; if (_sesExpireTimer>=0) { var min = Math.floor(_sesExpireTimer / 60); var sek = _sesExpireTimer % 60; if (sek < 10) { sek = '0' + sek; } _sesTimerEl.innerHTML='' + min + ':' + sek + ''; window.setTimeout(sesExpireTimeoutUpdate, 1000); } else { _sesTimerEl.innerHTML = 'expired!'; window.setTimeout(sesExpireTimeoutUpdate, 1000); } _sesExpireTimer -= 1; } var sessionTimeoutStop = false; var sessionTimeoutCheckFreq = 5; var sessionTimeoutCheck = sessionTimeoutCheckFreq; function sesAjaxTimerCheck() { DBG && console.log("DBG:S:sesAjaxTimerCheck", { sessionTimeoutStop, _sesExpireTimer }); if (sessionTimeoutStop) return; if (SESSION_AUTH_STATUS_URL) fetchAuthStatus(SESSION_AUTH_STATUS_URL); else fetchSessionTimer(SESSION_TIMER_URL); if (_sesExpireTimer >= 0) { window.setTimeout(sesAjaxTimerCheck, sessionTimeoutCheckFreq * 1000); _sesExpireCheck = false; } else { // if (_sesExpireCheck) { // alert('Your current Session is over.'); // } else { // window.setTimeout('sesAjaxTimerCheck', sessionTimeoutCheckFreq * 1000); // _sesExpireCheck=true; // } } } function fetchAuthStatus(url) { window.fetch(url, { credentials: "same-origin", }).then(function (response) { return response.text(); }).then(function (responseText) { DBG && console.log("DBG:S:fetchAuthStatus response", { responseText, sessionTimeoutStop, _sesExpireTimer }); try { var json = JSON.parse(responseText); return json; } catch (e) { return { type: responseText }; } }).then(function (data) { DBG && console.warn("DBG:S:response data", { data }); if (sessionTimeoutStop) return; var newSesTimer = parseInt(data.expire); if (!isNaN(newSesTimer) && newSesTimer > 0) { _sesExpireTimer = newSesTimer; } else { _sesExpireTimer = -1; // logout sendMsgToServiceWorker('session_expired') showSesExpireModal() } }).catch(function (err) { DBG && console.error(err) }) } function fetchSessionTimer(url) { window.fetch(url, { credentials: "same-origin", }).then(function (response) { return response.text(); }).then(function (data) { DBG && console.warn("DBG:S:response data", { data }); if (sessionTimeoutStop) return; var newSesTimer = parseInt(data); if (!isNaN(newSesTimer) && newSesTimer > 0) { _sesExpireTimer = newSesTimer; } else { _sesExpireTimer = -1;// logout sendMsgToServiceWorker('session_expired') showSesExpireModal() } }).catch(function (err) { DBG && console.error(err) }) } function showSesExpireModal() { var exprModal = document.getElementById('session-timer-modal'); if (!exprModal) { var modalHtml = ''; exprModal = jQuery(modalHtml).appendTo('body'); } jQuery('#session-timer-modal').modal({ show: true, keyboard: false, backdrop: 'static' }); jQuery('#session-timer-modal').show(); } jQuery(document).ready(function() { _sesTimerEl = document.getElementById('session-timer'); if (_sesTimerEl) { _sesTimerEl.innerHTML = '...'; sesExpireTimeoutUpdate(); } window.setTimeout(sesAjaxTimerCheck, sessionTimeoutCheckFreq * 1000); }); function stopTimer() { sessionTimeoutStop = true; return true; } function sendMsgToServiceWorker(data) { if (navigator.serviceWorker && navigator.serviceWorker.controller) { navigator.serviceWorker.controller.postMessage(data); } } if ('serviceWorker' in navigator) { navigator.serviceWorker.register(BASE_URL + 'sw.js').then(function() { return navigator.serviceWorker.ready; }).then(function (reg) { DBG && console.log("SW registration succeeded. Scope is "+reg.scope, { reg }); navigator.serviceWorker.addEventListener('message', onServiceWorkerMsg); sendMsgToServiceWorker({ type: 'logged_in', login: USER_LOGIN, expire: _sesExpireTimer }); }).catch(function (err) { DBG && console.error("SW registration failed with error "+err); }); } function onServiceWorkerMsg(event) { var data = event.data || ''; var msgType = (data && data.type) ? data.type || '' : data; DBG && console.log('DBG:onServiceWorkerMsg ', { msgType, data: event.data, event }) if ('session_expired' === msgType) { _sesExpireTimer = -1;// logout showSesExpireModal() } else if ('logged_in' === msgType) { // jQuery('#session-timer-modal').hide() } else if ('logged_in_again' === msgType) { jQuery('#session-timer-modal').hide() _sesExpireTimer = data.expire; sesExpireTimeoutUpdate(); sessionTimeoutStop = false; window.setTimeout(sesAjaxTimerCheck, sessionTimeoutCheckFreq * 1000); } } // global.sesExpireTimeoutUpdate = sesExpireTimeoutUpdate; // global.sesAjaxTimerCheck = sesAjaxTimerCheck;