import * as grpc from "grpc"; export enum InterceptorType { Unary, ClientStreaming, ServerStreaming, BidiStreaming, } type InterceptorFn = (options: grpc.CallOptions, next: Function) => grpc.InterceptingCall; export interface InterceptorChainConfig { type: InterceptorType; interceptorFn: InterceptorFn; } export type Interceptor = (methodDefinition: grpc.MethodDefinition) => InterceptorFn; /** * Interceptor chain, helps to chain together multiple interceptors * @param interceptors */ export function interceptorChain(interceptors: InterceptorChainConfig[]): Interceptor[] { return interceptors.map(i => { return (methodDefinition: grpc.MethodDefinition): InterceptorFn => { switch (i.type) { case InterceptorType.Unary: if (!methodDefinition.requestStream && !methodDefinition.responseStream) { return i.interceptorFn; } break; case InterceptorType.ClientStreaming: if (methodDefinition.requestStream && !methodDefinition.responseStream) { return i.interceptorFn; } break; case InterceptorType.ServerStreaming: if (!methodDefinition.requestStream && methodDefinition.responseStream) { return i.interceptorFn; } break; case InterceptorType.BidiStreaming: if (methodDefinition.requestStream && methodDefinition.responseStream) { return i.interceptorFn; } break; } throw new Error(`interceptor type ${i.type} not supported.`); }; }); }