sussudio
Version:
An unofficial VS Code Internal API
119 lines (118 loc) • 5.96 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* 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 };