|  |  |  | @ -758,9 +758,8 @@ class LokiSnodeAPI { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   async getLnsMapping(lnsName, timeout) { | 
		
	
		
			
				|  |  |  |  |     // Returns { pubkey, error }
 | 
		
	
		
			
				|  |  |  |  |     // pubkey is:
 | 
		
	
		
			
				|  |  |  |  |     //      null      when there is confirmed to be no LNS mapping
 | 
		
	
		
			
				|  |  |  |  |     //      undefined when unconfirmed
 | 
		
	
		
			
				|  |  |  |  |     // pubkey is
 | 
		
	
		
			
				|  |  |  |  |     //      undefined when unconfirmed or no mapping found
 | 
		
	
		
			
				|  |  |  |  |     //      string    when found
 | 
		
	
		
			
				|  |  |  |  |     // timeout parameter optional (ms)
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -780,16 +779,12 @@ class LokiSnodeAPI { | 
		
	
		
			
				|  |  |  |  |     const output = await window.blake2b(input); | 
		
	
		
			
				|  |  |  |  |     const nameHash = dcodeIO.ByteBuffer.wrap(output).toString('base64'); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     const timeoutResponse = { timedOut: true }; | 
		
	
		
			
				|  |  |  |  |     // Timeouts
 | 
		
	
		
			
				|  |  |  |  |     const maxTimeoutVal = 2 ** 31 - 1; | 
		
	
		
			
				|  |  |  |  |     const timeoutPromise = (cb, interval) => () => | 
		
	
		
			
				|  |  |  |  |       new Promise(resolve => | 
		
	
		
			
				|  |  |  |  |         setTimeout(() => cb(resolve), interval || maxTimeoutVal) | 
		
	
		
			
				|  |  |  |  |     const timeoutPromise = () => | 
		
	
		
			
				|  |  |  |  |       new Promise((_resolve, reject) => | 
		
	
		
			
				|  |  |  |  |         setTimeout(() => reject(), timeout || maxTimeoutVal) | 
		
	
		
			
				|  |  |  |  |       ); | 
		
	
		
			
				|  |  |  |  |     const onTimeout = timeoutPromise( | 
		
	
		
			
				|  |  |  |  |       resolve => resolve(timeoutResponse), | 
		
	
		
			
				|  |  |  |  |       timeout | 
		
	
		
			
				|  |  |  |  |     ); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Get nodes capable of doing LNS
 | 
		
	
		
			
				|  |  |  |  |     const lnsNodes = await this.getNodesMinVersion( | 
		
	
	
		
			
				
					|  |  |  | @ -798,12 +793,13 @@ class LokiSnodeAPI { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Enough nodes?
 | 
		
	
		
			
				|  |  |  |  |     if (lnsNodes.length < numRequiredConfirms) { | 
		
	
		
			
				|  |  |  |  |       error = window.i18n('lnsTooFewNodes'); | 
		
	
		
			
				|  |  |  |  |       error = { lnsTooFewNodes: window.i18n('lnsTooFewNodes') }; | 
		
	
		
			
				|  |  |  |  |       return { pubkey, error }; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     const confirmedNodes = []; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Promise is only resolved when a consensus is found
 | 
		
	
		
			
				|  |  |  |  |     let cipherResolve; | 
		
	
		
			
				|  |  |  |  |     const cipherPromise = () => | 
		
	
		
			
				|  |  |  |  |       new Promise(resolve => { | 
		
	
	
		
			
				
					|  |  |  | @ -834,7 +830,7 @@ class LokiSnodeAPI { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |         if (confirmedNodes.length >= numRequiredConfirms) { | 
		
	
		
			
				|  |  |  |  |           if (ciphertextHex) { | 
		
	
		
			
				|  |  |  |  |             // result already found, dont worry
 | 
		
	
		
			
				|  |  |  |  |             // Result already found, dont worry
 | 
		
	
		
			
				|  |  |  |  |             return; | 
		
	
		
			
				|  |  |  |  |           } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -848,7 +844,7 @@ class LokiSnodeAPI { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             // null represents no LNS mapping
 | 
		
	
		
			
				|  |  |  |  |             if (ciphertextHex === null) { | 
		
	
		
			
				|  |  |  |  |               error = window.i18n('lnsMappingNotFound'); | 
		
	
		
			
				|  |  |  |  |               error = { lnsMappingNotFound: window.i18n('lnsMappingNotFound') }; | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |             cipherResolve({ ciphertextHex }); | 
		
	
	
		
			
				
					|  |  |  | @ -864,16 +860,16 @@ class LokiSnodeAPI { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // Timeouts (optional parameter)
 | 
		
	
		
			
				|  |  |  |  |     // Wait for cipher to be found; race against timeout
 | 
		
	
		
			
				|  |  |  |  |     const { timedOut } = await Promise.race( | 
		
	
		
			
				|  |  |  |  |       [cipherPromise, onTimeout].map(f => f()) | 
		
	
		
			
				|  |  |  |  |     ); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     if (timedOut) { | 
		
	
		
			
				|  |  |  |  |       error = window.i18n('lnsLookupTimeout'); | 
		
	
		
			
				|  |  |  |  |       return { pubkey, error }; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     pubkey = ciphertextHex === null ? null : await decryptHex(ciphertextHex); | 
		
	
		
			
				|  |  |  |  |     // eslint-disable-next-line more/no-then
 | 
		
	
		
			
				|  |  |  |  |     await Promise.race([cipherPromise, timeoutPromise].map(f => f())) | 
		
	
		
			
				|  |  |  |  |       .then(async () => { | 
		
	
		
			
				|  |  |  |  |         if (ciphertextHex !== null) { | 
		
	
		
			
				|  |  |  |  |           pubkey = await decryptHex(ciphertextHex); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |       }) | 
		
	
		
			
				|  |  |  |  |       .catch(() => { | 
		
	
		
			
				|  |  |  |  |         error = { lnsLookupTimeout: window.i18n('lnsLookupTimeout') }; | 
		
	
		
			
				|  |  |  |  |       }); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     return { pubkey, error }; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
	
		
			
				
					|  |  |  | 
 |