1 2 3function refreshContainer(refreshTokenExpirationTime, accessTokenExpirationTime) { 4 let refresh = false 5 let refreshCback = null 6 let afterRefreshCback = null 7 let onSessionExpireCback = null 8 let userIsInactive = false 9 10 const timersContainer = () => { 11 let refreshTokenTimer 12 let accessTokenTimer 13 const oneMinute = 60000 14 const twoMinutes = oneMinute * 2 15 window.onload = resetTimersOnMovement 16 window.onmousemove = resetTimersOnMovement 17 window.onmousedown = resetTimersOnMovement 18 window.ontouchstart = resetTimersOnMovement 19 window.ontouchmove = resetTimersOnMovement 20 window.onclick = resetTimersOnMovement 21 window.onkeydown = resetTimersOnMovement 22 window.addEventListener('scroll', resetTimersOnMovement, true) 23 24 async function inactiveIndicator() { 25 // this is called only when there is no motion during the life time of the refresh token 26 userIsInactive = true 27 28 if (onSessionExpireCback) { 29 await onSessionExpireCback() 30 } 31 } 32 33 function resetTimersOnMovement() { 34 if (userIsInactive) return 35 36 if (!refresh) { 37 refresh = true 38 39 if (refreshCback) { 40 accessTokenTimer = setTimeout(async () => { 41 // wait untill access tokens is near to expire 42 // after that time is passed, set 'refresh' to 'false' 43 // and wait for 'resetTimersOnMovement' to be called again (to refresh the tokens). 44 // if no movement is detected during the life time of the refresh token, 45 // the 'resetTimersOnMovement' will not be called and the refresh token will be expired 46 // (so the session will be killed and the user will have to login again) 47 48 await refreshCback() // call the callback to refresh the tokens 49 50 const triggerAfterRefresh = async () => { 51 if (afterRefreshCback) { 52 await afterRefreshCback() 53 } 54 } 55 56 setTimeout(triggerAfterRefresh, 1500) 57 58 refresh = false 59 }, accessTokenExpirationTime * oneMinute - twoMinutes) 60 } 61 } 62 63 clearTimeout(refreshTokenTimer) 64 refreshTokenTimer = setTimeout( 65 inactiveIndicator, 66 refreshTokenExpirationTime * oneMinute - twoMinutes, 67 ) 68 } 69 70 return { 71 resetTimersOnMovement, 72 } 73 } 74 75 const start = () => { 76 if (refreshCback) { 77 refreshCback() 78 if (afterRefreshCback) { 79 setTimeout(afterRefreshCback, 1500) 80 } 81 } 82 timersContainer().resetTimersOnMovement() 83 } 84 85 return { 86 onRefresh(callback) { 87 refreshCback = callback 88 }, 89 afterRefresh(callback) { 90 afterRefreshCback = callback 91 }, 92 onSessionExpire(callback) { 93 onSessionExpireCback = callback 94 }, 95 startTimers() { 96 start() 97 } 98 } 99} 100 101function trySelect(selector, callback) { 102 const check = setInterval(() => { 103 if (document.querySelector(selector)) { 104 clearInterval(check) 105 106 callback() 107 } 108 }, 1000) 109 110 window.onpopstate = function (event) { clearInterval(check); }; 111} 112 113function onPageMount(callback) { 114 document.addEventListener('DOMContentLoaded', callback) 115} 116 117window.GetRequest = async function GetRequest(url) { 118 const request = await fetch(url) 119 const response = await request.json(); 120 const result = response.Result 121 122 return result 123} 124 125window.silentRefresh = async function(dotnetHelper) { 126 127 const { refreshTokenExpirationTime, accessTokenExpirationTime, appSelector, onRefreshMethodName, onAfterRefreshMethodName, onSessionExpireMethodName } = 128 window.silentRefreshSettings 129 130 console.log("Z0.Blazor.Core.window.silentRefresh: onSessionExpireMethodName = ", onSessionExpireMethodName) 131 132 trySelect(appSelector, () => { 133 134 const container = refreshContainer( 135 refreshTokenExpirationTime, 136 accessTokenExpirationTime, 137 ) 138 139 container.onRefresh(async () => { 140 if (!onRefreshMethodName) return 141 142 await dotnetHelper.invokeMethodAsync(onRefreshMethodName) 143 }) 144 145 container.afterRefresh(async () => { 146 if (!onAfterRefreshMethodName) return 147 await dotnetHelper.invokeMethodAsync(onAfterRefreshMethodName) 148 }) 149 150 container.onSessionExpire(async () => { 151 console.log("Z0.Blazor.Core.container.onSessionExpire: onSessionExpireMethodName = ", onSessionExpireMethodName); 152 if (!onSessionExpireMethodName) return 153 154 await dotnetHelper.invokeMethodAsync(onSessionExpireMethodName) 155 }) 156 157 container.startTimers() 158 }) 159}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.