@protobuf-ts/grpc-backend
Version:
gRPC backend for servers generated by the protoc plugin "protobuf-ts"
74 lines (73 loc) • 2.02 kB
JavaScript
import * as grpc from "@grpc/grpc-js";
import { listEnumValues } from "@protobuf-ts/runtime";
/**
* Is the given argument a ServiceError as provided
* by @grpc/grpc-js?
*
* A ServiceError is a specialized Error object, extended
* with the properties "code", "details" and "metadata".
*/
export function isServiceError(arg) {
if (typeof arg != 'object' || !arg) {
return false;
}
return typeof arg.code == 'number'
&& typeof arg.details == 'string'
&& typeof arg.metadata == 'object'
&& typeof arg.name == 'string'
&& typeof arg.message == 'string';
}
/**
* Parse a gRPC status code from a string.
*/
export function rpcCodeToGrpc(from) {
let v = listEnumValues(grpc.status).find(v => v.name === from);
return v ? v.number : undefined;
}
/**
* Convert our RPC Metadata to gRPC Metadata.
*/
export function metadataToGrpc(from, base) {
const to = base !== null && base !== void 0 ? base : new grpc.Metadata();
const decode = (k, v) => k.endsWith('-bin') ? Buffer.from(v, 'base64') : v;
for (let k of Object.keys(from)) {
let v = from[k];
if (typeof v == 'string') {
to.add(k, decode(k, v));
}
else if (Array.isArray(v)) {
for (let vv of v) {
to.add(k, decode(k, vv));
}
}
}
return to;
}
/**
* Convert gRPC Metadata to our RPC Metadata.
*/
export function metadataFromGrpc(from) {
const to = {};
const h2 = from.toHttp2Headers();
for (let k of Object.keys(h2)) {
let v = h2[k];
if (v === undefined) {
continue;
}
if (typeof v === "number") {
to[k] = v.toString();
}
else if (typeof v === "string") {
to[k] = v;
}
else if (Array.isArray(v)) {
if (v.length === 1) {
to[k] = v[0];
}
else if (v.length > 1) {
to[k] = v;
}
}
}
return to;
}