From 36b8e5903d5b39d058c30c7bf2ff5b118c82bc22 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Fri, 16 Aug 2019 12:13:50 +0300 Subject: [PATCH] feature(user-menu) speed up user menu parsing with help of worker threads --- package.json | 1 + server/server.js | 2 ++ server/user-menu.js | 26 +++++++++++++++++--------- server/user-menu.spec.js | 3 +++ 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 632b0f8d..4e3ec8f2 100644 --- a/package.json +++ b/package.json @@ -154,6 +154,7 @@ "socket.io-client": "^2.1.1", "squad": "^3.0.0", "table": "^5.0.2", + "thread-it": "^1.0.1", "try-catch": "^2.0.0", "try-to-catch": "^1.0.2", "tryrequire": "^2.0.1", diff --git a/server/server.js b/server/server.js index 4937ced7..5a622728 100644 --- a/server/server.js +++ b/server/server.js @@ -10,6 +10,7 @@ const squad = require('squad'); const tryToCatch = require('try-to-catch'); const wraptile = require('wraptile'); const compression = require('compression'); +const threadIt = require('thread-it'); const two = currify((f, a, b) => f(a, b)); const exit = require(DIR_SERVER + 'exit'); @@ -21,6 +22,7 @@ const promisifySelf = squad(promisify, bind); const shutdown = wraptile(async (promises) => { console.log('closing cloudcmd...'); await Promise.all(promises); + threadIt.terminate(); process.exit(0); }); diff --git a/server/user-menu.js b/server/user-menu.js index 64b38e2f..318d9158 100644 --- a/server/user-menu.js +++ b/server/user-menu.js @@ -6,12 +6,17 @@ const fs = require('fs'); const {join} = require('path'); const {promisify} = require('util'); -const tryCatch = require('try-catch'); const tryToCatch = require('try-to-catch'); const currify = require('currify'); const findUp = require('find-up'); -const putout = require('putout'); -const {codeframe} = putout; +const threadIt = require('thread-it'); +const {codeframe} = require('putout'); +const putout = threadIt('putout'); + +threadIt.init(); + +// warm up worker cache +transpile(''); const readFile = promisify(fs.readFile); @@ -62,12 +67,7 @@ async function onGET({req, res, menuName}) { if (e) return sendDefaultMenu(res); - const [parseError, result] = tryCatch(putout, source, { - plugins: [ - 'convert-esm-to-commonjs', - 'strict-mode', - ], - }); + const [parseError, result] = await transpile(source); if (parseError) return res @@ -92,3 +92,11 @@ function sendDefaultMenu(res) { }); } +function transpile(source) { + return tryToCatch(putout, source, { + plugins: [ + 'convert-esm-to-commonjs', + 'strict-mode', + ], + }); +} diff --git a/server/user-menu.spec.js b/server/user-menu.spec.js index 0f2f0a3b..2400e404 100644 --- a/server/user-menu.spec.js +++ b/server/user-menu.spec.js @@ -5,6 +5,7 @@ const {join} = require('path'); const test = require('supertape'); const serveOnce = require('serve-once'); +const threadIt = require('thread-it'); const userMenu = require('./user-menu'); const {request} = serveOnce(userMenu); @@ -21,6 +22,8 @@ test('cloudcmd: user menu', async (t) => { options, }); + threadIt.terminate(); + t.equal(userMenuFile, body, 'should equal'); t.end(); });