UNPKG

nice-grpc

Version:

A Node.js gRPC library that is nice to you

99 lines (86 loc) 2.96 kB
import {CompatServiceDefinition, MethodDefinition, ServiceDefinition} from '.'; export type TsProtoServiceDefinition = { name: string; fullName: string; methods: { [method: string]: TsProtoMethodDefinition<any, any>; }; }; export type TsProtoMethodDefinition<Request, Response> = { name: string; requestType: TsProtoMessageType<Request>; requestStream: boolean; responseType: TsProtoMessageType<Response>; responseStream: boolean; options: { idempotencyLevel?: 'IDEMPOTENT' | 'NO_SIDE_EFFECTS'; _unknownFields?: {}; }; }; export type TsProtoMessageType<Message> = { encode(message: Message): ProtobufJsWriter; decode(input: Uint8Array): Message; fromPartial?(object: unknown): Message; }; export type ProtobufJsWriter = { finish(): Uint8Array; }; export type TsProtoMessageIn<Type extends TsProtoMessageType<any>> = Type['fromPartial'] extends Function ? Parameters<Type['fromPartial']>[0] : Type extends TsProtoMessageType<infer Message> ? Message : never; export type FromTsProtoServiceDefinition< Service extends TsProtoServiceDefinition, > = { [M in keyof Service['methods']]: FromTsProtoMethodDefinition< Service['methods'][M] >; }; export type FromTsProtoMethodDefinition<Method> = Method extends TsProtoMethodDefinition<infer Request, infer Response> ? MethodDefinition< TsProtoMessageIn<Method['requestType']>, Request, TsProtoMessageIn<Method['responseType']>, Response, Method['requestStream'], Method['responseStream'] > : never; export function fromTsProtoServiceDefinition( definition: TsProtoServiceDefinition, ): ServiceDefinition { const result: ServiceDefinition = {}; for (const [key, method] of Object.entries(definition.methods)) { const requestEncode = method.requestType.encode; const requestFromPartial = method.requestType.fromPartial; const responseEncode = method.responseType.encode; const responseFromPartial = method.responseType.fromPartial; result[key] = { path: `/${definition.fullName}/${method.name}`, requestStream: method.requestStream, responseStream: method.responseStream, requestDeserialize: method.requestType.decode, requestSerialize: requestFromPartial != null ? value => requestEncode(requestFromPartial(value)).finish() : value => requestEncode(value).finish(), responseDeserialize: method.responseType.decode, responseSerialize: responseFromPartial != null ? value => responseEncode(responseFromPartial(value)).finish() : value => responseEncode(value).finish(), options: method.options, }; } return result; } export function isTsProtoServiceDefinition( definition: CompatServiceDefinition, ): definition is TsProtoServiceDefinition { return ( 'name' in definition && 'fullName' in definition && 'methods' in definition ); }