This repository has been archived by the owner on Apr 15, 2020. It is now read-only.
forked from ardatan/graphql-tools
/
AwaitVariablesLink.ts
57 lines (51 loc) · 1.54 KB
/
AwaitVariablesLink.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
import {
ApolloLink,
Operation,
NextLink,
Observable,
FetchResult,
} from 'apollo-link';
function getFinalPromise(object: any): Promise<any> {
return Promise.resolve(object).then(resolvedObject => {
if (resolvedObject == null) {
return resolvedObject;
}
if (Array.isArray(resolvedObject)) {
return Promise.all(resolvedObject.map(o => getFinalPromise(o)));
} else if (typeof resolvedObject === 'object') {
const keys = Object.keys(resolvedObject);
return Promise.all(
keys.map(key => getFinalPromise(resolvedObject[key])),
).then(awaitedValues => {
for (let i = 0; i < keys.length; i++) {
resolvedObject[keys[i]] = awaitedValues[i];
}
return resolvedObject;
});
}
return resolvedObject;
});
}
class AwaitVariablesLink extends ApolloLink {
request(operation: Operation, forward: NextLink): Observable<FetchResult> {
return new Observable(observer => {
let subscription: any;
getFinalPromise(operation.variables)
.then(resolvedVariables => {
operation.variables = resolvedVariables;
subscription = forward(operation).subscribe({
next: observer.next.bind(observer),
error: observer.error.bind(observer),
complete: observer.complete.bind(observer),
});
})
.catch(observer.error.bind(observer));
return () => {
if (subscription != null) {
subscription.unsubscribe();
}
};
});
}
}
export { AwaitVariablesLink };