@apollo/gateway 2.0.5 → 2.1.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 (51) hide show
  1. package/dist/config.d.ts.map +1 -1
  2. package/dist/config.js +2 -0
  3. package/dist/config.js.map +1 -1
  4. package/dist/index.d.ts +7 -8
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +21 -46
  7. package/dist/index.js.map +1 -1
  8. package/dist/logger.d.ts +3 -0
  9. package/dist/logger.d.ts.map +1 -0
  10. package/dist/logger.js +15 -0
  11. package/dist/logger.js.map +1 -0
  12. package/dist/supergraphManagers/UplinkSupergraphManager/index.d.ts +61 -0
  13. package/dist/supergraphManagers/UplinkSupergraphManager/index.d.ts.map +1 -0
  14. package/dist/supergraphManagers/UplinkSupergraphManager/index.js +213 -0
  15. package/dist/supergraphManagers/UplinkSupergraphManager/index.js.map +1 -0
  16. package/dist/supergraphManagers/{UplinkFetcher → UplinkSupergraphManager}/loadSupergraphSdlFromStorage.d.ts +7 -4
  17. package/dist/supergraphManagers/UplinkSupergraphManager/loadSupergraphSdlFromStorage.d.ts.map +1 -0
  18. package/dist/supergraphManagers/{UplinkFetcher → UplinkSupergraphManager}/loadSupergraphSdlFromStorage.js +5 -2
  19. package/dist/supergraphManagers/UplinkSupergraphManager/loadSupergraphSdlFromStorage.js.map +1 -0
  20. package/dist/supergraphManagers/{UplinkFetcher → UplinkSupergraphManager}/outOfBandReporter.d.ts +0 -0
  21. package/dist/supergraphManagers/UplinkSupergraphManager/outOfBandReporter.d.ts.map +1 -0
  22. package/dist/supergraphManagers/{UplinkFetcher → UplinkSupergraphManager}/outOfBandReporter.js +0 -0
  23. package/dist/supergraphManagers/UplinkSupergraphManager/outOfBandReporter.js.map +1 -0
  24. package/dist/supergraphManagers/index.d.ts +2 -2
  25. package/dist/supergraphManagers/index.d.ts.map +1 -1
  26. package/dist/supergraphManagers/index.js +17 -4
  27. package/dist/supergraphManagers/index.js.map +1 -1
  28. package/package.json +8 -8
  29. package/src/__tests__/integration/configuration.test.ts +0 -43
  30. package/src/__tests__/integration/managed.test.ts +289 -0
  31. package/src/__tests__/integration/networkRequests.test.ts +4 -31
  32. package/src/__tests__/integration/nockMocks.ts +7 -6
  33. package/src/config.ts +2 -0
  34. package/src/index.ts +26 -67
  35. package/src/logger.ts +11 -0
  36. package/src/supergraphManagers/UplinkSupergraphManager/__tests__/UplinkSupergraphManager.test.ts +67 -0
  37. package/src/supergraphManagers/{UplinkFetcher → UplinkSupergraphManager}/__tests__/loadSupergraphSdlFromStorage.test.ts +0 -0
  38. package/src/supergraphManagers/{UplinkFetcher → UplinkSupergraphManager}/__tests__/tsconfig.json +0 -0
  39. package/src/supergraphManagers/UplinkSupergraphManager/index.ts +306 -0
  40. package/src/supergraphManagers/{UplinkFetcher → UplinkSupergraphManager}/loadSupergraphSdlFromStorage.ts +11 -3
  41. package/src/supergraphManagers/{UplinkFetcher → UplinkSupergraphManager}/outOfBandReporter.ts +0 -0
  42. package/src/supergraphManagers/index.ts +2 -2
  43. package/dist/supergraphManagers/UplinkFetcher/index.d.ts +0 -35
  44. package/dist/supergraphManagers/UplinkFetcher/index.d.ts.map +0 -1
  45. package/dist/supergraphManagers/UplinkFetcher/index.js +0 -114
  46. package/dist/supergraphManagers/UplinkFetcher/index.js.map +0 -1
  47. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.d.ts.map +0 -1
  48. package/dist/supergraphManagers/UplinkFetcher/loadSupergraphSdlFromStorage.js.map +0 -1
  49. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.d.ts.map +0 -1
  50. package/dist/supergraphManagers/UplinkFetcher/outOfBandReporter.js.map +0 -1
  51. package/src/supergraphManagers/UplinkFetcher/index.ts +0 -149
