yet another attempt at fixing reporting sync changes to client

This commit is contained in:
azivner 2017-12-19 23:22:21 -05:00
parent f54d855f55
commit 333735543e
8 changed files with 54 additions and 45 deletions

2
app.js
View File

@ -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

View File

@ -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

View File

@ -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")
});
});

View File

@ -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.");

View File

@ -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
};

View File

@ -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);
});

View File

@ -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'});
}
}
}

View File

@ -301,7 +301,8 @@
const baseApiUrl = 'api/';
const glob = {
activeDialog: null,
sourceId: '<%= sourceId %>'
sourceId: '<%= sourceId %>',
maxSyncIdAtLoad: <%= maxSyncIdAtLoad %>
};
</script>