From 44f176c74525957300486357d57761477676913e Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Thu, 8 Aug 2019 11:12:10 +0200 Subject: [PATCH] move cli server and download command registrations out of api.impl --- src/vs/workbench/api/node/extHost.api.impl.ts | 33 ++++++++----------- src/vs/workbench/api/node/extHostCLIServer.ts | 6 ++-- .../api/node/extHostDownloadService.ts | 21 +++++------- .../api/node/extHostExtensionService.ts | 20 ++++++++--- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 353f7d39c76..56efd7d8bba 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -20,7 +20,7 @@ import { ExtHostApiCommands } from 'vs/workbench/api/common/extHostApiCommands'; import { ExtHostClipboard } from 'vs/workbench/api/common/extHostClipboard'; import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostComments } from 'vs/workbench/api/common/extHostComments'; -import { ExtHostConfiguration, ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; +import { ExtHostConfigProvider, IExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'; import { ExtHostDialogs } from 'vs/workbench/api/common/extHostDialogs'; import { ExtHostDocumentContentProvider } from 'vs/workbench/api/common/extHostDocumentContentProviders'; @@ -44,20 +44,18 @@ import { ExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; import { ExtHostEditors } from 'vs/workbench/api/common/extHostTextEditors'; import { ExtHostTreeViews } from 'vs/workbench/api/common/extHostTreeViews'; -import { ExtHostDownloadService } from 'vs/workbench/api/node/extHostDownloadService'; import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { ExtHostUrls } from 'vs/workbench/api/common/extHostUrls'; import { ExtHostWebviews } from 'vs/workbench/api/common/extHostWebview'; import { ExtHostWindow } from 'vs/workbench/api/common/extHostWindow'; -import { ExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; +import { IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { throwProposedApiError, checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import * as vscode from 'vscode'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { originalFSPath } from 'vs/base/common/resources'; -import { CLIServer } from 'vs/workbench/api/node/extHostCLIServer'; import { values } from 'vs/base/common/collections'; import { IURITransformer } from 'vs/base/common/uriIpc'; import { ExtHostEditorInsets } from 'vs/workbench/api/common/extHostCodeInsets'; @@ -68,6 +66,7 @@ import { IExtHostDecorations } from 'vs/workbench/api/common/extHostDecorations' import { IExtHostTask } from 'vs/workbench/api/common/extHostTask'; import { IExtHostDebugService } from 'vs/workbench/api/common/extHostDebugService'; import { IExtHostSearch } from 'vs/workbench/api/common/extHostSearch'; +import { ILogService } from 'vs/platform/log/common/log'; export interface IExtensionApiFactory { (extension: IExtensionDescription, registry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode; @@ -88,18 +87,24 @@ export function createApiFactory( accessor: ServicesAccessor, initData: IInitData, rpcProtocol: IMainContext, - extHostWorkspace: ExtHostWorkspace, - extHostConfiguration: ExtHostConfiguration, - extHostLogService: ExtHostLogService, extHostStorage: ExtHostStorage, uriTransformer: IURITransformer | null ): IExtensionApiFactory { // services const extensionService = accessor.get(IExtHostExtensionService); + const extHostWorkspace = accessor.get(IExtHostWorkspace); + const extHostConfiguration = accessor.get(IExtHostConfiguration); + const extHostLogService = accessor.get(ILogService); - // Addressable instances + // register addressable instances rpcProtocol.set(ExtHostContext.ExtHostLogService, extHostLogService); + rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace); + rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration); + rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService); + rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage); + + // create and register addressable instances const extHostDecorations = rpcProtocol.set(ExtHostContext.ExtHostDecorations, accessor.get(IExtHostDecorations)); const extHostWebviews = rpcProtocol.set(ExtHostContext.ExtHostWebviews, new ExtHostWebviews(rpcProtocol, initData.environment)); const extHostUrls = rpcProtocol.set(ExtHostContext.ExtHostUrls, new ExtHostUrls(rpcProtocol)); @@ -110,8 +115,6 @@ export function createApiFactory( const extHostEditors = rpcProtocol.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(rpcProtocol, extHostDocumentsAndEditors)); const extHostCommands = rpcProtocol.set(ExtHostContext.ExtHostCommands, accessor.get(IExtHostCommands)); const extHostTreeViews = rpcProtocol.set(ExtHostContext.ExtHostTreeViews, new ExtHostTreeViews(rpcProtocol.getProxy(MainContext.MainThreadTreeViews), extHostCommands, extHostLogService)); - rpcProtocol.set(ExtHostContext.ExtHostWorkspace, extHostWorkspace); - rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration); const extHostEditorInsets = rpcProtocol.set(ExtHostContext.ExtHostEditorInsets, new ExtHostEditorInsets(rpcProtocol.getProxy(MainContext.MainThreadEditorInsets), extHostEditors, initData.environment)); const extHostDiagnostics = rpcProtocol.set(ExtHostContext.ExtHostDiagnostics, new ExtHostDiagnostics(rpcProtocol)); const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, uriTransformer, extHostDocuments, extHostCommands, extHostDiagnostics, extHostLogService)); @@ -125,17 +128,10 @@ export function createApiFactory( const extHostSearch = rpcProtocol.set(ExtHostContext.ExtHostSearch, accessor.get(IExtHostSearch)); const extHostTask = rpcProtocol.set(ExtHostContext.ExtHostTask, accessor.get(IExtHostTask)); const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol)); - rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService); const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress))); const extHostOutputService = rpcProtocol.set(ExtHostContext.ExtHostOutputService, accessor.get(IExtHostOutputService)); - rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage); const extHostLabelService = rpcProtocol.set(ExtHostContext.ExtHosLabelService, new ExtHostLabelService(rpcProtocol)); - if (initData.remote.isRemote && initData.remote.authority) { - const cliServer = new CLIServer(extHostCommands); - process.env['VSCODE_IPC_HOOK_CLI'] = cliServer.ipcHandlePath; - } - // Check that no named customers are missing const expected: ProxyIdentifier[] = values(ExtHostContext); rpcProtocol.assertRegistered(expected); @@ -154,9 +150,6 @@ export function createApiFactory( // Register API-ish commands ExtHostApiCommands.register(extHostCommands); - // Register Download command - ExtHostDownloadService.register(rpcProtocol.getProxy(MainContext.MainThreadDownloadService), extHostCommands); - return function (extension: IExtensionDescription, extensionRegistry: ExtensionDescriptionRegistry, configProvider: ExtHostConfigProvider): typeof vscode { // Check document selectors for being overly generic. Technically this isn't a problem but diff --git a/src/vs/workbench/api/node/extHostCLIServer.ts b/src/vs/workbench/api/node/extHostCLIServer.ts index 3b06ea4c064..f923a36d324 100644 --- a/src/vs/workbench/api/node/extHostCLIServer.ts +++ b/src/vs/workbench/api/node/extHostCLIServer.ts @@ -6,7 +6,7 @@ import { generateRandomPipeName } from 'vs/base/parts/ipc/node/ipc.net'; import * as http from 'http'; import * as fs from 'fs'; -import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; +import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { IURIToOpen, IOpenSettings } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; import { hasWorkspaceFileExtension } from 'vs/platform/workspaces/common/workspaces'; @@ -38,7 +38,7 @@ export class CLIServer { private _server: http.Server; private _ipcHandlePath: string | undefined; - constructor(private _commands: ExtHostCommands) { + constructor(@IExtHostCommands private _commands: IExtHostCommands) { this._server = http.createServer((req, res) => this.onRequest(req, res)); this.setup().catch(err => { console.error(err); @@ -179,4 +179,4 @@ export class CLIServer { fs.unlinkSync(this._ipcHandlePath); } } -} \ No newline at end of file +} diff --git a/src/vs/workbench/api/node/extHostDownloadService.ts b/src/vs/workbench/api/node/extHostDownloadService.ts index ad43979716c..4bf43510397 100644 --- a/src/vs/workbench/api/node/extHostDownloadService.ts +++ b/src/vs/workbench/api/node/extHostDownloadService.ts @@ -6,25 +6,22 @@ import { join } from 'vs/base/common/path'; import { tmpdir } from 'os'; import { generateUuid } from 'vs/base/common/uuid'; -import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; +import { IExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { Disposable } from 'vs/base/common/lifecycle'; -import { MainThreadDownloadServiceShape } from 'vs/workbench/api/common/extHost.protocol'; +import { MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { URI } from 'vs/base/common/uri'; +import { IExtHostRpcService } from 'vs/workbench/api/common/rpcService'; export class ExtHostDownloadService extends Disposable { - static register( - proxy: MainThreadDownloadServiceShape, - commands: ExtHostCommands - ) { - return new ExtHostDownloadService(proxy, commands); - } - - private constructor( - proxy: MainThreadDownloadServiceShape, - commands: ExtHostCommands + constructor( + @IExtHostRpcService extHostRpc: IExtHostRpcService, + @IExtHostCommands commands: IExtHostCommands ) { super(); + + const proxy = extHostRpc.getProxy(MainContext.MainThreadDownloadService); + commands.registerCommand(false, '_workbench.downloadResource', async (resource: URI): Promise => { const location = URI.file(join(tmpdir(), generateUuid())); await proxy.$download(resource, location); diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 237223240e2..96285174fe6 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -38,6 +38,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; +import { ExtHostDownloadService } from 'vs/workbench/api/node/extHostDownloadService'; +import { CLIServer } from 'vs/workbench/api/node/extHostCLIServer'; interface ITestRunner { /** Old test runner API, as exported from `vscode/lib/testrunner` */ @@ -74,6 +76,7 @@ export class ExtHostExtensionService implements IExtHostExtensionService, ExtHos private readonly _hostUtils: IHostUtils; private readonly _initData: IInitData; private readonly _extHostContext: IMainContext; + private readonly _instaService: IInstantiationService; private readonly _extHostWorkspace: ExtHostWorkspace; private readonly _extHostConfiguration: ExtHostConfiguration; private readonly _extHostLogService: ExtHostLogService; @@ -113,6 +116,7 @@ export class ExtHostExtensionService implements IExtHostExtensionService, ExtHos this._extHostContext = extHostContext; this._initData = initData; + this._instaService = instaService; this._extHostWorkspace = extHostWorkspace; this._extHostConfiguration = extHostConfiguration; this._extHostLogService = extHostLogService; @@ -155,12 +159,9 @@ export class ExtHostExtensionService implements IExtHostExtensionService, ExtHos services.set(IExtHostExtensionService, this); // initialize API first (i.e. do not release barrier until the API is initialized) - this._extensionApiFactory = instaService.invokeFunction(createApiFactory, + this._extensionApiFactory = this._instaService.invokeFunction(createApiFactory, this._initData, this._extHostContext, - this._extHostWorkspace, - this._extHostConfiguration, - this._extHostLogService, this._storage, uriTransformer ); @@ -177,7 +178,18 @@ export class ExtHostExtensionService implements IExtHostExtensionService, ExtHos } private async _initialize(): Promise { + try { + // Register Download command + this._instaService.createInstance(ExtHostDownloadService); + + // Register CLI Server for ipc + if (this._initData.remote.isRemote && this._initData.remote.authority) { + const cliServer = this._instaService.createInstance(CLIServer); + process.env['VSCODE_IPC_HOOK_CLI'] = cliServer.ipcHandlePath; + } + + // Module loading tricks const configProvider = await this._extHostConfiguration.getConfigProvider(); const extensionPaths = await this.getExtensionPathIndex(); NodeModuleRequireInterceptor.INSTANCE.register(new VSCodeNodeModuleFactory(this._extensionApiFactory, extensionPaths, this._registry, configProvider));