diff --git a/package-lock.json b/package-lock.json index 3cec97b3df..445f174429 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24341,7 +24341,8 @@ }, "node_modules/retry": { "version": "0.13.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "engines": { "node": ">= 4" } @@ -29071,6 +29072,7 @@ "omit.js": "^2.0.2", "p-locate": "^6.0.0", "path-type": "^5.0.0", + "retry": "^0.13.1", "tomlify-j0.4": "^3.0.0", "validate-npm-package-name": "^4.0.0", "yargs": "^17.6.0" diff --git a/packages/config/package.json b/packages/config/package.json index 179a40ce30..ca86c67b4b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -59,6 +59,8 @@ "license": "MIT", "dependencies": { "@iarna/toml": "^2.2.5", + "@netlify/headers-parser": "^8.0.0", + "@netlify/redirect-parser": "^14.5.0", "chalk": "^5.0.0", "cron-parser": "^4.1.0", "deepmerge": "^4.2.2", @@ -73,12 +75,11 @@ "js-yaml": "^4.0.0", "map-obj": "^5.0.0", "netlify": "^13.3.3", - "@netlify/headers-parser": "^8.0.0", - "@netlify/redirect-parser": "^14.5.0", "node-fetch": "^3.3.1", "omit.js": "^2.0.2", "p-locate": "^6.0.0", "path-type": "^5.0.0", + "retry": "^0.13.1", "tomlify-j0.4": "^3.0.0", "validate-npm-package-name": "^4.0.0", "yargs": "^17.6.0" diff --git a/packages/config/src/api/site_info.ts b/packages/config/src/api/site_info.ts index ec9586999b..80fbae6d72 100644 --- a/packages/config/src/api/site_info.ts +++ b/packages/config/src/api/site_info.ts @@ -7,6 +7,7 @@ import { throwUserError } from '../error.js' import { ERROR_CALL_TO_ACTION } from '../log/messages.js' import { IntegrationResponse } from '../types/api.js' import { ModeOption, TestOptions } from '../types/options.js' +import retry from 'retry' type GetSiteInfoOpts = { siteId: string @@ -149,15 +150,28 @@ const getIntegrations = async function ({ } } - const response = await fetch(url, requestOptions) - if (!response.ok) { - throw new Error(`Unexpected status code ${response.status} from fetching extensions`) - } - const bodyText = await response.text() + const MAX_RETRY = 3 + + const retryOperation = retry.operation({ + retries: MAX_RETRY, + minTimeout: 1 * 500, + maxTimeout: 5 * 1000, + }) + + let bodyText + + retryOperation.attempt(async () => { + const response = await fetch(url, requestOptions) + if (!response.ok) { + throw new Error(`Unexpected status code ${response.status} from fetching extensions`) + } + + bodyText = await response.text() + }) + if (bodyText === '') { return [] } - const integrations = await JSON.parse(bodyText) return Array.isArray(integrations) ? integrations : [] } catch (error) {