@graphql-hive/gateway-runtime 2.3.6-rc-70ab4bd21a7f4dd67d993b256d03184f5f6129d8 → 2.4.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56
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/CHANGELOG.md +75 -7
- package/dist/index.cjs +132 -96
- package/dist/index.d.cts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +136 -100
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,74 @@
|
|
|
1
1
|
# @graphql-hive/gateway-runtime
|
|
2
2
|
|
|
3
|
-
## 2.
|
|
3
|
+
## 2.4.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56
|
|
4
|
+
### Minor Changes
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
- [#1738](https://github.com/graphql-hive/gateway/pull/1738) [`475ccdf`](https://github.com/graphql-hive/gateway/commit/475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56) Thanks [@EmrysMyrddin](https://github.com/EmrysMyrddin)! - ## New Hive CDN mirror and circuit breaker
|
|
9
|
+
|
|
10
|
+
Hive CDN introduced a new CDN mirror and circuit breaker to mitigate the risk related to Cloudflare
|
|
11
|
+
services failures.
|
|
12
|
+
|
|
13
|
+
You can now provide multiple endpoint in Hive Console related features, and configure the circuit
|
|
14
|
+
breaker handling CDN failure and how it switches to the CDN mirror.
|
|
15
|
+
|
|
16
|
+
### Usage
|
|
17
|
+
|
|
18
|
+
To enable this feature, please provide the mirror endpoint in `supergraph` and `persistedDocument`
|
|
19
|
+
options:
|
|
20
|
+
|
|
21
|
+
```diff
|
|
22
|
+
import { defineConfig } from '@graphql-hive/gateway'
|
|
23
|
+
|
|
24
|
+
export const gatewayConfig = defineConfig({
|
|
25
|
+
supergraph: {
|
|
26
|
+
type: 'hive',
|
|
27
|
+
- endpoint: 'https://cdn.graphql-hive.com/artifacts/v1/...../supergraph',
|
|
28
|
+
+ endpoint: [
|
|
29
|
+
+ 'https://cdn.graphql-hive.com/artifacts/v1/...../supergraph',
|
|
30
|
+
+ 'https://cdn-mirror.graphql-hive.com/artifacts/v1/...../supergraph'
|
|
31
|
+
+ ]
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
persistedDocuments: {
|
|
35
|
+
- endpoint: 'https://cdn.graphql-hive.com/artifacts/v1/...',
|
|
36
|
+
+ endpoint: [
|
|
37
|
+
+ 'https://cdn.graphql-hive.com/artifacts/v1/...',
|
|
38
|
+
+ 'https://cdn-mirror.graphql-hive.com/artifacts/v1/...'
|
|
39
|
+
+ ]
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Configuration
|
|
45
|
+
|
|
46
|
+
The circuit breaker has production ready default configuration, but you customize its behavior:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { defineConfig, CircuitBreakerConfiguration } from '@graphql-hive/gateway';
|
|
50
|
+
|
|
51
|
+
const circuitBreaker: CircuitBreakerConfiguration = {
|
|
52
|
+
resetTimeout: 30_000; // 30s
|
|
53
|
+
errorThresholdPercentage: 50;
|
|
54
|
+
volumeThreshold: 5;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const gatewayConfig = defineConfig({
|
|
58
|
+
supergraph: {
|
|
59
|
+
type: 'hive',
|
|
60
|
+
endpoint: [...],
|
|
61
|
+
circuitBreaker,
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
persistedDocuments: {
|
|
65
|
+
type: 'hive',
|
|
66
|
+
endpoint: [...],
|
|
67
|
+
circuitBreaker,
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
4
72
|
### Patch Changes
|
|
5
73
|
|
|
6
74
|
|
|
@@ -10,13 +78,13 @@
|
|
|
10
78
|
- Updated dependency [`@graphql-hive/core@^0.15.1` ↗︎](https://www.npmjs.com/package/@graphql-hive/core/v/0.15.1) (from `^0.13.2`, in `dependencies`)
|
|
11
79
|
- Updated dependency [`@graphql-hive/yoga@^0.43.1` ↗︎](https://www.npmjs.com/package/@graphql-hive/yoga/v/0.43.1) (from `^0.42.4`, in `dependencies`)
|
|
12
80
|
- Updated dependencies [[`bc6cddd`](https://github.com/graphql-hive/gateway/commit/bc6cddd1c53a012dd02a1d8a7217a28e65cc6ae9), [`bc6cddd`](https://github.com/graphql-hive/gateway/commit/bc6cddd1c53a012dd02a1d8a7217a28e65cc6ae9), [`1dbc653`](https://github.com/graphql-hive/gateway/commit/1dbc6536cb992a705cac7894acca6fe5431b72de), [`bc6cddd`](https://github.com/graphql-hive/gateway/commit/bc6cddd1c53a012dd02a1d8a7217a28e65cc6ae9)]:
|
|
13
|
-
- @graphql-mesh/fusion-runtime@1.6.0-
|
|
14
|
-
- @graphql-tools/wrap@11.1.0-
|
|
15
|
-
- @graphql-tools/delegate@12.0.0-
|
|
16
|
-
- @graphql-tools/stitch@10.1.4-
|
|
81
|
+
- @graphql-mesh/fusion-runtime@1.6.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56
|
|
82
|
+
- @graphql-tools/wrap@11.1.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56
|
|
83
|
+
- @graphql-tools/delegate@12.0.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56
|
|
84
|
+
- @graphql-tools/stitch@10.1.4-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56
|
|
17
85
|
- @graphql-mesh/hmac-upstream-signature@2.0.8
|
|
18
|
-
- @graphql-tools/federation@4.2.4-
|
|
19
|
-
- @graphql-tools/batch-delegate@10.0.6-
|
|
86
|
+
- @graphql-tools/federation@4.2.4-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56
|
|
87
|
+
- @graphql-tools/batch-delegate@10.0.6-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56
|
|
20
88
|
|
|
21
89
|
## 2.3.5
|
|
22
90
|
### Patch Changes
|
package/dist/index.cjs
CHANGED
|
@@ -607,6 +607,7 @@ function getReportingPlugin(config, configContext, allowArbitraryDocuments = fal
|
|
|
607
607
|
endpoint: config.persistedDocuments.endpoint,
|
|
608
608
|
accessToken: config.persistedDocuments.token
|
|
609
609
|
},
|
|
610
|
+
circuitBreaker: config.persistedDocuments.circuitBreaker,
|
|
610
611
|
// Trick to satisfy the Hive Console plugin types
|
|
611
612
|
allowArbitraryDocuments
|
|
612
613
|
}
|
|
@@ -2042,6 +2043,7 @@ function createGatewayRuntime(config) {
|
|
|
2042
2043
|
endpoint: config.persistedDocuments.endpoint,
|
|
2043
2044
|
accessToken: config.persistedDocuments.token
|
|
2044
2045
|
},
|
|
2046
|
+
circuitBreaker: config.persistedDocuments.circuitBreaker,
|
|
2045
2047
|
// @ts-expect-error - Hive Console plugin options are not compatible yet
|
|
2046
2048
|
allowArbitraryDocuments: allowArbitraryDocumentsForPersistedDocuments
|
|
2047
2049
|
}
|
|
@@ -2061,7 +2063,7 @@ function createGatewayRuntime(config) {
|
|
|
2061
2063
|
clearTimeout(currentTimeout);
|
|
2062
2064
|
}
|
|
2063
2065
|
if (pollingInterval) {
|
|
2064
|
-
currentTimeout = setTimeout(schemaFetcher, pollingInterval);
|
|
2066
|
+
currentTimeout = setTimeout(schemaFetcher.fetch, pollingInterval);
|
|
2065
2067
|
}
|
|
2066
2068
|
}, pausePolling2 = function() {
|
|
2067
2069
|
if (currentTimeout) {
|
|
@@ -2085,81 +2087,99 @@ function createGatewayRuntime(config) {
|
|
|
2085
2087
|
let initialFetch$;
|
|
2086
2088
|
let schemaFetcher;
|
|
2087
2089
|
if (config.schema && typeof config.schema === "object" && "type" in config.schema) {
|
|
2088
|
-
const { endpoint, key } = config.schema;
|
|
2089
|
-
const
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
configContext.log.child("[hiveSchemaFetcher] ")
|
|
2090
|
+
const { endpoint, key, circuitBreaker } = config.schema;
|
|
2091
|
+
const endpoints = (Array.isArray(endpoint) ? endpoint : [endpoint]).map(
|
|
2092
|
+
(url) => url.endsWith("/sdl") ? url : core$1.joinUrl(
|
|
2093
|
+
url.endsWith("/services") ? url.substring(0, url.length - 8) : url,
|
|
2094
|
+
"sdl"
|
|
2094
2095
|
)
|
|
2096
|
+
);
|
|
2097
|
+
const fetcher = core$1.createCDNArtifactFetcher({
|
|
2098
|
+
endpoint: endpoints,
|
|
2099
|
+
circuitBreaker,
|
|
2100
|
+
accessKey: key,
|
|
2101
|
+
logger: configContext.log.child("[hiveSchemaFetcher] ")
|
|
2095
2102
|
});
|
|
2096
|
-
schemaFetcher =
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2103
|
+
schemaFetcher = {
|
|
2104
|
+
fetch: function fetchSchemaFromCDN() {
|
|
2105
|
+
pausePolling2();
|
|
2106
|
+
initialFetch$ = promiseHelpers.handleMaybePromise(
|
|
2107
|
+
fetcher.fetch,
|
|
2108
|
+
({ contents }) => {
|
|
2109
|
+
{
|
|
2110
|
+
unifiedGraph = graphql.buildSchema(contents, {
|
|
2111
|
+
assumeValid: true,
|
|
2112
|
+
assumeValidSDL: true
|
|
2113
|
+
});
|
|
2114
|
+
}
|
|
2115
|
+
continuePolling2();
|
|
2116
|
+
return true;
|
|
2117
|
+
}
|
|
2118
|
+
);
|
|
2119
|
+
return initialFetch$;
|
|
2120
|
+
},
|
|
2121
|
+
dispose: () => fetcher.dispose()
|
|
2109
2122
|
};
|
|
2110
2123
|
} else if (config.schema) {
|
|
2111
2124
|
if (!isDynamicUnifiedGraphSchema(config.schema)) {
|
|
2112
2125
|
delete config.pollingInterval;
|
|
2113
2126
|
}
|
|
2114
|
-
schemaFetcher =
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2127
|
+
schemaFetcher = {
|
|
2128
|
+
fetch: function fetchSchema() {
|
|
2129
|
+
pausePolling2();
|
|
2130
|
+
initialFetch$ = promiseHelpers.handleMaybePromise(
|
|
2131
|
+
() => handleUnifiedGraphConfig(
|
|
2132
|
+
// @ts-expect-error TODO: what's up with type narrowing
|
|
2133
|
+
config.schema,
|
|
2134
|
+
configContext
|
|
2135
|
+
),
|
|
2136
|
+
(schema) => {
|
|
2137
|
+
if (graphql.isSchema(schema)) {
|
|
2138
|
+
unifiedGraph = schema;
|
|
2139
|
+
} else if (utils.isDocumentNode(schema)) {
|
|
2140
|
+
unifiedGraph = graphql.buildASTSchema(schema, {
|
|
2141
|
+
assumeValid: true,
|
|
2142
|
+
assumeValidSDL: true
|
|
2143
|
+
});
|
|
2144
|
+
} else {
|
|
2145
|
+
unifiedGraph = graphql.buildSchema(schema, {
|
|
2146
|
+
noLocation: true,
|
|
2147
|
+
assumeValid: true,
|
|
2148
|
+
assumeValidSDL: true
|
|
2149
|
+
});
|
|
2150
|
+
}
|
|
2151
|
+
continuePolling2();
|
|
2152
|
+
return true;
|
|
2136
2153
|
}
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
);
|
|
2141
|
-
return initialFetch$;
|
|
2154
|
+
);
|
|
2155
|
+
return initialFetch$;
|
|
2156
|
+
}
|
|
2142
2157
|
};
|
|
2143
2158
|
} else {
|
|
2144
|
-
schemaFetcher =
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2159
|
+
schemaFetcher = {
|
|
2160
|
+
fetch: function fetchSchemaWithExecutor() {
|
|
2161
|
+
pausePolling2();
|
|
2162
|
+
return promiseHelpers.handleMaybePromise(
|
|
2163
|
+
() => wrap.schemaFromExecutor(proxyExecutor, configContext, {
|
|
2164
|
+
assumeValid: true
|
|
2165
|
+
}),
|
|
2166
|
+
(schema) => {
|
|
2167
|
+
unifiedGraph = schema;
|
|
2168
|
+
continuePolling2();
|
|
2169
|
+
return true;
|
|
2170
|
+
}
|
|
2171
|
+
);
|
|
2172
|
+
}
|
|
2156
2173
|
};
|
|
2157
2174
|
}
|
|
2158
|
-
const instrumentedFetcher = schemaFetcher;
|
|
2159
|
-
schemaFetcher =
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2175
|
+
const instrumentedFetcher = schemaFetcher.fetch;
|
|
2176
|
+
schemaFetcher = {
|
|
2177
|
+
...schemaFetcher,
|
|
2178
|
+
fetch: (...args) => core.getInstrumented(null).asyncFn(
|
|
2179
|
+
instrumentation?.schema,
|
|
2180
|
+
instrumentedFetcher
|
|
2181
|
+
)(...args)
|
|
2182
|
+
};
|
|
2163
2183
|
getSchema = () => {
|
|
2164
2184
|
if (unifiedGraph != null) {
|
|
2165
2185
|
return unifiedGraph;
|
|
@@ -2170,21 +2190,21 @@ function createGatewayRuntime(config) {
|
|
|
2170
2190
|
() => unifiedGraph
|
|
2171
2191
|
);
|
|
2172
2192
|
}
|
|
2173
|
-
return promiseHelpers.handleMaybePromise(schemaFetcher, () => unifiedGraph);
|
|
2193
|
+
return promiseHelpers.handleMaybePromise(schemaFetcher.fetch, () => unifiedGraph);
|
|
2174
2194
|
};
|
|
2175
2195
|
const shouldSkipValidation = "skipValidation" in config ? config.skipValidation : false;
|
|
2176
|
-
|
|
2196
|
+
unifiedGraphPlugin = {
|
|
2177
2197
|
onValidate({ params, setResult }) {
|
|
2178
2198
|
if (shouldSkipValidation || !params.schema) {
|
|
2179
2199
|
setResult([]);
|
|
2180
2200
|
}
|
|
2181
2201
|
},
|
|
2182
|
-
onDispose() {
|
|
2202
|
+
async onDispose() {
|
|
2183
2203
|
pausePolling2();
|
|
2184
|
-
|
|
2204
|
+
await transportExecutorStack.disposeAsync();
|
|
2205
|
+
return schemaFetcher.dispose?.();
|
|
2185
2206
|
}
|
|
2186
2207
|
};
|
|
2187
|
-
unifiedGraphPlugin = executorPlugin;
|
|
2188
2208
|
readinessChecker = () => promiseHelpers.handleMaybePromise(
|
|
2189
2209
|
() => proxyExecutor({
|
|
2190
2210
|
document: graphql.parse(`query ReadinessCheck { __typename }`, {
|
|
@@ -2195,7 +2215,7 @@ function createGatewayRuntime(config) {
|
|
|
2195
2215
|
);
|
|
2196
2216
|
schemaInvalidator = () => {
|
|
2197
2217
|
unifiedGraph = void 0;
|
|
2198
|
-
initialFetch$ = schemaFetcher();
|
|
2218
|
+
initialFetch$ = schemaFetcher.fetch();
|
|
2199
2219
|
};
|
|
2200
2220
|
} else if ("subgraph" in config) {
|
|
2201
2221
|
let getSubschemaConfig2 = function() {
|
|
@@ -2410,31 +2430,40 @@ function createGatewayRuntime(config) {
|
|
|
2410
2430
|
let unifiedGraphFetcher;
|
|
2411
2431
|
if (typeof config.supergraph === "object" && "type" in config.supergraph) {
|
|
2412
2432
|
if (config.supergraph.type === "hive") {
|
|
2413
|
-
const { endpoint, key } = config.supergraph;
|
|
2414
|
-
const
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
|
|
2433
|
+
const { endpoint, key, circuitBreaker } = config.supergraph;
|
|
2434
|
+
const endpoints = (Array.isArray(endpoint) ? endpoint : [endpoint]).map(
|
|
2435
|
+
(url) => url.endsWith("/supergraph") ? url : `${url}/supergraph`
|
|
2436
|
+
);
|
|
2437
|
+
const fetcher = core$1.createCDNArtifactFetcher({
|
|
2438
|
+
endpoint: endpoints,
|
|
2439
|
+
accessKey: key,
|
|
2440
|
+
logger: configContext.log.child("[hiveSupergraphFetcher] "),
|
|
2420
2441
|
// @ts-expect-error - MeshFetch is not compatible with `typeof fetch`
|
|
2421
|
-
|
|
2442
|
+
fetch: configContext.fetch,
|
|
2443
|
+
circuitBreaker,
|
|
2422
2444
|
name: "hive-gateway",
|
|
2423
2445
|
version: globalThis.__VERSION__
|
|
2424
2446
|
});
|
|
2425
|
-
unifiedGraphFetcher =
|
|
2447
|
+
unifiedGraphFetcher = {
|
|
2448
|
+
fetch: () => fetcher.fetch().then(({ contents }) => contents),
|
|
2449
|
+
dispose: () => fetcher.dispose()
|
|
2450
|
+
};
|
|
2426
2451
|
} else if (config.supergraph.type === "graphos") {
|
|
2427
2452
|
const graphosFetcherContainer = createGraphOSFetcher({
|
|
2428
2453
|
graphosOpts: config.supergraph,
|
|
2429
2454
|
configContext,
|
|
2430
2455
|
pollingInterval: config.pollingInterval
|
|
2431
2456
|
});
|
|
2432
|
-
unifiedGraphFetcher =
|
|
2457
|
+
unifiedGraphFetcher = {
|
|
2458
|
+
fetch: graphosFetcherContainer.unifiedGraphFetcher
|
|
2459
|
+
};
|
|
2433
2460
|
} else {
|
|
2434
|
-
unifiedGraphFetcher =
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2461
|
+
unifiedGraphFetcher = {
|
|
2462
|
+
fetch: () => {
|
|
2463
|
+
throw new Error(
|
|
2464
|
+
`Unknown supergraph configuration: ${config.supergraph}`
|
|
2465
|
+
);
|
|
2466
|
+
}
|
|
2438
2467
|
};
|
|
2439
2468
|
}
|
|
2440
2469
|
} else {
|
|
@@ -2446,20 +2475,25 @@ function createGatewayRuntime(config) {
|
|
|
2446
2475
|
`Polling interval not set for supergraph, if you want to get updates of supergraph, we recommend setting a polling interval`
|
|
2447
2476
|
);
|
|
2448
2477
|
}
|
|
2449
|
-
unifiedGraphFetcher =
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2478
|
+
unifiedGraphFetcher = {
|
|
2479
|
+
fetch: () => handleUnifiedGraphConfig(
|
|
2480
|
+
// @ts-expect-error TODO: what's up with type narrowing
|
|
2481
|
+
config.supergraph,
|
|
2482
|
+
configContext
|
|
2483
|
+
)
|
|
2484
|
+
};
|
|
2454
2485
|
}
|
|
2455
|
-
const instrumentedGraphFetcher = unifiedGraphFetcher;
|
|
2456
|
-
unifiedGraphFetcher =
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2486
|
+
const instrumentedGraphFetcher = unifiedGraphFetcher.fetch;
|
|
2487
|
+
unifiedGraphFetcher = {
|
|
2488
|
+
...unifiedGraphFetcher,
|
|
2489
|
+
fetch: (...args) => core.getInstrumented(null).asyncFn(
|
|
2490
|
+
instrumentation?.schema,
|
|
2491
|
+
instrumentedGraphFetcher
|
|
2492
|
+
)(...args)
|
|
2493
|
+
};
|
|
2460
2494
|
const unifiedGraphManager = new fusionRuntime.UnifiedGraphManager({
|
|
2461
2495
|
handleUnifiedGraph: config.unifiedGraphHandler,
|
|
2462
|
-
getUnifiedGraph: unifiedGraphFetcher,
|
|
2496
|
+
getUnifiedGraph: unifiedGraphFetcher.fetch,
|
|
2463
2497
|
onUnifiedGraphChange(newUnifiedGraph) {
|
|
2464
2498
|
unifiedGraph = newUnifiedGraph;
|
|
2465
2499
|
replaceSchema(newUnifiedGraph);
|
|
@@ -2509,7 +2543,9 @@ function createGatewayRuntime(config) {
|
|
|
2509
2543
|
getExecutor = () => unifiedGraphManager.getExecutor();
|
|
2510
2544
|
unifiedGraphPlugin = {
|
|
2511
2545
|
onDispose() {
|
|
2512
|
-
return
|
|
2546
|
+
return promiseHelpers.unfakePromise(
|
|
2547
|
+
promiseHelpers.fakePromise(void 0).then(() => utils$1.dispose(unifiedGraphManager)).then(() => unifiedGraphFetcher.dispose?.())
|
|
2548
|
+
);
|
|
2513
2549
|
}
|
|
2514
2550
|
};
|
|
2515
2551
|
}
|
package/dist/index.d.cts
CHANGED
|
@@ -5,6 +5,8 @@ import { Plugin as Plugin$1 } from '@envelop/core';
|
|
|
5
5
|
export { withState } from '@envelop/core';
|
|
6
6
|
import { GenericAuthPluginOptions } from '@envelop/generic-auth';
|
|
7
7
|
export { ResolveUserFn, ValidateUserFn } from '@envelop/generic-auth';
|
|
8
|
+
import { HivePluginOptions, CircuitBreakerConfiguration } from '@graphql-hive/core';
|
|
9
|
+
export { CircuitBreakerConfiguration } from '@graphql-hive/core';
|
|
8
10
|
import { Logger, LogLevel } from '@graphql-hive/logger';
|
|
9
11
|
export * from '@graphql-hive/logger';
|
|
10
12
|
import { PubSub } from '@graphql-hive/pubsub';
|
|
@@ -22,7 +24,6 @@ import { UsePersistedOperationsOptions } from '@graphql-yoga/plugin-persisted-op
|
|
|
22
24
|
import { GraphQLResolveInfo } from 'graphql/type';
|
|
23
25
|
import { Agent } from 'node:http';
|
|
24
26
|
import { Agent as Agent$1 } from 'node:https';
|
|
25
|
-
import { HivePluginOptions } from '@graphql-hive/core';
|
|
26
27
|
import { FetchAPI } from '@whatwg-node/server';
|
|
27
28
|
export * from '@whatwg-node/disposablestack';
|
|
28
29
|
import { Context, ConnectionInitMessage, ServerOptions } from 'graphql-ws';
|
|
@@ -414,11 +415,12 @@ interface GatewayHiveCDNOptions {
|
|
|
414
415
|
/**
|
|
415
416
|
* GraphQL Hive CDN endpoint URL.
|
|
416
417
|
*/
|
|
417
|
-
endpoint: string;
|
|
418
|
+
endpoint: string | [string, string];
|
|
418
419
|
/**
|
|
419
420
|
* GraphQL Hive CDN access key.
|
|
420
421
|
*/
|
|
421
422
|
key: string;
|
|
423
|
+
circuitBreaker?: CircuitBreakerConfiguration;
|
|
422
424
|
}
|
|
423
425
|
interface GatewayHiveReportingOptions extends Omit<HiveConsolePluginOptions, 'experimental__persistedDocuments'> {
|
|
424
426
|
type: 'hive';
|
|
@@ -507,7 +509,11 @@ interface GatewayHivePersistedDocumentsOptions {
|
|
|
507
509
|
/**
|
|
508
510
|
* GraphQL Hive persisted documents CDN endpoint URL.
|
|
509
511
|
*/
|
|
510
|
-
endpoint: string;
|
|
512
|
+
endpoint: string | [string, string];
|
|
513
|
+
/**
|
|
514
|
+
* Circuit Breaker configuration to customize CDN failures handling and switch to mirror endpoint.
|
|
515
|
+
*/
|
|
516
|
+
circuitBreaker?: CircuitBreakerConfiguration;
|
|
511
517
|
/**
|
|
512
518
|
* GraphQL Hive persisted documents CDN access token.
|
|
513
519
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ import { Plugin as Plugin$1 } from '@envelop/core';
|
|
|
5
5
|
export { withState } from '@envelop/core';
|
|
6
6
|
import { GenericAuthPluginOptions } from '@envelop/generic-auth';
|
|
7
7
|
export { ResolveUserFn, ValidateUserFn } from '@envelop/generic-auth';
|
|
8
|
+
import { HivePluginOptions, CircuitBreakerConfiguration } from '@graphql-hive/core';
|
|
9
|
+
export { CircuitBreakerConfiguration } from '@graphql-hive/core';
|
|
8
10
|
import { Logger, LogLevel } from '@graphql-hive/logger';
|
|
9
11
|
export * from '@graphql-hive/logger';
|
|
10
12
|
import { PubSub } from '@graphql-hive/pubsub';
|
|
@@ -22,7 +24,6 @@ import { UsePersistedOperationsOptions } from '@graphql-yoga/plugin-persisted-op
|
|
|
22
24
|
import { GraphQLResolveInfo } from 'graphql/type';
|
|
23
25
|
import { Agent } from 'node:http';
|
|
24
26
|
import { Agent as Agent$1 } from 'node:https';
|
|
25
|
-
import { HivePluginOptions } from '@graphql-hive/core';
|
|
26
27
|
import { FetchAPI } from '@whatwg-node/server';
|
|
27
28
|
export * from '@whatwg-node/disposablestack';
|
|
28
29
|
import { Context, ConnectionInitMessage, ServerOptions } from 'graphql-ws';
|
|
@@ -414,11 +415,12 @@ interface GatewayHiveCDNOptions {
|
|
|
414
415
|
/**
|
|
415
416
|
* GraphQL Hive CDN endpoint URL.
|
|
416
417
|
*/
|
|
417
|
-
endpoint: string;
|
|
418
|
+
endpoint: string | [string, string];
|
|
418
419
|
/**
|
|
419
420
|
* GraphQL Hive CDN access key.
|
|
420
421
|
*/
|
|
421
422
|
key: string;
|
|
423
|
+
circuitBreaker?: CircuitBreakerConfiguration;
|
|
422
424
|
}
|
|
423
425
|
interface GatewayHiveReportingOptions extends Omit<HiveConsolePluginOptions, 'experimental__persistedDocuments'> {
|
|
424
426
|
type: 'hive';
|
|
@@ -507,7 +509,11 @@ interface GatewayHivePersistedDocumentsOptions {
|
|
|
507
509
|
/**
|
|
508
510
|
* GraphQL Hive persisted documents CDN endpoint URL.
|
|
509
511
|
*/
|
|
510
|
-
endpoint: string;
|
|
512
|
+
endpoint: string | [string, string];
|
|
513
|
+
/**
|
|
514
|
+
* Circuit Breaker configuration to customize CDN failures handling and switch to mirror endpoint.
|
|
515
|
+
*/
|
|
516
|
+
circuitBreaker?: CircuitBreakerConfiguration;
|
|
511
517
|
/**
|
|
512
518
|
* GraphQL Hive persisted documents CDN access token.
|
|
513
519
|
*/
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { isOriginalGraphQLError, getInstrumented as getInstrumented$1 } from '@e
|
|
|
2
2
|
export { withState } from '@envelop/core';
|
|
3
3
|
import { useDisableIntrospection } from '@envelop/disable-introspection';
|
|
4
4
|
import { useGenericAuth } from '@envelop/generic-auth';
|
|
5
|
-
import {
|
|
5
|
+
import { joinUrl, createCDNArtifactFetcher } from '@graphql-hive/core';
|
|
6
6
|
import { Logger, LegacyLogger } from '@graphql-hive/logger';
|
|
7
7
|
export * from '@graphql-hive/logger';
|
|
8
8
|
import { millisecondsToStr, getOnSubgraphExecute, UnifiedGraphManager, restoreExtraDirectives, getTransportEntryMapUsingFusionAndFederationDirectives, getStitchingDirectivesTransformerForSubschema, handleFederationSubschema, handleResolveToDirectives } from '@graphql-mesh/fusion-runtime';
|
|
@@ -15,15 +15,15 @@ import { batchDelegateToSchema } from '@graphql-tools/batch-delegate';
|
|
|
15
15
|
import { getTypeInfo, EMPTY_OBJECT, delegateToSchema, defaultMergedResolver } from '@graphql-tools/delegate';
|
|
16
16
|
import { defaultPrintFn as defaultPrintFn$1 } from '@graphql-tools/executor-common';
|
|
17
17
|
import { getDirectiveExtensions, memoize1, mergeDeep, isValidPath, pathToArray, memoize3, getDirective, createGraphQLError, isAsyncIterable, mapAsyncIterator, createDeferred, isPromise, isDocumentNode, asArray, printSchemaWithDirectives, parseSelectionSet } from '@graphql-tools/utils';
|
|
18
|
-
import {
|
|
18
|
+
import { schemaFromExecutor, wrapSchema } from '@graphql-tools/wrap';
|
|
19
19
|
import { useCSRFPrevention } from '@graphql-yoga/plugin-csrf-prevention';
|
|
20
20
|
import { useDeferStream } from '@graphql-yoga/plugin-defer-stream';
|
|
21
21
|
import { usePersistedOperations } from '@graphql-yoga/plugin-persisted-operations';
|
|
22
22
|
import { AsyncDisposableStack } from '@whatwg-node/disposablestack';
|
|
23
23
|
export * from '@whatwg-node/disposablestack';
|
|
24
|
-
import { handleMaybePromise, iterateAsync } from '@whatwg-node/promise-helpers';
|
|
24
|
+
import { handleMaybePromise, iterateAsync, unfakePromise, fakePromise } from '@whatwg-node/promise-helpers';
|
|
25
25
|
import { useCookies } from '@whatwg-node/server-plugin-cookies';
|
|
26
|
-
import { print, visit, visitWithTypeInfo, getArgumentValues, getNamedType, isIntrospectionType, isListType, isCompositeType, getOperationAST, isSchema, parse,
|
|
26
|
+
import { print, visit, visitWithTypeInfo, getArgumentValues, getNamedType, isIntrospectionType, isListType, isCompositeType, getOperationAST, isSchema, parse, buildSchema, buildASTSchema } from 'graphql';
|
|
27
27
|
import { isAsyncIterable as isAsyncIterable$1, useReadinessCheck, useExecutionCancellation, createYoga, chain, mergeSchemas } from 'graphql-yoga';
|
|
28
28
|
import { DEFAULT_UPLINKS, fetchSupergraphSdlFromManagedFederation } from '@graphql-tools/federation';
|
|
29
29
|
import { useApolloUsageReport } from '@graphql-yoga/plugin-apollo-usage-report';
|
|
@@ -606,6 +606,7 @@ function getReportingPlugin(config, configContext, allowArbitraryDocuments = fal
|
|
|
606
606
|
endpoint: config.persistedDocuments.endpoint,
|
|
607
607
|
accessToken: config.persistedDocuments.token
|
|
608
608
|
},
|
|
609
|
+
circuitBreaker: config.persistedDocuments.circuitBreaker,
|
|
609
610
|
// Trick to satisfy the Hive Console plugin types
|
|
610
611
|
allowArbitraryDocuments
|
|
611
612
|
}
|
|
@@ -2041,6 +2042,7 @@ function createGatewayRuntime(config) {
|
|
|
2041
2042
|
endpoint: config.persistedDocuments.endpoint,
|
|
2042
2043
|
accessToken: config.persistedDocuments.token
|
|
2043
2044
|
},
|
|
2045
|
+
circuitBreaker: config.persistedDocuments.circuitBreaker,
|
|
2044
2046
|
// @ts-expect-error - Hive Console plugin options are not compatible yet
|
|
2045
2047
|
allowArbitraryDocuments: allowArbitraryDocumentsForPersistedDocuments
|
|
2046
2048
|
}
|
|
@@ -2060,7 +2062,7 @@ function createGatewayRuntime(config) {
|
|
|
2060
2062
|
clearTimeout(currentTimeout);
|
|
2061
2063
|
}
|
|
2062
2064
|
if (pollingInterval) {
|
|
2063
|
-
currentTimeout = setTimeout(schemaFetcher, pollingInterval);
|
|
2065
|
+
currentTimeout = setTimeout(schemaFetcher.fetch, pollingInterval);
|
|
2064
2066
|
}
|
|
2065
2067
|
}, pausePolling2 = function() {
|
|
2066
2068
|
if (currentTimeout) {
|
|
@@ -2084,81 +2086,99 @@ function createGatewayRuntime(config) {
|
|
|
2084
2086
|
let initialFetch$;
|
|
2085
2087
|
let schemaFetcher;
|
|
2086
2088
|
if (config.schema && typeof config.schema === "object" && "type" in config.schema) {
|
|
2087
|
-
const { endpoint, key } = config.schema;
|
|
2088
|
-
const
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
configContext.log.child("[hiveSchemaFetcher] ")
|
|
2089
|
+
const { endpoint, key, circuitBreaker } = config.schema;
|
|
2090
|
+
const endpoints = (Array.isArray(endpoint) ? endpoint : [endpoint]).map(
|
|
2091
|
+
(url) => url.endsWith("/sdl") ? url : joinUrl(
|
|
2092
|
+
url.endsWith("/services") ? url.substring(0, url.length - 8) : url,
|
|
2093
|
+
"sdl"
|
|
2093
2094
|
)
|
|
2095
|
+
);
|
|
2096
|
+
const fetcher = createCDNArtifactFetcher({
|
|
2097
|
+
endpoint: endpoints,
|
|
2098
|
+
circuitBreaker,
|
|
2099
|
+
accessKey: key,
|
|
2100
|
+
logger: configContext.log.child("[hiveSchemaFetcher] ")
|
|
2094
2101
|
});
|
|
2095
|
-
schemaFetcher =
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2102
|
+
schemaFetcher = {
|
|
2103
|
+
fetch: function fetchSchemaFromCDN() {
|
|
2104
|
+
pausePolling2();
|
|
2105
|
+
initialFetch$ = handleMaybePromise(
|
|
2106
|
+
fetcher.fetch,
|
|
2107
|
+
({ contents }) => {
|
|
2108
|
+
{
|
|
2109
|
+
unifiedGraph = buildSchema(contents, {
|
|
2110
|
+
assumeValid: true,
|
|
2111
|
+
assumeValidSDL: true
|
|
2112
|
+
});
|
|
2113
|
+
}
|
|
2114
|
+
continuePolling2();
|
|
2115
|
+
return true;
|
|
2116
|
+
}
|
|
2117
|
+
);
|
|
2118
|
+
return initialFetch$;
|
|
2119
|
+
},
|
|
2120
|
+
dispose: () => fetcher.dispose()
|
|
2108
2121
|
};
|
|
2109
2122
|
} else if (config.schema) {
|
|
2110
2123
|
if (!isDynamicUnifiedGraphSchema(config.schema)) {
|
|
2111
2124
|
delete config.pollingInterval;
|
|
2112
2125
|
}
|
|
2113
|
-
schemaFetcher =
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2126
|
+
schemaFetcher = {
|
|
2127
|
+
fetch: function fetchSchema() {
|
|
2128
|
+
pausePolling2();
|
|
2129
|
+
initialFetch$ = handleMaybePromise(
|
|
2130
|
+
() => handleUnifiedGraphConfig(
|
|
2131
|
+
// @ts-expect-error TODO: what's up with type narrowing
|
|
2132
|
+
config.schema,
|
|
2133
|
+
configContext
|
|
2134
|
+
),
|
|
2135
|
+
(schema) => {
|
|
2136
|
+
if (isSchema(schema)) {
|
|
2137
|
+
unifiedGraph = schema;
|
|
2138
|
+
} else if (isDocumentNode(schema)) {
|
|
2139
|
+
unifiedGraph = buildASTSchema(schema, {
|
|
2140
|
+
assumeValid: true,
|
|
2141
|
+
assumeValidSDL: true
|
|
2142
|
+
});
|
|
2143
|
+
} else {
|
|
2144
|
+
unifiedGraph = buildSchema(schema, {
|
|
2145
|
+
noLocation: true,
|
|
2146
|
+
assumeValid: true,
|
|
2147
|
+
assumeValidSDL: true
|
|
2148
|
+
});
|
|
2149
|
+
}
|
|
2150
|
+
continuePolling2();
|
|
2151
|
+
return true;
|
|
2135
2152
|
}
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
);
|
|
2140
|
-
return initialFetch$;
|
|
2153
|
+
);
|
|
2154
|
+
return initialFetch$;
|
|
2155
|
+
}
|
|
2141
2156
|
};
|
|
2142
2157
|
} else {
|
|
2143
|
-
schemaFetcher =
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2158
|
+
schemaFetcher = {
|
|
2159
|
+
fetch: function fetchSchemaWithExecutor() {
|
|
2160
|
+
pausePolling2();
|
|
2161
|
+
return handleMaybePromise(
|
|
2162
|
+
() => schemaFromExecutor(proxyExecutor, configContext, {
|
|
2163
|
+
assumeValid: true
|
|
2164
|
+
}),
|
|
2165
|
+
(schema) => {
|
|
2166
|
+
unifiedGraph = schema;
|
|
2167
|
+
continuePolling2();
|
|
2168
|
+
return true;
|
|
2169
|
+
}
|
|
2170
|
+
);
|
|
2171
|
+
}
|
|
2155
2172
|
};
|
|
2156
2173
|
}
|
|
2157
|
-
const instrumentedFetcher = schemaFetcher;
|
|
2158
|
-
schemaFetcher =
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2174
|
+
const instrumentedFetcher = schemaFetcher.fetch;
|
|
2175
|
+
schemaFetcher = {
|
|
2176
|
+
...schemaFetcher,
|
|
2177
|
+
fetch: (...args) => getInstrumented$1(null).asyncFn(
|
|
2178
|
+
instrumentation?.schema,
|
|
2179
|
+
instrumentedFetcher
|
|
2180
|
+
)(...args)
|
|
2181
|
+
};
|
|
2162
2182
|
getSchema = () => {
|
|
2163
2183
|
if (unifiedGraph != null) {
|
|
2164
2184
|
return unifiedGraph;
|
|
@@ -2169,21 +2189,21 @@ function createGatewayRuntime(config) {
|
|
|
2169
2189
|
() => unifiedGraph
|
|
2170
2190
|
);
|
|
2171
2191
|
}
|
|
2172
|
-
return handleMaybePromise(schemaFetcher, () => unifiedGraph);
|
|
2192
|
+
return handleMaybePromise(schemaFetcher.fetch, () => unifiedGraph);
|
|
2173
2193
|
};
|
|
2174
2194
|
const shouldSkipValidation = "skipValidation" in config ? config.skipValidation : false;
|
|
2175
|
-
|
|
2195
|
+
unifiedGraphPlugin = {
|
|
2176
2196
|
onValidate({ params, setResult }) {
|
|
2177
2197
|
if (shouldSkipValidation || !params.schema) {
|
|
2178
2198
|
setResult([]);
|
|
2179
2199
|
}
|
|
2180
2200
|
},
|
|
2181
|
-
onDispose() {
|
|
2201
|
+
async onDispose() {
|
|
2182
2202
|
pausePolling2();
|
|
2183
|
-
|
|
2203
|
+
await transportExecutorStack.disposeAsync();
|
|
2204
|
+
return schemaFetcher.dispose?.();
|
|
2184
2205
|
}
|
|
2185
2206
|
};
|
|
2186
|
-
unifiedGraphPlugin = executorPlugin;
|
|
2187
2207
|
readinessChecker = () => handleMaybePromise(
|
|
2188
2208
|
() => proxyExecutor({
|
|
2189
2209
|
document: parse(`query ReadinessCheck { __typename }`, {
|
|
@@ -2194,7 +2214,7 @@ function createGatewayRuntime(config) {
|
|
|
2194
2214
|
);
|
|
2195
2215
|
schemaInvalidator = () => {
|
|
2196
2216
|
unifiedGraph = void 0;
|
|
2197
|
-
initialFetch$ = schemaFetcher();
|
|
2217
|
+
initialFetch$ = schemaFetcher.fetch();
|
|
2198
2218
|
};
|
|
2199
2219
|
} else if ("subgraph" in config) {
|
|
2200
2220
|
let getSubschemaConfig2 = function() {
|
|
@@ -2409,31 +2429,40 @@ function createGatewayRuntime(config) {
|
|
|
2409
2429
|
let unifiedGraphFetcher;
|
|
2410
2430
|
if (typeof config.supergraph === "object" && "type" in config.supergraph) {
|
|
2411
2431
|
if (config.supergraph.type === "hive") {
|
|
2412
|
-
const { endpoint, key } = config.supergraph;
|
|
2413
|
-
const
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2432
|
+
const { endpoint, key, circuitBreaker } = config.supergraph;
|
|
2433
|
+
const endpoints = (Array.isArray(endpoint) ? endpoint : [endpoint]).map(
|
|
2434
|
+
(url) => url.endsWith("/supergraph") ? url : `${url}/supergraph`
|
|
2435
|
+
);
|
|
2436
|
+
const fetcher = createCDNArtifactFetcher({
|
|
2437
|
+
endpoint: endpoints,
|
|
2438
|
+
accessKey: key,
|
|
2439
|
+
logger: configContext.log.child("[hiveSupergraphFetcher] "),
|
|
2419
2440
|
// @ts-expect-error - MeshFetch is not compatible with `typeof fetch`
|
|
2420
|
-
|
|
2441
|
+
fetch: configContext.fetch,
|
|
2442
|
+
circuitBreaker,
|
|
2421
2443
|
name: "hive-gateway",
|
|
2422
2444
|
version: globalThis.__VERSION__
|
|
2423
2445
|
});
|
|
2424
|
-
unifiedGraphFetcher =
|
|
2446
|
+
unifiedGraphFetcher = {
|
|
2447
|
+
fetch: () => fetcher.fetch().then(({ contents }) => contents),
|
|
2448
|
+
dispose: () => fetcher.dispose()
|
|
2449
|
+
};
|
|
2425
2450
|
} else if (config.supergraph.type === "graphos") {
|
|
2426
2451
|
const graphosFetcherContainer = createGraphOSFetcher({
|
|
2427
2452
|
graphosOpts: config.supergraph,
|
|
2428
2453
|
configContext,
|
|
2429
2454
|
pollingInterval: config.pollingInterval
|
|
2430
2455
|
});
|
|
2431
|
-
unifiedGraphFetcher =
|
|
2456
|
+
unifiedGraphFetcher = {
|
|
2457
|
+
fetch: graphosFetcherContainer.unifiedGraphFetcher
|
|
2458
|
+
};
|
|
2432
2459
|
} else {
|
|
2433
|
-
unifiedGraphFetcher =
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2460
|
+
unifiedGraphFetcher = {
|
|
2461
|
+
fetch: () => {
|
|
2462
|
+
throw new Error(
|
|
2463
|
+
`Unknown supergraph configuration: ${config.supergraph}`
|
|
2464
|
+
);
|
|
2465
|
+
}
|
|
2437
2466
|
};
|
|
2438
2467
|
}
|
|
2439
2468
|
} else {
|
|
@@ -2445,20 +2474,25 @@ function createGatewayRuntime(config) {
|
|
|
2445
2474
|
`Polling interval not set for supergraph, if you want to get updates of supergraph, we recommend setting a polling interval`
|
|
2446
2475
|
);
|
|
2447
2476
|
}
|
|
2448
|
-
unifiedGraphFetcher =
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2477
|
+
unifiedGraphFetcher = {
|
|
2478
|
+
fetch: () => handleUnifiedGraphConfig(
|
|
2479
|
+
// @ts-expect-error TODO: what's up with type narrowing
|
|
2480
|
+
config.supergraph,
|
|
2481
|
+
configContext
|
|
2482
|
+
)
|
|
2483
|
+
};
|
|
2453
2484
|
}
|
|
2454
|
-
const instrumentedGraphFetcher = unifiedGraphFetcher;
|
|
2455
|
-
unifiedGraphFetcher =
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2485
|
+
const instrumentedGraphFetcher = unifiedGraphFetcher.fetch;
|
|
2486
|
+
unifiedGraphFetcher = {
|
|
2487
|
+
...unifiedGraphFetcher,
|
|
2488
|
+
fetch: (...args) => getInstrumented$1(null).asyncFn(
|
|
2489
|
+
instrumentation?.schema,
|
|
2490
|
+
instrumentedGraphFetcher
|
|
2491
|
+
)(...args)
|
|
2492
|
+
};
|
|
2459
2493
|
const unifiedGraphManager = new UnifiedGraphManager({
|
|
2460
2494
|
handleUnifiedGraph: config.unifiedGraphHandler,
|
|
2461
|
-
getUnifiedGraph: unifiedGraphFetcher,
|
|
2495
|
+
getUnifiedGraph: unifiedGraphFetcher.fetch,
|
|
2462
2496
|
onUnifiedGraphChange(newUnifiedGraph) {
|
|
2463
2497
|
unifiedGraph = newUnifiedGraph;
|
|
2464
2498
|
replaceSchema(newUnifiedGraph);
|
|
@@ -2508,7 +2542,9 @@ function createGatewayRuntime(config) {
|
|
|
2508
2542
|
getExecutor = () => unifiedGraphManager.getExecutor();
|
|
2509
2543
|
unifiedGraphPlugin = {
|
|
2510
2544
|
onDispose() {
|
|
2511
|
-
return
|
|
2545
|
+
return unfakePromise(
|
|
2546
|
+
fakePromise(void 0).then(() => dispose(unifiedGraphManager)).then(() => unifiedGraphFetcher.dispose?.())
|
|
2547
|
+
);
|
|
2512
2548
|
}
|
|
2513
2549
|
};
|
|
2514
2550
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@graphql-hive/gateway-runtime",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -55,20 +55,20 @@
|
|
|
55
55
|
"@graphql-hive/signal": "^2.0.0",
|
|
56
56
|
"@graphql-hive/yoga": "^0.43.1",
|
|
57
57
|
"@graphql-mesh/cross-helpers": "^0.4.10",
|
|
58
|
-
"@graphql-mesh/fusion-runtime": "1.6.0-
|
|
58
|
+
"@graphql-mesh/fusion-runtime": "1.6.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56",
|
|
59
59
|
"@graphql-mesh/hmac-upstream-signature": "^2.0.8",
|
|
60
60
|
"@graphql-mesh/plugin-response-cache": "^0.104.18",
|
|
61
61
|
"@graphql-mesh/transport-common": "^1.0.12",
|
|
62
62
|
"@graphql-mesh/types": "^0.104.16",
|
|
63
63
|
"@graphql-mesh/utils": "^0.104.16",
|
|
64
|
-
"@graphql-tools/batch-delegate": "10.0.6-
|
|
65
|
-
"@graphql-tools/delegate": "12.0.0-
|
|
64
|
+
"@graphql-tools/batch-delegate": "10.0.6-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56",
|
|
65
|
+
"@graphql-tools/delegate": "12.0.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56",
|
|
66
66
|
"@graphql-tools/executor-common": "^1.0.5",
|
|
67
67
|
"@graphql-tools/executor-http": "^3.0.7",
|
|
68
|
-
"@graphql-tools/federation": "4.2.4-
|
|
69
|
-
"@graphql-tools/stitch": "10.1.4-
|
|
68
|
+
"@graphql-tools/federation": "4.2.4-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56",
|
|
69
|
+
"@graphql-tools/stitch": "10.1.4-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56",
|
|
70
70
|
"@graphql-tools/utils": "^10.10.3",
|
|
71
|
-
"@graphql-tools/wrap": "11.1.0-
|
|
71
|
+
"@graphql-tools/wrap": "11.1.0-alpha-475ccdfcc6961ea0cd7ea4755ea6696ff92f6b56",
|
|
72
72
|
"@graphql-yoga/plugin-apollo-usage-report": "^0.11.2",
|
|
73
73
|
"@graphql-yoga/plugin-csrf-prevention": "^3.16.2",
|
|
74
74
|
"@graphql-yoga/plugin-defer-stream": "^3.16.2",
|