/
Transformer.ts
64 lines (52 loc) · 2.22 KB
/
Transformer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import { ExecutionRequest, ExecutionResult } from '@graphql-tools/utils';
import { DelegationContext, Transform } from './types';
import { prepareGatewayDocument } from './prepareGatewayDocument';
import { finalizeGatewayRequest } from './finalizeGatewayRequest';
import { checkResultAndHandleErrors } from './checkResultAndHandleErrors';
interface Transformation<TContext> {
transform: Transform<any, TContext>;
context: Record<string, any>;
}
export class Transformer<TContext extends Record<string, any> = Record<string, any>> {
private transformations: Array<Transformation<TContext>> = [];
private delegationContext: DelegationContext<TContext>;
constructor(context: DelegationContext<TContext>) {
this.delegationContext = context;
const transforms = context.transforms;
const delegationTransforms = transforms.slice().reverse();
for (const transform of delegationTransforms) {
this.addTransform(transform, {});
}
}
private addTransform(transform: Transform<any, TContext>, context = {}) {
this.transformations.push({ transform, context });
}
public transformRequest(originalRequest: ExecutionRequest): ExecutionRequest {
let request = {
...originalRequest,
document: prepareGatewayDocument(
originalRequest.document,
this.delegationContext.transformedSchema,
this.delegationContext.returnType,
this.delegationContext.info?.schema
),
};
for (const transformation of this.transformations) {
if (transformation.transform.transformRequest) {
request = transformation.transform.transformRequest(request, this.delegationContext, transformation.context);
}
}
return finalizeGatewayRequest(request, this.delegationContext);
}
public transformResult(originalResult: ExecutionResult) {
let result = originalResult;
// from right to left
for (let i = this.transformations.length - 1; i >= 0; i--) {
const transformation = this.transformations[i];
if (transformation.transform.transformResult) {
result = transformation.transform.transformResult(result, this.delegationContext, transformation.context);
}
}
return checkResultAndHandleErrors(result, this.delegationContext);
}
}