Skip to content

Commit 40ee3db

Browse files
authored
fix: add rpcMessageTimeout option in appConfig (#2709)
1 parent 594786f commit 40ee3db

File tree

12 files changed

+43
-12
lines changed

12 files changed

+43
-12
lines changed

packages/connection/__test__/node/index.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,6 @@ describe('connection', () => {
266266
});
267267

268268
await expect(timeoutBProtocol.getProxy(testTimeoutIdentifier).$test()).resolves.toBe(void 0);
269-
await expect(timeoutCProtocol.getProxy(testTimeoutIdentifier).$test()).rejects.toBe('RPC Timeout');
269+
await expect(timeoutCProtocol.getProxy(testTimeoutIdentifier).$test()).rejects.toThrow(new Error('RPC Timeout: 1'));
270270
});
271271
});

packages/connection/src/common/rpcProtocol.ts

+8-9
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,6 @@ function canceled(): Error {
203203
error.name = error.message;
204204
return error;
205205
}
206-
// 默认 30s 超时
207-
export const DEFAULT_TIMEOUT_MS = 30000;
208206

209207
export class RPCProtocol implements IRPCProtocol {
210208
private readonly _protocol: IMessagePassingProtocol;
@@ -281,12 +279,13 @@ export class RPCProtocol implements IRPCProtocol {
281279
const msg = MessageIO.serializeRequest(callId, rpcId, methodName, args);
282280

283281
this._protocol.send(msg);
284-
// 设置超时回调
285-
const timeoutHandle = setTimeout(() => {
286-
this._handleTimeout(callId);
287-
}, this._protocol.timeout || DEFAULT_TIMEOUT_MS);
288-
289-
this._timeoutHandles.set(callId, timeoutHandle);
282+
// 设置超时回调, -1 即不配置超时时间
283+
if (this._protocol.timeout && this._protocol.timeout !== -1) {
284+
const timeoutHandle = setTimeout(() => {
285+
this._handleTimeout(callId);
286+
}, this._protocol.timeout);
287+
this._timeoutHandles.set(callId, timeoutHandle);
288+
}
290289

291290
return result.promise;
292291
}
@@ -411,6 +410,6 @@ export class RPCProtocol implements IRPCProtocol {
411410
this._pendingRPCReplies.delete(callId);
412411
this._timeoutHandles.delete(callId);
413412

414-
pendingReply.reject('RPC Timeout');
413+
pendingReply.reject(new Error('RPC Timeout: '+ callId));
415414
}
416415
}

packages/core-browser/src/bootstrap/app.ts

+1
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ export class ClientApp implements IClientApp, IDisposable {
139139
editorBackgroundImage: opts.editorBackgroundImage || editorBackgroundImage,
140140
allowSetDocumentTitleFollowWorkspaceDir,
141141
devtools: opts.devtools ?? false,
142+
rpcMessageTimeout: opts.rpcMessageTimeout || -1,
142143
};
143144

