diff --git a/docs/interfaces/common.ExecutionPatchResult.md b/docs/interfaces/common.ExecutionPatchResult.md new file mode 100644 index 00000000..18cc5023 --- /dev/null +++ b/docs/interfaces/common.ExecutionPatchResult.md @@ -0,0 +1,59 @@ +[graphql-ws](../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..b9f561b0 --- /dev/null +++ b/docs/interfaces/common.ExecutionResult.md @@ -0,0 +1,45 @@ +[graphql-ws](../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/common.NextMessage.md b/docs/interfaces/common.NextMessage.md index 3e82ef6b..4eb50d70 100644 --- a/docs/interfaces/common.NextMessage.md +++ b/docs/interfaces/common.NextMessage.md @@ -22,7 +22,7 @@ ___ ### payload -• `Readonly` **payload**: `ExecutionResult`<`ObjMap`<`unknown`\>, `ObjMap`<`unknown`\>\> +• `Readonly` **payload**: [`ExecutionResult`](common.ExecutionResult.md)<`Record`<`string`, `unknown`\>, `Record`<`string`, `unknown`\>\> \| [`ExecutionPatchResult`](common.ExecutionPatchResult.md)<`unknown`, `Record`<`string`, `unknown`\>\> ___ diff --git a/docs/interfaces/server.Context.md b/docs/interfaces/server.Context.md index 03874960..5fae4592 100644 --- a/docs/interfaces/server.Context.md +++ b/docs/interfaces/server.Context.md @@ -62,7 +62,7 @@ ___ ### subscriptions -• `Readonly` **subscriptions**: `Record`<`string`, ``null`` \| `AsyncIterator`<`unknown`, `any`, `undefined`\>\> +• `Readonly` **subscriptions**: `Record`<`string`, ``null`` \| `AsyncGenerator`<`unknown`, `any`, `unknown`\> \| `AsyncIterable`<`unknown`\>\> Holds the active subscriptions for this context. **All operations** that are taking place are aggregated here. The user is _subscribed_ diff --git a/docs/interfaces/server.ServerOptions.md b/docs/interfaces/server.ServerOptions.md index 40119ca3..11e74d2f 100644 --- a/docs/interfaces/server.ServerOptions.md +++ b/docs/interfaces/server.ServerOptions.md @@ -380,7 +380,7 @@ ___ ### onNext -▸ `Optional` **onNext**(`ctx`, `message`, `args`, `result`): `void` \| `ExecutionResult`<`ObjMap`<`unknown`\>, `ObjMap`<`unknown`\>\> \| `Promise`<`void` \| `ExecutionResult`<`ObjMap`<`unknown`\>, `ObjMap`<`unknown`\>\>\> +▸ `Optional` **onNext**(`ctx`, `message`, `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. Results from both @@ -402,11 +402,11 @@ in the close event reason. | `ctx` | [`Context`](server.Context.md)<`E`\> | | `message` | [`NextMessage`](common.NextMessage.md) | | `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 83a9e01d..5ec860a9 100644 --- a/docs/modules/client.md +++ b/docs/modules/client.md @@ -12,6 +12,8 @@ - [ConnectionInitMessage](client.md#connectioninitmessage) - [Disposable](client.md#disposable) - [ErrorMessage](client.md#errormessage) +- [ExecutionPatchResult](client.md#executionpatchresult) +- [ExecutionResult](client.md#executionresult) - [GRAPHQL\_TRANSPORT\_WS\_PROTOCOL](client.md#graphql_transport_ws_protocol) - [ID](client.md#id) - [JSONMessageReplacer](client.md#jsonmessagereplacer) @@ -384,6 +386,18 @@ Re-exports: [ErrorMessage](../interfaces/common.ErrorMessage.md) ___ +### ExecutionPatchResult + +Re-exports: [ExecutionPatchResult](../interfaces/common.ExecutionPatchResult.md) + +___ + +### ExecutionResult + +Re-exports: [ExecutionResult](../interfaces/common.ExecutionResult.md) + +___ + ### GRAPHQL\_TRANSPORT\_WS\_PROTOCOL Re-exports: [GRAPHQL\_TRANSPORT\_WS\_PROTOCOL](common.md#graphql_transport_ws_protocol) diff --git a/docs/modules/common.md b/docs/modules/common.md index 69ad9ff8..238394dc 100644 --- a/docs/modules/common.md +++ b/docs/modules/common.md @@ -16,6 +16,8 @@ - [ConnectionInitMessage](../interfaces/common.ConnectionInitMessage.md) - [Disposable](../interfaces/common.Disposable.md) - [ErrorMessage](../interfaces/common.ErrorMessage.md) +- [ExecutionPatchResult](../interfaces/common.ExecutionPatchResult.md) +- [ExecutionResult](../interfaces/common.ExecutionResult.md) - [NextMessage](../interfaces/common.NextMessage.md) - [PingMessage](../interfaces/common.PingMessage.md) - [PongMessage](../interfaces/common.PongMessage.md) diff --git a/docs/modules/server.md b/docs/modules/server.md index f087f2e9..8e04e223 100644 --- a/docs/modules/server.md +++ b/docs/modules/server.md @@ -37,7 +37,7 @@ ___ ### OperationResult -Ƭ **OperationResult**: `Promise`<`AsyncIterableIterator`<`ExecutionResult`\> \| `ExecutionResult`\> \| `AsyncIterableIterator`<`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/common.ts b/src/common.ts index b6bfa84e..9f02f7d3 100644 --- a/src/common.ts +++ b/src/common.ts @@ -4,7 +4,7 @@ * */ -import { GraphQLError, ExecutionResult } from 'graphql'; +import { GraphQLError } from 'graphql'; import { isObject, areGraphQLErrors, @@ -131,11 +131,35 @@ export interface SubscribePayload { readonly extensions?: Record | null; } +/** @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 interface NextMessage { readonly id: ID; readonly type: MessageType.Next; - readonly payload: ExecutionResult; + readonly payload: ExecutionResult | ExecutionPatchResult; } /** @category Common */ diff --git a/src/server.ts b/src/server.ts index cbb300b7..c75692b2 100644 --- a/src/server.ts +++ b/src/server.ts @@ -15,7 +15,6 @@ import { getOperationAST, GraphQLError, SubscriptionArgs, - ExecutionResult, } from 'graphql'; import { GRAPHQL_TRANSPORT_WS_PROTOCOL, @@ -33,6 +32,8 @@ import { JSONMessageReviver, PingMessage, PongMessage, + ExecutionResult, + ExecutionPatchResult, } from './common'; import { isObject, @@ -44,12 +45,12 @@ import { /** @category Server */ export type OperationResult = | Promise< - | AsyncGenerator - | AsyncIterable + | AsyncGenerator + | AsyncIterable | ExecutionResult > - | AsyncGenerator - | AsyncIterable + | AsyncGenerator + | AsyncIterable | ExecutionResult; /** @@ -356,8 +357,12 @@ export interface ServerOptions { ctx: Context, message: NextMessage, args: ExecutionArgs, - result: ExecutionResult, - ) => Promise | ExecutionResult | void; + result: ExecutionResult | ExecutionPatchResult, + ) => + | Promise + | ExecutionResult + | ExecutionPatchResult + | void; /** * The complete callback is executed after the * operation has completed right before sending @@ -652,7 +657,10 @@ export function makeServer(options: ServerOptions): Server { ctx.subscriptions[id] = null; const emit = { - next: async (result: ExecutionResult, args: ExecutionArgs) => { + next: async ( + result: ExecutionResult | ExecutionPatchResult, + args: ExecutionArgs, + ) => { let nextMessage: NextMessage = { id, type: MessageType.Next,