@vladimirdev635/gql-client 0.0.61 → 0.0.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/executor.d.ts +7 -0
- package/executor.js +119 -0
- package/index.d.ts +4 -4
- package/index.js +3 -3
- package/package.json +1 -1
- package/parsers/index.d.ts +1 -0
- package/parsers/index.js +1 -0
- package/parsers/parseBodySubscription.d.ts +3 -0
- package/parsers/parseBodySubscription.js +49 -0
- package/{parser.d.ts → parsers/parser.d.ts} +2 -2
- package/parsers/parser.js +20 -0
- package/types/config.d.ts +1 -1
- package/types/iexecutor.d.ts +10 -0
- package/types/index.d.ts +3 -2
- package/types/index.js +1 -1
- package/types/middlewares/config.d.ts +18 -0
- package/types/middlewares/config.js +1 -0
- package/types/middlewares/index.d.ts +3 -0
- package/types/middlewares/index.js +1 -0
- package/types/middlewares/parsing.d.ts +41 -0
- package/types/middlewares/parsing.js +1 -0
- package/types/middlewares/serialization.d.ts +23 -0
- package/types/middlewares/serialization.js +1 -0
- package/types/parser.d.ts +14 -9
- package/execute.d.ts +0 -12
- package/execute.js +0 -59
- package/parser.js +0 -58
- package/types/middlewares.d.ts +0 -44
- /package/types/{middlewares.js → iexecutor.js} +0 -0
package/executor.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ClientConfig, ExecuteResult, IExecutor, OperationResult, OperationVariables, RequestContext, SubOpAsyncIterable, SubscriptionOperation, SyncOperation } from './types/index.js';
|
|
2
|
+
export declare class Executor<TClientContext, TRequestContext extends RequestContext> implements IExecutor<TRequestContext> {
|
|
3
|
+
private readonly config;
|
|
4
|
+
constructor(config: ClientConfig<TClientContext, TRequestContext>);
|
|
5
|
+
executeSync<T extends SyncOperation<unknown, unknown>>(operation: T, variables: OperationVariables<T>, requestContext: TRequestContext): Promise<ExecuteResult<OperationResult<T>>>;
|
|
6
|
+
executeSubscription<T extends SubscriptionOperation<unknown, unknown>>(operation: T, variables: OperationVariables<T>, requestContext: TRequestContext, controller: AbortController): Promise<ExecuteResult<SubOpAsyncIterable<OperationResult<T>>>>;
|
|
7
|
+
}
|
package/executor.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export class Executor {
|
|
2
|
+
config;
|
|
3
|
+
constructor(config) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
}
|
|
6
|
+
async executeSync(operation, variables, requestContext) {
|
|
7
|
+
for (const middleware of this.config.middlewares.beforeSerialization) {
|
|
8
|
+
[operation, variables] = await middleware({
|
|
9
|
+
clientContext: this.config.context,
|
|
10
|
+
requestContext,
|
|
11
|
+
operation,
|
|
12
|
+
variables
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
let init = await this.config.serializer.serializeRequest({
|
|
16
|
+
clientContext: this.config.context,
|
|
17
|
+
requestContext,
|
|
18
|
+
operation,
|
|
19
|
+
variables
|
|
20
|
+
});
|
|
21
|
+
for (const middleware of this.config.middlewares.afterSerialization.sync) {
|
|
22
|
+
init = await middleware({
|
|
23
|
+
clientContext: this.config.context,
|
|
24
|
+
requestContext,
|
|
25
|
+
operation,
|
|
26
|
+
variables,
|
|
27
|
+
init
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
let response = await this.config.fetcher(init);
|
|
31
|
+
for (const middleware of this.config.middlewares.beforeParsing.sync) {
|
|
32
|
+
response = await middleware({
|
|
33
|
+
clientContext: this.config.context,
|
|
34
|
+
requestContext,
|
|
35
|
+
operation,
|
|
36
|
+
variables,
|
|
37
|
+
init,
|
|
38
|
+
response
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
let result = await this.config.parser.parseBodySync({
|
|
42
|
+
clientContext: this.config.context,
|
|
43
|
+
requestContext,
|
|
44
|
+
operation,
|
|
45
|
+
response
|
|
46
|
+
});
|
|
47
|
+
for (const middleware of this.config.middlewares.afterParsing.sync) {
|
|
48
|
+
result = await middleware({
|
|
49
|
+
clientContext: this.config.context,
|
|
50
|
+
requestContext,
|
|
51
|
+
operation,
|
|
52
|
+
variables,
|
|
53
|
+
init,
|
|
54
|
+
response,
|
|
55
|
+
result
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return { result, response };
|
|
59
|
+
}
|
|
60
|
+
async executeSubscription(operation, variables, requestContext, controller) {
|
|
61
|
+
for (const middleware of this.config.middlewares.beforeSerialization) {
|
|
62
|
+
[operation, variables] = await middleware({
|
|
63
|
+
clientContext: this.config.context,
|
|
64
|
+
requestContext,
|
|
65
|
+
operation,
|
|
66
|
+
variables
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
let init = await this.config.serializer.serializeRequest({
|
|
70
|
+
clientContext: this.config.context,
|
|
71
|
+
requestContext,
|
|
72
|
+
operation,
|
|
73
|
+
variables
|
|
74
|
+
});
|
|
75
|
+
for (const middleware of this.config.middlewares.afterSerialization.subscription) {
|
|
76
|
+
init = await middleware({
|
|
77
|
+
clientContext: this.config.context,
|
|
78
|
+
requestContext,
|
|
79
|
+
operation,
|
|
80
|
+
variables,
|
|
81
|
+
init,
|
|
82
|
+
controller
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
init.signal = controller.signal;
|
|
86
|
+
let response = await this.config.fetcher(init);
|
|
87
|
+
for (const middleware of this.config.middlewares.beforeParsing.subscription) {
|
|
88
|
+
response = await middleware({
|
|
89
|
+
clientContext: this.config.context,
|
|
90
|
+
requestContext,
|
|
91
|
+
operation,
|
|
92
|
+
variables,
|
|
93
|
+
init,
|
|
94
|
+
response,
|
|
95
|
+
controller
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
let result = await this.config.parser.parseBodySubscription({
|
|
99
|
+
clientContext: this.config.context,
|
|
100
|
+
requestContext,
|
|
101
|
+
operation,
|
|
102
|
+
response,
|
|
103
|
+
controller
|
|
104
|
+
});
|
|
105
|
+
for (const middleware of this.config.middlewares.afterParsing.subscription) {
|
|
106
|
+
result = await middleware({
|
|
107
|
+
clientContext: this.config.context,
|
|
108
|
+
requestContext,
|
|
109
|
+
operation,
|
|
110
|
+
variables,
|
|
111
|
+
init,
|
|
112
|
+
response,
|
|
113
|
+
result,
|
|
114
|
+
controller
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return { result, response };
|
|
118
|
+
}
|
|
119
|
+
}
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
1
|
+
export * as parsers from './parsers/index.js';
|
|
2
|
+
export * as serializers from './serializers/index.js';
|
|
3
|
+
export type * as types from './types/index.js';
|
|
4
|
+
export { Executor } from './executor.js';
|
package/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export {
|
|
1
|
+
export * as parsers from './parsers/index.js';
|
|
2
|
+
export * as serializers from './serializers/index.js';
|
|
3
|
+
export { Executor } from './executor.js';
|
package/package.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createParser, type CreateParserOptions } from './parser.js';
|
package/parsers/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createParser } from './parser.js';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { RequestContext, SubscriptionOperation } from '@/types/base.js';
|
|
2
|
+
import { ClientParserParseBodySubscriptionOptions } from '@/types/parser.js';
|
|
3
|
+
export declare function buildParseBodySubscriptionFunc<TClientContext, TRequestContext extends RequestContext>(): <T extends SubscriptionOperation<unknown, unknown>>(options: ClientParserParseBodySubscriptionOptions<TClientContext, TRequestContext, T>) => Promise<any>;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
export function buildParseBodySubscriptionFunc() {
|
|
3
|
+
return async (options
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
) => {
|
|
6
|
+
if (options.response.status !== 200) {
|
|
7
|
+
throw new Error(await options.response.text());
|
|
8
|
+
}
|
|
9
|
+
assert(options.response.headers.get('content-type') ===
|
|
10
|
+
'text/event-stream');
|
|
11
|
+
const rStream = options.response.body;
|
|
12
|
+
assert(rStream !== null);
|
|
13
|
+
const reader = rStream.getReader();
|
|
14
|
+
const decoder = new TextDecoder();
|
|
15
|
+
let shouldClose = false;
|
|
16
|
+
let resolve;
|
|
17
|
+
const signal = new Promise(res => resolve = res);
|
|
18
|
+
const close = () => {
|
|
19
|
+
shouldClose = true;
|
|
20
|
+
resolve({ done: true, value: undefined });
|
|
21
|
+
options.controller.abort();
|
|
22
|
+
};
|
|
23
|
+
const stream = async function* () {
|
|
24
|
+
while (!shouldClose) {
|
|
25
|
+
const readResult = await Promise.race([
|
|
26
|
+
reader.read(),
|
|
27
|
+
signal
|
|
28
|
+
]);
|
|
29
|
+
if (readResult.done)
|
|
30
|
+
return;
|
|
31
|
+
const lines = decoder.decode(readResult.value)
|
|
32
|
+
.split('\n');
|
|
33
|
+
for (const line of lines.filter(c => c !== '')) {
|
|
34
|
+
if (shouldClose)
|
|
35
|
+
break;
|
|
36
|
+
const [name, value] = line.split(/:(.*)/s, 2);
|
|
37
|
+
if (name !== 'data')
|
|
38
|
+
continue;
|
|
39
|
+
yield options.operation.resultSchema.parse(JSON.parse(value).data);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}();
|
|
43
|
+
return {
|
|
44
|
+
stream,
|
|
45
|
+
close,
|
|
46
|
+
[Symbol.dispose]: close
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ClientParser, Operation, RequestContext,
|
|
1
|
+
import { ClientParser, Operation, RequestContext, ClientParserParseBodySyncOptions } from '../types/index.js';
|
|
2
2
|
export interface CreateParserOptions<TClientContext, TRequestContext extends RequestContext> {
|
|
3
|
-
onErrors: <T extends Operation<unknown, unknown>>(options:
|
|
3
|
+
onErrors: <T extends Operation<unknown, unknown>>(options: ClientParserParseBodySyncOptions<TClientContext, TRequestContext, T>, errors: any[]) => Promise<void> | void;
|
|
4
4
|
}
|
|
5
5
|
export declare function createParser<TClientContext, TRequestContext extends RequestContext>(parserOptions?: CreateParserOptions<TClientContext, TRequestContext>): ClientParser<TClientContext, TRequestContext>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { buildParseBodySubscriptionFunc } from './parseBodySubscription.js';
|
|
2
|
+
const defaultParserOptions = {
|
|
3
|
+
onErrors(_, errors) {
|
|
4
|
+
throw new Error(JSON.stringify(errors));
|
|
5
|
+
},
|
|
6
|
+
};
|
|
7
|
+
export function createParser(parserOptions = defaultParserOptions) {
|
|
8
|
+
return {
|
|
9
|
+
parseBodySync: async (options
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
) => {
|
|
12
|
+
const json = await options.response.json();
|
|
13
|
+
if (json.errors) {
|
|
14
|
+
await parserOptions.onErrors(options, json.errors);
|
|
15
|
+
}
|
|
16
|
+
return options.operation.resultSchema.parse(json.data);
|
|
17
|
+
},
|
|
18
|
+
parseBodySubscription: buildParseBodySubscriptionFunc()
|
|
19
|
+
};
|
|
20
|
+
}
|
package/types/config.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RequestContext } from './base.js';
|
|
2
|
-
import { ClientMiddlewaresConfig } from './middlewares.js';
|
|
2
|
+
import { ClientMiddlewaresConfig } from './middlewares/config.js';
|
|
3
3
|
import { ClientParser } from './parser.js';
|
|
4
4
|
import { ClientSerializer } from './serializer.js';
|
|
5
5
|
export interface ClientConfig<TClientContext, TRequestContext extends RequestContext> {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { OperationResult, OperationVariables, RequestContext, SubscriptionOperation, SyncOperation } from './base.js';
|
|
2
|
+
import { SubOpAsyncIterable } from './parser.js';
|
|
3
|
+
export interface ExecuteResult<TResult> {
|
|
4
|
+
result: TResult;
|
|
5
|
+
response: Response;
|
|
6
|
+
}
|
|
7
|
+
export interface IExecutor<TRequestContext extends RequestContext> {
|
|
8
|
+
executeSync<T extends SyncOperation<unknown, unknown>>(operation: T, variables: OperationVariables<T>, requestContext: TRequestContext): Promise<ExecuteResult<OperationResult<T>>>;
|
|
9
|
+
executeSubscription<T extends SubscriptionOperation<unknown, unknown>>(operation: T, variables: OperationVariables<T>, requestContext: TRequestContext, controller: AbortController): Promise<ExecuteResult<SubOpAsyncIterable<OperationResult<T>>>>;
|
|
10
|
+
}
|
package/types/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export type { Operation, SyncOperation, SubscriptionOperation, RequestContext, OperationVariables, OperationResult } from './base.js';
|
|
2
|
-
export
|
|
3
|
-
export type { ClientParser,
|
|
2
|
+
export * as middlewares from './middlewares/index.js';
|
|
3
|
+
export type { ClientParser, ClientParserParseBodySyncOptions, ClientParserParseBodySubscriptionOptions, SubOpAsyncIterable } from './parser.js';
|
|
4
4
|
export type { ClientSerializer } from './serializer.js';
|
|
5
5
|
export type { ClientConfig } from './config.js';
|
|
6
6
|
export type { OpResultBasedOnOp } from './utils.js';
|
|
7
|
+
export type { IExecutor, ExecuteResult } from './iexecutor.js';
|
package/types/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export
|
|
1
|
+
export * as middlewares from './middlewares/index.js';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RequestContext } from '../base.js';
|
|
2
|
+
import { AfterSerializationSubscriptionMiddleware, AfterSerializationSyncMiddleware, BeforeSerializationMiddleware } from './serialization.js';
|
|
3
|
+
import { AfterParsingSubscriptionMiddleware, AfterParsingSyncMiddleware, BeforeParsingSubscriptionMiddleware, BeforeParsingSyncMiddleware } from './parsing.js';
|
|
4
|
+
export interface ClientMiddlewaresConfig<TClientContext, TRequestContext extends RequestContext> {
|
|
5
|
+
beforeSerialization: BeforeSerializationMiddleware<TClientContext, TRequestContext>[];
|
|
6
|
+
afterSerialization: {
|
|
7
|
+
sync: AfterSerializationSyncMiddleware<TClientContext, TRequestContext>[];
|
|
8
|
+
subscription: AfterSerializationSubscriptionMiddleware<TClientContext, TRequestContext>[];
|
|
9
|
+
};
|
|
10
|
+
beforeParsing: {
|
|
11
|
+
sync: BeforeParsingSyncMiddleware<TClientContext, TRequestContext>[];
|
|
12
|
+
subscription: BeforeParsingSubscriptionMiddleware<TClientContext, TRequestContext>[];
|
|
13
|
+
};
|
|
14
|
+
afterParsing: {
|
|
15
|
+
sync: AfterParsingSyncMiddleware<TClientContext, TRequestContext>[];
|
|
16
|
+
subscription: AfterParsingSubscriptionMiddleware<TClientContext, TRequestContext>[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export type { BeforeSerializationMiddleware, AfterSerializationSyncMiddleware, AfterSerializationSubscriptionMiddleware, } from './serialization.js';
|
|
2
|
+
export type { BeforeParsingSyncMiddleware, BeforeParsingSubscriptionMiddleware, AfterParsingSyncMiddleware, AfterParsingSubscriptionMiddleware, } from './parsing.js';
|
|
3
|
+
export type { ClientMiddlewaresConfig } from './config.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { OperationResult, OperationVariables, RequestContext, SubscriptionOperation, SyncOperation } from '../base.js';
|
|
2
|
+
import { SubOpAsyncIterable } from '../parser.js';
|
|
3
|
+
import { OpResultBasedOnOp, PromiseOrValue } from '../utils.js';
|
|
4
|
+
export type BeforeParsingSyncMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends SyncOperation<unknown, unknown>>(options: {
|
|
5
|
+
clientContext: TClientContext;
|
|
6
|
+
requestContext: TRequestContext;
|
|
7
|
+
operation: T;
|
|
8
|
+
variables: OperationVariables<T>;
|
|
9
|
+
init: RequestInit;
|
|
10
|
+
response: Response;
|
|
11
|
+
}) => PromiseOrValue<Response>;
|
|
12
|
+
export type BeforeParsingSubscriptionMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends SubscriptionOperation<unknown, unknown>>(options: {
|
|
13
|
+
clientContext: TClientContext;
|
|
14
|
+
requestContext: TRequestContext;
|
|
15
|
+
operation: T;
|
|
16
|
+
variables: OperationVariables<T>;
|
|
17
|
+
init: RequestInit;
|
|
18
|
+
response: Response;
|
|
19
|
+
controller: AbortController;
|
|
20
|
+
}) => PromiseOrValue<Response>;
|
|
21
|
+
export interface AfterParsingSyncMiddlewareOptions<TClientContext, TRequestContext extends RequestContext, T extends SyncOperation<unknown, unknown>> {
|
|
22
|
+
clientContext: TClientContext;
|
|
23
|
+
requestContext: TRequestContext;
|
|
24
|
+
operation: T;
|
|
25
|
+
variables: OperationVariables<T>;
|
|
26
|
+
init: RequestInit;
|
|
27
|
+
response: Response;
|
|
28
|
+
result: OpResultBasedOnOp<T>;
|
|
29
|
+
}
|
|
30
|
+
export interface AfterParsingSubscriptionMiddlewareOptions<TClientContext, TRequestContext extends RequestContext, T extends SubscriptionOperation<unknown, unknown>> {
|
|
31
|
+
clientContext: TClientContext;
|
|
32
|
+
requestContext: TRequestContext;
|
|
33
|
+
operation: T;
|
|
34
|
+
variables: OperationVariables<T>;
|
|
35
|
+
init: RequestInit;
|
|
36
|
+
response: Response;
|
|
37
|
+
result: OpResultBasedOnOp<T>;
|
|
38
|
+
controller: AbortController;
|
|
39
|
+
}
|
|
40
|
+
export type AfterParsingSyncMiddleware<TClientContext, TRequestContext extends RequestContext> = <TSyncOp extends SyncOperation<unknown, unknown>>(options: AfterParsingSyncMiddlewareOptions<TClientContext, TRequestContext, TSyncOp>) => PromiseOrValue<OperationResult<TSyncOp>>;
|
|
41
|
+
export type AfterParsingSubscriptionMiddleware<TClientContext, TRequestContext extends RequestContext> = <TSubOp extends SubscriptionOperation<unknown, unknown>>(options: AfterParsingSubscriptionMiddlewareOptions<TClientContext, TRequestContext, TSubOp>) => PromiseOrValue<SubOpAsyncIterable<OperationResult<TSubOp>>>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Operation, OperationVariables, RequestContext, SubscriptionOperation, SyncOperation } from '../base.js';
|
|
2
|
+
import { PromiseOrValue } from '../utils.js';
|
|
3
|
+
export type BeforeSerializationMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation<unknown, unknown>>(options: {
|
|
4
|
+
clientContext: TClientContext;
|
|
5
|
+
requestContext: TRequestContext;
|
|
6
|
+
operation: T;
|
|
7
|
+
variables: OperationVariables<T>;
|
|
8
|
+
}) => PromiseOrValue<[T, OperationVariables<T>]>;
|
|
9
|
+
export type AfterSerializationSyncMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends SyncOperation<unknown, unknown>>(options: {
|
|
10
|
+
clientContext: TClientContext;
|
|
11
|
+
requestContext: TRequestContext;
|
|
12
|
+
operation: T;
|
|
13
|
+
variables: OperationVariables<T>;
|
|
14
|
+
init: RequestInit;
|
|
15
|
+
}) => PromiseOrValue<RequestInit>;
|
|
16
|
+
export type AfterSerializationSubscriptionMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends SubscriptionOperation<unknown, unknown>>(options: {
|
|
17
|
+
clientContext: TClientContext;
|
|
18
|
+
requestContext: TRequestContext;
|
|
19
|
+
operation: T;
|
|
20
|
+
variables: OperationVariables<T>;
|
|
21
|
+
init: RequestInit;
|
|
22
|
+
controller: AbortController;
|
|
23
|
+
}) => PromiseOrValue<RequestInit>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/types/parser.d.ts
CHANGED
|
@@ -1,20 +1,25 @@
|
|
|
1
1
|
import type { SubscriptionOperation, SyncOperation, RequestContext, Operation, OperationResult } from './base.js';
|
|
2
2
|
import { PromiseOrValue } from './utils.js';
|
|
3
|
-
export interface
|
|
3
|
+
export interface ClientParserParseBodySyncOptions<TClientContext, TRequestContext extends RequestContext, TOperation extends Operation<unknown, unknown>> {
|
|
4
4
|
clientContext: TClientContext;
|
|
5
5
|
requestContext: TRequestContext;
|
|
6
6
|
operation: TOperation;
|
|
7
7
|
response: Response;
|
|
8
8
|
}
|
|
9
|
-
export
|
|
9
|
+
export interface ClientParserParseBodySubscriptionOptions<TClientContext, TRequestContext extends RequestContext, TOperation extends Operation<unknown, unknown>> {
|
|
10
|
+
clientContext: TClientContext;
|
|
11
|
+
requestContext: TRequestContext;
|
|
12
|
+
operation: TOperation;
|
|
13
|
+
response: Response;
|
|
14
|
+
controller: AbortController;
|
|
15
|
+
}
|
|
16
|
+
export interface SubOpAsyncIterable<TResult> extends Disposable {
|
|
10
17
|
stream: AsyncIterable<TResult, void, unknown>;
|
|
11
18
|
close: () => void;
|
|
12
|
-
}
|
|
13
|
-
export type
|
|
14
|
-
|
|
15
|
-
<TSubOp extends SubscriptionOperation<unknown, unknown>>(options: ClientParserParseBodyOptions<TClientContext, TRequestContext, TSubOp>): PromiseOrValue<SubOpAsyncIterable<OperationResult<TSubOp>>>;
|
|
16
|
-
<TOp extends Operation<unknown, unknown>>(options: ClientParserParseBodyOptions<TClientContext, TRequestContext, TOp>): PromiseOrValue<OperationResult<TOp>> | PromiseOrValue<SubOpAsyncIterable<OperationResult<TOp>>>;
|
|
17
|
-
};
|
|
19
|
+
}
|
|
20
|
+
export type ParseBodySyncFuncType<TClientContext, TRequestContext extends RequestContext> = <TSyncOp extends SyncOperation<unknown, unknown>>(options: ClientParserParseBodySyncOptions<TClientContext, TRequestContext, TSyncOp>) => PromiseOrValue<OperationResult<TSyncOp>>;
|
|
21
|
+
export type ParseBodySubscriptionFuncType<TClientContext, TRequestContext extends RequestContext> = <TSubOp extends SubscriptionOperation<unknown, unknown>>(options: ClientParserParseBodySubscriptionOptions<TClientContext, TRequestContext, TSubOp>) => PromiseOrValue<SubOpAsyncIterable<OperationResult<TSubOp>>>;
|
|
18
22
|
export interface ClientParser<TClientContext, TRequestContext extends RequestContext> {
|
|
19
|
-
|
|
23
|
+
parseBodySync: ParseBodySyncFuncType<TClientContext, TRequestContext>;
|
|
24
|
+
parseBodySubscription: ParseBodySubscriptionFuncType<TClientContext, TRequestContext>;
|
|
20
25
|
}
|
package/execute.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { ClientConfig, Operation, OperationResult, OperationVariables, RequestContext, SubOpAsyncIterable, SubscriptionOperation, SyncOperation } from './types/index.js';
|
|
2
|
-
import { OpResultBasedOnOp } from './types/utils.js';
|
|
3
|
-
export interface ExecuteResult<TResult> {
|
|
4
|
-
result: TResult;
|
|
5
|
-
response: Response;
|
|
6
|
-
}
|
|
7
|
-
export declare function execute<TClientContext, TRequestContext extends RequestContext, T extends Operation<unknown, unknown>>(config: ClientConfig<TClientContext, TRequestContext>, operation: T, variables: OperationVariables<T>, requestContext: TRequestContext): Promise<ExecuteResult<OpResultBasedOnOp<T>>>;
|
|
8
|
-
export type Executor<TRequestContext extends RequestContext> = {
|
|
9
|
-
<TSyncOp extends SyncOperation<unknown, unknown>>(operation: TSyncOp, variables: OperationVariables<TSyncOp>, context: TRequestContext): Promise<ExecuteResult<OperationResult<TSyncOp>>>;
|
|
10
|
-
<TOperation extends SubscriptionOperation<unknown, unknown>>(operation: TOperation, variables: OperationVariables<TOperation>, context: TRequestContext): Promise<ExecuteResult<SubOpAsyncIterable<OperationResult<TOperation>>>>;
|
|
11
|
-
};
|
|
12
|
-
export declare function bindConfigToExecute<TClientContext, TRequestContext extends RequestContext>(config: ClientConfig<TClientContext, TRequestContext>): Executor<TRequestContext>;
|
package/execute.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
export async function execute(config, operation, variables, requestContext) {
|
|
2
|
-
for (const middleware of config.middlewares.beforeSerialization) {
|
|
3
|
-
[operation, variables] = await middleware({
|
|
4
|
-
clientContext: config.context,
|
|
5
|
-
requestContext,
|
|
6
|
-
operation,
|
|
7
|
-
variables
|
|
8
|
-
});
|
|
9
|
-
}
|
|
10
|
-
let init = await config.serializer.serializeRequest({
|
|
11
|
-
clientContext: config.context,
|
|
12
|
-
requestContext,
|
|
13
|
-
operation,
|
|
14
|
-
variables
|
|
15
|
-
});
|
|
16
|
-
for (const middleware of config.middlewares.afterSerialization) {
|
|
17
|
-
init = await middleware({
|
|
18
|
-
clientContext: config.context,
|
|
19
|
-
requestContext,
|
|
20
|
-
operation,
|
|
21
|
-
variables,
|
|
22
|
-
init
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
let response = await config.fetcher(init);
|
|
26
|
-
for (const middleware of config.middlewares.beforeParsing) {
|
|
27
|
-
response = await middleware({
|
|
28
|
-
clientContext: config.context,
|
|
29
|
-
requestContext,
|
|
30
|
-
operation,
|
|
31
|
-
variables,
|
|
32
|
-
init,
|
|
33
|
-
response
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
let result = await config.parser.parseBody({
|
|
37
|
-
clientContext: config.context,
|
|
38
|
-
requestContext,
|
|
39
|
-
operation,
|
|
40
|
-
response
|
|
41
|
-
});
|
|
42
|
-
for (const middleware of config.middlewares.afterParsing) {
|
|
43
|
-
result = await middleware({
|
|
44
|
-
clientContext: config.context,
|
|
45
|
-
requestContext,
|
|
46
|
-
operation,
|
|
47
|
-
variables,
|
|
48
|
-
init,
|
|
49
|
-
response,
|
|
50
|
-
result
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
return { result, response };
|
|
54
|
-
}
|
|
55
|
-
export function bindConfigToExecute(config) {
|
|
56
|
-
return (operation, variables, requestContext) => execute(config, operation, variables, requestContext
|
|
57
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
58
|
-
);
|
|
59
|
-
}
|
package/parser.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import assert from 'assert';
|
|
2
|
-
const defaultParserOptions = {
|
|
3
|
-
onErrors(_, errors) {
|
|
4
|
-
throw new Error(JSON.stringify(errors));
|
|
5
|
-
},
|
|
6
|
-
};
|
|
7
|
-
export function createParser(parserOptions = defaultParserOptions) {
|
|
8
|
-
return {
|
|
9
|
-
parseBody: async (options
|
|
10
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
-
) => {
|
|
12
|
-
if (options.operation.type === 'SUBSCRIPTION') {
|
|
13
|
-
if (options.response.status !== 200) {
|
|
14
|
-
throw new Error(await options.response.text());
|
|
15
|
-
}
|
|
16
|
-
assert(options.response.headers.get('content-type') ===
|
|
17
|
-
'text/event-stream');
|
|
18
|
-
const rStream = options.response.body;
|
|
19
|
-
assert(rStream !== null);
|
|
20
|
-
const reader = rStream.getReader();
|
|
21
|
-
const decoder = new TextDecoder();
|
|
22
|
-
let shouldClose = false;
|
|
23
|
-
let resolve;
|
|
24
|
-
const signal = new Promise(res => resolve = res);
|
|
25
|
-
const close = () => {
|
|
26
|
-
shouldClose = true;
|
|
27
|
-
resolve({ done: true, value: undefined });
|
|
28
|
-
};
|
|
29
|
-
const stream = async function* () {
|
|
30
|
-
while (!shouldClose) {
|
|
31
|
-
const readResult = await Promise.race([
|
|
32
|
-
reader.read(),
|
|
33
|
-
signal
|
|
34
|
-
]);
|
|
35
|
-
if (readResult.done || shouldClose)
|
|
36
|
-
break;
|
|
37
|
-
const lines = decoder.decode(readResult.value)
|
|
38
|
-
.split('\n');
|
|
39
|
-
for (const line of lines.filter(c => c !== '')) {
|
|
40
|
-
if (shouldClose)
|
|
41
|
-
return;
|
|
42
|
-
const [name, value] = line.split(/:(.*)/s, 2);
|
|
43
|
-
if (name !== 'data')
|
|
44
|
-
continue;
|
|
45
|
-
yield options.operation.resultSchema.parse(JSON.parse(value).data);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}();
|
|
49
|
-
return { stream, close };
|
|
50
|
-
}
|
|
51
|
-
const json = await options.response.json();
|
|
52
|
-
if (json.errors) {
|
|
53
|
-
await parserOptions.onErrors(options, json.errors);
|
|
54
|
-
}
|
|
55
|
-
return options.operation.resultSchema.parse(json.data);
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
}
|
package/types/middlewares.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { Operation, SubscriptionOperation, SyncOperation, RequestContext, OperationVariables, OperationResult } from './base.js';
|
|
2
|
-
import { SubOpAsyncIterable } from './parser.js';
|
|
3
|
-
import { OpResultBasedOnOp, PromiseOrValue } from './utils.js';
|
|
4
|
-
export type BeforeSerializationMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation<unknown, unknown>>(options: {
|
|
5
|
-
clientContext: TClientContext;
|
|
6
|
-
requestContext: TRequestContext;
|
|
7
|
-
operation: T;
|
|
8
|
-
variables: OperationVariables<T>;
|
|
9
|
-
}) => PromiseOrValue<[T, OperationVariables<T>]>;
|
|
10
|
-
export type AfterSerializationMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation<unknown, unknown>>(options: {
|
|
11
|
-
clientContext: TClientContext;
|
|
12
|
-
requestContext: TRequestContext;
|
|
13
|
-
operation: T;
|
|
14
|
-
variables: OperationVariables<T>;
|
|
15
|
-
init: RequestInit;
|
|
16
|
-
}) => PromiseOrValue<RequestInit>;
|
|
17
|
-
export type BeforeParsingMiddleware<TClientContext, TRequestContext extends RequestContext> = <T extends Operation<unknown, unknown>>(options: {
|
|
18
|
-
clientContext: TClientContext;
|
|
19
|
-
requestContext: TRequestContext;
|
|
20
|
-
operation: T;
|
|
21
|
-
variables: OperationVariables<T>;
|
|
22
|
-
init: RequestInit;
|
|
23
|
-
response: Response;
|
|
24
|
-
}) => PromiseOrValue<Response>;
|
|
25
|
-
export interface AfterParsingMiddlewareOptions<TClientContext, TRequestContext extends RequestContext, T extends Operation<unknown, unknown>> {
|
|
26
|
-
clientContext: TClientContext;
|
|
27
|
-
requestContext: TRequestContext;
|
|
28
|
-
operation: T;
|
|
29
|
-
variables: OperationVariables<T>;
|
|
30
|
-
init: RequestInit;
|
|
31
|
-
response: Response;
|
|
32
|
-
result: OpResultBasedOnOp<T>;
|
|
33
|
-
}
|
|
34
|
-
export type AfterParsingMiddleware<TClientContext, TRequestContext extends RequestContext> = {
|
|
35
|
-
<TSyncOp extends SyncOperation<unknown, unknown>>(options: AfterParsingMiddlewareOptions<TClientContext, TRequestContext, TSyncOp>): PromiseOrValue<OperationResult<TSyncOp>>;
|
|
36
|
-
<TSubOp extends SubscriptionOperation<unknown, unknown>>(options: AfterParsingMiddlewareOptions<TClientContext, TRequestContext, TSubOp>): PromiseOrValue<SubOpAsyncIterable<OperationResult<TSubOp>>>;
|
|
37
|
-
<TOp extends Operation<unknown, unknown>>(options: AfterParsingMiddlewareOptions<TClientContext, TRequestContext, TOp>): PromiseOrValue<OperationResult<TOp>> | PromiseOrValue<SubOpAsyncIterable<OperationResult<TOp>>>;
|
|
38
|
-
};
|
|
39
|
-
export interface ClientMiddlewaresConfig<TClientContext, TRequestContext extends RequestContext> {
|
|
40
|
-
beforeSerialization: BeforeSerializationMiddleware<TClientContext, TRequestContext>[];
|
|
41
|
-
afterSerialization: AfterSerializationMiddleware<TClientContext, TRequestContext>[];
|
|
42
|
-
beforeParsing: BeforeParsingMiddleware<TClientContext, TRequestContext>[];
|
|
43
|
-
afterParsing: AfterParsingMiddleware<TClientContext, TRequestContext>[];
|
|
44
|
-
}
|
|
File without changes
|