|
|
|
import { initIncomingMessage } from './dataMessage';
|
|
|
|
import { toNumber } from 'lodash';
|
|
|
|
import { ConversationController } from '../session/conversations';
|
|
|
|
|
|
|
|
export async function onError(ev: any) {
|
|
|
|
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.getInstance().getOrCreateAndWait(
|
|
|
|
id,
|
|
|
|
'private'
|
|
|
|
);
|
|
|
|
// force conversation unread count to be > 0 so it is highlighted
|
|
|
|
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.updateLastMessage();
|
|
|
|
conversation.notify(message);
|
|
|
|
|
|
|
|
if (ev.confirm) {
|
|
|
|
ev.confirm();
|
|
|
|
}
|
|
|
|
await conversation.commit();
|
|
|
|
}
|
|
|
|
|
|
|
|
throw error;
|
|
|
|
}
|