From 28d7b4e9248e05c41c70db736869a785b3e30cba Mon Sep 17 00:00:00 2001 From: Will Schurman Date: Mon, 15 Aug 2022 17:05:29 -0700 Subject: [PATCH] [eas-cli] Improve reliability of update asset presigned upload requests --- packages/eas-cli/package.json | 2 ++ packages/eas-cli/src/uploads.ts | 32 ++++++++++++++++++++++++++++++++ yarn.lock | 14 +++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/packages/eas-cli/package.json b/packages/eas-cli/package.json index 818633116d..1ae53761f8 100644 --- a/packages/eas-cli/package.json +++ b/packages/eas-cli/package.json @@ -62,6 +62,7 @@ "ora": "5.1.0", "pkg-dir": "4.2.0", "promise-limit": "2.7.0", + "promise-retry": "2.0.1", "prompts": "2.4.2", "qrcode-terminal": "0.12.0", "resolve-from": "5.0.0", @@ -89,6 +90,7 @@ "@types/mime": "2.0.3", "@types/node-fetch": "2.6.2", "@types/node-forge": "1.0.4", + "@types/promise-retry": "1.1.3", "@types/prompts": "2.0.14", "@types/semver": "7.3.10", "@types/tar": "6.1.2", diff --git a/packages/eas-cli/src/uploads.ts b/packages/eas-cli/src/uploads.ts index 5613194a93..e0dcc3e00b 100644 --- a/packages/eas-cli/src/uploads.ts +++ b/packages/eas-cli/src/uploads.ts @@ -3,6 +3,7 @@ import FormData from 'form-data'; import fs from 'fs-extra'; import { Response } from 'node-fetch'; import nullthrows from 'nullthrows'; +import promiseRetry from 'promise-retry'; import { URL } from 'url'; import fetch from './fetch'; @@ -31,6 +32,37 @@ export async function uploadWithPresignedPostAsync( file: string, presignedPost: PresignedPost, handleProgressEvent?: ProgressHandler +): Promise { + return await promiseRetry( + async retry => { + let response: Response; + try { + response = await uploadWithPresignedPostInternalAsync( + file, + presignedPost, + handleProgressEvent + ); + } catch (e: any) { + return retry(e); + } + + if (!response.ok) { + return retry(new Error(`Presigned post responsed with a ${response.status}`)); + } + + return response; + }, + { + retries: 3, + factor: 2, + } + ); +} + +export async function uploadWithPresignedPostInternalAsync( + file: string, + presignedPost: PresignedPost, + handleProgressEvent?: ProgressHandler ): Promise { const fileStat = await fs.stat(file); const fileSize = fileStat.size; diff --git a/yarn.lock b/yarn.lock index 69a1999175..ad566f8283 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3881,6 +3881,13 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== +"@types/promise-retry@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/promise-retry/-/promise-retry-1.1.3.tgz#baab427419da9088a1d2f21bf56249c21b3dd43c" + integrity sha512-LxIlEpEX6frE3co3vCO2EUJfHIta1IOmhDlcAsR4GMMv9hev1iTI9VwberVGkePJAuLZs5rMucrV8CziCfuJMw== + dependencies: + "@types/retry" "*" + "@types/prompts@2.0.14": version "2.0.14" resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.0.14.tgz#10cb8899844bb0771cabe57c1becaaaca9a3b521" @@ -3888,6 +3895,11 @@ dependencies: "@types/node" "*" +"@types/retry@*": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== + "@types/semver@7.3.10": version "7.3.10" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.10.tgz#5f19ee40cbeff87d916eedc8c2bfe2305d957f73" @@ -10638,7 +10650,7 @@ promise-limit@2.7.0: resolved "https://registry.yarnpkg.com/promise-limit/-/promise-limit-2.7.0.tgz#eb5737c33342a030eaeaecea9b3d3a93cb592b26" integrity sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw== -promise-retry@^2.0.1: +promise-retry@2.0.1, promise-retry@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==