From f3dc28cb3fb36ccd0e52325660940a31e639b88a Mon Sep 17 00:00:00 2001 From: Daniel Riggins Date: Mon, 23 Jan 2023 09:38:02 -0600 Subject: [PATCH 1/2] bg rendering patch --- server/models/pages.js | 49 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/server/models/pages.js b/server/models/pages.js index dc54af9a..50ea2bcd 100644 --- a/server/models/pages.js +++ b/server/models/pages.js @@ -28,6 +28,9 @@ const punctuationRegex = /[!,:;/\\_+\-=()&#@<>$~%^*[\]{}"'|]+|(\.\s)|(\s\.)/ig * Pages model */ module.exports = class Page extends Model { + static rebuildIsRunning = false + static rebuildIsQueued = false + static get tableName() { return 'pages' } static get jsonSchema () { @@ -333,7 +336,8 @@ module.exports = class Page extends Model { await WIKI.models.pages.renderPage(page) // -> Rebuild page tree - await WIKI.models.pages.rebuildTree() + // await WIKI.models.pages.rebuildTree() + WIKI.models.pages.rebuildTreeBG() // -> Add to Search Index const pageContents = await WIKI.models.pages.query().findById(page.id).select('render') @@ -736,7 +740,8 @@ module.exports = class Page extends Model { WIKI.events.outbound.emit('deletePageFromCache', page.hash) // -> Rebuild page tree - await WIKI.models.pages.rebuildTree() + // await WIKI.models.pages.rebuildTree() + WIKI.models.pages.rebuildTreeBG() // -> Rename in Search Index const pageContents = await WIKI.models.pages.query().findById(page.id).select('render') @@ -814,7 +819,8 @@ module.exports = class Page extends Model { WIKI.events.outbound.emit('deletePageFromCache', page.hash) // -> Rebuild page tree - await WIKI.models.pages.rebuildTree() + // await WIKI.models.pages.rebuildTree() + WIKI.models.pages.rebuildTreeBG() // -> Delete from Search Index await WIKI.data.searchEngine.deleted(page) @@ -927,6 +933,43 @@ module.exports = class Page extends Model { return rebuildJob.finished } + /** + * Rebuild page tree for new/updated/deleted page in the + * background. Multiple calls to this function will + * queue up a single pending job if a rebuild is already + * in progress, and that queued up job will start when + * the current rebuild ends. In other words, calling this + * function will ensure at least one rebuild will start + * in the near future as soon as no rebuilds are running, + * but 50 quick calls to this routine will only cause + * one rebuild to kick off when possible. + * + * @returns {Promise} Promise with no value + */ + static async rebuildTreeBG() { + if (this.rebuildIsRunning) { + this.rebuildIsQueued = true + return + } + this.rebuildIsRunning = true + const rebuildJob = await WIKI.scheduler.registerJob({ + name: 'rebuild-tree', + immediate: true, + worker: true + }) + await rebuildJob.finished + while (this.rebuildIsQueued) { + this.rebuildIsQueued = false + const rebuildJob = await WIKI.scheduler.registerJob({ + name: 'rebuild-tree', + immediate: true, + worker: true + }) + await rebuildJob.finished + } + this.rebuildIsRunning = false + } + /** * Trigger the rendering of a page * From 1b5342d9f0502430fe7186c430d01d99cb898345 Mon Sep 17 00:00:00 2001 From: Daniel Riggins Date: Mon, 23 Jan 2023 09:38:23 -0600 Subject: [PATCH 2/2] bg rendering patch --- server/models/pages.js.orig | 1173 +++++++++++++++++++++++++++++++++++ 1 file changed, 1173 insertions(+) create mode 100644 server/models/pages.js.orig diff --git a/server/models/pages.js.orig b/server/models/pages.js.orig new file mode 100644 index 00000000..dc54af9a --- /dev/null +++ b/server/models/pages.js.orig @@ -0,0 +1,1173 @@ +const Model = require('objection').Model +const _ = require('lodash') +const JSBinType = require('js-binary').Type +const pageHelper = require('../helpers/page') +const path = require('path') +const fs = require('fs-extra') +const yaml = require('js-yaml') +const striptags = require('striptags') +const emojiRegex = require('emoji-regex') +const he = require('he') +const CleanCSS = require('clean-css') +const TurndownService = require('turndown') +const turndownPluginGfm = require('@joplin/turndown-plugin-gfm').gfm +const cheerio = require('cheerio') + +/* global WIKI */ + +const frontmatterRegex = { + html: /^()?(?:\n|\r)*([\w\W]*)*/, + legacy: /^(