@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.
- package/CHANGELOG.md +21 -0
- package/dist/config.d.ts +42 -16
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +28 -18
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +35 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +205 -308
- package/dist/index.js.map +1 -1
- package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts +31 -0
- package/dist/supergraphManagers/IntrospectAndCompose/index.d.ts.map +1 -0
- package/dist/supergraphManagers/IntrospectAndCompose/index.js +112 -0
- package/dist/supergraphManagers/IntrospectAndCompose/index.js.map +1 -0
- package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts +12 -0
- package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.d.ts.map +1 -0
- package/dist/{loadServicesFromRemoteEndpoint.js → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js} +6 -6
- package/dist/supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.js.map +1 -0
- package/dist/supergraphManagers/LegacyFetcher/index.d.ts +33 -0
- package/dist/supergraphManagers/LegacyFetcher/index.d.ts.map +1 -0
- package/dist/supergraphManagers/LegacyFetcher/index.js +149 -0
- package/dist/supergraphManagers/LegacyFetcher/index.js.map +1 -0
- package/dist/supergraphManagers/LocalCompose/index.d.ts +19 -0
- package/dist/supergraphManagers/LocalCompose/index.d.ts.map +1 -0
- package/dist/supergraphManagers/LocalCompose/index.js +55 -0
- package/dist/supergraphManagers/LocalCompose/index.js.map +1 -0
- package/dist/supergraphManagers/UplinkFetcher/index.d.ts +32 -0
- package/dist/supergraphManagers/UplinkFetcher/index.d.ts.map +1 -0
- package/dist/supergraphManagers/UplinkFetcher/index.js +96 -0
- package/dist/supergraphManagers/UplinkFetcher/index.js.map +1 -0
- package/dist/{loadSupergraphSdlFromStorage.d.ts → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts} +1 -1
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts.map +1 -0
- package/dist/{loadSupergraphSdlFromStorage.js → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js} +1 -1
- package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js.map +1 -0
- package/dist/{outOfBandReporter.d.ts → supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts} +0 -0
- package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts.map +1 -0
- package/dist/{outOfBandReporter.js → supergraphManagers/UplinkFetcher/outOfBandReporter.js} +2 -2
- package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js.map +1 -0
- package/dist/supergraphManagers/index.d.ts +5 -0
- package/dist/supergraphManagers/index.d.ts.map +1 -0
- package/dist/supergraphManagers/index.js +12 -0
- package/dist/supergraphManagers/index.js.map +1 -0
- package/dist/utilities/createHash.d.ts +2 -0
- package/dist/utilities/createHash.d.ts.map +1 -0
- package/dist/utilities/createHash.js +15 -0
- package/dist/utilities/createHash.js.map +1 -0
- package/dist/utilities/isNodeLike.d.ts +3 -0
- package/dist/utilities/isNodeLike.d.ts.map +1 -0
- package/dist/utilities/isNodeLike.js +8 -0
- package/dist/utilities/isNodeLike.js.map +1 -0
- package/package.json +6 -4
- package/src/__tests__/execution-utils.ts +2 -2
- package/src/__tests__/gateway/buildService.test.ts +2 -2
- package/src/__tests__/gateway/lifecycle-hooks.test.ts +58 -99
- package/src/__tests__/gateway/opentelemetry.test.ts +8 -3
- package/src/__tests__/gateway/queryPlanCache.test.ts +25 -9
- package/src/__tests__/gateway/reporting.test.ts +4 -6
- package/src/__tests__/gateway/supergraphSdl.test.ts +390 -0
- package/src/__tests__/integration/aliases.test.ts +9 -3
- package/src/__tests__/integration/configuration.test.ts +109 -12
- package/src/__tests__/integration/logger.test.ts +1 -1
- package/src/__tests__/integration/networkRequests.test.ts +81 -118
- package/src/__tests__/integration/nockMocks.ts +15 -8
- package/src/config.ts +149 -40
- package/src/index.ts +314 -485
- package/src/supergraphManagers/IntrospectAndCompose/__tests__/IntrospectAndCompose.test.ts +370 -0
- package/src/{__tests__ → supergraphManagers/IntrospectAndCompose/__tests__}/loadServicesFromRemoteEndpoint.test.ts +5 -5
- package/src/supergraphManagers/IntrospectAndCompose/__tests__/tsconfig.json +8 -0
- package/src/supergraphManagers/IntrospectAndCompose/index.ts +163 -0
- package/src/{loadServicesFromRemoteEndpoint.ts → supergraphManagers/IntrospectAndCompose/loadServicesFromRemoteEndpoint.ts} +6 -6
- package/src/supergraphManagers/LegacyFetcher/index.ts +229 -0
- package/src/supergraphManagers/LocalCompose/index.ts +83 -0
- package/src/{__tests__ → supergraphManagers/UplinkFetcher/__tests__}/loadSupergraphSdlFromStorage.test.ts +4 -4
- package/src/supergraphManagers/UplinkFetcher/__tests__/tsconfig.json +8 -0
- package/src/supergraphManagers/UplinkFetcher/index.ts +128 -0
- package/src/{loadSupergraphSdlFromStorage.ts → supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.ts} +3 -3
- package/src/{outOfBandReporter.ts → supergraphManagers/UplinkFetcher/outOfBandReporter.ts} +2 -2
- package/src/supergraphManagers/index.ts +4 -0
- package/src/utilities/createHash.ts +10 -0
- package/src/utilities/isNodeLike.ts +11 -0
- package/dist/loadServicesFromRemoteEndpoint.d.ts +0 -13
- package/dist/loadServicesFromRemoteEndpoint.d.ts.map +0 -1
- package/dist/loadServicesFromRemoteEndpoint.js.map +0 -1
- package/dist/loadSupergraphSdlFromStorage.d.ts.map +0 -1
- package/dist/loadSupergraphSdlFromStorage.js.map +0 -1
- package/dist/outOfBandReporter.d.ts.map +0 -1
- package/dist/outOfBandReporter.js.map +0 -1
- 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 '
|
|
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('
|
|
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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"}
|
package/dist/{outOfBandReporter.d.ts → supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts}
RENAMED
|
File without changes
|
|
@@ -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("
|
|
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('
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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.
|
|
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.
|
|
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": "
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
137
|
-
|
|
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
|
-
|
|
108
|
+
experimental_didUpdateSupergraph: mockDidUpdate,
|
|
146
109
|
logger,
|
|
147
110
|
});
|
|
148
|
-
//
|
|
149
|
-
gateway
|
|
111
|
+
// for testing purposes, a short pollInterval is ideal so we'll override here
|
|
112
|
+
gateway['pollIntervalInMs'] = 100;
|
|
150
113
|
|
|
151
|
-
|
|
152
|
-
|
|
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.
|
|
117
|
+
gateway.onSchemaLoadOrUpdate(
|
|
157
118
|
jest
|
|
158
119
|
.fn()
|
|
159
|
-
.mockImplementationOnce(() =>
|
|
160
|
-
.mockImplementationOnce(() =>
|
|
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
|
-
|
|
176
|
-
expect(firstCall[0]
|
|
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]
|
|
181
|
-
|
|
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]!.
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
189
|
+
pollIntervalInMs: 100,
|
|
229
190
|
logger,
|
|
230
191
|
});
|
|
231
192
|
|
|
232
|
-
|
|
233
|
-
const
|
|
234
|
-
const schemaChangeCallback = jest.fn(() => resolve());
|
|
193
|
+
const schemaChangeBlocker = resolvable();
|
|
194
|
+
const schemaChangeCallback = jest.fn(() => schemaChangeBlocker.resolve());
|
|
235
195
|
|
|
236
|
-
gateway.
|
|
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 =
|
|
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
|
-
|
|
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
|
|
42
|
-
|
|
43
|
-
return new LocalGraphQLDataSource(buildSubgraphSchema([service]));
|
|
47
|
+
buildService(service) {
|
|
48
|
+
return localDataSources[service.name];
|
|
44
49
|
},
|
|
45
50
|
});
|
|
46
51
|
|