From 63041ef460dce752f78cbd70f1cf87b4dced06f5 Mon Sep 17 00:00:00 2001 From: Lin Onetwo Date: Sat, 27 Jun 2020 12:49:35 +0800 Subject: [PATCH] refactor: use worker_thread to start wiki --- public/libs/views.js | 2 +- public/libs/{ => wiki}/start-nodejs-wiki.js | 23 +++-------------- public/libs/wiki/wiki-worker-mamager.js | 17 +++++++++++++ public/libs/wiki/wiki-worker.js | 28 +++++++++++++++++++++ public/listeners/index.js | 2 +- 5 files changed, 50 insertions(+), 22 deletions(-) rename public/libs/{ => wiki}/start-nodejs-wiki.js (59%) create mode 100644 public/libs/wiki/wiki-worker-mamager.js create mode 100644 public/libs/wiki/wiki-worker.js diff --git a/public/libs/views.js b/public/libs/views.js index c8701193..e63be6a9 100644 --- a/public/libs/views.js +++ b/public/libs/views.js @@ -10,7 +10,7 @@ const path = require('path'); const fsExtra = require('fs-extra'); const { ElectronBlocker } = require('@cliqz/adblocker-electron'); -const startNodeJSWiki = require('./start-nodejs-wiki') +const startNodeJSWiki = require('./wiki/start-nodejs-wiki') const { getPreferences } = require('./preferences'); const { getWorkspace, diff --git a/public/libs/start-nodejs-wiki.js b/public/libs/wiki/start-nodejs-wiki.js similarity index 59% rename from public/libs/start-nodejs-wiki.js rename to public/libs/wiki/start-nodejs-wiki.js index 33b92663..8d49a3fa 100644 --- a/public/libs/start-nodejs-wiki.js +++ b/public/libs/wiki/start-nodejs-wiki.js @@ -1,18 +1,14 @@ const path = require('path'); const fs = require('fs-extra'); const { dialog } = require('electron'); -const $tw = require('tiddlywiki/boot/boot.js').TiddlyWiki(); -const mainWindow = require('../windows/main'); +const { startWiki } = require('./wiki-worker-mamager'); +const mainWindow = require('../../windows/main'); const tiddlyWikiPort = 5112; const userName = 'LinOnetwoTest'; module.exports = function startNodeJSWiki(homePath) { - if ($tw.wiki) { - console.error('Wiki has already started'); - return; - } if (!homePath || typeof homePath !== 'string' || !path.isAbsolute(homePath)) { const errorMessage = `需要传入正确的路径,而 ${homePath} 无法被 TiddlyWiki 识别。`; console.error(errorMessage); @@ -38,18 +34,5 @@ module.exports = function startNodeJSWiki(homePath) { return; } - process.env.TIDDLYWIKI_PLUGIN_PATH = path.resolve(homePath, 'plugins'); - process.env.TIDDLYWIKI_THEME_PATH = path.resolve(homePath, 'themes'); - // add tiddly filesystem back https://github.com/Jermolene/TiddlyWiki5/issues/4484#issuecomment-596779416 - $tw.boot.argv = [ - '+plugins/tiddlywiki/filesystem', - '+plugins/tiddlywiki/tiddlyweb', - homePath, - '--listen', - `anon-username=${userName}`, - `port=${tiddlyWikiPort}`, - 'host=0.0.0.0', - 'root-tiddler=$:/core/save/lazy-images', - ]; - $tw.boot.boot(); + startWiki(homePath, userName, tiddlyWikiPort); }; diff --git a/public/libs/wiki/wiki-worker-mamager.js b/public/libs/wiki/wiki-worker-mamager.js new file mode 100644 index 00000000..55958f86 --- /dev/null +++ b/public/libs/wiki/wiki-worker-mamager.js @@ -0,0 +1,17 @@ +/* eslint-disable no-console */ +const { Worker } = require('worker_threads'); + +// { [name: string]: Worker } +const workers = {}; + +module.exports.startWiki = function startWiki(homePath, userName, tiddlyWikiPort) { + const workerData = { homePath, userName, tiddlyWikiPort }; + console.warn(`workerData`, JSON.stringify(workerData, null, ' ')); + const worker = new Worker(require.resolve('./wiki-worker.js'), { workerData }); + workers[homePath] = worker; + worker.on('message', message => console.log(`[${homePath}] ${message}`)); + worker.on('error', error => console.error(`[${homePath}] ${error}`)); + worker.on('exit', code => { + if (code !== 0) console.error(`[${homePath}] Worker stopped with exit code ${code}`); + }); +}; diff --git a/public/libs/wiki/wiki-worker.js b/public/libs/wiki/wiki-worker.js new file mode 100644 index 00000000..18b8fb38 --- /dev/null +++ b/public/libs/wiki/wiki-worker.js @@ -0,0 +1,28 @@ +delete require.cache[require.resolve('tiddlywiki/boot/boot.js')]; +const { workerData, parentPort, isMainThread } = require('worker_threads'); +const path = require('path'); +const $tw = require('tiddlywiki/boot/boot.js').TiddlyWiki(); + +function startNodeJSWiki() { + const { homePath, userName, tiddlyWikiPort = 5112 } = workerData; + process.env.TIDDLYWIKI_PLUGIN_PATH = path.resolve(homePath, 'plugins'); + process.env.TIDDLYWIKI_THEME_PATH = path.resolve(homePath, 'themes'); + // add tiddly filesystem back https://github.com/Jermolene/TiddlyWiki5/issues/4484#issuecomment-596779416 + $tw.boot.argv = [ + '+plugins/tiddlywiki/filesystem', + '+plugins/tiddlywiki/tiddlyweb', + homePath, + '--listen', + `anon-username=${userName}`, + `port=${tiddlyWikiPort}`, + 'host=0.0.0.0', + 'root-tiddler=$:/core/save/lazy-images', + ]; + $tw.boot.boot(); + parentPort.postMessage(`Tiddlywiki booted at http://localhost:${tiddlyWikiPort}`); +} +module.exports = startNodeJSWiki; + +if (!isMainThread) { + startNodeJSWiki(); +} diff --git a/public/listeners/index.js b/public/listeners/index.js index 94e05f9e..35739bdf 100755 --- a/public/listeners/index.js +++ b/public/listeners/index.js @@ -2,7 +2,7 @@ const { BrowserView, Notification, app, dialog, ipcMain, nativeTheme, shell } = require('electron'); const { createWiki, createSubWiki } = require('../libs/create-wiki'); -const startNodeJSWiki = require('../libs/start-nodejs-wiki'); +const startNodeJSWiki = require('../libs/wiki/start-nodejs-wiki'); const { getIconPath } = require('../libs/get-constants'); const { getPreference, getPreferences, resetPreferences, setPreference } = require('../libs/preferences');