Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/platform/networking/vscode-node/electronFetcher.ts
13401 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { IEnvService } from '../../env/common/envService';
7
import { ElectronFetchErrorChromiumDetails } from '../../log/common/logService';
8
import { ReportFetchEvent } from '../common/fetcherService';
9
import { BaseFetchFetcher } from '../node/baseFetchFetcher';
10
11
export interface ElectronFetchError {
12
readonly chromiumDetails?: ElectronFetchErrorChromiumDetails;
13
}
14
15
export class ElectronFetcher extends BaseFetchFetcher {
16
17
static readonly ID = 'electron-fetch' as const;
18
19
public static create(envService: IEnvService, reportEvent: ReportFetchEvent = () => { }, userAgentLibraryUpdate?: (original: string) => string): ElectronFetcher | null {
20
const net = loadNetModule();
21
if (!net) {
22
return null;
23
}
24
return new ElectronFetcher(net.fetch, envService, reportEvent, userAgentLibraryUpdate);
25
}
26
27
private constructor(
28
fetchImpl: typeof import('electron').net.fetch,
29
envService: IEnvService,
30
reportEvent: ReportFetchEvent,
31
userAgentLibraryUpdate?: (original: string) => string,
32
) {
33
super(fetchImpl, envService, ElectronFetcher.ID, reportEvent, userAgentLibraryUpdate);
34
}
35
36
getUserAgentLibrary(): string {
37
return ElectronFetcher.ID;
38
}
39
40
isInternetDisconnectedError(e: any): boolean {
41
return ['net::ERR_INTERNET_DISCONNECTED', 'net::ERR_NETWORK_IO_SUSPENDED'].includes(e?.message);
42
}
43
isFetcherError(e: any): boolean {
44
return e && e.message && e.message.startsWith('net::');
45
}
46
override isNetworkProcessCrashedError(e: unknown): boolean {
47
return (e as ElectronFetchError)?.chromiumDetails?.network_process_crashed === true;
48
}
49
}
50
51
function loadNetModule(): typeof import('electron').net | undefined {
52
try {
53
return require('electron').net;
54
} catch (err) { }
55
56
return undefined;
57
}
58
59