UNPKG

@sussudio/platform

Version:

Internal APIs for VS Code's service injection the base services.

135 lines (134 loc) 5.37 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? (desc = Object.getOwnPropertyDescriptor(target, key)) : desc, d; if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function') r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if ((d = decorators[i])) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); }; }; import { app, BrowserWindow } from 'electron'; import { validatedIpcMain } from '@sussudio/base/parts/ipc/electron-main/ipcMain.mjs'; import { CancellationToken } from '@sussudio/base/common/cancellation.mjs'; import { createDecorator } from '../../instantiation/common/instantiation.mjs'; import { IWindowsMainService } from '../../windows/electron-main/windows.mjs'; import { isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from '../../workspace/common/workspace.mjs'; import { IWorkspacesManagementMainService } from '../../workspaces/electron-main/workspacesManagementMainService.mjs'; import { assertIsDefined } from '@sussudio/base/common/types.mjs'; import { ILogService } from '../../log/common/log.mjs'; export const ID = 'diagnosticsMainService'; export const IDiagnosticsMainService = createDecorator(ID); let DiagnosticsMainService = class DiagnosticsMainService { windowsMainService; workspacesManagementMainService; logService; constructor(windowsMainService, workspacesManagementMainService, logService) { this.windowsMainService = windowsMainService; this.workspacesManagementMainService = workspacesManagementMainService; this.logService = logService; } async getRemoteDiagnostics(options) { const windows = this.windowsMainService.getWindows(); const diagnostics = await Promise.all( windows.map(async (window) => { const remoteAuthority = window.remoteAuthority; if (!remoteAuthority) { return undefined; } const replyChannel = `vscode:getDiagnosticInfoResponse${window.id}`; const args = { includeProcesses: options.includeProcesses, folders: options.includeWorkspaceMetadata ? await this.getFolderURIs(window) : undefined, }; return new Promise((resolve) => { window.sendWhenReady('vscode:getDiagnosticInfo', CancellationToken.None, { replyChannel, args }); validatedIpcMain.once(replyChannel, (_, data) => { // No data is returned if getting the connection fails. if (!data) { resolve({ hostName: remoteAuthority, errorMessage: `Unable to resolve connection to '${remoteAuthority}'.`, }); } resolve(data); }); setTimeout(() => { resolve({ hostName: remoteAuthority, errorMessage: `Connection to '${remoteAuthority}' could not be established`, }); }, 5000); }); }), ); return diagnostics.filter((x) => !!x); } async getMainDiagnostics() { this.logService.trace('Received request for main process info from other instance.'); const windows = []; for (const window of BrowserWindow.getAllWindows()) { const codeWindow = this.windowsMainService.getWindowById(window.id); if (codeWindow) { windows.push(await this.codeWindowToInfo(codeWindow)); } else { windows.push(this.browserWindowToInfo(window)); } } return { mainPID: process.pid, mainArguments: process.argv.slice(1), windows, screenReader: !!app.accessibilitySupportEnabled, gpuFeatureStatus: app.getGPUFeatureStatus(), }; } async codeWindowToInfo(window) { const folderURIs = await this.getFolderURIs(window); const win = assertIsDefined(window.win); return this.browserWindowToInfo(win, folderURIs, window.remoteAuthority); } browserWindowToInfo(window, folderURIs = [], remoteAuthority) { return { pid: window.webContents.getOSProcessId(), title: window.getTitle(), folderURIs, remoteAuthority, }; } async getFolderURIs(window) { const folderURIs = []; const workspace = window.openedWorkspace; if (isSingleFolderWorkspaceIdentifier(workspace)) { folderURIs.push(workspace.uri); } else if (isWorkspaceIdentifier(workspace)) { const resolvedWorkspace = await this.workspacesManagementMainService.resolveLocalWorkspace(workspace.configPath); // workspace folders can only be shown for local (resolved) workspaces if (resolvedWorkspace) { const rootFolders = resolvedWorkspace.folders; rootFolders.forEach((root) => { folderURIs.push(root.uri); }); } } return folderURIs; } }; DiagnosticsMainService = __decorate( [__param(0, IWindowsMainService), __param(1, IWorkspacesManagementMainService), __param(2, ILogService)], DiagnosticsMainService, ); export { DiagnosticsMainService };