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; return toCreate.id;
} }
async function saveSeenMessageHashes(arrayOfHashes) { async function saveSeenMessageHashes(incomingHashes) {
let promise; 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(() => { db.serialize(() => {
promise = Promise.all([ promise = Promise.all([
db.run('BEGIN TRANSACTION;'), db.run('BEGIN TRANSACTION;'),
...map(arrayOfHashes, hashData => saveSeenMessageHash(hashData)), ...map(newHashes, hashData => saveSeenMessageHash(hashData)),
db.run('COMMIT TRANSACTION;'), db.run('COMMIT TRANSACTION;'),
]); ]);
}); });
await promise; await promise;
return newHashes;
} }
async function saveSeenMessageHash(data) { async function saveSeenMessageHash(data) {

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

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

Loading…
Cancel
Save