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.
		
		
		
		
		
			
		
			
	
	
		
			49 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
		
		
			
		
	
	
			49 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
| 
											4 years ago
										 | import _ from 'lodash'; | ||
|  | import { SignalService } from '../protobuf'; | ||
|  | import { sha256 } from '../session/crypto'; | ||
|  | 
 | ||
|  | const recentHashByConvo = new Map<string, Array<string>>(); | ||
|  | 
 | ||
|  | const maxHashToKeepPerConvo = 50; | ||
|  | 
 | ||
|  | export function isDuplicateBasedOnHash( | ||
|  |   dataMessage: SignalService.DataMessage, | ||
|  |   conversationId: string, | ||
|  |   sender: string | ||
|  | ): boolean { | ||
|  |   const toUseForHash = { | ||
|  |     ..._.omit( | ||
|  |       SignalService.DataMessage.toObject(dataMessage), | ||
|  |       'timestamp', | ||
|  |       'profile', | ||
|  |       'preview', | ||
|  |       'profileKey' | ||
|  |     ), | ||
|  |     conversationId, | ||
|  |     sender, | ||
|  |   }; | ||
|  | 
 | ||
|  |   if (!recentHashByConvo.has(conversationId)) { | ||
|  |     recentHashByConvo.set(conversationId, new Array()); | ||
|  |   } | ||
|  |   const newHash = sha256(JSON.stringify(toUseForHash)); | ||
|  | 
 | ||
|  |   // this can only be set based on the .set above()
 | ||
|  |   let recentHashForConvo = recentHashByConvo.get(conversationId) as Array<string>; | ||
|  | 
 | ||
|  |   // this hash already exists for this convo
 | ||
|  |   if (recentHashForConvo.some(n => n === newHash)) { | ||
|  |     return true; | ||
|  |   } | ||
|  |   // push the new hash at the end
 | ||
|  |   recentHashForConvo.push(newHash); | ||
|  |   if (recentHashForConvo.length > maxHashToKeepPerConvo) { | ||
|  |     // slice the last maxHashToKeepPerConvo hashes
 | ||
|  |     recentHashForConvo = recentHashForConvo?.slice(-maxHashToKeepPerConvo); | ||
|  |   } | ||
|  |   recentHashByConvo.set(conversationId, recentHashForConvo); | ||
|  |   return false; | ||
|  | } | ||
|  | 
 | ||
|  | // build a hash of the data and check against recent messages
 |