diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 96790a56924..fa7a7139bd7 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -151,7 +151,7 @@ export interface MainThreadClipboardShape extends IDisposable { export interface MainThreadCommandsShape extends IDisposable { $registerCommand(id: string): void; $unregisterCommand(id: string): void; - $executeCommand(id: string, args: any[] | SerializableObjectWithBuffers, retry: boolean): Promise; + $executeCommand(id: string, args: any[] | SerializableObjectWithBuffers, retry: boolean): Promise; $getCommands(): Promise; } @@ -472,8 +472,7 @@ export interface MainThreadMessageServiceShape extends IDisposable { export interface MainThreadOutputServiceShape extends IDisposable { $register(label: string, log: boolean, file: UriComponents, extensionId: string): Promise; - $update(channelId: string, mode: OutputChannelUpdateMode.Append): Promise; - $update(channelId: string, mode: OutputChannelUpdateMode, till: number): Promise; + $update(channelId: string, mode: OutputChannelUpdateMode, till?: number): Promise; $reveal(channelId: string, preserveFocus: boolean): Promise; $close(channelId: string): Promise; $dispose(channelId: string): Promise; @@ -1231,7 +1230,7 @@ export interface MainThreadTimelineShape extends IDisposable { // -- extension host export interface ExtHostCommandsShape { - $executeContributedCommand(id: string, ...args: any[]): Promise; + $executeContributedCommand(id: string, ...args: any[]): Promise; $getContributedCommandHandlerDescriptions(): Promise<{ [id: string]: string | ICommandHandlerDescription; }>; } @@ -1817,7 +1816,7 @@ export interface ExtHostTerminalServiceShape { $acceptProcessShutdown(id: number, immediate: boolean): void; $acceptProcessRequestInitialCwd(id: number): void; $acceptProcessRequestCwd(id: number): void; - $acceptProcessRequestLatency(id: number): number; + $acceptProcessRequestLatency(id: number): Promise; $provideLinks(id: number, line: string): Promise; $activateLink(id: number, linkId: number): void; $initEnvironmentVariableCollections(collections: [string, ISerializableEnvironmentVariableCollection][]): void; diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts index 22d1da55d5a..89a8d2bee07 100644 --- a/src/vs/workbench/api/common/extHostCommands.ts +++ b/src/vs/workbench/api/common/extHostCommands.ts @@ -196,7 +196,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { }); try { - const result = await this.#proxy.$executeCommand(id, hasBuffers ? new SerializableObjectWithBuffers(toArgs) : toArgs, retry); + const result = await this.#proxy.$executeCommand(id, hasBuffers ? new SerializableObjectWithBuffers(toArgs) : toArgs, retry); return revive(result); } catch (e) { // Rerun the command when it wasn't known, had arguments, and when retry @@ -211,7 +211,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { } } - private async _executeContributedCommand(id: string, args: any[], annotateError: boolean): Promise { + private async _executeContributedCommand(id: string, args: any[], annotateError: boolean): Promise { const command = this._commands.get(id); if (!command) { throw new Error('Unknown command'); @@ -254,7 +254,7 @@ export class ExtHostCommands implements ExtHostCommandsShape { } } - $executeContributedCommand(id: string, ...args: any[]): Promise { + $executeContributedCommand(id: string, ...args: any[]): Promise { this._logService.trace('ExtHostCommands#$executeContributedCommand', id); if (!this._commands.has(id)) { diff --git a/src/vs/workbench/api/common/extHostRpcService.ts b/src/vs/workbench/api/common/extHostRpcService.ts index 6582ef5fb3f..322fa65b374 100644 --- a/src/vs/workbench/api/common/extHostRpcService.ts +++ b/src/vs/workbench/api/common/extHostRpcService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ProxyIdentifier, IRPCProtocol } from 'vs/workbench/services/extensions/common/proxyIdentifier'; +import { ProxyIdentifier, IRPCProtocol, Proxied } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export const IExtHostRpcService = createDecorator('IExtHostRpcService'); @@ -15,7 +15,7 @@ export interface IExtHostRpcService extends IRPCProtocol { export class ExtHostRpcService implements IExtHostRpcService { readonly _serviceBrand: undefined; - readonly getProxy: (identifier: ProxyIdentifier) => T; + readonly getProxy: (identifier: ProxyIdentifier) => Proxied; readonly set: (identifier: ProxyIdentifier, instance: R) => R; readonly assertRegistered: (identifiers: ProxyIdentifier[]) => void; readonly drain: () => Promise; diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 681e3d3ce9a..9122229e560 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -632,8 +632,8 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I this._terminalProcesses.get(id)?.getCwd().then(cwd => this._proxy.$sendProcessProperty(id, { type: ProcessPropertyType.Cwd, value: cwd })); } - public $acceptProcessRequestLatency(id: number): number { - return id; + public $acceptProcessRequestLatency(id: number): Promise { + return Promise.resolve(id); } public registerLinkProvider(provider: vscode.TerminalLinkProvider): vscode.Disposable { diff --git a/src/vs/workbench/services/extensions/common/extensionHostManager.ts b/src/vs/workbench/services/extensions/common/extensionHostManager.ts index ba8497395c2..a1e9ad58224 100644 --- a/src/vs/workbench/services/extensions/common/extensionHostManager.ts +++ b/src/vs/workbench/services/extensions/common/extensionHostManager.ts @@ -11,7 +11,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ExtHostCustomersRegistry } from 'vs/workbench/api/common/extHostCustomers'; import { ExtHostContext, ExtHostExtensionServiceShape, IExtHostContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; -import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; +import { Proxied, ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { IRPCProtocolLogger, RPCProtocol, RequestInitiator, ResponsiveState } from 'vs/workbench/services/extensions/common/rpcProtocol'; import { RemoteAuthorityResolverError, ResolverResult } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; @@ -272,7 +272,7 @@ class ExtensionHostManager extends Disposable implements IExtensionHostManager { const extHostContext: IExtHostContext = { remoteAuthority: this._extensionHost.remoteAuthority, extensionHostKind: this.kind, - getProxy: (identifier: ProxyIdentifier): T => this._rpcProtocol!.getProxy(identifier), + getProxy: (identifier: ProxyIdentifier): Proxied => this._rpcProtocol!.getProxy(identifier), set: (identifier: ProxyIdentifier, instance: R): R => this._rpcProtocol!.set(identifier, instance), assertRegistered: (identifiers: ProxyIdentifier[]): void => this._rpcProtocol!.assertRegistered(identifiers), drain: (): Promise => this._rpcProtocol!.drain(), diff --git a/src/vs/workbench/services/extensions/common/proxyIdentifier.ts b/src/vs/workbench/services/extensions/common/proxyIdentifier.ts index a31632b0573..694af66403d 100644 --- a/src/vs/workbench/services/extensions/common/proxyIdentifier.ts +++ b/src/vs/workbench/services/extensions/common/proxyIdentifier.ts @@ -7,7 +7,7 @@ export interface IRPCProtocol { /** * Returns a proxy to an object addressable/named in the extension host process or in the renderer process. */ - getProxy(identifier: ProxyIdentifier): T; + getProxy(identifier: ProxyIdentifier): Proxied; /** * Register manually created instance. @@ -54,6 +54,11 @@ export function createExtHostContextProxyIdentifier(identifier: string): Prox return result; } +export type Proxied = { [K in keyof T]: T[K] extends (...args: infer A) => infer R + ? (...args: A) => Promise> + : never +}; + export function getStringIdentifierForProxy(nid: number): string { return identifiers[nid].sid; } diff --git a/src/vs/workbench/services/extensions/common/rpcProtocol.ts b/src/vs/workbench/services/extensions/common/rpcProtocol.ts index df9d71a174d..c0887a2f4a7 100644 --- a/src/vs/workbench/services/extensions/common/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/common/rpcProtocol.ts @@ -14,7 +14,7 @@ import { MarshalledId, MarshalledObject } from 'vs/base/common/marshalling'; import { IURITransformer, transformIncomingURIs } from 'vs/base/common/uriIpc'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/common/ipc'; import { LazyPromise } from 'vs/workbench/services/extensions/common/lazyPromise'; -import { getStringIdentifierForProxy, IRPCProtocol, ProxyIdentifier, SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; +import { getStringIdentifierForProxy, IRPCProtocol, Proxied, ProxyIdentifier, SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; export interface JSONStringifyReplacer { (key: string, value: any): any; @@ -236,7 +236,7 @@ export class RPCProtocol extends Disposable implements IRPCProtocol { return transformIncomingURIs(obj, this._uriTransformer); } - public getProxy(identifier: ProxyIdentifier): T { + public getProxy(identifier: ProxyIdentifier): Proxied { const { nid: rpcId, sid } = identifier; if (!this._proxies[rpcId]) { this._proxies[rpcId] = this._createProxy(rpcId, sid); diff --git a/src/vs/workbench/test/browser/api/testRPCProtocol.ts b/src/vs/workbench/test/browser/api/testRPCProtocol.ts index 89ab443712a..15571671139 100644 --- a/src/vs/workbench/test/browser/api/testRPCProtocol.ts +++ b/src/vs/workbench/test/browser/api/testRPCProtocol.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ProxyIdentifier, SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; +import { Proxied, ProxyIdentifier, SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { CharCode } from 'vs/base/common/charCode'; import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { isThenable } from 'vs/base/common/async'; @@ -79,7 +79,7 @@ export class TestRPCProtocol implements IExtHostContext, IExtHostRpcService { }); } - public getProxy(identifier: ProxyIdentifier): T { + public getProxy(identifier: ProxyIdentifier): Proxied { if (!this._proxies[identifier.sid]) { this._proxies[identifier.sid] = this._createProxy(identifier.sid); }