UNPKG

7.59 kBTypeScriptView Raw
1import { Plugin as EnvelopPlugin, OnExecuteHook, OnSubscribeHook, PromiseOrValue, RegisterContextErrorHandler, SetSchemaFn } from '@envelop/core';
2import { ExecutionResult } from '@graphql-tools/utils';
3import { ServerAdapterPlugin, type ServerAdapterInitialContext } from '@whatwg-node/server';
4import { YogaServer } from '../server.js';
5import { FetchAPI, GraphQLHTTPExtensions, GraphQLParams, MaybeArray, YogaInitialContext } from '../types.js';
6export type Plugin<PluginContext extends Record<string, any> = {}, TServerContext extends Record<string, any> = {}, TUserContext = {}> = EnvelopPlugin<YogaInitialContext & PluginContext> & ServerAdapterPlugin<TServerContext> & {
7 /**
8 * onExecute hook that is invoked before the execute function is invoked.
9 */
10 onExecute?: OnExecuteHook<YogaInitialContext & PluginContext & TUserContext>;
11 /**
12 * onSubscribe hook that is invoked before the subscribe function is called.
13 * Return a OnSubscribeHookResult for hooking into phase after the subscribe function has been called.
14 */
15 onSubscribe?: OnSubscribeHook<YogaInitialContext & PluginContext & TUserContext>;
16 /**
17 * Invoked when a plugin is initialized. You can use this hook to add other plugin you may depend on.
18 */
19 onPluginInit?: OnPluginInitHook<YogaInitialContext & PluginContext & TUserContext>;
20} & {
21 /**
22 * This hook is invoked at Yoga Server initialization, before it starts.
23 * Here you can setup long running resources (like monitoring or caching clients)
24 * or customize the Yoga instance.
25 */
26 onYogaInit?: OnYogaInitHook<TServerContext>;
27 /**
28 * This hook is invoked for any incoming GraphQL HTTP request and is invoked before attempting
29 * to parse the GraphQL parameters. Here you can manipulate the request, set a custom request
30 * parser or apply security measures such as checking for access tokens etc.
31 */
32 onRequestParse?: OnRequestParseHook<TServerContext>;
33 /**
34 * This hook is invoked for an incoming GraphQL request after the GraphQL parameters
35 * (query, variables, extensions and operationName) have been ATTEMPTED to be parsed.
36 *
37 * Within this hook you can manipulate and customize the parameters or even implement a whole
38 * new way of parsing the parameters.
39 *
40 * In addition to that you could also short-circuit and skip the GraphQL execution.
41 */
42 onParams?: OnParamsHook<TServerContext>;
43 /**
44 * This hook is invoked for each result produced for GraphQL operation, before it is processed
45 * to be sent to client.
46 *
47 * In particular, if a request contains batched operations, this hook is called once of each
48 * operation.
49 *
50 * Here, you can modify the result, to add monitoring or instrumentation extensions for example.
51 */
52 onExecutionResult?: OnExecutionResultHook<TServerContext>;
53 /**
54 * This hook is invoked after a GraphQL request has been processed and before the response is
55 * forwarded to the client. Here you can customize what transport/response processor format
56 * should be used for sending the result over the wire.
57 */
58 onResultProcess?: OnResultProcess<TServerContext>;
59};
60export type OnYogaInitHook<TServerContext extends Record<string, any>> = (payload: OnYogaInitEventPayload<TServerContext>) => void;
61export type OnYogaInitEventPayload<TServerContext extends Record<string, any>> = {
62 yoga: YogaServer<TServerContext, any>;
63};
64export type OnRequestParseHook<TServerContext> = (payload: OnRequestParseEventPayload<TServerContext>) => PromiseOrValue<void | OnRequestParseHookResult>;
65export type RequestParser = (request: Request) => PromiseOrValue<GraphQLParams> | PromiseOrValue<GraphQLParams[]>;
66export interface OnRequestParseEventPayload<TServerContext> {
67 request: Request;
68 url: URL;
69 requestParser: RequestParser | undefined;
70 serverContext: TServerContext & ServerAdapterInitialContext;
71 setRequestParser: (parser: RequestParser) => void;
72}
73export type OnRequestParseHookResult = {
74 onRequestParseDone?: OnRequestParseDoneHook;
75};
76export type OnRequestParseDoneHook = (payload: OnRequestParseDoneEventPayload) => PromiseOrValue<void>;
77export interface OnRequestParseDoneEventPayload {
78 requestParserResult: GraphQLParams | GraphQLParams[];
79 setRequestParserResult: (params: GraphQLParams | GraphQLParams[]) => void;
80}
81export type OnParamsHook<TServerContext> = (payload: OnParamsEventPayload<TServerContext>) => PromiseOrValue<void>;
82export interface OnParamsEventPayload<TServerContext = Record<string, unknown>> {
83 request: Request;
84 params: GraphQLParams;
85 setParams: (params: GraphQLParams) => void;
86 paramsHandler: ParamsHandler<TServerContext>;
87 setParamsHandler: (handler: ParamsHandler<TServerContext>) => void;
88 setResult: (result: ExecutionResult | AsyncIterable<ExecutionResult>) => void;
89 fetchAPI: FetchAPI;
90 context: TServerContext;
91}
92export interface ParamsHandlerPayload<TServerContext> {
93 request: Request;
94 params: GraphQLParams;
95 context: TServerContext & ServerAdapterInitialContext & YogaInitialContext;
96}
97export type ParamsHandler<TServerContext> = (payload: ParamsHandlerPayload<TServerContext>) => PromiseOrValue<ExecutionResult | AsyncIterable<ExecutionResult>>;
98export type OnResultProcess<TServerContext> = (payload: OnResultProcessEventPayload<TServerContext>) => PromiseOrValue<void>;
99export type ExecutionResultWithSerializer<TData = any, TExtensions = any> = ExecutionResult<TData, TExtensions> & {
100 stringify?: (result: ExecutionResult<TData, TExtensions>) => string;
101};
102export type OnExecutionResultHook<TServerContext> = (payload: OnExecutionResultEventPayload<TServerContext>) => PromiseOrValue<void>;
103export interface OnExecutionResultEventPayload<TServerContext> {
104 request: Request;
105 result: ExecutionResultWithSerializer | AsyncIterable<ExecutionResultWithSerializer> | undefined;
106 setResult(result: ExecutionResultWithSerializer | AsyncIterable<ExecutionResultWithSerializer>): void;
107 context: TServerContext & ServerAdapterInitialContext & YogaInitialContext;
108}
109export type ResultProcessorInput = MaybeArray<ExecutionResultWithSerializer> | AsyncIterable<ExecutionResultWithSerializer<any, {
110 http?: GraphQLHTTPExtensions;
111}>>;
112export type ResultProcessor = (result: ResultProcessorInput, fetchAPI: FetchAPI, acceptedMediaType: string) => PromiseOrValue<Response>;
113export interface OnResultProcessEventPayload<TServerContext> {
114 request: Request;
115 result: ResultProcessorInput;
116 setResult(result: ResultProcessorInput): void;
117 resultProcessor?: ResultProcessor;
118 acceptableMediaTypes: string[];
119 setResultProcessor(resultProcessor: ResultProcessor, acceptedMediaType: string): void;
120 serverContext: TServerContext & ServerAdapterInitialContext;
121}
122/**
123 * Payload forwarded to the onPluginInit hook.
124 */
125export type OnPluginInitEventPayload<PluginContext extends Record<string, any>> = {
126 /**
127 * Register a new plugin.
128 */
129 addPlugin: (newPlugin: Plugin<PluginContext>) => void;
130 /**
131 * A list of all currently active plugins.
132 */
133 plugins: Plugin<PluginContext>[];
134 /**
135 * Set the GraphQL schema.
136 */
137 setSchema: SetSchemaFn;
138 /**
139 * Register an error handler used for context creation.
140 */
141 registerContextErrorHandler: RegisterContextErrorHandler;
142};
143/**
144 * Invoked when a plugin is initialized.
145 */
146export type OnPluginInitHook<ContextType extends Record<string, any>> = (options: OnPluginInitEventPayload<ContextType>) => void;