export function findTrailerError()

in packages/dubbo/src/protocol-grpc/trailer-status.ts [80:125]


export function findTrailerError(
  headerOrTrailer: Headers
): ConnectError | undefined {
  // TODO
  // let code: Code;
  // let message: string = "";

  // Prefer the protobuf-encoded data to the grpc-status header.
  const statusBytes = headerOrTrailer.get(headerStatusDetailsBin);
  if (statusBytes != null) {
    const status = decodeBinaryHeader(statusBytes, Status);
    if (status.code == 0) {
      return undefined;
    }
    const error = new ConnectError(
      status.message,
      status.code,
      headerOrTrailer
    );
    error.details = status.details.map((any) => ({
      type: any.typeUrl.substring(any.typeUrl.lastIndexOf("/") + 1),
      value: any.value,
    }));
    return error;
  }
  const grpcStatus = headerOrTrailer.get(headerGrpcStatus);
  if (grpcStatus != null) {
    if (grpcStatus === grpcStatusOk) {
      return undefined;
    }
    const code = parseInt(grpcStatus, 10);
    if (code in Code) {
      return new ConnectError(
        decodeURIComponent(headerOrTrailer.get(headerGrpcMessage) ?? ""),
        code,
        headerOrTrailer
      );
    }
    return new ConnectError(
      `invalid grpc-status: ${grpcStatus}`,
      Code.Internal,
      headerOrTrailer
    );
  }
  return undefined;
}