signal-desktop/js/deletes.js

93 lines
2.4 KiB
JavaScript
Raw Normal View History

2020-10-30 20:34:04 +00:00
// Copyright 2020 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
2020-04-29 21:24:12 +00:00
/* global
Backbone,
Whisper,
MessageController,
ConversationController
*/
/* eslint-disable more/no-then */
// eslint-disable-next-line func-names
(function () {
2020-04-29 21:24:12 +00:00
window.Whisper = window.Whisper || {};
Whisper.Deletes = new (Backbone.Collection.extend({
forMessage(message) {
const matchingDeletes = this.filter({
targetSentTimestamp: message.get('sent_at'),
fromId: message.getContactId(),
2020-04-29 21:24:12 +00:00
});
if (matchingDeletes.length > 0) {
window.log.info('Found early DOE for message');
this.remove(matchingDeletes);
return matchingDeletes;
}
return [];
},
async onDelete(del) {
2020-04-29 21:24:12 +00:00
try {
// The conversation the deleted message was in; we have to find it in the database
// to to figure that out.
const targetConversation = await ConversationController.getConversationForTargetMessage(
del.get('fromId'),
del.get('targetSentTimestamp')
);
2020-04-29 21:24:12 +00:00
if (!targetConversation) {
2020-04-29 21:24:12 +00:00
window.log.info(
'No target conversation for DOE',
2020-04-29 21:24:12 +00:00
del.get('fromId'),
del.get('targetSentTimestamp')
);
return;
}
// Do not await, since this can deadlock the queue
targetConversation.queueJob(async () => {
window.log.info('Handling DOE for', del.get('targetSentTimestamp'));
const messages = await window.Signal.Data.getMessagesBySentAt(
del.get('targetSentTimestamp'),
{
MessageCollection: Whisper.MessageCollection,
}
);
2020-04-29 21:24:12 +00:00
const targetMessage = messages.find(
m => del.get('fromId') === m.getContactId()
);
2020-04-29 21:24:12 +00:00
if (!targetMessage) {
window.log.info(
'No message for DOE',
del.get('fromId'),
del.get('targetSentTimestamp')
);
2020-04-29 21:24:12 +00:00
return;
}
2020-04-29 21:24:12 +00:00
const message = MessageController.register(
targetMessage.id,
targetMessage
);
2020-04-29 21:24:12 +00:00
await window.Signal.Util.deleteForEveryone(message, del);
2020-04-29 21:24:12 +00:00
this.remove(del);
});
2020-04-29 21:24:12 +00:00
} catch (error) {
window.log.error(
'Deletes.onDelete error:',
error && error.stack ? error.stack : error
);
}
},
}))();
})();