From 796181e00cb8e5dbcdfc6b0c2ee0cb1ccf283f1e Mon Sep 17 00:00:00 2001 From: Beaudan Date: Mon, 15 Apr 2019 13:19:06 +1000 Subject: [PATCH] Add database functions for storing, retrieving and cleaning last hash for snodes --- app/sql.js | 51 ++++++++++++++++++++++++++++++++++++++++++++++ js/background.js | 7 ++++--- js/modules/data.js | 16 +++++++++++++++ 3 files changed, 71 insertions(+), 3 deletions(-) diff --git a/app/sql.js b/app/sql.js index cf8fb38ac..96f2ff7e9 100644 --- a/app/sql.js +++ b/app/sql.js @@ -102,8 +102,10 @@ module.exports = { getMessageCount, saveMessage, cleanSeenMessages, + cleanLastHashes, saveSeenMessageHashes, saveSeenMessageHash, + updateLastHash, saveMessages, removeMessage, getUnreadByConversation, @@ -114,6 +116,7 @@ module.exports = { getAllUnsentMessages, getMessagesBySentAt, getSeenMessagesByHashList, + getLastHashBySnode, getExpiredMessages, getOutgoingWithoutExpiresAt, getNextExpiringMessage, @@ -421,6 +424,14 @@ async function updateToSchemaVersion6(currentVersion, instance) { ADD COLUMN friendRequestStatus INTEGER;` ); + await instance.run( + `CREATE TABLE lastHashes( + snode STRING PRIMARY KEY, + hash STRING, + expiresAt INTEGER + );` + ); + await instance.run( `CREATE TABLE seenMessages( hash STRING PRIMARY KEY, @@ -1556,6 +1567,27 @@ async function saveSeenMessageHashes(arrayOfHashes) { await promise; } +async function updateLastHash(data) { + const { snode, hash, expiresAt } = data; + + await db.run( + `INSERT OR REPLACE INTO lastHashes ( + snode, + hash, + expiresAt + ) values ( + $snode, + $hash, + $expiresAt + )`, + { + $snode: snode, + $hash: hash, + $expiresAt: expiresAt, + } + ); +} + async function saveSeenMessageHash(data) { const { expiresAt, hash } = data; await db.run( @@ -1573,6 +1605,12 @@ async function saveSeenMessageHash(data) { ); } +async function cleanLastHashes() { + await db.run('DELETE FROM lastHashes WHERE expiresAt <= $now;', { + $now: Date.now(), + }); +} + async function cleanSeenMessages() { await db.run('DELETE FROM seenMessages WHERE expiresAt <= $now;', { $now: Date.now(), @@ -1710,6 +1748,19 @@ async function getMessagesBySentAt(sentAt) { return map(rows, row => jsonToObject(row.json)); } +async function getLastHashBySnode(snode) { + const row = await db.get('SELECT * FROM lastHashes WHERE snode = $snode;', { + $snode: snode, + }); + + + if (!row) { + return null; + } + + return row.lastHash; +} + async function getSeenMessagesByHashList(hashes) { const rows = await db.all( `SELECT * FROM seenMessages WHERE hash IN ( ${hashes diff --git a/js/background.js b/js/background.js index 7ae4592ad..7ee457b05 100644 --- a/js/background.js +++ b/js/background.js @@ -501,13 +501,14 @@ } }); - function manageSeenMessages() { + function manageExpiringData() { window.Signal.Data.cleanSeenMessages(); - setTimeout(manageSeenMessages, 1000 * 60 * 60); + window.Signal.Data.cleanLastHashes(); + setTimeout(manageExpiringData, 1000 * 60 * 60); } async function start() { - manageSeenMessages(); + manageExpiringData(); window.dispatchEvent(new Event('storage_ready')); window.log.info('listening for registration events'); diff --git a/js/modules/data.js b/js/modules/data.js index c9c3dddbb..768eb9530 100644 --- a/js/modules/data.js +++ b/js/modules/data.js @@ -130,7 +130,9 @@ module.exports = { getMessageCount, saveMessage, cleanSeenMessages, + cleanLastHashes, saveSeenMessageHash, + updateLastHash, saveSeenMessageHashes, saveLegacyMessage, saveMessages, @@ -151,6 +153,7 @@ module.exports = { getNextExpiringMessage, getMessagesByConversation, getSeenMessagesByHashList, + getLastHashBySnode, getUnprocessedCount, getAllUnprocessed, @@ -778,10 +781,18 @@ async function cleanSeenMessages() { await channels.cleanSeenMessages(); } +async function cleanLastHashes() { + await channels.cleanLastHashes(); +} + async function saveSeenMessageHashes(data) { await channels.saveSeenMessageHashes(_cleanData(data)); } +async function updateLastHash(data) { + await channels.updateLastHash(_cleanData(data)); +} + async function saveSeenMessageHash(data) { await channels.saveSeenMessageHash(_cleanData(data)); } @@ -909,6 +920,11 @@ async function getMessagesByConversation( return new MessageCollection(messages); } +async function getLastHashBySnode(snode) { + const lastHash = await channels.getLastHashBySnode(snode); + return lastHash; +} + async function getSeenMessagesByHashList(hashes) { const seenMessages = await channels.getSeenMessagesByHashList(hashes); return seenMessages;