import { initIncomingMessage } from './dataMessage'; import { toNumber } from 'lodash'; import { SessionProtocol } from '../session/protocols'; import { PubKey } from '../session/types'; async function onNoSession(ev: any) { const { ConversationController, Whisper } = window; const pubkey = ev.proto.source; const convo = await ConversationController.getOrCreateAndWait( pubkey, 'private' ); if (!convo.get('sessionRestoreSeen')) { convo.set({ sessionRestoreSeen: true }); await window.Signal.Data.updateConversation(convo.id, convo.attributes, { Conversation: Whisper.Conversation, }); await SessionProtocol.sendSessionRequestIfNeeded(new PubKey(pubkey)); } else { window.log.debug(`Already seen session restore for pubkey: ${pubkey}`); if (ev.confirm) { ev.confirm(); } } } export async function onError(ev: any) { const noSession = ev.error && ev.error.message && ev.error.message.indexOf('No record for device') === 0; if (noSession) { await onNoSession(ev); // We don't want to display any failed messages in the conversation: return; } const { ConversationController, Whisper } = window; const { error } = ev; window.log.error( 'background onError:', window.Signal.Errors.toLogFormat(error) ); if (ev.proto) { if (error && error.name === 'MessageCounterError') { if (ev.confirm) { ev.confirm(); } // Ignore this message. It is likely a duplicate delivery // because the server lost our ack the first time. return; } const envelope = ev.proto; const message = initIncomingMessage(envelope); message.saveErrors(error || new Error('Error was null')); const id = message.get('conversationId'); const conversation = await ConversationController.getOrCreateAndWait( id, 'private' ); conversation.set({ active_at: Date.now(), unreadCount: toNumber(conversation.get('unreadCount')) + 1, }); const conversationTimestamp = conversation.get('timestamp'); const messageTimestamp = message.get('timestamp'); if (!conversationTimestamp || messageTimestamp > conversationTimestamp) { conversation.set({ timestamp: message.get('sent_at') }); } conversation.trigger('newmessage', message); conversation.notify(message); if (ev.confirm) { ev.confirm(); } await window.Signal.Data.updateConversation(id, conversation.attributes, { Conversation: Whisper.Conversation, }); } throw error; }