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 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") || "gRPC call failed";
3700
+ var errMsg = decodeGrpcMessage(plainHeaders.get("grpc-message") || "") ||
3701
+ "gRPC call failed";
3663
3702
  // reportError 统一完成:标记已报错 + abort + 触发回调(幂等,不会重复触发)
3664
3703
  reportError(new Error(errMsg));
3665
3704
  }