import {MethodDescriptor} from '../MethodDescriptor'; import {CallContext} from './CallContext'; /** * Server middleware. * * Defined as an async generator function. The most basic no-op middleware looks * like this: * * ```ts * import {ServerMiddlewareCall, CallContext} from 'nice-grpc-common'; * * async function* middleware( * call: ServerMiddlewareCall, * context: CallContext, * ) { * return yield* call.next(call.request, context); * } * ``` * * @template CallContextExt Extra call context properties that are added by this * middleware. * @template RequiredCallContextExt Extra call context properties that are * required by this middleware. Must be added by a middleware that is * attached to the server before this middleware. */ export type ServerMiddleware< CallContextExt = {}, RequiredCallContextExt = {}, > = ( call: ServerMiddlewareCall< Request, Response, CallContextExt & RequiredCallContextExt >, context: CallContext & RequiredCallContextExt, ) => AsyncGenerator; export type ServerMiddlewareCall = { method: MethodDescriptor; } & ServerMiddlewareCallRequest & ServerMiddlewareCallResponse; export type ServerMiddlewareCallRequest = | { requestStream: false; request: Request; } | { requestStream: true; request: AsyncIterable; }; export type ServerMiddlewareCallResponse< Request, Response, NextCallContextExt, > = | { responseStream: false; next( request: Request | AsyncIterable, context: CallContext & NextCallContextExt, ): AsyncGenerator; } | { responseStream: true; next( request: Request | AsyncIterable, context: CallContext & NextCallContextExt, ): AsyncGenerator; };