Skip to content

Commit 8c790a3

Browse files
committed
upstreamtimeout needs to change executionrequest instance
1 parent 7e74cd7 commit 8c790a3

File tree

1 file changed

+19
-13
lines changed

1 file changed

+19
-13
lines changed

packages/runtime/src/plugins/useUpstreamTimeout.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ import { subgraphNameByExecutionRequest } from '@graphql-mesh/fusion-runtime';
33
import { UpstreamErrorExtensions } from '@graphql-mesh/transport-common';
44
import { getHeadersObj } from '@graphql-mesh/utils';
55
import {
6-
createDeferred,
76
createGraphQLError,
87
ExecutionRequest,
9-
ExecutionResult,
108
isAsyncIterable,
119
isPromise,
1210
} from '@graphql-tools/utils';
@@ -59,19 +57,29 @@ export function useUpstreamTimeout<TContext extends Record<string, any>>(
5957
if (executionRequest.signal) {
6058
signals.push(executionRequest.signal);
6159
}
62-
const timeoutDeferred = createDeferred<ExecutionResult>();
63-
function rejectDeferred() {
64-
timeoutDeferred.reject(timeoutSignal?.reason);
65-
}
66-
timeoutSignal.addEventListener('abort', rejectDeferred, {
67-
once: true,
60+
// we want to create a new executionrequest and not mutate the existing one becaus, when using
61+
// this with useUpstreamRetry, the same executionRequest will be used for each retry and we need
62+
// to timeoutSignalsByExecutionRequest.set(...) again above
63+
const res$ = executor({
64+
...executionRequest,
65+
signal: abortSignalAny(signals),
6866
});
69-
executionRequest.signal = abortSignalAny(signals);
70-
const res$ = executor(executionRequest);
7167
if (!isPromise(res$)) {
7268
return res$;
7369
}
74-
return Promise.race([timeoutDeferred.promise, res$])
70+
return Promise.race([
71+
new Promise<never>((_, reject) => {
72+
if (timeoutSignal.aborted) {
73+
return reject(timeoutSignal.reason);
74+
}
75+
timeoutSignal.addEventListener(
76+
'abort',
77+
() => reject(timeoutSignal.reason),
78+
{ once: true },
79+
);
80+
}),
81+
res$,
82+
])
7583
.then((result) => {
7684
if (isAsyncIterable(result)) {
7785
return {
@@ -111,8 +119,6 @@ export function useUpstreamTimeout<TContext extends Record<string, any>>(
111119
throw e;
112120
})
113121
.finally(() => {
114-
timeoutDeferred.resolve(undefined as any);
115-
timeoutSignal.removeEventListener('abort', rejectDeferred);
116122
// Remove from the map after used so we don't see it again
117123
errorExtensionsByExecRequest.delete(executionRequest);
118124
timeoutSignalsByExecutionRequest.delete(executionRequest);

0 commit comments

Comments
 (0)