├── .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 | Send to main thread
42 | Send to bg thread
43 |
44 |
45 |
46 | Task:
47 | Do background work
48 |
49 |
50 | 0 background threads available
51 | 0 tasks queued
52 |
53 |
54 |
--------------------------------------------------------------------------------