From 514e8ca4f325f8c86d4d20f16b551a8ecc0df0e1 Mon Sep 17 00:00:00 2001 From: Shogun Date: Wed, 10 Nov 2021 10:35:26 +0100 Subject: [PATCH] feat: Support bundlers. (#48) * feat: Support bundlers. * test: Added bundler support test. --- index.js | 3 ++- lib/worker.js | 5 +++-- package.json | 3 +++ test/bundlers.test.js | 33 +++++++++++++++++++++++++++++++++ test/custom-worker.js | 9 +++++++++ 5 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 test/bundlers.test.js create mode 100644 test/custom-worker.js diff --git a/index.js b/index.js index 8cd370c..3570700 100644 --- a/index.js +++ b/index.js @@ -44,7 +44,8 @@ const registry = new FinalizationRegistry((worker) => { function createWorker (stream, opts) { const { filename, workerData } = opts - const toExecute = join(__dirname, 'lib', 'worker.js') + const bundlerOverrides = '__bundlerPathsOverrides' in globalThis ? globalThis.__bundlerPathsOverrides : {} + const toExecute = bundlerOverrides['thread-stream-worker'] || join(__dirname, 'lib', 'worker.js') const worker = new Worker(toExecute, { ...opts.workerOpts, diff --git a/lib/worker.js b/lib/worker.js index 200c24b..2b0f28b 100644 --- a/lib/worker.js +++ b/lib/worker.js @@ -1,5 +1,6 @@ 'use strict' +const { realImport, realRequire } = require('real-require') const { workerData, parentPort } = require('worker_threads') const { WRITE_INDEX, READ_INDEX } = require('./indexes') const { waitDiff } = require('./wait') @@ -17,7 +18,7 @@ const data = Buffer.from(dataBuf) async function start () { let fn try { - fn = (await import(workerData.filename)).default + fn = (await realImport(workerData.filename)).default } catch (error) { // A yarn user that tries to start a ThreadStream for an external module // provides a filename pointing to a zip file. @@ -29,7 +30,7 @@ async function start () { // The error codes may change based on the node.js version (ENOTDIR > 12, ERR_MODULE_NOT_FOUND <= 12 ) if ((error.code === 'ENOTDIR' || error.code === 'ERR_MODULE_NOT_FOUND') && workerData.filename.startsWith('file://')) { - fn = require(workerData.filename.replace('file://', '')) + fn = realRequire(workerData.filename.replace('file://', '')) } else { throw error } diff --git a/package.json b/package.json index 76a8bf1..0bcf68a 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "0.12.1", "description": "A streaming way to send data to a Node.js Worker Thread", "main": "index.js", + "dependencies": { + "real-require": "^0.1.0" + }, "devDependencies": { "desm": "^1.1.0", "fastbench": "^1.0.1", diff --git a/test/bundlers.test.js b/test/bundlers.test.js new file mode 100644 index 0000000..d44468d --- /dev/null +++ b/test/bundlers.test.js @@ -0,0 +1,33 @@ +'use strict' + +const { test } = require('tap') +const { join } = require('path') +const { file } = require('./helper') +const ThreadStream = require('..') + +test('bundlers support', function (t) { + t.plan(1) + + globalThis.__bundlerPathsOverrides = { + 'thread-stream-worker': join(__dirname, 'custom-worker.js') + } + + const dest = file() + + process.on('uncaughtException', error => { + console.log(error) + }) + + const stream = new ThreadStream({ + filename: join(__dirname, 'to-file.js'), + workerData: { dest }, + sync: true + }) + + stream.worker.removeAllListeners('message') + stream.worker.once('message', message => { + t.equal(message.code, 'CUSTOM-WORKER-CALLED') + }) + + stream.end() +}) diff --git a/test/custom-worker.js b/test/custom-worker.js new file mode 100644 index 0000000..e78340c --- /dev/null +++ b/test/custom-worker.js @@ -0,0 +1,9 @@ +'use strict' + +const { parentPort } = require('worker_threads') + +parentPort.postMessage({ + code: 'CUSTOM-WORKER-CALLED' +}) + +require('../lib/worker')