@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.
- package/lib/common/channel/types.d.ts +15 -16
- package/lib/common/channel/types.d.ts.map +1 -1
- package/lib/common/rpc/message-io.d.ts +0 -5
- package/lib/common/rpc/message-io.d.ts.map +1 -1
- package/lib/common/rpc/message-io.js +0 -5
- package/lib/common/rpc/message-io.js.map +1 -1
- package/lib/common/rpc-service/center.d.ts.map +1 -1
- package/lib/common/rpc-service/center.js +2 -0
- package/lib/common/rpc-service/center.js.map +1 -1
- package/lib/common/serializer/fury.d.ts +16 -16
- package/lib/common/serializer/fury.d.ts.map +1 -1
- package/lib/common/serializer/fury.js +13 -34
- package/lib/common/serializer/fury.js.map +1 -1
- package/lib/common/server-handler.d.ts.map +1 -1
- package/lib/common/server-handler.js +15 -12
- package/lib/common/server-handler.js.map +1 -1
- package/lib/common/ws-channel.d.ts +32 -12
- package/lib/common/ws-channel.d.ts.map +1 -1
- package/lib/common/ws-channel.js +93 -38
- package/lib/common/ws-channel.js.map +1 -1
- package/package.json +5 -5
- package/src/common/channel/types.ts +16 -16
- package/src/common/rpc/message-io.ts +0 -5
- package/src/common/rpc-service/center.ts +2 -0
- package/src/common/serializer/fury.ts +16 -10
- package/src/common/server-handler.ts +17 -13
- package/src/common/ws-channel.ts +119 -48
package/lib/common/ws-channel.js
CHANGED
|
@@ -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
|
-
|
|
73
|
-
|
|
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
|
-
|
|
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
|
-
|
|
119
|
-
});
|
|
189
|
+
};
|
|
120
190
|
if (this._ensureServerReady) {
|
|
121
|
-
this.
|
|
191
|
+
this.ensureMessageDeliveried(msg);
|
|
122
192
|
}
|
|
123
|
-
|
|
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
|
-
|
|
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(
|
|
262
|
+
serverReady(traceId) {
|
|
208
263
|
this.connection.send({
|
|
209
264
|
kind: 'server-ready',
|
|
210
265
|
id: this.id,
|
|
211
|
-
|
|
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":";;;AAAA,6CAAgD;AAChD,+
|
|
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-
|
|
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-
|
|
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-
|
|
30
|
-
"@opensumi/ide-dev-tool": "3.1.2-next-
|
|
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": "
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
@@ -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
|
-
|
|
15
|
+
...baseFields(),
|
|
10
16
|
});
|
|
11
17
|
|
|
12
18
|
export const PongProtocol = Type.object('pong', {
|
|
13
|
-
|
|
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
|
-
|
|
26
|
+
traceId: Type.string(),
|
|
21
27
|
});
|
|
22
28
|
|
|
23
29
|
export const ServerReadyProtocol = Type.object('server-ready', {
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
...baseFields(),
|
|
31
|
+
traceId: Type.string(),
|
|
26
32
|
});
|
|
27
33
|
|
|
28
34
|
export const ErrorProtocol = Type.object('error', {
|
|
29
|
-
|
|
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
|
-
|
|
41
|
+
...baseFields(),
|
|
36
42
|
content: Type.string(),
|
|
37
43
|
});
|
|
38
44
|
|
|
39
45
|
export const BinaryProtocol = Type.object('binary', {
|
|
40
|
-
|
|
46
|
+
...baseFields(),
|
|
41
47
|
binary: Type.binary(),
|
|
42
48
|
});
|
|
43
49
|
|
|
44
50
|
export const CloseProtocol = Type.object('close', {
|
|
45
|
-
|
|
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,
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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}`);
|