From e80a7338df1bad049e342b3ac9bb664e7a7ccdf5 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 2 Feb 2024 12:43:28 +0100 Subject: [PATCH] create-app: fix fetchYarnLockSeedTask timeout + add test Signed-off-by: Patrik Oldsberg --- packages/create-app/package.json | 1 + packages/create-app/src/lib/tasks.test.ts | 15 +++++++++++++++ packages/create-app/src/lib/tasks.ts | 5 ++++- yarn.lock | 1 + 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/create-app/package.json b/packages/create-app/package.json index e566281f6f..1485fa8474 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -39,6 +39,7 @@ "fs-extra": "10.1.0", "handlebars": "^4.7.3", "inquirer": "^8.2.0", + "node-fetch": "^2.6.7", "ora": "^5.3.0", "recursive-readdir": "^2.2.2" }, diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index f0546cfa5f..b1f5e17ba0 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -471,5 +471,20 @@ describe('tasks', () => { expect(mockDir.content()).toEqual({}); }); + + it('should time out if it takes too long to fetch', async () => { + worker.use( + rest.get( + 'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock', + (_, res, ctx) => res(ctx.delay(5000)), + ), + ); + + mockDir.clear(); + + await expect(fetchYarnLockSeedTask(mockDir.path)).resolves.toBe(false); + + expect(mockDir.content()).toEqual({}); + }); }); }); diff --git a/packages/create-app/src/lib/tasks.ts b/packages/create-app/src/lib/tasks.ts index 745dd7312c..d366bd5cc7 100644 --- a/packages/create-app/src/lib/tasks.ts +++ b/packages/create-app/src/lib/tasks.ts @@ -25,6 +25,7 @@ import { resolve as resolvePath, relative as relativePath, } from 'path'; +import fetch from 'node-fetch'; import { exec as execCb } from 'child_process'; import { packageVersions } from './versions'; import { promisify } from 'util'; @@ -317,13 +318,15 @@ export async function fetchYarnLockSeedTask(dir: string) { try { await Task.forItem('fetching', 'yarn.lock seed', async () => { const controller = new AbortController(); - setTimeout(() => controller.abort(), 5000); + const timeout = setTimeout(() => controller.abort(), 3000); const res = await fetch( 'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock', { signal: controller.signal, }, ); + clearTimeout(timeout); + if (!res.ok) { throw new Error( `Request failed with status ${res.status} ${res.statusText}`, diff --git a/yarn.lock b/yarn.lock index 5e7f2a996d..612fda606c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4011,6 +4011,7 @@ __metadata: handlebars: ^4.7.3 inquirer: ^8.2.0 msw: ^1.0.0 + node-fetch: ^2.6.7 nodemon: ^3.0.1 ora: ^5.3.0 recursive-readdir: ^2.2.2