wgc
Version:
The official CLI tool to manage the GraphQL Federation Platform Cosmo
80 lines • 3.44 kB
JavaScript
import { create } from '@bufbuild/protobuf';
import { PublishFederatedSubgraphsResponseSchema, BatchPublishJobStatus, } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb';
import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb';
import { getBaseHeaders } from '../../../core/config.js';
const EXPECTED_STATUS_CODES = new Set([
EnumStatusCode.OK,
EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED,
EnumStatusCode.ERR_DEPLOYMENT_FAILED,
]);
export async function pollBatchPublishStatus(client, jobId, signal) {
var _a;
let attempt = 0;
const headers = getBaseHeaders();
while (!signal.aborted) {
const resp = await client.platform.getBatchPublishJobStatus({ jobId }, { headers, signal });
const respCode = (_a = resp.response) === null || _a === void 0 ? void 0 : _a.code;
if (respCode === undefined || !EXPECTED_STATUS_CODES.has(respCode)) {
return create(PublishFederatedSubgraphsResponseSchema, {
response: resp.response,
});
}
switch (resp.status) {
case BatchPublishJobStatus.PENDING:
case BatchPublishJobStatus.PROCESSING: {
await sleep(computeDelay(1000, 5000, attempt++, true), signal);
break;
}
case BatchPublishJobStatus.FAILED: {
return create(PublishFederatedSubgraphsResponseSchema, {
response: {
code: EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED,
details: resp.failureReason,
},
});
}
case BatchPublishJobStatus.COMPLETED: {
return create(PublishFederatedSubgraphsResponseSchema, {
response: { code: EnumStatusCode.OK },
compositionErrors: resp.compositionErrors,
deploymentErrors: resp.deploymentErrors,
compositionWarnings: resp.compositionWarnings,
counts: resp.counts,
updatedSubgraphNames: resp.updatedSubgraphNames,
});
}
}
}
/**
* The only reason we should realistically get here is due to `signal` being aborted; however, we still need
* to return a response object
*/
return create(PublishFederatedSubgraphsResponseSchema, {
response: {
code: EnumStatusCode.ERR,
details: signal.aborted ? 'Operation was cancelled by the user.' : undefined,
},
});
}
function computeDelay(base, max, attempt, jitter) {
const delay = Math.min(max, base * 2 ** attempt);
return jitter ? delay * (0.5 + Math.random() * 0.5) : delay;
}
function sleep(ms, signal) {
return new Promise((resolve) => {
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
resolve('aborted');
return;
}
const timer = setTimeout(() => {
signal === null || signal === void 0 ? void 0 : signal.removeEventListener('abort', onAbort);
resolve('ok');
}, ms);
function onAbort() {
clearTimeout(timer);
resolve('aborted');
}
signal === null || signal === void 0 ? void 0 : signal.addEventListener('abort', onAbort, { once: true });
});
}
//# sourceMappingURL=poll-batch-publish-status.js.map