Skip to content

Commit 2f5b562

Browse files
authored
Merge pull request microsoft#154822 from microsoft/sandy081/shared-process-request-service
Shared process - Delegate requests to main
2 parents b5ffc79 + 226911c commit 2f5b562

File tree

5 files changed

+64
-10
lines changed

5 files changed

+64
-10
lines changed

src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ import { FollowerLogService, LoggerChannelClient, LogLevelChannelClient } from '
5353
import { INativeHostService } from 'vs/platform/native/electron-sandbox/native';
5454
import product from 'vs/platform/product/common/product';
5555
import { IProductService } from 'vs/platform/product/common/productService';
56-
import { RequestService } from 'vs/platform/request/browser/requestService';
5756
import { IRequestService } from 'vs/platform/request/common/request';
5857
import { ISharedProcessConfiguration } from 'vs/platform/sharedProcess/node/sharedProcess';
5958
import { IStorageService } from 'vs/platform/storage/common/storage';
@@ -106,6 +105,7 @@ import { IPolicyService, NullPolicyService } from 'vs/platform/policy/common/pol
106105
import { UserDataProfilesNativeService } from 'vs/platform/userDataProfile/electron-sandbox/userDataProfile';
107106
import { OneDataSystemWebAppender } from 'vs/platform/telemetry/browser/1dsAppender';
108107
import { DefaultExtensionsProfileInitService } from 'vs/platform/extensionManagement/electron-sandbox/defaultExtensionsProfileInit';
108+
import { SharedProcessRequestService } from 'vs/platform/request/electron-browser/sharedProcessRequestService';
109109

110110
class SharedProcessMain extends Disposable {
111111

@@ -254,7 +254,7 @@ class SharedProcessMain extends Disposable {
254254
services.set(IUriIdentityService, new UriIdentityService(fileService));
255255

256256
// Request
257-
services.set(IRequestService, new SyncDescriptor(RequestService));
257+
services.set(IRequestService, new SharedProcessRequestService(mainProcessService, configurationService, logService));
258258

259259
// Checksum
260260
services.set(IChecksumService, new SyncDescriptor(ChecksumService));

src/vs/code/electron-main/app.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ import { PolicyChannel } from 'vs/platform/policy/common/policyIpc';
104104
import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile';
105105
import { IDefaultExtensionsProfileInitService } from 'vs/platform/extensionManagement/common/extensionManagement';
106106
import { DefaultExtensionsProfileInitHandler } from 'vs/platform/extensionManagement/electron-main/defaultExtensionsProfileInit';
107+
import { RequestChannel } from 'vs/platform/request/common/requestIpc';
108+
import { IRequestService } from 'vs/platform/request/common/request';
107109

108110
/**
109111
* The main VS Code application. There will only ever be one instance,
@@ -728,6 +730,10 @@ export class CodeApplication extends Disposable {
728730
mainProcessElectronServer.registerChannel('userDataProfiles', userDataProfilesService);
729731
sharedProcessClient.then(client => client.registerChannel('userDataProfiles', userDataProfilesService));
730732

733+
// Request
734+
const requestService = new RequestChannel(accessor.get(IRequestService));
735+
sharedProcessClient.then(client => client.registerChannel('request', requestService));
736+
731737
// Update
732738
const updateChannel = new UpdateChannel(accessor.get(IUpdateService));
733739
mainProcessElectronServer.registerChannel('update', updateChannel);

src/vs/platform/request/common/requestIpc.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,32 @@ export class RequestChannel implements IServerChannel {
2626
throw new Error('Invalid listen');
2727
}
2828

29-
call(context: any, command: string, args?: any): Promise<any> {
29+
call(context: any, command: string, args?: any, token: CancellationToken = CancellationToken.None): Promise<any> {
3030
switch (command) {
31-
case 'request': return this.service.request(args[0], CancellationToken.None)
31+
case 'request': return this.service.request(args[0], token)
3232
.then(async ({ res, stream }) => {
3333
const buffer = await streamToBuffer(stream);
3434
return <RequestResponse>[{ statusCode: res.statusCode, headers: res.headers }, buffer];
3535
});
36+
case 'resolveProxy': return this.service.resolveProxy(args[0]);
3637
}
3738
throw new Error('Invalid call');
3839
}
3940
}
4041

41-
export class RequestChannelClient {
42+
export class RequestChannelClient implements IRequestService {
4243

4344
declare readonly _serviceBrand: undefined;
4445

4546
constructor(private readonly channel: IChannel) { }
4647

4748
async request(options: IRequestOptions, token: CancellationToken): Promise<IRequestContext> {
48-
return RequestChannelClient.request(this.channel, options, token);
49+
const [res, buffer] = await this.channel.call<RequestResponse>('request', [options], token);
50+
return { res, stream: bufferToStream(buffer) };
4951
}
5052

51-
static async request(channel: IChannel, options: IRequestOptions, token: CancellationToken): Promise<IRequestContext> {
52-
const [res, buffer] = await channel.call<RequestResponse>('request', [options]);
53-
return { res, stream: bufferToStream(buffer) };
53+
async resolveProxy(url: string): Promise<string | undefined> {
54+
return this.channel.call<string | undefined>('resolveProxy', [url]);
5455
}
5556

5657
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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 { CancellationToken } from 'vs/base/common/cancellation';
7+
import { IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request';
8+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
9+
import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/services';
10+
import { ILogService } from 'vs/platform/log/common/log';
11+
import { RequestService } from 'vs/platform/request/browser/requestService';
12+
import { IRequestService } from 'vs/platform/request/common/request';
13+
import { RequestChannelClient } from 'vs/platform/request/common/requestIpc';
14+
15+
export class SharedProcessRequestService implements IRequestService {
16+
17+
declare readonly _serviceBrand: undefined;
18+
19+
private readonly browserRequestService: IRequestService;
20+
private readonly mainRequestService: IRequestService;
21+
22+
constructor(
23+
mainProcessService: IMainProcessService,
24+
private readonly configurationService: IConfigurationService,
25+
private readonly logService: ILogService,
26+
) {
27+
this.browserRequestService = new RequestService(configurationService, logService);
28+
this.mainRequestService = new RequestChannelClient(mainProcessService.getChannel('request'));
29+
}
30+
31+
request(options: IRequestOptions, token: CancellationToken): Promise<IRequestContext> {
32+
return this.getRequestService().request(options, token);
33+
}
34+
35+
async resolveProxy(url: string): Promise<string | undefined> {
36+
return this.getRequestService().resolveProxy(url);
37+
}
38+
39+
private getRequestService(): IRequestService {
40+
if (this.configurationService.getValue('developer.sharedProcess.useBrowserRequestService') === true) {
41+
this.logService.trace('Using browser request service');
42+
return this.browserRequestService;
43+
}
44+
this.logService.trace('Using main request service');
45+
return this.mainRequestService;
46+
}
47+
}

src/vs/workbench/services/request/browser/requestService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export class BrowserRequestService extends RequestService {
4141
}
4242

4343
private _makeRemoteRequest(connection: IRemoteAgentConnection, options: IRequestOptions, token: CancellationToken): Promise<IRequestContext> {
44-
return connection.withChannel('request', channel => RequestChannelClient.request(channel, options, token));
44+
return connection.withChannel('request', channel => new RequestChannelClient(channel).request(options, token));
4545
}
4646
}
4747

0 commit comments

Comments
 (0)