@apollo/gateway 0.50.2 → 0.51.0

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 (47) hide show
  1. package/dist/config.d.ts +2 -2
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/datasources/RemoteGraphQLDataSource.d.ts +6 -5
  4. package/dist/datasources/RemoteGraphQLDataSource.d.ts.map +1 -1
  5. package/dist/datasources/RemoteGraphQLDataSource.js +16 -11
  6. package/dist/datasources/RemoteGraphQLDataSource.js.map +1 -1
  7. package/dist/executeQueryPlan.d.ts.map +1 -1
  8. package/dist/executeQueryPlan.js +2 -2
  9. package/dist/executeQueryPlan.js.map +1 -1
  10. package/dist/index.d.ts +0 -4
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -22
  13. package/dist/index.js.map +1 -1
  14. package/dist/supergraphManagers/UplinkFetcher/index.d.ts +2 -2
  15. package/dist/supergraphManagers/UplinkFetcher/index.d.ts.map +1 -1
  16. package/dist/supergraphManagers/UplinkFetcher/index.js.map +1 -1
  17. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts +3 -3
  18. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts.map +1 -1
  19. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js +14 -13
  20. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js.map +1 -1
  21. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts +6 -5
  22. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts.map +1 -1
  23. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js +3 -3
  24. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js.map +1 -1
  25. package/package.json +4 -4
  26. package/src/__tests__/gateway/buildService.test.ts +81 -83
  27. package/src/__tests__/gateway/executor.test.ts +18 -15
  28. package/src/__tests__/gateway/opentelemetry.test.ts +3 -7
  29. package/src/__tests__/gateway/supergraphSdl.test.ts +10 -12
  30. package/src/config.ts +2 -2
  31. package/src/datasources/RemoteGraphQLDataSource.ts +32 -16
  32. package/src/datasources/__tests__/RemoteGraphQLDataSource.test.ts +106 -140
  33. package/src/executeQueryPlan.ts +5 -1
  34. package/src/index.ts +3 -28
  35. package/src/supergraphManagers/IntrospectAndCompose/__tests__/IntrospectAndCompose.test.ts +0 -6
  36. package/src/supergraphManagers/UplinkFetcher/__tests__/loadSupergraphSdlFromStorage.test.ts +70 -74
  37. package/src/supergraphManagers/UplinkFetcher/index.ts +2 -2
  38. package/src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts +23 -17
  39. package/src/supergraphManagers/UplinkFetcher/outOfBandReporter.ts +9 -7
  40. package/dist/cache.d.ts +0 -18
  41. package/dist/cache.d.ts.map +0 -1
  42. package/dist/cache.js +0 -46
  43. package/dist/cache.js.map +0 -1
  44. package/src/__mocks__/apollo-server-env.ts +0 -56
  45. package/src/__mocks__/make-fetch-happen-fetcher.ts +0 -57
  46. package/src/cache.ts +0 -66
  47. package/src/make-fetch-happen.d.ts +0 -59
