├── .gitignore ├── README.md ├── background.html ├── main.js ├── package-lock.json ├── package.json ├── preload.js └── renderer.html /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # electron-background-processing 2 | 3 | Update Oct 2021: Now using context isolation for renderer and background 4 | threads, see [Enable Context Isolation...](https://www.electronjs.org/docs/latest/tutorial/security#3-enable-context-isolation-for-remote-content) 5 | and [Context Isolation](https://www.electronjs.org/docs/latest/tutorial/context-isolation). 6 | 7 | Demo of background processing using Electron 8 | 9 | - Pool of background threads to match processors using hidden BrowserWindow instances 10 | - Using IPC to communicate between main, renderer and background threads, see [electron ipcMain](https://github.com/electron/electron/blob/master/docs/api/ipc-main.md) 11 | - Asynchronous message passing (synchronous is possible too but not used here) 12 | 13 | # Install and Run 14 | 15 | Install [NodeJS](https://nodejs.org/en/). 16 | 17 | ```bash 18 | # Clone the repo 19 | git clone https://github.com/sgdan/electron-background-processing.git 20 | cd electron-background-processing 21 | 22 | # Installs Electron 1.8.8 (as specified in package.json) 23 | npm install 24 | 25 | # Runs "electron ." (main.js is specified in package.json) 26 | npm start 27 | ``` 28 | 29 | After starting up on the command line you should see the number of cpus e.g. 30 | 31 | ```bash 32 | $ electron . 33 | 34 | cpus: 4 35 | ``` 36 | 37 | Use the **Send to main thread** button and you should see a message from the UI printed on the command line. 38 | 39 | The **Send to bg thread** button triggers a message from the UI to the main thread which passes it to one of the background threads. That background thread should respond back to the main thread which passes it to the UI. You should see the response immediately next to the button if a background thread was available. 40 | 41 | You can also **Do background work**. If you click it multiple times you should see your computer CPU rise to 100% usage. However, the UI should remain responsive. Further actions will be queued until they can be handled. 42 | -------------------------------------------------------------------------------- /background.html: -------------------------------------------------------------------------------- 1 |

Background