144145
if (this.config.devtools) {

packages/core-browser/src/react-providers/config-provider.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ export interface AppConfig {
247247
* 需要带端口号, 默认是 12345,可使用 COLLABORATION_PORT 字段来指定
248248
*/
249249
collaborationWsPath?: string;
250+
/**
251+
* control rpcProtocol message timeout
252+
* default -1,it means disable
253+
*/
254+
rpcMessageTimeout?: number;
250255
}
251256

252257
export const ConfigContext = React.createContext<AppConfig>({

packages/core-node/src/bootstrap/app.ts

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export class ServerApp implements IServerApp {
7878
blockPatterns: opts.blockPatterns,
7979
extHostIPCSockPath: opts.extHostIPCSockPath,
8080
extHostForkOptions: opts.extHostForkOptions,
81+
rpcMessageTimeout: opts.rpcMessageTimeout || -1,
8182
};
8283
this.bindProcessHandler();
8384
this.initBaseProvider();

packages/core-node/src/types.ts

+5
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ interface Config {
108108
* 配置关闭 keytar 校验能力,默认开启
109109
*/
110110
disableKeytar?: boolean;
111+
/**
112+
* control rpcProtocol message timeout
113+
* default -1,it means disable
114+
*/
115+
rpcMessageTimeout?: number;
111116
}
112117

113118
export interface AppConfig extends Partial<Config> {

packages/extension/src/browser/extension-node.service.ts

+1
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ export class NodeExtProcessService implements AbstractNodeExtProcessService<IExt
193193
const mainThreadProtocol = new RPCProtocol({
194194
onMessage,
195195
send,
196+
timeout: this.appConfig.rpcMessageTimeout,
196197
});
197198

198199
// 重启/重连时直接覆盖前一个连接

packages/extension/src/browser/extension-worker.service.ts

+1
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ export class WorkerExtProcessService
193193
{
194194
onMessage,
195195
send: port.postMessage.bind(port),
196+
timeout: this.appConfig.rpcMessageTimeout,
196197
},
197198
this.logger,
198199
);

packages/extension/src/common/ext.host.proxy.ts

+5
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@ export interface IExtHostProxyOptions {
122122
* 默认 1000ms
123123
*/
124124
retryTime?: number;
125+
/**
126+
* control rpcProtocol message timeout
127+
* default -1,it means disable
128+
*/
129+
rpcMessageTimeout?: number;
125130
}
126131

127132
/**

packages/extension/src/hosted/ext.host.proxy-base.ts

+1
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ export class ExtHostProxy extends Disposable implements IExtHostProxy {
142142
this.protocol = new RPCProtocol({
143143
onMessage,
144144
send,
145+
timeout: this.options.rpcMessageTimeout,
145146
});
146147
this.extServerProxy = this.protocol.getProxy(EXT_SERVER_IDENTIFIER);
147148
const extHostProxyRPCService = new ExtHostProxyRPCService(this.extServerProxy);

packages/extension/src/hosted/ext.process-base.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,14 @@ export interface ExtProcessConfig {
7070
builtinCommands?: IBuiltInCommand[];
7171
customDebugChildProcess?: CustomChildProcessModule;
7272
customVSCodeEngineVersion?: string;
73+
/**
74+
* control rpcProtocol message timeout
75+
* default -1,it means disable
76+
*/
77+
rpcMessageTimeout?: number;
7378
}
7479

75-
async function initRPCProtocol(extInjector): Promise<any> {
80+
async function initRPCProtocol(extInjector: Injector): Promise<any> {
7681
const extCenter = new RPCServiceCenter();
7782
const { getRPCService } = initRPCService<{
7883
onMessage(msg: string): void;
@@ -92,9 +97,12 @@ async function initRPCProtocol(extInjector): Promise<any> {
9297
const onMessage = onMessageEmitter.event;
9398
const send = service.onMessage;
9499

100+
const appConfig = extInjector.get(AppConfig);
101+
95102
const extProtocol = new RPCProtocol({
96103
onMessage,
97104
send,
105+
timeout: appConfig.rpcMessageTimeout,
98106
});
99107

100108
logger = new ExtensionLogger2(extInjector); // new ExtensionLogger(extProtocol);

packages/extension/src/node/extension.host.proxy.manager.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Injectable, Optional, Autowired } from '@opensumi/di';
44
import { getRPCService, RPCProtocol, IRPCProtocol } from '@opensumi/ide-connection';
55
import { createSocketConnection } from '@opensumi/ide-connection/lib/node';
66
import { MaybePromise, Emitter, IDisposable, toDisposable, Disposable } from '@opensumi/ide-core-common';
7-
import { RPCServiceCenter, INodeLogger } from '@opensumi/ide-core-node';
7+
import { RPCServiceCenter, INodeLogger, AppConfig } from '@opensumi/ide-core-node';
88

99
import {
1010
IExtensionHostManager,
@@ -21,6 +21,9 @@ export class ExtensionHostProxyManager implements IExtensionHostManager {
2121
@Autowired(INodeLogger)
2222
private readonly logger: INodeLogger;
2323

24+
@Autowired(AppConfig)
25+
private readonly appconfig: AppConfig;
26+
2427
private callId = 0;
2528

2629
private extHostProxyProtocol: IRPCProtocol;
@@ -96,6 +99,7 @@ export class ExtensionHostProxyManager implements IExtensionHostManager {
9699
this.extHostProxyProtocol = new RPCProtocol({
97100
onMessage,
98101
send,
102+
timeout: this.appconfig.rpcMessageTimeout,
99103
});
100104

101105
this.extHostProxyProtocol.set(EXT_SERVER_IDENTIFIER, {

0 commit comments

Comments
 (0)