Move the incoming hash filtering logic into sql.js to prevent data races

pull/164/head
Beaudan 6 years ago
parent 5f49c5aafd
commit cc3f98b20a

@ -1534,18 +1534,22 @@ async function saveMessage(data, { forceSave } = {}) {
return toCreate.id;
}
async function saveSeenMessageHashes(arrayOfHashes) {
async function saveSeenMessageHashes(incomingHashes) {
let promise;
const hashList = incomingHashes.map(h => h.hash);
const dupHashes = await getSeenMessagesByHashList(hashList);
const newHashes = incomingHashes.filter(h => !dupHashes.includes(h.hash));
db.serialize(() => {
promise = Promise.all([
db.run('BEGIN TRANSACTION;'),
...map(arrayOfHashes, hashData => saveSeenMessageHash(hashData)),
...map(newHashes, hashData => saveSeenMessageHash(hashData)),
db.run('COMMIT TRANSACTION;'),
]);
});
await promise;
return newHashes;
}
async function saveSeenMessageHash(data) {

@ -788,7 +788,7 @@ async function cleanSeenMessages() {
}
async function saveSeenMessageHashes(data) {
await channels.saveSeenMessageHashes(_cleanData(data));
return channels.saveSeenMessageHashes(_cleanData(data));
}
async function saveSeenMessageHash(data) {

@ -45,16 +45,13 @@
const filterIncomingMessages = async function filterIncomingMessages(
messages
) {
const incomingHashes = messages.map(m => m.hash);
const dupHashes = await window.Signal.Data.getSeenMessagesByHashList(
incomingHashes
);
const newMessages = messages.filter(m => !dupHashes.includes(m.hash));
const newHashes = newMessages.map(m => ({
const incomingHashes = messages.map(m => ({
expiresAt: m.expiration,
hash: m.hash,
}));
await window.Signal.Data.saveSeenMessageHashes(newHashes);
let newHashes = await window.Signal.Data.saveSeenMessageHashes(incomingHashes);
newHashes = newHashes.map(h => h.hash);
const newMessages = messages.filter(m => newHashes.includes(m.hash));
return newMessages;
};

Loading…
Cancel
Save