|  |  |  | /* global LokiAppDotNetServerAPI, semver, log */ | 
					
						
							|  |  |  | // eslint-disable-next-line func-names
 | 
					
						
							|  |  |  | (function() { | 
					
						
							|  |  |  |   'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // hold last result
 | 
					
						
							|  |  |  |   let expiredVersion = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   window.tokenlessFileServerAdnAPI = new LokiAppDotNetServerAPI( | 
					
						
							|  |  |  |     '', // no pubkey needed
 | 
					
						
							|  |  |  |     window.getDefaultFileServer() | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  |   // use the anonymous access token
 | 
					
						
							|  |  |  |   window.tokenlessFileServerAdnAPI.token = 'loki'; | 
					
						
							|  |  |  |   // configure for file server comms
 | 
					
						
							|  |  |  |   window.tokenlessFileServerAdnAPI.getPubKeyForUrl(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let nextWaitSeconds = 5; | 
					
						
							|  |  |  |   const checkForUpgrades = async () => { | 
					
						
							|  |  |  |     const result = await window.tokenlessFileServerAdnAPI.serverRequest( | 
					
						
							|  |  |  |       'loki/v1/version/client/desktop' | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |     if ( | 
					
						
							|  |  |  |       result && | 
					
						
							|  |  |  |       result.response && | 
					
						
							|  |  |  |       result.response.data && | 
					
						
							|  |  |  |       result.response.data.length && | 
					
						
							|  |  |  |       result.response.data[0].length | 
					
						
							|  |  |  |     ) { | 
					
						
							|  |  |  |       const latestVer = semver.clean(result.response.data[0][0]); | 
					
						
							|  |  |  |       if (semver.valid(latestVer)) { | 
					
						
							|  |  |  |         const ourVersion = window.getVersion(); | 
					
						
							|  |  |  |         if (latestVer === ourVersion) { | 
					
						
							|  |  |  |           log.info('You have the latest version', latestVer); | 
					
						
							|  |  |  |           // change the following to true ot test/see expiration banner
 | 
					
						
							|  |  |  |           expiredVersion = false; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           // expire if latest is newer than current
 | 
					
						
							|  |  |  |           expiredVersion = semver.gt(latestVer, ourVersion); | 
					
						
							|  |  |  |           if (expiredVersion) { | 
					
						
							|  |  |  |             log.info('There is a newer version available', latestVer); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       // give it a minute
 | 
					
						
							|  |  |  |       log.warn('Could not check to see if newer version is available', result); | 
					
						
							|  |  |  |       nextWaitSeconds = 60; | 
					
						
							|  |  |  |       setTimeout(async () => { | 
					
						
							|  |  |  |         await checkForUpgrades(); | 
					
						
							|  |  |  |       }, nextWaitSeconds * 1000); // wait a minute
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // no message logged means serverRequest never returned...
 | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // don't wait for this to finish
 | 
					
						
							|  |  |  |   checkForUpgrades(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   window.extension = window.extension || {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // eslint-disable-next-line no-unused-vars
 | 
					
						
							|  |  |  |   const resolveWhenReady = (res, rej) => { | 
					
						
							|  |  |  |     if (expiredVersion !== null) { | 
					
						
							|  |  |  |       return res(expiredVersion); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     function waitForVersion() { | 
					
						
							|  |  |  |       if (expiredVersion !== null) { | 
					
						
							|  |  |  |         return res(expiredVersion); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       log.info( | 
					
						
							|  |  |  |         `Delaying sending checks for ${nextWaitSeconds}s, no version yet` | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       setTimeout(waitForVersion, nextWaitSeconds * 1000); | 
					
						
							|  |  |  |       return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     waitForVersion(); | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // just get current status
 | 
					
						
							|  |  |  |   window.extension.expiredStatus = () => expiredVersion; | 
					
						
							|  |  |  |   // actually wait until we know for sure
 | 
					
						
							|  |  |  |   window.extension.expiredPromise = () => new Promise(resolveWhenReady); | 
					
						
							|  |  |  |   window.extension.expired = cb => { | 
					
						
							|  |  |  |     if (expiredVersion === null) { | 
					
						
							|  |  |  |       // just give it another second
 | 
					
						
							|  |  |  |       log.info(`Delaying expire banner determination for ${nextWaitSeconds}s`); | 
					
						
							|  |  |  |       setTimeout(() => { | 
					
						
							|  |  |  |         window.extension.expired(cb); | 
					
						
							|  |  |  |       }, nextWaitSeconds * 1000); | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     // yes we know
 | 
					
						
							|  |  |  |     cb(expiredVersion); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const getServerTime = async () => { | 
					
						
							|  |  |  |     let timestamp = NaN; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       const res = await window.tokenlessFileServerAdnAPI.serverRequest( | 
					
						
							|  |  |  |         'loki/v1/time' | 
					
						
							|  |  |  |       ); | 
					
						
							|  |  |  |       if (res.statusCode === 200) { | 
					
						
							|  |  |  |         timestamp = res.response; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       return timestamp; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return Number(timestamp); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const getTimeDifferential = async () => { | 
					
						
							|  |  |  |     // Get time differential between server and client in seconds
 | 
					
						
							|  |  |  |     const serverTime = await getServerTime(); | 
					
						
							|  |  |  |     const clientTime = Math.ceil(Date.now() / 1000); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (Number.isNaN(serverTime)) { | 
					
						
							|  |  |  |       log.error('expire:::getTimeDifferential - serverTime is not valid'); | 
					
						
							|  |  |  |       return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return serverTime - clientTime; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // require for PoW to work
 | 
					
						
							|  |  |  |   window.setClockParams = async () => { | 
					
						
							|  |  |  |     // Set server-client time difference
 | 
					
						
							|  |  |  |     const maxTimeDifferential = 30 + 15; // + 15 for onion requests
 | 
					
						
							|  |  |  |     const timeDifferential = await getTimeDifferential(); | 
					
						
							|  |  |  |     log.info('expire:::setClockParams - Clock difference', timeDifferential); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     window.clientClockSynced = Math.abs(timeDifferential) < maxTimeDifferential; | 
					
						
							|  |  |  |     return window.clientClockSynced; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   window.setClockParams(); | 
					
						
							|  |  |  | })(); |