threads.js icon indicating copy to clipboard operation
threads.js copied to clipboard

TypeError: Cannot read property 'resolve' of null

Open Bilb opened this issue 4 years ago • 2 comments

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

Bilb avatar Jun 03 '21 07:06 Bilb

Just stumbled on that same issue again. Any ideas?

Bilb avatar Mar 22 '22 00:03 Bilb

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.

andywer avatar Mar 23 '22 09:03 andywer