sw.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. var DBG = DBG || 0;
  2. var DBG1 = 1;
  3. // var _clientServerTimeDiff = 0;
  4. self.addEventListener('install', onInstall);
  5. self.addEventListener('activate', onActivate);
  6. self.addEventListener('fetch', onFetch);
  7. self.addEventListener('message', onMessage);
  8. // self.importScripts('')
  9. /**
  10. IAuthStatus {
  11. type: string "expired" | "logged_in" | "logged_in_again"
  12. login: string
  13. expire: int
  14. time: timestamp (seconds)
  15. }
  16. */
  17. var sessionTimerBuffer = (function () {
  18. // var _timeoutId = null;
  19. var _lastTimeToExpireSec = null;
  20. var _responseTimeMs = null;
  21. var _loggedInUser = null; // login
  22. var setSessionExpirySec = function (timeToExpire, loggedInUser) {
  23. DBG && console.log('DBG:sw:sessionTimerBuffer setSessionExpirySec(', { timeToExpire, loggedInUser }, ')');
  24. _lastTimeToExpireSec = parseInt(timeToExpire);
  25. _responseTimeMs = (new Date()).getTime();
  26. if (loggedInUser) _loggedInUser = loggedInUser;
  27. };
  28. var getSessionExpirySec = function () {
  29. var nowMs = (new Date()).getTime();
  30. return (_lastTimeToExpireSec && _responseTimeMs) ? _lastTimeToExpireSec - Math.floor((nowMs - _responseTimeMs) / 1000) : null;
  31. };
  32. var getDiffLastFetchedMs = function () {
  33. var nowMs = (new Date()).getTime();
  34. return (_lastTimeToExpireSec && _responseTimeMs) ? (nowMs - _responseTimeMs) : null;
  35. };
  36. var getLogin = function () {
  37. return _loggedInUser;
  38. };
  39. return {
  40. setSessionExpirySec: setSessionExpirySec,
  41. getSessionExpirySec: getSessionExpirySec,
  42. getDiffLastFetchedMs: getDiffLastFetchedMs,
  43. getLogin: getLogin,
  44. };
  45. })();
  46. function onInstall(event) {
  47. DBG && console.log("DBG:sw:install", { event })
  48. if (self.skipWaiting) self.skipWaiting();
  49. }
  50. function onActivate(event) {
  51. DBG && console.log("DBG:sw:activate", { event })
  52. }
  53. function onFetch(event) { // proxy all client requests
  54. DBG && console.log("DBG:sw:fetch", { url: event.request.url, clientId: event.clientId, event })
  55. var url = event.request.url;
  56. if ('session-expire.php?task=getAuthStatus' === url.substr(url.lastIndexOf('/') + 1)) {
  57. var lastFetchedMs = sessionTimerBuffer.getDiffLastFetchedMs();
  58. if (!lastFetchedMs || lastFetchedMs > 2000) {
  59. event.respondWith(new Promise(function (resolve, reject) {
  60. // var clientRequestTime = Math.floor(Date.now() / 1000);
  61. // var clientResponseTime = 0;
  62. // var serverResponseTime = 0;
  63. fetch(event.request).then(function (response) {
  64. // clientResponseTime = Math.floor(Date.now() / 1000);
  65. return response.text()
  66. }).then(function (responseText) {
  67. DBG && console.log("DBG:sw:fetch responseText", { url: event.request.url, clientId: event.clientId, responseText })
  68. try {
  69. var json = JSON.parse(responseText);
  70. return json;
  71. } catch (e) {
  72. throw "session_expired"; // resolve(new Response(responseText, { status: 200 }));
  73. }
  74. }).then(function (data) { // data: IAuthStatus
  75. // serverResponseTime = parseInt(data.time);
  76. // _clientServerTimeDiff = serverResponseTime - (clientResponseTime + clientRequestTime) / 2;
  77. // DBG && console.log("DBG:sw:getAuthStatus timediff", { clientRequestTime, clientResponseTime, serverResponseTime, _clientServerTimeDiff });
  78. var expire = parseInt(data.expire);
  79. sessionTimerBuffer.setSessionExpirySec(expire, data.login);
  80. resolve(new Response(JSON.stringify(data), { status: 200 }));
  81. }).catch(function (err) {
  82. resolve(new Response(err, { status: 200 }));
  83. })
  84. }))
  85. } else {
  86. var generatedResponseData = {
  87. expire: sessionTimerBuffer.getSessionExpirySec(),
  88. login: sessionTimerBuffer.getLogin(),
  89. }
  90. event.respondWith(Promise.resolve(new Response(JSON.stringify(generatedResponseData), { status: 202 }))); // 202 - Accepted
  91. }
  92. }
  93. if ('session-expire.php?task=getTimer' === url.substr(url.lastIndexOf('/') + 1)) {
  94. var lastFetchedMs = sessionTimerBuffer.getDiffLastFetchedMs();
  95. DBG && console.log("DBG:sw:fetch session-expire getTimer", { lastFetchedMs: lastFetchedMs, sesTimerSec: sessionTimerBuffer.getSessionExpirySec(), url: event.request.url, clientId: event.clientId, event });
  96. if (!lastFetchedMs || lastFetchedMs > 2000) {
  97. event.respondWith(new Promise(function (resolve, reject) {
  98. fetch(event.request).then(function (response) {
  99. return response.text()
  100. }).then(function (data) {
  101. sessionTimerBuffer.setSessionExpirySec(data);
  102. resolve(new Response("" + data, { status: 200 }));
  103. }).catch(function (err) {
  104. reject(new Response("" + err, { status: 200 }));
  105. })
  106. }))
  107. } else {
  108. event.respondWith(Promise.resolve(new Response("" + sessionTimerBuffer.getSessionExpirySec(), { status: 202 }))); // 202 - Accepted
  109. }
  110. }
  111. }
  112. function onMessage(event) {
  113. DBG && console.log("DBG:sw:Message recieved in service worker:", { data: event.data, clientId: event.source.id, event });
  114. var data = event.data;
  115. var clientId = event.source.id;
  116. var msgType = (data && data.type) ? data.type || '' : '';
  117. DBG && console.log("DBG:sw:Message type:", { msgType });
  118. if ('logged_in' === msgType) {
  119. var lastLogin = sessionTimerBuffer.getLogin();
  120. var login = data.login || '';
  121. var isLoggedInAgain = (lastLogin && login && lastLogin === login);
  122. DBG && console.log("DBG:sw:Message logged_in:", { isLoggedInAgain, lastLogin, login, data: event.data, clientId: event.source.id, event });
  123. sessionTimerBuffer.setSessionExpirySec(data.expire, data.login);
  124. sendStateToOtherClients(
  125. clientId,
  126. isLoggedInAgain ? Object.assign(data, { type: 'logged_in_again' }) : data
  127. );
  128. } else {
  129. sendStateToAllClients(clientId, data);
  130. }
  131. }
  132. sendStateToAllClients = function(clientId, data) {
  133. DBG && console.log("DBG:sw:clients (global)", { clients })
  134. clients.matchAll().then(function (clients) {
  135. clients.forEach(function (client) {
  136. client.postMessage(data);
  137. })
  138. })
  139. }
  140. sendStateToOtherClients = function(clientId, data) {
  141. DBG && console.log("DBG:sw:clients (global)", { clients })
  142. clients.matchAll().then(function (clients) {
  143. clients.forEach(function (client) {
  144. if (client.id !== clientId) {
  145. client.postMessage(data);
  146. }
  147. })
  148. })
  149. }
  150. // versionCheck();
  151. //
  152. // async function versionCheck() {
  153. // const response = await fetch(SW_VERSION_URL);
  154. // const version = await response.text();
  155. // if (version !== VERSION) {
  156. // self.registration.update();
  157. // }
  158. // }