@@ -1 +1 @@
1
- {"version":3,"file":"loadSupergraphSdlFromStorage.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loadSupergraphSdlFromStorage.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
- import { fetch, Response, Request } from 'apollo-server-env';
1
+ import { Fetcher, FetcherResponse } from '@apollo/utils.fetcher';
2
2
  export declare const OUT_OF_BAND_REPORTER_QUERY = "#graphql\n mutation OOBReport($input: APIMonitoringReport) {\n reportError(report: $input)\n }\n";
3
- export declare function submitOutOfBandReportIfConfigured({ error, request, endpoint, response, startedAt, endedAt, tags, fetcher, }: {
3
+ export declare function submitOutOfBandReportIfConfigured({ error, requestEndpoint, requestBody, endpoint, response, startedAt, endedAt, tags, fetcher, }: {
4
4
  error: Error;
5
- request: Request;
5
+ requestEndpoint: string;
6
+ requestBody: string;
6
7
  endpoint: string | undefined;
7
- response?: Response;
8
+ response?: FetcherResponse;
8
9
  startedAt: Date;
9
10
  endedAt: Date;
10
11
  tags?: string[];
11
- fetcher: typeof fetch;
12
+ fetcher: Fetcher;
12
13
  }): Promise<void>;
13
14
  //# sourceMappingURL=outOfBandReporter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outOfBandReporter.d.ts","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/outOfBandReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAS7D,eAAO,MAAM,0BAA0B,0GAItC,CAAC;AAiBF,wBAAsB,iCAAiC,CAAC,EACtD,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,GACR,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,KAAK,CAAC;CACvB,iBA6EA"}
1
+ {"version":3,"file":"outOfBandReporter.d.ts","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/outOfBandReporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AASjE,eAAO,MAAM,0BAA0B,0GAItC,CAAC;AAiBF,wBAAsB,iCAAiC,CAAC,EACtD,KAAK,EACL,eAAe,EACf,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,GACR,EAAE;IACD,KAAK,EAAE,KAAK,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB,iBA6EA"}
@@ -8,7 +8,7 @@ exports.OUT_OF_BAND_REPORTER_QUERY = `#graphql
8
8
  }
9
9
  `;
10
10
  const { name, version } = require('../../../package.json');
11
- async function submitOutOfBandReportIfConfigured({ error, request, endpoint, response, startedAt, endedAt, tags, fetcher, }) {
11
+ async function submitOutOfBandReportIfConfigured({ error, requestEndpoint, requestBody, endpoint, response, startedAt, endedAt, tags, fetcher, }) {
12
12
  var _a, _b;
13
13
  if (!endpoint) {
14
14
  return;
@@ -44,8 +44,8 @@ async function submitOutOfBandReportIfConfigured({ error, request, endpoint, res
44
44
  message: error.message,
45
45
  },
46
46
  request: {
47
- url: request.url,
48
- body: await request.text(),
47
+ url: requestEndpoint,
48
+ body: requestBody,
49
49
  },
50
50
  response: response
51
51
  ? {
@@ -1 +1 @@
1
- {"version":3,"file":"outOfBandReporter.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/outOfBandReporter.ts"],"names":[],"mappings":";;;AAEA,mEAI0C;AAG7B,QAAA,0BAA0B,GAAgB;;;;CAItD,CAAC;AAEF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAepD,KAAK,UAAU,iCAAiC,CAAC,EACtD,KAAK,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,GAUR;;IAEC,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO;KACR;IAED,IAAI,SAAoB,CAAC;IACzB,IAAI,CAAC,QAAQ,EAAE;QACb,SAAS,GAAG,wBAAS,CAAC,gBAAgB,CAAC;KACxC;SAAM;QAEL,QAAQ,QAAQ,CAAC,MAAM,EAAE;YACvB,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC;YACT,KAAK,GAAG;gBACN,SAAS,GAAG,wBAAS,CAAC,WAAW,CAAC;gBAClC,MAAM;YACR,KAAK,GAAG,CAAC;YACT,KAAK,GAAG;gBACN,SAAS,GAAG,wBAAS,CAAC,OAAO,CAAC;gBAC9B,MAAM;YACR,KAAK,GAAG,CAAC;YACT,KAAK,GAAG;gBACN,SAAS,GAAG,wBAAS,CAAC,gBAAgB,CAAC;gBACvC,MAAM;YACR;gBACE,SAAS,GAAG,wBAAS,CAAC,KAAK,CAAC;SAC/B;KACF;IAED,MAAM,YAAY,GAAuB,MAAM,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE,CAAA,CAAC;IAEhE,MAAM,SAAS,GAA+B;QAC5C,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB;YACD,OAAO,EAAE;gBACP,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE;aAC3B;YACD,QAAQ,EAAE,QAAQ;gBAChB,CAAC,CAAC;oBACE,cAAc,EAAE,QAAQ,CAAC,MAAM;oBAC/B,IAAI,EAAE,YAAY;iBACnB;gBACH,CAAC,CAAC,IAAI;YACR,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;YAClC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;YAC9B,IAAI,EAAE,IAAI;SACX;KACF,CAAC;IAEF,IAAI;QACF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,kCAA0B;gBACjC,SAAS;aACV,CAAC;YACF,OAAO,EAAE;gBACP,2BAA2B,EAAE,IAAI;gBACjC,8BAA8B,EAAE,OAAO;gBACvC,YAAY,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE;gBAClC,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QACH,MAAM,cAAc,GAA4B,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QACzE,IAAI,CAAC,CAAA,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,0CAAE,WAAW,CAAA,EAAE;YACtC,MAAM,IAAI,KAAK,CACb,uCAAuC,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,CACtF,CAAC;SACH;KACF;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAA,CAAC,CAAC,OAAO,mCAAI,CAAC,EAAE,CAAC,CAAC;KAC1E;AACH,CAAC;AA/FD,8EA+FC"}
1
+ {"version":3,"file":"outOfBandReporter.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/outOfBandReporter.ts"],"names":[],"mappings":";;;AAEA,mEAI0C;AAG7B,QAAA,0BAA0B,GAAgB;;;;CAItD,CAAC;AAEF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAepD,KAAK,UAAU,iCAAiC,CAAC,EACtD,KAAK,EACL,eAAe,EACf,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,GAWR;;IAEC,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO;KACR;IAED,IAAI,SAAoB,CAAC;IACzB,IAAI,CAAC,QAAQ,EAAE;QACb,SAAS,GAAG,wBAAS,CAAC,gBAAgB,CAAC;KACxC;SAAM;QAEL,QAAQ,QAAQ,CAAC,MAAM,EAAE;YACvB,KAAK,GAAG,CAAC;YACT,KAAK,GAAG,CAAC;YACT,KAAK,GAAG;gBACN,SAAS,GAAG,wBAAS,CAAC,WAAW,CAAC;gBAClC,MAAM;YACR,KAAK,GAAG,CAAC;YACT,KAAK,GAAG;gBACN,SAAS,GAAG,wBAAS,CAAC,OAAO,CAAC;gBAC9B,MAAM;YACR,KAAK,GAAG,CAAC;YACT,KAAK,GAAG;gBACN,SAAS,GAAG,wBAAS,CAAC,gBAAgB,CAAC;gBACvC,MAAM;YACR;gBACE,SAAS,GAAG,wBAAS,CAAC,KAAK,CAAC;SAC/B;KACF;IAED,MAAM,YAAY,GAAuB,MAAM,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,EAAE,CAAA,CAAC;IAEhE,MAAM,SAAS,GAA+B;QAC5C,KAAK,EAAE;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB;YACD,OAAO,EAAE;gBACP,GAAG,EAAE,eAAe;gBACpB,IAAI,EAAE,WAAW;aAClB;YACD,QAAQ,EAAE,QAAQ;gBAChB,CAAC,CAAC;oBACE,cAAc,EAAE,QAAQ,CAAC,MAAM;oBAC/B,IAAI,EAAE,YAAY;iBACnB;gBACH,CAAC,CAAC,IAAI;YACR,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;YAClC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;YAC9B,IAAI,EAAE,IAAI;SACX;KACF,CAAC;IAEF,IAAI;QACF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE;YAC1C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,kCAA0B;gBACjC,SAAS;aACV,CAAC;YACF,OAAO,EAAE;gBACP,2BAA2B,EAAE,IAAI;gBACjC,8BAA8B,EAAE,OAAO;gBACvC,YAAY,EAAE,GAAG,IAAI,IAAI,OAAO,EAAE;gBAClC,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;QACH,MAAM,cAAc,GAA4B,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QACzE,IAAI,CAAC,CAAA,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,0CAAE,WAAW,CAAA,EAAE;YACtC,MAAM,IAAI,KAAK,CACb,uCAAuC,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,UAAU,EAAE,CACtF,CAAC;SACH;KACF;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAA,CAAC,CAAC,OAAO,mCAAI,CAAC,EAAE,CAAC,CAAC;KAC1E;AACH,CAAC;AAjGD,8EAiGC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apollo/gateway",
3
- "version": "0.50.2",
3
+ "version": "0.51.0",
4
4
  "description": "Apollo Gateway",
5
5
  "author": "Apollo <packages@apollographql.com>",
6
6
  "main": "dist/index.js",
@@ -29,6 +29,7 @@
29
29
  "@apollo/federation": "^0.36.2",
30
30
  "@apollo/query-planner": "^0.10.2",
31
31
  "@apollo/utils.createhash": "^1.0.0",
32
+ "@apollo/utils.fetcher": "^1.0.0",
32
33
  "@apollo/utils.logger": "^1.0.0",
33
34
  "@josephg/resolvable": "^1.0.1",
34
35
  "@opentelemetry/api": "^1.0.1",
@@ -36,16 +37,15 @@
36
37
  "apollo-reporting-protobuf": "^0.8.0 || ^3.0.0",
37
38
  "apollo-server-caching": "^0.7.0 || ^3.0.0",
38
39
  "apollo-server-core": "^2.23.0 || ^3.0.0",
39
- "apollo-server-env": "^3.0.0 || ^4.0.0",
40
40
  "apollo-server-errors": "^2.5.0 || ^3.0.0",
41
41
  "apollo-server-types": "^0.9.0 || ^3.0.0",
42
42
  "async-retry": "^1.3.3",
43
43
  "loglevel": "^1.6.1",
44
- "make-fetch-happen": "^8.0.0",
44
+ "make-fetch-happen": "^10.1.2",
45
45
  "pretty-format": "^27.4.6"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "graphql": "^15.8.0 || ^16.0.0"
49
49
  },
50
- "gitHead": "b812602d24dcc245e07f712c8e942a4078609d55"
50
+ "gitHead": "bf11c7dbd65049d1cb0d91b148f181b89e51e157"
51
51
  }
@@ -1,19 +1,30 @@
1
- import { fetch } from '../../__mocks__/make-fetch-happen-fetcher';
1
+ import nock from 'nock';
2
+
2
3
  import { ApolloServerBase as ApolloServer } from 'apollo-server-core';
3
4
 
4
5
  import { RemoteGraphQLDataSource } from '../../datasources/RemoteGraphQLDataSource';
5
6
  import { ApolloGateway, SERVICE_DEFINITION_QUERY } from '../../';
6
7
  import { fixtures } from 'apollo-federation-integration-testsuite';
7
8
  import { GraphQLDataSourceRequestKind } from '../../datasources/types';
9
+ import { nockAfterEach, nockBeforeEach } from '../nockAssertions';
8
10
 
9
- beforeEach(() => {
10
- fetch.mockReset();
11
- });
11
+ beforeEach(nockBeforeEach);
12
+ afterEach(nockAfterEach);
13
+
14
+ const replyHeaders = {
15
+ 'content-type': 'application/json',
16
+ };
12
17
 
13
18
  it('calls buildService only once per service', async () => {
14
- fetch.mockJSONResponseOnce({
15
- data: { _service: { sdl: `extend type Query { thing: String }` } },
16
- });
19
+ nock('https://api.example.com')
20
+ .post('/foo')
21
+ .reply(
22
+ 200,
23
+ {
24
+ data: { _service: { sdl: `extend type Query { thing: String }` } },
25
+ },
26
+ replyHeaders,
27
+ );
17
28
 
18
29
  const buildServiceSpy = jest.fn(() => {
19
30
  return new RemoteGraphQLDataSource({
@@ -23,7 +34,7 @@ it('calls buildService only once per service', async () => {
23
34
 
24
35
  const gateway = new ApolloGateway({
25
36
  serviceList: [{ name: 'foo', url: 'https://api.example.com/foo' }],
26
- buildService: buildServiceSpy
37
+ buildService: buildServiceSpy,
27
38
  });
28
39
 
29
40
  await gateway.load();
@@ -34,11 +45,13 @@ it('calls buildService only once per service', async () => {
34
45
  it('correctly passes the context from ApolloServer to datasources', async () => {
35
46
  const gateway = new ApolloGateway({
36
47
  localServiceList: fixtures,
37
- buildService: _service => {
48
+ buildService: (_service) => {
38
49
  return new RemoteGraphQLDataSource({
39
50
  url: 'https://api.example.com/foo',
40
51
  willSendRequest: (options) => {
41
- if (options.kind === GraphQLDataSourceRequestKind.INCOMING_OPERATION) {
52
+ if (
53
+ options.kind === GraphQLDataSourceRequestKind.INCOMING_OPERATION
54
+ ) {
42
55
  options.request.http?.headers.set(
43
56
  'x-user-id',
44
57
  options.context.userId,
@@ -67,7 +80,22 @@ it('correctly passes the context from ApolloServer to datasources', async () =>
67
80
  }
68
81
  `;
69
82
 
70
- fetch.mockJSONResponseOnce({ data: { me: { username: '@jbaxleyiii' } } });
83
+ nock('https://api.example.com', {
84
+ reqheaders: {
85
+ 'x-user-id': '1234',
86
+ },
87
+ })
88
+ .post('/foo', {
89
+ query: `{me{username}}`,
90
+ variables: {},
91
+ })
92
+ .reply(
93
+ 200,
94
+ {
95
+ data: { me: { username: '@jbaxleyiii' } },
96
+ },
97
+ replyHeaders,
98
+ );
71
99
 
72
100
  const result = await server.executeOperation({
73
101
  query,
@@ -77,33 +105,32 @@ it('correctly passes the context from ApolloServer to datasources', async () =>
77
105
  expect(result.data).toEqual({
78
106
  me: { username: '@jbaxleyiii' },
79
107
  });
80
-
81
- expect(fetch).toBeCalledTimes(1);
82
- expect(fetch).toHaveFetched('https://api.example.com/foo', {
83
- body: {
84
- query: `{me{username}}`,
85
- variables: {},
86
- },
87
- headers: {
88
- 'x-user-id': '1234',
89
- },
90
- });
91
108
  });
92
109
 
93
- function createSdlData(sdl: string): object {
94
- return {
95
- data: {
96
- _service: {
97
- sdl: sdl,
110
+ function createSdlData(sdl: string): [number, any, Record<string, string>] {
111
+ return [
112
+ 200,
113
+ {
114
+ data: {
115
+ _service: {
116
+ sdl: sdl,
117
+ },
98
118
  },
99
119
  },
100
- };
120
+ replyHeaders,
121
+ ];
101
122
  }
102
123
 
103
124
  it('makes enhanced introspection request using datasource', async () => {
104
- fetch.mockJSONResponseOnce(
105
- createSdlData('extend type Query { one: String }'),
106
- );
125
+ nock('https://api.example.com', {
126
+ reqheaders: {
127
+ 'custom-header': 'some-custom-value',
128
+ },
129
+ })
130
+ .post('/override', {
131
+ query: SERVICE_DEFINITION_QUERY,
132
+ })
133
+ .reply(...createSdlData('extend type Query { one: String }'));
107
134
 
108
135
  const gateway = new ApolloGateway({
109
136
  serviceList: [
@@ -112,7 +139,7 @@ it('makes enhanced introspection request using datasource', async () => {
112
139
  url: 'https://api.example.com/one',
113
140
  },
114
141
  ],
115
- buildService: _service => {
142
+ buildService: (_service) => {
116
143
  return new RemoteGraphQLDataSource({
117
144
  url: 'https://api.example.com/override',
118
145
  willSendRequest: ({ request }) => {
@@ -123,24 +150,20 @@ it('makes enhanced introspection request using datasource', async () => {
123
150
  });
124
151
 
125
152
  await gateway.load();
126
-
127
- expect(fetch).toBeCalledTimes(1);
128
-
129
- expect(fetch).toHaveFetched('https://api.example.com/override', {
130
- body: {
131
- query: SERVICE_DEFINITION_QUERY,
132
- },
133
- headers: {
134
- 'custom-header': 'some-custom-value',
135
- },
136
- });
137
153
  });
138
154
 
139
155
  it('customizes request on a per-service basis', async () => {
140
- fetch
141
- .mockJSONResponseOnce(createSdlData('extend type Query { one: String }'))
142
- .mockJSONResponseOnce(createSdlData('extend type Query { two: String }'))
143
- .mockJSONResponseOnce(createSdlData('extend type Query { three: String }'));
156
+ for (const subgraph of ['one', 'two', 'three']) {
157
+ nock('https://api.example.com', {
158
+ reqheaders: {
159
+ 'service-name': subgraph,
160
+ },
161
+ })
162
+ .post(`/${subgraph}`, {
163
+ query: SERVICE_DEFINITION_QUERY,
164
+ })
165
+ .reply(...createSdlData(`extend type Query { ${subgraph}: String }`));
166
+ }
144
167
 
145
168
  const gateway = new ApolloGateway({
146
169
  serviceList: [
@@ -157,7 +180,7 @@ it('customizes request on a per-service basis', async () => {
157
180
  url: 'https://api.example.com/three',
158
181
  },
159
182
  ],
160
- buildService: service => {
183
+ buildService: (service) => {
161
184
  return new RemoteGraphQLDataSource({
162
185
  url: service.url,
163
186
  willSendRequest: ({ request }) => {
@@ -168,35 +191,6 @@ it('customizes request on a per-service basis', async () => {
168
191
  });
169
192
 
170
193
  await gateway.load();
171
-
172
- expect(fetch).toBeCalledTimes(3);
173
-
174
- expect(fetch).toHaveFetched('https://api.example.com/one', {
175
- body: {
176
- query: `query __ApolloGetServiceDefinition__ { _service { sdl } }`,
177
- },
178
- headers: {
179
- 'service-name': 'one',
180
- },
181
- });
182
-
183
- expect(fetch).toHaveFetched('https://api.example.com/two', {
184
- body: {
185
- query: `query __ApolloGetServiceDefinition__ { _service { sdl } }`,
186
- },
187
- headers: {
188
- 'service-name': 'two',
189
- },
190
- });
191
-
192
- expect(fetch).toHaveFetched('https://api.example.com/three', {
193
- body: {
194
- query: `query __ApolloGetServiceDefinition__ { _service { sdl } }`,
195
- },
196
- headers: {
197
- 'service-name': 'three',
198
- },
199
- });
200
194
  });
201
195
 
202
196
  it('does not share service definition cache between gateways', async () => {
@@ -205,11 +199,17 @@ it('does not share service definition cache between gateways', async () => {
205
199
  updates += 1;
206
200
  };
207
201
 
202
+ function nockSDLFetchOnce() {
203
+ nock('https://api.example.com')
204
+ .post('/repeat', {
205
+ query: SERVICE_DEFINITION_QUERY,
206
+ })
207
+ .reply(...createSdlData('extend type Query { repeat: String }'));
208
+ }
209
+
208
210
  // Initialize first gateway
209
211
  {
210
- fetch.mockJSONResponseOnce(
211
- createSdlData('extend type Query { repeat: String }'),
212
- );
212
+ nockSDLFetchOnce();
213
213
 
214
214
  const gateway = new ApolloGateway({
215
215
  serviceList: [
@@ -226,9 +226,7 @@ it('does not share service definition cache between gateways', async () => {
226
226
 
227
227
  // Initialize second gateway
228
228
  {
229
- fetch.mockJSONResponseOnce(
230
- createSdlData('extend type Query { repeat: String }'),
231
- );
229
+ nockSDLFetchOnce();
232
230
 
233
231
  const gateway = new ApolloGateway({
234
232
  serviceList: [
@@ -1,19 +1,21 @@
1
- import { fetch } from '../../__mocks__/make-fetch-happen-fetcher';
1
+ import nock from 'nock';
2
2
  import gql from 'graphql-tag';
3
3
  import { ApolloGateway } from '../../';
4
- import { fixtures } from 'apollo-federation-integration-testsuite';
4
+ import { accounts, fixtures } from 'apollo-federation-integration-testsuite';
5
5
  import type { Logger } from '@apollo/utils.logger';
6
+ import { nockAfterEach, nockBeforeEach } from '../nockAssertions';
6
7
 
7
8
  let logger: {
8
- warn: jest.MockedFunction<Logger['warn']>,
9
- debug: jest.MockedFunction<Logger['debug']>,
10
- error: jest.MockedFunction<Logger['error']>,
11
- info: jest.MockedFunction<Logger['info']>,
12
- }
9
+ warn: jest.MockedFunction<Logger['warn']>;
10
+ debug: jest.MockedFunction<Logger['debug']>;
11
+ error: jest.MockedFunction<Logger['error']>;
12
+ info: jest.MockedFunction<Logger['info']>;
13
+ };
13
14
 
14
- beforeEach(() => {
15
- fetch.mockReset();
15
+ beforeEach(nockBeforeEach);
16
+ afterEach(nockAfterEach);
16
17
 
18
+ beforeEach(() => {
17
19
  logger = {
18
20
  warn: jest.fn(),
19
21
  debug: jest.fn(),
@@ -38,7 +40,7 @@ describe('ApolloGateway executor', () => {
38
40
  }
39
41
  `;
40
42
 
41
- // @ts-ignore
43
+ // @ts-ignore
42
44
  const { errors } = await executor({
43
45
  source,
44
46
  document: gql(source),
@@ -57,8 +59,10 @@ describe('ApolloGateway executor', () => {
57
59
  });
58
60
 
59
61
  it('should not crash if variables are not provided', async () => {
60
- const me = { birthDate: '1988-10-21'};
61
- fetch.mockJSONResponseOnce({ data: { me } });
62
+ const me = { birthDate: '1988-10-21' };
63
+
64
+ nock(accounts.url).post('/').reply(200, { data: { me } });
65
+
62
66
  const gateway = new ApolloGateway({
63
67
  localServiceList: fixtures,
64
68
  });
@@ -73,12 +77,11 @@ describe('ApolloGateway executor', () => {
73
77
  }
74
78
  `;
75
79
 
76
- // @ts-ignore
80
+ // @ts-ignore
77
81
  const { errors, data } = await executor({
78
82
  source,
79
83
  document: gql(source),
80
- request: {
81
- },
84
+ request: {},
82
85
  queryHash: 'hashed',
83
86
  context: null,
84
87
  cache: {} as any,
@@ -1,7 +1,6 @@
1
1
  import gql from 'graphql-tag';
2
2
  import {ApolloGateway, LocalGraphQLDataSource} from '../../';
3
3
  import {fixtures, spanSerializer} from 'apollo-federation-integration-testsuite';
4
- import {fetch} from '../../__mocks__/apollo-server-env';
5
4
  import {InMemorySpanExporter, SimpleSpanProcessor} from '@opentelemetry/tracing'
6
5
  import {NodeTracerProvider} from '@opentelemetry/node';
7
6
  import { buildSubgraphSchema } from '@apollo/subgraph';
@@ -14,7 +13,6 @@ tracerProvider.addSpanProcessor(new SimpleSpanProcessor(inMemorySpans));
14
13
  tracerProvider.register();
15
14
 
16
15
  beforeEach(() => {
17
- fetch.mockReset();
18
16
  inMemorySpans.reset();
19
17
  });
20
18
 
@@ -102,13 +100,11 @@ describe('opentelemetry', () => {
102
100
 
103
101
 
104
102
  it('receives spans on fetch failure', async () => {
105
-
106
- fetch.mockImplementationOnce(async () => {
107
- throw Error("Nooo");
108
- });
109
-
110
103
  const gateway = new ApolloGateway({
111
104
  localServiceList: fixtures,
105
+ fetcher: () => {
106
+ throw Error('Nooo');
107
+ },
112
108
  });
113
109
 
114
110
  const { executor } = await gateway.load();
@@ -4,23 +4,25 @@ import {
4
4
  SubgraphHealthCheckFunction,
5
5
  SupergraphSdlUpdateFunction,
6
6
  } from '@apollo/gateway';
7
- import { fixturesWithUpdate } from 'apollo-federation-integration-testsuite';
7
+ import { accounts, fixturesWithUpdate } from 'apollo-federation-integration-testsuite';
8
8
  import { createHash } from '@apollo/utils.createhash';
9
9
  import { ApolloServer } from 'apollo-server';
10
10
  import type { Logger } from '@apollo/utils.logger';
11
- import { fetch } from '../../__mocks__/make-fetch-happen-fetcher';
12
11
  import { getTestingSupergraphSdl } from '../execution-utils';
13
12
  import { mockAllServicesHealthCheckSuccess } from '../integration/nockMocks';
14
13
  import resolvable from '@josephg/resolvable';
15
14
  import { nockAfterEach, nockBeforeEach } from '../nockAssertions';
15
+ import nock from 'nock';
16
16
 
17
17
  async function getSupergraphSdlGatewayServer() {
18
18
  const server = new ApolloServer({
19
19
  gateway: new ApolloGateway({
20
20
  supergraphSdl: getTestingSupergraphSdl(),
21
21
  buildService({ url }) {
22
- return new RemoteGraphQLDataSource({ url, fetcher: fetch });
23
- }
22
+ return new RemoteGraphQLDataSource({
23
+ url,
24
+ });
25
+ },
24
26
  }),
25
27
  });
26
28
 
@@ -54,9 +56,10 @@ describe('Using supergraphSdl static configuration', () => {
54
56
  it('successfully starts and serves requests to the proper services', async () => {
55
57
  const server = await getSupergraphSdlGatewayServer();
56
58
 
57
- fetch.mockJSONResponseOnce({
58
- data: { me: { username: '@jbaxleyiii' } },
59
- });
59
+ nock(accounts.url)
60
+ .post('/', { query: '{me{username}}', variables: {} })
61
+ .reply(200, { data: { me: { username: '@jbaxleyiii' } } });
62
+
60
63
 
61
64
  const result = await server.executeOperation({
62
65
  query: '{ me { username } }',
@@ -70,11 +73,6 @@ describe('Using supergraphSdl static configuration', () => {
70
73
  }
71
74
  `);
72
75
 
73
- const [url, request] = fetch.mock.calls[0];
74
- expect(url).toEqual('https://accounts.api.com');
75
- expect(request?.body).toEqual(
76
- JSON.stringify({ query: '{me{username}}', variables: {} }),
77
- );
78
76
  await server.stop();
79
77
  });
80
78
  });
package/src/config.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import { GraphQLError, GraphQLSchema } from 'graphql';
2
2
  import { HeadersInit } from 'node-fetch';
3
- import { fetch } from 'apollo-server-env';
4
3
  import { GraphQLRequestContextExecutionDidStart } from 'apollo-server-types';
5
4
  import type { Logger } from '@apollo/utils.logger';
6
5
  import { ServiceDefinition } from '@apollo/federation';
@@ -8,6 +7,7 @@ import { GraphQLDataSource } from './datasources/types';
8
7
  import { QueryPlan } from '@apollo/query-planner';
9
8
  import { OperationContext } from './operationContext';
10
9
  import { ServiceMap } from './executeQueryPlan';
10
+ import { Fetcher } from '@apollo/utils.fetcher';
11
11
 
12
12
  export type ServiceEndpointDefinition = Pick<ServiceDefinition, 'name' | 'url'>;
13
13
 
@@ -126,7 +126,7 @@ interface GatewayConfigBase {
126
126
  experimental_didUpdateSupergraph?: Experimental_DidUpdateSupergraphCallback;
127
127
  experimental_approximateQueryPlanStoreMiB?: number;
128
128
  experimental_autoFragmentization?: boolean;
129
- fetcher?: typeof fetch;
129
+ fetcher?: Fetcher;
130
130
  serviceHealthCheck?: boolean;
131
131
  }
132
132
 
@@ -12,17 +12,19 @@ import {
12
12
  AuthenticationError,
13
13
  ForbiddenError,
14
14
  } from 'apollo-server-errors';
15
- import { fetch, Request, Headers, Response } from 'apollo-server-env';
16
15
  import { isObject } from '../utilities/predicates';
17
16
  import { GraphQLDataSource, GraphQLDataSourceProcessOptions, GraphQLDataSourceRequestKind } from './types';
18
17
  import { createHash } from '@apollo/utils.createhash';
19
18
  import { parseCacheControlHeader } from './parseCacheControlHeader';
20
19
  import fetcher from 'make-fetch-happen';
20
+ import { Headers as NodeFetchHeaders, Request as NodeFetchRequest } from 'node-fetch';
21
+ import { Fetcher, FetcherRequestInit, FetcherResponse } from '@apollo/utils.fetcher';
22
+
21
23
  export class RemoteGraphQLDataSource<
22
24
  TContext extends Record<string, any> = Record<string, any>,
23
25
  > implements GraphQLDataSource<TContext>
24
26
  {
25
- fetcher: typeof fetch;
27
+ fetcher: Fetcher;
26
28
 
27
29
  constructor(
28
30
  config?: Partial<RemoteGraphQLDataSource<TContext>> &
@@ -30,6 +32,11 @@ export class RemoteGraphQLDataSource<
30
32
  ThisType<RemoteGraphQLDataSource<TContext>>,
31
33
  ) {
32
34
  this.fetcher = fetcher.defaults({
35
+ // Allow an arbitrary number of sockets per subgraph. This is the default
36
+ // behavior of Node's http.Agent as well as the npm package agentkeepalive
37
+ // which wraps it, but is not the default behavior of make-fetch-happen
38
+ // which wraps agentkeepalive (that package sets this to 15 by default).
39
+ maxSockets: Infinity,
33
40
  // although this is the default, we want to take extra care and be very
34
41
  // explicity to ensure that mutations cannot be retried. please leave this
35
42
  // intact.
@@ -82,7 +89,12 @@ export class RemoteGraphQLDataSource<
82
89
  const context = originalContext as TContext;
83
90
 
84
91
  // Respect incoming http headers (eg, apollo-federation-include-trace).
85
- const headers = (request.http && request.http.headers) || new Headers();
92
+ const headers = new NodeFetchHeaders();
93
+ if (request.http?.headers) {
94
+ for (const [name, value] of request.http.headers) {
95
+ headers.append(name, value);
96
+ }
97
+ }
86
98
  headers.set('Content-Type', 'application/json');
87
99
 
88
100
  request.http = {
@@ -177,20 +189,24 @@ export class RemoteGraphQLDataSource<
177
189
  // we're accessing (e.g. url) and what we access it with (e.g. headers).
178
190
  const { http, ...requestWithoutHttp } = request;
179
191
  const stringifiedRequestWithoutHttp = JSON.stringify(requestWithoutHttp);
180
- const fetchRequest = new Request(http.url, {
181
- ...http,
192
+ const requestInit: FetcherRequestInit = {
193
+ method: http.method,
194
+ headers: Object.fromEntries(http.headers),
182
195
  body: stringifiedRequestWithoutHttp,
183
- });
196
+ };
197
+ // Note that we don't actually send this Request object to the fetcher; it
198
+ // is merely sent to methods on this object that might be overridden by users.
199
+ // We are careful to only send data to the overridable fetcher function that uses
200
+ // plain JS objects --- some fetch implementations don't know how to handle
201
+ // Request or Headers objects created by other fetch implementations.
202
+ const fetchRequest = new NodeFetchRequest(http.url, requestInit);
184
203
 
185
- let fetchResponse: Response | undefined;
204
+ let fetchResponse: FetcherResponse | undefined;
186
205
 
187
206
  try {
188
207
  // Use our local `fetcher` to allow for fetch injection
189
208
  // Use the fetcher's `Request` implementation for compatibility
190
- fetchResponse = await this.fetcher(http.url, {
191
- ...http,
192
- body: stringifiedRequestWithoutHttp,
193
- });
209
+ fetchResponse = await this.fetcher(http.url, requestInit);
194
210
 
195
211
  if (!fetchResponse.ok) {
196
212
  throw await this.errorFromResponse(fetchResponse);
@@ -266,16 +282,16 @@ export class RemoteGraphQLDataSource<
266
282
 
267
283
  public didEncounterError(
268
284
  error: Error,
269
- _fetchRequest: Request,
270
- _fetchResponse?: Response,
285
+ _fetchRequest: NodeFetchRequest,
286
+ _fetchResponse?: FetcherResponse,
271
287
  _context?: TContext,
272
288
  ) {
273
289
  throw error;
274
290
  }
275
291
 
276
292
  public parseBody(
277
- fetchResponse: Response,
278
- _fetchRequest?: Request,
293
+ fetchResponse: FetcherResponse,
294
+ _fetchRequest?: NodeFetchRequest,
279
295
  _context?: TContext,
280
296
  ): Promise<object | string> {
281
297
  const contentType = fetchResponse.headers.get('Content-Type');
@@ -286,7 +302,7 @@ export class RemoteGraphQLDataSource<
286
302
  }
287
303
  }
288
304
 
289
- public async errorFromResponse(response: Response) {
305
+ public async errorFromResponse(response: FetcherResponse) {
290
306
  const message = `${response.status}: ${response.statusText}`;
291
307
 
292
308
  let error: ApolloError;