UNPKG

wgc

Version:

The official CLI tool to manage the GraphQL Federation Platform Cosmo

80 lines 3.44 kB
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