mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
server-ts: Port becca_loader
This commit is contained in:
parent
3d5ef81860
commit
d35613f510
@ -1,5 +1,5 @@
|
|||||||
module.exports = () => {
|
module.exports = () => {
|
||||||
const beccaLoader = require('../../src/becca/becca_loader.js');
|
const beccaLoader = require('../../src/becca/becca_loader');
|
||||||
const becca = require('../../src/becca/becca.js');
|
const becca = require('../../src/becca/becca.js');
|
||||||
const cls = require('../../src/services/cls');
|
const cls = require('../../src/services/cls');
|
||||||
const log = require('../../src/services/log');
|
const log = require('../../src/services/log');
|
||||||
|
@ -8,7 +8,7 @@ const sessionParser = require('./routes/session_parser.js');
|
|||||||
const utils = require('./services/utils');
|
const utils = require('./services/utils');
|
||||||
|
|
||||||
require('./services/handlers.js');
|
require('./services/handlers.js');
|
||||||
require('./becca/becca_loader.js');
|
require('./becca/becca_loader');
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
|
@ -1,19 +1,20 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
const sql = require('../services/sql');
|
import sql = require('../services/sql');
|
||||||
const eventService = require('../services/events');
|
import eventService = require('../services/events');
|
||||||
const becca = require('./becca');
|
import becca = require('./becca');
|
||||||
const sqlInit = require('../services/sql_init');
|
import sqlInit = require('../services/sql_init');
|
||||||
const log = require('../services/log');
|
import log = require('../services/log');
|
||||||
const BNote = require('./entities/bnote');
|
import BNote = require('./entities/bnote');
|
||||||
const BBranch = require('./entities/bbranch');
|
import BBranch = require('./entities/bbranch');
|
||||||
const BAttribute = require('./entities/battribute');
|
import BAttribute = require('./entities/battribute');
|
||||||
const BOption = require('./entities/boption');
|
import BOption = require('./entities/boption');
|
||||||
const BEtapiToken = require('./entities/betapi_token');
|
import BEtapiToken = require('./entities/betapi_token');
|
||||||
const cls = require('../services/cls');
|
import cls = require('../services/cls');
|
||||||
const entityConstructor = require('../becca/entity_constructor');
|
import entityConstructor = require('../becca/entity_constructor');
|
||||||
|
import { AttributeRow, BranchRow, EtapiTokenRow, NoteRow, OptionRow } from './entities/rows';
|
||||||
|
|
||||||
const beccaLoaded = new Promise((res, rej) => {
|
const beccaLoaded = new Promise<void>((res, rej) => {
|
||||||
sqlInit.dbReady.then(() => {
|
sqlInit.dbReady.then(() => {
|
||||||
cls.init(() => {
|
cls.init(() => {
|
||||||
load();
|
load();
|
||||||
@ -38,7 +39,7 @@ function load() {
|
|||||||
new BNote().update(row).init();
|
new BNote().update(row).init();
|
||||||
}
|
}
|
||||||
|
|
||||||
const branchRows = sql.getRawRows(`SELECT branchId, noteId, parentNoteId, prefix, notePosition, isExpanded, utcDateModified FROM branches WHERE isDeleted = 0`);
|
const branchRows = sql.getRawRows<{ notePosition: number}>(`SELECT branchId, noteId, parentNoteId, prefix, notePosition, isExpanded, utcDateModified FROM branches WHERE isDeleted = 0`);
|
||||||
// in-memory sort is faster than in the DB
|
// in-memory sort is faster than in the DB
|
||||||
branchRows.sort((a, b) => a.notePosition - b.notePosition);
|
branchRows.sort((a, b) => a.notePosition - b.notePosition);
|
||||||
|
|
||||||
@ -46,15 +47,15 @@ function load() {
|
|||||||
new BBranch().update(row).init();
|
new BBranch().update(row).init();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const row of sql.getRawRows(`SELECT attributeId, noteId, type, name, value, isInheritable, position, utcDateModified FROM attributes WHERE isDeleted = 0`)) {
|
for (const row of sql.getRawRows<AttributeRow>(`SELECT attributeId, noteId, type, name, value, isInheritable, position, utcDateModified FROM attributes WHERE isDeleted = 0`)) {
|
||||||
new BAttribute().update(row).init();
|
new BAttribute().update(row).init();
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const row of sql.getRows(`SELECT name, value, isSynced, utcDateModified FROM options`)) {
|
for (const row of sql.getRows<OptionRow>(`SELECT name, value, isSynced, utcDateModified FROM options`)) {
|
||||||
new BOption(row);
|
new BOption(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const row of sql.getRows(`SELECT etapiTokenId, name, tokenHash, utcDateCreated, utcDateModified FROM etapi_tokens WHERE isDeleted = 0`)) {
|
for (const row of sql.getRows<EtapiTokenRow>(`SELECT etapiTokenId, name, tokenHash, utcDateCreated, utcDateModified FROM etapi_tokens WHERE isDeleted = 0`)) {
|
||||||
new BEtapiToken(row);
|
new BEtapiToken(row);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -68,7 +69,7 @@ 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(reason) {
|
function reload(reason: string) {
|
||||||
load();
|
load();
|
||||||
|
|
||||||
require('../services/ws').reloadFrontend(reason || "becca reloaded");
|
require('../services/ws').reloadFrontend(reason || "becca reloaded");
|
||||||
@ -112,7 +113,7 @@ eventService.subscribeBeccaLoader(eventService.ENTITY_CHANGED, ({entityName, en
|
|||||||
* @param entityRow - can be a becca entity (change comes from this trilium instance) or just a row (from sync).
|
* @param entityRow - can be a becca entity (change comes from this trilium instance) or just a row (from sync).
|
||||||
* It should be therefore treated as a row.
|
* It should be therefore treated as a row.
|
||||||
*/
|
*/
|
||||||
function postProcessEntityUpdate(entityName, entityRow) {
|
function postProcessEntityUpdate(entityName: string, entityRow: any) {
|
||||||
if (entityName === 'notes') {
|
if (entityName === 'notes') {
|
||||||
noteUpdated(entityRow);
|
noteUpdated(entityRow);
|
||||||
} else if (entityName === 'branches') {
|
} else if (entityName === 'branches') {
|
||||||
@ -140,13 +141,13 @@ eventService.subscribeBeccaLoader([eventService.ENTITY_DELETED, eventService.ENT
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
function noteDeleted(noteId) {
|
function noteDeleted(noteId: string) {
|
||||||
delete becca.notes[noteId];
|
delete becca.notes[noteId];
|
||||||
|
|
||||||
becca.dirtyNoteSetCache();
|
becca.dirtyNoteSetCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
function branchDeleted(branchId) {
|
function branchDeleted(branchId: string) {
|
||||||
const branch = becca.branches[branchId];
|
const branch = becca.branches[branchId];
|
||||||
|
|
||||||
if (!branch) {
|
if (!branch) {
|
||||||
@ -173,23 +174,26 @@ function branchDeleted(branchId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete becca.childParentToBranch[`${branch.noteId}-${branch.parentNoteId}`];
|
delete becca.childParentToBranch[`${branch.noteId}-${branch.parentNoteId}`];
|
||||||
delete becca.branches[branch.branchId];
|
if (branch.branchId) {
|
||||||
}
|
delete becca.branches[branch.branchId];
|
||||||
|
|
||||||
function noteUpdated(entityRow) {
|
|
||||||
const note = becca.notes[entityRow.noteId];
|
|
||||||
|
|
||||||
if (note) {
|
|
||||||
// type / mime could have been changed, and they are present in flatTextCache
|
|
||||||
note.flatTextCache = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function branchUpdated(branchRow) {
|
function noteUpdated(entityRow: NoteRow) {
|
||||||
|
const note = becca.notes[entityRow.noteId];
|
||||||
|
|
||||||
|
if (note) {
|
||||||
|
// FIXME, this wouldn't have worked in the original implementation since the variable was named __flatTextCache.
|
||||||
|
// type / mime could have been changed, and they are present in flatTextCache
|
||||||
|
note.__flatTextCache = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function branchUpdated(branchRow: BranchRow) {
|
||||||
const childNote = becca.notes[branchRow.noteId];
|
const childNote = becca.notes[branchRow.noteId];
|
||||||
|
|
||||||
if (childNote) {
|
if (childNote) {
|
||||||
childNote.flatTextCache = null;
|
childNote.__flatTextCache = null;
|
||||||
childNote.sortParents();
|
childNote.sortParents();
|
||||||
|
|
||||||
// notes in the subtree can get new inherited attributes
|
// notes in the subtree can get new inherited attributes
|
||||||
@ -204,7 +208,7 @@ function branchUpdated(branchRow) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function attributeDeleted(attributeId) {
|
function attributeDeleted(attributeId: string) {
|
||||||
const attribute = becca.attributes[attributeId];
|
const attribute = becca.attributes[attributeId];
|
||||||
|
|
||||||
if (!attribute) {
|
if (!attribute) {
|
||||||
@ -239,8 +243,7 @@ function attributeDeleted(attributeId) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param {BAttribute} attributeRow */
|
function attributeUpdated(attributeRow: BAttribute) {
|
||||||
function attributeUpdated(attributeRow) {
|
|
||||||
const attribute = becca.attributes[attributeRow.attributeId];
|
const attribute = becca.attributes[attributeRow.attributeId];
|
||||||
const note = becca.notes[attributeRow.noteId];
|
const note = becca.notes[attributeRow.noteId];
|
||||||
|
|
||||||
@ -253,7 +256,7 @@ function attributeUpdated(attributeRow) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function noteReorderingUpdated(branchIdList) {
|
function noteReorderingUpdated(branchIdList: number[]) {
|
||||||
const parentNoteIds = new Set();
|
const parentNoteIds = new Set();
|
||||||
|
|
||||||
for (const branchId in branchIdList) {
|
for (const branchId in branchIdList) {
|
||||||
@ -267,7 +270,7 @@ function noteReorderingUpdated(branchIdList) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function etapiTokenDeleted(etapiTokenId) {
|
function etapiTokenDeleted(etapiTokenId: string) {
|
||||||
delete becca.etapiTokens[etapiTokenId];
|
delete becca.etapiTokens[etapiTokenId];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,14 +278,14 @@ eventService.subscribeBeccaLoader(eventService.ENTER_PROTECTED_SESSION, () => {
|
|||||||
try {
|
try {
|
||||||
becca.decryptProtectedNotes();
|
becca.decryptProtectedNotes();
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e: any) {
|
||||||
log.error(`Could not decrypt protected notes: ${e.message} ${e.stack}`);
|
log.error(`Could not decrypt protected notes: ${e.message} ${e.stack}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
eventService.subscribeBeccaLoader(eventService.LEAVE_PROTECTED_SESSION, load);
|
eventService.subscribeBeccaLoader(eventService.LEAVE_PROTECTED_SESSION, load);
|
||||||
|
|
||||||
module.exports = {
|
export = {
|
||||||
load,
|
load,
|
||||||
reload,
|
reload,
|
||||||
beccaLoaded
|
beccaLoaded
|
@ -28,7 +28,7 @@ class BAttribute extends AbstractBeccaEntity<BAttribute> {
|
|||||||
value!: string;
|
value!: string;
|
||||||
isInheritable!: boolean;
|
isInheritable!: boolean;
|
||||||
|
|
||||||
constructor(row: AttributeRow) {
|
constructor(row?: AttributeRow) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
@ -52,7 +52,7 @@ class BAttribute extends AbstractBeccaEntity<BAttribute> {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
update([attributeId, noteId, type, name, value, isInheritable, position, utcDateModified]: any[]) {
|
update([attributeId, noteId, type, name, value, isInheritable, position, utcDateModified]: any) {
|
||||||
this.attributeId = attributeId;
|
this.attributeId = attributeId;
|
||||||
this.noteId = noteId;
|
this.noteId = noteId;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
@ -30,7 +30,7 @@ class BBranch extends AbstractBeccaEntity<BBranch> {
|
|||||||
isExpanded!: boolean;
|
isExpanded!: boolean;
|
||||||
utcDateModified?: string;
|
utcDateModified?: string;
|
||||||
|
|
||||||
constructor(row: BranchRow) {
|
constructor(row?: BranchRow) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
|
@ -24,7 +24,7 @@ class BEtapiToken extends AbstractBeccaEntity<BEtapiToken> {
|
|||||||
tokenHash!: string;
|
tokenHash!: string;
|
||||||
private _isDeleted?: boolean;
|
private _isDeleted?: boolean;
|
||||||
|
|
||||||
constructor(row: EtapiTokenRow) {
|
constructor(row?: EtapiTokenRow) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
|
@ -70,7 +70,7 @@ class BNote extends AbstractBeccaEntity<BNote> {
|
|||||||
children!: BNote[];
|
children!: BNote[];
|
||||||
targetRelations!: BAttribute[];
|
targetRelations!: BAttribute[];
|
||||||
|
|
||||||
private __flatTextCache!: string | null;
|
__flatTextCache!: string | null;
|
||||||
|
|
||||||
private __attributeCache!: BAttribute[] | null;
|
private __attributeCache!: BAttribute[] | null;
|
||||||
private __inheritableAttributeCache!: BAttribute[] | null;
|
private __inheritableAttributeCache!: BAttribute[] | null;
|
||||||
@ -86,7 +86,7 @@ class BNote extends AbstractBeccaEntity<BNote> {
|
|||||||
/** number of note revisions for this note */
|
/** number of note revisions for this note */
|
||||||
private revisionCount!: number | null;
|
private revisionCount!: number | null;
|
||||||
|
|
||||||
constructor(row: Partial<NoteRow>) {
|
constructor(row?: Partial<NoteRow>) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
if (!row) {
|
if (!row) {
|
||||||
|
@ -16,10 +16,12 @@ class BOption extends AbstractBeccaEntity<BOption> {
|
|||||||
value!: string;
|
value!: string;
|
||||||
isSynced!: boolean;
|
isSynced!: boolean;
|
||||||
|
|
||||||
constructor(row: OptionRow) {
|
constructor(row?: OptionRow) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
this.updateFromRow(row);
|
if (row) {
|
||||||
|
this.updateFromRow(row);
|
||||||
|
}
|
||||||
this.becca.options[this.name] = this;
|
this.becca.options[this.name] = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ const singleImportService = require('../../services/import/single.js');
|
|||||||
const cls = require('../../services/cls');
|
const cls = require('../../services/cls');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const becca = require('../../becca/becca');
|
const becca = require('../../becca/becca');
|
||||||
const beccaLoader = require('../../becca/becca_loader.js');
|
const beccaLoader = require('../../becca/becca_loader');
|
||||||
const log = require('../../services/log');
|
const log = require('../../services/log');
|
||||||
const TaskContext = require('../../services/task_context');
|
const TaskContext = require('../../services/task_context');
|
||||||
const ValidationError = require('../../errors/validation_error');
|
const ValidationError = require('../../errors/validation_error');
|
||||||
|
@ -766,7 +766,7 @@ class ConsistencyChecks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.reloadNeeded) {
|
if (this.reloadNeeded) {
|
||||||
require('../becca/becca_loader.js').reload("consistency checks need becca reload");
|
require('../becca/becca_loader').reload("consistency checks need becca reload");
|
||||||
}
|
}
|
||||||
|
|
||||||
return !this.unrecoveredConsistencyErrors;
|
return !this.unrecoveredConsistencyErrors;
|
||||||
|
@ -143,8 +143,8 @@ function getRows<T>(query: string, params: Params = []): T[] {
|
|||||||
return wrap(query, s => s.all(params)) as T[];
|
return wrap(query, s => s.all(params)) as T[];
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRawRows<T extends {} | unknown[]>(query: string, params: Params = []): T[] | null {
|
function getRawRows<T extends {} | unknown[]>(query: string, params: Params = []): T[] {
|
||||||
return wrap(query, s => s.raw().all(params)) as T[] | null;
|
return (wrap(query, s => s.raw().all(params)) as T[] | null) || [];
|
||||||
}
|
}
|
||||||
|
|
||||||
function iterateRows(query: string, params: Params = []) {
|
function iterateRows(query: string, params: Params = []) {
|
||||||
@ -259,7 +259,7 @@ function transactional<T>(func: (statement: Statement) => T) {
|
|||||||
if (entityChangeIds.length > 0) {
|
if (entityChangeIds.length > 0) {
|
||||||
log.info("Transaction rollback dirtied the becca, forcing reload.");
|
log.info("Transaction rollback dirtied the becca, forcing reload.");
|
||||||
|
|
||||||
require('../becca/becca_loader.js').load();
|
require('../becca/becca_loader').load();
|
||||||
}
|
}
|
||||||
|
|
||||||
// the maxEntityChangeId has been incremented during failed transaction, need to recalculate
|
// the maxEntityChangeId has been incremented during failed transaction, need to recalculate
|
||||||
|
@ -61,7 +61,7 @@ async function createInitialDatabase() {
|
|||||||
|
|
||||||
sql.executeScript(schema);
|
sql.executeScript(schema);
|
||||||
|
|
||||||
require('../becca/becca_loader.js').load();
|
require('../becca/becca_loader').load();
|
||||||
|
|
||||||
const BNote = require('../becca/entities/bnote');
|
const BNote = require('../becca/entities/bnote');
|
||||||
const BBranch = require('../becca/entities/bbranch');
|
const BBranch = require('../becca/entities/bbranch');
|
||||||
|
@ -399,7 +399,7 @@ function getOutstandingPullCount() {
|
|||||||
return outstandingPullCount;
|
return outstandingPullCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
require('../becca/becca_loader.js').beccaLoaded.then(() => {
|
require('../becca/becca_loader').beccaLoaded.then(() => {
|
||||||
setInterval(cls.wrap(sync), 60000);
|
setInterval(cls.wrap(sync), 60000);
|
||||||
|
|
||||||
// kickoff initial sync immediately, but should happen after initial consistency checks
|
// kickoff initial sync immediately, but should happen after initial consistency checks
|
||||||
|
Loading…
x
Reference in New Issue
Block a user