Switch syncing to simple sync method

This commit is contained in:
James Long 2022-09-02 11:44:39 -04:00
parent 32bf923c1a
commit e3f1fafad9
3 changed files with 25 additions and 23 deletions

View file

@ -8,7 +8,7 @@ let errorMiddleware = require('./util/error-middleware');
let config = require('./load-config'); let config = require('./load-config');
let { getAccountDb } = require('./account-db'); let { getAccountDb } = require('./account-db');
let fullSync = require('./sync-full'); let simpleSync = require('./sync-simple');
let actual = require('@actual-app/api'); let actual = require('@actual-app/api');
let SyncPb = actual.internal.SyncProtoBuf; let SyncPb = actual.internal.SyncProtoBuf;
@ -121,22 +121,12 @@ app.post('/sync', async (req, res) => {
return false; return false;
} }
// TODO: We also provide a "simple" sync method which currently isn't let { trie, newMessages } = simpleSync.sync(messages, since, group_id);
// used. This method just stores the messages locally and doesn't
// load the whole app at all. If we want to support end-to-end
// encryption, this method is required because we can't read the
// messages. Using it looks like this:
//
// let simpleSync = require('./sync-simple');
// let {trie, newMessages } = simpleSync.sync(messages, since, file_id);
let { trie, newMessages } = await fullSync.sync(messages, since, file_id);
// encode it back... // encode it back...
let responsePb = new SyncPb.SyncResponse(); let responsePb = new SyncPb.SyncResponse();
responsePb.setMerkle(JSON.stringify(trie)); responsePb.setMerkle(JSON.stringify(trie));
newMessages.forEach(msg => responsePb.addMessages(msg));
newMessages.forEach((msg) => responsePb.addMessages(msg));
res.set('Content-Type', 'application/actual-sync'); res.set('Content-Type', 'application/actual-sync');
res.send(Buffer.from(responsePb.serializeBinary())); res.send(Buffer.from(responsePb.serializeBinary()));
@ -306,6 +296,7 @@ app.post('/upload-user-file', async (req, res) => {
'UPDATE files SET sync_version = ?, encrypt_meta = ?, name = ? WHERE id = ?', 'UPDATE files SET sync_version = ?, encrypt_meta = ?, name = ? WHERE id = ?',
[syncFormatVersion, encryptMeta, name, fileId] [syncFormatVersion, encryptMeta, name, fileId]
); );
res.send(JSON.stringify({ status: 'ok', groupId })); res.send(JSON.stringify({ status: 'ok', groupId }));
} }
}); });
@ -377,7 +368,7 @@ app.get('/list-user-files', (req, res) => {
res.send( res.send(
JSON.stringify({ JSON.stringify({
status: 'ok', status: 'ok',
data: rows.map((row) => ({ data: rows.map(row => ({
deleted: row.deleted, deleted: row.deleted,
fileId: row.id, fileId: row.id,
groupId: row.group_id, groupId: row.group_id,

View file

@ -1,10 +1,9 @@
CREATE TABLE messages_binary CREATE TABLE messages_binary
(timestamp TEXT, (timestamp TEXT PRIMARY KEY,
is_encrypted BOOLEAN, is_encrypted BOOLEAN,
content bytea, content bytea);
PRIMARY KEY(timestamp, group_id));
CREATE TABLE messages_merkles CREATE TABLE messages_merkles
(id TEXT PRIMAREY KEY, (id INTEGER PRIMARY KEY,
merkle TEXT); merkle TEXT);

View file

@ -4,7 +4,8 @@ let { openDatabase } = require('./db');
let actual = require('@actual-app/api'); let actual = require('@actual-app/api');
let merkle = actual.internal.merkle; let merkle = actual.internal.merkle;
let Timestamp = actual.internal.timestamp.Timestamp; let SyncPb = actual.internal.SyncProtoBuf;
let Timestamp = actual.internal.timestamp.default;
function getGroupDb(groupId) { function getGroupDb(groupId) {
let path = join(__dirname, `user-files/${groupId}.sqlite`); let path = join(__dirname, `user-files/${groupId}.sqlite`);
@ -57,7 +58,7 @@ function addMessages(db, messages) {
} }
function getMerkle(db, group_id) { function getMerkle(db, group_id) {
let rows = db.all('SELECT * FROM messages_merkles', [group_id]); let rows = db.all('SELECT * FROM messages_merkles');
if (rows.length > 0) { if (rows.length > 0) {
return JSON.parse(rows[0].merkle); return JSON.parse(rows[0].merkle);
@ -68,8 +69,8 @@ function getMerkle(db, group_id) {
} }
} }
function sync(messages, since, fileId) { function sync(messages, since, groupId) {
let db = getGroupDb(fileId); let db = getGroupDb(groupId);
let newMessages = db.all( let newMessages = db.all(
`SELECT * FROM messages_binary `SELECT * FROM messages_binary
WHERE timestamp > ? WHERE timestamp > ?
@ -79,7 +80,18 @@ function sync(messages, since, fileId) {
let trie = addMessages(db, messages); let trie = addMessages(db, messages);
return { trie, newMessages }; db.close();
return {
trie,
newMessages: newMessages.map(msg => {
const envelopePb = new SyncPb.MessageEnvelope();
envelopePb.setTimestamp(msg.timestamp);
envelopePb.setIsencrypted(msg.is_encrypted);
envelopePb.setContent(msg.content);
return envelopePb;
})
};
} }
module.exports = { sync }; module.exports = { sync };