From ff683d9f4ccbcd28abdf4e0514a85dfaff87a365 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 11 Apr 2019 11:32:43 +0200 Subject: [PATCH] have IHostUtils --- .../api/node/extHostExtensionService.ts | 24 +++++++++++-------- .../extensions/node/extensionHostMain.ts | 14 +++++------ .../extensions/node/extensionHostProcess.ts | 14 ++++++++++- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 2ae6f86bc2b..385270b8937 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -10,7 +10,6 @@ import { Barrier } from 'vs/base/common/async'; import { dispose, toDisposable } from 'vs/base/common/lifecycle'; import { TernarySearchTree } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; -import * as pfs from 'vs/base/node/pfs'; import { ILogService } from 'vs/platform/log/common/log'; import { createApiFactory, IExtensionApiFactory, NodeModuleRequireInterceptor, VSCodeNodeModuleFactory, KeytarNodeModuleFactory, OpenNodeModuleFactory } from 'vs/workbench/api/node/extHost.api.impl'; import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape } from 'vs/workbench/api/common/extHost.protocol'; @@ -30,7 +29,6 @@ import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensio import { IWorkspace } from 'vs/platform/workspace/common/workspace'; import { Schemas } from 'vs/base/common/network'; import { withNullAsUndefined } from 'vs/base/common/types'; -import { realpath } from 'vs/base/node/extpath'; import { VSBuffer } from 'vs/base/common/buffer'; import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { ExtensionMemento } from 'vs/workbench/api/common/extHostMemento'; @@ -40,11 +38,17 @@ interface ITestRunner { run(testsRoot: string, clb: (error: Error, failures?: number) => void): void; } +export interface IHostUtils { + exit(code?: number): void; + exists(path: string): Promise; + realpath(path: string): Promise; +} + export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private static readonly WORKSPACE_CONTAINS_TIMEOUT = 7000; - private readonly _nativeExit: (code?: number) => void; + private readonly _hostUtils: IHostUtils; private readonly _initData: IInitData; private readonly _extHostContext: IMainContext; private readonly _extHostWorkspace: ExtHostWorkspace; @@ -70,7 +74,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { private _started: boolean; constructor( - nativeExit: (code?: number) => void, + hostUtils: IHostUtils, initData: IInitData, extHostContext: IMainContext, extHostWorkspace: ExtHostWorkspace, @@ -80,7 +84,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { schemeTransformer: ISchemeTransformer | null, outputChannelName: string ) { - this._nativeExit = nativeExit; + this._hostUtils = hostUtils; this._initData = initData; this._extHostContext = extHostContext; this._extHostWorkspace = extHostWorkspace; @@ -230,7 +234,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { if (!ext.main) { return undefined; } - return realpath(ext.extensionLocation.fsPath).then(value => tree.set(URI.file(value).fsPath, ext)); + return this._hostUtils.realpath(ext.extensionLocation.fsPath).then(value => tree.set(URI.file(value).fsPath, ext)); }); this._extensionPathIndex = Promise.all(extensions).then(() => tree); } @@ -451,7 +455,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { // find exact path for (const { uri } of workspace.folders) { - if (await pfs.exists(path.join(URI.revive(uri).fsPath, fileName))) { + if (await this._hostUtils.exists(path.join(URI.revive(uri).fsPath, fileName))) { // the file was found return ( this._activateById(extensionId, new ExtensionActivatedByEvent(true, `workspaceContains:${fileName}`)) @@ -561,7 +565,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { return; } - this._nativeExit(code); + this._hostUtils.exit(code); }, 500); } @@ -645,12 +649,12 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { if (!extensionDescription) { return; } - const realpathValue = await realpath(extensionDescription.extensionLocation.fsPath); + const realpathValue = await this._hostUtils.realpath(extensionDescription.extensionLocation.fsPath); trie.delete(URI.file(realpathValue).fsPath); })); await Promise.all(toAdd.map(async (extensionDescription) => { - const realpathValue = await realpath(extensionDescription.extensionLocation.fsPath); + const realpathValue = await this._hostUtils.realpath(extensionDescription.extensionLocation.fsPath); trie.set(URI.file(realpathValue).fsPath, extensionDescription); })); diff --git a/src/vs/workbench/services/extensions/node/extensionHostMain.ts b/src/vs/workbench/services/extensions/node/extensionHostMain.ts index 5e6c8b6ad05..67d2ba56ada 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostMain.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostMain.ts @@ -12,7 +12,7 @@ import { IURITransformer } from 'vs/base/common/uriIpc'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { IInitData, MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; -import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; +import { ExtHostExtensionService, IHostUtils } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostLogService } from 'vs/workbench/api/common/extHostLogService'; import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { RPCProtocol } from 'vs/workbench/services/extensions/common/rpcProtocol'; @@ -40,7 +40,7 @@ export interface ILogServiceFn { export class ExtensionHostMain { private _isTerminating: boolean; - private readonly _exitFn: IExitFn; + private readonly _hostUtils: IHostUtils; private readonly _extensionService: ExtHostExtensionService; private readonly _extHostLogService: ExtHostLogService; private disposables: IDisposable[] = []; @@ -50,15 +50,15 @@ export class ExtensionHostMain { constructor( protocol: IMessagePassingProtocol, initData: IInitData, - exitFn: IExitFn, + hostUtils: IHostUtils, consolePatchFn: IConsolePatchFn, logServiceFn: ILogServiceFn, uriTransformer: IURITransformer | null, schemeTransformer: ISchemeTransformer | null, - outputChannelName: string + outputChannelName: string, ) { this._isTerminating = false; - this._exitFn = exitFn; + this._hostUtils = hostUtils; const rpcProtocol = new RPCProtocol(protocol, null, uriTransformer); // ensure URIs are transformed and revived @@ -79,7 +79,7 @@ export class ExtensionHostMain { const extHostConfiguraiton = new ExtHostConfiguration(rpcProtocol.getProxy(MainContext.MainThreadConfiguration), extHostWorkspace); this._extensionService = new ExtHostExtensionService( - exitFn, + hostUtils, initData, rpcProtocol, extHostWorkspace, @@ -141,7 +141,7 @@ export class ExtensionHostMain { // Give extensions 1 second to wrap up any async dispose, then exit in at most 4 seconds setTimeout(() => { - Promise.race([timeout(4000), extensionsDeactivated]).finally(() => this._exitFn()); + Promise.race([timeout(4000), extensionsDeactivated]).finally(() => this._hostUtils.exit()); }, 1000); } diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts b/src/vs/workbench/services/extensions/node/extensionHostProcess.ts index c6bcf2e3622..5740a7d948a 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostProcess.ts @@ -20,6 +20,9 @@ import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; import { ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions'; import { ISchemeTransformer } from 'vs/workbench/api/common/extHostLanguageFeatures'; import { IURITransformer } from 'vs/base/common/uriIpc'; +import { exists } from 'vs/base/node/pfs'; +import { realpath } from 'vs/base/node/extpath'; +import { IHostUtils } from 'vs/workbench/api/node/extHostExtensionService'; // With Electron 2.x and node.js 8.x the "natives" module // can cause a native crash (see https://github.com/nodejs/node/issues/19891 and @@ -270,10 +273,19 @@ createExtHostProtocol().then(protocol => { const schemeTransformer: ISchemeTransformer | null = null; const outputChannelName = nls.localize('extension host Log', "Extension Host"); + + // host abstraction + const hostUtils = new class NodeHost implements IHostUtils { + exit(code: number) { nativeExit(code); } + exists(path: string) { return exists(path); } + realpath(path: string) { return realpath(path); } + }; + + const extensionHostMain = new ExtensionHostMain( renderer.protocol, initData, - nativeExit, + hostUtils, patchPatchedConsole, createLogService, uriTransformer, -- GitLab