@opensumi/ide-connection 3.8.3-next-1741927421.0 → 3.8.3-next-1741934038.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/buffers/buffers.d.ts +0 -3
- package/lib/common/buffers/buffers.d.ts.map +1 -1
- package/lib/common/buffers/buffers.js +1 -32
- package/lib/common/buffers/buffers.js.map +1 -1
- package/lib/common/connection/drivers/frame-decoder.d.ts +14 -9
- package/lib/common/connection/drivers/frame-decoder.d.ts.map +1 -1
- package/lib/common/connection/drivers/frame-decoder.js +39 -95
- package/lib/common/connection/drivers/frame-decoder.js.map +1 -1
- package/lib/common/connection/drivers/reconnecting-websocket.d.ts +2 -8
- package/lib/common/connection/drivers/reconnecting-websocket.d.ts.map +1 -1
- package/lib/common/connection/drivers/reconnecting-websocket.js +26 -56
- package/lib/common/connection/drivers/reconnecting-websocket.js.map +1 -1
- package/lib/common/connection/drivers/stream.d.ts.map +1 -1
- package/lib/common/connection/drivers/stream.js +4 -11
- package/lib/common/connection/drivers/stream.js.map +1 -1
- package/lib/common/connection/drivers/ws-websocket.d.ts +1 -8
- package/lib/common/connection/drivers/ws-websocket.d.ts.map +1 -1
- package/lib/common/connection/drivers/ws-websocket.js +7 -77
- package/lib/common/connection/drivers/ws-websocket.js.map +1 -1
- package/lib/common/constants.d.ts +0 -4
- package/lib/common/constants.d.ts.map +1 -1
- package/lib/common/constants.js +1 -5
- package/lib/common/constants.js.map +1 -1
- package/lib/common/fury-extends/one-of.d.ts.map +1 -1
- package/lib/common/fury-extends/one-of.js +0 -3
- package/lib/common/fury-extends/one-of.js.map +1 -1
- package/lib/node/common-channel-handler.d.ts.map +1 -1
- package/lib/node/common-channel-handler.js +2 -1
- package/lib/node/common-channel-handler.js.map +1 -1
- package/package.json +6 -6
- package/src/common/buffers/buffers.ts +0 -40
- package/src/common/connection/drivers/frame-decoder.ts +43 -103
- package/src/common/connection/drivers/reconnecting-websocket.ts +26 -66
- package/src/common/connection/drivers/stream.ts +4 -11
- package/src/common/connection/drivers/ws-websocket.ts +8 -93
- package/src/common/constants.ts +0 -5
- package/src/common/fury-extends/one-of.ts +0 -3
- package/src/node/common-channel-handler.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/common/connection/drivers/stream.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../../../src/common/connection/drivers/stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
import { IDisposable } from '@opensumi/ide-core-common';
|
|
2
2
|
import { BaseConnection } from './base';
|
|
3
|
-
import { LengthFieldBasedFrameDecoder } from './frame-decoder';
|
|
4
3
|
import type WebSocket from 'ws';
|
|
5
4
|
export declare class WSWebSocketConnection extends BaseConnection<Uint8Array> {
|
|
6
5
|
socket: WebSocket;
|
|
7
|
-
protected decoder: LengthFieldBasedFrameDecoder;
|
|
8
|
-
private static readonly MAX_QUEUE_SIZE;
|
|
9
|
-
private sendQueue;
|
|
10
|
-
private pendingSize;
|
|
11
|
-
private sending;
|
|
12
6
|
constructor(socket: WebSocket);
|
|
13
|
-
|
|
14
|
-
send(data: Uint8Array): Promise<void>;
|
|
7
|
+
send(data: Uint8Array): void;
|
|
15
8
|
onMessage(cb: (data: Uint8Array) => void): IDisposable;
|
|
16
9
|
onceClose(cb: () => void): IDisposable;
|
|
17
10
|
isOpen(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-websocket.d.ts","sourceRoot":"","sources":["../../../../src/common/connection/drivers/ws-websocket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ws-websocket.d.ts","sourceRoot":"","sources":["../../../../src/common/connection/drivers/ws-websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,KAAK,SAAS,MAAM,IAAI,CAAC;AAEhC,qBAAa,qBAAsB,SAAQ,cAAc,CAAC,UAAU,CAAC;IAChD,MAAM,EAAE,SAAS;gBAAjB,MAAM,EAAE,SAAS;IAGpC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI5B,SAAS,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,WAAW;IAQtD,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,WAAW;IAStC,MAAM;IAIN,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -1,84 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WSWebSocketConnection = void 0;
|
|
4
|
-
const constants_1 = require("../../constants");
|
|
5
4
|
const base_1 = require("./base");
|
|
6
|
-
const frame_decoder_1 = require("./frame-decoder");
|
|
7
5
|
class WSWebSocketConnection extends base_1.BaseConnection {
|
|
8
6
|
constructor(socket) {
|
|
9
7
|
super();
|
|
10
8
|
this.socket = socket;
|
|
11
|
-
this.decoder = new frame_decoder_1.LengthFieldBasedFrameDecoder();
|
|
12
|
-
this.sendQueue = [];
|
|
13
|
-
this.pendingSize = 0;
|
|
14
|
-
this.sending = false;
|
|
15
|
-
this.socket.on('message', (data) => {
|
|
16
|
-
this.decoder.push(data);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
async processSendQueue() {
|
|
20
|
-
if (this.sending) {
|
|
21
|
-
return;
|
|
22
|
-
}
|
|
23
|
-
this.sending = true;
|
|
24
|
-
while (this.sendQueue.length > 0) {
|
|
25
|
-
const { data, resolve, reject } = this.sendQueue[0];
|
|
26
|
-
let handle = null;
|
|
27
|
-
try {
|
|
28
|
-
handle = frame_decoder_1.LengthFieldBasedFrameDecoder.construct(data).dumpAndOwn();
|
|
29
|
-
const packet = handle.get();
|
|
30
|
-
for (let i = 0; i < packet.byteLength; i += constants_1.chunkSize) {
|
|
31
|
-
if (!this.isOpen()) {
|
|
32
|
-
throw new Error('Connection closed while sending');
|
|
33
|
-
}
|
|
34
|
-
await new Promise((resolve, reject) => {
|
|
35
|
-
const chunk = packet.subarray(i, Math.min(i + constants_1.chunkSize, packet.byteLength));
|
|
36
|
-
this.socket.send(chunk, { binary: true }, (error) => {
|
|
37
|
-
if (error) {
|
|
38
|
-
reject(error);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
resolve();
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
resolve();
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
reject(error instanceof Error ? error : new Error(String(error)));
|
|
50
|
-
}
|
|
51
|
-
finally {
|
|
52
|
-
if (handle) {
|
|
53
|
-
try {
|
|
54
|
-
handle.dispose();
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
console.warn('[WSWebSocket] Error disposing handle:', error);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
this.pendingSize -= this.sendQueue[0].data.byteLength;
|
|
61
|
-
this.sendQueue.shift();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
this.sending = false;
|
|
65
9
|
}
|
|
66
10
|
send(data) {
|
|
67
|
-
|
|
68
|
-
// 检查队列大小限制
|
|
69
|
-
if (this.sendQueue.length >= WSWebSocketConnection.MAX_QUEUE_SIZE) {
|
|
70
|
-
reject(new Error('Send queue full'));
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
this.pendingSize += data.byteLength;
|
|
74
|
-
this.sendQueue.push({ data, resolve, reject });
|
|
75
|
-
this.processSendQueue().catch((error) => {
|
|
76
|
-
console.error('[WSWebSocket] Error processing queue:', error);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
11
|
+
this.socket.send(data);
|
|
79
12
|
}
|
|
80
13
|
onMessage(cb) {
|
|
81
|
-
|
|
14
|
+
this.socket.on('message', cb);
|
|
15
|
+
return {
|
|
16
|
+
dispose: () => {
|
|
17
|
+
this.socket.off('message', cb);
|
|
18
|
+
},
|
|
19
|
+
};
|
|
82
20
|
}
|
|
83
21
|
onceClose(cb) {
|
|
84
22
|
this.socket.once('close', cb);
|
|
@@ -93,15 +31,7 @@ class WSWebSocketConnection extends base_1.BaseConnection {
|
|
|
93
31
|
}
|
|
94
32
|
dispose() {
|
|
95
33
|
this.socket.removeAllListeners();
|
|
96
|
-
// 拒绝所有待发送的消息
|
|
97
|
-
while (this.sendQueue.length > 0) {
|
|
98
|
-
const { reject } = this.sendQueue.shift();
|
|
99
|
-
reject(new Error('Connection disposed'));
|
|
100
|
-
}
|
|
101
|
-
this.pendingSize = 0;
|
|
102
|
-
this.sending = false;
|
|
103
34
|
}
|
|
104
35
|
}
|
|
105
36
|
exports.WSWebSocketConnection = WSWebSocketConnection;
|
|
106
|
-
WSWebSocketConnection.MAX_QUEUE_SIZE = 1000; // 限制队列长度
|
|
107
37
|
//# sourceMappingURL=ws-websocket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-websocket.js","sourceRoot":"","sources":["../../../../src/common/connection/drivers/ws-websocket.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"ws-websocket.js","sourceRoot":"","sources":["../../../../src/common/connection/drivers/ws-websocket.ts"],"names":[],"mappings":";;;AAEA,iCAAwC;AAIxC,MAAa,qBAAsB,SAAQ,qBAA0B;IACnE,YAAmB,MAAiB;QAClC,KAAK,EAAE,CAAC;QADS,WAAM,GAAN,MAAM,CAAW;IAEpC,CAAC;IACD,IAAI,CAAC,IAAgB;QACnB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,EAA8B;QACtC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACjC,CAAC;SACF,CAAC;IACJ,CAAC;IACD,SAAS,CAAC,EAAc;QACtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/B,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACrD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;IACnC,CAAC;CACF;AAhCD,sDAgCC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,4BAA4B,CAAC
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,4BAA4B,CAAC"}
|
package/lib/common/constants.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.METHOD_NOT_REGISTERED = void 0;
|
|
4
4
|
exports.METHOD_NOT_REGISTERED = '$$METHOD_NOT_REGISTERED';
|
|
5
|
-
/**
|
|
6
|
-
* 分片大小, 1MB
|
|
7
|
-
*/
|
|
8
|
-
exports.chunkSize = 1 * 1024 * 1024;
|
|
9
5
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,yBAAyB,CAAC
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/common/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG,yBAAyB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"one-of.d.ts","sourceRoot":"","sources":["../../../src/common/fury-extends/one-of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,eAAe,EAAE,MAAM,cAAc,CAAC;AAGlF,OAAO,EAAE,iBAAiB,EAAe,MAAM,UAAU,CAAC;AAE1D,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvD,eAAO,MAAM,KAAK,YACP,CACP,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,CAChB,YACS,iBAAiB;yBAoBC,UAAU;
|
|
1
|
+
{"version":3,"file":"one-of.d.ts","sourceRoot":"","sources":["../../../src/common/fury-extends/one-of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqC,eAAe,EAAE,MAAM,cAAc,CAAC;AAGlF,OAAO,EAAE,iBAAiB,EAAe,MAAM,UAAU,CAAC;AAE1D,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAIvD,eAAO,MAAM,KAAK,YACP,CACP,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,CAChB,YACS,iBAAiB;yBAoBC,UAAU;mBAoChB,QAAQ;CAyC/B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"one-of.js","sourceRoot":"","sources":["../../../src/common/fury-extends/one-of.ts"],"names":[],"mappings":";;;AACA,mDAA+D;AAE/D,qCAA0D;AAI1D,MAAM,GAAG,GAAG,CAAC,CAAC;AAEP,MAAM,KAAK,GAAG,CACnB,OASC,EACD,OAA2B,EAC3B,EAAE;IACF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAA,oBAAW,GAAE,CAAC;IAC1B,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,GAAG,CAAiB,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAa,CAAC;IAEzC,MAAM,WAAW,GAAG,EAA4B,CAAC;IAEjD,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAI,MAAgC,CAAC,OAAO,CAAC,GAAG,CAAC;QAC3D,WAAW,CAAC,CAAC,CAAC,GAAG,IAAA,wBAAkB,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAChB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAE,EAAE;QACxC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;QAE3B,IAAI,CAAM,CAAC;QACX,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,CAAC;gBACJ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,CAAC;gBACJ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,CAAC;gBACJ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,CAAC;gBACJ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,CAAC;gBACJ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,CAAC;gBACJ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,CAAC;gBACJ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,CAAC;gBACJ,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC1B,MAAM;
|
|
1
|
+
{"version":3,"file":"one-of.js","sourceRoot":"","sources":["../../../src/common/fury-extends/one-of.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-channel-handler.d.ts","sourceRoot":"","sources":["../../src/node/common-channel-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAS,MAAM,gBAAgB,CAAC;AACtD,OAAO,SAAS,MAAM,IAAI,CAAC;AAE3B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAE9F,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAErE,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,wBAAyB,YAAW,gBAAgB;IAM1F,SAAS,CAAC,wBAAwB,EAAE,wBAAwB;IAE5D,OAAO,CAAC,OAAO;IAPjB,OAAO,CAAC,QAAQ,CAAmB;IACnC,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC;gBAGpC,SAAS,EAAE,MAAM,EACP,wBAAwB,EAAE,wBAAwB,EAC5D,MAAM,GAAE,OAAiB,EACjB,OAAO,GAAE,2BAAgC;IAOnD,WAAW,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAIpD,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"common-channel-handler.d.ts","sourceRoot":"","sources":["../../src/node/common-channel-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAS,MAAM,gBAAgB,CAAC;AACtD,OAAO,SAAS,MAAM,IAAI,CAAC;AAE3B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAE9F,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC;AAErE,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,UAAU,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,wBAAyB,YAAW,gBAAgB;IAM1F,SAAS,CAAC,wBAAwB,EAAE,wBAAwB;IAE5D,OAAO,CAAC,OAAO;IAPjB,OAAO,CAAC,QAAQ,CAAmB;IACnC,SAAS,CAAC,YAAY,EAAE,aAAa,CAAC;gBAGpC,SAAS,EAAE,MAAM,EACP,wBAAwB,EAAE,wBAAwB,EAC5D,MAAM,GAAE,OAAiB,EACjB,OAAO,GAAE,2BAAgC;IAOnD,WAAW,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAIpD,OAAO,CAAC,YAAY;IAYb,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO;CAgBtF"}
|
|
@@ -27,7 +27,8 @@ class CommonChannelHandler extends server_handler_1.BaseCommonChannelHandler {
|
|
|
27
27
|
...this.options.wsServerOptions,
|
|
28
28
|
});
|
|
29
29
|
this.wsServer.on('connection', (connection) => {
|
|
30
|
-
|
|
30
|
+
const wsConnection = new connection_1.WSWebSocketConnection(connection);
|
|
31
|
+
this.receiveConnection(wsConnection);
|
|
31
32
|
});
|
|
32
33
|
}
|
|
33
34
|
handleUpgrade(pathname, request, socket, head) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-channel-handler.js","sourceRoot":"","sources":["../../src/node/common-channel-handler.ts"],"names":[],"mappings":";;;;AAAA,mDAAsD;AACtD,oDAA2B;AAG3B,qDAA6D;AAC7D,6DAA8F;AAU9F;;GAEG;AACH,MAAa,oBAAqB,SAAQ,yCAAwB;IAIhE,YACE,SAAiB,EACP,wBAAkD,EAC5D,SAAkB,OAAO,EACjB,UAAuC,EAAE;QAEjD,KAAK,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,CAAC,CAAC;QAJtD,6BAAwB,GAAxB,wBAAwB,CAA0B;QAEpD,YAAO,GAAP,OAAO,CAAkC;QAGjD,IAAI,CAAC,YAAY,GAAG,IAAA,sBAAK,EAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,WAAW,CAAC,UAAiC;QAC3C,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAS,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,IAAI;YACd,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,UAAqB,EAAE,EAAE;YACvD,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"common-channel-handler.js","sourceRoot":"","sources":["../../src/node/common-channel-handler.ts"],"names":[],"mappings":";;;;AAAA,mDAAsD;AACtD,oDAA2B;AAG3B,qDAA6D;AAC7D,6DAA8F;AAU9F;;GAEG;AACH,MAAa,oBAAqB,SAAQ,yCAAwB;IAIhE,YACE,SAAiB,EACP,wBAAkD,EAC5D,SAAkB,OAAO,EACjB,UAAuC,EAAE;QAEjD,KAAK,CAAC,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,CAAC,CAAC;QAJtD,6BAAwB,GAAxB,wBAAwB,CAA0B;QAEpD,YAAO,GAAP,OAAO,CAAkC;QAGjD,IAAI,CAAC,YAAY,GAAG,IAAA,sBAAK,EAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,WAAW,CAAC,UAAiC;QAC3C,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAS,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,IAAI;YACd,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe;SAChC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,UAAqB,EAAE,EAAE;YACvD,MAAM,YAAY,GAAG,IAAI,kCAAqB,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,aAAa,CAAC,QAAgB,EAAE,OAAY,EAAE,MAAW,EAAE,IAAS;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,EAAE;gBAC/D,UAAkC,CAAC,UAAU,GAAG;oBAC/C,QAAQ;iBACT,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AA/CD,oDA+CC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opensumi/ide-connection",
|
|
3
|
-
"version": "3.8.3-next-
|
|
3
|
+
"version": "3.8.3-next-1741934038.0",
|
|
4
4
|
"files": [
|
|
5
5
|
"lib",
|
|
6
6
|
"src"
|
|
@@ -19,17 +19,17 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@furyjs/fury": "0.5.9-beta",
|
|
21
21
|
"@opensumi/events": "^1.0.0",
|
|
22
|
-
"@opensumi/ide-core-common": "3.8.3-next-
|
|
23
|
-
"@opensumi/ide-utils": "3.8.3-next-
|
|
22
|
+
"@opensumi/ide-core-common": "3.8.3-next-1741934038.0",
|
|
23
|
+
"@opensumi/ide-utils": "3.8.3-next-1741934038.0",
|
|
24
24
|
"@opensumi/reconnecting-websocket": "^4.4.0",
|
|
25
25
|
"@opensumi/vscode-jsonrpc": "^8.0.0-next.2",
|
|
26
26
|
"path-to-regexp": "^6.2.1",
|
|
27
27
|
"ws": "^8.16.0"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@opensumi/ide-components": "3.8.3-next-
|
|
31
|
-
"@opensumi/ide-dev-tool": "3.8.3-next-
|
|
30
|
+
"@opensumi/ide-components": "3.8.3-next-1741934038.0",
|
|
31
|
+
"@opensumi/ide-dev-tool": "3.8.3-next-1741934038.0",
|
|
32
32
|
"@opensumi/mock-socket": "^9.3.1"
|
|
33
33
|
},
|
|
34
|
-
"gitHead": "
|
|
34
|
+
"gitHead": "59a251c5053f0609baba7f83dd5b8fc57e2d7c91"
|
|
35
35
|
}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
export const emptyBuffer = new Uint8Array(0);
|
|
8
|
-
export const buffer4Capacity = new Uint8Array(4);
|
|
9
8
|
|
|
10
9
|
export function copy(
|
|
11
10
|
source: Uint8Array,
|
|
@@ -73,39 +72,6 @@ export class Buffers {
|
|
|
73
72
|
return target;
|
|
74
73
|
}
|
|
75
74
|
|
|
76
|
-
slice4(start: number) {
|
|
77
|
-
let end = start + 4;
|
|
78
|
-
const buffers = this.buffers;
|
|
79
|
-
|
|
80
|
-
if (end > this.size) {
|
|
81
|
-
end = this.size;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (start >= end) {
|
|
85
|
-
return emptyBuffer;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
let startBytes = 0;
|
|
89
|
-
let si = 0;
|
|
90
|
-
for (; si < buffers.length && startBytes + buffers[si].length <= start; si++) {
|
|
91
|
-
startBytes += buffers[si].length;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const target = buffer4Capacity;
|
|
95
|
-
|
|
96
|
-
let ti = 0;
|
|
97
|
-
for (let ii = si; ti < end - start && ii < buffers.length; ii++) {
|
|
98
|
-
const len = buffers[ii].length;
|
|
99
|
-
|
|
100
|
-
const _start = ti === 0 ? start - startBytes : 0;
|
|
101
|
-
const _end = ti + len >= end - start ? Math.min(_start + (end - start) - ti, len) : len;
|
|
102
|
-
copy(buffers[ii], target, ti, _start, _end);
|
|
103
|
-
ti += _end - _start;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return target;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
75
|
pos(i: number): { buf: number; offset: number } {
|
|
110
76
|
if (i < 0 || i >= this.size) {
|
|
111
77
|
throw new Error(`out of range, ${i} not in [0, ${this.size})`);
|
|
@@ -302,12 +268,6 @@ export class Cursor {
|
|
|
302
268
|
return buffers;
|
|
303
269
|
}
|
|
304
270
|
|
|
305
|
-
read4() {
|
|
306
|
-
const buffers = this.buffers.slice4(this.offset);
|
|
307
|
-
this.skip(4);
|
|
308
|
-
return buffers;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
271
|
skip(n: number) {
|
|
312
272
|
let count = 0;
|
|
313
273
|
while (this.chunkIndex < this.buffers.buffers.length) {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
1
|
import { BinaryWriter } from '@furyjs/fury/dist/lib/writer';
|
|
3
2
|
|
|
4
|
-
import {
|
|
3
|
+
import { Emitter, readUInt32LE } from '@opensumi/ide-core-common';
|
|
5
4
|
|
|
6
5
|
import { Buffers } from '../../buffers/buffers';
|
|
7
6
|
|
|
@@ -10,40 +9,30 @@ import { Buffers } from '../../buffers/buffers';
|
|
|
10
9
|
*/
|
|
11
10
|
export const indicator = new Uint8Array([0x0d, 0x0a, 0x0d, 0x0a]);
|
|
12
11
|
|
|
13
|
-
/**
|
|
14
|
-
* The number of bytes in the length field.
|
|
15
|
-
*
|
|
16
|
-
* How many bytes are used to represent data length.
|
|
17
|
-
*
|
|
18
|
-
* For example, if the length field is 4 bytes, then the maximum length of the data is 2^32 = 4GB
|
|
19
|
-
*/
|
|
20
|
-
const lengthFieldLength = 4;
|
|
21
|
-
|
|
22
12
|
/**
|
|
23
13
|
* sticky packet unpacking problems are generally problems at the transport layer.
|
|
24
14
|
* we use a length field to represent the length of the data, and then read the data according to the length
|
|
25
15
|
*/
|
|
26
16
|
export class LengthFieldBasedFrameDecoder {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
private _onDataListener: MaybeNull<(data: Uint8Array) => void>;
|
|
30
|
-
onData(listener: (data: Uint8Array) => void) {
|
|
31
|
-
this._onDataListener = listener;
|
|
32
|
-
return {
|
|
33
|
-
dispose: () => {
|
|
34
|
-
this._onDataListener = null;
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
}
|
|
17
|
+
protected dataEmitter = new Emitter<Uint8Array>();
|
|
18
|
+
onData = this.dataEmitter.event;
|
|
38
19
|
|
|
39
20
|
protected buffers = new Buffers();
|
|
40
21
|
protected cursor = this.buffers.cursor();
|
|
41
|
-
private processingPromise: Promise<void> | null = null;
|
|
42
22
|
|
|
43
23
|
protected contentLength = -1;
|
|
44
24
|
|
|
45
25
|
protected state = 0;
|
|
46
26
|
|
|
27
|
+
/**
|
|
28
|
+
* The number of bytes in the length field.
|
|
29
|
+
*
|
|
30
|
+
* How many bytes are used to represent data length.
|
|
31
|
+
*
|
|
32
|
+
* For example, if the length field is 4 bytes, then the maximum length of the data is 2^32 = 4GB
|
|
33
|
+
*/
|
|
34
|
+
lengthFieldLength = 4;
|
|
35
|
+
|
|
47
36
|
reset() {
|
|
48
37
|
this.contentLength = -1;
|
|
49
38
|
this.state = 0;
|
|
@@ -52,81 +41,38 @@ export class LengthFieldBasedFrameDecoder {
|
|
|
52
41
|
|
|
53
42
|
push(chunk: Uint8Array): void {
|
|
54
43
|
this.buffers.push(chunk);
|
|
44
|
+
let done = false;
|
|
55
45
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
this.processingPromise = this.processBuffers().finally(() => {
|
|
59
|
-
this.processingPromise = null;
|
|
60
|
-
});
|
|
46
|
+
while (!done) {
|
|
47
|
+
done = this.readFrame();
|
|
61
48
|
}
|
|
62
49
|
}
|
|
63
50
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
let hasMoreData = false;
|
|
67
|
-
|
|
68
|
-
do {
|
|
69
|
-
hasMoreData = false;
|
|
70
|
-
while (iterations < LengthFieldBasedFrameDecoder.MAX_ITERATIONS) {
|
|
71
|
-
if (this.buffers.byteLength === 0) {
|
|
72
|
-
break;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const result = await this.readFrame();
|
|
76
|
-
if (result === true) {
|
|
77
|
-
break;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
iterations++;
|
|
81
|
-
if (iterations % 10 === 0) {
|
|
82
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// 检查剩余数据
|
|
87
|
-
if (this.buffers.byteLength > 0) {
|
|
88
|
-
hasMoreData = true;
|
|
89
|
-
// 异步继续处理,避免阻塞
|
|
90
|
-
await new Promise((resolve) => setImmediate(resolve));
|
|
91
|
-
iterations = 0; // 重置迭代计数器
|
|
92
|
-
}
|
|
93
|
-
} while (hasMoreData);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
protected async readFrame(): Promise<boolean> {
|
|
97
|
-
try {
|
|
98
|
-
const found = this.readLengthField();
|
|
99
|
-
if (!found) {
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
51
|
+
protected readFrame(): boolean {
|
|
52
|
+
const found = this.readLengthField();
|
|
102
53
|
|
|
54
|
+
if (found) {
|
|
103
55
|
const start = this.cursor.offset;
|
|
104
56
|
const end = start + this.contentLength;
|
|
105
57
|
|
|
106
|
-
if (end > this.buffers.byteLength) {
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
58
|
const binary = this.buffers.slice(start, end);
|
|
111
59
|
|
|
112
|
-
|
|
113
|
-
this.buffers.splice(0, end);
|
|
114
|
-
this.reset();
|
|
60
|
+
this.dataEmitter.fire(binary);
|
|
115
61
|
|
|
116
|
-
if (this.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
62
|
+
if (this.buffers.byteLength > end) {
|
|
63
|
+
this.contentLength = -1;
|
|
64
|
+
this.state = 0;
|
|
65
|
+
this.cursor.moveTo(end);
|
|
66
|
+
// has more data, continue to parse
|
|
67
|
+
return false;
|
|
122
68
|
}
|
|
123
69
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
console.error('[Frame Decoder] Error processing frame:', error);
|
|
70
|
+
// delete used buffers
|
|
71
|
+
this.buffers.splice(0, end);
|
|
127
72
|
this.reset();
|
|
128
|
-
return true;
|
|
129
73
|
}
|
|
74
|
+
|
|
75
|
+
return true;
|
|
130
76
|
}
|
|
131
77
|
|
|
132
78
|
protected readLengthField() {
|
|
@@ -147,13 +93,13 @@ export class LengthFieldBasedFrameDecoder {
|
|
|
147
93
|
}
|
|
148
94
|
|
|
149
95
|
if (this.contentLength === -1) {
|
|
150
|
-
if (this.cursor.offset + lengthFieldLength > bufferLength) {
|
|
96
|
+
if (this.cursor.offset + this.lengthFieldLength > bufferLength) {
|
|
151
97
|
// Not enough data yet, wait for more data
|
|
152
98
|
return false;
|
|
153
99
|
}
|
|
154
100
|
|
|
155
101
|
// read the content length
|
|
156
|
-
const buf = this.cursor.
|
|
102
|
+
const buf = this.cursor.read(this.lengthFieldLength);
|
|
157
103
|
// fury writer use little endian
|
|
158
104
|
this.contentLength = readUInt32LE(buf, 0);
|
|
159
105
|
}
|
|
@@ -172,12 +118,12 @@ export class LengthFieldBasedFrameDecoder {
|
|
|
172
118
|
let result = iter.next();
|
|
173
119
|
while (!result.done) {
|
|
174
120
|
switch (result.value) {
|
|
175
|
-
case 0x0d:
|
|
121
|
+
case 0x0d:
|
|
176
122
|
switch (this.state) {
|
|
177
123
|
case 0:
|
|
178
124
|
this.state = 1;
|
|
179
125
|
break;
|
|
180
|
-
case 2:
|
|
126
|
+
case 2:
|
|
181
127
|
this.state = 3;
|
|
182
128
|
break;
|
|
183
129
|
default:
|
|
@@ -185,12 +131,12 @@ export class LengthFieldBasedFrameDecoder {
|
|
|
185
131
|
break;
|
|
186
132
|
}
|
|
187
133
|
break;
|
|
188
|
-
case 0x0a:
|
|
134
|
+
case 0x0a:
|
|
189
135
|
switch (this.state) {
|
|
190
136
|
case 1:
|
|
191
137
|
this.state = 2;
|
|
192
138
|
break;
|
|
193
|
-
case 3:
|
|
139
|
+
case 3:
|
|
194
140
|
this.state = 4;
|
|
195
141
|
iter.return();
|
|
196
142
|
break;
|
|
@@ -208,23 +154,17 @@ export class LengthFieldBasedFrameDecoder {
|
|
|
208
154
|
}
|
|
209
155
|
|
|
210
156
|
dispose() {
|
|
211
|
-
this.
|
|
157
|
+
this.dataEmitter.dispose();
|
|
212
158
|
this.buffers.dispose();
|
|
213
|
-
this.reset();
|
|
214
159
|
}
|
|
215
160
|
|
|
161
|
+
static writer = BinaryWriter({});
|
|
162
|
+
|
|
216
163
|
static construct(content: Uint8Array) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
writer.uint32(content.byteLength);
|
|
223
|
-
writer.buffer(content);
|
|
224
|
-
return writer;
|
|
225
|
-
} catch (error) {
|
|
226
|
-
console.warn('[Frame Decoder] Error constructing frame:', error);
|
|
227
|
-
throw error;
|
|
228
|
-
}
|
|
164
|
+
LengthFieldBasedFrameDecoder.writer.reset();
|
|
165
|
+
LengthFieldBasedFrameDecoder.writer.buffer(indicator);
|
|
166
|
+
LengthFieldBasedFrameDecoder.writer.uint32(content.byteLength);
|
|
167
|
+
LengthFieldBasedFrameDecoder.writer.buffer(content);
|
|
168
|
+
return LengthFieldBasedFrameDecoder.writer.dump();
|
|
229
169
|
}
|
|
230
170
|
}
|