mirror of
				https://github.com/zadam/trilium.git
				synced 2025-11-04 05:28:59 +01:00 
			
		
		
		
	yet another attempt at fixing reporting sync changes to client
This commit is contained in:
		
							parent
							
								
									f54d855f55
								
							
						
					
					
						commit
						333735543e
					
				
							
								
								
									
										2
									
								
								app.js
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								app.js
									
									
									
									
									
								
							@ -10,8 +10,6 @@ const FileStore = require('session-file-store')(session);
 | 
			
		||||
const os = require('os');
 | 
			
		||||
const sessionSecret = require('./services/session_secret');
 | 
			
		||||
 | 
			
		||||
require('./services/ping_job');
 | 
			
		||||
 | 
			
		||||
const app = express();
 | 
			
		||||
 | 
			
		||||
// view engine setup
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,6 @@
 | 
			
		||||
 | 
			
		||||
const messaging = (function() {
 | 
			
		||||
    const changesToPushCountEl = $("#changes-to-push-count");
 | 
			
		||||
    let ws = null;
 | 
			
		||||
 | 
			
		||||
    function logError(message) {
 | 
			
		||||
        console.log(now(), message); // needs to be separate from .trace()
 | 
			
		||||
@ -21,12 +20,15 @@ const messaging = (function() {
 | 
			
		||||
 | 
			
		||||
        if (message.type === 'sync') {
 | 
			
		||||
            lastPingTs = new Date().getTime();
 | 
			
		||||
            const syncData = message.data.filter(sync => sync.source_id !== glob.sourceId);
 | 
			
		||||
 | 
			
		||||
            if (syncData.length > 0) {
 | 
			
		||||
                console.log(now(), "Sync data: ", message);
 | 
			
		||||
            if (message.data.length > 0) {
 | 
			
		||||
                console.log(now(), "Sync data: ", message.data);
 | 
			
		||||
 | 
			
		||||
                lastSyncId = message.data[message.data.length - 1].id;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            const syncData = message.data.filter(sync => sync.source_id !== glob.sourceId);
 | 
			
		||||
 | 
			
		||||
            if (syncData.some(sync => sync.entity_name === 'notes_tree')) {
 | 
			
		||||
                console.log(now(), "Reloading tree because of background changes");
 | 
			
		||||
 | 
			
		||||
@ -59,17 +61,20 @@ const messaging = (function() {
 | 
			
		||||
        const protocol = document.location.protocol === 'https:' ? 'wss' : 'ws';
 | 
			
		||||
 | 
			
		||||
        // use wss for secure messaging
 | 
			
		||||
        ws = new WebSocket(protocol + "://" + location.host);
 | 
			
		||||
        const ws = new WebSocket(protocol + "://" + location.host);
 | 
			
		||||
        ws.onopen = event => console.log(now(), "Connected to server with WebSocket");
 | 
			
		||||
        ws.onmessage = messageHandler;
 | 
			
		||||
        ws.onclose = function(){
 | 
			
		||||
            // Try to reconnect in 5 seconds
 | 
			
		||||
            setTimeout(() => connectWebSocket(), 5000);
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        return ws;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    connectWebSocket();
 | 
			
		||||
    const ws = connectWebSocket();
 | 
			
		||||
 | 
			
		||||
    let lastSyncId = glob.maxSyncIdAtLoad;
 | 
			
		||||
    let lastPingTs = new Date().getTime();
 | 
			
		||||
    let connectionBrokenNotification = null;
 | 
			
		||||
 | 
			
		||||
@ -92,7 +97,12 @@ const messaging = (function() {
 | 
			
		||||
 | 
			
		||||
            showMessage("Re-connected to server");
 | 
			
		||||
        }
 | 
			
		||||
    }, 3000);
 | 
			
		||||
 | 
			
		||||
        ws.send(JSON.stringify({
 | 
			
		||||
            type: 'ping',
 | 
			
		||||
            lastSyncId: lastSyncId
 | 
			
		||||
        }));
 | 
			
		||||
    }, 1000);
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
        logError
 | 
			
		||||
 | 
			
		||||
@ -4,10 +4,12 @@ const express = require('express');
 | 
			
		||||
const router = express.Router();
 | 
			
		||||
const auth = require('../services/auth');
 | 
			
		||||
const source_id = require('../services/source_id');
 | 
			
		||||
const sql = require('../services/sql');
 | 
			
		||||
 | 
			
		||||
router.get('', auth.checkAuth, async (req, res, next) => {
 | 
			
		||||
    res.render('index', {
 | 
			
		||||
        sourceId: await source_id.generateSourceId()
 | 
			
		||||
        sourceId: await source_id.generateSourceId(),
 | 
			
		||||
        maxSyncIdAtLoad: await sql.getSingleValue("SELECT MAX(id) FROM sync")
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,7 @@ async function runChecks() {
 | 
			
		||||
    await runSyncRowChecks("recent_notes", "note_tree_id", errorList);
 | 
			
		||||
 | 
			
		||||
    if (errorList.length > 0) {
 | 
			
		||||
        messaging.sendMessage({type: 'consistency-checks-failed'});
 | 
			
		||||
        messaging.sendMessageToAllClients({type: 'consistency-checks-failed'});
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        log.info("All consistency checks passed.");
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,9 @@
 | 
			
		||||
const WebSocket = require('ws');
 | 
			
		||||
const utils = require('./utils');
 | 
			
		||||
const log = require('./log');
 | 
			
		||||
const sql = require('./sql');
 | 
			
		||||
const options = require('./options');
 | 
			
		||||
const sync_setup = require('./sync_setup');
 | 
			
		||||
 | 
			
		||||
let webSocketServer;
 | 
			
		||||
 | 
			
		||||
@ -29,6 +32,9 @@ function init(httpServer, sessionParser) {
 | 
			
		||||
            if (message.type === 'log-error') {
 | 
			
		||||
                log.error('JS Error: ' + message.error);
 | 
			
		||||
            }
 | 
			
		||||
            else if (message.type === 'ping') {
 | 
			
		||||
                sendPing(ws, message.lastSyncId);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                log.error('Unrecognized message: ');
 | 
			
		||||
                log.error(message);
 | 
			
		||||
@ -37,7 +43,15 @@ function init(httpServer, sessionParser) {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function sendMessage(message) {
 | 
			
		||||
async function sendMessage(client, message) {
 | 
			
		||||
    const jsonStr = JSON.stringify(message);
 | 
			
		||||
 | 
			
		||||
    if (client.readyState === WebSocket.OPEN) {
 | 
			
		||||
        client.send(jsonStr);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function sendMessageToAllClients(message) {
 | 
			
		||||
    const jsonStr = JSON.stringify(message);
 | 
			
		||||
 | 
			
		||||
    webSocketServer.clients.forEach(function each(client) {
 | 
			
		||||
@ -47,7 +61,21 @@ async function sendMessage(message) {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function sendPing(client, lastSentSyncId) {
 | 
			
		||||
    const syncData = await sql.getResults("SELECT * FROM sync WHERE id > ?", [lastSentSyncId]);
 | 
			
		||||
 | 
			
		||||
    const lastSyncedPush = await options.getOption('last_synced_push');
 | 
			
		||||
 | 
			
		||||
    const changesToPushCount = await sql.getSingleValue("SELECT COUNT(*) FROM sync WHERE id > ?", [lastSyncedPush]);
 | 
			
		||||
 | 
			
		||||
    await sendMessage(client, {
 | 
			
		||||
        type: 'sync',
 | 
			
		||||
        data: syncData,
 | 
			
		||||
        changesToPushCount: sync_setup.isSyncSetup ? changesToPushCount : 0
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    init,
 | 
			
		||||
    sendMessage
 | 
			
		||||
    sendMessageToAllClients
 | 
			
		||||
};
 | 
			
		||||
@ -1,30 +0,0 @@
 | 
			
		||||
const sql = require('./sql');
 | 
			
		||||
const messaging = require('./messaging');
 | 
			
		||||
const options = require('./options');
 | 
			
		||||
const sync_setup = require('./sync_setup');
 | 
			
		||||
 | 
			
		||||
let lastSentSyncId;
 | 
			
		||||
 | 
			
		||||
async function sendPing() {
 | 
			
		||||
    const syncData = await sql.getResults("SELECT * FROM sync WHERE id > ?", [lastSentSyncId]);
 | 
			
		||||
 | 
			
		||||
    const lastSyncedPush = await options.getOption('last_synced_push');
 | 
			
		||||
 | 
			
		||||
    const changesToPushCount = await sql.getSingleValue("SELECT COUNT(*) FROM sync WHERE id > ?", [lastSyncedPush]);
 | 
			
		||||
 | 
			
		||||
    messaging.sendMessage({
 | 
			
		||||
        type: 'sync',
 | 
			
		||||
        data: syncData,
 | 
			
		||||
        changesToPushCount: sync_setup.isSyncSetup ? changesToPushCount : 0
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (syncData.length > 0) {
 | 
			
		||||
        lastSentSyncId = syncData[syncData.length - 1].id;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sql.dbReady.then(async () => {
 | 
			
		||||
    lastSentSyncId = await sql.getSingleValue("SELECT MAX(id) FROM sync");
 | 
			
		||||
 | 
			
		||||
    setInterval(sendPing, 1000);
 | 
			
		||||
});
 | 
			
		||||
@ -267,7 +267,7 @@ async function checkContentHash(syncContext) {
 | 
			
		||||
 | 
			
		||||
            if (key !== 'recent_notes') {
 | 
			
		||||
                // let's not get alarmed about recent notes which get updated often and can cause failures in race conditions
 | 
			
		||||
                await messaging.sendMessage({type: 'sync-hash-check-failed'});
 | 
			
		||||
                await messaging.sendMessageToAllClients({type: 'sync-hash-check-failed'});
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -301,7 +301,8 @@
 | 
			
		||||
      const baseApiUrl = 'api/';
 | 
			
		||||
      const glob = {
 | 
			
		||||
          activeDialog: null,
 | 
			
		||||
          sourceId: '<%= sourceId %>'
 | 
			
		||||
          sourceId: '<%= sourceId %>',
 | 
			
		||||
          maxSyncIdAtLoad: <%= maxSyncIdAtLoad %>
 | 
			
		||||
      };
 | 
			
		||||
    </script>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user