/// import type { GetEnvelopedFn, PromiseOrValue } from '@envelop/types'; import type { MultipartResponse, ProcessRequestResult, Push } from '@pablosz/graphql-helix'; import type { ExecutionResult } from 'graphql'; import type { IncomingMessage, ServerResponse } from 'http'; import type { AppOptions, BuildContextArgs, EZContext } from '../index'; import type { ProcessRequestOptions, Request, PreProcessRequestOptions } from './helixTypes'; export type EZResponse = { type: 'RESPONSE'; status: number; payload: ExecutionResult | ExecutionResult[]; headers: { name: string; value: string; }[]; }; export type DefaultResponseHandler = (req: IncomingMessage, res: ServerResponse, result: EZResponse) => void | Promise; export type DefaultMultipartResponseHandler = (req: IncomingMessage, res: ServerResponse, result: MultipartResponse) => void | Promise; export type DefaultPushResponseHandler = (req: IncomingMessage, res: ServerResponse, result: Push) => void | Promise; export interface HandleRequestOptions { request: Request; getEnveloped: GetEnvelopedFn; req: IncomingMessage; baseOptions: AppOptions; contextArgs: () => BuildContextArgs; buildContext: ((args: BuildContextArgs) => Record | Promise>) | undefined; onResponse: (result: EZResponse, defaultHandle: DefaultResponseHandler) => TReturn | Promise; onMultiPartResponse: (result: MultipartResponse, defaultHandle: DefaultMultipartResponseHandler) => TReturn | Promise; onPushResponse: (result: Push, defaultHandle: DefaultPushResponseHandler) => TReturn | Promise; processRequestOptions: (() => ProcessRequestOptions) | undefined; preProcessRequest: PreProcessRequest[] | undefined; } export type HandleRequest = (options: HandleRequestOptions) => Promise; export type RequestHandler = (req: IncomingMessage, res: ServerResponse) => Promise | void; /** * Callback called sequentially before the default request process. * * You can safely mutate `requestOptions` argument * * If it returns an object, it interrupts the default execution returning the given payload. */ export interface PreProcessRequest { (data: Readonly<{ appOptions: AppOptions; requestOptions: PreProcessRequestOptions; }>): PromiseOrValue | undefined | null | void>; }