diff --git a/server/models/pages.js b/server/models/pages.js index bb5b6585..a6fe0afd 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') @@ -815,7 +820,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) @@ -928,6 +934,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 * 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: /^(