Skip to content

Commit

Permalink
refactor: update ext protocol registration (#3616)
Browse files Browse the repository at this point in the history
  • Loading branch information
bytemain authored May 6, 2024
1 parent 50291b6 commit 08cfb84
Show file tree
Hide file tree
Showing 17 changed files with 272 additions and 296 deletions.
4 changes: 4 additions & 0 deletions packages/connection/src/common/rpc/multiplexer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,4 +138,8 @@ export class SumiConnectionMultiplexer extends SumiConnection implements IRPCPro

return method.apply(actor, args);
}

getSocket() {
return this.socket;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ export interface AppConfig {
webviewEndpoint?: string;
/**
* Worker 插件的默认启动路径
* 默认值为: https://dev.g.alicdn.com/tao-ide/ide-lite/${version}/worker-host.js
*/
extWorkerHost?: string;
/**
Expand Down
6 changes: 3 additions & 3 deletions packages/extension/__tests__/browser/main.thread.task.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { FileUri, ITaskDefinitionRegistry, TaskDefinitionRegistryImpl } from '@o
import { addEditorProviders } from '@opensumi/ide-dev-tool/src/injector-editor';
import { ExtensionService } from '@opensumi/ide-extension';
import { ExtensionServiceImpl } from '@opensumi/ide-extension/lib/browser/extension.service';
import { MainthreadTasks } from '@opensumi/ide-extension/lib/browser/vscode/api/main.thread.tasks';
import { MainThreadTasks } from '@opensumi/ide-extension/lib/browser/vscode/api/main.thread.tasks';
import { MainThreadWorkspace } from '@opensumi/ide-extension/lib/browser/vscode/api/main.thread.workspace';
import { ExtHostAPIIdentifier, MainThreadAPIIdentifier } from '@opensumi/ide-extension/lib/common/vscode';
import { ShellExecution, Task } from '@opensumi/ide-extension/lib/common/vscode/ext-types';
Expand Down Expand Up @@ -123,7 +123,7 @@ describe('MainThreadTask Test Suite', () => {

const testProvider = new TestTaskProvider();
let extHostTask: ExtHostTasks;
let mainthreadTask: MainthreadTasks;
let mainthreadTask: MainThreadTasks;
let extHostTaskApi: ReturnType<typeof createTaskApiFactory>;
const workspaceService = injector.get<MockWorkspaceService>(IWorkspaceService);

Expand Down Expand Up @@ -157,7 +157,7 @@ describe('MainThreadTask Test Suite', () => {
const extHostTerminal = new ExtHostTerminal(rpcProtocolExt);
const extHostWorkspace = new ExtHostWorkspace(rpcProtocolExt, extHostMessage, extHostDocs);
extHostTask = new ExtHostTasks(rpcProtocolExt, extHostTerminal, extHostWorkspace);
mainthreadTask = injector.get(MainthreadTasks, [rpcProtocolMain]);
mainthreadTask = injector.get(MainThreadTasks, [rpcProtocolMain]);
rpcProtocolExt.set(ExtHostAPIIdentifier.ExtHostWorkspace, extHostWorkspace);
rpcProtocolExt.set(ExtHostAPIIdentifier.ExtHostTasks, extHostTask);
rpcProtocolExt.set(ExtHostAPIIdentifier.ExtHostStorage, new ExtHostStorage(rpcProtocolExt));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { IContextKeyService } from '@opensumi/ide-core-browser';
import { Deferred, Disposable, IEventBus, URI, Uri, sleep } from '@opensumi/ide-core-common';
import { WorkbenchEditorService } from '@opensumi/ide-editor';
import { WorkbenchEditorServiceImpl } from '@opensumi/ide-editor/lib/browser/workbench-editor.service';
import { MainthreadComments } from '@opensumi/ide-extension/lib/browser/vscode/api/main.thread.comments';
import { MainThreadComments } from '@opensumi/ide-extension/lib/browser/vscode/api/main.thread.comments';
import {
ExtHostAPIIdentifier,
IMainThreadComments,
Expand Down Expand Up @@ -77,7 +77,7 @@ describe('extension/__tests__/hosted/api/vscode/ext.host.comments.test.ts', () =
);
mainThreadComments = rpcProtocolExt.set(
MainThreadAPIIdentifier.MainThreadComments,
injector.get(MainthreadComments, [rpcProtocolExt, mainCommands]),
injector.get(MainThreadComments, [rpcProtocolExt, mainCommands]),
);
vscodeComments = createCommentsApiFactory(extension, extComments);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ import { IWorkspaceService } from '@opensumi/ide-workspace';

import { mockExtensionProps } from '../../../../__mocks__/extensions';
import { createMockPairRPCProtocol } from '../../../../__mocks__/initRPCProtocol';
import { MainthreadTasks } from '../../../../src/browser/vscode/api/main.thread.tasks';
import { MainThreadTasks } from '../../../../src/browser/vscode/api/main.thread.tasks';
import { MainThreadTerminal } from '../../../../src/browser/vscode/api/main.thread.terminal';
import { ExtHostAPIIdentifier, MainThreadAPIIdentifier } from '../../../../src/common/vscode';
import { ExtHostTerminal } from '../../../../src/hosted/api/vscode/ext.host.terminal';
Expand All @@ -70,7 +70,7 @@ const { rpcProtocolExt, rpcProtocolMain } = createMockPairRPCProtocol();
let extHostTask: ExtHostTasks;
let extHostTerminal: ExtHostTerminal;
let mainThreadTerminal: MainThreadTerminal;
let mainThreadTask: MainthreadTasks;
let mainThreadTask: MainThreadTasks;

describe('ExtHostTask API', () => {
const injector = createBrowserInjector([]);
Expand Down Expand Up @@ -237,7 +237,7 @@ describe('ExtHostTask API', () => {
rpcProtocolExt.set(ExtHostAPIIdentifier.ExtHostTerminal, extHostTerminal);
extHostTask = new ExtHostTasks(rpcProtocolExt, extHostTerminal, extHostWorkspace);
mainThreadTerminal = injector.get(MainThreadTerminal, [rpcProtocolMain]);
mainThreadTask = injector.get(MainthreadTasks, [rpcProtocolMain]);
mainThreadTask = injector.get(MainThreadTasks, [rpcProtocolMain]);

rpcProtocolExt.set(ExtHostAPIIdentifier.ExtHostTasks, extHostTask);
rpcProtocolMain.set(MainThreadAPIIdentifier.MainThreadTerminal, mainThreadTerminal);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export class ExtCommandManagementImpl extends Disposable implements IExtCommandM
public async executeExtensionCommand(env: ExtensionHostType, command: string, args: any[]): Promise<any> {
const targetProxyCommandExecutor = this.proxyCommandExecutorRegistry.get(env);
if (!targetProxyCommandExecutor) {
throw new Error('Proxy command executor"' + env + '" is not existed');
throw new Error('Proxy command executor "' + env + '" is not existed');
}
return targetProxyCommandExecutor.$executeExtensionCommand(command, ...args);
}
Expand Down
18 changes: 13 additions & 5 deletions packages/extension/src/browser/extension-node.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di';
import { IRPCProtocol, SumiConnectionMultiplexer } from '@opensumi/ide-connection';
import { WSChannelHandler as IWSChannelHandler } from '@opensumi/ide-connection/lib/browser';
import { BaseConnection } from '@opensumi/ide-connection/lib/common/connection';
import {
AppConfig,
Deferred,
Expand All @@ -23,8 +24,9 @@ import { AbstractNodeExtProcessService } from '../common/extension.service';
import { ExtHostAPIIdentifier } from '../common/vscode';
import { knownProtocols } from '../common/vscode/protocols';

import { createSumiApiFactory } from './sumi/main.thread.api.impl';
import { createApiFactory as createVSCodeAPIFactory } from './vscode/api/main.thread.api.impl';
import { createSumiAPIFactory } from './sumi/main.thread.api.impl';
import { initNodeThreadAPIProxy } from './vscode/api/main.thread.api.impl';
import { initSharedAPIProxy } from './vscode/api/main.thread.api.shared-impl';

@Injectable()
export class NodeExtProcessService implements AbstractNodeExtProcessService<IExtensionHostService> {
Expand Down Expand Up @@ -120,9 +122,12 @@ export class NodeExtProcessService implements AbstractNodeExtProcessService<IExt
}

private async createBrowserMainThreadAPI(protocol: IRPCProtocol) {
const apiProxy = initSharedAPIProxy(this.protocol, this.injector);
await apiProxy.setup();
this._apiFactoryDisposables.push(
toDisposable(await createVSCodeAPIFactory(protocol, this.injector, this)),
toDisposable(createSumiApiFactory(protocol, this.injector)),
apiProxy,
toDisposable(initNodeThreadAPIProxy(protocol, this.injector, this)),
toDisposable(createSumiAPIFactory(protocol, this.injector)),
);
}

Expand All @@ -145,11 +150,14 @@ export class NodeExtProcessService implements AbstractNodeExtProcessService<IExt
return this.initExtProtocol();
}

connection: BaseConnection<Uint8Array>;
private async initExtProtocol() {
const channelHandler = this.injector.get(IWSChannelHandler);
const channel = await channelHandler.openChannel(CONNECTION_HANDLE_BETWEEN_EXTENSION_AND_MAIN_THREAD);

const mainThreadProtocol = new SumiConnectionMultiplexer(channel.createConnection(), {
this.connection = channel.createConnection();

const mainThreadProtocol = new SumiConnectionMultiplexer(this.connection, {
timeout: this.appConfig.rpcMessageTimeout,
name: 'node-ext-host',
knownProtocols,
Expand Down
16 changes: 11 additions & 5 deletions packages/extension/src/browser/extension-worker.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di';
import { warning } from '@opensumi/ide-components/lib/utils';
import { BaseConnection } from '@opensumi/ide-connection/lib/common/connection';
import { MessagePortConnection } from '@opensumi/ide-connection/lib/common/connection/drivers/message-port';
import { IRPCProtocol, SumiConnectionMultiplexer } from '@opensumi/ide-connection/lib/common/rpc/multiplexer';
import { AppConfig, Deferred, IExtensionProps, ILogger, URI } from '@opensumi/ide-core-browser';
Expand All @@ -11,8 +12,9 @@ import { AbstractWorkerExtProcessService } from '../common/extension.service';
import { knownProtocols } from '../common/vscode/protocols';

import { getWorkerBootstrapUrl } from './loader';
import { createSumiApiFactory } from './sumi/main.thread.api.impl';
import { createSumiAPIFactory } from './sumi/main.thread.api.impl';
import { initWorkerThreadAPIProxy } from './vscode/api/main.thread.api.impl';
import { initSharedAPIProxy } from './vscode/api/main.thread.api.shared-impl';
import { startInsideIframe } from './workerHostIframe';

const { posix } = path;
Expand Down Expand Up @@ -58,9 +60,12 @@ export class WorkerExtProcessService
if (this.protocol) {
this.ready.resolve();
this.logger.log('[Worker Host] init worker thread api proxy');
const apiProxy = initSharedAPIProxy(this.protocol, this.injector);
await apiProxy.setup();
this.apiFactoryDisposable.push(
toDisposable(await initWorkerThreadAPIProxy(this.protocol, this.injector, this)),
toDisposable(createSumiApiFactory(this.protocol, this.injector)),
apiProxy,
toDisposable(initWorkerThreadAPIProxy(this.protocol, this.injector, this)),
toDisposable(createSumiAPIFactory(this.protocol, this.injector)),
);
this.addDispose(this.apiFactoryDisposable);

Expand Down Expand Up @@ -195,10 +200,11 @@ export class WorkerExtProcessService
});
}

connection: BaseConnection<Uint8Array>;
private createProtocol(port: MessagePort) {
const msgPortConnection = new MessagePortConnection(port);
this.connection = new MessagePortConnection(port);

const protocol = new SumiConnectionMultiplexer(msgPortConnection, {
const protocol = new SumiConnectionMultiplexer(this.connection, {
timeout: this.appConfig.rpcMessageTimeout,
name: 'worker-ext-host',
knownProtocols,
Expand Down
52 changes: 30 additions & 22 deletions packages/extension/src/browser/extension.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Autowired, Injectable } from '@opensumi/di';
import { Autowired, INJECTOR_TOKEN, Injectable, Injector } from '@opensumi/di';
import {
AppConfig,
CommandRegistry,
Expand Down Expand Up @@ -136,6 +136,9 @@ export class ExtensionServiceImpl extends WithEventBus implements ExtensionServi
@Autowired(IExtensionStoragePathServer)
private readonly extensionStoragePathServer: IExtensionStoragePathServer;

@Autowired(INJECTOR_TOKEN)
private readonly injector: Injector;

/**
* 这里的 ready 是区分环境,将 node/worker 区分开使用
*/
Expand Down Expand Up @@ -454,34 +457,39 @@ export class ExtensionServiceImpl extends WithEventBus implements ExtensionServi
}

private async startNodeExtHost(init: boolean) {
if (this.appConfig.noExtHost) {
return;
}

// 激活 node 插件进程
if (!this.appConfig.noExtHost) {
const protocol = await this.nodeExtensionService.activate();
this.extensionCommandManager.registerProxyCommandExecutor(
'node',
protocol.get(MainThreadAPIIdentifier.MainThreadCommands),
);
if (init) {
this.ready.set('node', this.nodeExtensionService.ready);
}
const protocol = await this.nodeExtensionService.activate();
this.extensionCommandManager.registerProxyCommandExecutor(
'node',
protocol.get(MainThreadAPIIdentifier.MainThreadCommands),
);

if (init) {
this.ready.set('node', this.nodeExtensionService.ready);
}
}

private async startWorkerExtHost(init: boolean) {
// 激活 worker 插件进程
if (this.appConfig.extWorkerHost) {
try {
const protocol = await this.workerExtensionService.activate(this.appConfig.ignoreWorkerHostCors);
this.extensionCommandManager.registerProxyCommandExecutor(
'worker',
protocol.get(MainThreadAPIIdentifier.MainThreadCommands),
);
if (init) {
this.ready.set('worker', this.workerExtensionService.ready);
}
} catch (err) {
this.logger.error(`Worker host activate fail, \n ${err.message}`);
if (!this.appConfig.extWorkerHost) {
return;
}

try {
const protocol = await this.workerExtensionService.activate(this.appConfig.ignoreWorkerHostCors);
this.extensionCommandManager.registerProxyCommandExecutor(
'worker',
protocol.get(MainThreadAPIIdentifier.MainThreadCommands),
);
if (init) {
this.ready.set('worker', this.workerExtensionService.ready);
}
} catch (err) {
this.logger.error(`Worker host activate fail, \n ${err.message}`);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { MainThreadTheme } from './main.thread.theme';
import { MainThreadToolbar } from './main.thread.toolbar';
import { MainThreadIDEWindow } from './main.thread.window';

export function createSumiApiFactory(rpcProtocol: IRPCProtocol, injector: Injector) {
export function createSumiAPIFactory(rpcProtocol: IRPCProtocol, injector: Injector) {
const disposer = new Disposable();
const lifeCycle = injector.get(MainThreadLifeCycle, [injector]);

Expand Down
Loading

0 comments on commit 08cfb84

Please sign in to comment.