grpc-libp2p-client 0.0.42 → 0.0.43
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/grpc.js +41 -2
- 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 +39 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +39 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/stats.html +1 -1
- package/package.json +1 -1
- package/src/index.ts +42 -2
package/dist/grpc.js
CHANGED
|
@@ -2707,6 +2707,44 @@
|
|
|
2707
2707
|
|
|
2708
2708
|
var dialTimeout = 5000; // 5秒
|
|
2709
2709
|
var DEFAULT_SEND_WINDOW_TIMEOUT = 15000;
|
|
2710
|
+
/**
|
|
2711
|
+
* 解码 gRPC `grpc-message` trailer。
|
|
2712
|
+
* 按 gRPC 协议规范,该字段使用百分号编码(percent-encoding)承载 UTF-8 字节,
|
|
2713
|
+
* 非 ASCII 字符(如中文错误信息)会以 %XX 形式出现。直接透传会导致上层拿到
|
|
2714
|
+
* 形如 "%E8%AF%B7..." 的乱码,因此在读取时统一解码为可读文本。
|
|
2715
|
+
* 解码失败时回退原始字符串,保证健壮性。
|
|
2716
|
+
*/
|
|
2717
|
+
function decodeGrpcMessage(message) {
|
|
2718
|
+
if (!message || message.indexOf("%") === -1) {
|
|
2719
|
+
return message;
|
|
2720
|
+
}
|
|
2721
|
+
try {
|
|
2722
|
+
var isHex = function (c) {
|
|
2723
|
+
return (c >= "0" && c <= "9") ||
|
|
2724
|
+
(c >= "a" && c <= "f") ||
|
|
2725
|
+
(c >= "A" && c <= "F");
|
|
2726
|
+
};
|
|
2727
|
+
var bytes = [];
|
|
2728
|
+
for (var i = 0; i < message.length; i++) {
|
|
2729
|
+
var ch = message[i];
|
|
2730
|
+
// 仅当 % 后紧跟两个合法十六进制字符时才按 percent-encoding 解码,
|
|
2731
|
+
// 避免 parseInt 对 "-d" 等非法序列的符号/部分解析导致字节错乱。
|
|
2732
|
+
if (ch === "%" &&
|
|
2733
|
+
i + 2 < message.length &&
|
|
2734
|
+
isHex(message[i + 1]) &&
|
|
2735
|
+
isHex(message[i + 2])) {
|
|
2736
|
+
bytes.push(parseInt(message.substr(i + 1, 2), 16));
|
|
2737
|
+
i += 2;
|
|
2738
|
+
continue;
|
|
2739
|
+
}
|
|
2740
|
+
bytes.push(message.charCodeAt(i) & 0xff);
|
|
2741
|
+
}
|
|
2742
|
+
return new TextDecoder("utf-8").decode(new Uint8Array(bytes));
|
|
2743
|
+
}
|
|
2744
|
+
catch (_a) {
|
|
2745
|
+
return message;
|
|
2746
|
+
}
|
|
2747
|
+
}
|
|
2710
2748
|
var StreamManager = /** @class */ (function () {
|
|
2711
2749
|
function StreamManager() {
|
|
2712
2750
|
this.streamIdLock = Promise.resolve();
|
|
@@ -3220,7 +3258,7 @@
|
|
|
3220
3258
|
if (plainHeaders.get("grpc-status") === "0") ;
|
|
3221
3259
|
else if (plainHeaders.get("grpc-status") !== undefined) {
|
|
3222
3260
|
exitFlag = true;
|
|
3223
|
-
errMsg = plainHeaders.get("grpc-message") || "gRPC call failed";
|
|
3261
|
+
errMsg = decodeGrpcMessage(plainHeaders.get("grpc-message") || "") || "gRPC call failed";
|
|
3224
3262
|
notifyResponseComplete === null || notifyResponseComplete === void 0 ? void 0 : notifyResponseComplete(); // 唤醒等待中的 Promise
|
|
3225
3263
|
}
|
|
3226
3264
|
};
|
|
@@ -3659,7 +3697,8 @@
|
|
|
3659
3697
|
var plainHeaders = hpack.decodeHeaderFields(headers);
|
|
3660
3698
|
if (plainHeaders.get("grpc-status") === "0") ;
|
|
3661
3699
|
else if (plainHeaders.get("grpc-status") !== undefined) {
|
|
3662
|
-
var errMsg = plainHeaders.get("grpc-message") || "
|
|
3700
|
+
var errMsg = decodeGrpcMessage(plainHeaders.get("grpc-message") || "") ||
|
|
3701
|
+
"gRPC call failed";
|
|
3663
3702
|
// reportError 统一完成:标记已报错 + abort + 触发回调(幂等,不会重复触发)
|
|
3664
3703
|
reportError(new Error(errMsg));
|
|
3665
3704
|
}
|