import {MethodDescriptor} from '../MethodDescriptor'; import {CallOptions} from './CallOptions'; /** * Client middleware. * * Defined as an async generator function. The most basic no-op middleware looks * like this: * * ```ts * import {ClientMiddlewareCall, CallOptions} from 'nice-grpc-common'; * * async function* middleware( * call: ClientMiddlewareCall, * options: CallOptions, * ) { * return yield* call.next(call.request, options); * } * ``` * * @template CallOptionsExt Extra call options properties that are consumed by * this middleware. * @template RequiredCallOptionsExt Extra call options properties that are * required by this middleware. Must be added by a middleware that is * attached to the client before this middleware. */ export type ClientMiddleware< CallOptionsExt = {}, RequiredCallOptionsExt = {}, > = ( call: ClientMiddlewareCall, options: CallOptions & Partial, ) => AsyncGenerator; export type ClientMiddlewareCall = { method: MethodDescriptor; } & ClientMiddlewareCallRequest & ClientMiddlewareCallResponse; export type ClientMiddlewareCallRequest = | { requestStream: false; request: Request; } | { requestStream: true; request: AsyncIterable; }; export type ClientMiddlewareCallResponse< Request, Response, NextCallOptionsExt, > = | { responseStream: false; next( request: Request | AsyncIterable, options: CallOptions & Partial, ): AsyncGenerator; } | { responseStream: true; next( request: Request | AsyncIterable, options: CallOptions & Partial, ): AsyncGenerator; };