Skip to content

Commit 694a366

Browse files
author
Benjamin Pasero
committed
debt - introduce and adopt shared process service
1 parent 6965f5c commit 694a366

14 files changed

Lines changed: 179 additions & 76 deletions

File tree

src/vs/platform/localizations/node/localizationsIpc.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc';
77
import { Event } from 'vs/base/common/event';
88
import { ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations';
9+
import { ISharedProcessService } from 'vs/platform/sharedProcess/node/sharedProcessService';
910

1011
export class LocalizationsChannel implements IServerChannel {
1112

@@ -36,7 +37,11 @@ export class LocalizationsChannelClient implements ILocalizationsService {
3637

3738
_serviceBrand: any;
3839

39-
constructor(private channel: IChannel) { }
40+
private channel: IChannel;
41+
42+
constructor(@ISharedProcessService sharedProcessService: ISharedProcessService) {
43+
this.channel = sharedProcessService.getChannel('localizations');
44+
}
4045

4146
get onDidLanguagesChange(): Event<void> { return this.channel.listen('onDidLanguagesChange'); }
4247

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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 { createDecorator, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation';
7+
import { Client, connect } from 'vs/base/parts/ipc/node/ipc.net';
8+
import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows';
9+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
10+
import { IChannel, getDelayedChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc';
11+
12+
export const ISharedProcessService = createDecorator<ISharedProcessService>('sharedProcessService');
13+
14+
export interface ISharedProcessService {
15+
16+
_serviceBrand: ServiceIdentifier<any>;
17+
18+
getChannel(channelName: string): IChannel;
19+
20+
registerChannel(channelName: string, channel: IServerChannel<string>): void;
21+
}
22+
23+
export class SharedProcessService implements ISharedProcessService {
24+
25+
_serviceBrand: ServiceIdentifier<any>;
26+
27+
private withSharedProcessConnection: Promise<Client<string>>;
28+
29+
constructor(
30+
@IWindowsService windowsService: IWindowsService,
31+
@IWindowService windowService: IWindowService,
32+
@IEnvironmentService environmentService: IEnvironmentService
33+
) {
34+
this.withSharedProcessConnection = windowsService.whenSharedProcessReady()
35+
.then(() => connect(environmentService.sharedIPCHandle, `window:${windowService.getConfiguration().windowId}`));
36+
}
37+
38+
getChannel(channelName: string): IChannel {
39+
return getDelayedChannel(this.withSharedProcessConnection.then(connection => connection.getChannel(channelName)));
40+
}
41+
42+
registerChannel(channelName: string, channel: IServerChannel<string>): void {
43+
this.withSharedProcessConnection.then(connection => connection.registerChannel(channelName, channel));
44+
}
45+
}

src/vs/platform/telemetry/node/commonProperties.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as os from 'os';
88
import * as uuid from 'vs/base/common/uuid';
99
import { readFile } from 'vs/base/node/pfs';
1010

11-
export function resolveCommonProperties(commit: string | undefined, version: string, machineId: string | undefined, installSourcePath: string): Promise<{ [name: string]: string | undefined; }> {
11+
export function resolveCommonProperties(commit: string | undefined, version: string | undefined, machineId: string | undefined, installSourcePath: string): Promise<{ [name: string]: string | undefined; }> {
1212
const result: { [name: string]: string | undefined; } = Object.create(null);
1313
// __GDPR__COMMON__ "common.machineId" : { "endPoint": "MacAddressHash", "classification": "EndUserPseudonymizedInformation", "purpose": "FeatureInsight" }
1414
result['common.machineId'] = machineId;
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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 { ITelemetryService, ITelemetryInfo, ITelemetryData } from 'vs/platform/telemetry/common/telemetry';
7+
import { NullTelemetryService, combinedAppender, LogAppender } from 'vs/platform/telemetry/common/telemetryUtils';
8+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
9+
import { Disposable } from 'vs/base/common/lifecycle';
10+
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
11+
import { IProductService } from 'vs/platform/product/common/product';
12+
import { ISharedProcessService } from 'vs/platform/sharedProcess/node/sharedProcessService';
13+
import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc';
14+
import { ILogService } from 'vs/platform/log/common/log';
15+
import { IStorageService } from 'vs/platform/storage/common/storage';
16+
import { IWindowService } from 'vs/platform/windows/common/windows';
17+
import { resolveWorkbenchCommonProperties } from 'vs/platform/telemetry/node/workbenchCommonProperties';
18+
import { TelemetryService as BaseTelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService';
19+
20+
export class TelemetryService extends Disposable implements ITelemetryService {
21+
22+
_serviceBrand: any;
23+
24+
private impl: ITelemetryService;
25+
26+
constructor(
27+
@IEnvironmentService environmentService: IEnvironmentService,
28+
@IProductService productService: IProductService,
29+
@ISharedProcessService sharedProcessService: ISharedProcessService,
30+
@ILogService logService: ILogService,
31+
@IStorageService storageService: IStorageService,
32+
@IConfigurationService configurationService: IConfigurationService,
33+
@IWindowService windowService: IWindowService
34+
) {
35+
super();
36+
37+
if (!environmentService.isExtensionDevelopment && !environmentService.args['disable-telemetry'] && !!productService.enableTelemetry) {
38+
const channel = sharedProcessService.getChannel('telemetryAppender');
39+
const config: ITelemetryServiceConfig = {
40+
appender: combinedAppender(new TelemetryAppenderClient(channel), new LogAppender(logService)),
41+
commonProperties: resolveWorkbenchCommonProperties(storageService, productService.commit, productService.version, windowService.getConfiguration().machineId, environmentService.installSourcePath),
42+
piiPaths: [environmentService.appRoot, environmentService.extensionsPath]
43+
};
44+
45+
this.impl = this._register(new BaseTelemetryService(config, configurationService));
46+
} else {
47+
this.impl = NullTelemetryService;
48+
}
49+
}
50+
51+
get isOptedIn(): boolean {
52+
return this.impl.isOptedIn;
53+
}
54+
55+
publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise<void> {
56+
return this.impl.publicLog(eventName, data, anonymizeFilePaths);
57+
}
58+
59+
getTelemetryInfo(): Promise<ITelemetryInfo> {
60+
return this.impl.getTelemetryInfo();
61+
}
62+
}

src/vs/platform/telemetry/node/workbenchCommonProperties.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export const currentSessionDateStorageKey = 'telemetry.currentSessionDate';
1111
export const firstSessionDateStorageKey = 'telemetry.firstSessionDate';
1212
export const lastSessionDateStorageKey = 'telemetry.lastSessionDate';
1313

14-
export function resolveWorkbenchCommonProperties(storageService: IStorageService, commit: string, version: string, machineId: string, installSourcePath: string): Promise<{ [name: string]: string | undefined }> {
14+
export function resolveWorkbenchCommonProperties(storageService: IStorageService, commit: string | undefined, version: string | undefined, machineId: string, installSourcePath: string): Promise<{ [name: string]: string | undefined }> {
1515
return resolveCommonProperties(commit, version, machineId, installSourcePath).then(result => {
1616
const instanceId = storageService.get(instanceStorageKey, StorageScope.GLOBAL)!;
1717
const firstSessionDate = storageService.get(firstSessionDateStorageKey, StorageScope.GLOBAL)!;

src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2626
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
2727
import { IExtensionService, IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions';
2828
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
29-
import { TestContextService, TestWindowService } from 'vs/workbench/test/workbenchTestServices';
29+
import { TestContextService, TestWindowService, TestSharedProcessService } from 'vs/workbench/test/workbenchTestServices';
3030
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
3131
import { ILogService, NullLogService } from 'vs/platform/log/common/log';
3232
import { IWindowService } from 'vs/platform/windows/common/windows';
@@ -37,6 +37,7 @@ import { ExtensionManagementServerService } from 'vs/workbench/services/extensio
3737
import { IRemoteAgentService } from 'vs/workbench/services/remote/node/remoteAgentService';
3838
import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl';
3939
import { ExtensionIdentifier, IExtensionContributions, ExtensionType } from 'vs/platform/extensions/common/extensions';
40+
import { ISharedProcessService } from 'vs/platform/sharedProcess/node/sharedProcessService';
4041

4142
suite('ExtensionsActions Test', () => {
4243

@@ -63,7 +64,7 @@ suite('ExtensionsActions Test', () => {
6364
instantiationService.stub(IConfigurationService, new TestConfigurationService());
6465

6566
instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService);
66-
67+
instantiationService.stub(ISharedProcessService, TestSharedProcessService);
6768

6869
instantiationService.stub(IExtensionManagementService, ExtensionManagementService);
6970
instantiationService.stub(IExtensionManagementService, 'onInstallExtension', installEvent.event);

src/vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { Emitter } from 'vs/base/common/event';
2121
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2222
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
2323
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
24-
import { TestTextResourceConfigurationService, TestContextService, TestLifecycleService, TestEnvironmentService, TestStorageService } from 'vs/workbench/test/workbenchTestServices';
24+
import { TestTextResourceConfigurationService, TestContextService, TestLifecycleService, TestEnvironmentService, TestStorageService, TestSharedProcessService } from 'vs/workbench/test/workbenchTestServices';
2525
import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService';
2626
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
2727
import { URI } from 'vs/base/common/uri';
@@ -48,6 +48,7 @@ import { IExperimentService } from 'vs/workbench/contrib/experiments/node/experi
4848
import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test';
4949
import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage';
5050
import { ExtensionType } from 'vs/platform/extensions/common/extensions';
51+
import { ISharedProcessService } from 'vs/platform/sharedProcess/node/sharedProcessService';
5152

5253
const mockExtensionGallery: IGalleryExtension[] = [
5354
aGalleryExtension('MockExtension1', {
@@ -184,6 +185,7 @@ suite('ExtensionsTipsService Test', () => {
184185
uninstallEvent = new Emitter<IExtensionIdentifier>();
185186
didUninstallEvent = new Emitter<DidUninstallExtensionEvent>();
186187
instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService);
188+
instantiationService.stub(ISharedProcessService, TestSharedProcessService);
187189
instantiationService.stub(ILifecycleService, new TestLifecycleService());
188190
testConfigurationService = new TestConfigurationService();
189191
instantiationService.stub(IConfigurationService, testConfigurationService);

src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2626
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
2727
import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions';
2828
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
29-
import { TestContextService, TestWindowService } from 'vs/workbench/test/workbenchTestServices';
29+
import { TestContextService, TestWindowService, TestSharedProcessService } from 'vs/workbench/test/workbenchTestServices';
3030
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
3131
import { ILogService, NullLogService } from 'vs/platform/log/common/log';
3232
import { IWindowService } from 'vs/platform/windows/common/windows';
@@ -39,6 +39,7 @@ import { IRemoteAgentService } from 'vs/workbench/services/remote/node/remoteAge
3939
import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl';
4040
import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService';
4141
import { ExtensionIdentifier, ExtensionType } from 'vs/platform/extensions/common/extensions';
42+
import { ISharedProcessService } from 'vs/platform/sharedProcess/node/sharedProcessService';
4243

4344

4445
suite('ExtensionsListView Tests', () => {
@@ -79,6 +80,7 @@ suite('ExtensionsListView Tests', () => {
7980
instantiationService.stub(IConfigurationService, new TestConfigurationService());
8081

8182
instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService);
83+
instantiationService.stub(ISharedProcessService, TestSharedProcessService);
8284
instantiationService.stub(IExperimentService, ExperimentService);
8385

8486
instantiationService.stub(IExtensionManagementService, ExtensionManagementService);

src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { IPager } from 'vs/base/common/paging';
2626
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2727
import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils';
2828
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
29-
import { TestContextService, TestWindowService } from 'vs/workbench/test/workbenchTestServices';
29+
import { TestContextService, TestWindowService, TestSharedProcessService } from 'vs/workbench/test/workbenchTestServices';
3030
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
3131
import { ILogService, NullLogService } from 'vs/platform/log/common/log';
3232
import { IWindowService } from 'vs/platform/windows/common/windows';
@@ -40,6 +40,7 @@ import { ExtensionType } from 'vs/platform/extensions/common/extensions';
4040
import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService';
4141
import { IRemoteAgentService } from 'vs/workbench/services/remote/node/remoteAgentService';
4242
import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl';
43+
import { ISharedProcessService } from 'vs/platform/sharedProcess/node/sharedProcessService';
4344

4445
suite('ExtensionsWorkbenchServiceTest', () => {
4546

@@ -65,6 +66,7 @@ suite('ExtensionsWorkbenchServiceTest', () => {
6566

6667
instantiationService.stub(IExtensionGalleryService, ExtensionGalleryService);
6768
instantiationService.stub(IURLService, URLService);
69+
instantiationService.stub(ISharedProcessService, TestSharedProcessService);
6870

6971
instantiationService.stub(IWorkspaceContextService, new TestContextService());
7072
instantiationService.stub(IConfigurationService, {

0 commit comments

Comments
 (0)