You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
| 
											5 years ago
										 | import _ from 'lodash'; | ||
|  | import { Snode } from '../onions'; | ||
|  | import { SendParams, storeOnNode } from '../snode_api/serviceNodeAPI'; | ||
|  | import { getSnodesFor } from '../snode_api/snodePool'; | ||
|  | import { firstTrue } from '../utils/Promise'; | ||
|  | 
 | ||
|  | const DEFAULT_CONNECTIONS = 3; | ||
|  | 
 | ||
|  | async function openSendConnection(snode: Snode, params: SendParams) { | ||
|  |   // TODO: Revert back to using snode address instead of IP
 | ||
|  |   const successfulSend = await storeOnNode(snode, params); | ||
|  |   if (successfulSend) { | ||
|  |     return snode; | ||
|  |   } | ||
|  |   // should we mark snode as bad if it can't store our message?
 | ||
|  |   return undefined; | ||
|  | } | ||
|  | 
 | ||
|  | /** | ||
|  |  * Refactor note: We should really clean this up ... it's very messy | ||
|  |  * | ||
|  |  * We need to split it into 2 sends: | ||
|  |  *  - Snodes | ||
|  |  *  - Open Groups | ||
|  |  * | ||
|  |  * Mikunj: | ||
|  |  *  Temporarily i've made it so `MessageSender` handles open group sends and calls this function for regular sends. | ||
|  |  */ | ||
|  | 
 | ||
|  | export async function sendMessage( | ||
|  |   pubKey: string, | ||
|  |   data: Uint8Array, | ||
|  |   messageTimeStamp: number, | ||
|  |   ttl: number, | ||
|  |   options: { | ||
|  |     isPublic?: boolean; | ||
|  |   } = {} | ||
|  | ): Promise<void> { | ||
|  |   const { isPublic = false } = options; | ||
|  | 
 | ||
|  |   if (isPublic) { | ||
|  |     window.log.warn('this sendMessage() should not be called anymore with an open group message'); | ||
|  |     return; | ||
|  |   } | ||
|  | 
 | ||
|  |   const data64 = window.dcodeIO.ByteBuffer.wrap(data).toString('base64'); | ||
|  | 
 | ||
|  |   // Using timestamp as a unique identifier
 | ||
|  |   const swarm = await getSnodesFor(pubKey); | ||
|  | 
 | ||
|  |   // send parameters
 | ||
|  |   const params = { | ||
|  |     pubKey, | ||
|  |     ttl: ttl.toString(), | ||
|  |     timestamp: messageTimeStamp.toString(), | ||
|  |     data: data64, | ||
|  |   }; | ||
|  | 
 | ||
|  |   const usedNodes = _.slice(swarm, 0, DEFAULT_CONNECTIONS); | ||
|  | 
 | ||
|  |   const promises = usedNodes.map(snodeConnection => openSendConnection(snodeConnection, params)); | ||
|  | 
 | ||
|  |   let snode; | ||
|  |   try { | ||
|  |     // eslint-disable-next-line more/no-then
 | ||
|  |     snode = await firstTrue(promises); | ||
|  |   } catch (e) { | ||
|  |     const snodeStr = snode ? `${snode.ip}:${snode.port}` : 'null'; | ||
|  |     window.log.warn( | ||
|  |       `loki_message:::sendMessage - ${e.code} ${e.message} to ${pubKey} via snode:${snodeStr}` | ||
|  |     ); | ||
|  |     throw e; | ||
|  |   } | ||
|  |   if (!snode) { | ||
|  |     throw new window.textsecure.EmptySwarmError(pubKey, 'Ran out of swarm nodes to query'); | ||
|  |   } else { | ||
|  |     window.log.info( | ||
|  |       `loki_message:::sendMessage - Successfully stored message to ${pubKey} via ${snode.ip}:${snode.port}` | ||
|  |     ); | ||
|  |   } | ||
|  | } |