@@ -1,149 +0,0 @@
1
- import type { Logger } from '@apollo/utils.logger';
2
- import resolvable from '@josephg/resolvable';
3
- import { SupergraphManager, SupergraphSdlHookOptions } from '../../config';
4
- import { SubgraphHealthCheckFunction, SupergraphSdlUpdateFunction } from '../..';
5
- import { loadSupergraphSdlFromUplinks } from './loadSupergraphSdlFromStorage';
6
- import { Fetcher } from '@apollo/utils.fetcher';
7
-
8
- export interface UplinkFetcherOptions {
9
- fallbackPollIntervalInMs: number;
10
- subgraphHealthCheck?: boolean;
11
- graphRef: string;
12
- apiKey: string;
13
- fetcher: Fetcher;
14
- maxRetries: number;
15
- uplinkEndpoints: string[];
16
- logger?: Logger;
17
- }
18
-
19
- type State =
20
- | { phase: 'initialized' }
21
- | { phase: 'polling'; pollingPromise?: Promise<void> }
22
- | { phase: 'stopped' };
23
-
24
- export class UplinkFetcher implements SupergraphManager {
25
- private config: UplinkFetcherOptions;
26
- private update?: SupergraphSdlUpdateFunction;
27
- private healthCheck?: SubgraphHealthCheckFunction;
28
- private timerRef: NodeJS.Timeout | null = null;
29
- private state: State;
30
- private errorReportingEndpoint: string | undefined =
31
- process.env.APOLLO_OUT_OF_BAND_REPORTER_ENDPOINT ?? undefined;
32
- private compositionId?: string;
33
- private fetchCount: number = 0;
34
- private minDelayMs: number | null = null;
35
- private earliestFetchTime: Date | null = null;
36
-
37
- constructor(options: UplinkFetcherOptions) {
38
- this.config = options;
39
- this.state = { phase: 'initialized' };
40
- }
41
-
42
- public async initialize({ update, healthCheck }: SupergraphSdlHookOptions) {
43
- this.update = update;
44
-
45
- if (this.config.subgraphHealthCheck) {
46
- this.healthCheck = healthCheck;
47
- }
48
-
49
- let initialSupergraphSdl: string | null = null;
50
- try {
51
- const result = await this.updateSupergraphSdl();
52
- initialSupergraphSdl = result?.supergraphSdl || null;
53
- if (result?.minDelaySeconds) {
54
- this.minDelayMs = 1000 * result?.minDelaySeconds;
55
- this.earliestFetchTime = new Date(Date.now() + this.minDelayMs);
56
- }
57
- } catch (e) {
58
- this.logUpdateFailure(e);
59
- throw e;
60
- }
61
-
62
- // Start polling after we resolve the first supergraph
63
- this.beginPolling();
64
-
65
- return {
66
- // on init, this supergraphSdl should never actually be `null`.
67
- // `this.updateSupergraphSdl()` will only return null if the schema hasn't
68
- // changed over the course of an _update_.
69
- supergraphSdl: initialSupergraphSdl!,
70
- cleanup: async () => {
71
- if (this.state.phase === 'polling') {
72
- await this.state.pollingPromise;
73
- }
74
- this.state = { phase: 'stopped' };
75
- if (this.timerRef) {
76
- clearTimeout(this.timerRef);
77
- this.timerRef = null;
78
- }
79
- },
80
- };
81
- }
82
-
83
- private async updateSupergraphSdl() {
84
- const result = await loadSupergraphSdlFromUplinks({
85
- graphRef: this.config.graphRef,
86
- apiKey: this.config.apiKey,
87
- endpoints: this.config.uplinkEndpoints,
88
- errorReportingEndpoint: this.errorReportingEndpoint,
89
- fetcher: this.config.fetcher,
90
- compositionId: this.compositionId ?? null,
91
- maxRetries: this.config.maxRetries,
92
- roundRobinSeed: this.fetchCount++,
93
- earliestFetchTime: this.earliestFetchTime,
94
- });
95
-
96
- if (!result) {
97
- return null;
98
- } else {
99
- this.compositionId = result.id;
100
- // the healthCheck fn is only assigned if it's enabled in the config
101
- await this.healthCheck?.(result.supergraphSdl);
102
- const { supergraphSdl, minDelaySeconds } = result;
103
- return { supergraphSdl, minDelaySeconds };
104
- }
105
- }
106
-
107
- private beginPolling() {
108
- this.state = { phase: 'polling' };
109
- this.poll();
110
- }
111
-
112
- private poll() {
113
- this.timerRef = setTimeout(
114
- async () => {
115
- if (this.state.phase === 'polling') {
116
- const pollingPromise = resolvable();
117
-
118
- this.state.pollingPromise = pollingPromise;
119
- try {
120
- const result = await this.updateSupergraphSdl();
121
- const maybeNewSupergraphSdl = result?.supergraphSdl || null;
122
- if (result?.minDelaySeconds) {
123
- this.minDelayMs = 1000 * result?.minDelaySeconds;
124
- this.earliestFetchTime = new Date(Date.now() + this.minDelayMs);
125
- }
126
- if (maybeNewSupergraphSdl) {
127
- this.update?.(maybeNewSupergraphSdl);
128
- }
129
- } catch (e) {
130
- this.logUpdateFailure(e);
131
- }
132
- pollingPromise.resolve();
133
- }
134
-
135
- this.poll();
136
- },
137
- this.minDelayMs
138
- ? Math.max(this.minDelayMs, this.config.fallbackPollIntervalInMs)
139
- : this.config.fallbackPollIntervalInMs,
140
- );
141
- }
142
-
143
- private logUpdateFailure(e: any) {
144
- this.config.logger?.error(
145
- 'UplinkFetcher failed to update supergraph with the following error: ' +
146
- (e.message ?? e),
147
- );
148
- }
149
- }