@opensumi/ide-connection 3.1.2-next-1718701452.0 → 3.1.2-next-1718769324.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,6 +5,62 @@ const events_1 = require("@opensumi/events");
5
5
  const ide_core_common_1 = require("@opensumi/ide-core-common");
6
6
  const types_1 = require("./channel/types");
7
7
  const connection_1 = require("./rpc/connection");
8
+ var MessageDeliveryState;
9
+ (function (MessageDeliveryState) {
10
+ MessageDeliveryState[MessageDeliveryState["ReSend"] = 0] = "ReSend";
11
+ MessageDeliveryState[MessageDeliveryState["Sended"] = 1] = "Sended";
12
+ MessageDeliveryState[MessageDeliveryState["Success"] = 2] = "Success";
13
+ MessageDeliveryState[MessageDeliveryState["Failed"] = 3] = "Failed";
14
+ })(MessageDeliveryState || (MessageDeliveryState = {}));
15
+ class StateTracer {
16
+ constructor() {
17
+ this.map = new Map();
18
+ this.deliveryTimeout = 500;
19
+ this.timerMap = new Map();
20
+ }
21
+ setDeliveryTimeout(timeout) {
22
+ this.deliveryTimeout = timeout;
23
+ }
24
+ set(traceId, state) {
25
+ this.map.set(traceId, state);
26
+ }
27
+ get(traceId) {
28
+ return this.map.get(traceId);
29
+ }
30
+ success(traceId) {
31
+ this.map.set(traceId, MessageDeliveryState.Success);
32
+ const timer = this.timerMap.get(traceId);
33
+ if (timer) {
34
+ clearTimeout(timer);
35
+ }
36
+ }
37
+ dispose() {
38
+ this.timerMap.forEach((timer) => {
39
+ clearTimeout(timer);
40
+ });
41
+ }
42
+ stop(traceId) {
43
+ const timer = this.timerMap.get(traceId);
44
+ if (timer) {
45
+ clearTimeout(timer);
46
+ }
47
+ }
48
+ send(traceId, options) {
49
+ this.set(traceId, MessageDeliveryState.Sended);
50
+ this.guard(traceId, options);
51
+ }
52
+ guard(traceId, options) {
53
+ const timer = this.timerMap.get(traceId);
54
+ if (timer) {
55
+ clearTimeout(timer);
56
+ }
57
+ const newTimer = setTimeout(() => {
58
+ this.set(traceId, MessageDeliveryState.ReSend);
59
+ options.whenRetry();
60
+ }, this.deliveryTimeout);
61
+ this.timerMap.set(traceId, newTimer);
62
+ }
63
+ }
8
64
  class WSChannel {
9
65
  constructor(connection, options) {
10
66
  this.connection = connection;
@@ -13,9 +69,9 @@ class WSChannel {
13
69
  this.onBinaryQueue = this._disposables.add(new ide_core_common_1.EventQueue());
14
70
  this.sendQueue = [];
15
71
  this._isServerReady = false;
72
+ this.stateTracer = new StateTracer();
16
73
  this.LOG_TAG = '[WSChannel]';
17
74
  this.logger = console;
18
- this.stateTracer = this._disposables.add(new ide_core_common_1.StateTracer());
19
75
  const { id, logger, ensureServerReady } = options;
20
76
  this.id = id;
21
77
  this.LOG_TAG = `[WSChannel id:${this.id}]`;
@@ -23,6 +79,9 @@ class WSChannel {
23
79
  this.logger = logger;
24
80
  }
25
81
  this._ensureServerReady = Boolean(ensureServerReady);
82
+ if (options.deliveryTimeout) {
83
+ this.stateTracer.setDeliveryTimeout(options.deliveryTimeout);
84
+ }
26
85
  this._disposables.add(this.emitter.on('binary', (data) => this.onBinaryQueue.push(data)));
27
86
  }
28
87
  inqueue(data) {
@@ -35,6 +94,27 @@ class WSChannel {
35
94
  }
36
95
  this.connection.send(data);
37
96
  }
97
+ /**
98
+ * @param traceId 一个 connection token 用于在全链路中追踪一个消息的生命周期,防止消息未发送或者重复发送
99
+ */
100
+ ensureMessageDeliveried(data, traceId = (0, ide_core_common_1.randomString)(16)) {
101
+ const state = this.stateTracer.get(traceId);
102
+ if (state && state >= MessageDeliveryState.Sended) {
103
+ this.logger.error(`message already send already success or in progress, traceId: ${traceId}, state: ${state}`);
104
+ return;
105
+ }
106
+ data.traceId = traceId;
107
+ this.connection.send(data);
108
+ this.stateTracer.send(traceId, {
109
+ whenRetry: () => {
110
+ if (this._isServerReady) {
111
+ this.stateTracer.stop(traceId);
112
+ return;
113
+ }
114
+ this.ensureMessageDeliveried(data, traceId);
115
+ },
116
+ });
117
+ }
38
118
  onMessage(cb) {
39
119
  return this.emitter.on('message', cb);
40
120
  }
@@ -69,11 +149,10 @@ class WSChannel {
69
149
  dispatch(msg) {
70
150
  switch (msg.kind) {
71
151
  case 'server-ready':
72
- this.stateTracer.fulfill(msg.token);
73
- this.resume();
74
- if (this.timer) {
75
- clearTimeout(this.timer);
152
+ if (msg.traceId) {
153
+ this.stateTracer.success(msg.traceId);
76
154
  }
155
+ this.resume();
77
156
  this.emitter.emit('open', msg.id);
78
157
  break;
79
158
  case 'data':
@@ -98,44 +177,22 @@ class WSChannel {
98
177
  break;
99
178
  }
100
179
  }
101
- /**
102
- * @param connectionToken 一个 connection token 用于在全链路中追踪一个 channel 的生命周期,防止 channel 被重复打开
103
- */
104
- open(path, clientId, connectionToken = (0, ide_core_common_1.randomString)(16)) {
180
+ open(path, clientId) {
105
181
  this.channelPath = path;
106
182
  this.clientId = clientId;
107
183
  this.LOG_TAG = `[WSChannel id=${this.id} path=${path}]`;
108
- if (this.stateTracer.has(connectionToken)) {
109
- this.logger.warn(`channel already opened or in progress, path: ${path}, clientId: ${clientId}, connectionToken: ${connectionToken}`);
110
- return;
111
- }
112
- this.stateTracer.record(connectionToken);
113
- this.connection.send({
184
+ const msg = {
114
185
  kind: 'open',
115
186
  id: this.id,
116
187
  path,
117
188
  clientId,
118
- connectionToken,
119
- });
189
+ };
120
190
  if (this._ensureServerReady) {
121
- this.ensureOpenSend(path, clientId, connectionToken);
191
+ this.ensureMessageDeliveried(msg);
122
192
  }
123
- return connectionToken;
124
- }
125
- /**
126
- * 启动定时器,确保 server-ready 消息在一定时间内到达
127
- */
128
- ensureOpenSend(path, clientId, connectionToken) {
129
- if (this.timer) {
130
- clearTimeout(this.timer);
193
+ else {
194
+ this.connection.send(msg);
131
195
  }
132
- this.timer = setTimeout(() => {
133
- if (this._isServerReady) {
134
- return;
135
- }
136
- this.stateTracer.delete(connectionToken);
137
- this.open(path, clientId, connectionToken);
138
- }, 500);
139
196
  }
140
197
  send(content) {
141
198
  this.inqueue({
@@ -180,9 +237,7 @@ class WSChannel {
180
237
  return conn;
181
238
  }
182
239
  dispose() {
183
- if (this.timer) {
184
- clearTimeout(this.timer);
185
- }
240
+ this.stateTracer.dispose();
186
241
  this.sendQueue = [];
187
242
  this._disposables.dispose();
188
243
  }
@@ -204,11 +259,11 @@ class WSServerChannel extends WSChannel {
204
259
  this.messageQueue = [];
205
260
  this.clientId = options.clientId;
206
261
  }
207
- serverReady(token) {
262
+ serverReady(traceId) {
208
263
  this.connection.send({
209
264
  kind: 'server-ready',
210
265
  id: this.id,
211
- token,
266
+ traceId,
212
267
  });
213
268
  }
214
269
  dispatch(msg) {
@@ -1 +1 @@
1
- {"version":3,"file":"ws-channel.js","sourceRoot":"","sources":["../../src/common/ws-channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws-channel.js","sourceRoot":"","sources":["../../src/common/ws-channel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensumi/ide-connection",
3
- "version": "3.1.2-next-1718701452.0",
3
+ "version": "3.1.2-next-1718769324.0",
4
4
  "files": [
5
5
  "lib",
6
6
  "src"
@@ -19,16 +19,16 @@
19
19
  "dependencies": {
20
20
  "@furyjs/fury": "0.5.9-beta",
21
21
  "@opensumi/events": "^1.0.0",
22
- "@opensumi/ide-core-common": "3.1.2-next-1718701452.0",
22
+ "@opensumi/ide-core-common": "3.1.2-next-1718769324.0",
23
23
  "@opensumi/reconnecting-websocket": "^4.4.0",
24
24
  "@opensumi/vscode-jsonrpc": "^8.0.0-next.2",
25
25
  "path-to-regexp": "^6.2.1",
26
26
  "ws": "^8.16.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@opensumi/ide-components": "3.1.2-next-1718701452.0",
30
- "@opensumi/ide-dev-tool": "3.1.2-next-1718701452.0",
29
+ "@opensumi/ide-components": "3.1.2-next-1718769324.0",
30
+ "@opensumi/ide-dev-tool": "3.1.2-next-1718769324.0",
31
31
  "@opensumi/mock-socket": "^9.3.1"
32
32
  },
33
- "gitHead": "7d2e1724fee5f12299ef140f778b0d653671c694"
33
+ "gitHead": "9aab16e40b516256a69b1924b23a79eb76f2ba99"
34
34
  }
@@ -8,41 +8,42 @@ export type ChannelMessage =
8
8
  | CloseMessage
9
9
  | ErrorMessage;
10
10
 
11
+ export interface BaseMessage {
12
+ kind: string;
13
+ id: string;
14
+ traceId?: string;
15
+ }
16
+
11
17
  /**
12
18
  * `ping` and `pong` are used to detect whether the connection is alive.
13
19
  */
14
- export interface PingMessage {
20
+ export interface PingMessage extends BaseMessage {
15
21
  kind: 'ping';
16
- id: string;
17
22
  }
18
23
 
19
24
  /**
20
25
  * when server receive a `ping` message, it should reply a `pong` message, vice versa.
21
26
  */
22
- export interface PongMessage {
27
+ export interface PongMessage extends BaseMessage {
23
28
  kind: 'pong';
24
- id: string;
25
29
  }
26
30
 
27
31
  /**
28
32
  * `data` message indicate that the channel has received some data.
29
33
  * the `content` field is the data, it should be a string.
30
34
  */
31
- export interface DataMessage {
35
+ export interface DataMessage extends BaseMessage {
32
36
  kind: 'data';
33
- id: string;
34
37
  content: string;
35
38
  }
36
39
 
37
- export interface BinaryMessage {
40
+ export interface BinaryMessage extends BaseMessage {
38
41
  kind: 'binary';
39
- id: string;
40
42
  binary: Uint8Array;
41
43
  }
42
44
 
43
- export interface CloseMessage {
45
+ export interface CloseMessage extends BaseMessage {
44
46
  kind: 'close';
45
- id: string;
46
47
  code: number;
47
48
  reason: string;
48
49
  }
@@ -52,19 +53,18 @@ export interface CloseMessage {
52
53
  * `path` is used to identify which handler should be used to handle the channel.
53
54
  * `clientId` is used to identify the client.
54
55
  */
55
- export interface OpenMessage {
56
+ export interface OpenMessage extends BaseMessage {
56
57
  kind: 'open';
57
- id: string;
58
58
  path: string;
59
59
  clientId: string;
60
- connectionToken: string;
60
+ traceId: string;
61
61
  }
62
62
 
63
63
  export enum ErrorMessageCode {
64
64
  ChannelNotFound = 1,
65
65
  }
66
66
 
67
- export interface ErrorMessage {
67
+ export interface ErrorMessage extends BaseMessage {
68
68
  kind: 'error';
69
69
  id: string;
70
70
  code: ErrorMessageCode;
@@ -75,8 +75,8 @@ export interface ErrorMessage {
75
75
  * when server receive a `open` message, it should reply a `server-ready` message.
76
76
  * this is indicate that the channel is ready to use.
77
77
  */
78
- export interface ServerReadyMessage {
78
+ export interface ServerReadyMessage extends BaseMessage {
79
79
  kind: 'server-ready';
80
80
  id: string;
81
- token: string;
81
+ traceId: string;
82
82
  }
@@ -351,11 +351,6 @@ export class MessageIO extends IMessageIO<PlatformBuffer> {
351
351
  }
352
352
  }
353
353
 
354
- /**
355
- * 请不要使用 RawMessageIO 作为与 Worker-Host 之间的通信协议
356
- * 因为与插件层的通信需要正确的反序列化和序列化 Uri/URI/vscode-uri 这三种 uri
357
- * TODO: 兼容 Uri/URI/vscode-uri 的序列化和反序列化
358
- */
359
354
  export class RawMessageIO implements IMessageIO<RPCMessage> {
360
355
  Request(requestId: number, method: string, headers: IRequestHeaders, args: any[]): RPCRequestMessage {
361
356
  return {
@@ -177,6 +177,8 @@ export class RPCServiceCenter implements IDisposable {
177
177
 
178
178
  dispose(): void {
179
179
  this._disposables.dispose();
180
+ this.proxies.forEach((proxy) => proxy.dispose());
181
+ this.proxies = [];
180
182
  }
181
183
  }
182
184
 
@@ -5,44 +5,50 @@ import { oneOf } from '../fury-extends/one-of';
5
5
 
6
6
  import { ISerializer } from './types';
7
7
 
8
+ function baseFields() {
9
+ return {
10
+ id: Type.string(),
11
+ };
12
+ }
13
+
8
14
  export const PingProtocol = Type.object('ping', {
9
- id: Type.string(),
15
+ ...baseFields(),
10
16
  });
11
17
 
12
18
  export const PongProtocol = Type.object('pong', {
13
- id: Type.string(),
19
+ ...baseFields(),
14
20
  });
15
21
 
16
22
  export const OpenProtocol = Type.object('open', {
23
+ ...baseFields(),
17
24
  clientId: Type.string(),
18
- id: Type.string(),
19
25
  path: Type.string(),
20
- connectionToken: Type.string(),
26
+ traceId: Type.string(),
21
27
  });
22
28
 
23
29
  export const ServerReadyProtocol = Type.object('server-ready', {
24
- id: Type.string(),
25
- token: Type.string(),
30
+ ...baseFields(),
31
+ traceId: Type.string(),
26
32
  });
27
33
 
28
34
  export const ErrorProtocol = Type.object('error', {
29
- id: Type.string(),
35
+ ...baseFields(),
30
36
  code: Type.uint16(),
31
37
  message: Type.string(),
32
38
  });
33
39
 
34
40
  export const DataProtocol = Type.object('data', {
35
- id: Type.string(),
41
+ ...baseFields(),
36
42
  content: Type.string(),
37
43
  });
38
44
 
39
45
  export const BinaryProtocol = Type.object('binary', {
40
- id: Type.string(),
46
+ ...baseFields(),
41
47
  binary: Type.binary(),
42
48
  });
43
49
 
44
50
  export const CloseProtocol = Type.object('close', {
45
- id: Type.string(),
51
+ ...baseFields(),
46
52
  code: Type.uint32(),
47
53
  reason: Type.string(),
48
54
  });
@@ -104,6 +104,11 @@ export interface ChannelHandlerOptions {
104
104
  serializer?: ISerializer<ChannelMessage, any>;
105
105
  }
106
106
 
107
+ enum ServerChannelCloseCode {
108
+ ConnectionClosed = 1,
109
+ NewChannelOpened = 2,
110
+ }
111
+
107
112
  export abstract class BaseCommonChannelHandler {
108
113
  protected channelMap: Map<string, WSServerChannel> = new Map();
109
114
 
@@ -135,25 +140,24 @@ export abstract class BaseCommonChannelHandler {
135
140
 
136
141
  const wrappedConnection = wrapSerializer(connection, this.serializer);
137
142
 
138
- const getOrCreateChannel = (id: string, clientId: string) => {
139
- let channel = this.channelMap.get(id);
140
- if (!channel) {
141
- channel = new WSServerChannel(wrappedConnection, { id, clientId, logger: this.logger });
142
- this.channelMap.set(id, channel);
143
- }
144
- return channel;
145
- };
146
-
147
143
  wrappedConnection.onMessage((msg: ChannelMessage) => {
148
144
  try {
149
145
  switch (msg.kind) {
150
146
  case 'open': {
151
- const { id, path, connectionToken } = msg;
147
+ const { id, path, traceId } = msg;
152
148
  clientId = msg.clientId;
149
+
153
150
  this.logger.log(`open a new connection channel ${clientId} with path ${path}`);
154
- const channel = getOrCreateChannel(id, clientId);
151
+ let channel = this.channelMap.get(id);
152
+ if (channel) {
153
+ channel.close(ServerChannelCloseCode.NewChannelOpened, 'new channel opened for the same channel id');
154
+ channel.dispose();
155
+ }
156
+
157
+ channel = new WSServerChannel(wrappedConnection, { id, clientId, logger: this.logger });
158
+ this.channelMap.set(id, channel);
155
159
  commonChannelPathHandler.openChannel(path, channel, clientId);
156
- channel.serverReady(connectionToken);
160
+ channel.serverReady(traceId);
157
161
  break;
158
162
  }
159
163
  default: {
@@ -186,7 +190,7 @@ export abstract class BaseCommonChannelHandler {
186
190
  Array.from(this.channelMap.values())
187
191
  .filter((channel) => channel.clientId === clientId)
188
192
  .forEach((channel) => {
189
- channel.close(1, 'close');
193
+ channel.close(ServerChannelCloseCode.ConnectionClosed, 'connection closed');
190
194
  channel.dispose();
191
195
  this.channelMap.delete(channel.id);
192
196
  this.logger.log(`Remove connection channel ${channel.id}`);