@apollo/gateway 0.45.1 → 0.46.0-alpha.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 (87) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/config.d.ts +42 -16
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +28 -18
  5. package/dist/config.js.map +1 -1
  6. package/dist/index.d.ts +35 -23
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +205 -308
  9. package/dist/index.js.map +1 -1
  10. package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts +31 -0
  11. package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts.map +1 -0
  12. package/dist/supergraphManagers/IntrospectAndCompose/index.js +112 -0
  13. package/dist/supergraphManagers/IntrospectAndCompose/index.js.map +1 -0
  14. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts +12 -0
  15. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts.map +1 -0
  16. package/dist/{loadServicesFromRemoteEndpoint.js → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js} +6 -6
  17. package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js.map +1 -0
  18. package/dist/supergraphManagers/LegacyFetcher/index.d.ts +33 -0
  19. package/dist/supergraphManagers/LegacyFetcher/index.d.ts.map +1 -0
  20. package/dist/supergraphManagers/LegacyFetcher/index.js +149 -0
  21. package/dist/supergraphManagers/LegacyFetcher/index.js.map +1 -0
  22. package/dist/supergraphManagers/LocalCompose/index.d.ts +19 -0
  23. package/dist/supergraphManagers/LocalCompose/index.d.ts.map +1 -0
  24. package/dist/supergraphManagers/LocalCompose/index.js +55 -0
  25. package/dist/supergraphManagers/LocalCompose/index.js.map +1 -0
  26. package/dist/supergraphManagers/UplinkFetcher/index.d.ts +32 -0
  27. package/dist/supergraphManagers/UplinkFetcher/index.d.ts.map +1 -0
  28. package/dist/supergraphManagers/UplinkFetcher/index.js +96 -0
  29. package/dist/supergraphManagers/UplinkFetcher/index.js.map +1 -0
  30. package/dist/{loadSupergraphSdlFromStorage.d.ts → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts} +1 -1
  31. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts.map +1 -0
  32. package/dist/{loadSupergraphSdlFromStorage.js → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js} +1 -1
  33. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js.map +1 -0
  34. package/dist/{outOfBandReporter.d.ts → supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts} +0 -0
  35. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts.map +1 -0
  36. package/dist/{outOfBandReporter.js → supergraphManagers/UplinkFetcher/outOfBandReporter.js} +2 -2
  37. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js.map +1 -0
  38. package/dist/supergraphManagers/index.d.ts +5 -0
  39. package/dist/supergraphManagers/index.d.ts.map +1 -0
  40. package/dist/supergraphManagers/index.js +12 -0
  41. package/dist/supergraphManagers/index.js.map +1 -0
  42. package/dist/utilities/createHash.d.ts +2 -0
  43. package/dist/utilities/createHash.d.ts.map +1 -0
  44. package/dist/utilities/createHash.js +15 -0
  45. package/dist/utilities/createHash.js.map +1 -0
  46. package/dist/utilities/isNodeLike.d.ts +3 -0
  47. package/dist/utilities/isNodeLike.d.ts.map +1 -0
  48. package/dist/utilities/isNodeLike.js +8 -0
  49. package/dist/utilities/isNodeLike.js.map +1 -0
  50. package/package.json +6 -4
  51. package/src/__tests__/execution-utils.ts +2 -2
  52. package/src/__tests__/gateway/buildService.test.ts +2 -2
  53. package/src/__tests__/gateway/lifecycle-hooks.test.ts +58 -99
  54. package/src/__tests__/gateway/opentelemetry.test.ts +8 -3
  55. package/src/__tests__/gateway/queryPlanCache.test.ts +25 -9
  56. package/src/__tests__/gateway/reporting.test.ts +4 -6
  57. package/src/__tests__/gateway/supergraphSdl.test.ts +390 -0
  58. package/src/__tests__/integration/aliases.test.ts +9 -3
  59. package/src/__tests__/integration/configuration.test.ts +109 -12
  60. package/src/__tests__/integration/logger.test.ts +1 -1
  61. package/src/__tests__/integration/networkRequests.test.ts +81 -118
  62. package/src/__tests__/integration/nockMocks.ts +15 -8
  63. package/src/config.ts +149 -40
  64. package/src/index.ts +314 -485
  65. package/src/supergraphManagers/IntrospectAndCompose/__tests__/IntrospectAndCompose.test.ts +370 -0
  66. package/src/{__tests__ → supergraphManagers/IntrospectAndCompose/__tests__}/loadServicesFromRemoteEndpoint.test.ts +5 -5
  67. package/src/supergraphManagers/IntrospectAndCompose/__tests__/tsconfig.json +8 -0
  68. package/src/supergraphManagers/IntrospectAndCompose/index.ts +163 -0
  69. package/src/{loadServicesFromRemoteEndpoint.ts → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.ts} +6 -6
  70. package/src/supergraphManagers/LegacyFetcher/index.ts +229 -0
  71. package/src/supergraphManagers/LocalCompose/index.ts +83 -0
  72. package/src/{__tests__ → supergraphManagers/UplinkFetcher/__tests__}/loadSupergraphSdlFromStorage.test.ts +4 -4
  73. package/src/supergraphManagers/UplinkFetcher/__tests__/tsconfig.json +8 -0
  74. package/src/supergraphManagers/UplinkFetcher/index.ts +128 -0
  75. package/src/{loadSupergraphSdlFromStorage.ts → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts} +3 -3
  76. package/src/{outOfBandReporter.ts → supergraphManagers/UplinkFetcher/outOfBandReporter.ts} +2 -2
  77. package/src/supergraphManagers/index.ts +4 -0
  78. package/src/utilities/createHash.ts +10 -0
  79. package/src/utilities/isNodeLike.ts +11 -0
  80. package/dist/loadServicesFromRemoteEndpoint.d.ts +0 -13
  81. package/dist/loadServicesFromRemoteEndpoint.d.ts.map +0 -1
  82. package/dist/loadServicesFromRemoteEndpoint.js.map +0 -1
  83. package/dist/loadSupergraphSdlFromStorage.d.ts.map +0 -1
  84. package/dist/loadSupergraphSdlFromStorage.js.map +0 -1
  85. package/dist/outOfBandReporter.d.ts.map +0 -1
  86. package/dist/outOfBandReporter.js.map +0 -1
  87. package/src/__tests__/gateway/composedSdl.test.ts +0 -44
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAI3E,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,KAAK,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAOD,qBAAa,aAAc,YAAW,iBAAiB;IACrD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAC,CAA8B;IAC7C,OAAO,CAAC,WAAW,CAAC,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,sBAAsB,CACkC;IAChE,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,OAAO,EAAE,oBAAoB;IAK5B,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,wBAAwB;;;;YAoC3D,mBAAmB;IAqBjC,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,IAAI;IAqBZ,OAAO,CAAC,gBAAgB;CAMzB"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.UplinkFetcher = void 0;
7
+ const resolvable_1 = __importDefault(require("@josephg/resolvable"));
8
+ const loadSupergraphSdlFromStorage_1 = require("./loadSupergraphSdlFromStorage");
9
+ class UplinkFetcher {
10
+ constructor(options) {
11
+ var _a;
12
+ this.timerRef = null;
13
+ this.errorReportingEndpoint = (_a = process.env.APOLLO_OUT_OF_BAND_REPORTER_ENDPOINT) !== null && _a !== void 0 ? _a : undefined;
14
+ this.config = options;
15
+ this.state = { phase: 'initialized' };
16
+ }
17
+ async initialize({ update, healthCheck }) {
18
+ this.update = update;
19
+ if (this.config.subgraphHealthCheck) {
20
+ this.healthCheck = healthCheck;
21
+ }
22
+ let initialSupergraphSdl = null;
23
+ try {
24
+ initialSupergraphSdl = await this.updateSupergraphSdl();
25
+ }
26
+ catch (e) {
27
+ this.logUpdateFailure(e);
28
+ throw e;
29
+ }
30
+ this.beginPolling();
31
+ return {
32
+ supergraphSdl: initialSupergraphSdl,
33
+ cleanup: async () => {
34
+ if (this.state.phase === 'polling') {
35
+ await this.state.pollingPromise;
36
+ }
37
+ this.state = { phase: 'stopped' };
38
+ if (this.timerRef) {
39
+ clearTimeout(this.timerRef);
40
+ this.timerRef = null;
41
+ }
42
+ },
43
+ };
44
+ }
45
+ async updateSupergraphSdl() {
46
+ var _a, _b;
47
+ const result = await (0, loadSupergraphSdlFromStorage_1.loadSupergraphSdlFromUplinks)({
48
+ graphRef: this.config.graphRef,
49
+ apiKey: this.config.apiKey,
50
+ endpoints: this.config.uplinkEndpoints,
51
+ errorReportingEndpoint: this.errorReportingEndpoint,
52
+ fetcher: this.config.fetcher,
53
+ compositionId: (_a = this.compositionId) !== null && _a !== void 0 ? _a : null,
54
+ maxRetries: this.config.maxRetries,
55
+ });
56
+ if (!result) {
57
+ return null;
58
+ }
59
+ else {
60
+ this.compositionId = result.id;
61
+ await ((_b = this.healthCheck) === null || _b === void 0 ? void 0 : _b.call(this, result.supergraphSdl));
62
+ return result.supergraphSdl;
63
+ }
64
+ }
65
+ beginPolling() {
66
+ this.state = { phase: 'polling' };
67
+ this.poll();
68
+ }
69
+ poll() {
70
+ this.timerRef = setTimeout(async () => {
71
+ var _a;
72
+ if (this.state.phase === 'polling') {
73
+ const pollingPromise = (0, resolvable_1.default)();
74
+ this.state.pollingPromise = pollingPromise;
75
+ try {
76
+ const maybeNewSupergraphSdl = await this.updateSupergraphSdl();
77
+ if (maybeNewSupergraphSdl) {
78
+ (_a = this.update) === null || _a === void 0 ? void 0 : _a.call(this, maybeNewSupergraphSdl);
79
+ }
80
+ }
81
+ catch (e) {
82
+ this.logUpdateFailure(e);
83
+ }
84
+ pollingPromise.resolve();
85
+ }
86
+ this.poll();
87
+ }, this.config.pollIntervalInMs);
88
+ }
89
+ logUpdateFailure(e) {
90
+ var _a, _b;
91
+ (_a = this.config.logger) === null || _a === void 0 ? void 0 : _a.error('UplinkFetcher failed to update supergraph with the following error: ' +
92
+ ((_b = e.message) !== null && _b !== void 0 ? _b : e));
93
+ }
94
+ }
95
+ exports.UplinkFetcher = UplinkFetcher;
96
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { fetch } from 'apollo-server-env';
2
- import { SupergraphSdlUpdate } from './config';
2
+ import { SupergraphSdlUpdate } from '../../config';
3
3
  export declare const SUPERGRAPH_SDL_QUERY = "#graphql\n query SupergraphSdl($apiKey: String!, $ref: String!, $ifAfterId: ID) {\n routerConfig(ref: $ref, apiKey: $apiKey, ifAfterId: $ifAfterId) {\n __typename\n ... on RouterConfigResult {\n id\n supergraphSdl: supergraphSDL\n }\n ... on FetchError {\n code\n message\n }\n }\n }\n";
