{"id":37122666,"url":"https://github.com/nojsja/electron-re","last_synced_at":"2026-01-14T14:10:35.856Z","repository":{"id":41186097,"uuid":"313603020","full_name":"nojsja/electron-re","owner":"nojsja","description":"Electron process manager and more...","archived":false,"fork":false,"pushed_at":"2023-03-01T03:11:45.000Z","size":3337,"stargazers_count":54,"open_issues_count":8,"forks_count":12,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-11-01T09:19:45.479Z","etag":null,"topics":["electron","electron-process-manager","electron-re","ipc","nodejs","process","process-manager","threads","utils"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nojsja.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-11-17T11:49:21.000Z","updated_at":"2025-09-11T22:07:29.000Z","dependencies_parsed_at":"2024-06-19T02:57:00.799Z","dependency_job_id":null,"html_url":"https://github.com/nojsja/electron-re","commit_stats":{"total_commits":144,"total_committers":2,"mean_commits":72.0,"dds":0.02083333333333337,"last_synced_commit":"8f2b8204180ca83d8e799034a76af359d450997d"},"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/nojsja/electron-re","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojsja%2Felectron-re","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojsja%2Felectron-re/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojsja%2Felectron-re/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojsja%2Felectron-re/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nojsja","download_url":"https://codeload.github.com/nojsja/electron-re/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nojsja%2Felectron-re/sbom","scorecard":{"id":693304,"data":{"date":"2025-08-11","repo":{"name":"github.com/nojsja/electron-re","commit":"8f2b8204180ca83d8e799034a76af359d450997d"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"26 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-q765-wm9j-66qj","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-hvf8-h2qh-37m9","Warn: Project is vulnerable to: GHSA-mpjm-v997-c4h4","Warn: Project is vulnerable to: GHSA-3p22-ghq8-v749","Warn: Project is vulnerable to: GHSA-77xc-hjv8-ww97","Warn: Project is vulnerable to: GHSA-mq8j-3h7h-p8g7","Warn: Project is vulnerable to: GHSA-p2jh-44qj-pf2v","Warn: Project is vulnerable to: GHSA-p7v2-p9m8-qqg7","Warn: Project is vulnerable to: GHSA-7x97-j373-85x5","Warn: Project is vulnerable to: GHSA-7m48-wc93-9g85","Warn: Project is vulnerable to: GHSA-qqvq-6xgj-jw8g","Warn: Project is vulnerable to: GHSA-6r2x-8pq8-9489","Warn: Project is vulnerable to: GHSA-4q6p-r6v2-jvc5","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-qrpm-p2h7-hrv2","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T02:52:17.116Z","repository_id":41186097,"created_at":"2025-08-22T02:52:17.116Z","updated_at":"2025-08-22T02:52:17.116Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28422408,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T13:30:50.153Z","status":"ssl_error","status_checked_at":"2026-01-14T13:29:08.907Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["electron","electron-process-manager","electron-re","ipc","nodejs","process","process-manager","threads","utils"],"created_at":"2026-01-14T14:10:35.069Z","updated_at":"2026-01-14T14:10:35.846Z","avatar_url":"https://github.com/nojsja.png","language":"JavaScript","readme":"[![GitHub license](https://img.shields.io/github/license/nojsja/electron-re)](https://github.com/nojsja/electron-re/blob/master/LICENSE.md)\n[![GitHub issues](https://img.shields.io/github/issues/nojsja/electron-re)](https://github.com/nojsja/electron-re/issues)\n[![GitHub stars](https://img.shields.io/github/stars/nojsja/electron-re)](https://github.com/nojsja/electron-re/stargazers)\n\n##  electron-re\n---------------\n\u003e Test on electron@8.2.0 / 9.3.5\n\n### Contents\n```sh\n├── Contents (you are here!)\n│\n├── Architecture\n│\n├── * What can be used for?\n│   ├── In Electron Project\n│   └── In Nodejs/Electron Project\n│\n├── * Install\n│\n├── * Instruction1: ProcessManager\n│   ├── Require it in main.js(electron)\n│   └── Open process-manager window for your application\n│\n├── * Instruction2: Service\n│   ├── The arguments to create a service\n│   ├── Enable service auto reload after code changed\n│   └── The methods of a Service instance\n│\n├── * Instruction3: MessageChannel\n│   ├── The methods of MessageChannel\n│   └── A full usage\n│\n├── * Instruction4: ChildProcessPool\n│   ├── Create a childprocess pool\n│   ├── Send request to a process instance\n│   ├── Send request to all process instances\n│   ├── Destroy the child processes of the process pool\n│   └── Set the max instance limit of pool\n│\n├── * Instruction5: ProcessHost\n│   ├── Require it in a sub process\n│   ├── Registry a task with unique name\n│   ├── Working with ChildProcessPool\n│   └── Unregistry a task with unique name\n│\n├── * Instruction6: WorkerThreadPool\n│   ├── Create a static WorkerThreadPool pool\n│   ├── Create a static WorkerThreadPool excutor\n│   ├── Create a dynamic WorkerThreadPool pool\n│   └── Create a dynamic WorkerThreadPool excutor\n│\n├── Examples\n```\n\n### Architecture\n-------\n\n![architecture](http://nojsja.gitee.io/static-resources/images/electron-re/electron-re_arch.png)\n\n### I. What can be used for?\n-----\n\n- __BrowserServcie / MessageChannel__\n  - Using `BrowserServcie` to generate some service processes without UI and put your heavy tasks into them.\n  - `MessageChannel` make it be possible to communicate with each other between `main process`,`render process` and `service`.\n- __ProcessManager__\n  - `ProcessManager` provides a user interface for managing / monitoring processes, includes `BrowserServcie` / `ChildProcess` / `renderer process` / `main process`.\n- __ChildProcessPool / ProcessHost__\n  - `ChildProcessPool` with load-balancing support may helps when you need to create and manage several processes on nodejs runtime of electron.\n  - `ProcessHost` let us be focused on the core sub-process logic rather than various async event.\n- __WorkerThreadPool__\n  - `WorkerThreadPool` is effective for creating and managing threads.\n\n### II. Install\n-----\n```bash\n$: npm install electron-re --save\n# or\n$: yarn add electron-re --save\n```\n### III. Instruction 1: ProcessManager\n-----------------------\n\u003e Used in Electron project, build for ChildProcessPool/BrowserService.\n\n\u003e Compatible with native IpcRenderer/Main.\n\nAll functions:\n\n1. Show all alive processes in your Electron application: main process, renderer process, the service process (imported by electron-re), and the child process created by ChildProcessPool (imported by electron-re).\n\n2. The process list displays info: process ID, process type(mark), parent process ID, memory, CPU. All processes type include main (main process), service (service process), renderer (renderer process) , node (child process in process pool). click on table header to sort an item in increasing/decreasing order.\n\n3. You can kill a process, view process console data, check CPU/memory occupancy within 1 min.\n\n4. If a process marked as renderer, pressing the `DevTools` button then the built-in debugging tool will open as an undocked window. Besides the child-processes are created by ChildProcessPool with `--inspect` parameter, DevTools is not supported, just visit `chrome://inspect` in chrome for remote debugging.\n\n5. Try to use `MessageChannel` for sending/receiving ipc messages, there is a ui pannel area that show activities of it (logger).\n\n#### Require it in main.js(electron)\n\n```js\nconst {\n  MessageChannel, // remember to require it in main.js even if you don't use it\n  ProcessManager\n} = require('electron-re');\n```\n\n#### Open process-manager window\n\n```js\nProcessManager.openWindow();\n```\n\n1. Main\n\u003e The main ui\n\n![main](http://nojsja.gitee.io/static-resources/images/electron-re/process-manager.main.png?v3)\n\n2. Console\n\u003e Show console info of all processes\n\n![console](http://nojsja.gitee.io/static-resources/images/electron-re/console.gif?v2)\n\n3. DevTools\n\u003e Open devtools for electron renderer window\n\n![devtools](http://nojsja.gitee.io/static-resources/images/electron-re/devtools.gif?v2)\n\n\n4. Trends\n\u003e Show cpu/memory occupancy trends\n\n![trends](http://nojsja.gitee.io/static-resources/images/electron-re/trends.gif?v2)\n\n![trends2](http://nojsja.gitee.io/static-resources/images/electron-re/trends2.gif?v2)\n\n5. Kill\n\u003e Kill process from one-click\n\n![kill](http://nojsja.gitee.io/static-resources/images/electron-re/kill.gif?v2)\n\n6. Signals Pannel\n\u003e Activities logger for `MessageChannel` tool\n\n![signals](http://nojsja.gitee.io/static-resources/images/electron-re/signals.png)\n\n### IV. Instruction 2: Service\n\n-----\n\u003eUsed in Electron project, working with MessageChannel, remember to check \"Instruction 3\".\n\n#### 1. The arguments to create a service\n\nThe `service` process is a customized render process that works in the background, receiving `path`, `options` as arguments:\n\n* path [string] * -- The absolute path to a js file\n* options [object] -- The same as `new BrowserWindow()` [options](https://www.electronjs.org/docs/api/browser-window#new-browserwindowoptions).\n\n```js\n/* --- main.js --- */\nconst { BrowserService } = require('electron-re');\nconst myService = new BrowserService('app', 'path/to/app.service.js', options);app.service.js'));\n```\n\n#### 2. Enable service auto reload after code changed\n\nThe `auto-reload` feature is based on nodejs - `fs.watch` api. When webSecurity closed and in `dev` mode, service will reload when service code changed.\n\n1.Set dev mode in `new BrowserService()` options  \n2.Get webSecurity closed\n```js\n/* --- main.js --- */\nconst myService = new BrowserService('app', 'path/to/app.service.js', {\n  ...options,\n  // set dev mode with webSecurity closed\n  dev: true,\n  webPreferences: { webSecurity: false }\n});\n\n```\n\n#### 3. The methods of a Service instance\n\nThe service instance is a customized `BrowserWindow` instance too, initialized by a file worked with `commonJs` module, so you can use `require('name')` and can't use `import some from 'name'` syntax. It has two extension methods:\n\n* `connected()` - return a resolved `Promise` when service is ready.\n* `openDevTools` - open an undocked window for debugging.\n\nsuggest to put some business-related code into a service.\n\n```js\n/* --- main.js --- */\n  \nconst { \n  BrowserService,\n  MessageChannel // must required in main.js even if you don't use it\n} = require('electron-re');\n...\n\napp.whenReady().then(async() =\u003e {\n  // after app is ready in main process\n  const myService = new BrowserService('app', 'path/to/app.service.js');\n  // async\n  await myService.connected();\n  mhyService.openDevTools();\n  /* work with webContents method, also you can use MessageChannel instead */\n  mhyService.webContents.send('channel1', { value: 'test1' });\n});\n...\n```\n\n```js\n\n/* --- app.service.js --- */\nconst { ipcRenderer } = require('electron');\n/* working with ipc method, also you can use MessageChannel instead */\nipcRenderer.on('channel1', (event, result) =\u003e {\n  // works\n  ...\n});\n```\n\n### V. Instruction 3: MessageChannel\n-----\n\u003eUsed in Electron project, working with Service.\n\nWhen sending data from main/other process to a service you need to use `MesssageChannel`, such as: `MessageChannel.send('service-name', 'channel', 'params')`, And also it can be used to replace other build-in `ipc` methods, more flexible.\n\n#### The methods of MessageChannel\n\n1.Public methods，used in __Main-Pocess__ / __Renderer-Process__ / __Service__\n```js\n/* send data to a service - like the build-in ipcMain.send */\nMessageChannel.send('service-name', channel, params);\n/* send data to a service and return a Promise - extension method */\nMessageChannel.invoke('service-name', channel, params);\n/*\n  send data to a renderer/servcie which id is same as the given windowId/webContentsId,\n  same as ipcRenderer.sendTo,\n  recommend to use it when you want to send data from main/service to a renderer window\n*/\nMessageChannel.sendTo('windowId/webContentsId', channel, params);\n/* listen a channel and return unlisten function, probably same as ipcMain.on/ipcRenderer.on */\nconst removeOnListener = MessageChannel.on(channel, func);\n/* listen a channel once and return unlisten function, probably same as ipcMain.once/ipcRenderer.once */\nconst removeOnceListener = MessageChannel.once(channel, func);\n\n```\n\n2.Only used in __Renderer-process__ / __Service__\n```js\n/* send data to main process - like the build-in ipcRender.send */\nMessageChannel.send('main', channel, params);\n/* send data to main process and return a Promise - extension method */\nMessageChannel.invoke('main', channel, params);\n\n```\n\n3.Only used in __Main-process__ / __Service__\n```js\n/*\n  handle a channel signal, extension method,\n  and you can return data directly or return a Promise instance\n*/\nMessageChannel.handle(channel, processorFunc);\n```\n\n#### Full Usage\n\n- 1）In main process\n```js\nconst {\n  BrowserService,\n  MessageChannel // must required in main.js even if you don't use it\n} = require('electron-re');\nconst isInDev = process.env.NODE_ENV === 'dev';\n...\n\n/* use MessageChannel instead of build-in method */\napp.whenReady().then(() =\u003e {\n  const myService = new BrowserService('app', 'path/to/app.service.js');\n  myService.connected().then(() =\u003e {\n    // open devtools in dev mode for debugging\n    if (isInDev) myService.openDevTools();\n    MessageChannel.send('app', 'channel1', { value: 'test1' });\n    MessageChannel.invoke('app', 'channel2', { value: 'test2' }).then((response) =\u003e {\n      console.log(response);\n    });\n\n    MessageChannel.on('channel3', (event, response) =\u003e {\n      console.log(response);\n    });\n\n    MessageChannel.handle('channel4', (event, response) =\u003e {\n      console.log(response);\n      return { res: 'channel4-res' };\n    });\n\n  })\n});\n```\n\n- 2）Send or Receive data in a __service__ named app\n```js\nconst { ipcRenderer } = require('electron');\nconst { MessageChannel } = require('electron-re');\n\nMessageChannel.on('channel1', (event, result) =\u003e {\n  console.log(result);\n});\n\nMessageChannel.handle('channel2', (event, result) =\u003e {\n  console.log(result);\n  return { response: 'channel2-response' }\n});\n\nMessageChannel.invoke('app2', 'channel3', { value: 'channel3' }).then((event, result) =\u003e {\n  console.log(result);\n});\n\nMessageChannel.send('app2', 'channel4', { value: 'channel4' });\n```\n\n- 3）Send or receive data in a __service__ named app2\n```js\nMessageChannel.handle('channel3', (event, result) =\u003e {\n  console.log(result);\n  return { response: 'channel3-response' }\n});\n\nMessageChannel.once('channel4', (event, result) =\u003e {\n  console.log(result);\n});\n\nMessageChannel.send('main', 'channel3', { value: 'channel3' });\nMessageChannel.send('main', 'channel3', { value: 'channel3' });\nMessageChannel.invoke('main', 'channel4', { value: 'channel4' });\n\n```\n\n- 3）Send or receive data in a __renderer__ window\n\n```js\nconst { ipcRenderer } = require('electron');\nconst { MessageChannel } = require('electron-re');\n\nMessageChannel.send('app', 'channel1', { value: 'test1'});\nMessageChannel.invoke('app2', 'channel3', { value: 'test2' });\nMessageChannel.send('main', 'channel3', { value: 'test3' });\nMessageChannel.invoke('main', 'channel4', { value: 'test4' });\n```\n\n### VI. Instruction 4: ChildProcessPool\n-----\n\u003eUsed in Nodejs/Electron project, working with ProcessHost, remember to check \"Instruction 5\".\n\nMulti-process helps to make full use of multi-core CPU, let's see some differences between multi-process and multi-thread:\n\n1. It is difficult to share data between different processes, but threads can share memory.\n2. Processes consume more computer resources than threads.\n3. The processes will not affect each other, a thread hanging up will cause the whole process to hang up.\n\n#### Attention of Electron Bugs !!\n\n**DO NOT USE `require('electron')` in child_process js exec file, this will cause fatal error in the production environment!**\n\nBesides that, In order to use ChildProcessPool, you need to place your child_process exec js file in an external directory such as `~/.config/`. Otherwise, when you packaged your app, Node.js can not find that exec file.\n\nThe another way to solve this problem is to set `asar` to false in the electron-builder.json, this is not recommended but works.\n\n```json\n{\n   ...\n   \"asar\": false,\n   ...\n}\n```\n\n\n#### 1. Create a childprocess pool\n\n* path [string] __*__ - the absolute path to a js file.\n* max [number] __*__ - the max count of instance created by pool.\n* env [object] - env variable object.\n* strategy [enum] - load balancing strategy, default is `POLLING`.\n  * __POLLING__: pick process one by one.\n  * __WEIGHTS__: pick process by process weight.\n  * __RANDOM__: pick by random.\n  * __WEIGHTS_POLLING__: pick process one by one, Affected by `WEIGHTS`.\n  * __WEIGHTS_RANDOM__: pick process by random, Affected by `WEIGHTS`.\n  * __MINIMUM_CONNECTION (not recommend, DO NOT USE)__: pick process by minimum connection count of per process.\n  * __WEIGHTS_MINIMUM_CONNECTION (not recommend, DO NOT USE)__: pick process by minimum connection count of per process, Affected by `WEIGHTS`.\n* weight [array] - the weight of each process, default is [1...].\n\n```js\nconst { ChildProcessPool, LoadBalancer } = require('electron-re');\n\nglobal.ipcUploadProcess = new ChildProcessPool({\n  path: path.join(app.getAppPath(), 'app/services/child/upload.js'),\n  max: 3,\n  env: { lang: global.lang, NODE_ENV: nodeEnv },\n  strategy: LoadBalancer.ALGORITHM.WEIGHTS_POLLING, // loadbalance strategy\n  weights: [1, 2, 3],\n});\n```\n\n#### 2. Send request to a process instance\n\n* 1）taskName [string] __*__ - a task registried with `ProcessHost`.\n* 2）data [any] __*__ - the data passed to process.\n* 3）id [any] - the unique id bound to a process instance.\n  * The unique id bound to a process instance(id will be automatically bound after call `send()`). \n  * Sometime you send request to a process with special data, then expect to get callback data from that process. You can provide an unique id in `send` function, each time pool will send a request to the process bound with this id.\n  * If you give an empty/undefined/null id, pool will select a process by load-balancing strategy.\n\n```js\nglobal.ipcUploadProcess.send(\n  'init-works',\n  {\n    name: 'fileName',\n    type: 'fileType',\n    size: 'fileSize',\n  },\n  'id-number' // optional and it's given by you\n)\n.then((rsp) =\u003e {\n  console.log(rsp);\n});\n```\n\n#### 3. Send request to all process instances\n\nAll sub processes will receive a request, and you can get a response data array from all sub processes.\n\n* 1）taskName [string] __*__ - a task registried with `ProcessHost`(check usage below).\n* 2）data [any] - the data passed to process.\n\n```js\nglobal.ipcUploadProcess.sendToAll(\n  'task-get-all',\n  { key: 'test' }\n)\n.then((rsp) =\u003e {\n  console.log(rsp);\n});\n```\n\n#### 4. Destroy the child processes of the process pool\n\n- If do not specify `id`, all child processes will be destroyed. Specifying the `id` parameter can separately destroy a child process bound to this `id`.\n\n- After the destruction, using the process pool to send a new request, a new child process will be created automatically.\n\n- It should be noted that the `id` binding operation is automatically performed after the `processPool.send('task-name', params, id)` method is called.\n\n```js\n// destroy a process with id value\nglobal.ipcUploadProcess.disconnect(id);\n// destroy all processes\nglobal.ipcUploadProcess.disconnect();\n```\n\n#### 5. Set the max instance limitation of pool\n\nIn addition to using the `max` parameter to specify the maximum number of child process instances created by the process pool, you can also call this method to dynamically set the number of child process instances that need to be created.\n\n```js\nglobal.ipcUploadProcess.setMaxInstanceLimit(number);\n```\n\n### VII. Instruction 5: ProcessHost\n-----\n\n\u003e Used in Nodejs/Electron project, working with ChildProcessPool.\n\nIn `Instruction 4`, We already know how to create a sub-process pool and send request using it. Now let's figure out how to registry a task and handle process messages in a sub process(created by ChildProcessPool constructor with param - `path`).\n\nUsing `ProcessHost` we will no longer pay attention to the message sending/receiving between main process and sub processes. Just declaring a task with a unique service-name and put your processing code into a function. And remember that if the code is async, return a Promise instance instead.\n\n#### 1. Require it in a sub process\n\n```js\nconst { ProcessHost } = require('electron-re');\n```\n#### 2. Registry a task with unique name\n\u003e Support chain call\n\n```js\nProcessHost\n  .registry('init-works', (params) =\u003e {\n    return initWorks(params);\n  })\n  .registry('async-works', (params) =\u003e {\n    return asyncWorks(params);\n  });\n\nfunction initWorks(params) {\n  console.log(params);\n  return params;\n}\n\nfunction asyncWorks(params) {\n  console.log(params);\n  return fetch(url);\n}\n```\n\n#### 3. Working with `ChildProcessPool`\n\n```js\n\n/* 1. send a request in main process */\nglobal.ipcUploadProcess.send(\n  'init-works',\n  {\n    name: 'fileName',\n    type: 'fileType',\n    size: 'fileSize',\n  }\n);\n\n...\n\n/* 2. handle this request in sub process */\n...\n\n```\n\n#### 4. Unregistry a task with unique name(if necessary)\n\u003e Support chain call\n\n```js\nProcessHost\n  .unregistry('init-works')\n  .unregistry('async-works')\n  ...\n```\n\n### VIII. WorkerThreadPool\n-----\n\nMulti Processes help to make full use of cpu, Multi Threads improve task parallelism ability of Node.js.\n\nIn Node.js, there is only one main process which has single main thread, the main thread run event loops and executes macro/micro tasks. In theory, macro/micro task should be short and quick, if we use main thread for some cpu-sensitive heavy tasks, this will block event loop on main thread.\n\nSo, try to put your heavy tasks into worker threads will be better in Node.js. The worker thread pool is effective for creating and managing threads, besides, it provides a task queue. When pool has no idle thread, more coming tasks are placed in queue and be taken out from queue after while to be excuted by new idle thread.\n\n#### Create a static WorkerThreadPool pool\n\n1. Options of StaticThreadPool:\n\n- `constructor(options, threadOptions)`\n- @param {_Object_} `opitons`: the options to create a static thread pool:\n  - One of follow params is required and unique:\n    - `execPath` {_String_}: path to an executable commonjs module file.\n    - `execString` {_String_}: executable code string.\n    - `execFunction` {_Function_}: js function.\n  - `lazyLoad` {_Boolean_}: if diabled, all threads will be created when init pool.\n  - `maxThreads` {_Number_}: max thread count of pool.\n  - `maxTasks` {_Number_}: max task count of pool.\n  - `taskRetry` {_Number_}: number of task retries.\n  - `taskLoopTime` {_Number_}: time of task loop.\n  - `taskTimeout` {_Number_}: timeout time.\n- @param {_Object_} `threadOpitions`: Some origin options for node.js worker_threads.\n  - `transferList` {_Array_}: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n\n```js\nconst uint8Array = new Uint8Array([ 1, 2, 3, 4 ]);\nconst staticPool = new StaticThreadPool(\n  {\n    // execPath: 'path/to/executable.js',\n    execString: 'module.exports = (payload) =\u003e `res:${payload}`',\n    // execFunction: (payload) =\u003e payload,\n    lazyLoad: true,\n    maxThreads: 24,\n    maxTasks: 48,\n    taskRetry: 1,\n    taskLoopTime: 1e3,\n    taskTimeout: 5e3,\n  },\n  {\n    transferList: [uint8Array.buffer]\n  }\n);\n```\n\n2. Attributes of a StaticThreadPool instance\n\n- `isFull` {_Boolean_}: whether the pool is full of threads, related to this param - maxThreads.\n- `threadLength` {_Number_}: current thread count of pool.\n- `taskLength` {_Number_}: current task count of pool.\n\n3. Methods of a StaticThreadPool instance\n\n- `fillPoolWithIdleThreads()`: fill pool with idle threads, this is effective when pool is not full.\n- `queue(payload, options)`: Save a task request to task queue, will throw an error when the task queue is full.\n  - @param {_Any_} `payload` __*__: The request payload data.\n  - @param {_Object_} `options`: Options to create a task:\n    - @param {_Number_} `taskTimeout`：The task timeout in milliseconds\n    - @param {_Number_} `taskRetry`：Number of task retries.\n    - @param {_Array_} `transferList`: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n- `exec(payload, options)`: Send a task request to pool, will throw an error when there is no idle thread and the task queue is full.\n  - @param {_Any_} `payload` __*__: The request payload data.\n  - @param {_Object_} `options`: Options to create a task:\n    - @param {_Number_} `taskTimeout`：The task timeout in milliseconds\n    - @param {_Number_} `taskRetry`：Number of task retries.\n    - @param {_Array_} `transferList`: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n- `createExecutor(options={})`: Create an static executor to execute tasks.\n  - @param {_Object_} `options`: Options to create a executor:\n    - @param {_Number_} `taskTimeout`：The task timeout in milliseconds\n    - @param {_Number_} `taskRetry`：Number of task retries.\n    - @param {_Array_} `transferList`: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n- `wipeTaskQueue()`: Wipe all tasks in queue.\n- `wipeThreadPool()`: Wipe all threads in pool.\n- `setMaxThreads(maxThreads)`: Set max thread count of pool.\n  - @param {_Number_} `maxThreads`：max thread count.\n- `setMaxTasks(maxTasks)`: Set max task count of pool.\n  - @param {_Number_} `maxTasks`：max task count.\n- `setTaskLoopTime(taskLoopTime)`: Set time of task loop.\n  - @param {_Number_} `taskLoopTime`：task loop time.\n- `setTaskRetry(taskRetry)`: Set count of task retries.\n  - @param {_Number_} `taskRetry`：Number of task retries.\n- `setTransferList(transferList)`: Set transfer-list data of task.\n  - @param {_Array_} `transferList`：transfer-list data.\n\n```js\nstaticPool\n  .setTaskRetry(1)\n  .exec('payload-data', {\n    taskTimeout: 5e3,\n    taskRetry: 1,\n  })\n  .then((rsp) =\u003e {\n    console.log(rsp);\n  });\n```\n\n#### Create a static WorkerThreadPool excutor\n\n1. Options of StaticThreadPool Executor\n\n- @params {_Object_} options\n  - `taskRetry` {_Number_}: number of task retries.\n  - `taskTimeout` {_Number_}: timeout time.\n  - `transferList` {_Array_}: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n\n```js\nconst uint8Array = new Uint8Array([ 1, 2, 3, 4 ]);\nconst staticExecutor = staticPool.createExecutor({\n  taskRetry: 2,\n  taskTimeout: 2e3,\n  transferList: [unit8Array.buffer]\n});\n```\n\n2. Methods of a StaticThreadPool Executor\n\n- `queue(payload, options)`: Save a task request to task queue, will throw an error when the task queue is full.\n  - @param {_Any_} `payload` __*__: The request payload data.\n- `exec(payload)`: Send a task request to pool from excutor.\n  - @param {_Any_} `payload` __*__: The request payload data.\n- `setTaskRetry(taskRetry)`: Set count of task retries.\n  - @param {_Number_} `taskRetry`：Number of task retries.\n- `setTransferList(transferList)`: Set transfer-list data of task.\n  - @param {_Array_} `transferList`：transfer-list data.\n- `setTaskTimeout(taskTimeout)`: Set timeout time of task.\n  - @param {_Number_} `taskTimeout`：timeout time.\n\n```js\nstaticExecutor\n  .setTaskRetry(2)\n  .exec('test')\n  .then((rsp) =\u003e {\n    console.log(rsp);\n  });\n```\n\n#### Create a dynamic WorkerThreadPool pool\n\n1. Options of DynamicThreadPool:\n\n- `constructor(options, threadOptions)`\n- @param {_Object_} `opitions`: the options to create a static thread pool:\n  - `maxThreads` {_Number_}: max thread count of pool.\n  - `maxTasks` {_Number_}: max task count of pool.\n  - `taskRetry` {_Number_}: number of task retries.\n  - `taskLoopTime` {_Number_}: time of task loop.\n  - `taskTimeout` {_Number_}: timeout time.\n- @param {_Object_} `threadOptions`: Some origin options for node.js worker_threads.\n  - `transferList` {_Array_}: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n\n```js\nconst dynamicPool = new DynamicThreadPool({\n  maxThreads: 24,\n  maxTasks: 48,\n  taskRetry: 1,\n  taskLoopTime: 1e3,\n  taskTimeout: 5e3,\n});\n```\n\n2. Attributes of a DynamicThreadPool instance\n\n- `isFull` {_Boolean_}: whether the pool is full of threads, related to this param - maxThreads.\n- `threadLength` {_Number_}: current thread count of pool.\n- `taskLength` {_Number_}: current task count of pool.\n\n3. Methods of a DynamicThreadPool instance\n\n- `queue(payload, options)`: Save a task request to task queue, will throw an error when the task queue is full.\n  - @param {_Any_} `payload` __*__: The request payload data.\n  - @param {_Object_} `options`: Options to create a task:\n    - One of follow params is optional and unique:\n      - `execPath` {_String_}: path to an executable commonjs module file.\n      - `execString` {_String_}: executable code string.\n      - `execFunction` {_Function_}: js function.\n    - @param {_Number_} `taskTimeout`：The task timeout in milliseconds\n    - @param {_Number_} `taskRetry`：Number of task retries.\n    - @param {_Array_} `transferList`: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n- `exec(payload, options)`: Send a task request to pool, will throw an error when there is no idle thread and the task queue is full.\n  - @param {_Any_} `payload` __*__: The request payload data.\n  - @param {_Object_} `options`: Options to create a task:\n    - One of follow params is optional and unique:\n      - `execPath` {_String_}: path to an executable commonjs module file.\n      - `execString` {_String_}: executable code string.\n      - `execFunction` {_Function_}: js function.\n    - `taskTimeout` {_Number_}：The task timeout in milliseconds\n    - `taskRetry` {_Number_}：Number of task retries.\n    - `transferList` {_Array_}: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n- `createExecutor(options={})`: Create a dynamic executor to execute tasks.\n  - @param {_Object_} `options`: Options to create a executor:\n    - One of follow params is optional and unique:\n      - `execPath` {_String_}: path to an executable commonjs module file.\n      - `execString` {_String_}: executable code string.\n      - `execFunction` {_Function_}: js function.\n    - `taskTimeout` {_Number_}：The task timeout in milliseconds\n    - `taskRetry` {_Number_}：Number of task retries.\n    - `transferList` {_Array_}: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n- `wipeTaskQueue()`: Wipe all tasks in queue.\n- `wipeThreadPool()`: Wipe all threads in pool.\n- `setMaxThreads(maxThreads)`: Set max thread count of pool.\n  - @param {_Number_} `maxThreads`：max thread count.\n- `setMaxTasks(maxTasks)`: Set max task count of pool.\n  - @param {_Number_} `maxTasks`：max task count.\n- `setTaskLoopTime(taskLoopTime)`: Set time of task loop.\n  - @param {_Number_} `taskLoopTime`：task loop time.\n- `setTaskRetry(taskRetry)`: Set count of task retries.\n  - @param {_Number_} `taskRetry`：Number of task retries.\n- `setTransferList(transferList)`: Set transfer-list data of task.\n  - @param {_Array_} `transferList`：transfer-list data.\n- `setExecPath(execPath)`: Set path of an executable commonjs module file.\n  - @param {_String_} `execPath`：path to an executable commonjs module file.\n- `setExecString(execString)`: Set executable code string.\n  - @param {_String_} `execString`：executable code string.\n- `setExecFunction(execFunction)`: Set js function.\n  - @param {_Function_} `execFunction`：js function.\n\n```js\ndynamicPool\n  .setExecString(`module.exports = (payload) =\u003e console.log(payload);`)\n  .setTaskRetry(1)\n  .exec('payload-data', {\n    taskTimeout: 5e3,\n    taskRetry: 1,\n  })\n  .then((rsp) =\u003e {\n    console.log(rsp);\n  });\n```\n\n#### Create a dynamic WorkerThreadPool excutor\n\n1. Options of DynamicThreadPool Executor\n\n- @params {_Object_} options\n  - One of follow params is optional and unique:\n    - `execPath` {_String_}: path to an executable commonjs module file.\n    - `execString` {_String_}: executable code string.\n    - `execFunction` {_Function_}: js function.\n  - `taskRetry` {_Number_}: number of task retries.\n  - `taskTimeout` {_Number_}: timeout time.\n  - `transferList` {_Array_}: A list of ArrayBuffer, MessagePort and FileHandle objects. After transferring, they will not be usable on the sending side.\n\n```js\nconst uint8Array = new Uint8Array([ 1, 2, 3, 4 ]);\nconst dynamicExecutor = dynamicPool.createExecutor({\n  execString: `module.exports = (payload) =\u003e payload`,\n  // execFunction: (payload) =\u003e payload,\n  // execPath: 'path/to/executable.js',\n  taskRetry: 2,\n  taskTimeout: 2e3,\n  transferList: [unit8Array.buffer]\n});\n```\n\n2. Methods of a DynamicThreadPool Executor\n\n- `setExecPath(execPath)`: Set path of an executable commonjs module file.\n    - @param {_String_} `execPath`：path to an executable commonjs module file.\n- `setExecString(execString)`: Set executable code string.\n    - @param {_String_} `execString`：executable code string.\n- `setExecFunction(execFunction)`: Set js function.\n    - @param {_Function_} `execFunction`：js function.\n- `queue(payload)`: Save a task request to task queue, will throw an error when the task queue is full.\n  - @param {_Any_} `payload` __*__: The request payload data.\n- `exec(payload)`: Send a task request to pool from excutor.\n  - @param {_Any_} `payload` __*__: The request payload data.\n- `setTaskRetry(taskRetry)`: Set count of task retries.\n    - @param {_Number_} `taskRetry`：Number of task retries.\n- `setTransferList(transferList)`: Set transfer-list data of task.\n    - @param {_Array_} `transferList`：transfer-list data.\n- `setExecPath(execPath)`: Set path of an executable commonjs module file.\n\n### IX. Examples\n-----\n\n1. [electronux](https://github.com/nojsja/electronux) - A project of mine that uses `BroserService` and `MessageChannel` of electron-re.\n\n2. [file-slice-upload](https://github.com/nojsja/javascript-learning/tree/master/file-slice-upload) - A demo about parallel upload of multiple files, it uses `ChildProcessPool` and `ProcessHost` of electron-re, based on Electron@9.3.5.\n\n3. Also you can check the `index.dev.js` and `test` dir in root, there are some useful cases.\n\n### X. Test Coverage\n\n```bash\n------------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------------------------\nFile                                | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s                                                                           \n------------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------------------------\nAll files                           |   75.27 |    55.73 |   68.15 |   79.29 |                                                                                             \n lib                                |   96.42 |    66.66 |     100 |   96.42 |                                                                                             \n  index.js                          |   96.42 |    66.66 |     100 |   96.42 | 23                                                                                          \n lib/libs                           |   66.83 |    44.61 |   59.12 |   72.59 |                                                                                             \n  BrowserService.class.js           |   76.99 |    55.26 |   55.17 |   77.22 | 61-64,69-92,106-108,172,184-185,191,209-210,231,235                                         \n  EventCenter.class.js              |      80 |    58.33 |   83.33 |     100 | 15-35                                                                                       \n  FileWatcher.class.js              |      60 |    41.66 |   42.85 |   66.66 | 29-49                                                                                       \n  MessageChannel.class.js           |   52.11 |    32.35 |    46.8 |   58.49 | 60-61,75-256,292-297,312-313,394-409,540-547                                                \n  ProcessHost.class.js              |   70.73 |    35.71 |    62.5 |   76.31 | 27,51-59,80,92-108                                                                          \n  ProcessLifeCycle.class.js         |   88.46 |    67.64 |   94.11 |   98.36 | 95                                                                                          \n  consts.js                         |     100 |      100 |     100 |     100 |                                                                                             \n  utils.js                          |   65.16 |    45.83 |      60 |   68.67 | 75-93,107-114,120-131,180,188                                                               \n lib/libs/ChildProcessPool          |   84.84 |       62 |      80 |   89.91 |                                                                                             \n  ForkedProcess.js                  |   78.33 |       50 |   72.72 |   82.45 | 22,64-75,97,103-105                                                                         \n  index.js                          |   86.76 |    65.78 |   82.35 |   92.39 | 119,141,219-223,231-233,287,306-315                                                         \n lib/libs/LoadBalancer              |   80.29 |       50 |   84.37 |   80.91 |                                                                                             \n  consts.js                         |     100 |      100 |     100 |     100 |                                                                                             \n  index.js                          |   77.58 |       50 |   82.14 |   78.18 | 63-69,83,97,103,113,126,153,158-162,178-193,203                                             \n  scheduler.js                      |      95 |       50 |     100 |      95 | 28                                                                                          \n lib/libs/LoadBalancer/algorithm    |   94.79 |     67.3 |     100 |     100 |                                                                                             \n  MINIMUM_CONNECTION.js             |    92.3 |    64.28 |     100 |     100 | 5-6,19                                                                                      \n  POLLING.js                        |   85.71 |       50 |     100 |     100 | 5-9                                                                                         \n  RANDOM.js                         |     100 |       50 |     100 |     100 | 7                                                                                           \n  SPECIFY.js                        |     100 |       75 |     100 |     100 | 14                                                                                          \n  WEIGHTS.js                        |   92.85 |    66.66 |     100 |     100 | 5-11                                                                                        \n  WEIGHTS_MINIMUM_CONNECTION.js     |   94.11 |       80 |     100 |     100 | 5,15                                                                                        \n  WEIGHTS_POLLING.js                |    92.3 |    66.66 |     100 |     100 | 5-10                                                                                        \n  WEIGHTS_RANDOM.js                 |     100 |    66.66 |     100 |     100 | 9,17                                                                                        \n  index.js                          |     100 |      100 |     100 |     100 |                                                                                             \n lib/libs/ProcessManager            |   51.08 |       25 |   38.46 |   51.77 |                                                                                             \n  index.js                          |   57.21 |    31.39 |      48 |    58.6 | 66,71,76,81,110,123,132,143,150-169,175-224,228-230,236-245,285-287,295-298,303-306,311-336 \n  ui.js                             |   32.35 |        0 |    6.66 |   32.83 | 34-122,130-137                                                                              \n lib/libs/WorkerThreadPool          |   81.52 |     57.5 |      78 |   84.72 |                                                                                             \n  Task.js                           |   85.36 |    83.33 |   61.53 |   85.36 | 44-45,77-92                                                                                 \n  TaskQueue.js                      |   66.19 |    39.28 |   86.66 |   69.23 | 78-79,98-139                                                                                \n  Thread.js                         |      85 |     64.7 |      80 |   91.78 | 61-63,150-156,165                                                                           \n  consts.js                         |     100 |      100 |     100 |     100 |                                                                                             \n  index.js                          |     100 |      100 |     100 |     100 |                                                                                             \n  utils.js                          |   91.66 |       50 |     100 |   91.66 | 23                                                                                          \n lib/libs/WorkerThreadPool/Executor |   81.53 |     67.5 |   80.76 |   89.79 |                                                                                             \n  DynamicExecutor.js                |   76.66 |    71.42 |      75 |   84.09 | 50-53,66-67,97                                                                              \n  Executor.js                       |   93.75 |    66.66 |     100 |   93.75 | 70,74                                                                                       \n  StaticExecutor.js                 |   78.94 |       60 |      75 |   95.45 | 39                                                                                          \n lib/libs/WorkerThreadPool/Pool     |   83.37 |    72.41 |   81.01 |   87.95 |                                                                                             \n  DynamicThreadPool.js              |    82.5 |    66.12 |   76.47 |   90.56 | 87-89,129,141                                                                               \n  StaticThreadPool.js               |   87.69 |    70.83 |   92.85 |   97.95 | 144                                                                                         \n  ThreadPool.js                     |   82.57 |    75.49 |   79.16 |   85.21 | 116-118,144-145,165,213-214,224,256-258,356,494-533,564,568,572,576,587                     \n lib/libs/WorkerThreadPool/Worker   |   77.35 |       60 |    62.5 |   81.01 |                                                                                             \n  index.js                          |   84.28 |    67.85 |   76.47 |   95.34 | 49,73                                                                                       \n  worker-runner.js                  |   63.88 |    41.66 |   28.57 |   63.88 | 19-22,32,36-42,54-59,65,76                                                                  \n lib/tasks                          |   83.33 |       50 |     100 |   88.23 |                                                                                             \n  app.init.js                       |   83.33 |       50 |     100 |   88.23 | 33-39                                                                                       \n------------------------------------|---------|----------|---------|---------|---------------------------------------------------------------------------------------------\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnojsja%2Felectron-re","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnojsja%2Felectron-re","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnojsja%2Felectron-re/lists"}