@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.
Files changed (154) hide show
  1. package/README.md +1 -1
  2. package/dist/__generated__/graphqlTypes.d.ts +13 -11
  3. package/dist/__generated__/graphqlTypes.d.ts.map +1 -1
  4. package/dist/__generated__/graphqlTypes.js.map +1 -1
  5. package/dist/config.d.ts +45 -24
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +30 -31
  8. package/dist/config.js.map +1 -1
  9. package/dist/datasources/LocalGraphQLDataSource.js.map +1 -1
  10. package/dist/datasources/RemoteGraphQLDataSource.d.ts.map +1 -1
  11. package/dist/datasources/RemoteGraphQLDataSource.js +4 -1
  12. package/dist/datasources/RemoteGraphQLDataSource.js.map +1 -1
  13. package/dist/datasources/types.d.ts +1 -1
  14. package/dist/datasources/types.d.ts.map +1 -1
  15. package/dist/executeQueryPlan.d.ts.map +1 -1
  16. package/dist/executeQueryPlan.js +6 -6
  17. package/dist/executeQueryPlan.js.map +1 -1
  18. package/dist/index.d.ts +36 -23
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +197 -297
  21. package/dist/index.js.map +1 -1
  22. package/dist/operationContext.js +0 -1
  23. package/dist/operationContext.js.map +1 -1
  24. package/dist/schema-helper/addResolversToSchema.d.ts +4 -0
  25. package/dist/schema-helper/addResolversToSchema.d.ts.map +1 -0
  26. package/dist/schema-helper/addResolversToSchema.js +62 -0
  27. package/dist/schema-helper/addResolversToSchema.js.map +1 -0
  28. package/dist/schema-helper/error.d.ts +6 -0
  29. package/dist/schema-helper/error.d.ts.map +1 -0
  30. package/dist/schema-helper/error.js +14 -0
  31. package/dist/schema-helper/error.js.map +1 -0
  32. package/dist/schema-helper/index.d.ts +4 -0
  33. package/dist/schema-helper/index.d.ts.map +1 -0
  34. package/dist/schema-helper/index.js +16 -0
  35. package/dist/schema-helper/index.js.map +1 -0
  36. package/dist/schema-helper/resolverMap.d.ts +16 -0
  37. package/dist/schema-helper/resolverMap.d.ts.map +1 -0
  38. package/dist/schema-helper/resolverMap.js +3 -0
  39. package/dist/schema-helper/resolverMap.js.map +1 -0
  40. package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts +31 -0
  41. package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts.map +1 -0
  42. package/dist/supergraphManagers/IntrospectAndCompose/index.js +112 -0
  43. package/dist/supergraphManagers/IntrospectAndCompose/index.js.map +1 -0
  44. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts +12 -0
  45. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts.map +1 -0
  46. package/dist/{loadServicesFromRemoteEndpoint.js → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js} +6 -6
  47. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js.map +1 -0
  48. package/dist/supergraphManagers/LegacyFetcher/index.d.ts +33 -0
  49. package/dist/supergraphManagers/LegacyFetcher/index.d.ts.map +1 -0
  50. package/dist/supergraphManagers/LegacyFetcher/index.js +149 -0
  51. package/dist/supergraphManagers/LegacyFetcher/index.js.map +1 -0
  52. package/dist/supergraphManagers/LocalCompose/index.d.ts +19 -0
  53. package/dist/supergraphManagers/LocalCompose/index.d.ts.map +1 -0
  54. package/dist/supergraphManagers/LocalCompose/index.js +55 -0
  55. package/dist/supergraphManagers/LocalCompose/index.js.map +1 -0
  56. package/dist/supergraphManagers/UplinkFetcher/index.d.ts +32 -0
  57. package/dist/supergraphManagers/UplinkFetcher/index.d.ts.map +1 -0
  58. package/dist/supergraphManagers/UplinkFetcher/index.js +96 -0
  59. package/dist/supergraphManagers/UplinkFetcher/index.js.map +1 -0
  60. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts +21 -0
  61. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts.map +1 -0
  62. package/dist/{loadSupergraphSdlFromStorage.js → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js} +41 -10
  63. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js.map +1 -0
  64. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts +13 -0
  65. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts.map +1 -0
  66. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js +85 -0
  67. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js.map +1 -0
  68. package/dist/supergraphManagers/index.d.ts +5 -0
  69. package/dist/supergraphManagers/index.d.ts.map +1 -0
  70. package/dist/supergraphManagers/index.js +12 -0
  71. package/dist/supergraphManagers/index.js.map +1 -0
  72. package/dist/utilities/array.js +1 -1
  73. package/dist/utilities/array.js.map +1 -1
  74. package/dist/utilities/createHash.d.ts +2 -0
  75. package/dist/utilities/createHash.d.ts.map +1 -0
  76. package/dist/utilities/createHash.js +15 -0
  77. package/dist/utilities/createHash.js.map +1 -0
  78. package/dist/utilities/isNodeLike.d.ts +3 -0
  79. package/dist/utilities/isNodeLike.d.ts.map +1 -0
  80. package/dist/utilities/isNodeLike.js +8 -0
  81. package/dist/utilities/isNodeLike.js.map +1 -0
  82. package/package.json +9 -9
  83. package/src/__generated__/graphqlTypes.ts +13 -11
  84. package/src/__mocks__/make-fetch-happen-fetcher.ts +3 -1
  85. package/src/__tests__/buildQueryPlan.test.ts +1 -1
  86. package/src/__tests__/executeQueryPlan.test.ts +1171 -77
  87. package/src/__tests__/execution-utils.ts +5 -7
  88. package/src/__tests__/gateway/buildService.test.ts +3 -3
  89. package/src/__tests__/gateway/endToEnd.test.ts +1 -1
  90. package/src/__tests__/gateway/executor.test.ts +3 -1
  91. package/src/__tests__/gateway/lifecycle-hooks.test.ts +59 -121
  92. package/src/__tests__/gateway/opentelemetry.test.ts +8 -3
  93. package/src/__tests__/gateway/queryPlanCache.test.ts +25 -9
  94. package/src/__tests__/gateway/reporting.test.ts +42 -13
  95. package/src/__tests__/gateway/supergraphSdl.test.ts +397 -0
  96. package/src/__tests__/integration/aliases.test.ts +9 -3
  97. package/src/__tests__/integration/configuration.test.ts +140 -21
  98. package/src/__tests__/integration/logger.test.ts +2 -2
  99. package/src/__tests__/integration/networkRequests.test.ts +126 -149
  100. package/src/__tests__/integration/nockMocks.ts +57 -16
  101. package/src/__tests__/nockAssertions.ts +20 -0
  102. package/src/config.ts +153 -77
  103. package/src/core/__tests__/core.test.ts +6 -6
  104. package/src/datasources/LocalGraphQLDataSource.ts +1 -1
  105. package/src/datasources/RemoteGraphQLDataSource.ts +8 -2
  106. package/src/datasources/__tests__/LocalGraphQLDataSource.test.ts +1 -1
  107. package/src/datasources/__tests__/RemoteGraphQLDataSource.test.ts +4 -4
  108. package/src/datasources/types.ts +1 -1
  109. package/src/executeQueryPlan.ts +18 -9
  110. package/src/index.ts +323 -481
  111. package/src/make-fetch-happen.d.ts +1 -1
  112. package/src/operationContext.ts +2 -2
  113. package/src/schema-helper/addResolversToSchema.ts +83 -0
  114. package/src/schema-helper/error.ts +11 -0
  115. package/src/schema-helper/index.ts +3 -0
  116. package/src/schema-helper/resolverMap.ts +23 -0
  117. package/src/supergraphManagers/IntrospectAndCompose/__tests__/IntrospectAndCompose.test.ts +370 -0
  118. package/src/{__tests__ → supergraphManagers/IntrospectAndCompose/__tests__}/loadServicesFromRemoteEndpoint.test.ts +7 -7
  119. package/src/supergraphManagers/IntrospectAndCompose/__tests__/tsconfig.json +8 -0
  120. package/src/supergraphManagers/IntrospectAndCompose/index.ts +160 -0
  121. package/src/{loadServicesFromRemoteEndpoint.ts → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.ts} +7 -7
  122. package/src/supergraphManagers/LegacyFetcher/index.ts +226 -0
  123. package/src/supergraphManagers/LocalCompose/index.ts +79 -0
  124. package/src/supergraphManagers/UplinkFetcher/__tests__/loadSupergraphSdlFromStorage.test.ts +343 -0
  125. package/src/supergraphManagers/UplinkFetcher/__tests__/tsconfig.json +8 -0
  126. package/src/supergraphManagers/UplinkFetcher/index.ts +128 -0
  127. package/src/{loadSupergraphSdlFromStorage.ts → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts} +63 -14
  128. package/src/supergraphManagers/UplinkFetcher/outOfBandReporter.ts +126 -0
  129. package/src/supergraphManagers/index.ts +4 -0
  130. package/src/utilities/__tests__/cleanErrorOfInaccessibleElements.test.ts +13 -10
  131. package/src/utilities/array.ts +1 -1
  132. package/src/utilities/createHash.ts +10 -0
  133. package/src/utilities/isNodeLike.ts +11 -0
  134. package/CHANGELOG.md +0 -452
  135. package/dist/legacyLoadServicesFromStorage.d.ts +0 -20
  136. package/dist/legacyLoadServicesFromStorage.d.ts.map +0 -1
  137. package/dist/legacyLoadServicesFromStorage.js +0 -62
  138. package/dist/legacyLoadServicesFromStorage.js.map +0 -1
  139. package/dist/loadServicesFromRemoteEndpoint.d.ts +0 -13
  140. package/dist/loadServicesFromRemoteEndpoint.d.ts.map +0 -1
  141. package/dist/loadServicesFromRemoteEndpoint.js.map +0 -1
  142. package/dist/loadSupergraphSdlFromStorage.d.ts +0 -12
  143. package/dist/loadSupergraphSdlFromStorage.d.ts.map +0 -1
  144. package/dist/loadSupergraphSdlFromStorage.js.map +0 -1
  145. package/dist/outOfBandReporter.d.ts +0 -15
  146. package/dist/outOfBandReporter.d.ts.map +0 -1
  147. package/dist/outOfBandReporter.js +0 -88
  148. package/dist/outOfBandReporter.js.map +0 -1
  149. package/src/__tests__/gateway/composedSdl.test.ts +0 -44
  150. package/src/__tests__/integration/legacyNetworkRequests.test.ts +0 -279
  151. package/src/__tests__/integration/legacyNockMocks.ts +0 -113
  152. package/src/__tests__/loadSupergraphSdlFromStorage.test.ts +0 -664
  153. package/src/legacyLoadServicesFromStorage.ts +0 -170
  154. package/src/outOfBandReporter.ts +0 -128