2 | 3 | 42 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | const { ipcMain, BrowserWindow, app } = require("electron"); 2 | const path = require("path"); 3 | app.allowRendererProcessReuse = true; 4 | const cpus = require("os").cpus().length; 5 | console.log("cpus: " + cpus); 6 | 7 | // stack of available background threads 8 | var available = []; 9 | 10 | // queue of tasks to be done 11 | var tasks = []; 12 | 13 | // hand the tasks out to waiting threads 14 | function doIt() { 15 | while (available.length > 0 && tasks.length > 0) { 16 | var task = tasks.shift(); 17 | available.shift().send(task[0], task[1]); 18 | } 19 | renderer.webContents.send("status", available.length, tasks.length); 20 | } 21 | 22 | // Create a hidden background window 23 | function createBgWindow() { 24 | result = new BrowserWindow({ 25 | show: false, 26 | webPreferences: { 27 | preload: path.join(__dirname, "preload.js"), 28 | }, 29 | }); 30 | result.loadURL("file://" + __dirname + "/background.html"); 31 | result.on("closed", () => { 32 | console.log("background window closed"); 33 | }); 34 | return result; 35 | } 36 | 37 | app.whenReady().then(function () { 38 | // Create the "renderer" window which contains the visible UI 39 | renderer = new BrowserWindow({ 40 | width: 500, 41 | height: 400, 42 | webPreferences: { 43 | preload: path.join(__dirname, "preload.js"), 44 | }, 45 | }); 46 | renderer.loadURL("file://" + __dirname + "/renderer.html"); 47 | renderer.show(); 48 | renderer.on("closed", () => { 49 | // call quit to exit, otherwise the background windows will keep the app running 50 | app.quit(); 51 | }); 52 | 53 | // create background thread for each cpu 54 | for (var i = 0; i < cpus; i++) createBgWindow(); 55 | 56 | // Main thread can receive directly from windows 57 | ipcMain.on("to-main", (event, arg) => { 58 | console.log(arg); 59 | }); 60 | 61 | // Windows can talk to each other via main 62 | ipcMain.on("for-renderer", (event, arg) => { 63 | renderer.webContents.send("to-renderer", arg); 64 | }); 65 | ipcMain.on("for-background", (event, arg) => { 66 | tasks.push(["message", arg]); 67 | doIt(); 68 | }); 69 | 70 | // heavy processing done in the background thread 71 | // so UI and main threads remain responsive 72 | ipcMain.on("assign-task", (event, arg) => { 73 | tasks.push(["task", arg]); 74 | doIt(); 75 | }); 76 | 77 | ipcMain.on("ready", (event, arg) => { 78 | available.push(event.sender); 79 | doIt(); 80 | }); 81 | }); 82 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "electron-background-processing", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "electron-background-processing", 8 | "devDependencies": { 9 | "electron": "^27.0.2" 10 | } 11 | }, 12 | "node_modules/@electron/get": { 13 | "version": "2.0.2", 14 | "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", 15 | "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", 16 | "dev": true, 17 | "dependencies": { 18 | "debug": "^4.1.1", 19 | "env-paths": "^2.2.0", 20 | "fs-extra": "^8.1.0", 21 | "got": "^11.8.5", 22 | "progress": "^2.0.3", 23 | "semver": "^6.2.0", 24 | "sumchecker": "^3.0.1" 25 | }, 26 | "engines": { 27 | "node": ">=12" 28 | }, 29 | "optionalDependencies": { 30 | "global-agent": "^3.0.0" 31 | } 32 | }, 33 | "node_modules/@sindresorhus/is": { 34 | "version": "4.6.0", 35 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", 36 | "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", 37 | "dev": true, 38 | "engines": { 39 | "node": ">=10" 40 | }, 41 | "funding": { 42 | "url": "https://github.com/sindresorhus/is?sponsor=1" 43 | } 44 | }, 45 | "node_modules/@szmarczak/http-timer": { 46 | "version": "4.0.6", 47 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", 48 | "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", 49 | "dev": true, 50 | "dependencies": { 51 | "defer-to-connect": "^2.0.0" 52 | }, 53 | "engines": { 54 | "node": ">=10" 55 | } 56 | }, 57 | "node_modules/@types/cacheable-request": { 58 | "version": "6.0.3", 59 | "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", 60 | "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", 61 | "dev": true, 62 | "dependencies": { 63 | "@types/http-cache-semantics": "*", 64 | "@types/keyv": "^3.1.4", 65 | "@types/node": "*", 66 | "@types/responselike": "^1.0.0" 67 | } 68 | }, 69 | "node_modules/@types/http-cache-semantics": { 70 | "version": "4.0.1", 71 | "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 72 | "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", 73 | "dev": true 74 | }, 75 | "node_modules/@types/keyv": { 76 | "version": "3.1.4", 77 | "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", 78 | "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", 79 | "dev": true, 80 | "dependencies": { 81 | "@types/node": "*" 82 | } 83 | }, 84 | "node_modules/@types/node": { 85 | "version": "18.16.16", 86 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.16.tgz", 87 | "integrity": "sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==", 88 | "dev": true 89 | }, 90 | "node_modules/@types/responselike": { 91 | "version": "1.0.0", 92 | "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", 93 | "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", 94 | "dev": true, 95 | "dependencies": { 96 | "@types/node": "*" 97 | } 98 | }, 99 | "node_modules/@types/yauzl": { 100 | "version": "2.10.0", 101 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", 102 | "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", 103 | "dev": true, 104 | "optional": true, 105 | "dependencies": { 106 | "@types/node": "*" 107 | } 108 | }, 109 | "node_modules/boolean": { 110 | "version": "3.2.0", 111 | "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", 112 | "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", 113 | "dev": true, 114 | "optional": true 115 | }, 116 | "node_modules/buffer-crc32": { 117 | "version": "0.2.13", 118 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 119 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 120 | "dev": true, 121 | "engines": { 122 | "node": "*" 123 | } 124 | }, 125 | "node_modules/cacheable-lookup": { 126 | "version": "5.0.4", 127 | "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", 128 | "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", 129 | "dev": true, 130 | "engines": { 131 | "node": ">=10.6.0" 132 | } 133 | }, 134 | "node_modules/cacheable-request": { 135 | "version": "7.0.2", 136 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", 137 | "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", 138 | "dev": true, 139 | "dependencies": { 140 | "clone-response": "^1.0.2", 141 | "get-stream": "^5.1.0", 142 | "http-cache-semantics": "^4.0.0", 143 | "keyv": "^4.0.0", 144 | "lowercase-keys": "^2.0.0", 145 | "normalize-url": "^6.0.1", 146 | "responselike": "^2.0.0" 147 | }, 148 | "engines": { 149 | "node": ">=8" 150 | } 151 | }, 152 | "node_modules/clone-response": { 153 | "version": "1.0.3", 154 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", 155 | "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", 156 | "dev": true, 157 | "dependencies": { 158 | "mimic-response": "^1.0.0" 159 | }, 160 | "funding": { 161 | "url": "https://github.com/sponsors/sindresorhus" 162 | } 163 | }, 164 | "node_modules/debug": { 165 | "version": "4.3.4", 166 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 167 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 168 | "dev": true, 169 | "dependencies": { 170 | "ms": "2.1.2" 171 | }, 172 | "engines": { 173 | "node": ">=6.0" 174 | }, 175 | "peerDependenciesMeta": { 176 | "supports-color": { 177 | "optional": true 178 | } 179 | } 180 | }, 181 | "node_modules/decompress-response": { 182 | "version": "6.0.0", 183 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 184 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 185 | "dev": true, 186 | "dependencies": { 187 | "mimic-response": "^3.1.0" 188 | }, 189 | "engines": { 190 | "node": ">=10" 191 | }, 192 | "funding": { 193 | "url": "https://github.com/sponsors/sindresorhus" 194 | } 195 | }, 196 | "node_modules/decompress-response/node_modules/mimic-response": { 197 | "version": "3.1.0", 198 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 199 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 200 | "dev": true, 201 | "engines": { 202 | "node": ">=10" 203 | }, 204 | "funding": { 205 | "url": "https://github.com/sponsors/sindresorhus" 206 | } 207 | }, 208 | "node_modules/defer-to-connect": { 209 | "version": "2.0.1", 210 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 211 | "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", 212 | "dev": true, 213 | "engines": { 214 | "node": ">=10" 215 | } 216 | }, 217 | "node_modules/define-properties": { 218 | "version": "1.2.0", 219 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", 220 | "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", 221 | "dev": true, 222 | "optional": true, 223 | "dependencies": { 224 | "has-property-descriptors": "^1.0.0", 225 | "object-keys": "^1.1.1" 226 | }, 227 | "engines": { 228 | "node": ">= 0.4" 229 | }, 230 | "funding": { 231 | "url": "https://github.com/sponsors/ljharb" 232 | } 233 | }, 234 | "node_modules/detect-node": { 235 | "version": "2.1.0", 236 | "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", 237 | "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", 238 | "dev": true, 239 | "optional": true 240 | }, 241 | "node_modules/electron": { 242 | "version": "27.0.2", 243 | "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.2.tgz", 244 | "integrity": "sha512-4fbcHQ40ZDlqhr5Pamm+M5BF7ry2lGqjFTWTJ/mrBwuiPWu6xhV/RWgUhKBaLqKNfAaNl3eMxV3Jc82gv6JauQ==", 245 | "dev": true, 246 | "hasInstallScript": true, 247 | "dependencies": { 248 | "@electron/get": "^2.0.0", 249 | "@types/node": "^18.11.18", 250 | "extract-zip": "^2.0.1" 251 | }, 252 | "bin": { 253 | "electron": "cli.js" 254 | }, 255 | "engines": { 256 | "node": ">= 12.20.55" 257 | } 258 | }, 259 | "node_modules/end-of-stream": { 260 | "version": "1.4.4", 261 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 262 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 263 | "dev": true, 264 | "dependencies": { 265 | "once": "^1.4.0" 266 | } 267 | }, 268 | "node_modules/env-paths": { 269 | "version": "2.2.1", 270 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 271 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 272 | "dev": true, 273 | "engines": { 274 | "node": ">=6" 275 | } 276 | }, 277 | "node_modules/es6-error": { 278 | "version": "4.1.1", 279 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 280 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", 281 | "dev": true, 282 | "optional": true 283 | }, 284 | "node_modules/escape-string-regexp": { 285 | "version": "4.0.0", 286 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 287 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 288 | "dev": true, 289 | "optional": true, 290 | "engines": { 291 | "node": ">=10" 292 | }, 293 | "funding": { 294 | "url": "https://github.com/sponsors/sindresorhus" 295 | } 296 | }, 297 | "node_modules/extract-zip": { 298 | "version": "2.0.1", 299 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 300 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 301 | "dev": true, 302 | "dependencies": { 303 | "debug": "^4.1.1", 304 | "get-stream": "^5.1.0", 305 | "yauzl": "^2.10.0" 306 | }, 307 | "bin": { 308 | "extract-zip": "cli.js" 309 | }, 310 | "engines": { 311 | "node": ">= 10.17.0" 312 | }, 313 | "optionalDependencies": { 314 | "@types/yauzl": "^2.9.1" 315 | } 316 | }, 317 | "node_modules/fd-slicer": { 318 | "version": "1.1.0", 319 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 320 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 321 | "dev": true, 322 | "dependencies": { 323 | "pend": "~1.2.0" 324 | } 325 | }, 326 | "node_modules/fs-extra": { 327 | "version": "8.1.0", 328 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 329 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 330 | "dev": true, 331 | "dependencies": { 332 | "graceful-fs": "^4.2.0", 333 | "jsonfile": "^4.0.0", 334 | "universalify": "^0.1.0" 335 | }, 336 | "engines": { 337 | "node": ">=6 <7 || >=8" 338 | } 339 | }, 340 | "node_modules/function-bind": { 341 | "version": "1.1.1", 342 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 343 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 344 | "dev": true, 345 | "optional": true 346 | }, 347 | "node_modules/get-intrinsic": { 348 | "version": "1.2.1", 349 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 350 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 351 | "dev": true, 352 | "optional": true, 353 | "dependencies": { 354 | "function-bind": "^1.1.1", 355 | "has": "^1.0.3", 356 | "has-proto": "^1.0.1", 357 | "has-symbols": "^1.0.3" 358 | }, 359 | "funding": { 360 | "url": "https://github.com/sponsors/ljharb" 361 | } 362 | }, 363 | "node_modules/get-stream": { 364 | "version": "5.2.0", 365 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 366 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 367 | "dev": true, 368 | "dependencies": { 369 | "pump": "^3.0.0" 370 | }, 371 | "engines": { 372 | "node": ">=8" 373 | }, 374 | "funding": { 375 | "url": "https://github.com/sponsors/sindresorhus" 376 | } 377 | }, 378 | "node_modules/global-agent": { 379 | "version": "3.0.0", 380 | "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", 381 | "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", 382 | "dev": true, 383 | "optional": true, 384 | "dependencies": { 385 | "boolean": "^3.0.1", 386 | "es6-error": "^4.1.1", 387 | "matcher": "^3.0.0", 388 | "roarr": "^2.15.3", 389 | "semver": "^7.3.2", 390 | "serialize-error": "^7.0.1" 391 | }, 392 | "engines": { 393 | "node": ">=10.0" 394 | } 395 | }, 396 | "node_modules/global-agent/node_modules/semver": { 397 | "version": "7.5.4", 398 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 399 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 400 | "dev": true, 401 | "optional": true, 402 | "dependencies": { 403 | "lru-cache": "^6.0.0" 404 | }, 405 | "bin": { 406 | "semver": "bin/semver.js" 407 | }, 408 | "engines": { 409 | "node": ">=10" 410 | } 411 | }, 412 | "node_modules/globalthis": { 413 | "version": "1.0.3", 414 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 415 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 416 | "dev": true, 417 | "optional": true, 418 | "dependencies": { 419 | "define-properties": "^1.1.3" 420 | }, 421 | "engines": { 422 | "node": ">= 0.4" 423 | }, 424 | "funding": { 425 | "url": "https://github.com/sponsors/ljharb" 426 | } 427 | }, 428 | "node_modules/got": { 429 | "version": "11.8.6", 430 | "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", 431 | "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", 432 | "dev": true, 433 | "dependencies": { 434 | "@sindresorhus/is": "^4.0.0", 435 | "@szmarczak/http-timer": "^4.0.5", 436 | "@types/cacheable-request": "^6.0.1", 437 | "@types/responselike": "^1.0.0", 438 | "cacheable-lookup": "^5.0.3", 439 | "cacheable-request": "^7.0.2", 440 | "decompress-response": "^6.0.0", 441 | "http2-wrapper": "^1.0.0-beta.5.2", 442 | "lowercase-keys": "^2.0.0", 443 | "p-cancelable": "^2.0.0", 444 | "responselike": "^2.0.0" 445 | }, 446 | "engines": { 447 | "node": ">=10.19.0" 448 | }, 449 | "funding": { 450 | "url": "https://github.com/sindresorhus/got?sponsor=1" 451 | } 452 | }, 453 | "node_modules/graceful-fs": { 454 | "version": "4.2.11", 455 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 456 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 457 | "dev": true 458 | }, 459 | "node_modules/has": { 460 | "version": "1.0.3", 461 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 462 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 463 | "dev": true, 464 | "optional": true, 465 | "dependencies": { 466 | "function-bind": "^1.1.1" 467 | }, 468 | "engines": { 469 | "node": ">= 0.4.0" 470 | } 471 | }, 472 | "node_modules/has-property-descriptors": { 473 | "version": "1.0.0", 474 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 475 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 476 | "dev": true, 477 | "optional": true, 478 | "dependencies": { 479 | "get-intrinsic": "^1.1.1" 480 | }, 481 | "funding": { 482 | "url": "https://github.com/sponsors/ljharb" 483 | } 484 | }, 485 | "node_modules/has-proto": { 486 | "version": "1.0.1", 487 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 488 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 489 | "dev": true, 490 | "optional": true, 491 | "engines": { 492 | "node": ">= 0.4" 493 | }, 494 | "funding": { 495 | "url": "https://github.com/sponsors/ljharb" 496 | } 497 | }, 498 | "node_modules/has-symbols": { 499 | "version": "1.0.3", 500 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 501 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 502 | "dev": true, 503 | "optional": true, 504 | "engines": { 505 | "node": ">= 0.4" 506 | }, 507 | "funding": { 508 | "url": "https://github.com/sponsors/ljharb" 509 | } 510 | }, 511 | "node_modules/http-cache-semantics": { 512 | "version": "4.1.1", 513 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 514 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 515 | "dev": true 516 | }, 517 | "node_modules/http2-wrapper": { 518 | "version": "1.0.3", 519 | "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", 520 | "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", 521 | "dev": true, 522 | "dependencies": { 523 | "quick-lru": "^5.1.1", 524 | "resolve-alpn": "^1.0.0" 525 | }, 526 | "engines": { 527 | "node": ">=10.19.0" 528 | } 529 | }, 530 | "node_modules/json-buffer": { 531 | "version": "3.0.1", 532 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 533 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 534 | "dev": true 535 | }, 536 | "node_modules/json-stringify-safe": { 537 | "version": "5.0.1", 538 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 539 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", 540 | "dev": true, 541 | "optional": true 542 | }, 543 | "node_modules/jsonfile": { 544 | "version": "4.0.0", 545 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 546 | "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", 547 | "dev": true, 548 | "optionalDependencies": { 549 | "graceful-fs": "^4.1.6" 550 | } 551 | }, 552 | "node_modules/keyv": { 553 | "version": "4.5.2", 554 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", 555 | "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", 556 | "dev": true, 557 | "dependencies": { 558 | "json-buffer": "3.0.1" 559 | } 560 | }, 561 | "node_modules/lowercase-keys": { 562 | "version": "2.0.0", 563 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 564 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 565 | "dev": true, 566 | "engines": { 567 | "node": ">=8" 568 | } 569 | }, 570 | "node_modules/lru-cache": { 571 | "version": "6.0.0", 572 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 573 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 574 | "dev": true, 575 | "optional": true, 576 | "dependencies": { 577 | "yallist": "^4.0.0" 578 | }, 579 | "engines": { 580 | "node": ">=10" 581 | } 582 | }, 583 | "node_modules/matcher": { 584 | "version": "3.0.0", 585 | "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", 586 | "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", 587 | "dev": true, 588 | "optional": true, 589 | "dependencies": { 590 | "escape-string-regexp": "^4.0.0" 591 | }, 592 | "engines": { 593 | "node": ">=10" 594 | } 595 | }, 596 | "node_modules/mimic-response": { 597 | "version": "1.0.1", 598 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 599 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 600 | "dev": true, 601 | "engines": { 602 | "node": ">=4" 603 | } 604 | }, 605 | "node_modules/ms": { 606 | "version": "2.1.2", 607 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 608 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 609 | "dev": true 610 | }, 611 | "node_modules/normalize-url": { 612 | "version": "6.1.0", 613 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", 614 | "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", 615 | "dev": true, 616 | "engines": { 617 | "node": ">=10" 618 | }, 619 | "funding": { 620 | "url": "https://github.com/sponsors/sindresorhus" 621 | } 622 | }, 623 | "node_modules/object-keys": { 624 | "version": "1.1.1", 625 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 626 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 627 | "dev": true, 628 | "optional": true, 629 | "engines": { 630 | "node": ">= 0.4" 631 | } 632 | }, 633 | "node_modules/once": { 634 | "version": "1.4.0", 635 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 636 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 637 | "dev": true, 638 | "dependencies": { 639 | "wrappy": "1" 640 | } 641 | }, 642 | "node_modules/p-cancelable": { 643 | "version": "2.1.1", 644 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", 645 | "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", 646 | "dev": true, 647 | "engines": { 648 | "node": ">=8" 649 | } 650 | }, 651 | "node_modules/pend": { 652 | "version": "1.2.0", 653 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 654 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 655 | "dev": true 656 | }, 657 | "node_modules/progress": { 658 | "version": "2.0.3", 659 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 660 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 661 | "dev": true, 662 | "engines": { 663 | "node": ">=0.4.0" 664 | } 665 | }, 666 | "node_modules/pump": { 667 | "version": "3.0.0", 668 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 669 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 670 | "dev": true, 671 | "dependencies": { 672 | "end-of-stream": "^1.1.0", 673 | "once": "^1.3.1" 674 | } 675 | }, 676 | "node_modules/quick-lru": { 677 | "version": "5.1.1", 678 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 679 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 680 | "dev": true, 681 | "engines": { 682 | "node": ">=10" 683 | }, 684 | "funding": { 685 | "url": "https://github.com/sponsors/sindresorhus" 686 | } 687 | }, 688 | "node_modules/resolve-alpn": { 689 | "version": "1.2.1", 690 | "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 691 | "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", 692 | "dev": true 693 | }, 694 | "node_modules/responselike": { 695 | "version": "2.0.1", 696 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", 697 | "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", 698 | "dev": true, 699 | "dependencies": { 700 | "lowercase-keys": "^2.0.0" 701 | }, 702 | "funding": { 703 | "url": "https://github.com/sponsors/sindresorhus" 704 | } 705 | }, 706 | "node_modules/roarr": { 707 | "version": "2.15.4", 708 | "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", 709 | "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", 710 | "dev": true, 711 | "optional": true, 712 | "dependencies": { 713 | "boolean": "^3.0.1", 714 | "detect-node": "^2.0.4", 715 | "globalthis": "^1.0.1", 716 | "json-stringify-safe": "^5.0.1", 717 | "semver-compare": "^1.0.0", 718 | "sprintf-js": "^1.1.2" 719 | }, 720 | "engines": { 721 | "node": ">=8.0" 722 | } 723 | }, 724 | "node_modules/semver": { 725 | "version": "6.3.1", 726 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 727 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 728 | "dev": true, 729 | "bin": { 730 | "semver": "bin/semver.js" 731 | } 732 | }, 733 | "node_modules/semver-compare": { 734 | "version": "1.0.0", 735 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 736 | "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", 737 | "dev": true, 738 | "optional": true 739 | }, 740 | "node_modules/serialize-error": { 741 | "version": "7.0.1", 742 | "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", 743 | "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", 744 | "dev": true, 745 | "optional": true, 746 | "dependencies": { 747 | "type-fest": "^0.13.1" 748 | }, 749 | "engines": { 750 | "node": ">=10" 751 | }, 752 | "funding": { 753 | "url": "https://github.com/sponsors/sindresorhus" 754 | } 755 | }, 756 | "node_modules/sprintf-js": { 757 | "version": "1.1.2", 758 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 759 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", 760 | "dev": true, 761 | "optional": true 762 | }, 763 | "node_modules/sumchecker": { 764 | "version": "3.0.1", 765 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", 766 | "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", 767 | "dev": true, 768 | "dependencies": { 769 | "debug": "^4.1.0" 770 | }, 771 | "engines": { 772 | "node": ">= 8.0" 773 | } 774 | }, 775 | "node_modules/type-fest": { 776 | "version": "0.13.1", 777 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", 778 | "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", 779 | "dev": true, 780 | "optional": true, 781 | "engines": { 782 | "node": ">=10" 783 | }, 784 | "funding": { 785 | "url": "https://github.com/sponsors/sindresorhus" 786 | } 787 | }, 788 | "node_modules/universalify": { 789 | "version": "0.1.2", 790 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 791 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 792 | "dev": true, 793 | "engines": { 794 | "node": ">= 4.0.0" 795 | } 796 | }, 797 | "node_modules/wrappy": { 798 | "version": "1.0.2", 799 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 800 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 801 | "dev": true 802 | }, 803 | "node_modules/yallist": { 804 | "version": "4.0.0", 805 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 806 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 807 | "dev": true, 808 | "optional": true 809 | }, 810 | "node_modules/yauzl": { 811 | "version": "2.10.0", 812 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 813 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 814 | "dev": true, 815 | "dependencies": { 816 | "buffer-crc32": "~0.2.3", 817 | "fd-slicer": "~1.1.0" 818 | } 819 | } 820 | }, 821 | "dependencies": { 822 | "@electron/get": { 823 | "version": "2.0.2", 824 | "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", 825 | "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", 826 | "dev": true, 827 | "requires": { 828 | "debug": "^4.1.1", 829 | "env-paths": "^2.2.0", 830 | "fs-extra": "^8.1.0", 831 | "global-agent": "^3.0.0", 832 | "got": "^11.8.5", 833 | "progress": "^2.0.3", 834 | "semver": "^6.2.0", 835 | "sumchecker": "^3.0.1" 836 | } 837 | }, 838 | "@sindresorhus/is": { 839 | "version": "4.6.0", 840 | "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", 841 | "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", 842 | "dev": true 843 | }, 844 | "@szmarczak/http-timer": { 845 | "version": "4.0.6", 846 | "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", 847 | "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", 848 | "dev": true, 849 | "requires": { 850 | "defer-to-connect": "^2.0.0" 851 | } 852 | }, 853 | "@types/cacheable-request": { 854 | "version": "6.0.3", 855 | "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", 856 | "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", 857 | "dev": true, 858 | "requires": { 859 | "@types/http-cache-semantics": "*", 860 | "@types/keyv": "^3.1.4", 861 | "@types/node": "*", 862 | "@types/responselike": "^1.0.0" 863 | } 864 | }, 865 | "@types/http-cache-semantics": { 866 | "version": "4.0.1", 867 | "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", 868 | "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", 869 | "dev": true 870 | }, 871 | "@types/keyv": { 872 | "version": "3.1.4", 873 | "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", 874 | "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", 875 | "dev": true, 876 | "requires": { 877 | "@types/node": "*" 878 | } 879 | }, 880 | "@types/node": { 881 | "version": "18.16.16", 882 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.16.tgz", 883 | "integrity": "sha512-NpaM49IGQQAUlBhHMF82QH80J08os4ZmyF9MkpCzWAGuOHqE4gTEbhzd7L3l5LmWuZ6E0OiC1FweQ4tsiW35+g==", 884 | "dev": true 885 | }, 886 | "@types/responselike": { 887 | "version": "1.0.0", 888 | "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", 889 | "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", 890 | "dev": true, 891 | "requires": { 892 | "@types/node": "*" 893 | } 894 | }, 895 | "@types/yauzl": { 896 | "version": "2.10.0", 897 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", 898 | "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", 899 | "dev": true, 900 | "optional": true, 901 | "requires": { 902 | "@types/node": "*" 903 | } 904 | }, 905 | "boolean": { 906 | "version": "3.2.0", 907 | "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", 908 | "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", 909 | "dev": true, 910 | "optional": true 911 | }, 912 | "buffer-crc32": { 913 | "version": "0.2.13", 914 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 915 | "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", 916 | "dev": true 917 | }, 918 | "cacheable-lookup": { 919 | "version": "5.0.4", 920 | "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", 921 | "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", 922 | "dev": true 923 | }, 924 | "cacheable-request": { 925 | "version": "7.0.2", 926 | "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", 927 | "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", 928 | "dev": true, 929 | "requires": { 930 | "clone-response": "^1.0.2", 931 | "get-stream": "^5.1.0", 932 | "http-cache-semantics": "^4.0.0", 933 | "keyv": "^4.0.0", 934 | "lowercase-keys": "^2.0.0", 935 | "normalize-url": "^6.0.1", 936 | "responselike": "^2.0.0" 937 | } 938 | }, 939 | "clone-response": { 940 | "version": "1.0.3", 941 | "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", 942 | "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", 943 | "dev": true, 944 | "requires": { 945 | "mimic-response": "^1.0.0" 946 | } 947 | }, 948 | "debug": { 949 | "version": "4.3.4", 950 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 951 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 952 | "dev": true, 953 | "requires": { 954 | "ms": "2.1.2" 955 | } 956 | }, 957 | "decompress-response": { 958 | "version": "6.0.0", 959 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 960 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 961 | "dev": true, 962 | "requires": { 963 | "mimic-response": "^3.1.0" 964 | }, 965 | "dependencies": { 966 | "mimic-response": { 967 | "version": "3.1.0", 968 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 969 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 970 | "dev": true 971 | } 972 | } 973 | }, 974 | "defer-to-connect": { 975 | "version": "2.0.1", 976 | "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", 977 | "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", 978 | "dev": true 979 | }, 980 | "define-properties": { 981 | "version": "1.2.0", 982 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", 983 | "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", 984 | "dev": true, 985 | "optional": true, 986 | "requires": { 987 | "has-property-descriptors": "^1.0.0", 988 | "object-keys": "^1.1.1" 989 | } 990 | }, 991 | "detect-node": { 992 | "version": "2.1.0", 993 | "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", 994 | "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", 995 | "dev": true, 996 | "optional": true 997 | }, 998 | "electron": { 999 | "version": "27.0.2", 1000 | "resolved": "https://registry.npmjs.org/electron/-/electron-27.0.2.tgz", 1001 | "integrity": "sha512-4fbcHQ40ZDlqhr5Pamm+M5BF7ry2lGqjFTWTJ/mrBwuiPWu6xhV/RWgUhKBaLqKNfAaNl3eMxV3Jc82gv6JauQ==", 1002 | "dev": true, 1003 | "requires": { 1004 | "@electron/get": "^2.0.0", 1005 | "@types/node": "^18.11.18", 1006 | "extract-zip": "^2.0.1" 1007 | } 1008 | }, 1009 | "end-of-stream": { 1010 | "version": "1.4.4", 1011 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1012 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1013 | "dev": true, 1014 | "requires": { 1015 | "once": "^1.4.0" 1016 | } 1017 | }, 1018 | "env-paths": { 1019 | "version": "2.2.1", 1020 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 1021 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 1022 | "dev": true 1023 | }, 1024 | "es6-error": { 1025 | "version": "4.1.1", 1026 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 1027 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", 1028 | "dev": true, 1029 | "optional": true 1030 | }, 1031 | "escape-string-regexp": { 1032 | "version": "4.0.0", 1033 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1034 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1035 | "dev": true, 1036 | "optional": true 1037 | }, 1038 | "extract-zip": { 1039 | "version": "2.0.1", 1040 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 1041 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 1042 | "dev": true, 1043 | "requires": { 1044 | "@types/yauzl": "^2.9.1", 1045 | "debug": "^4.1.1", 1046 | "get-stream": "^5.1.0", 1047 | "yauzl": "^2.10.0" 1048 | } 1049 | }, 1050 | "fd-slicer": { 1051 | "version": "1.1.0", 1052 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 1053 | "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", 1054 | "dev": true, 1055 | "requires": { 1056 | "pend": "~1.2.0" 1057 | } 1058 | }, 1059 | "fs-extra": { 1060 | "version": "8.1.0", 1061 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 1062 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 1063 | "dev": true, 1064 | "requires": { 1065 | "graceful-fs": "^4.2.0", 1066 | "jsonfile": "^4.0.0", 1067 | "universalify": "^0.1.0" 1068 | } 1069 | }, 1070 | "function-bind": { 1071 | "version": "1.1.1", 1072 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1073 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1074 | "dev": true, 1075 | "optional": true 1076 | }, 1077 | "get-intrinsic": { 1078 | "version": "1.2.1", 1079 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 1080 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 1081 | "dev": true, 1082 | "optional": true, 1083 | "requires": { 1084 | "function-bind": "^1.1.1", 1085 | "has": "^1.0.3", 1086 | "has-proto": "^1.0.1", 1087 | "has-symbols": "^1.0.3" 1088 | } 1089 | }, 1090 | "get-stream": { 1091 | "version": "5.2.0", 1092 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 1093 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 1094 | "dev": true, 1095 | "requires": { 1096 | "pump": "^3.0.0" 1097 | } 1098 | }, 1099 | "global-agent": { 1100 | "version": "3.0.0", 1101 | "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", 1102 | "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", 1103 | "dev": true, 1104 | "optional": true, 1105 | "requires": { 1106 | "boolean": "^3.0.1", 1107 | "es6-error": "^4.1.1", 1108 | "matcher": "^3.0.0", 1109 | "roarr": "^2.15.3", 1110 | "semver": "^7.3.2", 1111 | "serialize-error": "^7.0.1" 1112 | }, 1113 | "dependencies": { 1114 | "semver": { 1115 | "version": "7.5.4", 1116 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 1117 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 1118 | "dev": true, 1119 | "optional": true, 1120 | "requires": { 1121 | "lru-cache": "^6.0.0" 1122 | } 1123 | } 1124 | } 1125 | }, 1126 | "globalthis": { 1127 | "version": "1.0.3", 1128 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 1129 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 1130 | "dev": true, 1131 | "optional": true, 1132 | "requires": { 1133 | "define-properties": "^1.1.3" 1134 | } 1135 | }, 1136 | "got": { 1137 | "version": "11.8.6", 1138 | "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", 1139 | "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", 1140 | "dev": true, 1141 | "requires": { 1142 | "@sindresorhus/is": "^4.0.0", 1143 | "@szmarczak/http-timer": "^4.0.5", 1144 | "@types/cacheable-request": "^6.0.1", 1145 | "@types/responselike": "^1.0.0", 1146 | "cacheable-lookup": "^5.0.3", 1147 | "cacheable-request": "^7.0.2", 1148 | "decompress-response": "^6.0.0", 1149 | "http2-wrapper": "^1.0.0-beta.5.2", 1150 | "lowercase-keys": "^2.0.0", 1151 | "p-cancelable": "^2.0.0", 1152 | "responselike": "^2.0.0" 1153 | } 1154 | }, 1155 | "graceful-fs": { 1156 | "version": "4.2.11", 1157 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1158 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1159 | "dev": true 1160 | }, 1161 | "has": { 1162 | "version": "1.0.3", 1163 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1164 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1165 | "dev": true, 1166 | "optional": true, 1167 | "requires": { 1168 | "function-bind": "^1.1.1" 1169 | } 1170 | }, 1171 | "has-property-descriptors": { 1172 | "version": "1.0.0", 1173 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 1174 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 1175 | "dev": true, 1176 | "optional": true, 1177 | "requires": { 1178 | "get-intrinsic": "^1.1.1" 1179 | } 1180 | }, 1181 | "has-proto": { 1182 | "version": "1.0.1", 1183 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 1184 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 1185 | "dev": true, 1186 | "optional": true 1187 | }, 1188 | "has-symbols": { 1189 | "version": "1.0.3", 1190 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1191 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1192 | "dev": true, 1193 | "optional": true 1194 | }, 1195 | "http-cache-semantics": { 1196 | "version": "4.1.1", 1197 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 1198 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 1199 | "dev": true 1200 | }, 1201 | "http2-wrapper": { 1202 | "version": "1.0.3", 1203 | "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", 1204 | "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", 1205 | "dev": true, 1206 | "requires": { 1207 | "quick-lru": "^5.1.1", 1208 | "resolve-alpn": "^1.0.0" 1209 | } 1210 | }, 1211 | "json-buffer": { 1212 | "version": "3.0.1", 1213 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1214 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1215 | "dev": true 1216 | }, 1217 | "json-stringify-safe": { 1218 | "version": "5.0.1", 1219 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1220 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", 1221 | "dev": true, 1222 | "optional": true 1223 | }, 1224 | "jsonfile": { 1225 | "version": "4.0.0", 1226 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1227 | "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", 1228 | "dev": true, 1229 | "requires": { 1230 | "graceful-fs": "^4.1.6" 1231 | } 1232 | }, 1233 | "keyv": { 1234 | "version": "4.5.2", 1235 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", 1236 | "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", 1237 | "dev": true, 1238 | "requires": { 1239 | "json-buffer": "3.0.1" 1240 | } 1241 | }, 1242 | "lowercase-keys": { 1243 | "version": "2.0.0", 1244 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", 1245 | "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", 1246 | "dev": true 1247 | }, 1248 | "lru-cache": { 1249 | "version": "6.0.0", 1250 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1251 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1252 | "dev": true, 1253 | "optional": true, 1254 | "requires": { 1255 | "yallist": "^4.0.0" 1256 | } 1257 | }, 1258 | "matcher": { 1259 | "version": "3.0.0", 1260 | "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", 1261 | "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", 1262 | "dev": true, 1263 | "optional": true, 1264 | "requires": { 1265 | "escape-string-regexp": "^4.0.0" 1266 | } 1267 | }, 1268 | "mimic-response": { 1269 | "version": "1.0.1", 1270 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 1271 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 1272 | "dev": true 1273 | }, 1274 | "ms": { 1275 | "version": "2.1.2", 1276 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1277 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1278 | "dev": true 1279 | }, 1280 | "normalize-url": { 1281 | "version": "6.1.0", 1282 | "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", 1283 | "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", 1284 | "dev": true 1285 | }, 1286 | "object-keys": { 1287 | "version": "1.1.1", 1288 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1289 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1290 | "dev": true, 1291 | "optional": true 1292 | }, 1293 | "once": { 1294 | "version": "1.4.0", 1295 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1296 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1297 | "dev": true, 1298 | "requires": { 1299 | "wrappy": "1" 1300 | } 1301 | }, 1302 | "p-cancelable": { 1303 | "version": "2.1.1", 1304 | "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", 1305 | "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", 1306 | "dev": true 1307 | }, 1308 | "pend": { 1309 | "version": "1.2.0", 1310 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1311 | "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", 1312 | "dev": true 1313 | }, 1314 | "progress": { 1315 | "version": "2.0.3", 1316 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1317 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1318 | "dev": true 1319 | }, 1320 | "pump": { 1321 | "version": "3.0.0", 1322 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1323 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1324 | "dev": true, 1325 | "requires": { 1326 | "end-of-stream": "^1.1.0", 1327 | "once": "^1.3.1" 1328 | } 1329 | }, 1330 | "quick-lru": { 1331 | "version": "5.1.1", 1332 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1333 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 1334 | "dev": true 1335 | }, 1336 | "resolve-alpn": { 1337 | "version": "1.2.1", 1338 | "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", 1339 | "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", 1340 | "dev": true 1341 | }, 1342 | "responselike": { 1343 | "version": "2.0.1", 1344 | "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", 1345 | "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", 1346 | "dev": true, 1347 | "requires": { 1348 | "lowercase-keys": "^2.0.0" 1349 | } 1350 | }, 1351 | "roarr": { 1352 | "version": "2.15.4", 1353 | "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", 1354 | "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", 1355 | "dev": true, 1356 | "optional": true, 1357 | "requires": { 1358 | "boolean": "^3.0.1", 1359 | "detect-node": "^2.0.4", 1360 | "globalthis": "^1.0.1", 1361 | "json-stringify-safe": "^5.0.1", 1362 | "semver-compare": "^1.0.0", 1363 | "sprintf-js": "^1.1.2" 1364 | } 1365 | }, 1366 | "semver": { 1367 | "version": "6.3.1", 1368 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1369 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1370 | "dev": true 1371 | }, 1372 | "semver-compare": { 1373 | "version": "1.0.0", 1374 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 1375 | "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", 1376 | "dev": true, 1377 | "optional": true 1378 | }, 1379 | "serialize-error": { 1380 | "version": "7.0.1", 1381 | "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", 1382 | "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", 1383 | "dev": true, 1384 | "optional": true, 1385 | "requires": { 1386 | "type-fest": "^0.13.1" 1387 | } 1388 | }, 1389 | "sprintf-js": { 1390 | "version": "1.1.2", 1391 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", 1392 | "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", 1393 | "dev": true, 1394 | "optional": true 1395 | }, 1396 | "sumchecker": { 1397 | "version": "3.0.1", 1398 | "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", 1399 | "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", 1400 | "dev": true, 1401 | "requires": { 1402 | "debug": "^4.1.0" 1403 | } 1404 | }, 1405 | "type-fest": { 1406 | "version": "0.13.1", 1407 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", 1408 | "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", 1409 | "dev": true, 1410 | "optional": true 1411 | }, 1412 | "universalify": { 1413 | "version": "0.1.2", 1414 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1415 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 1416 | "dev": true 1417 | }, 1418 | "wrappy": { 1419 | "version": "1.0.2", 1420 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1421 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1422 | "dev": true 1423 | }, 1424 | "yallist": { 1425 | "version": "4.0.0", 1426 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1427 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1428 | "dev": true, 1429 | "optional": true 1430 | }, 1431 | "yauzl": { 1432 | "version": "2.10.0", 1433 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1434 | "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", 1435 | "dev": true, 1436 | "requires": { 1437 | "buffer-crc32": "~0.2.3", 1438 | "fd-slicer": "~1.1.0" 1439 | } 1440 | } 1441 | } 1442 | } 1443 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "electron-background-processing", 3 | "main": "main.js", 4 | "scripts": { 5 | "start": "electron ." 6 | }, 7 | "devDependencies": { 8 | "electron": "^27.0.2" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /preload.js: -------------------------------------------------------------------------------- 1 | // see https://www.electronjs.org/docs/latest/tutorial/context-isolation 2 | const { contextBridge, ipcRenderer } = require("electron"); 3 | 4 | contextBridge.exposeInMainWorld("api", { 5 | toMain: (data) => ipcRenderer.send("to-main", data), 6 | forBackground: (data) => ipcRenderer.send("for-background", data), 7 | assignTask: (data) => ipcRenderer.send("assign-task", data), 8 | 9 | ready: () => ipcRenderer.send("ready"), 10 | forRenderer: (data) => { 11 | ipcRenderer.send("for-renderer", "[bg-" + process.pid + "] reply: " + data); 12 | }, 13 | log: (data) => { 14 | ipcRenderer.send("to-main", "[bg-" + process.pid + "]: " + data); 15 | }, 16 | 17 | toRenderer: (func) => 18 | ipcRenderer.on("to-renderer", (event, ...args) => func(...args)), 19 | status: (func) => ipcRenderer.on("status", (event, ...args) => func(...args)), 20 | message: (func) => 21 | ipcRenderer.on("message", (event, ...args) => func(...args)), 22 | task: (func) => ipcRenderer.on("task", (event, ...args) => func(...args)), 23 | }); 24 | -------------------------------------------------------------------------------- /renderer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 36 | 37 | 38 |

Background Threads

39 | 40 | Msg:
41 |
42 | 43 | 44 |

45 | 46 | Task:
47 | 48 |

49 | 50 | background threads available
51 | tasks queued 52 | 53 | 54 | --------------------------------------------------------------------------------