diff --git a/docs/interfaces/client.Client.md b/docs/interfaces/client.Client.md index 95795589..d5ccd826 100644 --- a/docs/interfaces/client.Client.md +++ b/docs/interfaces/client.Client.md @@ -46,7 +46,7 @@ function used for dropping the subscription and cleaning up. | Name | Type | | :------ | :------ | | `request` | [`RequestParams`](common.RequestParams.md) | -| `sink` | [`Sink`](common.Sink.md)<`ExecutionResult`<`Data`, `Extensions`\>\> | +| `sink` | [`Sink`](common.Sink.md)<[`ExecutionResult`](common.ExecutionResult.md)<`Data`, `Extensions`\>\> | #### Returns diff --git a/docs/interfaces/common.ExecutionPatchResult.md b/docs/interfaces/common.ExecutionPatchResult.md new file mode 100644 index 00000000..d443736a --- /dev/null +++ b/docs/interfaces/common.ExecutionPatchResult.md @@ -0,0 +1,59 @@ +[graphql-sse](../README.md) / [common](../modules/common.md) / ExecutionPatchResult + +# Interface: ExecutionPatchResult + +[common](../modules/common.md).ExecutionPatchResult + +## Type parameters + +| Name | Type | +| :------ | :------ | +| `Data` | `unknown` | +| `Extensions` | `Record`<`string`, `unknown`\> | + +## Table of contents + +### Properties + +- [data](common.ExecutionPatchResult.md#data) +- [errors](common.ExecutionPatchResult.md#errors) +- [extensions](common.ExecutionPatchResult.md#extensions) +- [hasNext](common.ExecutionPatchResult.md#hasnext) +- [label](common.ExecutionPatchResult.md#label) +- [path](common.ExecutionPatchResult.md#path) + +## Properties + +### data + +• `Optional` **data**: ``null`` \| `Data` + +___ + +### errors + +• `Optional` **errors**: readonly `GraphQLError`[] + +___ + +### extensions + +• `Optional` **extensions**: `Extensions` + +___ + +### hasNext + +• **hasNext**: `boolean` + +___ + +### label + +• `Optional` **label**: `string` + +___ + +### path + +• `Optional` **path**: readonly (`string` \| `number`)[] diff --git a/docs/interfaces/common.ExecutionResult.md b/docs/interfaces/common.ExecutionResult.md new file mode 100644 index 00000000..6f655e17 --- /dev/null +++ b/docs/interfaces/common.ExecutionResult.md @@ -0,0 +1,45 @@ +[graphql-sse](../README.md) / [common](../modules/common.md) / ExecutionResult + +# Interface: ExecutionResult + +[common](../modules/common.md).ExecutionResult + +## Type parameters + +| Name | Type | +| :------ | :------ | +| `Data` | `Record`<`string`, `unknown`\> | +| `Extensions` | `Record`<`string`, `unknown`\> | + +## Table of contents + +### Properties + +- [data](common.ExecutionResult.md#data) +- [errors](common.ExecutionResult.md#errors) +- [extensions](common.ExecutionResult.md#extensions) +- [hasNext](common.ExecutionResult.md#hasnext) + +## Properties + +### data + +• `Optional` **data**: ``null`` \| `Data` + +___ + +### errors + +• `Optional` **errors**: readonly `GraphQLError`[] + +___ + +### extensions + +• `Optional` **extensions**: `Extensions` + +___ + +### hasNext + +• `Optional` **hasNext**: `boolean` diff --git a/docs/interfaces/handler.HandlerOptions.md b/docs/interfaces/handler.HandlerOptions.md index 41b6b470..bab67de9 100644 --- a/docs/interfaces/handler.HandlerOptions.md +++ b/docs/interfaces/handler.HandlerOptions.md @@ -241,7 +241,7 @@ ___ ### onNext -▸ `Optional` **onNext**(`req`, `args`, `result`): `void` \| `ExecutionResult`<`ObjMap`<`unknown`\>, `ObjMap`<`unknown`\>\> \| `Promise`<`void` \| `ExecutionResult`<`ObjMap`<`unknown`\>, `ObjMap`<`unknown`\>\>\> +▸ `Optional` **onNext**(`req`, `args`, `result`): `void` \| [`ExecutionResult`](common.ExecutionResult.md)<`Record`<`string`, `unknown`\>, `Record`<`string`, `unknown`\>\> \| [`ExecutionPatchResult`](common.ExecutionPatchResult.md)<`unknown`, `Record`<`string`, `unknown`\>\> \| `Promise`<`void` \| [`ExecutionResult`](common.ExecutionResult.md)<`Record`<`string`, `unknown`\>, `Record`<`string`, `unknown`\>\> \| [`ExecutionPatchResult`](common.ExecutionPatchResult.md)<`unknown`, `Record`<`string`, `unknown`\>\>\> Executed after an operation has emitted a result right before that result has been sent to the client. @@ -261,11 +261,11 @@ request. | :------ | :------ | | `req` | `IncomingMessage` | | `args` | `ExecutionArgs` | -| `result` | `ExecutionResult`<`ObjMap`<`unknown`\>, `ObjMap`<`unknown`\>\> | +| `result` | [`ExecutionResult`](common.ExecutionResult.md)<`Record`<`string`, `unknown`\>, `Record`<`string`, `unknown`\>\> \| [`ExecutionPatchResult`](common.ExecutionPatchResult.md)<`unknown`, `Record`<`string`, `unknown`\>\> | #### Returns -`void` \| `ExecutionResult`<`ObjMap`<`unknown`\>, `ObjMap`<`unknown`\>\> \| `Promise`<`void` \| `ExecutionResult`<`ObjMap`<`unknown`\>, `ObjMap`<`unknown`\>\>\> +`void` \| [`ExecutionResult`](common.ExecutionResult.md)<`Record`<`string`, `unknown`\>, `Record`<`string`, `unknown`\>\> \| [`ExecutionPatchResult`](common.ExecutionPatchResult.md)<`unknown`, `Record`<`string`, `unknown`\>\> \| `Promise`<`void` \| [`ExecutionResult`](common.ExecutionResult.md)<`Record`<`string`, `unknown`\>, `Record`<`string`, `unknown`\>\> \| [`ExecutionPatchResult`](common.ExecutionPatchResult.md)<`unknown`, `Record`<`string`, `unknown`\>\>\> ___ diff --git a/docs/modules/client.md b/docs/modules/client.md index 3dd8a563..77229aba 100644 --- a/docs/modules/client.md +++ b/docs/modules/client.md @@ -6,6 +6,8 @@ ### References +- [ExecutionPatchResult](client.md#executionpatchresult) +- [ExecutionResult](client.md#executionresult) - [RequestParams](client.md#requestparams) - [Sink](client.md#sink) - [StreamData](client.md#streamdata) @@ -57,6 +59,18 @@ use only one SSE connection. ## Other +### ExecutionPatchResult + +Re-exports: [ExecutionPatchResult](../interfaces/common.ExecutionPatchResult.md) + +___ + +### ExecutionResult + +Re-exports: [ExecutionResult](../interfaces/common.ExecutionResult.md) + +___ + ### RequestParams Re-exports: [RequestParams](../interfaces/common.RequestParams.md) diff --git a/docs/modules/common.md b/docs/modules/common.md index 8c4c3ce3..1aa9a859 100644 --- a/docs/modules/common.md +++ b/docs/modules/common.md @@ -6,6 +6,8 @@ ### Interfaces +- [ExecutionPatchResult](../interfaces/common.ExecutionPatchResult.md) +- [ExecutionResult](../interfaces/common.ExecutionResult.md) - [RequestParams](../interfaces/common.RequestParams.md) - [Sink](../interfaces/common.Sink.md) - [StreamMessage](../interfaces/common.StreamMessage.md) @@ -25,7 +27,7 @@ ### StreamData -Ƭ **StreamData**<`E`\>: `E` extends ``"next"`` ? `ExecutionResult` : `E` extends ``"complete"`` ? ``null`` : `never` +Ƭ **StreamData**<`E`\>: `E` extends ``"next"`` ? [`ExecutionResult`](../interfaces/common.ExecutionResult.md) \| [`ExecutionPatchResult`](../interfaces/common.ExecutionPatchResult.md) : `E` extends ``"complete"`` ? ``null`` : `never` #### Type parameters @@ -37,7 +39,7 @@ ___ ### StreamDataForID -Ƭ **StreamDataForID**<`E`\>: `E` extends ``"next"`` ? { `id`: `string` ; `payload`: `ExecutionResult` } : `E` extends ``"complete"`` ? { `id`: `string` } : `never` +Ƭ **StreamDataForID**<`E`\>: `E` extends ``"next"`` ? { `id`: `string` ; `payload`: [`ExecutionResult`](../interfaces/common.ExecutionResult.md) \| [`ExecutionPatchResult`](../interfaces/common.ExecutionPatchResult.md) } : `E` extends ``"complete"`` ? { `id`: `string` } : `never` #### Type parameters diff --git a/docs/modules/handler.md b/docs/modules/handler.md index 675f4b16..49b5c4bd 100644 --- a/docs/modules/handler.md +++ b/docs/modules/handler.md @@ -118,7 +118,7 @@ ___ ### OperationResult -Ƭ **OperationResult**: `Promise`<`AsyncGenerator`<`ExecutionResult`\> \| `AsyncIterable`<`ExecutionResult`\> \| `ExecutionResult`\> \| `AsyncGenerator`<`ExecutionResult`\> \| `AsyncIterable`<`ExecutionResult`\> \| `ExecutionResult` +Ƭ **OperationResult**: `Promise`<`AsyncGenerator`<[`ExecutionResult`](../interfaces/common.ExecutionResult.md) \| [`ExecutionPatchResult`](../interfaces/common.ExecutionPatchResult.md)\> \| `AsyncIterable`<[`ExecutionResult`](../interfaces/common.ExecutionResult.md) \| [`ExecutionPatchResult`](../interfaces/common.ExecutionPatchResult.md)\> \| [`ExecutionResult`](../interfaces/common.ExecutionResult.md)\> \| `AsyncGenerator`<[`ExecutionResult`](../interfaces/common.ExecutionResult.md) \| [`ExecutionPatchResult`](../interfaces/common.ExecutionPatchResult.md)\> \| `AsyncIterable`<[`ExecutionResult`](../interfaces/common.ExecutionResult.md) \| [`ExecutionPatchResult`](../interfaces/common.ExecutionPatchResult.md)\> \| [`ExecutionResult`](../interfaces/common.ExecutionResult.md) ___ diff --git a/src/client.ts b/src/client.ts index ff665fb2..06dab622 100644 --- a/src/client.ts +++ b/src/client.ts @@ -4,10 +4,15 @@ * */ -import { ExecutionResult } from 'graphql'; import { createParser } from './parser'; import { isObject } from './utils'; -import { RequestParams, Sink, StreamMessage } from './common'; +import { + RequestParams, + Sink, + StreamMessage, + ExecutionResult, + ExecutionPatchResult, +} from './common'; /** This file is the entry point for browsers, re-export common elements. */ export * from './common'; @@ -557,7 +562,7 @@ interface Connection { getResults: (options?: { signal: AbortSignal; operationId: string; - }) => AsyncIterable; + }) => AsyncIterable; } interface ConnectOptions { @@ -574,7 +579,9 @@ async function connect(options: ConnectOptions): Promise { const waiting: { [id: string]: { proceed: () => void }; } = {}; - const queue: { [id: string]: (ExecutionResult | 'complete')[] } = {}; + const queue: { + [id: string]: (ExecutionResult | ExecutionPatchResult | 'complete')[]; + } = {}; let res; try { diff --git a/src/common.ts b/src/common.ts index 807652f2..f1a67ced 100644 --- a/src/common.ts +++ b/src/common.ts @@ -4,7 +4,7 @@ * */ -import type { DocumentNode, ExecutionResult } from 'graphql'; +import type { DocumentNode, GraphQLError } from 'graphql'; /** * Parameters for GraphQL's request for execution. @@ -48,9 +48,33 @@ export function validateStreamEvent(e: unknown): StreamEvent { return e; } +/** @category Common */ +export interface ExecutionResult< + Data = Record, + Extensions = Record, +> { + errors?: ReadonlyArray; + data?: Data | null; + hasNext?: boolean; + extensions?: Extensions; +} + +/** @category Common */ +export interface ExecutionPatchResult< + Data = unknown, + Extensions = Record, +> { + errors?: ReadonlyArray; + data?: Data | null; + path?: ReadonlyArray; + label?: string; + hasNext: boolean; + extensions?: Extensions; +} + /** @category Common */ export type StreamData = E extends 'next' - ? ExecutionResult + ? ExecutionResult | ExecutionPatchResult : E extends 'complete' ? null : never; @@ -58,7 +82,7 @@ export type StreamData = E extends 'next' /** @category Common */ export type StreamDataForID = E extends 'next' - ? { id: string; payload: ExecutionResult } + ? { id: string; payload: ExecutionResult | ExecutionPatchResult } : E extends 'complete' ? { id: string } : never; diff --git a/src/handler.ts b/src/handler.ts index 768c5ac9..1564c45a 100644 --- a/src/handler.ts +++ b/src/handler.ts @@ -7,7 +7,6 @@ import type { IncomingMessage, ServerResponse } from 'http'; import { ExecutionArgs, - ExecutionResult, getOperationAST, GraphQLSchema, OperationTypeNode, @@ -22,6 +21,8 @@ import { StreamEvent, StreamData, StreamDataForID, + ExecutionResult, + ExecutionPatchResult, } from './common'; /** @@ -47,12 +48,12 @@ export type ExecutionContext = /** @category Server */ export type OperationResult = | Promise< - | AsyncGenerator - | AsyncIterable + | AsyncGenerator + | AsyncIterable | ExecutionResult > - | AsyncGenerator - | AsyncIterable + | AsyncGenerator + | AsyncIterable | ExecutionResult; /** @category Server */ @@ -207,8 +208,12 @@ export interface HandlerOptions { onNext?: ( req: IncomingMessage, args: ExecutionArgs, - result: ExecutionResult, - ) => Promise | ExecutionResult | void; + result: ExecutionResult | ExecutionPatchResult, + ) => + | Promise + | ExecutionResult + | ExecutionPatchResult + | void; /** * The complete callback is executed after the operation * has completed and the client has been notified. @@ -301,9 +306,10 @@ interface Stream { operationReq: IncomingMessage, // holding the operation request (not necessarily the event stream) args: ExecutionArgs, result: - | AsyncGenerator - | AsyncIterable - | ExecutionResult, + | AsyncGenerator + | AsyncIterable + | ExecutionResult + | ExecutionPatchResult, opId?: string, ): Promise; }