| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -448,7 +448,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      // If you don't have a profile name for this device, and profileName is set,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      // add profileName to conversation.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      const primaryDevicePubKey =
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        (await libloki.storage.getPrimaryDeviceFor(devicePubKey)) ||
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        (await window.Signal.Data.getPrimaryDeviceFor(devicePubKey)) ||
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        devicePubKey;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      const primaryConversation = allConversationsWithUser.find(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        c => c.id === primaryDevicePubKey
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -2247,12 +2247,10 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          return null;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      const conversation = conversationPrimary;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      // source = primarySource;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      return conversation.queueJob(async () => {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				      return conversationPrimary.queueJob(async () => {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        window.log.info(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          `Starting handleDataMessage for message ${message.idForLogging()} in conversation ${conversation.idForLogging()}`
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          `Starting handleDataMessage for message ${message.idForLogging()} in conversation ${conversationPrimary.idForLogging()}`
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        const GROUP_TYPES = textsecure.protobuf.GroupContext.Type;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        const type = message.get('type');
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2265,7 +2263,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        try {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          const now = new Date().getTime();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          let attributes = {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ...conversation.attributes,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ...conversationPrimary.attributes,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          };
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (dataMessage.group) {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2283,18 +2281,18 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              };
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              groupUpdate =
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversation.changedAttributes(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversationPrimary.changedAttributes(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                  _.pick(dataMessage.group, 'name', 'avatar')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                ) || {};
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              const addedMembers = _.difference(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                attributes.members,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversation.get('members')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversationPrimary.get('members')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              if (addedMembers.length > 0) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                groupUpdate.joined = addedMembers;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              if (conversation.get('left')) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              if (conversationPrimary.get('left')) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // TODO: Maybe we shouldn't assume this message adds us:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                // we could maybe still get this message by mistake
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                window.log.warn('re-added to a left group');
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2308,7 +2306,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              // Check if anyone got kicked:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              const removedMembers = _.difference(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversation.get('members'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversationPrimary.get('members'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                attributes.members
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2330,7 +2328,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                groupUpdate = { left: source };
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              attributes.members = _.without(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversation.get('members'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversationPrimary.get('members'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                source
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -2363,7 +2361,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            attachments: dataMessage.attachments,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            body: dataMessage.body,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            contact: dataMessage.contact,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversationId: conversation.id,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversationId: conversationPrimary.id,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            decrypted_at: now,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            errors: [],
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            flags: dataMessage.flags,
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2377,7 +2375,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (type === 'outgoing') {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            const receipts = Whisper.DeliveryReceipts.forMessage(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversation,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversationPrimary,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              message
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            receipts.forEach(receipt =>
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2390,10 +2388,10 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          attributes.active_at = now;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          conversation.set(attributes);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          conversationPrimary.set(attributes);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          // Re-enable typing if re-joined the group
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          conversation.updateTextInputState();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          conversationPrimary.updateTextInputState();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (message.isExpirationTimerUpdate()) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            message.set({
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2402,7 +2400,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                expireTimer: dataMessage.expireTimer,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              },
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversation.set({ expireTimer: dataMessage.expireTimer });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversationPrimary.set({ expireTimer: dataMessage.expireTimer });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          } else if (dataMessage.expireTimer) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            message.set({ expireTimer: dataMessage.expireTimer });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          }
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2414,7 +2412,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            message.isExpirationTimerUpdate() || expireTimer;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (shouldLogExpireTimerChange) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            window.log.info("Update conversation 'expireTimer'", {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              id: conversation.idForLogging(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              id: conversationPrimary.idForLogging(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              expireTimer,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              source: 'handleDataMessage',
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            });
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2422,8 +2420,8 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (!message.isEndSession()) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if (dataMessage.expireTimer) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              if (dataMessage.expireTimer !== conversation.get('expireTimer')) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversation.updateExpirationTimer(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              if (dataMessage.expireTimer !== conversationPrimary.get('expireTimer')) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversationPrimary.updateExpirationTimer(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                  dataMessage.expireTimer,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                  source,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                  message.get('received_at'),
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2433,18 +2431,18 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            } else if (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversation.get('expireTimer') &&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversationPrimary.get('expireTimer') &&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              // We only turn off timers if it's not a group update
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              !message.isGroupUpdate()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversation.updateExpirationTimer(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversationPrimary.updateExpirationTimer(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                null,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                source,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                message.get('received_at')
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          } else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            const endSessionType = conversation.isSessionResetReceived()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            const endSessionType = conversationPrimary.isSessionResetReceived()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              ? 'ongoing'
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              : 'done';
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            this.set({ endSessionType });
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -2476,11 +2474,11 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                message.attributes.body &&
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                message.attributes.body.indexOf(`@${ourNumber}`) !== -1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              ) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversation.set({ mentionedUs: true });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                conversationPrimary.set({ mentionedUs: true });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversation.set({
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                unreadCount: conversation.get('unreadCount') + 1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversationPrimary.set({
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                unreadCount: conversationPrimary.get('unreadCount') + 1,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                isArchived: false,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2488,7 +2486,7 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (type === 'outgoing') {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            const reads = Whisper.ReadReceipts.forMessage(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversation,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversationPrimary,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              message
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if (reads.length) {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2499,39 +2497,35 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // A sync'd message to ourself is automatically considered read and delivered
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if (conversation.isMe()) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if (conversationPrimary.isMe()) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              message.set({
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                read_by: conversation.getRecipients(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                delivered_to: conversation.getRecipients(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                read_by: conversationPrimary.getRecipients(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                delivered_to: conversationPrimary.getRecipients(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            message.set({ recipients: conversation.getRecipients() });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            message.set({ recipients: conversationPrimary.getRecipients() });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          const conversationTimestamp = conversation.get('timestamp');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          const conversationTimestamp = conversationPrimary.get('timestamp');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            !conversationTimestamp ||
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            message.get('sent_at') > conversationTimestamp
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          ) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversation.lastMessage = message.getNotificationText();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversation.set({
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversationPrimary.lastMessage = message.getNotificationText();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversationPrimary.set({
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              timestamp: message.get('sent_at'),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          const sendingDeviceConversation = await ConversationController.getOrCreateAndWait(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            primarySource,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            'private'
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (dataMessage.profileKey) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            const profileKey = dataMessage.profileKey.toString('base64');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if (source === textsecure.storage.user.getNumber()) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversation.set({ profileSharing: true });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            } else if (conversation.isPrivate()) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversation.setProfileKey(profileKey);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversationPrimary.set({ profileSharing: true });
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            } else if (conversationPrimary.isPrivate()) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversationPrimary.setProfileKey(profileKey);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            } else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              sendingDeviceConversation.setProfileKey(profileKey);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              conversationOrigin.setProfileKey(profileKey);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -2558,8 +2552,8 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                  and that user just sent us a friend request.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              */
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              const isFriend = sendingDeviceConversation.isFriend();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              const hasSentFriendRequest = sendingDeviceConversation.hasSentFriendRequest();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              const isFriend = conversationOrigin.isFriend();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              const hasSentFriendRequest = conversationOrigin.hasSentFriendRequest();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              autoAccept = isFriend || hasSentFriendRequest;
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              if (autoAccept) {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2573,13 +2567,13 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              if (isFriend) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                window.Whisper.events.trigger('endSession', source);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              } else if (hasSentFriendRequest) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                await sendingDeviceConversation.onFriendRequestAccepted();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                await conversationOrigin.onFriendRequestAccepted();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              } else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                await sendingDeviceConversation.onFriendRequestReceived();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                await conversationOrigin.onFriendRequestReceived();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            } else if (message.get('type') !== 'outgoing') {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              // Ignore 'outgoing' messages because they are sync messages
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              await sendingDeviceConversation.onFriendRequestAccepted();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              await conversationOrigin.onFriendRequestAccepted();
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -2601,11 +2595,11 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          await window.Signal.Data.updateConversation(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversationId,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversation.attributes,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            conversationPrimary.attributes,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            { Conversation: Whisper.Conversation }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          );
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          conversation.trigger('newmessage', message);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          conversationPrimary.trigger('newmessage', message);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          try {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // We go to the database here because, between the message save above and
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -2643,9 +2637,9 @@
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          if (message.get('unread')) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            // Need to do this here because the conversation has already changed states
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            if (autoAccept) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              await conversation.notifyFriendRequest(source, 'accepted');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              await conversationPrimary.notifyFriendRequest(source, 'accepted');
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            } else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              await conversation.notify(message);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				              await conversationPrimary.notify(message);
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				          }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |