reload frontend when consistency is fixed

This commit is contained in:
zadam 2021-09-12 11:18:06 +02:00
parent 3f2ee4aefd
commit 9b9be5d155
4 changed files with 69 additions and 49 deletions

View File

@ -50,6 +50,12 @@ function load() {
log.info(`Becca (note cache) load took ${Date.now() - start}ms`); log.info(`Becca (note cache) load took ${Date.now() - start}ms`);
} }
function reload() {
load();
require('../services/ws').reloadFrontend();
}
function postProcessEntityUpdate(entityName, entity) { function postProcessEntityUpdate(entityName, entity) {
if (entityName === 'branches') { if (entityName === 'branches') {
branchUpdated(entity); branchUpdated(entity);
@ -221,5 +227,6 @@ eventService.subscribe(eventService.LEAVE_PROTECTED_SESSION, load);
module.exports = { module.exports = {
load, load,
reload,
beccaLoaded beccaLoaded
}; };

View File

@ -47,15 +47,7 @@ function logRows(entityChanges) {
} }
} }
async function handleMessage(event) { async function executeFrontendUpdate(entityChanges) {
const message = JSON.parse(event.data);
for (const messageHandler of messageHandlers) {
messageHandler(message);
}
if (message.type === 'frontend-update') {
let {entityChanges} = message.data;
lastPingTs = Date.now(); lastPingTs = Date.now();
if (entityChanges.length > 0) { if (entityChanges.length > 0) {
@ -84,13 +76,26 @@ async function handleMessage(event) {
consumeQueuePromise = consumeFrontendUpdateData(); consumeQueuePromise = consumeFrontendUpdateData();
await consumeQueuePromise; await consumeQueuePromise;
} } finally {
finally {
// finish and set to null to signal somebody else can pick it up // finish and set to null to signal somebody else can pick it up
consumeQueuePromise = null; consumeQueuePromise = null;
} }
} }
} }
async function handleMessage(event) {
const message = JSON.parse(event.data);
for (const messageHandler of messageHandlers) {
messageHandler(message);
}
if (message.type === 'reload-frontend') {
utils.reloadFrontendApp();
}
else if (message.type === 'frontend-update') {
await executeFrontendUpdate(message.data.entityChanges);
}
else if (message.type === 'sync-hash-check-failed') { else if (message.type === 'sync-hash-check-failed') {
toastService.showError("Sync check failed!", 60000); toastService.showError("Sync check failed!", 60000);
} }
@ -211,7 +216,6 @@ setTimeout(() => {
export default { export default {
logError, logError,
subscribeToMessages, subscribeToMessages,
waitForEntityChangeId,
waitForMaxKnownEntityChangeId, waitForMaxKnownEntityChangeId,
getMaxKnownEntityChangeSyncId: () => lastAcceptedEntityChangeSyncId getMaxKnownEntityChangeSyncId: () => lastAcceptedEntityChangeSyncId
}; };

View File

@ -288,14 +288,17 @@ class ConsistencyChecks {
WHERE note_contents.noteId IS NULL`, WHERE note_contents.noteId IS NULL`,
({noteId, isProtected, type, mime}) => { ({noteId, isProtected, type, mime}) => {
if (this.autoFix) { if (this.autoFix) {
const utcDateModified = dateUtils.utcNowDateTime(); // it might be possible that the note_content is not available only because of the interrupted
// sync and it will come later. It's therefore important to guarantee that this artifical
// record won't overwrite the real one coming from the sync.
const fakeDate = "2000-01-01 00:00:00Z";
// manually creating row since this can also affect deleted notes // manually creating row since this can also affect deleted notes
sql.upsert("note_contents", "noteId", { sql.upsert("note_contents", "noteId", {
noteId: noteId, noteId: noteId,
content: getBlankContent(isProtected, type, mime), content: getBlankContent(isProtected, type, mime),
utcDateModified: utcDateModified, utcDateModified: fakeDate,
dateModified: dateUtils.localNowDateTime() dateModified: fakeDate
}); });
const hash = utils.hash(utils.randomString(10)); const hash = utils.hash(utils.randomString(10));
@ -305,7 +308,7 @@ class ConsistencyChecks {
entityId: noteId, entityId: noteId,
hash: hash, hash: hash,
isErased: false, isErased: false,
utcDateChanged: utcDateModified, utcDateChanged: fakeDate,
isSynced: true isSynced: true
}); });
@ -358,7 +361,8 @@ class ConsistencyChecks {
AND branches.isDeleted = 0`, AND branches.isDeleted = 0`,
({parentNoteId}) => { ({parentNoteId}) => {
if (this.autoFix) { if (this.autoFix) {
const branchIds = sql.getColumn(`SELECT branchId const branchIds = sql.getColumn(`
SELECT branchId
FROM branches FROM branches
WHERE isDeleted = 0 WHERE isDeleted = 0
AND parentNoteId = ?`, [parentNoteId]); AND parentNoteId = ?`, [parentNoteId]);
@ -584,7 +588,7 @@ class ConsistencyChecks {
} }
if (this.fixedIssues) { if (this.fixedIssues) {
require("../becca/becca_loader").load(); require("../becca/becca_loader").reload();
} }
return !this.unrecoveredConsistencyErrors; return !this.unrecoveredConsistencyErrors;

View File

@ -178,6 +178,10 @@ function syncFailed() {
sendMessageToAllClients({ type: 'sync-failed', lastSyncedPush }); sendMessageToAllClients({ type: 'sync-failed', lastSyncedPush });
} }
function reloadFrontend() {
sendMessageToAllClients({ type: 'reload-frontend' });
}
function setLastSyncedPush(entityChangeId) { function setLastSyncedPush(entityChangeId) {
lastSyncedPush = entityChangeId; lastSyncedPush = entityChangeId;
} }
@ -190,5 +194,6 @@ module.exports = {
syncFinished, syncFinished,
syncFailed, syncFailed,
sendTransactionEntityChangesToAllClients, sendTransactionEntityChangesToAllClients,
setLastSyncedPush setLastSyncedPush,
reloadFrontend
}; };