diff --git a/package.json b/package.json index 086ad25..69fc6d5 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "prepare": "husky install" }, "dependencies": { + "async-retry": "1.3.3", "chalk": "5.3.0", "commander": "11.0.0", "gradient-string": "2.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a0b5f6a..6dd4366 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + async-retry: + specifier: 1.3.3 + version: 1.3.3 chalk: specifier: 5.3.0 version: 5.3.0 @@ -1000,6 +1003,12 @@ packages: engines: {node: '>=0.10.0'} dev: true + /async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + dependencies: + retry: 0.13.1 + dev: false + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -3220,6 +3229,11 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} diff --git a/src/helpers/fetch.ts b/src/helpers/fetch.ts index 4218198..38458ab 100644 --- a/src/helpers/fetch.ts +++ b/src/helpers/fetch.ts @@ -1,6 +1,7 @@ import { Readable } from 'stream'; import { pipeline } from 'stream/promises'; +import retry from 'async-retry'; import tar from 'tar'; async function fetchTarStream(url: string) { @@ -14,10 +15,21 @@ async function fetchTarStream(url: string) { } export async function downloadTemplate(root: string, url: string) { - await pipeline( - await fetchTarStream(url), - tar.x({ - cwd: root - }) + await retry( + async (bail) => { + try { + await pipeline( + await fetchTarStream(url), + tar.x({ + cwd: root + }) + ); + } catch (error) { + bail(new Error(`Failed to download ${url} Error: ${error}`)); + } + }, + { + retries: 3 + } ); }