UNPKG

sussudio

Version:

An unofficial VS Code Internal API

119 lines (118 loc) 5.96 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 "../../../base/parts/ipc/electron-main/ipcMain.mjs"; import { CancellationToken } from "../../../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 "../../../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 };