Skip to content

Commit 6fe23a4

Browse files
committed
Format
1 parent 4f34589 commit 6fe23a4

File tree

5 files changed

+221
-176
lines changed

5 files changed

+221
-176
lines changed

packages/fusion-runtime/src/unifiedGraphManager.ts

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -166,13 +166,13 @@ export class UnifiedGraphManager<TContext> implements AsyncDisposable {
166166
() => {
167167
this.polling$ = undefined;
168168
},
169-
err => {
169+
(err) => {
170170
this.opts.transportContext?.logger?.error(
171171
'Failed to poll Supergraph',
172172
err,
173173
);
174174
this.polling$ = undefined;
175-
}
175+
},
176176
);
177177
}
178178
if (!this.unifiedGraph) {
@@ -353,11 +353,14 @@ export class UnifiedGraphManager<TContext> implements AsyncDisposable {
353353
}
354354
return handleMaybePromise(
355355
() => {
356-
const jobResult = disposeAll([previousTransportExecutorStack, previousExecutor]);
356+
const jobResult = disposeAll([
357+
previousTransportExecutorStack,
358+
previousExecutor,
359+
]);
357360
this.disposeReason = undefined;
358361
return jobResult;
359362
},
360-
() => this.unifiedGraph!
363+
() => this.unifiedGraph!,
361364
);
362365
}
363366

@@ -437,28 +440,30 @@ export class UnifiedGraphManager<TContext> implements AsyncDisposable {
437440
},
438441
},
439442
);
440-
return handleMaybePromise(() => disposeAll([
441-
this._transportExecutorStack,
442-
this.executor
443-
]), () => {
444-
this.unifiedGraph = undefined;
445-
this.initialUnifiedGraph$ = undefined;
446-
this.lastLoadedUnifiedGraph = undefined;
447-
this.inContextSDK = undefined;
448-
this.lastLoadTime = undefined;
449-
this.polling$ = undefined;
450-
this.executor = undefined;
451-
this._transportEntryMap = undefined;
452-
this._transportExecutorStack = undefined;
453-
this.executor = undefined;
454-
}) as Promise<void>;
443+
return handleMaybePromise(
444+
() => disposeAll([this._transportExecutorStack, this.executor]),
445+
() => {
446+
this.unifiedGraph = undefined;
447+
this.initialUnifiedGraph$ = undefined;
448+
this.lastLoadedUnifiedGraph = undefined;
449+
this.inContextSDK = undefined;
450+
this.lastLoadTime = undefined;
451+
this.polling$ = undefined;
452+
this.executor = undefined;
453+
this._transportEntryMap = undefined;
454+
this._transportExecutorStack = undefined;
455+
this.executor = undefined;
456+
},
457+
) as Promise<void>;
455458
}
456459
}
457460

