Compare commits

...

3 commits

Author SHA1 Message Date
James Long 4fd86c9e8f Log sync method in response 2022-09-14 23:40:13 -04:00
James Long 06aa89bb9f Fix lint 2022-09-14 23:34:16 -04:00
James Long 7489e35a2e Switch syncing to simple sync method 2022-09-02 11:44:39 -04:00
3 changed files with 25 additions and 22 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,24 +121,15 @@ 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.set('X-ACTUAL-SYNC-METHOD', 'simple');
res.send(Buffer.from(responsePb.serializeBinary())); res.send(Buffer.from(responsePb.serializeBinary()));
}); });
@ -306,6 +297,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 }));
} }
}); });

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`);
@ -56,8 +57,8 @@ function addMessages(db, messages) {
return returnValue; return returnValue;
} }
function getMerkle(db, group_id) { function getMerkle(db) {
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 };