Skip to content

Commit 8f72f9b

Browse files
authored
feat: add net module to utility process (#40967)
feat: add net module to utility process (#40017) Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
1 parent 6e44c8f commit 8f72f9b

31 files changed

+2475
-2123
lines changed

docs/api/client-request.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> Make HTTP/HTTPS requests.
44
5-
Process: [Main](../glossary.md#main-process)<br />
5+
Process: [Main](../glossary.md#main-process), [Utility](../glossary.md#utility-process)<br />
66
_This class is not exported from the `'electron'` module. It is only available as a return value of other methods in the Electron API._
77

88
`ClientRequest` implements the [Writable Stream](https://nodejs.org/api/stream.html#stream_writable_streams)

docs/api/incoming-message.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> Handle responses to HTTP/HTTPS requests.
44
5-
Process: [Main](../glossary.md#main-process)<br />
5+
Process: [Main](../glossary.md#main-process), [Utility](../glossary.md#utility-process)<br />
66
_This class is not exported from the `'electron'` module. It is only available as a return value of other methods in the Electron API._
77

88
`IncomingMessage` implements the [Readable Stream](https://nodejs.org/api/stream.html#stream_readable_streams)

docs/api/net.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> Issue HTTP/HTTPS requests using Chromium's native networking library
44
5-
Process: [Main](../glossary.md#main-process)
5+
Process: [Main](../glossary.md#main-process), [Utility](../glossary.md#utility-process)
66

77
The `net` module is a client-side API for issuing HTTP(S) requests. It is
88
similar to the [HTTP](https://nodejs.org/api/http.html) and
@@ -119,6 +119,9 @@ protocol.handle('https', (req) => {
119119
})
120120
```
121121

122+
Note: in the [utility process](../glossary.md#utility-process) custom protocols
123+
are not supported.
124+
122125
### `net.isOnline()`
123126

124127
Returns `boolean` - Whether there is currently internet connection.

filenames.auto.gni

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,6 @@ auto_filenames = {
213213
"lib/browser/api/message-channel.ts",
214214
"lib/browser/api/module-list.ts",
215215
"lib/browser/api/native-theme.ts",
216-
"lib/browser/api/net-client-request.ts",
217216
"lib/browser/api/net-fetch.ts",
218217
"lib/browser/api/net-log.ts",
219218
"lib/browser/api/net.ts",
@@ -249,6 +248,7 @@ auto_filenames = {
249248
"lib/browser/web-view-events.ts",
250249
"lib/common/api/module-list.ts",
251250
"lib/common/api/native-image.ts",
251+
"lib/common/api/net-client-request.ts",
252252
"lib/common/api/shell.ts",
253253
"lib/common/define-properties.ts",
254254
"lib/common/deprecate.ts",
@@ -340,12 +340,16 @@ auto_filenames = {
340340
]
341341

342342
utility_bundle_deps = [
343+
"lib/browser/api/net-fetch.ts",
343344
"lib/browser/message-port-main.ts",
345+
"lib/common/api/net-client-request.ts",
344346
"lib/common/define-properties.ts",
345347
"lib/common/init.ts",
346348
"lib/common/reset-search-paths.ts",
349+
"lib/common/webpack-globals-provider.ts",
347350
"lib/utility/api/exports/electron.ts",
348351
"lib/utility/api/module-list.ts",
352+
"lib/utility/api/net.ts",
349353
"lib/utility/init.ts",
350354
"lib/utility/parent-port.ts",
351355
"package.json",

filenames.gni

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,6 @@ filenames = {
283283
"shell/browser/api/electron_api_menu.h",
284284
"shell/browser/api/electron_api_native_theme.cc",
285285
"shell/browser/api/electron_api_native_theme.h",
286-
"shell/browser/api/electron_api_net.cc",
287286
"shell/browser/api/electron_api_net_log.cc",
288287
"shell/browser/api/electron_api_net_log.h",
289288
"shell/browser/api/electron_api_notification.cc",
@@ -309,8 +308,6 @@ filenames = {
309308
"shell/browser/api/electron_api_system_preferences.h",
310309
"shell/browser/api/electron_api_tray.cc",
311310
"shell/browser/api/electron_api_tray.h",
312-
"shell/browser/api/electron_api_url_loader.cc",
313-
"shell/browser/api/electron_api_url_loader.h",
314311
"shell/browser/api/electron_api_utility_process.cc",
315312
"shell/browser/api/electron_api_utility_process.h",
316313
"shell/browser/api/electron_api_view.cc",
@@ -550,8 +547,11 @@ filenames = {
550547
"shell/common/api/electron_api_key_weak_map.h",
551548
"shell/common/api/electron_api_native_image.cc",
552549
"shell/common/api/electron_api_native_image.h",
550+
"shell/common/api/electron_api_net.cc",
553551
"shell/common/api/electron_api_shell.cc",
554552
"shell/common/api/electron_api_testing.cc",
553+
"shell/common/api/electron_api_url_loader.cc",
554+
"shell/common/api/electron_api_url_loader.h",
555555
"shell/common/api/electron_api_v8_util.cc",
556556
"shell/common/api/electron_bindings.cc",
557557
"shell/common/api/electron_bindings.h",

lib/browser/api/net-fetch.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { net, IncomingMessage, Session as SessionT } from 'electron/main';
1+
import { ClientRequestConstructorOptions, ClientRequest, IncomingMessage, Session as SessionT } from 'electron/main';
22
import { Readable, Writable, isReadable } from 'stream';
3-
import { allowAnyProtocol } from '@electron/internal/browser/api/net-client-request';
3+
import { allowAnyProtocol } from '@electron/internal/common/api/net-client-request';
44

55
function createDeferredPromise<T, E extends Error = Error> (): { promise: Promise<T>; resolve: (x: T) => void; reject: (e: E) => void; } {
66
let res: (x: T) => void;
@@ -13,7 +13,8 @@ function createDeferredPromise<T, E extends Error = Error> (): { promise: Promis
1313
return { promise, resolve: res!, reject: rej! };
1414
}
1515

16-
export function fetchWithSession (input: RequestInfo, init: (RequestInit & {bypassCustomProtocolHandlers?: boolean}) | undefined, session: SessionT): Promise<Response> {
16+
export function fetchWithSession (input: RequestInfo, init: (RequestInit & {bypassCustomProtocolHandlers?: boolean}) | undefined, session: SessionT | undefined,
17+
request: (options: ClientRequestConstructorOptions | string) => ClientRequest) {
1718
const p = createDeferredPromise<Response>();
1819
let req: Request;
1920
try {
@@ -73,7 +74,7 @@ export function fetchWithSession (input: RequestInfo, init: (RequestInit & {bypa
7374
// We can't set credentials to same-origin unless there's an origin set.
7475
const credentials = req.credentials === 'same-origin' && !origin ? 'include' : req.credentials;
7576

76-
const r = net.request(allowAnyProtocol({
77+
const r = request(allowAnyProtocol({
7778
session,
7879
method: req.method,
7980
url: req.url,

lib/browser/api/net.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import { IncomingMessage, session } from 'electron/main';
1+
import { app, IncomingMessage, session } from 'electron/main';
22
import type { ClientRequestConstructorOptions } from 'electron/main';
3-
import { ClientRequest } from '@electron/internal/browser/api/net-client-request';
3+
import { ClientRequest } from '@electron/internal/common/api/net-client-request';
44

5-
const { isOnline } = process._linkedBinding('electron_browser_net');
5+
const { isOnline } = process._linkedBinding('electron_common_net');
66

77
export function request (options: ClientRequestConstructorOptions | string, callback?: (message: IncomingMessage) => void) {
8+
if (!app.isReady()) {
9+
throw new Error('net module can only be used after app is ready');
10+
}
811
return new ClientRequest(options, callback);
912
}
1013

lib/browser/api/session.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import { fetchWithSession } from '@electron/internal/browser/api/net-fetch';
2+
import { net } from 'electron/main';
23
const { fromPartition, fromPath, Session } = process._linkedBinding('electron_browser_session');
34

45
Session.prototype.fetch = function (input: RequestInfo, init?: RequestInit) {
5-
return fetchWithSession(input, init, this);
6+
return fetchWithSession(input, init, this, net.request);
67
};
78

89
export default {

lib/browser/guest-view-manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ interface GuestInstance {
1414
}
1515

1616
const webViewManager = process._linkedBinding('electron_browser_web_view_manager');
17-
const netBinding = process._linkedBinding('electron_browser_net');
17+
const netBinding = process._linkedBinding('electron_common_net');
1818

1919
const supportedWebViewEvents = Object.keys(webViewEvents);
2020

lib/browser/api/net-client-request.ts renamed to lib/common/api/net-client-request.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import * as url from 'url';
22
import { Readable, Writable } from 'stream';
3-
import { app } from 'electron/main';
4-
import type { ClientRequestConstructorOptions, UploadProgress } from 'electron/main';
3+
import type {
4+
ClientRequestConstructorOptions,
5+
UploadProgress
6+
} from 'electron/common';
57

68
const {
79
isValidHeaderName,
810
isValidHeaderValue,
911
createURLLoader
10-
} = process._linkedBinding('electron_browser_net');
11-
const { Session } = process._linkedBinding('electron_browser_session');
12+
} = process._linkedBinding('electron_common_net');
1213

1314
const kHttpProtocols = new Set(['http:', 'https:']);
1415

@@ -283,14 +284,17 @@ function parseOptions (optionsIn: ClientRequestConstructorOptions | string): Nod
283284
const key = name.toLowerCase();
284285
urlLoaderOptions.headers[key] = { name, value };
285286
}
286-
if (options.session) {
287-
if (!(options.session instanceof Session)) { throw new TypeError('`session` should be an instance of the Session class'); }
288-
urlLoaderOptions.session = options.session;
289-
} else if (options.partition) {
290-
if (typeof options.partition === 'string') {
291-
urlLoaderOptions.partition = options.partition;
292-
} else {
293-
throw new TypeError('`partition` should be a string');
287+
if (process.type !== 'utility') {
288+
const { Session } = process._linkedBinding('electron_browser_session');
289+
if (options.session) {
290+
if (!(options.session instanceof Session)) { throw new TypeError('`session` should be an instance of the Session class'); }
291+
urlLoaderOptions.session = options.session;
292+
} else if (options.partition) {
293+
if (typeof options.partition === 'string') {
294+
urlLoaderOptions.partition = options.partition;
295+
} else {
296+
throw new TypeError('`partition` should be a string');
297+
}
294298
}
295299
}
296300
return urlLoaderOptions;
@@ -312,10 +316,6 @@ export class ClientRequest extends Writable implements Electron.ClientRequest {
312316
constructor (options: ClientRequestConstructorOptions | string, callback?: (message: IncomingMessage) => void) {
313317
super({ autoDestroy: true });
314318

315-
if (!app.isReady()) {
316-
throw new Error('net module can only be used after app is ready');
317-
}
318-
319319
if (callback) {
320320
this.once('response', callback);
321321
}

0 commit comments

Comments
 (0)