4
4
  export declare function loadSupergraphSdlFromUplinks({ graphRef, apiKey, endpoints, errorReportingEndpoint, fetcher, compositionId, maxRetries, }: {
5
5
  graphRef: string;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadSupergraphSdlFromStorage.d.ts","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAKnD,eAAO,MAAM,oBAAoB,+VAchC,CAAC;AAsBF,wBAAsB,4BAA4B,CAAC,EACjD,QAAQ,EACR,MAAM,EACN,SAAS,EACT,sBAAsB,EACtB,OAAO,EACP,aAAa,EACb,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,OAAO,KAAK,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAA;CACnB,GAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAsBvC;AAED,wBAAsB,4BAA4B,CAAC,EACjD,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,sBAAsB,EACtB,OAAO,EACP,aAAa,GACd,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,EAAE,OAAO,KAAK,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,GAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAwFvC"}
@@ -18,7 +18,7 @@ exports.SUPERGRAPH_SDL_QUERY = `#graphql
18
18
  }
19
19
  }
20
20
  `;
21
- const { name, version } = require('../package.json');
21
+ const { name, version } = require('../../../package.json');
22
22
  const fetchErrorMsg = "An error occurred while fetching your schema from Apollo: ";
23
23
  let fetchCounter = 0;
24
24
  async function loadSupergraphSdlFromUplinks({ graphRef, apiKey, endpoints, errorReportingEndpoint, fetcher, compositionId, maxRetries, }) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadSupergraphSdlFromStorage.js","sourceRoot":"","sources":["../../../src/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +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,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.submitOutOfBandReportIfConfigured = exports.OUT_OF_BAND_REPORTER_QUERY = void 0;
4
- const graphqlTypes_1 = require("./__generated__/graphqlTypes");
4
+ const graphqlTypes_1 = require("../../__generated__/graphqlTypes");
5
5
  exports.OUT_OF_BAND_REPORTER_QUERY = `#graphql
6
6
  mutation OOBReport($input: APIMonitoringReport) {
7
7
  reportError(report: $input)
8
8
  }
9
9
  `;
10
- const { name, version } = require('../package.json');
10
+ const { name, version } = require('../../../package.json');
11
11
  async function submitOutOfBandReportIfConfigured({ error, request, endpoint, response, startedAt, endedAt, tags, fetcher, }) {
12
12
  var _a, _b;
13
13
  if (!endpoint) {
@@ -0,0 +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"}
@@ -0,0 +1,5 @@
1
+ export { LocalCompose } from './LocalCompose';
2
+ export { LegacyFetcher } from './LegacyFetcher';
3
+ export { IntrospectAndCompose } from './IntrospectAndCompose';
4
+ export { UplinkFetcher } from './UplinkFetcher';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/supergraphManagers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UplinkFetcher = exports.IntrospectAndCompose = exports.LegacyFetcher = exports.LocalCompose = void 0;
4
+ var LocalCompose_1 = require("./LocalCompose");
5
+ Object.defineProperty(exports, "LocalCompose", { enumerable: true, get: function () { return LocalCompose_1.LocalCompose; } });
6
+ var LegacyFetcher_1 = require("./LegacyFetcher");
7
+ Object.defineProperty(exports, "LegacyFetcher", { enumerable: true, get: function () { return LegacyFetcher_1.LegacyFetcher; } });
8
+ var IntrospectAndCompose_1 = require("./IntrospectAndCompose");
9
+ Object.defineProperty(exports, "IntrospectAndCompose", { enumerable: true, get: function () { return IntrospectAndCompose_1.IntrospectAndCompose; } });
10
+ var UplinkFetcher_1 = require("./UplinkFetcher");
11
+ Object.defineProperty(exports, "UplinkFetcher", { enumerable: true, get: function () { return UplinkFetcher_1.UplinkFetcher; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supergraphManagers/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,+DAA8D;AAArD,4HAAA,oBAAoB,OAAA;AAC7B,iDAAgD;AAAvC,8GAAA,aAAa,OAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function createHash(kind: string): import('crypto').Hash;
2
+ //# sourceMappingURL=createHash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHash.d.ts","sourceRoot":"","sources":["../../src/utilities/createHash.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAE,IAAI,EAAE,MAAM,GAAG,OAAO,QAAQ,EAAE,IAAI,CAO/D"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createHash = void 0;
7
+ const isNodeLike_1 = __importDefault(require("./isNodeLike"));
8
+ function createHash(kind) {
9
+ if (isNodeLike_1.default) {
10
+ return module.require('crypto').createHash(kind);
11
+ }
12
+ return require('sha.js')(kind);
13
+ }
14
+ exports.createHash = createHash;
15
+ //# sourceMappingURL=createHash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHash.js","sourceRoot":"","sources":["../../src/utilities/createHash.ts"],"names":[],"mappings":";;;;;;AAAA,8DAAsC;AAEtC,SAAgB,UAAU,CAAE,IAAY;IACtC,IAAI,oBAAU,EAAE;QAGd,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;KAClD;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAPD,gCAOC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: boolean;
2
+ export default _default;
3
+ //# sourceMappingURL=isNodeLike.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isNodeLike.d.ts","sourceRoot":"","sources":["../../src/utilities/isNodeLike.ts"],"names":[],"mappings":";AAAA,wBAU4C"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = typeof process === 'object' &&
4
+ process &&
5
+ process.release &&
6
+ process.versions &&
7
+ typeof process.versions.node === 'string';
8
+ //# sourceMappingURL=isNodeLike.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isNodeLike.js","sourceRoot":"","sources":["../../src/utilities/isNodeLike.ts"],"names":[],"mappings":";;AAAA,kBAAe,OAAO,OAAO,KAAK,QAAQ;IACxC,OAAO;IAKP,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAGhB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apollo/gateway",
3
- "version": "0.45.1",
3
+ "version": "0.46.0-alpha.0",
4
4
  "description": "Apollo Gateway",
5
5
  "author": "Apollo <packages@apollographql.com>",
6
6
  "main": "dist/index.js",
@@ -27,7 +27,8 @@
27
27
  "dependencies": {
28
28
  "@apollo/core-schema": "^0.2.0",
29
29
  "@apollo/federation": "^0.33.8",
30
- "@apollo/query-planner": "^0.6.3",
30
+ "@apollo/query-planner": "^0.6.4-alpha.0",
31
+ "@josephg/resolvable": "^1.0.1",
31
32
  "@opentelemetry/api": "^1.0.1",
32
33
  "@types/node-fetch": "2.5.12",
33
34
  "apollo-graphql": "^0.9.5",
@@ -39,10 +40,11 @@
39
40
  "apollo-server-types": "^0.9.0 || ^3.0.0 || ^3.5.0-alpha.0",
40
41
  "loglevel": "^1.6.1",
41
42
  "make-fetch-happen": "^8.0.0",
42
- "pretty-format": "^27.3.1"
43
+ "pretty-format": "^27.3.1",
44
+ "sha.js": "^2.4.11"
43
45
  },
44
46
  "peerDependencies": {
45
47
  "graphql": "^15.7.2"
46
48
  },
47
- "gitHead": "9839faec4505baba5c1ee72bd8981fdeb92a8b3a"
49
+ "gitHead": "880b65fb904f39193a978998ae24ec07e026db16"
48
50
  }
@@ -117,8 +117,8 @@ export function getTestingSupergraphSdl(services: typeof fixtures = fixtures) {
117
117
  );
118
118
  }
119
119
 
120
- export function wait(ms: number) {
121
- return new Promise(r => setTimeout(r, ms));
120
+ export function wait(ms: number, toResolveTo?: any) {
121
+ return new Promise((r) => setTimeout(() => r(toResolveTo), ms));
122
122
  }
123
123
 
124
124
  export function printPlan(queryPlan: QueryPlan): string {
@@ -218,7 +218,7 @@ it('does not share service definition cache between gateways', async () => {
218
218
  url: 'https://api.example.com/repeat',
219
219
  },
220
220
  ],
221
- experimental_didUpdateComposition: updateObserver,
221
+ experimental_didUpdateSupergraph: updateObserver,
222
222
  });
223
223
 
224
224
  await gateway.load();
@@ -237,7 +237,7 @@ it('does not share service definition cache between gateways', async () => {
237
237
  url: 'https://api.example.com/repeat',
238
238
  },
239
239
  ],
240
- experimental_didUpdateComposition: updateObserver,
240
+ experimental_didUpdateSupergraph: updateObserver,
241
241
  });
242
242
 
243
243
  await gateway.load();
@@ -1,8 +1,10 @@
1
1
  import gql from 'graphql-tag';
2
2
  import { ApolloGateway } from '../..';
3
3
  import {
4
+ DynamicGatewayConfig,
4
5
  Experimental_DidResolveQueryPlanCallback,
5
6
  Experimental_UpdateServiceDefinitions,
7
+ ServiceDefinitionUpdate,
6
8
  } from '../../config';
7
9
  import {
8
10
  product,
@@ -11,8 +13,11 @@ import {
11
13
  accounts,
12
14
  books,
13
15
  documents,
16
+ fixtures,
17
+ fixturesWithUpdate,
14
18
  } from 'apollo-federation-integration-testsuite';
15
19
  import { Logger } from 'apollo-server-types';
20
+ import resolvable from '@josephg/resolvable';
16
21
 
17
22
  // The order of this was specified to preserve existing test coverage. Typically
18
23
  // we would just import and use the `fixtures` array.
@@ -47,16 +52,14 @@ beforeEach(() => {
47
52
 
48
53
  describe('lifecycle hooks', () => {
49
54
  it('uses updateServiceDefinitions override', async () => {
50
- const experimental_updateServiceDefinitions: Experimental_UpdateServiceDefinitions = jest.fn(
51
- async () => {
55
+ const experimental_updateServiceDefinitions: Experimental_UpdateServiceDefinitions =
56
+ jest.fn(async () => {
52
57
  return { serviceDefinitions, isNewSchema: true };
53
- },
54
- );
58
+ });
55
59
 
56
60
  const gateway = new ApolloGateway({
57
61
  serviceList: serviceDefinitions,
58
62
  experimental_updateServiceDefinitions,
59
- experimental_didUpdateComposition: jest.fn(),
60
63
  logger,
61
64
  });
62
65
 
@@ -67,39 +70,7 @@ describe('lifecycle hooks', () => {
67
70
  await gateway.stop();
68
71
  });
69
72
 
70
- it('calls experimental_didFailComposition with a bad config', async () => {
71
- const experimental_didFailComposition = jest.fn();
72
-
73
- const gateway = new ApolloGateway({
74
- async experimental_updateServiceDefinitions() {
75
- return {
76
- serviceDefinitions: [serviceDefinitions[0]],
77
- compositionMetadata: {
78
- formatVersion: 1,
79
- id: 'abc',
80
- implementingServiceLocations: [],
81
- schemaHash: 'abc',
82
- },
83
- isNewSchema: true,
84
- };
85
- },
86
- serviceList: [],
87
- experimental_didFailComposition,
88
- logger,
89
- });
90
-
91
- await expect(gateway.load()).rejects.toThrowError();
92
-
93
- const callbackArgs = experimental_didFailComposition.mock.calls[0][0];
94
- expect(callbackArgs.serviceList).toHaveLength(1);
95
- expect(callbackArgs.errors[0]).toMatchInlineSnapshot(
96
- `[GraphQLError: [product] Book -> \`Book\` is an extension type, but \`Book\` is not defined in any service]`,
97
- );
98
- expect(callbackArgs.compositionMetadata.id).toEqual('abc');
99
- expect(experimental_didFailComposition).toBeCalled();
100
- });
101
-
102
- it('calls experimental_didUpdateComposition on schema update', async () => {
73
+ it('calls experimental_didUpdateSupergraph on schema update', async () => {
103
74
  const compositionMetadata = {
104
75
  formatVersion: 1,
105
76
  id: 'abc',
@@ -107,81 +78,73 @@ describe('lifecycle hooks', () => {
107
78
  schemaHash: 'hash1',
108
79
  };
109
80
 
110
- const update: Experimental_UpdateServiceDefinitions = async () => ({
111
- serviceDefinitions,
112
- isNewSchema: true,
113
- compositionMetadata: {
114
- ...compositionMetadata,
115
- id: '123',
116
- schemaHash: 'hash2',
117
- },
118
- });
119
-
120
- // This is the simplest way I could find to achieve mocked functions that leverage our types
121
- const mockUpdate = jest.fn(update);
122
-
123
- // We want to return a different composition across two ticks, so we mock it
124
- // slightly differenty
125
- mockUpdate.mockImplementationOnce(async () => {
126
- const services = serviceDefinitions.filter(s => s.name !== 'books');
127
- return {
128
- serviceDefinitions: [
129
- ...services,
130
- {
131
- name: 'book',
132
- typeDefs: books.typeDefs,
133
- url: 'http://localhost:32542',
81
+ const mockUpdate = jest
82
+ .fn<Promise<ServiceDefinitionUpdate>, [config: DynamicGatewayConfig]>()
83
+ .mockImplementationOnce(async () => {
84
+ return {
85
+ serviceDefinitions: fixtures,
86
+ isNewSchema: true,
87
+ compositionMetadata: {
88
+ ...compositionMetadata,
89
+ id: '123',
90
+ schemaHash: 'hash2',
134
91
  },
135
- ],
136
- isNewSchema: true,
137
- compositionMetadata,
138
- };
139
- });
92
+ };
93
+ })
94
+ // We want to return a different composition across two ticks, so we mock it
95
+ // slightly differently
96
+ .mockImplementationOnce(async () => {
97
+ return {
98
+ serviceDefinitions: fixturesWithUpdate,
99
+ isNewSchema: true,
100
+ compositionMetadata,
101
+ };
102
+ });
140
103
 
141
104
  const mockDidUpdate = jest.fn();
142
105
 
143
106
  const gateway = new ApolloGateway({
144
107
  experimental_updateServiceDefinitions: mockUpdate,
145
- experimental_didUpdateComposition: mockDidUpdate,
108
+ experimental_didUpdateSupergraph: mockDidUpdate,
146
109
  logger,
147
110
  });
148
- // @ts-ignore for testing purposes, a short pollInterval is ideal so we'll override here
149
- gateway.experimental_pollInterval = 100;
111
+ // for testing purposes, a short pollInterval is ideal so we'll override here
112
+ gateway['pollIntervalInMs'] = 100;
150
113
 
151
- let resolve1: Function;
152
- let resolve2: Function;
153
- const schemaChangeBlocker1 = new Promise(res => (resolve1 = res));
154
- const schemaChangeBlocker2 = new Promise(res => (resolve2 = res));
114
+ const schemaChangeBlocker1 = resolvable();
115
+ const schemaChangeBlocker2 = resolvable();
155
116
 
156
- gateway.onSchemaChange(
117
+ gateway.onSchemaLoadOrUpdate(
157
118
  jest
158
119
  .fn()
159
- .mockImplementationOnce(() => resolve1())
160
- .mockImplementationOnce(() => resolve2()),
120
+ .mockImplementationOnce(() => schemaChangeBlocker1.resolve())
121
+ .mockImplementationOnce(() => schemaChangeBlocker2.resolve()),
161
122
  );
162
123
 
163
124
  await gateway.load();
164
125
 
165
126
  await schemaChangeBlocker1;
127
+
166
128
  expect(mockUpdate).toBeCalledTimes(1);
167
129
  expect(mockDidUpdate).toBeCalledTimes(1);
168
130
 
169
131
  await schemaChangeBlocker2;
132
+
170
133
  expect(mockUpdate).toBeCalledTimes(2);
171
134
  expect(mockDidUpdate).toBeCalledTimes(2);
172
135
 
173
136
  const [firstCall, secondCall] = mockDidUpdate.mock.calls;
174
137
 
175
- expect(firstCall[0]!.schema).toBeDefined();
176
- expect(firstCall[0].compositionMetadata!.schemaHash).toEqual('hash1');
138
+ const expectedFirstId = '562c22b3382b56b1651944a96e89a361fe847b9b32660eae5ecbd12adc20bf8b'
139
+ expect(firstCall[0]!.compositionId).toEqual(expectedFirstId);
177
140
  // first call should have no second "previous" argument
178
141
  expect(firstCall[1]).toBeUndefined();
179
142
 
180
- expect(secondCall[0].schema).toBeDefined();
181
- expect(secondCall[0].compositionMetadata!.schemaHash).toEqual('hash2');
143
+ expect(secondCall[0]!.compositionId).toEqual(
144
+ '0ced02894592ade4376276d11735b46723eb84850c32765cb78502ba5c29a563',
145
+ );
182
146
  // second call should have previous info in the second arg
183
- expect(secondCall[1]!.schema).toBeDefined();
184
- expect(secondCall[1]!.compositionMetadata!.schemaHash).toEqual('hash1');
147
+ expect(secondCall[1]!.compositionId).toEqual(expectedFirstId);
185
148
 
186
149
  await gateway.stop();
187
150
  });
@@ -206,34 +169,31 @@ describe('lifecycle hooks', () => {
206
169
  it('warns when polling on the default fetcher', async () => {
207
170
  new ApolloGateway({
208
171
  serviceList: serviceDefinitions,
209
- experimental_pollInterval: 10,
172
+ pollIntervalInMs: 10,
210
173
  logger,
211
174
  });
212
- expect(logger.warn).toHaveBeenCalledTimes(1);
213
175
  expect(logger.warn).toHaveBeenCalledWith(
214
176
  'Polling running services is dangerous and not recommended in production. Polling should only be used against a registry. If you are polling running services, use with caution.',
215
177
  );
216
178
  });
217
179
 
218
180
  it('registers schema change callbacks when experimental_pollInterval is set for unmanaged configs', async () => {
219
- const experimental_updateServiceDefinitions: Experimental_UpdateServiceDefinitions = jest.fn(
220
- async (_config) => {
181
+ const experimental_updateServiceDefinitions: Experimental_UpdateServiceDefinitions =
182
+ jest.fn(async (_config) => {
221
183
  return { serviceDefinitions, isNewSchema: true };
222
- },
223
- );
184
+ });
224
185
 
225
186
  const gateway = new ApolloGateway({
226
187
  serviceList: [{ name: 'book', url: 'http://localhost:32542' }],
227
188
  experimental_updateServiceDefinitions,
228
- experimental_pollInterval: 100,
189
+ pollIntervalInMs: 100,
229
190
  logger,
230
191
  });
231
192
 
232
- let resolve: Function;
233
- const schemaChangeBlocker = new Promise(res => (resolve = res));
234
- const schemaChangeCallback = jest.fn(() => resolve());
193
+ const schemaChangeBlocker = resolvable();
194
+ const schemaChangeCallback = jest.fn(() => schemaChangeBlocker.resolve());
235
195
 
236
- gateway.onSchemaChange(schemaChangeCallback);
196
+ gateway.onSchemaLoadOrUpdate(schemaChangeCallback);
237
197
  await gateway.load();
238
198
 
239
199
  await schemaChangeBlocker;
@@ -243,12 +203,11 @@ describe('lifecycle hooks', () => {
243
203
  });
244
204
 
245
205
  it('calls experimental_didResolveQueryPlan when executor is called', async () => {
246
- const experimental_didResolveQueryPlan: Experimental_DidResolveQueryPlanCallback = jest.fn()
206
+ const experimental_didResolveQueryPlan: Experimental_DidResolveQueryPlanCallback =
207
+ jest.fn();
247
208
 
248
209
  const gateway = new ApolloGateway({
249
- localServiceList: [
250
- books
251
- ],
210
+ localServiceList: [books],
252
211
  experimental_didResolveQueryPlan,
253
212
  });
254
213
 
@@ -258,7 +217,7 @@ describe('lifecycle hooks', () => {
258
217
  { book(isbn: "0262510871") { year } }
259
218
  `;
260
219
 
261
- // @ts-ignore
220
+ // @ts-ignore
262
221
  await executor({
263
222
  source,
264
223
  document: gql(source),
@@ -36,11 +36,16 @@ describe('opentelemetry', () => {
36
36
  describe('with local data', () =>
37
37
  {
38
38
  async function gateway() {
39
+ const localDataSources = Object.fromEntries(
40
+ fixtures.map((f) => [
41
+ f.name,
42
+ new LocalGraphQLDataSource(buildSubgraphSchema(f)),
43
+ ]),
44
+ );
39
45
  const gateway = new ApolloGateway({
40
46
  localServiceList: fixtures,
41
- buildService: service => {
42
- // @ts-ignore
43
- return new LocalGraphQLDataSource(buildSubgraphSchema([service]));
47
+ buildService(service) {
48
+ return localDataSources[service.name];
44
49
  },
45
50
  });
46
51