grpc-libp2p-client 0.0.37 → 0.0.39
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/dist/dc-http2/frame.cjs.js +6 -5
- package/dist/dc-http2/frame.cjs.js.map +1 -1
- package/dist/dc-http2/frame.d.ts +1 -1
- package/dist/dc-http2/frame.esm.js +6 -5
- package/dist/dc-http2/frame.esm.js.map +1 -1
- package/dist/dc-http2/hpack.cjs.js +3 -3
- package/dist/dc-http2/hpack.cjs.js.map +1 -1
- package/dist/dc-http2/hpack.esm.js +3 -3
- package/dist/dc-http2/hpack.esm.js.map +1 -1
- package/dist/dc-http2/parser.cjs.js +39 -28
- package/dist/dc-http2/parser.cjs.js.map +1 -1
- package/dist/dc-http2/parser.d.ts +7 -7
- package/dist/dc-http2/parser.esm.js +39 -28
- package/dist/dc-http2/parser.esm.js.map +1 -1
- package/dist/dc-http2/stream.cjs.js +26 -12
- package/dist/dc-http2/stream.cjs.js.map +1 -1
- package/dist/dc-http2/stream.d.ts +1 -1
- package/dist/dc-http2/stream.esm.js +26 -12
- package/dist/dc-http2/stream.esm.js.map +1 -1
- package/dist/grpc.js +245 -269
- package/dist/grpc.js.map +1 -1
- package/dist/grpc.min.js +1 -1
- package/dist/grpc.min.js.map +1 -1
- package/dist/index.cjs.js +103 -103
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +103 -103
- package/dist/index.esm.js.map +1 -1
- package/dist/stats.html +1 -1
- package/package.json +4 -4
- package/src/dc-http2/encoder.ts +3 -2
- package/src/dc-http2/hpack.ts +3 -3
- package/src/dc-http2/parser.ts +43 -38
- package/src/dc-http2/stream.ts +36 -23
- package/src/dc-http2/types.ts +1 -1
- package/src/index.ts +57 -85
package/dist/grpc.js
CHANGED
|
@@ -575,7 +575,7 @@
|
|
|
575
575
|
try {
|
|
576
576
|
result = this.decode(bytes);
|
|
577
577
|
}
|
|
578
|
-
catch (
|
|
578
|
+
catch (_b) {
|
|
579
579
|
result = '';
|
|
580
580
|
}
|
|
581
581
|
}
|
|
@@ -583,7 +583,7 @@
|
|
|
583
583
|
try {
|
|
584
584
|
result = new TextDecoder().decode(bytes);
|
|
585
585
|
}
|
|
586
|
-
catch (
|
|
586
|
+
catch (_c) {
|
|
587
587
|
result = '';
|
|
588
588
|
}
|
|
589
589
|
}
|
|
@@ -632,7 +632,8 @@
|
|
|
632
632
|
// 编码SETTINGS帧
|
|
633
633
|
FrameEncoder.encodeSettingsFrame = function (frame) {
|
|
634
634
|
// 计算payload总长度:每个设置项占6字节
|
|
635
|
-
var
|
|
635
|
+
var settingsPayload = frame.payload;
|
|
636
|
+
var payloadLength = settingsPayload.length * 6;
|
|
636
637
|
// 分配缓冲区:9字节头部 + payload长度
|
|
637
638
|
var buffer = new Uint8Array(9 + payloadLength);
|
|
638
639
|
// 编码帧头部(前9个字节)
|
|
@@ -643,7 +644,7 @@
|
|
|
643
644
|
streamId: frame.streamId
|
|
644
645
|
});
|
|
645
646
|
// 编码payload
|
|
646
|
-
_encodeSettingsPayload(buffer,
|
|
647
|
+
_encodeSettingsPayload(buffer, settingsPayload);
|
|
647
648
|
return buffer;
|
|
648
649
|
};
|
|
649
650
|
// 编码SETTINGS ACK帧
|
|
@@ -716,13 +717,13 @@
|
|
|
716
717
|
_a[SETTINGS_PARAMETERS.MAX_FRAME_SIZE] = 16 << 10,
|
|
717
718
|
_a[SETTINGS_PARAMETERS.MAX_HEADER_LIST_SIZE] = 8192,
|
|
718
719
|
_a);
|
|
719
|
-
var HTTP2_PREFACE = 'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n';
|
|
720
|
+
var HTTP2_PREFACE$1 = 'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n';
|
|
720
721
|
var Http2Frame = /** @class */ (function () {
|
|
721
722
|
function Http2Frame() {
|
|
722
723
|
}
|
|
723
724
|
// 创建并编码PREFACE帧
|
|
724
725
|
Http2Frame.createPreface = function () {
|
|
725
|
-
return new TextEncoder().encode(HTTP2_PREFACE);
|
|
726
|
+
return new TextEncoder().encode(HTTP2_PREFACE$1);
|
|
726
727
|
};
|
|
727
728
|
Http2Frame.createPongFrame = function (payload) {
|
|
728
729
|
return Http2Frame.createFrame(0x6, 0x1, 0, payload);
|
|
@@ -949,6 +950,7 @@
|
|
|
949
950
|
return payload;
|
|
950
951
|
}
|
|
951
952
|
|
|
953
|
+
var HTTP2_PREFACE = new TextEncoder().encode("PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n");
|
|
952
954
|
var HTTP2Parser = /** @class */ (function () {
|
|
953
955
|
function HTTP2Parser(writer, options) {
|
|
954
956
|
var _a;
|
|
@@ -1039,44 +1041,49 @@
|
|
|
1039
1041
|
// 处理单个数据块
|
|
1040
1042
|
HTTP2Parser.prototype._processChunk = function (chunk) {
|
|
1041
1043
|
// chunk 是 Uint8ArrayList 或 Uint8Array
|
|
1042
|
-
var newData =
|
|
1043
|
-
|
|
1044
|
+
var newData = 'subarray' in chunk && typeof chunk.subarray === 'function'
|
|
1045
|
+
? chunk.subarray()
|
|
1046
|
+
: chunk;
|
|
1047
|
+
// 原作者之前的 O(N) 内存拷贝优化被保留,去掉了存在 onEnd 竞态的 setTimeout
|
|
1044
1048
|
var newBuffer = new Uint8Array(this.buffer.length + newData.length);
|
|
1045
1049
|
newBuffer.set(this.buffer);
|
|
1046
1050
|
newBuffer.set(newData, this.buffer.length);
|
|
1047
1051
|
this.buffer = newBuffer;
|
|
1048
1052
|
// 持续处理所有完整的帧
|
|
1049
|
-
|
|
1053
|
+
var readOffset = 0;
|
|
1054
|
+
while (this.buffer.length - readOffset >= 9) {
|
|
1050
1055
|
// 判断是否有HTTP/2前导
|
|
1051
|
-
if (this.buffer.length >= 24 && this.isHttp2Preface(this.buffer)) {
|
|
1052
|
-
|
|
1056
|
+
if (this.buffer.length - readOffset >= 24 && this.isHttp2Preface(this.buffer.subarray(readOffset))) {
|
|
1057
|
+
readOffset += 24;
|
|
1053
1058
|
// 发送SETTINGS帧
|
|
1054
1059
|
var settingFrame = Http2Frame.createSettingsFrame();
|
|
1055
1060
|
this.writer.write(settingFrame);
|
|
1056
|
-
|
|
1061
|
+
continue;
|
|
1057
1062
|
}
|
|
1058
|
-
var frameHeader = this._parseFrameHeader(this.buffer);
|
|
1063
|
+
var frameHeader = this._parseFrameHeader(this.buffer.subarray(readOffset));
|
|
1059
1064
|
var totalFrameLength = 9 + frameHeader.length;
|
|
1060
1065
|
// 检查是否有完整的帧
|
|
1061
|
-
if (this.buffer.length < totalFrameLength) {
|
|
1066
|
+
if (this.buffer.length - readOffset < totalFrameLength) {
|
|
1062
1067
|
break;
|
|
1063
1068
|
}
|
|
1064
1069
|
// 获取完整帧数据
|
|
1065
|
-
var frameData = this.buffer.
|
|
1070
|
+
var frameData = this.buffer.subarray(readOffset, readOffset + totalFrameLength);
|
|
1066
1071
|
// 处理不同类型的帧
|
|
1067
1072
|
this._handleFrame(frameHeader, frameData).catch(function (err) {
|
|
1068
1073
|
console.error("Error handling frame:", err);
|
|
1069
1074
|
});
|
|
1070
|
-
//
|
|
1071
|
-
|
|
1075
|
+
// 移动偏移量
|
|
1076
|
+
readOffset += totalFrameLength;
|
|
1077
|
+
}
|
|
1078
|
+
if (readOffset > 0) {
|
|
1079
|
+
this.buffer = this.buffer.slice(readOffset);
|
|
1072
1080
|
}
|
|
1073
1081
|
};
|
|
1074
1082
|
HTTP2Parser.prototype.isHttp2Preface = function (buffer) {
|
|
1075
|
-
|
|
1076
|
-
if (buffer.length < PREFACE.length)
|
|
1083
|
+
if (buffer.length < HTTP2_PREFACE.length)
|
|
1077
1084
|
return false;
|
|
1078
|
-
for (var i = 0; i <
|
|
1079
|
-
if (buffer[i] !==
|
|
1085
|
+
for (var i = 0; i < HTTP2_PREFACE.length; i++) {
|
|
1086
|
+
if (buffer[i] !== HTTP2_PREFACE[i])
|
|
1080
1087
|
return false;
|
|
1081
1088
|
}
|
|
1082
1089
|
return true;
|
|
@@ -1282,7 +1289,9 @@
|
|
|
1282
1289
|
waiters.forEach(function (fn) { try {
|
|
1283
1290
|
fn();
|
|
1284
1291
|
}
|
|
1285
|
-
catch (
|
|
1292
|
+
catch (e) {
|
|
1293
|
+
console.debug('waiter error', e);
|
|
1294
|
+
} });
|
|
1286
1295
|
}
|
|
1287
1296
|
break;
|
|
1288
1297
|
case FRAME_TYPES.DATA:
|
|
@@ -1330,7 +1339,7 @@
|
|
|
1330
1339
|
break;
|
|
1331
1340
|
case FRAME_TYPES.WINDOW_UPDATE:
|
|
1332
1341
|
// 处理窗口更新帧
|
|
1333
|
-
this.handleWindowUpdateFrame(frameHeader, frameData
|
|
1342
|
+
this.handleWindowUpdateFrame(frameHeader, frameData);
|
|
1334
1343
|
// 更新发送窗口(对端接收窗口)
|
|
1335
1344
|
try {
|
|
1336
1345
|
inc = this.parseWindowUpdateFrame(frameData, frameHeader).windowSizeIncrement;
|
|
@@ -1345,9 +1354,11 @@
|
|
|
1345
1354
|
waiters.forEach(function (fn) { try {
|
|
1346
1355
|
fn();
|
|
1347
1356
|
}
|
|
1348
|
-
catch (
|
|
1357
|
+
catch (e) {
|
|
1358
|
+
console.debug('waiter error', e);
|
|
1359
|
+
} });
|
|
1349
1360
|
}
|
|
1350
|
-
catch (
|
|
1361
|
+
catch ( /* ignore WINDOW_UPDATE parse errors */_g) { /* ignore WINDOW_UPDATE parse errors */ }
|
|
1351
1362
|
break;
|
|
1352
1363
|
case FRAME_TYPES.PING:
|
|
1353
1364
|
// 处理PING帧
|
|
@@ -1369,7 +1380,7 @@
|
|
|
1369
1380
|
info = {};
|
|
1370
1381
|
}
|
|
1371
1382
|
}
|
|
1372
|
-
catch (
|
|
1383
|
+
catch ( /* ignore GOAWAY parse errors */_h) { /* ignore GOAWAY parse errors */ }
|
|
1373
1384
|
try {
|
|
1374
1385
|
(_d = this.onGoaway) === null || _d === void 0 ? void 0 : _d.call(this, info !== null && info !== void 0 ? info : {});
|
|
1375
1386
|
}
|
|
@@ -1506,7 +1517,7 @@
|
|
|
1506
1517
|
};
|
|
1507
1518
|
};
|
|
1508
1519
|
// 处理 WINDOW_UPDATE 帧
|
|
1509
|
-
HTTP2Parser.prototype.handleWindowUpdateFrame = function (frameHeader, payload
|
|
1520
|
+
HTTP2Parser.prototype.handleWindowUpdateFrame = function (frameHeader, payload) {
|
|
1510
1521
|
try {
|
|
1511
1522
|
var windowUpdate = this.parseWindowUpdateFrame(payload, frameHeader);
|
|
1512
1523
|
this.connectionWindowSize += windowUpdate.windowSizeIncrement;
|
|
@@ -1976,23 +1987,23 @@
|
|
|
1976
1987
|
return __awaiter(this, void 0, void 0, function () {
|
|
1977
1988
|
var _a, _b, _c, chunk, canContinue, err_1, errMsg, e_1_1;
|
|
1978
1989
|
var _d, e_1, _e, _f;
|
|
1979
|
-
var _g, _h, _j, _k
|
|
1980
|
-
return __generator(this, function (
|
|
1981
|
-
switch (
|
|
1990
|
+
var _g, _h, _j, _k;
|
|
1991
|
+
return __generator(this, function (_l) {
|
|
1992
|
+
switch (_l.label) {
|
|
1982
1993
|
case 0:
|
|
1983
1994
|
// 检查 stream 是否有效
|
|
1984
1995
|
if (!this.stream) {
|
|
1985
1996
|
(_h = (_g = this.log) === null || _g === void 0 ? void 0 : _g.trace) === null || _h === void 0 ? void 0 : _h.call(_g, 'Stream is null/undefined, cannot start pipeline');
|
|
1986
1997
|
return [2 /*return*/];
|
|
1987
1998
|
}
|
|
1988
|
-
|
|
1999
|
+
_l.label = 1;
|
|
1989
2000
|
case 1:
|
|
1990
|
-
|
|
2001
|
+
_l.trys.push([1, 10, 11, 16]);
|
|
1991
2002
|
_a = true, _b = __asyncValues(this.createTransform()(this.p));
|
|
1992
|
-
|
|
2003
|
+
_l.label = 2;
|
|
1993
2004
|
case 2: return [4 /*yield*/, _b.next()];
|
|
1994
2005
|
case 3:
|
|
1995
|
-
if (!(_c =
|
|
2006
|
+
if (!(_c = _l.sent(), _d = _c.done, !_d)) return [3 /*break*/, 9];
|
|
1996
2007
|
_f = _c.value;
|
|
1997
2008
|
_a = false;
|
|
1998
2009
|
chunk = _f;
|
|
@@ -2000,26 +2011,26 @@
|
|
|
2000
2011
|
if (this.abortController.signal.aborted) {
|
|
2001
2012
|
return [3 /*break*/, 9];
|
|
2002
2013
|
}
|
|
2003
|
-
|
|
2014
|
+
_l.label = 4;
|
|
2004
2015
|
case 4:
|
|
2005
|
-
|
|
2016
|
+
_l.trys.push([4, 7, , 8]);
|
|
2006
2017
|
canContinue = this.stream.send(chunk);
|
|
2007
2018
|
if (!!canContinue) return [3 /*break*/, 6];
|
|
2008
2019
|
// 等待 drain 事件
|
|
2009
2020
|
return [4 /*yield*/, this.stream.onDrain()];
|
|
2010
2021
|
case 5:
|
|
2011
2022
|
// 等待 drain 事件
|
|
2012
|
-
|
|
2013
|
-
|
|
2023
|
+
_l.sent();
|
|
2024
|
+
_l.label = 6;
|
|
2014
2025
|
case 6: return [3 /*break*/, 8];
|
|
2015
2026
|
case 7:
|
|
2016
|
-
err_1 =
|
|
2017
|
-
errMsg = (
|
|
2018
|
-
if (err_1.name === 'StreamStateError' ||
|
|
2027
|
+
err_1 = _l.sent();
|
|
2028
|
+
errMsg = (err_1 instanceof Error ? err_1.message : '').toLowerCase();
|
|
2029
|
+
if ((err_1 instanceof Error && err_1.name === 'StreamStateError') ||
|
|
2019
2030
|
errMsg.includes('closing') ||
|
|
2020
2031
|
errMsg.includes('closed') ||
|
|
2021
2032
|
errMsg.includes('write to a stream that is closed')) {
|
|
2022
|
-
(
|
|
2033
|
+
(_k = (_j = this.log) === null || _j === void 0 ? void 0 : _j.trace) === null || _k === void 0 ? void 0 : _k.call(_j, 'Stream is closing/closed, stopping pipeline');
|
|
2023
2034
|
return [3 /*break*/, 9];
|
|
2024
2035
|
}
|
|
2025
2036
|
throw err_1;
|
|
@@ -2028,16 +2039,16 @@
|
|
|
2028
2039
|
return [3 /*break*/, 2];
|
|
2029
2040
|
case 9: return [3 /*break*/, 16];
|
|
2030
2041
|
case 10:
|
|
2031
|
-
e_1_1 =
|
|
2042
|
+
e_1_1 = _l.sent();
|
|
2032
2043
|
e_1 = { error: e_1_1 };
|
|
2033
2044
|
return [3 /*break*/, 16];
|
|
2034
2045
|
case 11:
|
|
2035
|
-
|
|
2046
|
+
_l.trys.push([11, , 14, 15]);
|
|
2036
2047
|
if (!(!_a && !_d && (_e = _b.return))) return [3 /*break*/, 13];
|
|
2037
2048
|
return [4 /*yield*/, _e.call(_b)];
|
|
2038
2049
|
case 12:
|
|
2039
|
-
|
|
2040
|
-
|
|
2050
|
+
_l.sent();
|
|
2051
|
+
_l.label = 13;
|
|
2041
2052
|
case 13: return [3 /*break*/, 15];
|
|
2042
2053
|
case 14:
|
|
2043
2054
|
if (e_1) throw e_1.error;
|
|
@@ -2049,21 +2060,21 @@
|
|
|
2049
2060
|
});
|
|
2050
2061
|
};
|
|
2051
2062
|
StreamWriter.prototype.createTransform = function () {
|
|
2063
|
+
// eslint-disable-next-line @typescript-eslint/no-this-alias
|
|
2052
2064
|
var self = this;
|
|
2053
2065
|
return function (source) {
|
|
2054
2066
|
return __asyncGenerator(this, arguments, function () {
|
|
2055
2067
|
var _a, source_1, source_1_1, chunk, now, e_2_1;
|
|
2056
2068
|
var _b, e_2, _c, _d;
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
switch (_f.label) {
|
|
2069
|
+
return __generator(this, function (_e) {
|
|
2070
|
+
switch (_e.label) {
|
|
2060
2071
|
case 0:
|
|
2061
|
-
|
|
2072
|
+
_e.trys.push([0, 7, 8, 13]);
|
|
2062
2073
|
_a = true, source_1 = __asyncValues(source);
|
|
2063
|
-
|
|
2074
|
+
_e.label = 1;
|
|
2064
2075
|
case 1: return [4 /*yield*/, __await(source_1.next())];
|
|
2065
2076
|
case 2:
|
|
2066
|
-
if (!(source_1_1 =
|
|
2077
|
+
if (!(source_1_1 = _e.sent(), _b = source_1_1.done, !_b)) return [3 /*break*/, 6];
|
|
2067
2078
|
_d = source_1_1.value;
|
|
2068
2079
|
_a = false;
|
|
2069
2080
|
chunk = _d;
|
|
@@ -2073,15 +2084,15 @@
|
|
|
2073
2084
|
)];
|
|
2074
2085
|
case 3:
|
|
2075
2086
|
// 将数据交给下游
|
|
2076
|
-
return [4 /*yield*/,
|
|
2087
|
+
return [4 /*yield*/, _e.sent()];
|
|
2077
2088
|
case 4:
|
|
2078
2089
|
// 将数据交给下游
|
|
2079
|
-
|
|
2090
|
+
_e.sent();
|
|
2080
2091
|
// 注意:在 async generator 中,yield 返回后到下一次循环之间,表示下游已经“取走并处理了这个 chunk”,
|
|
2081
2092
|
// 因此这里统计的 bytesDrained 更接近实际被 sink 消费的字节数
|
|
2082
2093
|
try {
|
|
2083
2094
|
// 在下游消费后再扣减待消费队列,避免误判“next 没取”
|
|
2084
|
-
if (
|
|
2095
|
+
if (self.p._queueSize != null) {
|
|
2085
2096
|
self.p._queueSize = Math.max(0, self.p._queueSize - chunk.byteLength);
|
|
2086
2097
|
}
|
|
2087
2098
|
self.bytesDrained += chunk.byteLength;
|
|
@@ -2097,22 +2108,22 @@
|
|
|
2097
2108
|
//打印错误
|
|
2098
2109
|
console.error('Error updating bytesDrained in StreamWriter transform', err);
|
|
2099
2110
|
}
|
|
2100
|
-
|
|
2111
|
+
_e.label = 5;
|
|
2101
2112
|
case 5:
|
|
2102
2113
|
_a = true;
|
|
2103
2114
|
return [3 /*break*/, 1];
|
|
2104
2115
|
case 6: return [3 /*break*/, 13];
|
|
2105
2116
|
case 7:
|
|
2106
|
-
e_2_1 =
|
|
2117
|
+
e_2_1 = _e.sent();
|
|
2107
2118
|
e_2 = { error: e_2_1 };
|
|
2108
2119
|
return [3 /*break*/, 13];
|
|
2109
2120
|
case 8:
|
|
2110
|
-
|
|
2121
|
+
_e.trys.push([8, , 11, 12]);
|
|
2111
2122
|
if (!(!_a && !_b && (_c = source_1.return))) return [3 /*break*/, 10];
|
|
2112
2123
|
return [4 /*yield*/, __await(_c.call(source_1))];
|
|
2113
2124
|
case 9:
|
|
2114
|
-
|
|
2115
|
-
|
|
2125
|
+
_e.sent();
|
|
2126
|
+
_e.label = 10;
|
|
2116
2127
|
case 10: return [3 /*break*/, 12];
|
|
2117
2128
|
case 11:
|
|
2118
2129
|
if (e_2) throw e_2.error;
|
|
@@ -2125,13 +2136,14 @@
|
|
|
2125
2136
|
};
|
|
2126
2137
|
};
|
|
2127
2138
|
// 简单的卡顿看门狗:当队列长期高位且 bytesDrained 无进展时发出 stalled 事件
|
|
2139
|
+
// 使用递归 setTimeout 而非 setInterval,避免标签页后台恢复时回调堆积导致 Violation
|
|
2128
2140
|
StreamWriter.prototype.startWatchdog = function (intervalMs, stallMs) {
|
|
2129
2141
|
var _this = this;
|
|
2130
2142
|
if (intervalMs === void 0) { intervalMs = 500; }
|
|
2131
2143
|
if (stallMs === void 0) { stallMs = 1500; }
|
|
2132
2144
|
if (this.watchdogTimer)
|
|
2133
2145
|
return;
|
|
2134
|
-
|
|
2146
|
+
var tick = function () {
|
|
2135
2147
|
if (_this.abortController.signal.aborted)
|
|
2136
2148
|
return;
|
|
2137
2149
|
var baseThreshold = _this.options.bufferSize * 0.7;
|
|
@@ -2142,7 +2154,13 @@
|
|
|
2142
2154
|
if (!_this.stallStartAt)
|
|
2143
2155
|
_this.stallStartAt = now;
|
|
2144
2156
|
if (now - _this.stallStartAt >= stallMs) {
|
|
2145
|
-
|
|
2157
|
+
// 异步触发事件,让当前 tick 立即返回,避免同步事件处理器阻塞主线程
|
|
2158
|
+
var detail_1 = { queueSize: q, drained: _this.bytesDrained, sinceMs: now - _this.stallStartAt };
|
|
2159
|
+
setTimeout(function () {
|
|
2160
|
+
if (!_this.abortController.signal.aborted) {
|
|
2161
|
+
_this.dispatchEvent(new CustomEvent('stalled', { detail: detail_1 }));
|
|
2162
|
+
}
|
|
2163
|
+
}, 0);
|
|
2146
2164
|
// 避免持续触发,推进起点
|
|
2147
2165
|
_this.stallStartAt = now;
|
|
2148
2166
|
}
|
|
@@ -2157,7 +2175,10 @@
|
|
|
2157
2175
|
// 队列回落,重置
|
|
2158
2176
|
_this.stallStartAt = 0;
|
|
2159
2177
|
}
|
|
2160
|
-
|
|
2178
|
+
// 本次 tick 完成后再安排下一次,不会因主线程繁忙而堆积
|
|
2179
|
+
_this.watchdogTimer = setTimeout(tick, intervalMs);
|
|
2180
|
+
};
|
|
2181
|
+
this.watchdogTimer = setTimeout(tick, intervalMs);
|
|
2161
2182
|
};
|
|
2162
2183
|
StreamWriter.prototype.write = function (data) {
|
|
2163
2184
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -2208,6 +2229,8 @@
|
|
|
2208
2229
|
return [2 /*return*/, data.arrayBuffer()];
|
|
2209
2230
|
if (typeof data === 'string')
|
|
2210
2231
|
return [2 /*return*/, new TextEncoder().encode(data).buffer];
|
|
2232
|
+
if (data instanceof Uint8Array)
|
|
2233
|
+
return [2 /*return*/, data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)];
|
|
2211
2234
|
return [2 /*return*/, data];
|
|
2212
2235
|
});
|
|
2213
2236
|
});
|
|
@@ -2411,24 +2434,24 @@
|
|
|
2411
2434
|
StreamWriter.prototype.end = function () {
|
|
2412
2435
|
return __awaiter(this, void 0, void 0, function () {
|
|
2413
2436
|
var err_4, errMsg;
|
|
2414
|
-
var _a, _b
|
|
2415
|
-
return __generator(this, function (
|
|
2416
|
-
switch (
|
|
2437
|
+
var _a, _b;
|
|
2438
|
+
return __generator(this, function (_c) {
|
|
2439
|
+
switch (_c.label) {
|
|
2417
2440
|
case 0:
|
|
2418
2441
|
this.p.end();
|
|
2419
2442
|
if (!(this.stream && typeof this.stream.close === 'function')) return [3 /*break*/, 4];
|
|
2420
|
-
|
|
2443
|
+
_c.label = 1;
|
|
2421
2444
|
case 1:
|
|
2422
|
-
|
|
2445
|
+
_c.trys.push([1, 3, , 4]);
|
|
2423
2446
|
return [4 /*yield*/, this.stream.close()];
|
|
2424
2447
|
case 2:
|
|
2425
|
-
|
|
2448
|
+
_c.sent();
|
|
2426
2449
|
return [3 /*break*/, 4];
|
|
2427
2450
|
case 3:
|
|
2428
|
-
err_4 =
|
|
2429
|
-
errMsg = (
|
|
2451
|
+
err_4 = _c.sent();
|
|
2452
|
+
errMsg = (err_4 instanceof Error ? err_4.message : '').toLowerCase();
|
|
2430
2453
|
if (!errMsg.includes('closed') && !errMsg.includes('closing')) {
|
|
2431
|
-
(
|
|
2454
|
+
(_b = (_a = this.log) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.call(_a, 'Stream close error:', err_4);
|
|
2432
2455
|
}
|
|
2433
2456
|
return [3 /*break*/, 4];
|
|
2434
2457
|
case 4:
|
|
@@ -2439,7 +2462,7 @@
|
|
|
2439
2462
|
});
|
|
2440
2463
|
};
|
|
2441
2464
|
StreamWriter.prototype.abort = function (reason) {
|
|
2442
|
-
var _a, _b, _c, _d
|
|
2465
|
+
var _a, _b, _c, _d;
|
|
2443
2466
|
if (reason === void 0) { reason = 'User aborted'; }
|
|
2444
2467
|
if (this.abortController.signal.aborted) {
|
|
2445
2468
|
return; // Already aborted, prevent multiple abort calls
|
|
@@ -2450,7 +2473,8 @@
|
|
|
2450
2473
|
// 先检查流状态,避免在已关闭的流上调用 abort
|
|
2451
2474
|
if (this.stream && typeof this.stream.abort === 'function') {
|
|
2452
2475
|
// 检查流的状态,避免操作已关闭的流
|
|
2453
|
-
var streamState = this.stream.status ||
|
|
2476
|
+
var streamState = this.stream.status ||
|
|
2477
|
+
this.stream.state;
|
|
2454
2478
|
if (streamState !== 'closed' && streamState !== 'closing') {
|
|
2455
2479
|
this.stream.abort(new Error(reason));
|
|
2456
2480
|
}
|
|
@@ -2459,9 +2483,9 @@
|
|
|
2459
2483
|
catch (err) {
|
|
2460
2484
|
// Stream may already be closed, ignore all stream-related errors
|
|
2461
2485
|
// 完全忽略流操作错误,避免在错误处理中再次抛出错误
|
|
2462
|
-
var errMsg = (
|
|
2486
|
+
var errMsg = (err instanceof Error ? err.message : '').toLowerCase();
|
|
2463
2487
|
if (!errMsg.includes('closed') && !errMsg.includes('closing') && !errMsg.includes('write')) {
|
|
2464
|
-
(
|
|
2488
|
+
(_b = (_a = this.log) === null || _a === void 0 ? void 0 : _a.trace) === null || _b === void 0 ? void 0 : _b.call(_a, 'Stream abort error:', err);
|
|
2465
2489
|
}
|
|
2466
2490
|
}
|
|
2467
2491
|
this.cleanup();
|
|
@@ -2471,7 +2495,7 @@
|
|
|
2471
2495
|
}
|
|
2472
2496
|
catch (eventErr) {
|
|
2473
2497
|
// 忽略事件处理器错误
|
|
2474
|
-
(
|
|
2498
|
+
(_d = (_c = this.log) === null || _c === void 0 ? void 0 : _c.trace) === null || _d === void 0 ? void 0 : _d.call(_c, 'Error in abort event handler:', eventErr);
|
|
2475
2499
|
}
|
|
2476
2500
|
};
|
|
2477
2501
|
StreamWriter.prototype.cleanup = function () {
|
|
@@ -2481,17 +2505,17 @@
|
|
|
2481
2505
|
}
|
|
2482
2506
|
// 立即拒绝所有待处理的写入任务,避免它们继续执行
|
|
2483
2507
|
var pendingTasks = this.writeQueue.splice(0);
|
|
2484
|
-
pendingTasks.forEach(function (
|
|
2508
|
+
pendingTasks.forEach(function () {
|
|
2485
2509
|
// 这些任务的 Promise 会在执行时因为检查到 aborted 而被拒绝
|
|
2486
2510
|
});
|
|
2487
2511
|
try {
|
|
2488
2512
|
this.p.end();
|
|
2489
2513
|
}
|
|
2490
|
-
catch (
|
|
2514
|
+
catch (_a) {
|
|
2491
2515
|
// Ignore errors when ending pushable
|
|
2492
2516
|
}
|
|
2493
2517
|
if (this.watchdogTimer) {
|
|
2494
|
-
|
|
2518
|
+
clearTimeout(this.watchdogTimer);
|
|
2495
2519
|
this.watchdogTimer = undefined;
|
|
2496
2520
|
}
|
|
2497
2521
|
};
|
|
@@ -2652,6 +2676,7 @@
|
|
|
2652
2676
|
}
|
|
2653
2677
|
return [4 /*yield*/, new Promise(function (resolve, reject) {
|
|
2654
2678
|
var settled = false;
|
|
2679
|
+
// eslint-disable-next-line prefer-const
|
|
2655
2680
|
var timeoutId;
|
|
2656
2681
|
var cleanup = function () {
|
|
2657
2682
|
var idx = state.waiters.indexOf(waiter);
|
|
@@ -2755,15 +2780,14 @@
|
|
|
2755
2780
|
return __awaiter(this, void 0, void 0, function () {
|
|
2756
2781
|
var key, pooled, conn, status_1, dialPromise;
|
|
2757
2782
|
var _this = this;
|
|
2758
|
-
|
|
2759
|
-
return __generator(this, function (_d) {
|
|
2783
|
+
return __generator(this, function (_a) {
|
|
2760
2784
|
key = this.peerAddr.toString();
|
|
2761
2785
|
if (!forceNew) {
|
|
2762
2786
|
pooled = this.connectionPool.get(key);
|
|
2763
2787
|
if (pooled) {
|
|
2764
2788
|
conn = pooled.connection;
|
|
2765
2789
|
if (conn) {
|
|
2766
|
-
status_1 =
|
|
2790
|
+
status_1 = conn.status;
|
|
2767
2791
|
if (!status_1 || status_1 === "open") {
|
|
2768
2792
|
return [2 /*return*/, conn];
|
|
2769
2793
|
}
|
|
@@ -2779,7 +2803,7 @@
|
|
|
2779
2803
|
signal: AbortSignal.timeout(dialTimeout),
|
|
2780
2804
|
})
|
|
2781
2805
|
.then(function (conn) { return __awaiter(_this, void 0, void 0, function () {
|
|
2782
|
-
var poolEntry, removeFromPool
|
|
2806
|
+
var poolEntry, removeFromPool;
|
|
2783
2807
|
var _this = this;
|
|
2784
2808
|
return __generator(this, function (_a) {
|
|
2785
2809
|
if (!forceNew) {
|
|
@@ -2793,17 +2817,9 @@
|
|
|
2793
2817
|
}
|
|
2794
2818
|
};
|
|
2795
2819
|
try {
|
|
2796
|
-
|
|
2797
|
-
if (typeof anyConn.addEventListener === "function") {
|
|
2798
|
-
anyConn.addEventListener("close", removeFromPool, {
|
|
2799
|
-
once: true,
|
|
2800
|
-
});
|
|
2801
|
-
}
|
|
2802
|
-
else if (typeof anyConn.once === "function") {
|
|
2803
|
-
anyConn.once("close", removeFromPool);
|
|
2804
|
-
}
|
|
2820
|
+
conn.addEventListener("close", removeFromPool, { once: true });
|
|
2805
2821
|
}
|
|
2806
|
-
catch (_b) { }
|
|
2822
|
+
catch ( /* ignore event listener registration errors */_b) { /* ignore event listener registration errors */ }
|
|
2807
2823
|
}
|
|
2808
2824
|
}
|
|
2809
2825
|
return [2 /*return*/, conn];
|
|
@@ -2841,12 +2857,11 @@
|
|
|
2841
2857
|
};
|
|
2842
2858
|
Libp2pGrpcClient.prototype.unaryCall = function (method_1, requestData_1) {
|
|
2843
2859
|
return __awaiter(this, arguments, void 0, function (method, requestData, timeout) {
|
|
2844
|
-
var stream, responseData, responseBuffer, responseDataExpectedLength, hpack, exitFlag, errMsg, isResponseComplete, connection, state, streamSlotAcquired, connectionKey_1, err_2, streamManager, streamId_1, writer_1,
|
|
2860
|
+
var stream, responseData, responseBuffer, responseDataExpectedLength, hpack, exitFlag, errMsg, isResponseComplete, connection, state, streamSlotAcquired, connectionKey_1, err_2, streamManager, streamId_1, writer_1, parser, preface, settingFrme, headerFrame, dataFrames, frameSendTimeout, _i, dataFrames_1, df, err_3;
|
|
2845
2861
|
var _this = this;
|
|
2846
|
-
var _b, _c;
|
|
2847
2862
|
if (timeout === void 0) { timeout = 30000; }
|
|
2848
|
-
return __generator(this, function (
|
|
2849
|
-
switch (
|
|
2863
|
+
return __generator(this, function (_b) {
|
|
2864
|
+
switch (_b.label) {
|
|
2850
2865
|
case 0:
|
|
2851
2866
|
stream = null;
|
|
2852
2867
|
responseData = null;
|
|
@@ -2859,26 +2874,26 @@
|
|
|
2859
2874
|
connection = null;
|
|
2860
2875
|
state = null;
|
|
2861
2876
|
streamSlotAcquired = false;
|
|
2862
|
-
|
|
2877
|
+
_b.label = 1;
|
|
2863
2878
|
case 1:
|
|
2864
|
-
|
|
2879
|
+
_b.trys.push([1, 23, 24, 27]);
|
|
2865
2880
|
return [4 /*yield*/, this.acquireConnection(false)];
|
|
2866
2881
|
case 2:
|
|
2867
2882
|
// const stream = await this.node.dialProtocol(this.peerAddr, this.protocol)
|
|
2868
|
-
connection =
|
|
2883
|
+
connection = _b.sent();
|
|
2869
2884
|
connectionKey_1 = this.peerAddr.toString();
|
|
2870
2885
|
state = this.getConnectionState(connection);
|
|
2871
|
-
|
|
2886
|
+
_b.label = 3;
|
|
2872
2887
|
case 3:
|
|
2873
|
-
|
|
2888
|
+
_b.trys.push([3, 5, , 6]);
|
|
2874
2889
|
return [4 /*yield*/, this.waitForStreamSlot(state, undefined, timeout)];
|
|
2875
2890
|
case 4:
|
|
2876
|
-
|
|
2891
|
+
_b.sent();
|
|
2877
2892
|
state.activeStreams += 1;
|
|
2878
2893
|
streamSlotAcquired = true;
|
|
2879
2894
|
return [3 /*break*/, 6];
|
|
2880
2895
|
case 5:
|
|
2881
|
-
err_2 =
|
|
2896
|
+
err_2 = _b.sent();
|
|
2882
2897
|
console.warn("[unaryCall] waiting for stream slot failed:", err_2);
|
|
2883
2898
|
throw err_2;
|
|
2884
2899
|
case 6: return [4 /*yield*/, connection.newStream(this.protocol, {
|
|
@@ -2886,25 +2901,25 @@
|
|
|
2886
2901
|
negotiateFully: false,
|
|
2887
2902
|
})];
|
|
2888
2903
|
case 7:
|
|
2889
|
-
stream =
|
|
2904
|
+
stream = _b.sent();
|
|
2890
2905
|
streamManager = this.getStreamManagerFor(connection);
|
|
2891
2906
|
return [4 /*yield*/, streamManager.getNextAppLevelStreamId()];
|
|
2892
2907
|
case 8:
|
|
2893
|
-
streamId_1 =
|
|
2908
|
+
streamId_1 = _b.sent();
|
|
2894
2909
|
writer_1 = new StreamWriter(stream, {
|
|
2895
2910
|
bufferSize: 16 * 1024 * 1024,
|
|
2896
2911
|
});
|
|
2897
2912
|
try {
|
|
2898
2913
|
writer_1.addEventListener("backpressure", function (e) {
|
|
2899
|
-
var d =
|
|
2914
|
+
var d = e.detail || {};
|
|
2900
2915
|
console.warn("[unary stream ".concat(streamId_1, "] backpressure current=").concat(d.currentSize, " avg=").concat(d.averageSize, " threshold=").concat(d.threshold));
|
|
2901
2916
|
});
|
|
2902
|
-
writer_1.addEventListener("drain", function (
|
|
2903
|
-
|
|
2917
|
+
writer_1.addEventListener("drain", function () {
|
|
2918
|
+
// drain event - no action needed
|
|
2904
2919
|
});
|
|
2905
2920
|
writer_1.addEventListener("stalled", function (e) {
|
|
2906
2921
|
var _a;
|
|
2907
|
-
var d =
|
|
2922
|
+
var d = e.detail || {};
|
|
2908
2923
|
console.warn("[unary stream ".concat(streamId_1, "] stalled queue=").concat(d.queueSize, " drained=").concat(d.drained, " since=").concat(d.sinceMs, "ms \u2014 sending PING"));
|
|
2909
2924
|
try {
|
|
2910
2925
|
var payload = new Uint8Array(8);
|
|
@@ -2912,13 +2927,12 @@
|
|
|
2912
2927
|
var ping = Http2Frame.createFrame(0x6, 0x0, 0, payload);
|
|
2913
2928
|
writer_1.write(ping);
|
|
2914
2929
|
}
|
|
2915
|
-
catch (_b) { }
|
|
2930
|
+
catch ( /* ignore ping write errors */_b) { /* ignore ping write errors */ }
|
|
2916
2931
|
});
|
|
2917
2932
|
}
|
|
2918
|
-
catch (
|
|
2919
|
-
|
|
2920
|
-
|
|
2921
|
-
var _a;
|
|
2933
|
+
catch ( /* ignore addEventListener errors */_c) { /* ignore addEventListener errors */ }
|
|
2934
|
+
parser = new HTTP2Parser(writer_1);
|
|
2935
|
+
parser.onGoaway = function (info) {
|
|
2922
2936
|
console.warn("[unaryCall] GOAWAY received from server", info);
|
|
2923
2937
|
_this.connectionPool.delete(connectionKey_1);
|
|
2924
2938
|
if (state) {
|
|
@@ -2927,13 +2941,13 @@
|
|
|
2927
2941
|
exitFlag = true;
|
|
2928
2942
|
errMsg = "GOAWAY received: code=".concat(info.errorCode);
|
|
2929
2943
|
try {
|
|
2930
|
-
|
|
2944
|
+
connection === null || connection === void 0 ? void 0 : connection.close();
|
|
2931
2945
|
}
|
|
2932
2946
|
catch (err) {
|
|
2933
2947
|
console.warn("Error closing connection after GOAWAY:", err);
|
|
2934
2948
|
}
|
|
2935
2949
|
};
|
|
2936
|
-
|
|
2950
|
+
parser.onSettingsParsed = function (settings) {
|
|
2937
2951
|
if (state &&
|
|
2938
2952
|
settings.maxConcurrentStreams !== undefined &&
|
|
2939
2953
|
settings.maxConcurrentStreams > 0) {
|
|
@@ -2941,10 +2955,10 @@
|
|
|
2941
2955
|
_this.notifyStreamSlotAvailable(state);
|
|
2942
2956
|
}
|
|
2943
2957
|
};
|
|
2944
|
-
|
|
2958
|
+
parser.registerOutboundStream(streamId_1);
|
|
2945
2959
|
responseDataExpectedLength = -1; // 重置期望长度
|
|
2946
2960
|
responseBuffer = []; // 重置缓冲区
|
|
2947
|
-
|
|
2961
|
+
parser.onData = function (payload, frameHeader) {
|
|
2948
2962
|
//接收数据
|
|
2949
2963
|
if (responseDataExpectedLength === -1) {
|
|
2950
2964
|
//grpc消息头部未读取
|
|
@@ -2952,7 +2966,6 @@
|
|
|
2952
2966
|
if (payload.length < 5) {
|
|
2953
2967
|
return;
|
|
2954
2968
|
}
|
|
2955
|
-
payload[0]; // 压缩标志
|
|
2956
2969
|
var lengthBytes = payload.slice(1, 5); // 消息长度的4字节
|
|
2957
2970
|
responseDataExpectedLength = new DataView(lengthBytes.buffer, lengthBytes.byteOffset).getUint32(0, false); // big-endian
|
|
2958
2971
|
if (responseDataExpectedLength < 0) {
|
|
@@ -3006,7 +3019,7 @@
|
|
|
3006
3019
|
isResponseComplete = true;
|
|
3007
3020
|
}
|
|
3008
3021
|
};
|
|
3009
|
-
|
|
3022
|
+
parser.onEnd = function () {
|
|
3010
3023
|
//接收结束
|
|
3011
3024
|
if (!isResponseComplete) {
|
|
3012
3025
|
isResponseComplete = true; // 设置响应完成标志
|
|
@@ -3027,12 +3040,12 @@
|
|
|
3027
3040
|
}
|
|
3028
3041
|
}
|
|
3029
3042
|
};
|
|
3030
|
-
|
|
3043
|
+
parser.onSettings = function () {
|
|
3031
3044
|
//接收settings,反馈ack
|
|
3032
3045
|
var ackSettingFrame = Http2Frame.createSettingsAckFrame();
|
|
3033
3046
|
writer_1.write(ackSettingFrame);
|
|
3034
3047
|
};
|
|
3035
|
-
|
|
3048
|
+
parser.onHeaders = function (headers) {
|
|
3036
3049
|
var plainHeaders = hpack.decodeHeaderFields(headers);
|
|
3037
3050
|
if (plainHeaders.get("grpc-status") === "0") ;
|
|
3038
3051
|
else if (plainHeaders.get("grpc-status") !== undefined) {
|
|
@@ -3041,7 +3054,7 @@
|
|
|
3041
3054
|
}
|
|
3042
3055
|
};
|
|
3043
3056
|
// 启动后台流处理,捕获任何异步错误
|
|
3044
|
-
|
|
3057
|
+
parser.processStream(stream).catch(function (error) {
|
|
3045
3058
|
console.error('Error in processStream:', error);
|
|
3046
3059
|
exitFlag = true;
|
|
3047
3060
|
if (!errMsg) {
|
|
@@ -3051,51 +3064,35 @@
|
|
|
3051
3064
|
preface = Http2Frame.createPreface();
|
|
3052
3065
|
return [4 /*yield*/, writer_1.write(preface)];
|
|
3053
3066
|
case 9:
|
|
3054
|
-
|
|
3067
|
+
_b.sent();
|
|
3055
3068
|
settingFrme = Http2Frame.createSettingsFrame();
|
|
3056
3069
|
return [4 /*yield*/, writer_1.write(settingFrme)];
|
|
3057
3070
|
case 10:
|
|
3058
|
-
|
|
3071
|
+
_b.sent();
|
|
3072
|
+
// 等待对端 SETTINGS 或 ACK,择一即可,避免偶发握手竞态
|
|
3059
3073
|
return [4 /*yield*/, Promise.race([
|
|
3060
|
-
(
|
|
3061
|
-
|
|
3062
|
-
switch (_a.label) {
|
|
3063
|
-
case 0: return [4 /*yield*/, parser_1.waitForPeerSettings(1000)];
|
|
3064
|
-
case 1:
|
|
3065
|
-
_a.sent();
|
|
3066
|
-
return [2 /*return*/];
|
|
3067
|
-
}
|
|
3068
|
-
});
|
|
3069
|
-
}); })(),
|
|
3070
|
-
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
3071
|
-
return __generator(this, function (_a) {
|
|
3072
|
-
switch (_a.label) {
|
|
3073
|
-
case 0: return [4 /*yield*/, parser_1.waitForSettingsAck()];
|
|
3074
|
-
case 1:
|
|
3075
|
-
_a.sent();
|
|
3076
|
-
return [2 /*return*/];
|
|
3077
|
-
}
|
|
3078
|
-
});
|
|
3079
|
-
}); })(),
|
|
3074
|
+
parser.waitForPeerSettings(1000),
|
|
3075
|
+
parser.waitForSettingsAck(),
|
|
3080
3076
|
new Promise(function (res) { return setTimeout(res, 300); }),
|
|
3081
3077
|
])];
|
|
3082
3078
|
case 11:
|
|
3083
|
-
|
|
3079
|
+
// 等待对端 SETTINGS 或 ACK,择一即可,避免偶发握手竞态
|
|
3080
|
+
_b.sent();
|
|
3084
3081
|
headerFrame = Http2Frame.createHeadersFrame(streamId_1, method, true, this.token);
|
|
3085
3082
|
return [4 /*yield*/, writer_1.write(headerFrame)];
|
|
3086
3083
|
case 12:
|
|
3087
|
-
|
|
3084
|
+
_b.sent();
|
|
3088
3085
|
dataFrames = Http2Frame.createDataFrames(streamId_1, requestData, true);
|
|
3089
3086
|
frameSendTimeout = timeout > 0 ? timeout : DEFAULT_SEND_WINDOW_TIMEOUT;
|
|
3090
3087
|
_i = 0, dataFrames_1 = dataFrames;
|
|
3091
|
-
|
|
3088
|
+
_b.label = 13;
|
|
3092
3089
|
case 13:
|
|
3093
3090
|
if (!(_i < dataFrames_1.length)) return [3 /*break*/, 16];
|
|
3094
3091
|
df = dataFrames_1[_i];
|
|
3095
|
-
return [4 /*yield*/, this.sendFrameWithFlowControl(
|
|
3092
|
+
return [4 /*yield*/, this.sendFrameWithFlowControl(parser, streamId_1, df, writer_1, undefined, frameSendTimeout)];
|
|
3096
3093
|
case 14:
|
|
3097
|
-
|
|
3098
|
-
|
|
3094
|
+
_b.sent();
|
|
3095
|
+
_b.label = 15;
|
|
3099
3096
|
case 15:
|
|
3100
3097
|
_i++;
|
|
3101
3098
|
return [3 /*break*/, 13];
|
|
@@ -3119,31 +3116,31 @@
|
|
|
3119
3116
|
})];
|
|
3120
3117
|
case 17:
|
|
3121
3118
|
// 等待responseData 不为空,或超时
|
|
3122
|
-
|
|
3123
|
-
|
|
3119
|
+
_b.sent();
|
|
3120
|
+
_b.label = 18;
|
|
3124
3121
|
case 18:
|
|
3125
|
-
|
|
3126
|
-
return [4 /*yield*/,
|
|
3122
|
+
_b.trys.push([18, 20, , 21]);
|
|
3123
|
+
return [4 /*yield*/, writer_1.flush(timeout)];
|
|
3127
3124
|
case 19:
|
|
3128
|
-
|
|
3125
|
+
_b.sent();
|
|
3129
3126
|
return [3 /*break*/, 21];
|
|
3130
3127
|
case 20:
|
|
3131
|
-
|
|
3128
|
+
_b.sent();
|
|
3132
3129
|
return [3 /*break*/, 21];
|
|
3133
3130
|
case 21: return [4 /*yield*/, writer_1.end()];
|
|
3134
3131
|
case 22:
|
|
3135
|
-
|
|
3132
|
+
_b.sent();
|
|
3136
3133
|
return [3 /*break*/, 27];
|
|
3137
3134
|
case 23:
|
|
3138
|
-
err_3 =
|
|
3135
|
+
err_3 = _b.sent();
|
|
3139
3136
|
console.error("unaryCall error:", err_3);
|
|
3140
3137
|
throw err_3;
|
|
3141
3138
|
case 24:
|
|
3142
3139
|
if (!stream) return [3 /*break*/, 26];
|
|
3143
3140
|
return [4 /*yield*/, stream.close()];
|
|
3144
3141
|
case 25:
|
|
3145
|
-
|
|
3146
|
-
|
|
3142
|
+
_b.sent();
|
|
3143
|
+
_b.label = 26;
|
|
3147
3144
|
case 26:
|
|
3148
3145
|
if (streamSlotAcquired && state) {
|
|
3149
3146
|
state.activeStreams = Math.max(0, state.activeStreams - 1);
|
|
@@ -3225,12 +3222,12 @@
|
|
|
3225
3222
|
}, timeout);
|
|
3226
3223
|
});
|
|
3227
3224
|
operationPromise = (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
3228
|
-
var messageBuffer, expectedMessageLength, hpack, connection, connectionKey, state, streamSlotAcquired, err_4, err_5, streamManager, streamId_2, writer_2,
|
|
3225
|
+
var messageBuffer, expectedMessageLength, hpack, connection, connectionKey, state, streamSlotAcquired, err_4, err_5, streamManager, streamId_2, writer_2, parser_1, sendWindowTimeout_1, writeFrame_1, writeDataFrames_1, preface, settingFrame, headerFrame, dfs, dfs0, batchSize_1, processingQueue_1, isProcessing_1, processNextBatch_1, addToQueue_1, _a, _b, _c, chunkOrChunks, chunksToProcess, addPromises, e_1_1, error_2, remainingQueue, queueWaitStart, maxQueueWaitMs, remainingQueue, finalFrame, err_6, err_7, conns, _i, conns_1, c;
|
|
3229
3226
|
var _this = this;
|
|
3230
3227
|
var _g, e_1, _h, _j;
|
|
3231
|
-
var _k, _l, _m
|
|
3232
|
-
return __generator(this, function (
|
|
3233
|
-
switch (
|
|
3228
|
+
var _k, _l, _m;
|
|
3229
|
+
return __generator(this, function (_o) {
|
|
3230
|
+
switch (_o.label) {
|
|
3234
3231
|
case 0:
|
|
3235
3232
|
messageBuffer = new Uint8Array(0);
|
|
3236
3233
|
expectedMessageLength = -1;
|
|
@@ -3239,44 +3236,44 @@
|
|
|
3239
3236
|
connectionKey = null;
|
|
3240
3237
|
state = null;
|
|
3241
3238
|
streamSlotAcquired = false;
|
|
3242
|
-
|
|
3239
|
+
_o.label = 1;
|
|
3243
3240
|
case 1:
|
|
3244
|
-
|
|
3241
|
+
_o.trys.push([1, 49, 50, 64]);
|
|
3245
3242
|
// 检查是否已经中止
|
|
3246
3243
|
if (internalController.signal.aborted) {
|
|
3247
3244
|
throw new Error("Operation aborted");
|
|
3248
3245
|
}
|
|
3249
3246
|
if (!(options === null || options === void 0 ? void 0 : options.freshConnection)) return [3 /*break*/, 5];
|
|
3250
|
-
|
|
3247
|
+
_o.label = 2;
|
|
3251
3248
|
case 2:
|
|
3252
|
-
|
|
3249
|
+
_o.trys.push([2, 4, , 5]);
|
|
3253
3250
|
this.connectionPool.delete(this.peerAddr.toString());
|
|
3254
|
-
return [4 /*yield*/,
|
|
3251
|
+
return [4 /*yield*/, this.node.hangUp(this.peerAddr)];
|
|
3255
3252
|
case 3:
|
|
3256
|
-
|
|
3253
|
+
_o.sent();
|
|
3257
3254
|
console.warn("[Call] hangUp existing connection before dialing due to freshConnection=true");
|
|
3258
3255
|
return [3 /*break*/, 5];
|
|
3259
3256
|
case 4:
|
|
3260
|
-
err_4 =
|
|
3257
|
+
err_4 = _o.sent();
|
|
3261
3258
|
console.warn("[Call] hangUp failed or not supported, proceeding to dial", err_4);
|
|
3262
3259
|
return [3 /*break*/, 5];
|
|
3263
3260
|
case 5: return [4 /*yield*/, this.acquireConnection(Boolean(options === null || options === void 0 ? void 0 : options.freshConnection))];
|
|
3264
3261
|
case 6:
|
|
3265
|
-
connection =
|
|
3262
|
+
connection = _o.sent();
|
|
3266
3263
|
connectionKey = this.peerAddr.toString();
|
|
3267
3264
|
state = this.getConnectionState(connection);
|
|
3268
3265
|
if (!state) return [3 /*break*/, 10];
|
|
3269
|
-
|
|
3266
|
+
_o.label = 7;
|
|
3270
3267
|
case 7:
|
|
3271
|
-
|
|
3268
|
+
_o.trys.push([7, 9, , 10]);
|
|
3272
3269
|
return [4 /*yield*/, this.waitForStreamSlot(state, internalController.signal, timeout)];
|
|
3273
3270
|
case 8:
|
|
3274
|
-
|
|
3271
|
+
_o.sent();
|
|
3275
3272
|
state.activeStreams += 1;
|
|
3276
3273
|
streamSlotAcquired = true;
|
|
3277
3274
|
return [3 /*break*/, 10];
|
|
3278
3275
|
case 9:
|
|
3279
|
-
err_5 =
|
|
3276
|
+
err_5 = _o.sent();
|
|
3280
3277
|
console.warn("[Call] waiting for stream slot failed:", err_5);
|
|
3281
3278
|
throw err_5;
|
|
3282
3279
|
case 10: return [4 /*yield*/, connection.newStream(this.protocol, {
|
|
@@ -3285,25 +3282,25 @@
|
|
|
3285
3282
|
negotiateFully: false,
|
|
3286
3283
|
})];
|
|
3287
3284
|
case 11:
|
|
3288
|
-
stream =
|
|
3285
|
+
stream = _o.sent();
|
|
3289
3286
|
streamManager = this.getStreamManagerFor(connection);
|
|
3290
3287
|
return [4 /*yield*/, streamManager.getNextAppLevelStreamId()];
|
|
3291
3288
|
case 12:
|
|
3292
|
-
streamId_2 =
|
|
3289
|
+
streamId_2 = _o.sent();
|
|
3293
3290
|
writer_2 = new StreamWriter(stream, {
|
|
3294
3291
|
bufferSize: 16 * 1024 * 1024,
|
|
3295
3292
|
});
|
|
3296
3293
|
try {
|
|
3297
3294
|
writer_2.addEventListener("backpressure", function (e) {
|
|
3298
|
-
var d =
|
|
3295
|
+
var d = e.detail || {};
|
|
3299
3296
|
console.warn("[stream ".concat(streamId_2, "] backpressure current=").concat(d.currentSize, " avg=").concat(d.averageSize, " threshold=").concat(d.threshold));
|
|
3300
3297
|
});
|
|
3301
|
-
writer_2.addEventListener("drain", function (
|
|
3302
|
-
|
|
3298
|
+
writer_2.addEventListener("drain", function () {
|
|
3299
|
+
// drain event - no action needed
|
|
3303
3300
|
});
|
|
3304
3301
|
writer_2.addEventListener("stalled", function (e) {
|
|
3305
3302
|
var _a;
|
|
3306
|
-
var d =
|
|
3303
|
+
var d = e.detail || {};
|
|
3307
3304
|
console.warn("[stream ".concat(streamId_2, "] stalled queue=").concat(d.queueSize, " drained=").concat(d.drained, " since=").concat(d.sinceMs, "ms \u2014 sending PING"));
|
|
3308
3305
|
try {
|
|
3309
3306
|
var payload = new Uint8Array(8);
|
|
@@ -3311,15 +3308,14 @@
|
|
|
3311
3308
|
var ping = Http2Frame.createFrame(0x6, 0x0, 0, payload);
|
|
3312
3309
|
writer_2.write(ping);
|
|
3313
3310
|
}
|
|
3314
|
-
catch ( /*
|
|
3311
|
+
catch ( /* ignore ping write errors */_b) { /* ignore ping write errors */ }
|
|
3315
3312
|
});
|
|
3316
3313
|
}
|
|
3317
|
-
catch ( /*
|
|
3318
|
-
|
|
3314
|
+
catch ( /* ignore addEventListener errors */_p) { /* ignore addEventListener errors */ }
|
|
3315
|
+
parser_1 = new HTTP2Parser(writer_2, {
|
|
3319
3316
|
compatibilityMode: !useFlowControl,
|
|
3320
3317
|
});
|
|
3321
|
-
|
|
3322
|
-
var _a;
|
|
3318
|
+
parser_1.onGoaway = function (info) {
|
|
3323
3319
|
console.warn("[Call] GOAWAY received from server", info);
|
|
3324
3320
|
if (connectionKey) {
|
|
3325
3321
|
_this.connectionPool.delete(connectionKey);
|
|
@@ -3332,13 +3328,13 @@
|
|
|
3332
3328
|
}
|
|
3333
3329
|
internalController.abort();
|
|
3334
3330
|
try {
|
|
3335
|
-
|
|
3331
|
+
connection === null || connection === void 0 ? void 0 : connection.close();
|
|
3336
3332
|
}
|
|
3337
3333
|
catch (err) {
|
|
3338
3334
|
console.warn("Error closing connection after GOAWAY:", err);
|
|
3339
3335
|
}
|
|
3340
3336
|
};
|
|
3341
|
-
|
|
3337
|
+
parser_1.onSettingsParsed = function (settings) {
|
|
3342
3338
|
if (state &&
|
|
3343
3339
|
settings.maxConcurrentStreams !== undefined &&
|
|
3344
3340
|
settings.maxConcurrentStreams > 0) {
|
|
@@ -3347,7 +3343,7 @@
|
|
|
3347
3343
|
}
|
|
3348
3344
|
};
|
|
3349
3345
|
if (useFlowControl) {
|
|
3350
|
-
|
|
3346
|
+
parser_1.registerOutboundStream(streamId_2);
|
|
3351
3347
|
}
|
|
3352
3348
|
sendWindowTimeout_1 = timeout > 0 ? timeout : DEFAULT_SEND_WINDOW_TIMEOUT;
|
|
3353
3349
|
writeFrame_1 = function (frame) { return __awaiter(_this, void 0, void 0, function () {
|
|
@@ -3355,7 +3351,7 @@
|
|
|
3355
3351
|
switch (_a.label) {
|
|
3356
3352
|
case 0:
|
|
3357
3353
|
if (!useFlowControl) return [3 /*break*/, 2];
|
|
3358
|
-
return [4 /*yield*/, this.sendFrameWithFlowControl(
|
|
3354
|
+
return [4 /*yield*/, this.sendFrameWithFlowControl(parser_1, streamId_2, frame, writer_2, internalController.signal, sendWindowTimeout_1)];
|
|
3359
3355
|
case 1:
|
|
3360
3356
|
_a.sent();
|
|
3361
3357
|
return [3 /*break*/, 4];
|
|
@@ -3393,8 +3389,8 @@
|
|
|
3393
3389
|
});
|
|
3394
3390
|
}); };
|
|
3395
3391
|
// 在各个回调中检查是否已中止
|
|
3396
|
-
|
|
3397
|
-
var newBuffer,
|
|
3392
|
+
parser_1.onData = function (payload) { return __awaiter(_this, void 0, void 0, function () {
|
|
3393
|
+
var newBuffer, lengthBytes, completeMessage;
|
|
3398
3394
|
return __generator(this, function (_a) {
|
|
3399
3395
|
// 检查是否已中止
|
|
3400
3396
|
if (internalController.signal.aborted) {
|
|
@@ -3413,7 +3409,6 @@
|
|
|
3413
3409
|
}
|
|
3414
3410
|
// 如果还没有读取消息长度,且缓冲区有足够数据
|
|
3415
3411
|
if (expectedMessageLength === -1 && messageBuffer.length >= 5) {
|
|
3416
|
-
compressionFlag = messageBuffer[0];
|
|
3417
3412
|
lengthBytes = messageBuffer.slice(1, 5);
|
|
3418
3413
|
expectedMessageLength = new DataView(lengthBytes.buffer, lengthBytes.byteOffset).getUint32(0, false); // big-endian
|
|
3419
3414
|
}
|
|
@@ -3444,14 +3439,14 @@
|
|
|
3444
3439
|
return [2 /*return*/];
|
|
3445
3440
|
});
|
|
3446
3441
|
}); };
|
|
3447
|
-
|
|
3442
|
+
parser_1.onSettings = function () {
|
|
3448
3443
|
// 检查是否已中止
|
|
3449
3444
|
if (internalController.signal.aborted)
|
|
3450
3445
|
return;
|
|
3451
3446
|
var ackSettingFrame = Http2Frame.createSettingsAckFrame();
|
|
3452
3447
|
writer_2.write(ackSettingFrame);
|
|
3453
3448
|
};
|
|
3454
|
-
|
|
3449
|
+
parser_1.onHeaders = function (headers) {
|
|
3455
3450
|
// 检查是否已中止
|
|
3456
3451
|
if (internalController.signal.aborted)
|
|
3457
3452
|
return;
|
|
@@ -3469,7 +3464,7 @@
|
|
|
3469
3464
|
}
|
|
3470
3465
|
};
|
|
3471
3466
|
// 启动后台流处理
|
|
3472
|
-
|
|
3467
|
+
parser_1.processStream(stream).catch(function (error) {
|
|
3473
3468
|
console.error('Error in processStream:', error);
|
|
3474
3469
|
if (onErrorCallback) {
|
|
3475
3470
|
onErrorCallback(error);
|
|
@@ -3482,7 +3477,7 @@
|
|
|
3482
3477
|
preface = Http2Frame.createPreface();
|
|
3483
3478
|
return [4 /*yield*/, writer_2.write(preface)];
|
|
3484
3479
|
case 13:
|
|
3485
|
-
|
|
3480
|
+
_o.sent();
|
|
3486
3481
|
// 检查是否已中止
|
|
3487
3482
|
if (internalController.signal.aborted) {
|
|
3488
3483
|
throw new Error("Operation aborted");
|
|
@@ -3490,36 +3485,18 @@
|
|
|
3490
3485
|
settingFrame = Http2Frame.createSettingsFrame();
|
|
3491
3486
|
return [4 /*yield*/, writer_2.write(settingFrame)];
|
|
3492
3487
|
case 14:
|
|
3493
|
-
|
|
3488
|
+
_o.sent();
|
|
3494
3489
|
// 检查是否已中止
|
|
3495
3490
|
if (internalController.signal.aborted) {
|
|
3496
3491
|
throw new Error("Operation aborted");
|
|
3497
3492
|
}
|
|
3498
3493
|
return [4 /*yield*/, Promise.race([
|
|
3499
|
-
(
|
|
3500
|
-
|
|
3501
|
-
switch (_a.label) {
|
|
3502
|
-
case 0: return [4 /*yield*/, parser_2.waitForPeerSettings(1000)];
|
|
3503
|
-
case 1:
|
|
3504
|
-
_a.sent();
|
|
3505
|
-
return [2 /*return*/];
|
|
3506
|
-
}
|
|
3507
|
-
});
|
|
3508
|
-
}); })(),
|
|
3509
|
-
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
3510
|
-
return __generator(this, function (_a) {
|
|
3511
|
-
switch (_a.label) {
|
|
3512
|
-
case 0: return [4 /*yield*/, parser_2.waitForSettingsAck()];
|
|
3513
|
-
case 1:
|
|
3514
|
-
_a.sent();
|
|
3515
|
-
return [2 /*return*/];
|
|
3516
|
-
}
|
|
3517
|
-
});
|
|
3518
|
-
}); })(),
|
|
3494
|
+
parser_1.waitForPeerSettings(1000),
|
|
3495
|
+
parser_1.waitForSettingsAck(),
|
|
3519
3496
|
new Promise(function (res) { return setTimeout(res, 300); }),
|
|
3520
3497
|
])];
|
|
3521
3498
|
case 15:
|
|
3522
|
-
|
|
3499
|
+
_o.sent();
|
|
3523
3500
|
// 检查是否已中止
|
|
3524
3501
|
if (internalController.signal.aborted) {
|
|
3525
3502
|
throw new Error("Operation aborted");
|
|
@@ -3532,11 +3509,11 @@
|
|
|
3532
3509
|
if (!(mode === "unary" || mode === "server-streaming")) return [3 /*break*/, 18];
|
|
3533
3510
|
return [4 /*yield*/, writer_2.write(headerFrame)];
|
|
3534
3511
|
case 16:
|
|
3535
|
-
|
|
3512
|
+
_o.sent();
|
|
3536
3513
|
dfs = Http2Frame.createDataFrames(streamId_2, requestData, true);
|
|
3537
3514
|
return [4 /*yield*/, writeDataFrames_1(dfs)];
|
|
3538
3515
|
case 17:
|
|
3539
|
-
|
|
3516
|
+
_o.sent();
|
|
3540
3517
|
// 检查是否已中止
|
|
3541
3518
|
if (internalController.signal.aborted) {
|
|
3542
3519
|
throw new Error("Operation aborted");
|
|
@@ -3547,7 +3524,7 @@
|
|
|
3547
3524
|
dataSourceCallback)) return [3 /*break*/, 47];
|
|
3548
3525
|
return [4 /*yield*/, writer_2.write(headerFrame)];
|
|
3549
3526
|
case 19:
|
|
3550
|
-
|
|
3527
|
+
_o.sent();
|
|
3551
3528
|
// 检查是否已中止
|
|
3552
3529
|
if (internalController.signal.aborted) {
|
|
3553
3530
|
throw new Error("Operation aborted");
|
|
@@ -3556,11 +3533,10 @@
|
|
|
3556
3533
|
dfs0 = Http2Frame.createDataFrames(streamId_2, requestData, false);
|
|
3557
3534
|
return [4 /*yield*/, writeDataFrames_1(dfs0)];
|
|
3558
3535
|
case 20:
|
|
3559
|
-
|
|
3560
|
-
|
|
3536
|
+
_o.sent();
|
|
3537
|
+
_o.label = 21;
|
|
3561
3538
|
case 21:
|
|
3562
3539
|
batchSize_1 = (options === null || options === void 0 ? void 0 : options.batchSize) || 10;
|
|
3563
|
-
(options === null || options === void 0 ? void 0 : options.maxBatchWaitMs) || 50;
|
|
3564
3540
|
processingQueue_1 = [];
|
|
3565
3541
|
isProcessing_1 = false;
|
|
3566
3542
|
processNextBatch_1 = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
@@ -3649,17 +3625,17 @@
|
|
|
3649
3625
|
}
|
|
3650
3626
|
});
|
|
3651
3627
|
};
|
|
3652
|
-
|
|
3628
|
+
_o.label = 22;
|
|
3653
3629
|
case 22:
|
|
3654
|
-
|
|
3655
|
-
|
|
3630
|
+
_o.trys.push([22, 36, , 37]);
|
|
3631
|
+
_o.label = 23;
|
|
3656
3632
|
case 23:
|
|
3657
|
-
|
|
3633
|
+
_o.trys.push([23, 29, 30, 35]);
|
|
3658
3634
|
_a = true, _b = __asyncValues(dataSourceCallback());
|
|
3659
|
-
|
|
3635
|
+
_o.label = 24;
|
|
3660
3636
|
case 24: return [4 /*yield*/, _b.next()];
|
|
3661
3637
|
case 25:
|
|
3662
|
-
if (!(_c =
|
|
3638
|
+
if (!(_c = _o.sent(), _g = _c.done, !_g)) return [3 /*break*/, 28];
|
|
3663
3639
|
_j = _c.value;
|
|
3664
3640
|
_a = false;
|
|
3665
3641
|
chunkOrChunks = _j;
|
|
@@ -3677,23 +3653,23 @@
|
|
|
3677
3653
|
return [4 /*yield*/, Promise.all(addPromises)];
|
|
3678
3654
|
case 26:
|
|
3679
3655
|
// 等待当前批次的chunks被添加到队列(不等待处理完成)
|
|
3680
|
-
|
|
3681
|
-
|
|
3656
|
+
_o.sent();
|
|
3657
|
+
_o.label = 27;
|
|
3682
3658
|
case 27:
|
|
3683
3659
|
_a = true;
|
|
3684
3660
|
return [3 /*break*/, 24];
|
|
3685
3661
|
case 28: return [3 /*break*/, 35];
|
|
3686
3662
|
case 29:
|
|
3687
|
-
e_1_1 =
|
|
3663
|
+
e_1_1 = _o.sent();
|
|
3688
3664
|
e_1 = { error: e_1_1 };
|
|
3689
3665
|
return [3 /*break*/, 35];
|
|
3690
3666
|
case 30:
|
|
3691
|
-
|
|
3667
|
+
_o.trys.push([30, , 33, 34]);
|
|
3692
3668
|
if (!(!_a && !_g && (_h = _b.return))) return [3 /*break*/, 32];
|
|
3693
3669
|
return [4 /*yield*/, _h.call(_b)];
|
|
3694
3670
|
case 31:
|
|
3695
|
-
|
|
3696
|
-
|
|
3671
|
+
_o.sent();
|
|
3672
|
+
_o.label = 32;
|
|
3697
3673
|
case 32: return [3 /*break*/, 34];
|
|
3698
3674
|
case 33:
|
|
3699
3675
|
if (e_1) throw e_1.error;
|
|
@@ -3701,7 +3677,7 @@
|
|
|
3701
3677
|
case 34: return [7 /*endfinally*/];
|
|
3702
3678
|
case 35: return [3 /*break*/, 37];
|
|
3703
3679
|
case 36:
|
|
3704
|
-
error_2 =
|
|
3680
|
+
error_2 = _o.sent();
|
|
3705
3681
|
remainingQueue = processingQueue_1.splice(0);
|
|
3706
3682
|
remainingQueue.forEach(function (item) {
|
|
3707
3683
|
try {
|
|
@@ -3715,7 +3691,7 @@
|
|
|
3715
3691
|
case 37:
|
|
3716
3692
|
queueWaitStart = Date.now();
|
|
3717
3693
|
maxQueueWaitMs = timeout;
|
|
3718
|
-
|
|
3694
|
+
_o.label = 38;
|
|
3719
3695
|
case 38:
|
|
3720
3696
|
if (!(processingQueue_1.length > 0 || isProcessing_1)) return [3 /*break*/, 40];
|
|
3721
3697
|
if (internalController.signal.aborted) {
|
|
@@ -3736,7 +3712,7 @@
|
|
|
3736
3712
|
}
|
|
3737
3713
|
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 10); })];
|
|
3738
3714
|
case 39:
|
|
3739
|
-
|
|
3715
|
+
_o.sent();
|
|
3740
3716
|
return [3 /*break*/, 38];
|
|
3741
3717
|
case 40:
|
|
3742
3718
|
// 检查是否已中止
|
|
@@ -3746,35 +3722,35 @@
|
|
|
3746
3722
|
finalFrame = Http2Frame.createDataFrame(streamId_2, new Uint8Array(), true);
|
|
3747
3723
|
return [4 /*yield*/, writeFrame_1(finalFrame)];
|
|
3748
3724
|
case 41:
|
|
3749
|
-
|
|
3750
|
-
|
|
3725
|
+
_o.sent();
|
|
3726
|
+
_o.label = 42;
|
|
3751
3727
|
case 42:
|
|
3752
|
-
|
|
3753
|
-
return [4 /*yield*/,
|
|
3728
|
+
_o.trys.push([42, 44, , 45]);
|
|
3729
|
+
return [4 /*yield*/, writer_2.flush(timeout)];
|
|
3754
3730
|
case 43:
|
|
3755
|
-
|
|
3731
|
+
_o.sent();
|
|
3756
3732
|
return [3 /*break*/, 45];
|
|
3757
3733
|
case 44:
|
|
3758
|
-
|
|
3734
|
+
_o.sent();
|
|
3759
3735
|
return [3 /*break*/, 45];
|
|
3760
3736
|
case 45: return [4 /*yield*/, writer_2.end()];
|
|
3761
3737
|
case 46:
|
|
3762
|
-
|
|
3763
|
-
|
|
3738
|
+
_o.sent();
|
|
3739
|
+
_o.label = 47;
|
|
3764
3740
|
case 47:
|
|
3765
3741
|
// 检查是否已中止
|
|
3766
3742
|
if (internalController.signal.aborted) {
|
|
3767
3743
|
throw new Error("Operation aborted");
|
|
3768
3744
|
}
|
|
3769
|
-
return [4 /*yield*/,
|
|
3745
|
+
return [4 /*yield*/, parser_1.waitForEndOfStream(0)];
|
|
3770
3746
|
case 48:
|
|
3771
|
-
|
|
3747
|
+
_o.sent();
|
|
3772
3748
|
if (onEndCallback) {
|
|
3773
3749
|
onEndCallback();
|
|
3774
3750
|
}
|
|
3775
3751
|
return [3 /*break*/, 64];
|
|
3776
3752
|
case 49:
|
|
3777
|
-
err_6 =
|
|
3753
|
+
err_6 = _o.sent();
|
|
3778
3754
|
// 如果是由于取消导致的错误,使用特定的错误消息
|
|
3779
3755
|
if (internalController.signal.aborted &&
|
|
3780
3756
|
err_6 instanceof Error &&
|
|
@@ -3798,44 +3774,44 @@
|
|
|
3798
3774
|
case 50:
|
|
3799
3775
|
clearTimeout(timeoutHandle);
|
|
3800
3776
|
if (!stream) return [3 /*break*/, 54];
|
|
3801
|
-
|
|
3777
|
+
_o.label = 51;
|
|
3802
3778
|
case 51:
|
|
3803
|
-
|
|
3779
|
+
_o.trys.push([51, 53, , 54]);
|
|
3804
3780
|
return [4 /*yield*/, stream.close()];
|
|
3805
3781
|
case 52:
|
|
3806
|
-
|
|
3782
|
+
_o.sent();
|
|
3807
3783
|
return [3 /*break*/, 54];
|
|
3808
3784
|
case 53:
|
|
3809
|
-
err_7 =
|
|
3785
|
+
err_7 = _o.sent();
|
|
3810
3786
|
console.error("Error closing stream:", err_7);
|
|
3811
3787
|
return [3 /*break*/, 54];
|
|
3812
3788
|
case 54:
|
|
3813
3789
|
if (!(options === null || options === void 0 ? void 0 : options.freshConnection)) return [3 /*break*/, 63];
|
|
3814
|
-
|
|
3790
|
+
_o.label = 55;
|
|
3815
3791
|
case 55:
|
|
3816
|
-
|
|
3817
|
-
conns = ((
|
|
3792
|
+
_o.trys.push([55, 62, , 63]);
|
|
3793
|
+
conns = ((_l = (_k = this.node).getConnections) === null || _l === void 0 ? void 0 : _l.call(_k, this.peerAddr)) || [];
|
|
3818
3794
|
_i = 0, conns_1 = conns;
|
|
3819
|
-
|
|
3795
|
+
_o.label = 56;
|
|
3820
3796
|
case 56:
|
|
3821
3797
|
if (!(_i < conns_1.length)) return [3 /*break*/, 61];
|
|
3822
3798
|
c = conns_1[_i];
|
|
3823
|
-
|
|
3799
|
+
_o.label = 57;
|
|
3824
3800
|
case 57:
|
|
3825
|
-
|
|
3826
|
-
return [4 /*yield*/, ((
|
|
3801
|
+
_o.trys.push([57, 59, , 60]);
|
|
3802
|
+
return [4 /*yield*/, ((_m = c.close) === null || _m === void 0 ? void 0 : _m.call(c))];
|
|
3827
3803
|
case 58:
|
|
3828
|
-
|
|
3804
|
+
_o.sent();
|
|
3829
3805
|
return [3 /*break*/, 60];
|
|
3830
3806
|
case 59:
|
|
3831
|
-
|
|
3807
|
+
_o.sent();
|
|
3832
3808
|
return [3 /*break*/, 60];
|
|
3833
3809
|
case 60:
|
|
3834
3810
|
_i++;
|
|
3835
3811
|
return [3 /*break*/, 56];
|
|
3836
3812
|
case 61: return [3 /*break*/, 63];
|
|
3837
3813
|
case 62:
|
|
3838
|
-
|
|
3814
|
+
_o.sent();
|
|
3839
3815
|
return [3 /*break*/, 63];
|
|
3840
3816
|
case 63:
|
|
3841
3817
|
if (streamSlotAcquired && state) {
|