458461
function disposeAll(disposables: unknown[]) {
459-
const disposalJobs = disposables.map((disposable) =>
460-
isDisposable(disposable) ? dispose(disposable) : undefined,
461-
).filter(isPromise);
462+
const disposalJobs = disposables
463+
.map((disposable) =>
464+
isDisposable(disposable) ? dispose(disposable) : undefined,
465+
)
466+
.filter(isPromise);
462467
if (disposalJobs.length === 0) {
463468
return undefined;
464469
} else if (disposalJobs.length === 1) {

packages/fusion-runtime/tests/polling.test.ts

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import {
1414
} from '@graphql-tools/utils';
1515
import { assertSingleExecutionValue } from '@internal/testing';
1616
import { DisposableSymbols } from '@whatwg-node/disposablestack';
17-
import { DeferredPromise, handleMaybePromise } from '@whatwg-node/promise-helpers';
17+
import {
18+
DeferredPromise,
19+
handleMaybePromise,
20+
} from '@whatwg-node/promise-helpers';
1821
import { ExecutionResult, GraphQLSchema, parse } from 'graphql';
1922
import { createSchema } from 'graphql-yoga';
2023
import { describe, expect, it, vi } from 'vitest';
@@ -76,40 +79,57 @@ describe('Polling', () => {
7679
});
7780

7881
function getFetchedTimeOnComment() {
79-
return handleMaybePromise(() => manager.getUnifiedGraph(), schema => {
80-
const queryType = schema.getQueryType();
81-
const lastFetchedDateStr =
82-
queryType?.description?.match(/Fetched on (.*)/)?.[1];
83-
if (!lastFetchedDateStr) {
84-
throw new Error('Fetched date not found');
85-
}
86-
const lastFetchedDate = new Date(lastFetchedDateStr);
87-
return lastFetchedDate;
88-
});
82+
return handleMaybePromise(
83+
() => manager.getUnifiedGraph(),
84+
(schema) => {
85+
const queryType = schema.getQueryType();
86+
const lastFetchedDateStr =
87+
queryType?.description?.match(/Fetched on (.*)/)?.[1];
88+
if (!lastFetchedDateStr) {
89+
throw new Error('Fetched date not found');
90+
}
91+
const lastFetchedDate = new Date(lastFetchedDateStr);
92+
return lastFetchedDate;
93+
},
94+
);
8995
}
9096

9197
function getFetchedTimeFromResolvers() {
92-
return handleMaybePromise(() => manager.getUnifiedGraph(), schema => handleMaybePromise(() => normalizedExecutor({
93-
schema,
94-
document: parse(/* GraphQL */ `
95-
query {
96-
time
97-
}
98-
`),
99-
}), result => {
100-
if (isAsyncIterable(result)) {
101-
throw new Error('Unexpected async iterable');
102-
}
103-
return new Date(result.data.time);
104-
}))
98+
return handleMaybePromise(
99+
() => manager.getUnifiedGraph(),
100+
(schema) =>
101+
handleMaybePromise(
102+
() =>
103+
normalizedExecutor({
104+
schema,
105+
document: parse(/* GraphQL */ `
106+
query {
107+
time
108+
}
109+
`),
110+
}),
111+
(result) => {
112+
if (isAsyncIterable(result)) {
113+
throw new Error('Unexpected async iterable');
114+
}
115+
return new Date(result.data.time);
116+
},
117+
),
118+
);
105119
}
106120

107121
function compareTimes() {
108-
return handleMaybePromise(() => getFetchedTimeOnComment(), timeFromComment =>{
109-
return handleMaybePromise(() => getFetchedTimeFromResolvers(), timeFromResolvers => {
110-
expect(timeFromComment).toEqual(timeFromResolvers);
111-
})
112-
});
122+
return handleMaybePromise(
123+
() => getFetchedTimeOnComment(),
124+
(timeFromComment) => {
125+
return handleMaybePromise(
126+
() => getFetchedTimeFromResolvers(),
127+
(timeFromResolvers) => {
128+
expect(timeFromComment).toEqual(timeFromResolvers);
129+
},
130+
);
131+
},
132+
);
113133
}
114134

115135
await compareTimes();

packages/runtime/src/createGatewayRuntime.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ import { useDemandControl } from './plugins/useDemandControl';
9898
import { useFetchDebug } from './plugins/useFetchDebug';
9999
import { usePropagateHeaders } from './plugins/usePropagateHeaders';
100100
import { useRequestId } from './plugins/useRequestId';
101+
import { useRetryOnSchemaReload } from './plugins/useRetryOnSchemaReload';
101102
import { useSubgraphExecuteDebug } from './plugins/useSubgraphExecuteDebug';
102103
import { useUpstreamCancel } from './plugins/useUpstreamCancel';
103104
import { useUpstreamRetry } from './plugins/useUpstreamRetry';
@@ -121,7 +122,6 @@ import {
121122
getExecuteFnFromExecutor,
122123
wrapCacheWithHooks,
123124
} from './utils';
124-
import { useRetryOnSchemaReload } from './plugins/useRetryOnSchemaReload';
125125

126126
// TODO: this type export is not properly accessible from graphql-yoga
127127
// "graphql-yoga/typings/plugins/use-graphiql.js" is an illegal path
@@ -192,7 +192,7 @@ export function createGatewayRuntime<
192192
let contextBuilder: <T>(context: T) => MaybePromise<T>;
193193
let readinessChecker: () => MaybePromise<boolean>;
194194
let getExecutor: (() => MaybePromise<Executor | undefined>) | undefined;
195-
let replaceSchema: (schema: GraphQLSchema) => void = newSchema => {
195+
let replaceSchema: (schema: GraphQLSchema) => void = (newSchema) => {
196196
unifiedGraph = newSchema;
197197
};
198198
const { name: reportingTarget, plugin: registryPlugin } = getReportingPlugin(
Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,40 @@
1-
import { handleMaybePromise, MaybePromise } from "@whatwg-node/promise-helpers";
2-
import { GatewayPlugin } from "../types";
3-
import { ExecutionResult } from "graphql";
4-
import { MaybeAsyncIterable } from "@graphql-tools/utils";
5-
import { isAsyncIterable } from "@graphql-tools/utils";
6-
import { YogaInitialContext } from "graphql-yoga";
1+
import { isAsyncIterable, MaybeAsyncIterable } from '@graphql-tools/utils';
2+
import { handleMaybePromise, MaybePromise } from '@whatwg-node/promise-helpers';
3+
import { ExecutionResult } from 'graphql';
4+
import { YogaInitialContext } from 'graphql-yoga';
5+
import { GatewayPlugin } from '../types';
76

8-
export function useRetryOnSchemaReload<TContext extends Record<string, any>>(): GatewayPlugin<TContext> {
9-
const execHandlerByContext = new WeakMap<{}, () => MaybePromise<MaybeAsyncIterable<ExecutionResult>>>();
10-
return {
11-
onParams({ request, params, context, paramsHandler }) {
12-
execHandlerByContext.set(context, () => paramsHandler({
13-
request,
14-
params,
15-
context: context as YogaInitialContext,
16-
}))
17-
},
18-
onExecutionResult({ context, result, setResult }) {
19-
if (!isAsyncIterable(result) && result?.errors?.some(e => e.extensions?.["code"] === 'SUBSCRIPTION_SCHEMA_RELOAD')) {
20-
const execHandler = execHandlerByContext.get(context);
21-
if (execHandler) {
22-
return handleMaybePromise(execHandler, newResult => setResult(newResult));
23-
}
24-
}
7+
export function useRetryOnSchemaReload<
8+
TContext extends Record<string, any>,
9+
>(): GatewayPlugin<TContext> {
10+
const execHandlerByContext = new WeakMap<
11+
{},
12+
() => MaybePromise<MaybeAsyncIterable<ExecutionResult>>
13+
>();
14+
return {
15+
onParams({ request, params, context, paramsHandler }) {
16+
execHandlerByContext.set(context, () =>
17+
paramsHandler({
18+
request,
19+
params,
20+
context: context as YogaInitialContext,
21+
}),
22+
);
23+
},
24+
onExecutionResult({ context, result, setResult }) {
25+
if (
26+
!isAsyncIterable(result) &&
27+
result?.errors?.some(
28+
(e) => e.extensions?.['code'] === 'SUBSCRIPTION_SCHEMA_RELOAD',
29+
)
30+
) {
31+
const execHandler = execHandlerByContext.get(context);
32+
if (execHandler) {
33+
return handleMaybePromise(execHandler, (newResult) =>
34+
setResult(newResult),
35+
);
2536
}
26-
}
27-
}
37+
}
38+
},
39+
};
40+
}

0 commit comments

Comments
 (0)