diff --git a/package.json b/package.json index 4ed14163e43d7ca222dc9d3e740c94f03280e1b5..f941f4c1861c814c137f484df9d3d46a07c45731 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,7 @@ "dependencies": { "@redocly/cli": "^1.6.0", "eclipsefdn-api-support": "^1.0.0", - "eclipsefdn-hugo-solstice-theme": "^0.0.176", - "p-retry": "^6.2.0" + "eclipsefdn-hugo-solstice-theme": "^0.0.176" }, "scripts": { "postinstall": "yarn build-specs", diff --git a/src/index.js b/src/index.js index b114df38eaf1aed7ab264c5343bcdd1af4463cc7..a96abc20cd69392a075c38d50558bea68e8c2c3e 100644 --- a/src/index.js +++ b/src/index.js @@ -16,7 +16,6 @@ import { exec as execProcess } from 'child_process'; import fs from 'fs'; import process from 'process'; import yaml from 'yaml'; -import pRetry from 'p-retry'; const exec = util.promisify(execProcess); // matches web URLs @@ -33,16 +32,27 @@ const artificialSpecData = { items: [] }; * @param {*} localPath the location where the downloaded spec should be saved */ async function pullExternalSpec(externalLocation, localPath) { - fs.writeFileSync( - localPath, - await fetch(externalLocation).then(response => { - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); - } + let retries = 0; + // retry 3 times before giving up + while (retries < 3) { + try { + fs.writeFileSync( + localPath, + await fetch(externalLocation).then(response => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`); + } - return response.text(); - }) - ); + return response.text(); + }) + ); + return; + } catch (e) { + console.log('Error while fetching external spec', e); + } + retries++; + } + throw new Error(`Cannot process ${externalLocation} after 3 retries.`); } /** @@ -64,10 +74,21 @@ function isExternalSpec(location) { async function processSpec(specDisplayName, specMachineName) { console.log(`Processing openapi spec for ${specDisplayName}...`); // Go to the location where the spec is, and continue processing - await exec( - `npx @redocly/cli build-docs --output="..${path.sep}content${path.sep}${specMachineName}${path.sep}index.html" "${specMachineName}${path.sep}openapi.yaml"` - ); - console.log(`Done processing ${specDisplayName}`); + let retries = 0; + // retry 3 times before giving up + while (retries < 3) { + try { + await exec( + `npx @redocly/cli build-docs --output="..${path.sep}content${path.sep}${specMachineName}${path.sep}index.html" "${specMachineName}${path.sep}openapi.yaml"` + ); + console.log(`Done processing ${specDisplayName}`); + return; + } catch (e) { + console.log('Error while processing spec', e); + } + retries++; + } + throw new Error(`Cannot process spec '${specDisplayName}' after 3 retries.`); } run(); @@ -101,19 +122,13 @@ async function run() { console.log(`Retrieving openapi spec for ${specDisplayName}...`); // prepare the spec, fetching remote specs or copying the spec for processing if (isExternalSpec(specLocation)) { - await pRetry(() => pullExternalSpec(specLocation, outputSpecLocation) - .catch(result => console.log(`Failed to fetch the resource at '${specLocation}`)), { - retries: 3, - onFailedAttempt: error => console.log(`Attempt ${error.attemptNumber} failed. There are ${error.retriesLeft} retries left.`), - minTimeout: 1000, - maxRetryTime: 10000 - }); + await pullExternalSpec(specLocation, outputSpecLocation); } else { fs.copyFileSync(potentialLocalSpecLocation, outputSpecLocation); console.log(`Copied local spec for ${specDisplayName} to output dir`); } // process the spec, setting the information about the spec into the output data var - await pRetry(async () => processSpec(specDisplayName, specMachineName).then(() => { + await processSpec(specDisplayName, specMachineName).then(() => { artificialSpecData['items'].push({ name: specMachineName, displayName: specDisplayName }); }).then(() => { console.log('Outputing generated spec data for site render'); @@ -121,11 +136,6 @@ async function run() { fs.mkdirSync('../data', { recursive: true }); // Dump the generated spec list to the data file for hugo build fs.writeFileSync('../data/specs.yaml', yaml.stringify(artificialSpecData)); - }).catch(result => console.log(`Failed to process spec ${specDisplayName}`)), { - retries: 3, - onFailedAttempt: error => console.log(`Attempt ${error.attemptNumber} failed. There are ${error.retriesLeft} retries left.`), - minTimeout: 1000, - maxRetryTime: 10000 }); }; } diff --git a/yarn.lock b/yarn.lock index b019e6dc2556ce43373977997ab03c28c4b7c866..fadab3350ebd3d534240a280dca22a05781495ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1479,11 +1479,6 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/retry@0.12.2": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" - integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== - "@types/send@*": version "0.17.4" resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" @@ -4010,11 +4005,6 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== -is-network-error@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.0.1.tgz#a68061a20387e9144e145571bea693056a370b92" - integrity sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ== - is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -5005,15 +4995,6 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" -p-retry@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.0.tgz#8d6df01af298750009691ce2f9b3ad2d5968f3bd" - integrity sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA== - dependencies: - "@types/retry" "0.12.2" - is-network-error "^1.0.0" - retry "^0.13.1" - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"