threads.js
threads.js copied to clipboard
TypeError: Cannot read property 'resolve' of null
Hi, Thank you for your library. I'd like to use it on my electron app (not using electron webpack) but I cannot get it working.
Here is the first stacktrace:
Top-level unhandled promise rejection: TypeError: Cannot read property 'resolve' of null
at resolveScriptPath (/home/<me>/pro/contribs/loki-messenger/node_modules/threads/dist/master/implementation.node.js:84:26)
at new Worker (/home/<me>/pro/contribs/loki-messenger/node_modules/threads/dist/master/implementation.node.js:160:23)
at Object.doWhatYouGottaDo (/home/<me>/pro/contribs/loki-messenger/ts/workers/master.js:7:40)
[...]
I have my ts files under <approot>/ts
I have the worker files under <approot>/ts/workers
Under <approot>/ts/workers I have
master.ts and auth.ts
auth.ts :
// workers/auth.js - will be run in worker thread
// tslint:disable-next-line: no-submodule-imports
import { expose } from 'threads/worker';
expose({
hashPassword(password, salt) {
return `${password}:${salt}`;
},
});
master.ts :
import { spawn, Thread, Worker } from 'threads';
export async function doWhatYouGottaDo() {
const auth = await spawn(new Worker('./auth'));
// tslint:disable-next-line: await-promise
const hashed = await auth.hashPassword('Super secret password', '1234');
console.log('Hashed password:', hashed);
await Thread.terminate(auth);
}
doWhatYouGottaDo().catch(console.error);
Tthe issue comes from the require() on this line
eval("require").resolve(makeRelative(rebaseScriptPath(scriptPath, /[\/\\]worker_threads[\/\\]/)));
it's simply the 'require' which is not found (eval("require") = null).
I assume it comes from the tsconfig.json but I don't find what to set.
Here is my current tsconfig.json
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
"lib": [
"dom",
"es2017"
],
"jsx": "react",
"sourceMap": true,
"rootDir": "./ts",
"strict": true,
"skipLibCheck": true,
"moduleResolution": "node",
"esModuleInterop": true
}
}
I think I need to change the module "commonjs" to "esnext" as you say in the guide but then my whole app fails to start with errors like SyntaxError: Cannot use import statement outside a module.
I thought I could just override the tsconfig.json for the workers path it doesn't seem to be picked up by tsc. I tried to add a tsconfig.json in ts/workers containing
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"module": "esnext"
}
}
But I still get the same TypeError: Cannot read property 'resolve' of null
Do you have any idea what I can do to get this working on an electron app relying on tsc and not electron-webpack? Thanks a lot
Just stumbled on that same issue again. Any ideas?
I suppose you are trying to use threads.js in an Electron app, so it selects the node.js implementation, but you are not using it in the node process, but in a BrowserWindow.
If that's true, then you need to bundle that code and tell the bundler (i.e. webpack) that it is compiling for a browser environment, not node.js.