From a6dac1d8d9f19e735e5221e787d57fedeb7926b1 Mon Sep 17 00:00:00 2001 From: Michel Weststrate Date: Thu, 8 Jun 2023 07:31:34 -0700 Subject: [PATCH] make icon download more robust, and use assets_DO_NOT_HARDCODE urls instead of asset urls. Summary: Since ~yesterday all our builds started failing due to being unable to download static assets. Although those assets load correctly in the browser, and by using the browsers's generated `curl` command, which looks like: ``` curl 'https://facebook.com/assets/?name=face-unhappy&variant=outline&size=24&set=facebook_icons&density=1x' \ -H 'authority: facebook.com' \ -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \ -H 'accept-language: nl,en-GB;q=0.9,en;q=0.8,nl-NL;q=0.7,en-US;q=0.6' \ -H 'cache-control: no-cache' \ -H 'cookie: OMITTED' \ -H 'pragma: no-cache' \ -H 'sec-ch-ua: "Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"' \ -H 'sec-ch-ua-mobile: ?0' \ -H 'sec-ch-ua-platform: "macOS"' \ -H 'sec-fetch-dest: document' \ -H 'sec-fetch-mode: navigate' \ -H 'sec-fetch-site: none' \ -H 'sec-fetch-user: ?1' \ -H 'upgrade-insecure-requests: 1' \ -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' \ --compressed ``` Download fails as soon as the cookie header is dropped. Changes the base url to `https://facebook.com/images/assets_DO_NOT_HARDCODE/facebook_icons/` fixes that problem, unless the resolution doesn't exist (addressed in next diff). This also seems to remove the flakiness we were experiencing before, so dropped the retry mechanism for now. Also made failing to download an icon a warning instead of a build failure. Reviewed By: lblasa Differential Revision: D46552986 fbshipit-source-id: f1382d6a8fc6669691f0c8da6b77834d24a373c5 --- desktop/scripts/build-icons.tsx | 49 ++++++++++++--------------------- 1 file changed, 18 insertions(+), 31 deletions(-) diff --git a/desktop/scripts/build-icons.tsx b/desktop/scripts/build-icons.tsx index d6675cd5c..da92074a3 100644 --- a/desktop/scripts/build-icons.tsx +++ b/desktop/scripts/build-icons.tsx @@ -48,45 +48,32 @@ export async function downloadIcons(buildFolder: string) { [], ); - return Promise.all( - iconURLs.map((icon) => { + await Promise.all( + iconURLs.map(async (icon) => { const url = getPublicIconUrl(icon); - return fetch(url, { - retryOptions: { - retryMaxDuration: 120 * 1000, - // Be default, only 5xx are retried but we're getting the odd 404 - // which goes away on a retry for some reason. - retryOnHttpResponse: (res) => res.status >= 400, - retryOnHttpError: () => true, - }, - }) - .then((res) => { - if (res.status !== 200) { - throw new Error( - // eslint-disable-next-line prettier/prettier - `Could not download the icon ${icon} from ${url}: got status ${res.status}`, - ); - } - return res; - }) - .then( - (res) => - new Promise((resolve, reject) => { - const fileStream = fs.createWriteStream( - path.join(buildFolder, buildLocalIconPath(icon)), - ); - res.body.pipe(fileStream); - res.body.on('error', reject); - fileStream.on('finish', resolve); - }), + const res = await fetch(url); + if (res.status !== 200) { + console.warn( + // eslint-disable-next-line prettier/prettier + `Could not download the icon ${icon} from ${url}: got status ${res.status}`, ); + return; + } + return new Promise((resolve, reject) => { + const fileStream = fs.createWriteStream( + path.join(buildFolder, buildLocalIconPath(icon)), + ); + res.body.pipe(fileStream); + res.body.on('error', reject); + fileStream.on('finish', resolve); + }); }), ); } // should match flipper-ui-core/src/utils/icons.tsx export function getPublicIconUrl({name, variant, size, density}: Icon) { - return `https://facebook.com/assets/?name=${name}&variant=${variant}&size=${size}&set=facebook_icons&density=${density}x`; + return `https://facebook.com/images/assets_DO_NOT_HARDCODE/facebook_icons/${name}_${variant}_${size}_primary-icon.png`; } // should match app/src/utils/icons.tsx