Path: blob/main/src/vs/code/electron-utility/sharedProcess/sharedProcessMain.ts
5243 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { hostname, release } from 'os';6import { MessagePortMain, MessageEvent } from '../../../base/parts/sandbox/node/electronTypes.js';7import { toErrorMessage } from '../../../base/common/errorMessage.js';8import { onUnexpectedError, setUnexpectedErrorHandler } from '../../../base/common/errors.js';9import { combinedDisposable, Disposable, toDisposable } from '../../../base/common/lifecycle.js';10import { Schemas } from '../../../base/common/network.js';11import { URI } from '../../../base/common/uri.js';12import { Emitter } from '../../../base/common/event.js';13import { ProxyChannel, StaticRouter } from '../../../base/parts/ipc/common/ipc.js';14import { IClientConnectionFilter, Server as UtilityProcessMessagePortServer, once } from '../../../base/parts/ipc/node/ipc.mp.js';15import { CodeCacheCleaner } from './contrib/codeCacheCleaner.js';16import { LanguagePackCachedDataCleaner } from './contrib/languagePackCachedDataCleaner.js';17import { LocalizationsUpdater } from './contrib/localizationsUpdater.js';18import { LogsDataCleaner } from './contrib/logsDataCleaner.js';19import { UnusedWorkspaceStorageDataCleaner } from './contrib/storageDataCleaner.js';20import { IChecksumService } from '../../../platform/checksum/common/checksumService.js';21import { ChecksumService } from '../../../platform/checksum/node/checksumService.js';22import { IConfigurationService } from '../../../platform/configuration/common/configuration.js';23import { ConfigurationService } from '../../../platform/configuration/common/configurationService.js';24import { IDiagnosticsService } from '../../../platform/diagnostics/common/diagnostics.js';25import { DiagnosticsService } from '../../../platform/diagnostics/node/diagnosticsService.js';26import { IDownloadService } from '../../../platform/download/common/download.js';27import { DownloadService } from '../../../platform/download/common/downloadService.js';28import { INativeEnvironmentService } from '../../../platform/environment/common/environment.js';29import { GlobalExtensionEnablementService } from '../../../platform/extensionManagement/common/extensionEnablementService.js';30import { ExtensionGalleryService } from '../../../platform/extensionManagement/common/extensionGalleryService.js';31import { IAllowedExtensionsService, IExtensionGalleryService, IExtensionManagementService, IExtensionTipsService, IGlobalExtensionEnablementService } from '../../../platform/extensionManagement/common/extensionManagement.js';32import { ExtensionSignatureVerificationService, IExtensionSignatureVerificationService } from '../../../platform/extensionManagement/node/extensionSignatureVerificationService.js';33import { ExtensionManagementChannel, ExtensionTipsChannel } from '../../../platform/extensionManagement/common/extensionManagementIpc.js';34import { ExtensionManagementService, INativeServerExtensionManagementService } from '../../../platform/extensionManagement/node/extensionManagementService.js';35import { IExtensionRecommendationNotificationService } from '../../../platform/extensionRecommendations/common/extensionRecommendations.js';36import { IFileService } from '../../../platform/files/common/files.js';37import { FileService } from '../../../platform/files/common/fileService.js';38import { DiskFileSystemProvider } from '../../../platform/files/node/diskFileSystemProvider.js';39import { SyncDescriptor } from '../../../platform/instantiation/common/descriptors.js';40import { IInstantiationService, ServicesAccessor } from '../../../platform/instantiation/common/instantiation.js';41import { InstantiationService } from '../../../platform/instantiation/common/instantiationService.js';42import { ServiceCollection } from '../../../platform/instantiation/common/serviceCollection.js';43import { ILanguagePackService } from '../../../platform/languagePacks/common/languagePacks.js';44import { NativeLanguagePackService } from '../../../platform/languagePacks/node/languagePacks.js';45import { ConsoleLogger, ILoggerService, ILogService, LoggerGroup } from '../../../platform/log/common/log.js';46import { LoggerChannelClient } from '../../../platform/log/common/logIpc.js';47import product from '../../../platform/product/common/product.js';48import { IProductService } from '../../../platform/product/common/productService.js';49import { IRequestService } from '../../../platform/request/common/request.js';50import { ISharedProcessConfiguration } from '../../../platform/sharedProcess/node/sharedProcess.js';51import { IStorageService } from '../../../platform/storage/common/storage.js';52import { resolveCommonProperties } from '../../../platform/telemetry/common/commonProperties.js';53import { ICustomEndpointTelemetryService, ITelemetryService } from '../../../platform/telemetry/common/telemetry.js';54import { TelemetryAppenderChannel } from '../../../platform/telemetry/common/telemetryIpc.js';55import { TelemetryLogAppender } from '../../../platform/telemetry/common/telemetryLogAppender.js';56import { TelemetryService } from '../../../platform/telemetry/common/telemetryService.js';57import { supportsTelemetry, ITelemetryAppender, NullAppender, NullTelemetryService, getPiiPathsFromEnvironment, isInternalTelemetry, isLoggingOnly } from '../../../platform/telemetry/common/telemetryUtils.js';58import { CustomEndpointTelemetryService } from '../../../platform/telemetry/node/customEndpointTelemetryService.js';59import { ExtensionStorageService, IExtensionStorageService } from '../../../platform/extensionManagement/common/extensionStorage.js';60import { IgnoredExtensionsManagementService, IIgnoredExtensionsManagementService } from '../../../platform/userDataSync/common/ignoredExtensions.js';61import { IUserDataSyncLocalStoreService, IUserDataSyncLogService, IUserDataSyncEnablementService, IUserDataSyncService, IUserDataSyncStoreManagementService, IUserDataSyncStoreService, IUserDataSyncUtilService, registerConfiguration as registerUserDataSyncConfiguration, IUserDataSyncResourceProviderService } from '../../../platform/userDataSync/common/userDataSync.js';62import { IUserDataSyncAccountService, UserDataSyncAccountService } from '../../../platform/userDataSync/common/userDataSyncAccount.js';63import { UserDataSyncLocalStoreService } from '../../../platform/userDataSync/common/userDataSyncLocalStoreService.js';64import { UserDataSyncAccountServiceChannel, UserDataSyncStoreManagementServiceChannel } from '../../../platform/userDataSync/common/userDataSyncIpc.js';65import { UserDataSyncLogService } from '../../../platform/userDataSync/common/userDataSyncLog.js';66import { IUserDataSyncMachinesService, UserDataSyncMachinesService } from '../../../platform/userDataSync/common/userDataSyncMachines.js';67import { UserDataSyncEnablementService } from '../../../platform/userDataSync/common/userDataSyncEnablementService.js';68import { UserDataSyncService } from '../../../platform/userDataSync/common/userDataSyncService.js';69import { UserDataSyncServiceChannel } from '../../../platform/userDataSync/common/userDataSyncServiceIpc.js';70import { UserDataSyncStoreManagementService, UserDataSyncStoreService } from '../../../platform/userDataSync/common/userDataSyncStoreService.js';71import { IUserDataProfileStorageService } from '../../../platform/userDataProfile/common/userDataProfileStorageService.js';72import { SharedProcessUserDataProfileStorageService } from '../../../platform/userDataProfile/node/userDataProfileStorageService.js';73import { ActiveWindowManager } from '../../../platform/windows/node/windowTracker.js';74import { ISignService } from '../../../platform/sign/common/sign.js';75import { SignService } from '../../../platform/sign/node/signService.js';76import { ISharedTunnelsService } from '../../../platform/tunnel/common/tunnel.js';77import { SharedTunnelsService } from '../../../platform/tunnel/node/tunnelService.js';78import { ipcSharedProcessTunnelChannelName, ISharedProcessTunnelService } from '../../../platform/remote/common/sharedProcessTunnelService.js';79import { SharedProcessTunnelService } from '../../../platform/tunnel/node/sharedProcessTunnelService.js';80import { IUriIdentityService } from '../../../platform/uriIdentity/common/uriIdentity.js';81import { UriIdentityService } from '../../../platform/uriIdentity/common/uriIdentityService.js';82import { isLinux } from '../../../base/common/platform.js';83import { FileUserDataProvider } from '../../../platform/userData/common/fileUserDataProvider.js';84import { DiskFileSystemProviderClient, LOCAL_FILE_SYSTEM_CHANNEL_NAME } from '../../../platform/files/common/diskFileSystemProviderClient.js';85import { InspectProfilingService as V8InspectProfilingService } from '../../../platform/profiling/node/profilingService.js';86import { IV8InspectProfilingService } from '../../../platform/profiling/common/profiling.js';87import { IExtensionsScannerService } from '../../../platform/extensionManagement/common/extensionsScannerService.js';88import { ExtensionsScannerService } from '../../../platform/extensionManagement/node/extensionsScannerService.js';89import { IUserDataProfilesService } from '../../../platform/userDataProfile/common/userDataProfile.js';90import { IExtensionsProfileScannerService } from '../../../platform/extensionManagement/common/extensionsProfileScannerService.js';91import { PolicyChannelClient } from '../../../platform/policy/common/policyIpc.js';92import { IPolicyService, NullPolicyService } from '../../../platform/policy/common/policy.js';93import { UserDataProfilesService } from '../../../platform/userDataProfile/common/userDataProfileIpc.js';94import { OneDataSystemAppender } from '../../../platform/telemetry/node/1dsAppender.js';95import { UserDataProfilesCleaner } from './contrib/userDataProfilesCleaner.js';96import { IRemoteTunnelService } from '../../../platform/remoteTunnel/common/remoteTunnel.js';97import { UserDataSyncResourceProviderService } from '../../../platform/userDataSync/common/userDataSyncResourceProvider.js';98import { ExtensionsContributions } from './contrib/extensions.js';99import { localize } from '../../../nls.js';100import { LogService } from '../../../platform/log/common/logService.js';101import { ISharedProcessLifecycleService, SharedProcessLifecycleService } from '../../../platform/lifecycle/node/sharedProcessLifecycleService.js';102import { RemoteTunnelService } from '../../../platform/remoteTunnel/node/remoteTunnelService.js';103import { ExtensionsProfileScannerService } from '../../../platform/extensionManagement/node/extensionsProfileScannerService.js';104import { ExtensionRecommendationNotificationServiceChannelClient } from '../../../platform/extensionRecommendations/common/extensionRecommendationsIpc.js';105import { INativeHostService } from '../../../platform/native/common/native.js';106import { NativeHostService } from '../../../platform/native/common/nativeHostService.js';107import { UserDataAutoSyncService } from '../../../platform/userDataSync/node/userDataAutoSyncService.js';108import { ExtensionTipsService } from '../../../platform/extensionManagement/node/extensionTipsService.js';109import { IMainProcessService, MainProcessService } from '../../../platform/ipc/common/mainProcessService.js';110import { RemoteStorageService } from '../../../platform/storage/common/storageService.js';111import { IRemoteSocketFactoryService, RemoteSocketFactoryService } from '../../../platform/remote/common/remoteSocketFactoryService.js';112import { RemoteConnectionType } from '../../../platform/remote/common/remoteAuthorityResolver.js';113import { nodeSocketFactory } from '../../../platform/remote/node/nodeSocketFactory.js';114import { NativeEnvironmentService } from '../../../platform/environment/node/environmentService.js';115import { SharedProcessRawConnection, SharedProcessLifecycle } from '../../../platform/sharedProcess/common/sharedProcess.js';116import { getOSReleaseInfo } from '../../../base/node/osReleaseInfo.js';117import { getDesktopEnvironment } from '../../../base/common/desktopEnvironmentInfo.js';118import { getCodeDisplayProtocol, getDisplayProtocol } from '../../../base/node/osDisplayProtocolInfo.js';119import { RequestService } from '../../../platform/request/electron-utility/requestService.js';120import { DefaultExtensionsInitializer } from './contrib/defaultExtensionsInitializer.js';121import { AllowedExtensionsService } from '../../../platform/extensionManagement/common/allowedExtensionsService.js';122import { IExtensionGalleryManifestService } from '../../../platform/extensionManagement/common/extensionGalleryManifest.js';123import { ExtensionGalleryManifestIPCService } from '../../../platform/extensionManagement/common/extensionGalleryManifestServiceIpc.js';124import { ISharedWebContentExtractorService } from '../../../platform/webContentExtractor/common/webContentExtractor.js';125import { SharedWebContentExtractorService } from '../../../platform/webContentExtractor/node/sharedWebContentExtractorService.js';126import { McpManagementService } from '../../../platform/mcp/node/mcpManagementService.js';127import { IAllowedMcpServersService, IMcpGalleryService, IMcpManagementService } from '../../../platform/mcp/common/mcpManagement.js';128import { IMcpResourceScannerService, McpResourceScannerService } from '../../../platform/mcp/common/mcpResourceScannerService.js';129import { McpGalleryService } from '../../../platform/mcp/common/mcpGalleryService.js';130import { McpManagementChannel } from '../../../platform/mcp/common/mcpManagementIpc.js';131import { AllowedMcpServersService } from '../../../platform/mcp/common/allowedMcpServersService.js';132import { IMcpGalleryManifestService } from '../../../platform/mcp/common/mcpGalleryManifest.js';133import { McpGalleryManifestIPCService } from '../../../platform/mcp/common/mcpGalleryManifestServiceIpc.js';134import { IMeteredConnectionService } from '../../../platform/meteredConnection/common/meteredConnection.js';135import { MeteredConnectionChannelClient, METERED_CONNECTION_CHANNEL } from '../../../platform/meteredConnection/common/meteredConnectionIpc.js';136137class SharedProcessMain extends Disposable implements IClientConnectionFilter {138139private readonly server = this._register(new UtilityProcessMessagePortServer(this));140141private lifecycleService: SharedProcessLifecycleService | undefined = undefined;142143private readonly onDidWindowConnectRaw = this._register(new Emitter<MessagePortMain>());144145constructor(private configuration: ISharedProcessConfiguration) {146super();147148this.registerListeners();149}150151private registerListeners(): void {152153// Shared process lifecycle154let didExit = false;155const onExit = () => {156if (!didExit) {157didExit = true;158159this.lifecycleService?.fireOnWillShutdown();160this.dispose();161}162};163process.once('exit', onExit);164once(process.parentPort, SharedProcessLifecycle.exit, onExit);165}166167async init(): Promise<void> {168169// Services170const instantiationService = await this.initServices();171172// Config173registerUserDataSyncConfiguration();174175instantiationService.invokeFunction(accessor => {176const logService = accessor.get(ILogService);177const telemetryService = accessor.get(ITelemetryService);178179// Log info180logService.trace('sharedProcess configuration', JSON.stringify(this.configuration));181182// Channels183this.initChannels(accessor);184185// Error handler186this.registerErrorHandler(logService);187188// Report Client OS/DE Info189this.reportClientOSInfo(telemetryService, logService);190});191192// Instantiate Contributions193this._register(combinedDisposable(194instantiationService.createInstance(CodeCacheCleaner, this.configuration.codeCachePath),195instantiationService.createInstance(LanguagePackCachedDataCleaner),196instantiationService.createInstance(UnusedWorkspaceStorageDataCleaner),197instantiationService.createInstance(LogsDataCleaner),198instantiationService.createInstance(LocalizationsUpdater),199instantiationService.createInstance(ExtensionsContributions),200instantiationService.createInstance(UserDataProfilesCleaner),201instantiationService.createInstance(DefaultExtensionsInitializer)202));203}204205private async initServices(): Promise<IInstantiationService> {206const services = new ServiceCollection();207208// Product209const productService = { _serviceBrand: undefined, ...product };210services.set(IProductService, productService);211212// Main Process213const mainRouter = new StaticRouter(ctx => ctx === 'main');214const mainProcessService = new MainProcessService(this.server, mainRouter);215services.set(IMainProcessService, mainProcessService);216217// Policies218const policyService = this.configuration.policiesData ? new PolicyChannelClient(this.configuration.policiesData, mainProcessService.getChannel('policy')) : new NullPolicyService();219services.set(IPolicyService, policyService);220221// Environment222const environmentService = new NativeEnvironmentService(this.configuration.args, productService);223services.set(INativeEnvironmentService, environmentService);224225// Logger226const loggerService = new LoggerChannelClient(undefined, this.configuration.logLevel, environmentService.logsHome, this.configuration.loggers.map(loggerResource => ({ ...loggerResource, resource: URI.revive(loggerResource.resource) })), mainProcessService.getChannel('logger'));227services.set(ILoggerService, loggerService);228229// Log230const sharedLogGroup: LoggerGroup = { id: 'shared', name: localize('sharedLog', "Shared") };231const logger = this._register(loggerService.createLogger('sharedprocess', { name: localize('sharedLog', "Shared"), group: sharedLogGroup }));232const consoleLogger = this._register(new ConsoleLogger(logger.getLevel()));233const logService = this._register(new LogService(logger, [consoleLogger]));234services.set(ILogService, logService);235236// Lifecycle237this.lifecycleService = this._register(new SharedProcessLifecycleService(logService));238services.set(ISharedProcessLifecycleService, this.lifecycleService);239240// Files241const fileService = this._register(new FileService(logService));242services.set(IFileService, fileService);243244const diskFileSystemProvider = this._register(new DiskFileSystemProvider(logService));245fileService.registerProvider(Schemas.file, diskFileSystemProvider);246247// URI Identity248const uriIdentityService = new UriIdentityService(fileService);249services.set(IUriIdentityService, uriIdentityService);250251// User Data Profiles252const userDataProfilesService = this._register(new UserDataProfilesService(this.configuration.profiles.all, URI.revive(this.configuration.profiles.home).with({ scheme: environmentService.userRoamingDataHome.scheme }), mainProcessService.getChannel('userDataProfiles')));253services.set(IUserDataProfilesService, userDataProfilesService);254255const userDataFileSystemProvider = this._register(new FileUserDataProvider(256Schemas.file,257// Specifically for user data, use the disk file system provider258// from the main process to enable atomic read/write operations.259// Since user data can change very frequently across multiple260// processes, we want a single process handling these operations.261this._register(new DiskFileSystemProviderClient(mainProcessService.getChannel(LOCAL_FILE_SYSTEM_CHANNEL_NAME), { pathCaseSensitive: isLinux })),262Schemas.vscodeUserData,263userDataProfilesService,264uriIdentityService,265logService266));267fileService.registerProvider(Schemas.vscodeUserData, userDataFileSystemProvider);268269// Configuration270const configurationService = this._register(new ConfigurationService(userDataProfilesService.defaultProfile.settingsResource, fileService, policyService, logService));271services.set(IConfigurationService, configurationService);272273// Storage (global access only)274const storageService = new RemoteStorageService(undefined, { defaultProfile: userDataProfilesService.defaultProfile, currentProfile: userDataProfilesService.defaultProfile }, mainProcessService, environmentService);275services.set(IStorageService, storageService);276this._register(toDisposable(() => storageService.flush()));277278// Initialize config & storage in parallel279await Promise.all([280configurationService.initialize(),281storageService.initialize()282]);283284// Request285const networkLogger = this._register(loggerService.createLogger(`network-shared`, { name: localize('networkk', "Network"), group: sharedLogGroup }));286const requestService = new RequestService(configurationService, environmentService, this._register(new LogService(networkLogger)));287services.set(IRequestService, requestService);288289// Checksum290services.set(IChecksumService, new SyncDescriptor(ChecksumService, undefined, false /* proxied to other processes */));291292// V8 Inspect profiler293services.set(IV8InspectProfilingService, new SyncDescriptor(V8InspectProfilingService, undefined, false /* proxied to other processes */));294295// Native Host296const nativeHostService = new NativeHostService(-1 /* we are not running in a browser window context */, mainProcessService) as INativeHostService;297services.set(INativeHostService, nativeHostService);298299// Metered Connection300const meteredConnectionService = this._register(new MeteredConnectionChannelClient(mainProcessService.getChannel(METERED_CONNECTION_CHANNEL)));301services.set(IMeteredConnectionService, meteredConnectionService);302303// Download304services.set(IDownloadService, new SyncDescriptor(DownloadService, undefined, true));305306// Extension recommendations307const activeWindowManager = this._register(new ActiveWindowManager(nativeHostService));308const activeWindowRouter = new StaticRouter(ctx => activeWindowManager.getActiveClientId().then(id => ctx === id));309services.set(IExtensionRecommendationNotificationService, new ExtensionRecommendationNotificationServiceChannelClient(this.server.getChannel('extensionRecommendationNotification', activeWindowRouter)));310311// Telemetry312let telemetryService: ITelemetryService;313const appenders: ITelemetryAppender[] = [];314const internalTelemetry = isInternalTelemetry(productService, configurationService);315if (supportsTelemetry(productService, environmentService)) {316const logAppender = new TelemetryLogAppender('', false, loggerService, environmentService, productService);317appenders.push(logAppender);318if (!isLoggingOnly(productService, environmentService) && productService.aiConfig?.ariaKey) {319const collectorAppender = new OneDataSystemAppender(requestService, internalTelemetry, 'monacoworkbench', null, productService.aiConfig.ariaKey);320this._register(toDisposable(() => collectorAppender.flush())); // Ensure the 1DS appender is disposed so that it flushes remaining data321appenders.push(collectorAppender);322}323324telemetryService = new TelemetryService({325appenders,326commonProperties: resolveCommonProperties(release(), hostname(), process.arch, productService.commit, productService.version, this.configuration.machineId, this.configuration.sqmId, this.configuration.devDeviceId, internalTelemetry, productService.date),327sendErrorTelemetry: true,328piiPaths: getPiiPathsFromEnvironment(environmentService),329meteredConnectionService,330}, configurationService, productService);331} else {332telemetryService = NullTelemetryService;333const nullAppender = NullAppender;334appenders.push(nullAppender);335}336337this.server.registerChannel('telemetryAppender', new TelemetryAppenderChannel(appenders));338services.set(ITelemetryService, telemetryService);339340// Custom Endpoint Telemetry341const customEndpointTelemetryService = new CustomEndpointTelemetryService(configurationService, telemetryService, loggerService, environmentService, productService);342services.set(ICustomEndpointTelemetryService, customEndpointTelemetryService);343344// Extension Management345services.set(IExtensionsProfileScannerService, new SyncDescriptor(ExtensionsProfileScannerService, undefined, true));346services.set(IExtensionsScannerService, new SyncDescriptor(ExtensionsScannerService, undefined, true));347services.set(IExtensionSignatureVerificationService, new SyncDescriptor(ExtensionSignatureVerificationService, undefined, true));348services.set(IAllowedExtensionsService, new SyncDescriptor(AllowedExtensionsService, undefined, true));349services.set(INativeServerExtensionManagementService, new SyncDescriptor(ExtensionManagementService, undefined, true));350351// MCP Management352services.set(IAllowedMcpServersService, new SyncDescriptor(AllowedMcpServersService, undefined, true));353services.set(IMcpGalleryManifestService, new McpGalleryManifestIPCService(this.server));354services.set(IMcpGalleryService, new SyncDescriptor(McpGalleryService, undefined, true));355services.set(IMcpResourceScannerService, new SyncDescriptor(McpResourceScannerService, undefined, true));356services.set(IMcpManagementService, new SyncDescriptor(McpManagementService, undefined, true));357358// Extension Gallery359services.set(IExtensionGalleryManifestService, new ExtensionGalleryManifestIPCService(this.server, productService));360services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService, undefined, true));361362// Extension Tips363services.set(IExtensionTipsService, new SyncDescriptor(ExtensionTipsService, undefined, false /* Eagerly scans and computes exe based recommendations */));364365// Localizations366services.set(ILanguagePackService, new SyncDescriptor(NativeLanguagePackService, undefined, false /* proxied to other processes */));367368// Diagnostics369services.set(IDiagnosticsService, new SyncDescriptor(DiagnosticsService, undefined, false /* proxied to other processes */));370371// Settings Sync372services.set(IUserDataSyncAccountService, new SyncDescriptor(UserDataSyncAccountService, undefined, true));373services.set(IUserDataSyncLogService, new SyncDescriptor(UserDataSyncLogService, undefined, true));374services.set(IUserDataSyncUtilService, ProxyChannel.toService(this.server.getChannel('userDataSyncUtil', client => client.ctx !== 'main')));375services.set(IGlobalExtensionEnablementService, new SyncDescriptor(GlobalExtensionEnablementService, undefined, false /* Eagerly resets installed extensions */));376services.set(IIgnoredExtensionsManagementService, new SyncDescriptor(IgnoredExtensionsManagementService, undefined, true));377services.set(IExtensionStorageService, new SyncDescriptor(ExtensionStorageService));378services.set(IUserDataSyncStoreManagementService, new SyncDescriptor(UserDataSyncStoreManagementService, undefined, true));379services.set(IUserDataSyncStoreService, new SyncDescriptor(UserDataSyncStoreService, undefined, true));380services.set(IUserDataSyncMachinesService, new SyncDescriptor(UserDataSyncMachinesService, undefined, true));381services.set(IUserDataSyncLocalStoreService, new SyncDescriptor(UserDataSyncLocalStoreService, undefined, false /* Eagerly cleans up old backups */));382services.set(IUserDataSyncEnablementService, new SyncDescriptor(UserDataSyncEnablementService, undefined, true));383services.set(IUserDataSyncService, new SyncDescriptor(UserDataSyncService, undefined, false /* Initializes the Sync State */));384services.set(IUserDataProfileStorageService, new SyncDescriptor(SharedProcessUserDataProfileStorageService, undefined, true));385services.set(IUserDataSyncResourceProviderService, new SyncDescriptor(UserDataSyncResourceProviderService, undefined, true));386387// Signing388services.set(ISignService, new SyncDescriptor(SignService, undefined, false /* proxied to other processes */));389390// Tunnel391const remoteSocketFactoryService = new RemoteSocketFactoryService();392services.set(IRemoteSocketFactoryService, remoteSocketFactoryService);393remoteSocketFactoryService.register(RemoteConnectionType.WebSocket, nodeSocketFactory);394services.set(ISharedTunnelsService, new SyncDescriptor(SharedTunnelsService));395services.set(ISharedProcessTunnelService, new SyncDescriptor(SharedProcessTunnelService));396397// Remote Tunnel398services.set(IRemoteTunnelService, new SyncDescriptor(RemoteTunnelService));399400// Web Content Extractor401services.set(ISharedWebContentExtractorService, new SyncDescriptor(SharedWebContentExtractorService));402403return new InstantiationService(services);404}405406private initChannels(accessor: ServicesAccessor): void {407408// Extensions Management409const channel = new ExtensionManagementChannel(accessor.get(IExtensionManagementService), () => null);410this.server.registerChannel('extensions', channel);411412// Mcp Management413const mcpManagementChannel = new McpManagementChannel(accessor.get(IMcpManagementService), () => null);414this.server.registerChannel('mcpManagement', mcpManagementChannel);415416// Language Packs417const languagePacksChannel = ProxyChannel.fromService(accessor.get(ILanguagePackService), this._store);418this.server.registerChannel('languagePacks', languagePacksChannel);419420// Diagnostics421const diagnosticsChannel = ProxyChannel.fromService(accessor.get(IDiagnosticsService), this._store);422this.server.registerChannel('diagnostics', diagnosticsChannel);423424// Extension Tips425const extensionTipsChannel = new ExtensionTipsChannel(accessor.get(IExtensionTipsService));426this.server.registerChannel('extensionTipsService', extensionTipsChannel);427428// Checksum429const checksumChannel = ProxyChannel.fromService(accessor.get(IChecksumService), this._store);430this.server.registerChannel('checksum', checksumChannel);431432// Profiling433const profilingChannel = ProxyChannel.fromService(accessor.get(IV8InspectProfilingService), this._store);434this.server.registerChannel('v8InspectProfiling', profilingChannel);435436// Settings Sync437const userDataSyncMachineChannel = ProxyChannel.fromService(accessor.get(IUserDataSyncMachinesService), this._store);438this.server.registerChannel('userDataSyncMachines', userDataSyncMachineChannel);439440// Custom Endpoint Telemetry441const customEndpointTelemetryChannel = ProxyChannel.fromService(accessor.get(ICustomEndpointTelemetryService), this._store);442this.server.registerChannel('customEndpointTelemetry', customEndpointTelemetryChannel);443444const userDataSyncAccountChannel = new UserDataSyncAccountServiceChannel(accessor.get(IUserDataSyncAccountService));445this.server.registerChannel('userDataSyncAccount', userDataSyncAccountChannel);446447const userDataSyncStoreManagementChannel = new UserDataSyncStoreManagementServiceChannel(accessor.get(IUserDataSyncStoreManagementService));448this.server.registerChannel('userDataSyncStoreManagement', userDataSyncStoreManagementChannel);449450const userDataSyncChannel = new UserDataSyncServiceChannel(accessor.get(IUserDataSyncService), accessor.get(IUserDataProfilesService), accessor.get(ILogService));451this.server.registerChannel('userDataSync', userDataSyncChannel);452453const userDataAutoSync = this._register(accessor.get(IInstantiationService).createInstance(UserDataAutoSyncService));454this.server.registerChannel('userDataAutoSync', ProxyChannel.fromService(userDataAutoSync, this._store));455456this.server.registerChannel('IUserDataSyncResourceProviderService', ProxyChannel.fromService(accessor.get(IUserDataSyncResourceProviderService), this._store));457458// Tunnel459const sharedProcessTunnelChannel = ProxyChannel.fromService(accessor.get(ISharedProcessTunnelService), this._store);460this.server.registerChannel(ipcSharedProcessTunnelChannelName, sharedProcessTunnelChannel);461462// Remote Tunnel463const remoteTunnelChannel = ProxyChannel.fromService(accessor.get(IRemoteTunnelService), this._store);464this.server.registerChannel('remoteTunnel', remoteTunnelChannel);465466// Web Content Extractor467const webContentExtractorChannel = ProxyChannel.fromService(accessor.get(ISharedWebContentExtractorService), this._store);468this.server.registerChannel('sharedWebContentExtractor', webContentExtractorChannel);469}470471private registerErrorHandler(logService: ILogService): void {472473// Listen on global error events474process.on('uncaughtException', error => onUnexpectedError(error));475process.on('unhandledRejection', (reason: unknown) => onUnexpectedError(reason));476477// Install handler for unexpected errors478setUnexpectedErrorHandler(error => {479const message = toErrorMessage(error, true);480if (!message) {481return;482}483484logService.error(`[uncaught exception in sharedProcess]: ${message}`);485});486}487488private async reportClientOSInfo(telemetryService: ITelemetryService, logService: ILogService): Promise<void> {489if (isLinux) {490const [releaseInfo, displayProtocol] = await Promise.all([491getOSReleaseInfo(logService.error.bind(logService)),492getDisplayProtocol(logService.error.bind(logService))493]);494const desktopEnvironment = getDesktopEnvironment();495const codeSessionType = getCodeDisplayProtocol(displayProtocol, this.configuration.args['ozone-platform']);496if (releaseInfo) {497type ClientPlatformInfoClassification = {498platformId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'A string identifying the operating system without any version information.' };499platformVersionId: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'A string identifying the operating system version excluding any name information or release code.' };500platformIdLike: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'A string identifying the operating system the current OS derivate is closely related to.' };501desktopEnvironment: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'A string identifying the desktop environment the user is using.' };502displayProtocol: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'A string identifying the users display protocol type.' };503codeDisplayProtocol: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'A string identifying the vscode display protocol type.' };504owner: 'benibenj';505comment: 'Provides insight into the distro and desktop environment information on Linux.';506};507type ClientPlatformInfoEvent = {508platformId: string;509platformVersionId: string | undefined;510platformIdLike: string | undefined;511desktopEnvironment: string | undefined;512displayProtocol: string | undefined;513codeDisplayProtocol: string | undefined;514};515telemetryService.publicLog2<ClientPlatformInfoEvent, ClientPlatformInfoClassification>('clientPlatformInfo', {516platformId: releaseInfo.id,517platformVersionId: releaseInfo.version_id,518platformIdLike: releaseInfo.id_like,519desktopEnvironment: desktopEnvironment,520displayProtocol: displayProtocol,521codeDisplayProtocol: codeSessionType522});523}524}525}526527handledClientConnection(e: MessageEvent): boolean {528529// This filter on message port messages will look for530// attempts of a window to connect raw to the shared531// process to handle these connections separate from532// our IPC based protocol.533534if (e.data !== SharedProcessRawConnection.response) {535return false;536}537538const port = e.ports.at(0);539if (port) {540this.onDidWindowConnectRaw.fire(port);541542return true;543}544545return false;546}547}548549export async function main(configuration: ISharedProcessConfiguration): Promise<void> {550551// create shared process and signal back to main that we are552// ready to accept message ports as client connections553554try {555const sharedProcess = new SharedProcessMain(configuration);556process.parentPort.postMessage(SharedProcessLifecycle.ipcReady);557558// await initialization and signal this back to electron-main559await sharedProcess.init();560561process.parentPort.postMessage(SharedProcessLifecycle.initDone);562} catch (error) {563process.parentPort.postMessage({ error: error.toString() });564}565}566567const handle = setTimeout(() => {568process.parentPort.postMessage({ warning: '[SharedProcess] did not receive configuration within 30s...' });569}, 30000);570571process.parentPort.once('message', (e: Electron.MessageEvent) => {572clearTimeout(handle);573main(e.data as ISharedProcessConfiguration);574});575576577