mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	sync are sent upon DB commit
This commit is contained in:
		| @@ -12,6 +12,8 @@ export class LoadResults { | ||||
|         this.noteReorderings = []; | ||||
|  | ||||
|         this.noteRevisions = []; | ||||
|  | ||||
|         this.contentNoteIdToSourceId = []; | ||||
|     } | ||||
|  | ||||
|     addNote(noteId, sourceId) { | ||||
| @@ -76,4 +78,16 @@ export class LoadResults { | ||||
|         const sourceIds = this.noteIdToSourceId[noteId]; | ||||
|         return sourceIds && !!sourceIds.find(sId => sId !== sourceId); | ||||
|     } | ||||
|  | ||||
|     addNoteContent(noteId, sourceId) { | ||||
|         this.contentNoteIdToSourceId.push({noteId, sourceId}); | ||||
|     } | ||||
|  | ||||
|     isNoteContentReloaded(noteId, sourceId) { | ||||
|         if (!noteId) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         return this.contentNoteIdToSourceId.find(l => l.noteId === noteId && l.sourceId !== sourceId); | ||||
|     } | ||||
| } | ||||
| @@ -328,7 +328,10 @@ class TreeCache { | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         // missing reloading the relation target note | ||||
|         syncRows.filter(sync => sync.entityName === 'note_contents').forEach(sync => { | ||||
|             loadResults.addNoteContent(sync.entityId, sync.sourceId); | ||||
|         }); | ||||
|  | ||||
|         syncRows.filter(sync => sync.entityName === 'note_revisions').forEach(sync => { | ||||
|             loadResults.addNoteRevision(sync.entityId, sync.noteId, sync.sourceId); | ||||
|         }); | ||||
|   | ||||
| @@ -4,6 +4,7 @@ import protectedSessionHolder from "../services/protected_session_holder.js"; | ||||
| import SpacedUpdate from "../services/spaced_update.js"; | ||||
| import server from "../services/server.js"; | ||||
| import libraryLoader from "../services/library_loader.js"; | ||||
| import noteDetailService from "../services/note_detail.js"; | ||||
|  | ||||
| const TPL = ` | ||||
| <div class="note-detail"> | ||||
| @@ -220,8 +221,12 @@ export default class NoteDetailWidget extends TabAwareWidget { | ||||
|         this.refresh(); | ||||
|     } | ||||
|  | ||||
|     entitiesReloadedListener({loadResults}) { | ||||
|         if (loadResults.isNoteReloaded(this.noteId, this.componentId)) { | ||||
|     async entitiesReloadedListener({loadResults}) { | ||||
|         if (loadResults.isNoteContentReloaded(this.noteId, this.componentId)) { | ||||
|             this.tabContext.noteFull = await noteDetailService.loadNoteFull(this.noteId); | ||||
|  | ||||
|             console.log("Reloaded", this.tabContext.noteFull); | ||||
|  | ||||
|             this.refreshWithNote(this.note, this.notePath); | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,3 +1,5 @@ | ||||
| import * as syncService from "../services/sync.js"; | ||||
|  | ||||
| const setupRoute = require('./setup'); | ||||
| const loginRoute = require('./login'); | ||||
| const indexRoute = require('./index'); | ||||
| @@ -53,7 +55,7 @@ const csrfMiddleware = csurf({ | ||||
| }); | ||||
|  | ||||
| function apiResultHandler(req, res, result) { | ||||
|     res.setHeader('trilium-max-sync-id', syncTableService.getMaxSyncId()); | ||||
|     res.setHeader('trilium-max-sync-id', syncService.getMaxSyncId()); | ||||
|  | ||||
|     // if it's an array and first element is integer then we consider this to be [statusCode, response] format | ||||
|     if (Array.isArray(result) && result.length > 0 && Number.isInteger(result[0])) { | ||||
|   | ||||
| @@ -21,6 +21,18 @@ function isEntityEventsDisabled() { | ||||
|     return !!namespace.get('disableEntityEvents'); | ||||
| } | ||||
|  | ||||
| function getSyncRows() { | ||||
|     return namespace.get('syncRows') || []; | ||||
| } | ||||
|  | ||||
| function addSyncRow(syncRow) { | ||||
|     const syncRows = getSyncRows(); | ||||
|  | ||||
|     syncRows.push(syncRow); | ||||
|  | ||||
|     namespace.set('syncRows', syncRows); | ||||
| } | ||||
|  | ||||
| function reset() { | ||||
|     clsHooked.reset(); | ||||
| } | ||||
| @@ -32,5 +44,7 @@ module.exports = { | ||||
|     getSourceId, | ||||
|     disableEntityEvents, | ||||
|     isEntityEventsDisabled, | ||||
|     reset | ||||
|     reset, | ||||
|     getSyncRows, | ||||
|     addSyncRow | ||||
| }; | ||||
| @@ -207,6 +207,8 @@ async function transactional(func) { | ||||
|  | ||||
|             await commit(); | ||||
|  | ||||
|             require('./ws.js').sendPingToAllClients(); | ||||
|  | ||||
|             transactionActive = false; | ||||
|             resolve(); | ||||
|         } | ||||
|   | ||||
| @@ -4,8 +4,6 @@ const dateUtils = require('./date_utils'); | ||||
| const log = require('./log'); | ||||
| const cls = require('./cls'); | ||||
|  | ||||
| let syncs = []; | ||||
|  | ||||
| async function insertEntitySync(entityName, entityId, sourceId) { | ||||
|     const sync = { | ||||
|         entityName: entityName, | ||||
| @@ -22,9 +20,7 @@ async function insertEntitySync(entityName, entityId, sourceId) { | ||||
| async function addEntitySync(entityName, entityId, sourceId) { | ||||
|     const sync = await insertEntitySync(entityName, entityId, sourceId); | ||||
|  | ||||
|     syncs.push(sync); | ||||
|  | ||||
|     setTimeout(() => require('./ws').sendPingToAllClients(), 50); | ||||
|     cls.addSyncRow(sync); | ||||
| } | ||||
|  | ||||
| async function addEntitySyncsForSector(entityName, entityPrimaryKey, sector) { | ||||
| @@ -35,14 +31,6 @@ async function addEntitySyncsForSector(entityName, entityPrimaryKey, sector) { | ||||
|     } | ||||
| } | ||||
|  | ||||
| function getMaxSyncId() { | ||||
|     return syncs.length === 0 ? 0 : syncs[syncs.length - 1].id; | ||||
| } | ||||
|  | ||||
| function getEntitySyncsNewerThan(syncId) { | ||||
|     return syncs.filter(s => s.id > syncId); | ||||
| } | ||||
|  | ||||
| async function cleanupSyncRowsForMissingEntities(entityName, entityPrimaryKey) { | ||||
|     await sql.execute(` | ||||
|       DELETE  | ||||
| @@ -114,7 +102,5 @@ module.exports = { | ||||
|     addApiTokenSync: async (apiTokenId, sourceId) => await addEntitySync("api_tokens", apiTokenId, sourceId), | ||||
|     addEntitySync, | ||||
|     fillAllSyncRows, | ||||
|     getEntitySyncsNewerThan, | ||||
|     getMaxSyncId, | ||||
|     addEntitySyncsForSector | ||||
| }; | ||||
| @@ -2,6 +2,7 @@ const WebSocket = require('ws'); | ||||
| const utils = require('./utils'); | ||||
| const log = require('./log'); | ||||
| const sql = require('./sql'); | ||||
| const cls = require('./cls'); | ||||
| const syncMutexService = require('./sync_mutex'); | ||||
|  | ||||
| let webSocketServer; | ||||
| @@ -89,11 +90,10 @@ async function fillInAdditionalProperties(sync) { | ||||
| } | ||||
|  | ||||
| async function sendPing(client) { | ||||
|     const syncData = require('./sync_table') | ||||
|         .getEntitySyncsNewerThan(lastAcceptedSyncIds[client.id]) | ||||
|     const syncRows = cls.getSyncRows() | ||||
|         .filter(r => r.entityName !== 'recent_notes'); // only noise ... | ||||
|  | ||||
|     for (const sync of syncData) { | ||||
|     for (const sync of syncRows) { | ||||
|         try { | ||||
|             await fillInAdditionalProperties(sync); | ||||
|         } | ||||
| @@ -107,7 +107,7 @@ async function sendPing(client) { | ||||
|  | ||||
|     sendMessage(client, { | ||||
|         type: 'sync', | ||||
|         data: syncData, | ||||
|         data: syncRows, | ||||
|         outstandingSyncs: stats.outstandingPushes + stats.outstandingPulls | ||||
|     }); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user