///
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>;
}