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;
}