@apollo/gateway 2.0.0-alpha.0 → 2.0.0-alpha.4
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/README.md +1 -1
- package/dist/__generated__/graphqlTypes.d.ts +13 -11
- package/dist/__generated__/graphqlTypes.d.ts.map +1 -1
- package/dist/__generated__/graphqlTypes.js.map +1 -1
- package/dist/config.d.ts +45 -24
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -31
- package/dist/config.js.map +1 -1
- package/dist/datasources/LocalGraphQLDataSource.js.map +1 -1
- package/dist/datasources/RemoteGraphQLDataSource.d.ts.map +1 -1
- package/dist/datasources/RemoteGraphQLDataSource.js +4 -1
- package/dist/datasources/RemoteGraphQLDataSource.js.map +1 -1
- package/dist/datasources/types.d.ts +1 -1
- package/dist/datasources/types.d.ts.map +1 -1
- package/dist/executeQueryPlan.d.ts.map +1 -1
- package/dist/executeQueryPlan.js +6 -6
- package/dist/executeQueryPlan.js.map +1 -1
- package/dist/index.d.ts +36 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +197 -297
- package/dist/index.js.map +1 -1
- package/dist/operationContext.js +0 -1
- package/dist/operationContext.js.map +1 -1
- package/dist/schema-helper/addResolversToSchema.d.ts +4 -0
- package/dist/schema-helper/addResolversToSchema.d.ts.map +1 -0
- package/dist/schema-helper/addResolversToSchema.js +62 -0
- package/dist/schema-helper/addResolversToSchema.js.map +1 -0
- package/dist/schema-helper/error.d.ts +6 -0
- package/dist/schema-helper/error.d.ts.map +1 -0
- package/dist/schema-helper/error.js +14 -0
- package/dist/schema-helper/error.js.map +1 -0
- package/dist/schema-helper/index.d.ts +4 -0
- package/dist/schema-helper/index.d.ts.map +1 -0
- package/dist/schema-helper/index.js +16 -0
- package/dist/schema-helper/index.js.map +1 -0
- package/dist/schema-helper/resolverMap.d.ts +16 -0
- package/dist/schema-helper/resolverMap.d.ts.map +1 -0
- package/dist/schema-helper/resolverMap.js +3 -0
- package/dist/schema-helper/resolverMap.js.map +1 -0
- package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts +31 -0
- package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts.map +1 -0
- package/dist/supergraphManagers/IntrospectAndCompose/index.js +112 -0
- package/dist/supergraphManagers/IntrospectAndCompose/index.js.map +1 -0
- package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts +12 -0
- package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts.map +1 -0
- package/dist/{loadServicesFromRemoteEndpoint.js → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js} +6 -6
- package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js.map +1 -0
- package/dist/supergraphManagers/LegacyFetcher/index.d.ts +33 -0
- package/dist/supergraphManagers/LegacyFetcher/index.d.ts.map +1 -0
- package/dist/supergraphManagers/LegacyFetcher/index.js +149 -0
- package/dist/supergraphManagers/LegacyFetcher/index.js.map +1 -0
- package/dist/supergraphManagers/LocalCompose/index.d.ts +19 -0
- package/dist/supergraphManagers/LocalCompose/index.d.ts.map +1 -0
- package/dist/supergraphManagers/LocalCompose/index.js +55 -0
- package/dist/supergraphManagers/LocalCompose/index.js.map +1 -0
- package/dist/supergraphManagers/UplinkFetcher/index.d.ts +32 -0
- package/dist/supergraphManagers/UplinkFetcher/index.d.ts.map +1 -0
- package/dist/supergraphManagers/UplinkFetcher/index.js +96 -0
- package/dist/supergraphManagers/UplinkFetcher/index.js.map +1 -0
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts +21 -0
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts.map +1 -0
- package/dist/{loadSupergraphSdlFromStorage.js → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js} +41 -10
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js.map +1 -0
- package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts +13 -0
- package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts.map +1 -0
- package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js +85 -0
- package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js.map +1 -0
- package/dist/supergraphManagers/index.d.ts +5 -0
- package/dist/supergraphManagers/index.d.ts.map +1 -0
- package/dist/supergraphManagers/index.js +12 -0
- package/dist/supergraphManagers/index.js.map +1 -0
- package/dist/utilities/array.js +1 -1
- package/dist/utilities/array.js.map +1 -1
- package/dist/utilities/createHash.d.ts +2 -0
- package/dist/utilities/createHash.d.ts.map +1 -0
- package/dist/utilities/createHash.js +15 -0
- package/dist/utilities/createHash.js.map +1 -0
- package/dist/utilities/isNodeLike.d.ts +3 -0
- package/dist/utilities/isNodeLike.d.ts.map +1 -0
- package/dist/utilities/isNodeLike.js +8 -0
- package/dist/utilities/isNodeLike.js.map +1 -0
- package/package.json +9 -9
- package/src/__generated__/graphqlTypes.ts +13 -11
- package/src/__mocks__/make-fetch-happen-fetcher.ts +3 -1
- package/src/__tests__/buildQueryPlan.test.ts +1 -1
- package/src/__tests__/executeQueryPlan.test.ts +1171 -77
- package/src/__tests__/execution-utils.ts +5 -7
- package/src/__tests__/gateway/buildService.test.ts +3 -3
- package/src/__tests__/gateway/endToEnd.test.ts +1 -1
- package/src/__tests__/gateway/executor.test.ts +3 -1
- package/src/__tests__/gateway/lifecycle-hooks.test.ts +59 -121
- package/src/__tests__/gateway/opentelemetry.test.ts +8 -3
- package/src/__tests__/gateway/queryPlanCache.test.ts +25 -9
- package/src/__tests__/gateway/reporting.test.ts +42 -13
- package/src/__tests__/gateway/supergraphSdl.test.ts +397 -0
- package/src/__tests__/integration/aliases.test.ts +9 -3
- package/src/__tests__/integration/configuration.test.ts +140 -21
- package/src/__tests__/integration/logger.test.ts +2 -2
- package/src/__tests__/integration/networkRequests.test.ts +126 -149
- package/src/__tests__/integration/nockMocks.ts +57 -16
- package/src/__tests__/nockAssertions.ts +20 -0
- package/src/config.ts +153 -77
- package/src/core/__tests__/core.test.ts +6 -6
- package/src/datasources/LocalGraphQLDataSource.ts +1 -1
- package/src/datasources/RemoteGraphQLDataSource.ts +8 -2
- package/src/datasources/__tests__/LocalGraphQLDataSource.test.ts +1 -1
- package/src/datasources/__tests__/RemoteGraphQLDataSource.test.ts +4 -4
- package/src/datasources/types.ts +1 -1
- package/src/executeQueryPlan.ts +18 -9
- package/src/index.ts +323 -481
- package/src/make-fetch-happen.d.ts +1 -1
- package/src/operationContext.ts +2 -2
- package/src/schema-helper/addResolversToSchema.ts +83 -0
- package/src/schema-helper/error.ts +11 -0
- package/src/schema-helper/index.ts +3 -0
- package/src/schema-helper/resolverMap.ts +23 -0
- package/src/supergraphManagers/IntrospectAndCompose/__tests__/IntrospectAndCompose.test.ts +370 -0
- package/src/{__tests__ → supergraphManagers/IntrospectAndCompose/__tests__}/loadServicesFromRemoteEndpoint.test.ts +7 -7
- package/src/supergraphManagers/IntrospectAndCompose/__tests__/tsconfig.json +8 -0
- package/src/supergraphManagers/IntrospectAndCompose/index.ts +160 -0
- package/src/{loadServicesFromRemoteEndpoint.ts → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.ts} +7 -7
- package/src/supergraphManagers/LegacyFetcher/index.ts +226 -0
- package/src/supergraphManagers/LocalCompose/index.ts +79 -0
- package/src/supergraphManagers/UplinkFetcher/__tests__/loadSupergraphSdlFromStorage.test.ts +343 -0
- package/src/supergraphManagers/UplinkFetcher/__tests__/tsconfig.json +8 -0
- package/src/supergraphManagers/UplinkFetcher/index.ts +128 -0
- package/src/{loadSupergraphSdlFromStorage.ts → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts} +63 -14
- package/src/supergraphManagers/UplinkFetcher/outOfBandReporter.ts +126 -0
- package/src/supergraphManagers/index.ts +4 -0
- package/src/utilities/__tests__/cleanErrorOfInaccessibleElements.test.ts +13 -10
- package/src/utilities/array.ts +1 -1
- package/src/utilities/createHash.ts +10 -0
- package/src/utilities/isNodeLike.ts +11 -0
- package/CHANGELOG.md +0 -452
- package/dist/legacyLoadServicesFromStorage.d.ts +0 -20
- package/dist/legacyLoadServicesFromStorage.d.ts.map +0 -1
- package/dist/legacyLoadServicesFromStorage.js +0 -62
- package/dist/legacyLoadServicesFromStorage.js.map +0 -1
- package/dist/loadServicesFromRemoteEndpoint.d.ts +0 -13
- package/dist/loadServicesFromRemoteEndpoint.d.ts.map +0 -1
- package/dist/loadServicesFromRemoteEndpoint.js.map +0 -1
- package/dist/loadSupergraphSdlFromStorage.d.ts +0 -12
- package/dist/loadSupergraphSdlFromStorage.d.ts.map +0 -1
- package/dist/loadSupergraphSdlFromStorage.js.map +0 -1
- package/dist/outOfBandReporter.d.ts +0 -15
- package/dist/outOfBandReporter.d.ts.map +0 -1
- package/dist/outOfBandReporter.js +0 -88
- package/dist/outOfBandReporter.js.map +0 -1
- package/src/__tests__/gateway/composedSdl.test.ts +0 -44
- package/src/__tests__/integration/legacyNetworkRequests.test.ts +0 -279
- package/src/__tests__/integration/legacyNockMocks.ts +0 -113
- package/src/__tests__/loadSupergraphSdlFromStorage.test.ts +0 -664
- package/src/legacyLoadServicesFromStorage.ts +0 -170
- package/src/outOfBandReporter.ts +0 -128
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { fetch, Response, Request } from 'apollo-server-env';
|
|
2
|
+
import { GraphQLError } from 'graphql';
|
|
3
|
+
import {
|
|
4
|
+
ErrorCode,
|
|
5
|
+
OobReportMutation,
|
|
6
|
+
OobReportMutationVariables,
|
|
7
|
+
} from '../../__generated__/graphqlTypes';
|
|
8
|
+
|
|
9
|
+
// Magic /* GraphQL */ comment below is for codegen, do not remove
|
|
10
|
+
export const OUT_OF_BAND_REPORTER_QUERY = /* GraphQL */`#graphql
|
|
11
|
+
mutation OOBReport($input: APIMonitoringReport) {
|
|
12
|
+
reportError(report: $input)
|
|
13
|
+
}
|
|
14
|
+
`;
|
|
15
|
+
|
|
16
|
+
const { name, version } = require('../../../package.json');
|
|
17
|
+
|
|
18
|
+
type OobReportMutationResult =
|
|
19
|
+
| OobReportMutationSuccess
|
|
20
|
+
| OobReportMutationFailure;
|
|
21
|
+
|
|
22
|
+
interface OobReportMutationSuccess {
|
|
23
|
+
data: OobReportMutation;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface OobReportMutationFailure {
|
|
27
|
+
data?: OobReportMutation;
|
|
28
|
+
errors: GraphQLError[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function submitOutOfBandReportIfConfigured({
|
|
32
|
+
error,
|
|
33
|
+
request,
|
|
34
|
+
endpoint,
|
|
35
|
+
response,
|
|
36
|
+
startedAt,
|
|
37
|
+
endedAt,
|
|
38
|
+
tags,
|
|
39
|
+
fetcher,
|
|
40
|
+
}: {
|
|
41
|
+
error: Error;
|
|
42
|
+
request: Request;
|
|
43
|
+
endpoint: string | undefined;
|
|
44
|
+
response?: Response;
|
|
45
|
+
startedAt: Date;
|
|
46
|
+
endedAt: Date;
|
|
47
|
+
tags?: string[];
|
|
48
|
+
fetcher: typeof fetch;
|
|
49
|
+
}) {
|
|
50
|
+
// don't send report if the endpoint url is not configured
|
|
51
|
+
if (!endpoint) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let errorCode: ErrorCode;
|
|
56
|
+
if (!response) {
|
|
57
|
+
errorCode = ErrorCode.ConnectionFailed;
|
|
58
|
+
} else {
|
|
59
|
+
// possible error situations to check against
|
|
60
|
+
switch (response.status) {
|
|
61
|
+
case 400:
|
|
62
|
+
case 413:
|
|
63
|
+
case 422:
|
|
64
|
+
errorCode = ErrorCode.InvalidBody;
|
|
65
|
+
break;
|
|
66
|
+
case 408:
|
|
67
|
+
case 504:
|
|
68
|
+
errorCode = ErrorCode.Timeout;
|
|
69
|
+
break;
|
|
70
|
+
case 502:
|
|
71
|
+
case 503:
|
|
72
|
+
errorCode = ErrorCode.ConnectionFailed;
|
|
73
|
+
break;
|
|
74
|
+
default:
|
|
75
|
+
errorCode = ErrorCode.Other;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const responseBody: string | undefined = await response?.text();
|
|
80
|
+
|
|
81
|
+
const variables: OobReportMutationVariables = {
|
|
82
|
+
input: {
|
|
83
|
+
error: {
|
|
84
|
+
code: errorCode,
|
|
85
|
+
message: error.message,
|
|
86
|
+
},
|
|
87
|
+
request: {
|
|
88
|
+
url: request.url,
|
|
89
|
+
body: await request.text(),
|
|
90
|
+
},
|
|
91
|
+
response: response
|
|
92
|
+
? {
|
|
93
|
+
httpStatusCode: response.status,
|
|
94
|
+
body: responseBody,
|
|
95
|
+
}
|
|
96
|
+
: null,
|
|
97
|
+
startedAt: startedAt.toISOString(),
|
|
98
|
+
endedAt: endedAt.toISOString(),
|
|
99
|
+
tags: tags,
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
const oobResponse = await fetcher(endpoint, {
|
|
105
|
+
method: 'POST',
|
|
106
|
+
body: JSON.stringify({
|
|
107
|
+
query: OUT_OF_BAND_REPORTER_QUERY,
|
|
108
|
+
variables,
|
|
109
|
+
}),
|
|
110
|
+
headers: {
|
|
111
|
+
'apollographql-client-name': name,
|
|
112
|
+
'apollographql-client-version': version,
|
|
113
|
+
'user-agent': `${name}/${version}`,
|
|
114
|
+
'content-type': 'application/json',
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
const parsedResponse: OobReportMutationResult = await oobResponse.json();
|
|
118
|
+
if (!parsedResponse?.data?.reportError) {
|
|
119
|
+
throw new Error(
|
|
120
|
+
`Out-of-band error reporting failed: ${oobResponse.status} ${oobResponse.statusText}`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
} catch (e) {
|
|
124
|
+
throw new Error(`Out-of-band error reporting failed: ${e.message ?? e}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { execute, GraphQLError, parse } from
|
|
2
|
-
import { cleanErrorOfInaccessibleNames } from
|
|
3
|
-
import { buildSchema } from
|
|
1
|
+
import { execute, GraphQLError, parse } from 'graphql';
|
|
2
|
+
import { cleanErrorOfInaccessibleNames } from '../cleanErrorOfInaccessibleNames';
|
|
3
|
+
import { buildSchema } from '@apollo/federation-internals';
|
|
4
4
|
|
|
5
5
|
describe('cleanErrorOfInaccessibleNames', () => {
|
|
6
6
|
const coreSchema = buildSchema(`
|
|
@@ -49,19 +49,22 @@ describe('cleanErrorOfInaccessibleNames', () => {
|
|
|
49
49
|
const schema = coreSchema.toAPISchema().toGraphQLJSSchema();
|
|
50
50
|
|
|
51
51
|
it('removes inaccessible type names from error messages', async () => {
|
|
52
|
-
const result = await execute(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
const result = await execute({
|
|
53
|
+
schema,
|
|
54
|
+
document: parse('{fooField{someField}}'),
|
|
55
|
+
rootValue: {
|
|
56
|
+
fooField: {
|
|
57
|
+
__typename: 'Bar',
|
|
58
|
+
someField: 'test',
|
|
59
|
+
},
|
|
56
60
|
},
|
|
57
61
|
});
|
|
58
62
|
|
|
59
|
-
const cleaned = cleanErrorOfInaccessibleNames(schema, result.errors
|
|
63
|
+
const cleaned = cleanErrorOfInaccessibleNames(schema, result.errors![0]!);
|
|
60
64
|
expect(cleaned.message).toMatchInlineSnapshot(
|
|
61
|
-
`"Abstract type \\"Foo\\" was
|
|
65
|
+
`"Abstract type \\"Foo\\" was resolved to a type [inaccessible type] that does not exist inside the schema."`,
|
|
62
66
|
);
|
|
63
67
|
});
|
|
64
|
-
|
|
65
68
|
it('removes multiple/repeated inaccessible type names from error messages', async () => {
|
|
66
69
|
const contrivedError = new GraphQLError(
|
|
67
70
|
`Something something "Bar" and "Bar" again, as well as "Bar2".`,
|
package/src/utilities/array.ts
CHANGED
|
@@ -27,7 +27,7 @@ export function findAndExtract<T>(
|
|
|
27
27
|
const index = array.findIndex(predicate);
|
|
28
28
|
if (index === -1) return [undefined, array];
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
const remaining = array.slice(0, index);
|
|
31
31
|
if (index < array.length - 1) {
|
|
32
32
|
remaining.push(...array.slice(index + 1));
|
|
33
33
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import isNodeLike from './isNodeLike';
|
|
2
|
+
|
|
3
|
+
export function createHash (kind: string): import('crypto').Hash {
|
|
4
|
+
if (isNodeLike) {
|
|
5
|
+
// Use module.require instead of just require to avoid bundling whatever
|
|
6
|
+
// crypto polyfills a non-Node bundler might fall back to.
|
|
7
|
+
return module.require('crypto').createHash(kind);
|
|
8
|
+
}
|
|
9
|
+
return require('sha.js')(kind);
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export default typeof process === 'object' &&
|
|
2
|
+
process &&
|
|
3
|
+
// We used to check `process.release.name === "node"`, however that doesn't
|
|
4
|
+
// account for certain forks of Node.js which are otherwise identical to
|
|
5
|
+
// Node.js. For example, NodeSource's N|Solid reports itself as "nsolid",
|
|
6
|
+
// though it's mostly the same build of Node.js with an extra addon.
|
|
7
|
+
process.release &&
|
|
8
|
+
process.versions &&
|
|
9
|
+
// The one thing which is present on both Node.js and N|Solid (a fork of
|
|
10
|
+
// Node.js), is `process.versions.node` being defined.
|
|
11
|
+
typeof process.versions.node === 'string';
|