S.php.sessionTimer.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. var DBG = DBG || false;
  2. var DBG1 = 1;
  3. var _sesTimerEl = null;
  4. var _sesExpireTimer = USER_SESSION_EXPIRE || 1200;
  5. var _sesExpireCheck = false;
  6. if (!BASE_URL) throw "Mising BASE_URL";
  7. if (!SESSION_TIMER_URL) throw "Mising SESSION_TIMER_URL";
  8. // if (!SESSION_AUTH_STATUS_URL) throw "Mising SESSION_AUTH_STATUS_URL";
  9. if (!USER_LOGIN) throw "Mising USER_LOGIN";
  10. /**
  11. IAuthStatus {
  12. type: string "expired" | "logged_in" | "logged_in_again"
  13. login: string
  14. expire: int
  15. time: timestamp (seconds)
  16. }
  17. */
  18. function sesExpireTimeoutUpdate() {
  19. //console.log('sesExpireTimeoutUpdate: ' + _sesExpireTimer);
  20. if (!_sesTimerEl) return;
  21. if (_sesExpireTimer>=0) {
  22. var min = Math.floor(_sesExpireTimer / 60);
  23. var sek = _sesExpireTimer % 60;
  24. if (sek < 10) { sek = '0' + sek; }
  25. _sesTimerEl.innerHTML='' + min + ':' + sek + '';
  26. window.setTimeout(sesExpireTimeoutUpdate, 1000);
  27. } else {
  28. _sesTimerEl.innerHTML = 'expired!';
  29. window.setTimeout(sesExpireTimeoutUpdate, 1000);
  30. }
  31. _sesExpireTimer -= 1;
  32. }
  33. var sessionTimeoutStop = false;
  34. var sessionTimeoutCheckFreq = 5;
  35. var sessionTimeoutCheck = sessionTimeoutCheckFreq;
  36. function sesAjaxTimerCheck() {
  37. DBG && console.log("DBG:S:sesAjaxTimerCheck", { sessionTimeoutStop, _sesExpireTimer });
  38. if (sessionTimeoutStop) return;
  39. if (SESSION_AUTH_STATUS_URL) fetchAuthStatus(SESSION_AUTH_STATUS_URL);
  40. else fetchSessionTimer(SESSION_TIMER_URL);
  41. if (_sesExpireTimer >= 0) {
  42. window.setTimeout(sesAjaxTimerCheck, sessionTimeoutCheckFreq * 1000);
  43. _sesExpireCheck = false;
  44. } else {
  45. // if (_sesExpireCheck) {
  46. // alert('Your current Session is over.');
  47. // } else {
  48. // window.setTimeout('sesAjaxTimerCheck', sessionTimeoutCheckFreq * 1000);
  49. // _sesExpireCheck=true;
  50. // }
  51. }
  52. }
  53. function fetchAuthStatus(url) {
  54. window.fetch(url, {
  55. credentials: "same-origin",
  56. }).then(function (response) {
  57. return response.text();
  58. }).then(function (responseText) {
  59. DBG && console.log("DBG:S:fetchAuthStatus response", { responseText, sessionTimeoutStop, _sesExpireTimer });
  60. try {
  61. var json = JSON.parse(responseText);
  62. return json;
  63. } catch (e) {
  64. return { type: responseText };
  65. }
  66. }).then(function (data) {
  67. DBG && console.warn("DBG:S:response data", { data });
  68. if (sessionTimeoutStop) return;
  69. var newSesTimer = parseInt(data.expire);
  70. if (!isNaN(newSesTimer) && newSesTimer > 0) {
  71. _sesExpireTimer = newSesTimer;
  72. } else {
  73. _sesExpireTimer = -1; // logout
  74. sendMsgToServiceWorker('session_expired')
  75. showSesExpireModal()
  76. }
  77. }).catch(function (err) {
  78. DBG && console.error(err)
  79. })
  80. }
  81. function fetchSessionTimer(url) {
  82. window.fetch(url, {
  83. credentials: "same-origin",
  84. }).then(function (response) {
  85. return response.text();
  86. }).then(function (data) {
  87. DBG && console.warn("DBG:S:response data", { data });
  88. if (sessionTimeoutStop) return;
  89. var newSesTimer = parseInt(data);
  90. if (!isNaN(newSesTimer) && newSesTimer > 0) {
  91. _sesExpireTimer = newSesTimer;
  92. } else {
  93. _sesExpireTimer = -1;// logout
  94. sendMsgToServiceWorker('session_expired')
  95. showSesExpireModal()
  96. }
  97. }).catch(function (err) {
  98. DBG && console.error(err)
  99. })
  100. }
  101. function showSesExpireModal() {
  102. var exprModal = document.getElementById('session-timer-modal');
  103. if (!exprModal) {
  104. var modalHtml = '<div id="session-timer-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="session-timer-modal-label" aria-hidden="true">' +
  105. ' <div class="modal-dialog">' +
  106. ' <div class="modal-content">' +
  107. ' <div class="modal-header">' +
  108. ' <h3 id="session-timer-modal-label">Zostałeś wylogowany</h3>' +
  109. ' </div>' +
  110. ' <div class="modal-footer">' +
  111. ' <a href="index.php" class="btn btn-primary">Zaloguj</a>' +
  112. ' </div>' +
  113. ' </div>' +
  114. ' </div>' +
  115. '</div>';
  116. exprModal = jQuery(modalHtml).appendTo('body');
  117. }
  118. jQuery('#session-timer-modal').modal({ show: true, keyboard: false, backdrop: 'static' });
  119. jQuery('#session-timer-modal').show();
  120. }
  121. jQuery(document).ready(function() {
  122. _sesTimerEl = document.getElementById('session-timer');
  123. if (_sesTimerEl) {
  124. _sesTimerEl.innerHTML = '...';
  125. sesExpireTimeoutUpdate();
  126. }
  127. window.setTimeout(sesAjaxTimerCheck, sessionTimeoutCheckFreq * 1000);
  128. });
  129. function stopTimer() {
  130. sessionTimeoutStop = true;
  131. return true;
  132. }
  133. function sendMsgToServiceWorker(data) {
  134. if (navigator.serviceWorker && navigator.serviceWorker.controller) {
  135. navigator.serviceWorker.controller.postMessage(data);
  136. }
  137. }
  138. if ('serviceWorker' in navigator) {
  139. navigator.serviceWorker.register(BASE_URL + 'sw.js').then(function() {
  140. return navigator.serviceWorker.ready;
  141. }).then(function (reg) {
  142. DBG && console.log("SW registration succeeded. Scope is "+reg.scope, { reg });
  143. navigator.serviceWorker.addEventListener('message', onServiceWorkerMsg);
  144. sendMsgToServiceWorker({ type: 'logged_in', login: USER_LOGIN, expire: _sesExpireTimer });
  145. }).catch(function (err) {
  146. DBG && console.error("SW registration failed with error "+err);
  147. });
  148. }
  149. function onServiceWorkerMsg(event) {
  150. var data = event.data || '';
  151. var msgType = (data && data.type) ? data.type || '' : data;
  152. DBG && console.log('DBG:onServiceWorkerMsg ', { msgType, data: event.data, event })
  153. if ('session_expired' === msgType) {
  154. _sesExpireTimer = -1;// logout
  155. showSesExpireModal()
  156. } else if ('logged_in' === msgType) {
  157. // jQuery('#session-timer-modal').hide()
  158. } else if ('logged_in_again' === msgType) {
  159. jQuery('#session-timer-modal').hide()
  160. _sesExpireTimer = data.expire;
  161. sesExpireTimeoutUpdate();
  162. sessionTimeoutStop = false;
  163. window.setTimeout(sesAjaxTimerCheck, sessionTimeoutCheckFreq * 1000);
  164. }
  165. }
  166. // global.sesExpireTimeoutUpdate = sesExpireTimeoutUpdate;
  167. // global.sesAjaxTimerCheck = sesAjaxTimerCheck;