@@ -1 +0,0 @@
1
- {"version":3,"file":"loadSupergraphSdlFromStorage.js","sourceRoot":"","sources":["../src/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import { fetch, Response, Request } from 'apollo-server-env';
2
- export declare const OUT_OF_BAND_REPORTER_QUERY = "#graphql\n mutation OOBReport($input: APIMonitoringReport) {\n reportError(report: $input)\n }\n";
3
- export declare class OutOfBandReporter {
4
- static endpoint: string | null;
5
- submitOutOfBandReportIfConfigured({ error, request, response, startedAt, endedAt, tags, fetcher, }: {
6
- error: Error;
7
- request: Request;
8
- response?: Response;
9
- startedAt: Date;
10
- endedAt: Date;
11
- tags?: string[];
12
- fetcher: typeof fetch;
13
- }): Promise<void>;
14
- }
15
- //# sourceMappingURL=outOfBandReporter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outOfBandReporter.d.ts","sourceRoot":"","sources":["../src/outOfBandReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAS7D,eAAO,MAAM,0BAA0B,0GAItC,CAAC;AAgBF,qBAAa,iBAAiB;IAC5B,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAA4D;IAEpF,iCAAiC,CAAC,EACtC,KAAK,EACL,OAAO,EACP,QAAQ,EACR,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,GACR,EAAE;QACD,KAAK,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,SAAS,EAAE,IAAI,CAAC;QAChB,OAAO,EAAE,IAAI,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,KAAK,CAAC;KACvB;CA+EF"}
@@ -1,88 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OutOfBandReporter = exports.OUT_OF_BAND_REPORTER_QUERY = void 0;
4
- const graphqlTypes_1 = require("./__generated__/graphqlTypes");
5
- exports.OUT_OF_BAND_REPORTER_QUERY = `#graphql
6
- mutation OOBReport($input: APIMonitoringReport) {
7
- reportError(report: $input)
8
- }
9
- `;
10
- const { name, version } = require('../package.json');
11
- class OutOfBandReporter {
12
- async submitOutOfBandReportIfConfigured({ error, request, response, startedAt, endedAt, tags, fetcher, }) {
13
- var _a, _b;
14
- if (!OutOfBandReporter.endpoint) {
15
- return;
16
- }
17
- let errorCode;
18
- if (!response) {
19
- errorCode = graphqlTypes_1.ErrorCode.ConnectionFailed;
20
- }
21
- else {
22
- switch (response.status) {
23
- case 400:
24
- case 413:
25
- case 422:
26
- errorCode = graphqlTypes_1.ErrorCode.InvalidBody;
27
- break;
28
- case 408:
29
- case 504:
30
- errorCode = graphqlTypes_1.ErrorCode.Timeout;
31
- break;
32
- case 502:
33
- case 503:
34
- errorCode = graphqlTypes_1.ErrorCode.ConnectionFailed;
35
- break;
36
- default:
37
- errorCode = graphqlTypes_1.ErrorCode.Other;
38
- }
39
- }
40
- const responseBody = await (response === null || response === void 0 ? void 0 : response.text());
41
- const variables = {
42
- input: {
43
- error: {
44
- code: errorCode,
45
- message: error.message,
46
- },
47
- request: {
48
- url: request.url,
49
- body: await request.text(),
50
- },
51
- response: response
52
- ? {
53
- httpStatusCode: response.status,
54
- body: responseBody,
55
- }
56
- : null,
57
- startedAt: startedAt.toISOString(),
58
- endedAt: endedAt.toISOString(),
59
- tags: tags,
60
- },
61
- };
62
- try {
63
- const oobResponse = await fetcher(OutOfBandReporter.endpoint, {
64
- method: 'POST',
65
- body: JSON.stringify({
66
- query: exports.OUT_OF_BAND_REPORTER_QUERY,
67
- variables,
68
- }),
69
- headers: {
70
- 'apollographql-client-name': name,
71
- 'apollographql-client-version': version,
72
- 'user-agent': `${name}/${version}`,
73
- 'content-type': 'application/json',
74
- },
75
- });
76
- const parsedResponse = await oobResponse.json();
77
- if (!((_a = parsedResponse === null || parsedResponse === void 0 ? void 0 : parsedResponse.data) === null || _a === void 0 ? void 0 : _a.reportError)) {
78
- throw new Error(`Out-of-band error reporting failed: ${oobResponse.status} ${oobResponse.statusText}`);
79
- }
80
- }
81
- catch (e) {
82
- throw new Error(`Out-of-band error reporting failed: ${(_b = e.message) !== null && _b !== void 0 ? _b : e}`);
83
- }
84
- }
85
- }
86
- exports.OutOfBandReporter = OutOfBandReporter;
87
- OutOfBandReporter.endpoint = process.env.APOLLO_OUT_OF_BAND_REPORTER_ENDPOINT || null;
88
- //# sourceMappingURL=outOfBandReporter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"outOfBandReporter.js","sourceRoot":"","sources":["../src/outOfBandReporter.ts"],"names":[],"mappings":"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"}
@@ -1,44 +0,0 @@
1
- import { ApolloGateway } from '@apollo/gateway';
2
- import { ApolloServer } from 'apollo-server';
3
- import { fetch } from '../../__mocks__/apollo-server-env';
4
- import { getTestingSupergraphSdl } from '../execution-utils';
5
-
6
- async function getSupergraphSdlGatewayServer() {
7
- const server = new ApolloServer({
8
- gateway: new ApolloGateway({
9
- supergraphSdl: getTestingSupergraphSdl(),
10
- }),
11
- });
12
-
13
- await server.listen({ port: 0 });
14
- return server;
15
- }
16
-
17
- describe('Using supergraphSdl configuration', () => {
18
- it('successfully starts and serves requests to the proper services', async () => {
19
- const server = await getSupergraphSdlGatewayServer();
20
-
21
- fetch.mockJSONResponseOnce({
22
- data: { me: { username: '@jbaxleyiii' } },
23
- });
24
-
25
- const result = await server.executeOperation({
26
- query: '{ me { username } }',
27
- });
28
-
29
- expect(result.data).toMatchInlineSnapshot(`
30
- Object {
31
- "me": Object {
32
- "username": "@jbaxleyiii",
33
- },
34
- }
35
- `);
36
-
37
- const [url, request] = fetch.mock.calls[0];
38
- expect(url).toEqual('https://accounts.api.com');
39
- expect(request?.body).toEqual(
40
- JSON.stringify({ query: '{me{username}}', variables: {} }),
41
- );
42
- await server.stop();
43
- });
44
- });
@@ -1,279 +0,0 @@
1
- import nock from 'nock';
2
- import { fetch } from 'apollo-server-env';
3
- import { Logger } from 'apollo-server-types';
4
- import { ApolloGateway, GCS_RETRY_COUNT, getDefaultFetcher } from '../..';
5
- import {
6
- mockServiceHealthCheckSuccess,
7
- mockServiceHealthCheck,
8
- mockStorageSecretSuccess,
9
- mockStorageSecret,
10
- mockCompositionConfigLinkSuccess,
11
- mockCompositionConfigLink,
12
- mockCompositionConfigsSuccess,
13
- mockCompositionConfigs,
14
- mockImplementingServicesSuccess,
15
- mockImplementingServices,
16
- mockRawPartialSchemaSuccess,
17
- mockRawPartialSchema,
18
- apiKeyHash,
19
- graphId,
20
- } from './legacyNockMocks';
21
-
22
- export interface MockService {
23
- gcsDefinitionPath: string;
24
- partialSchemaPath: string;
25
- url: string;
26
- sdl: string;
27
- }
28
-
29
- const service: MockService = {
30
- gcsDefinitionPath: 'service-definition.json',
31
- partialSchemaPath: 'accounts-partial-schema.json',
32
- url: 'http://localhost:4001',
33
- sdl: `#graphql
34
- extend type Query {
35
- me: User
36
- everyone: [User]
37
- }
38
- "This is my User"
39
- type User @key(fields: "id") {
40
- id: ID!
41
- name: String
42
- username: String
43
- }
44
- `,
45
- };
46
-
47
- const updatedService: MockService = {
48
- gcsDefinitionPath: 'updated-service-definition.json',
49
- partialSchemaPath: 'updated-accounts-partial-schema.json',
50
- url: 'http://localhost:4002',
51
- sdl: `#graphql
52
- extend type Query {
53
- me: User
54
- everyone: [User]
55
- }
56
- "This is my updated User"
57
- type User @key(fields: "id") {
58
- id: ID!
59
- name: String
60
- username: String
61
- }
62
- `,
63
- };
64
-
65
- let fetcher: typeof fetch;
66
- let logger: Logger;
67
- let gateway: ApolloGateway | null = null;
68
-
69
- beforeEach(() => {
70
- if (!nock.isActive()) nock.activate();
71
-
72
- fetcher = getDefaultFetcher().defaults({
73
- retry: {
74
- retries: GCS_RETRY_COUNT,
75
- minTimeout: 0,
76
- maxTimeout: 0,
77
- },
78
- });
79
-
80
- const warn = jest.fn();
81
- const debug = jest.fn();
82
- const error = jest.fn();
83
- const info = jest.fn();
84
-
85
- logger = {
86
- warn,
87
- debug,
88
- error,
89
- info,
90
- };
91
- });
92
-
93
- afterEach(async () => {
94
- expect(nock.isDone()).toBeTruthy();
95
- nock.cleanAll();
96
- nock.restore();
97
- if (gateway) {
98
- await gateway.stop();
99
- gateway = null;
100
- }
101
- });
102
-
103
- it('Extracts service definitions from remote storage', async () => {
104
- mockStorageSecretSuccess();
105
- mockCompositionConfigLinkSuccess();
106
- mockCompositionConfigsSuccess([service]);
107
- mockImplementingServicesSuccess(service);
108
- mockRawPartialSchemaSuccess(service);
109
-
110
- gateway = new ApolloGateway({ logger, schemaConfigDeliveryEndpoint: null });
111
-
112
- await gateway.load({
113
- apollo: { keyHash: apiKeyHash, graphId, graphVariant: 'current' },
114
- });
115
- expect(gateway.schema!.getType('User')!.description).toBe('This is my User');
116
- });
117
-
118
- function failNTimes(n: number, fn: () => nock.Interceptor) {
119
- for (let i = 0; i < n; i++) {
120
- fn().reply(500);
121
- }
122
- }
123
-
124
- it(`Retries GCS (up to ${GCS_RETRY_COUNT} times) on failure for each request and succeeds`, async () => {
125
- failNTimes(GCS_RETRY_COUNT, mockStorageSecret);
126
- mockStorageSecretSuccess();
127
-
128
- failNTimes(GCS_RETRY_COUNT, mockCompositionConfigLink);
129
- mockCompositionConfigLinkSuccess();
130
-
131
- failNTimes(GCS_RETRY_COUNT, mockCompositionConfigs);
132
- mockCompositionConfigsSuccess([service]);
133
-
134
- failNTimes(GCS_RETRY_COUNT, () => mockImplementingServices(service));
135
- mockImplementingServicesSuccess(service);
136
-
137
- failNTimes(GCS_RETRY_COUNT, () => mockRawPartialSchema(service));
138
- mockRawPartialSchemaSuccess(service);
139
-
140
- gateway = new ApolloGateway({
141
- fetcher,
142
- logger,
143
- schemaConfigDeliveryEndpoint: null,
144
- });
145
-
146
- await gateway.load({
147
- apollo: { keyHash: apiKeyHash, graphId, graphVariant: 'current' },
148
- });
149
- expect(gateway.schema!.getType('User')!.description).toBe('This is my User');
150
- });
151
-
152
- describe('Managed mode', () => {
153
- it('Performs health checks to downstream services on load', async () => {
154
- mockStorageSecretSuccess();
155
- mockCompositionConfigLinkSuccess();
156
- mockCompositionConfigsSuccess([service]);
157
- mockImplementingServicesSuccess(service);
158
- mockRawPartialSchemaSuccess(service);
159
-
160
- mockServiceHealthCheckSuccess(service);
161
-
162
- gateway = new ApolloGateway({
163
- serviceHealthCheck: true,
164
- logger,
165
- schemaConfigDeliveryEndpoint: null,
166
- });
167
-
168
- await gateway.load({
169
- apollo: { keyHash: apiKeyHash, graphId, graphVariant: 'current' },
170
- });
171
- expect(gateway.schema!.getType('User')!.description).toBe(
172
- 'This is my User',
173
- );
174
- });
175
-
176
- it('Rejects on initial load when health check fails', async () => {
177
- mockStorageSecretSuccess();
178
- mockCompositionConfigLinkSuccess();
179
- mockCompositionConfigsSuccess([service]);
180
- mockImplementingServicesSuccess(service);
181
- mockRawPartialSchemaSuccess(service);
182
-
183
- mockServiceHealthCheck(service).reply(500);
184
-
185
- const gateway = new ApolloGateway({
186
- serviceHealthCheck: true,
187
- logger,
188
- schemaConfigDeliveryEndpoint: null,
189
- });
190
-
191
- await expect(
192
- gateway.load({
193
- apollo: { keyHash: apiKeyHash, graphId, graphVariant: 'current' },
194
- }),
195
- ).rejects.toThrowErrorMatchingInlineSnapshot(`
196
- "The gateway did not update its schema due to failed service health checks. The gateway will continue to operate with the previous schema and reattempt updates. The following error occurred during the health check:
197
- [accounts]: 500: Internal Server Error"
198
- `);
199
- });
200
-
201
- it('Preserves original schema when health check fails', async () => {
202
- mockStorageSecretSuccess();
203
- mockCompositionConfigLinkSuccess();
204
- mockCompositionConfigsSuccess([service]);
205
- mockImplementingServicesSuccess(service);
206
- mockRawPartialSchemaSuccess(service);
207
- mockServiceHealthCheckSuccess(service);
208
-
209
- // Update
210
- mockStorageSecretSuccess();
211
- mockCompositionConfigLinkSuccess();
212
- mockCompositionConfigsSuccess([updatedService]);
213
- mockImplementingServicesSuccess(updatedService);
214
- mockRawPartialSchemaSuccess(updatedService);
215
- mockServiceHealthCheck(updatedService).reply(500);
216
-
217
- let resolve: () => void;
218
- const schemaChangeBlocker = new Promise<void>((res) => (resolve = res));
219
-
220
- gateway = new ApolloGateway({
221
- serviceHealthCheck: true,
222
- logger,
223
- schemaConfigDeliveryEndpoint: null,
224
- });
225
- // @ts-ignore for testing purposes, a short pollInterval is ideal so we'll override here
226
- gateway.experimental_pollInterval = 100;
227
-
228
- // @ts-ignore for testing purposes, we'll call the original `updateSchema`
229
- // function from our mock. The first call should mimic original behavior,
230
- // but the second call needs to handle the PromiseRejection. Typically for tests
231
- // like these we would leverage the `gateway.onSchemaChange` callback to drive
232
- // the test, but in this case, that callback isn't triggered when the update
233
- // fails (as expected) so we get creative with the second mock as seen below.
234
- const original = gateway.updateSchema;
235
- const mockUpdateSchema = jest
236
- .fn()
237
- .mockImplementationOnce(async () => {
238
- await original.apply(gateway);
239
- })
240
- .mockImplementationOnce(async () => {
241
- // mock the first poll and handle the error which would otherwise be caught
242
- // and logged from within the `pollServices` class method
243
- try {
244
- await original.apply(gateway);
245
- } catch (e) {
246
- var err = e;
247
- }
248
-
249
- expect(err.message).toMatchInlineSnapshot(`
250
- "The gateway did not update its schema due to failed service health checks. The gateway will continue to operate with the previous schema and reattempt updates. The following error occurred during the health check:
251
- [accounts]: 500: Internal Server Error"
252
- `);
253
- // finally resolve the promise which drives this test
254
- resolve();
255
- });
256
-
257
- // @ts-ignore for testing purposes, replace the `updateSchema`
258
- // function on the gateway with our mock
259
- gateway.updateSchema = mockUpdateSchema;
260
-
261
- // load the gateway as usual
262
- await gateway.load({
263
- apollo: { keyHash: apiKeyHash, graphId, graphVariant: 'current' },
264
- });
265
-
266
- expect(gateway.schema!.getType('User')!.description).toBe(
267
- 'This is my User',
268
- );
269
-
270
- await schemaChangeBlocker;
271
-
272
- // At this point, the mock update should have been called but the schema
273
- // should not have updated to the new one.
274
- expect(mockUpdateSchema.mock.calls.length).toBe(2);
275
- expect(gateway.schema!.getType('User')!.description).toBe(
276
- 'This is my User',
277
- );
278
- });
279
- });
@@ -1,113 +0,0 @@
1
- import { HEALTH_CHECK_QUERY, SERVICE_DEFINITION_QUERY } from '@apollo/gateway';
2
- import nock from 'nock';
3
- import { MockService } from './legacyNetworkRequests.test';
4
-
5
- export const graphId = 'federated-service';
6
- export const apiKeyHash = 'dd55a79d467976346d229a7b12b673ce';
7
- const storageSecret = 'my-storage-secret';
8
- const accountsService = 'accounts';
9
-
10
- // Service mocks
11
- function mockSdlQuery({ url }: MockService) {
12
- return nock(url).post('/', {
13
- query: SERVICE_DEFINITION_QUERY,
14
- });
15
- }
16
-
17
- export function mockSdlQuerySuccess(service: MockService) {
18
- mockSdlQuery(service).reply(200, {
19
- data: { _service: { sdl: service.sdl } },
20
- });
21
- }
22
-
23
- export function mockServiceHealthCheck({ url }: MockService) {
24
- return nock(url).post('/', {
25
- query: HEALTH_CHECK_QUERY,
26
- });
27
- }
28
-
29
- export function mockServiceHealthCheckSuccess(service: MockService) {
30
- return mockServiceHealthCheck(service).reply(200, {
31
- data: { __typename: 'Query' },
32
- });
33
- }
34
-
35
- // GCS mocks
36
- function gcsNock(url: Parameters<typeof nock>[0]): nock.Scope {
37
- const { name, version } = require('../../../package.json');
38
- return nock(url, {
39
- reqheaders: {
40
- 'apollographql-client-name': name,
41
- 'apollographql-client-version': version,
42
- 'user-agent': `${name}/${version}`,
43
- 'content-type': 'application/json',
44
- },
45
- });
46
- }
47
-
48
- export function mockStorageSecret() {
49
- return gcsNock('https://storage-secrets.api.apollographql.com:443').get(
50
- `/${graphId}/storage-secret/${apiKeyHash}.json`,
51
- );
52
- }
53
-
54
- export function mockStorageSecretSuccess() {
55
- return gcsNock('https://storage-secrets.api.apollographql.com:443')
56
- .get(`/${graphId}/storage-secret/${apiKeyHash}.json`)
57
- .reply(200, `"${storageSecret}"`);
58
- }
59
-
60
- // get composition config link, using received storage secret
61
- export function mockCompositionConfigLink() {
62
- return gcsNock('https://federation.api.apollographql.com:443').get(
63
- `/${storageSecret}/current/v1/composition-config-link`,
64
- );
65
- }
66
-
67
- export function mockCompositionConfigLinkSuccess() {
68
- return mockCompositionConfigLink().reply(200, {
69
- configPath: `${storageSecret}/current/v1/composition-configs/composition-config-path.json`,
70
- });
71
- }
72
-
73
- // get composition configs, using received composition config link
74
- export function mockCompositionConfigs() {
75
- return gcsNock('https://federation.api.apollographql.com:443').get(
76
- `/${storageSecret}/current/v1/composition-configs/composition-config-path.json`,
77
- );
78
- }
79
-
80
- export function mockCompositionConfigsSuccess(services: MockService[]) {
81
- return mockCompositionConfigs().reply(200, {
82
- implementingServiceLocations: services.map((service) => ({
83
- name: accountsService,
84
- path: `${storageSecret}/current/v1/implementing-services/${accountsService}/${service.gcsDefinitionPath}`,
85
- })),
86
- });
87
- }
88
-
89
- // get implementing service reference, using received composition-config
90
- export function mockImplementingServices({ gcsDefinitionPath }: MockService) {
91
- return gcsNock('https://federation.api.apollographql.com:443').get(
92
- `/${storageSecret}/current/v1/implementing-services/${accountsService}/${gcsDefinitionPath}`,
93
- );
94
- }
95
-
96
- export function mockImplementingServicesSuccess(service: MockService) {
97
- return mockImplementingServices(service).reply(200, {
98
- name: accountsService,
99
- partialSchemaPath: `${storageSecret}/current/raw-partial-schemas/${service.partialSchemaPath}`,
100
- url: service.url,
101
- });
102
- }
103
-
104
- // get raw-partial-schema, using received composition-config
105
- export function mockRawPartialSchema({ partialSchemaPath }: MockService) {
106
- return gcsNock('https://federation.api.apollographql.com:443').get(
107
- `/${storageSecret}/current/raw-partial-schemas/${partialSchemaPath}`,
108
- );
109
- }
110
-
111
- export function mockRawPartialSchemaSuccess(service: MockService) {
112
- return mockRawPartialSchema(service).reply(200, service.sdl);
113
- }