export type Method = [ MethodDescriptor, MethodImpl ]; export type RpcClientImpl = (methodDescriptor: MethodDescriptor) => MethodImpl; export interface MethodDescriptor { methodName: TMethodName; service: { serviceName: TServiceName; }; requestStream: TRequestStream; responseStream: TResponseStream; requestType: { serializeBinary: (value: TReq) => Uint8Array; deserializeBinary: (value: Uint8Array) => TReq; serializeJson: (value: TReq) => string; }; responseType: { serializeBinary: (value: TRes) => Uint8Array; deserializeBinary: (value: Uint8Array) => TRes; serializeJson: (value: TRes) => string; }; } type ThenArg = T extends Promise ? U : T; export type RpcReturnType = (Promise : [ThenArg, ...TResArgs]>); export interface MethodImpl { (req: AsyncGenerator, metadata?: TMetadata): [AsyncGenerator, Promise, Promise]; } export interface MethodImplHandlerReq { metadata?: TMetadata; messages: AsyncGenerator; drainEnd: Promise; } export interface MethodImplHandlerRes { header(value: THeader): void; send(value: TRes): void; end(value: TTrailer): void; } export interface MethodImplHandler { (req: MethodImplHandlerReq, res: MethodImplHandlerRes): void; } export declare function getMethodImpl(handler: MethodImplHandler): MethodImpl; export declare function createServerImplBuilder(): { register(methodDescriptor: MethodDescriptor, handler: MethodImplHandler): void; finish: () => void; drain: () => AsyncGenerator, any, unknown>; }; export {};