Skip to content

Commit

Permalink
fix: Define graphql execution results
Browse files Browse the repository at this point in the history
  • Loading branch information
enisdenjo committed Sep 8, 2021
1 parent 24b6078 commit 89da803
Show file tree
Hide file tree
Showing 10 changed files with 181 additions and 24 deletions.
2 changes: 1 addition & 1 deletion docs/interfaces/client.Client.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
59 changes: 59 additions & 0 deletions docs/interfaces/common.ExecutionPatchResult.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
[graphql-sse](../README.md) / [common](../modules/common.md) / ExecutionPatchResult

# Interface: ExecutionPatchResult<Data, Extensions\>

[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`)[]
45 changes: 45 additions & 0 deletions docs/interfaces/common.ExecutionResult.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
[graphql-sse](../README.md) / [common](../modules/common.md) / ExecutionResult

# Interface: ExecutionResult<Data, Extensions\>

[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`
6 changes: 3 additions & 3 deletions docs/interfaces/handler.HandlerOptions.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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`\>\>\>

___

Expand Down
14 changes: 14 additions & 0 deletions docs/modules/client.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
6 changes: 4 additions & 2 deletions docs/modules/common.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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

Expand All @@ -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

Expand Down
2 changes: 1 addition & 1 deletion docs/modules/handler.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)

___

Expand Down
15 changes: 11 additions & 4 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -557,7 +562,7 @@ interface Connection {
getResults: (options?: {
signal: AbortSignal;
operationId: string;
}) => AsyncIterable<ExecutionResult>;
}) => AsyncIterable<ExecutionResult | ExecutionPatchResult>;
}

interface ConnectOptions {
Expand All @@ -574,7 +579,9 @@ async function connect(options: ConnectOptions): Promise<Connection> {
const waiting: {
[id: string]: { proceed: () => void };
} = {};
const queue: { [id: string]: (ExecutionResult | 'complete')[] } = {};
const queue: {
[id: string]: (ExecutionResult | ExecutionPatchResult | 'complete')[];
} = {};

let res;
try {
Expand Down
30 changes: 27 additions & 3 deletions src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
*
*/

import type { DocumentNode, ExecutionResult } from 'graphql';
import type { DocumentNode, GraphQLError } from 'graphql';

/**
* Parameters for GraphQL's request for execution.
Expand Down Expand Up @@ -48,17 +48,41 @@ export function validateStreamEvent(e: unknown): StreamEvent {
return e;
}

/** @category Common */
export interface ExecutionResult<
Data = Record<string, unknown>,
Extensions = Record<string, unknown>,
> {
errors?: ReadonlyArray<GraphQLError>;
data?: Data | null;
hasNext?: boolean;
extensions?: Extensions;
}

/** @category Common */
export interface ExecutionPatchResult<
Data = unknown,
Extensions = Record<string, unknown>,
> {
errors?: ReadonlyArray<GraphQLError>;
data?: Data | null;
path?: ReadonlyArray<string | number>;
label?: string;
hasNext: boolean;
extensions?: Extensions;
}

/** @category Common */
export type StreamData<E extends StreamEvent = StreamEvent> = E extends 'next'
? ExecutionResult
? ExecutionResult | ExecutionPatchResult
: E extends 'complete'
? null
: never;

/** @category Common */
export type StreamDataForID<E extends StreamEvent = StreamEvent> =
E extends 'next'
? { id: string; payload: ExecutionResult }
? { id: string; payload: ExecutionResult | ExecutionPatchResult }
: E extends 'complete'
? { id: string }
: never;
Expand Down
26 changes: 16 additions & 10 deletions src/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import type { IncomingMessage, ServerResponse } from 'http';
import {
ExecutionArgs,
ExecutionResult,
getOperationAST,
GraphQLSchema,
OperationTypeNode,
Expand All @@ -22,6 +21,8 @@ import {
StreamEvent,
StreamData,
StreamDataForID,
ExecutionResult,
ExecutionPatchResult,
} from './common';

/**
Expand All @@ -47,12 +48,12 @@ export type ExecutionContext =
/** @category Server */
export type OperationResult =
| Promise<
| AsyncGenerator<ExecutionResult>
| AsyncIterable<ExecutionResult>
| AsyncGenerator<ExecutionResult | ExecutionPatchResult>
| AsyncIterable<ExecutionResult | ExecutionPatchResult>
| ExecutionResult
>
| AsyncGenerator<ExecutionResult>
| AsyncIterable<ExecutionResult>
| AsyncGenerator<ExecutionResult | ExecutionPatchResult>
| AsyncIterable<ExecutionResult | ExecutionPatchResult>
| ExecutionResult;

/** @category Server */
Expand Down Expand Up @@ -207,8 +208,12 @@ export interface HandlerOptions {
onNext?: (
req: IncomingMessage,
args: ExecutionArgs,
result: ExecutionResult,
) => Promise<ExecutionResult | void> | ExecutionResult | void;
result: ExecutionResult | ExecutionPatchResult,
) =>
| Promise<ExecutionResult | ExecutionPatchResult | void>
| ExecutionResult
| ExecutionPatchResult
| void;
/**
* The complete callback is executed after the operation
* has completed and the client has been notified.
Expand Down Expand Up @@ -301,9 +306,10 @@ interface Stream {
operationReq: IncomingMessage, // holding the operation request (not necessarily the event stream)
args: ExecutionArgs,
result:
| AsyncGenerator<ExecutionResult>
| AsyncIterable<ExecutionResult>
| ExecutionResult,
| AsyncGenerator<ExecutionResult | ExecutionPatchResult>
| AsyncIterable<ExecutionResult | ExecutionPatchResult>
| ExecutionResult
| ExecutionPatchResult,
opId?: string,
): Promise<void>;
}
Expand Down

0 comments on commit 89da803

Please sign in to comment.