diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5c51e8bafae6d..310e627fa0d39 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -22,7 +22,8 @@ "extensions": [ "yzhang.markdown-all-in-one", "esbenp.prettier-vscode", - "dbaeumer.vscode-eslint" + "dbaeumer.vscode-eslint", + "github.vscode-github-actions" ] } }, diff --git a/src/common/retryer.js b/src/common/retryer.js index b3ea70644e005..6703415d92631 100644 --- a/src/common/retryer.js +++ b/src/common/retryer.js @@ -66,21 +66,30 @@ const retryer = async (fetcher, variables, retries = 0) => { // finally return the response return response; } catch (err) { + /** @type {any} */ + const e = err; + + // network/unexpected error → let caller treat as failure + if (!e?.response) { + throw e; + } + // prettier-ignore // also checking for bad credentials if any tokens gets invalidated - const isBadCredential = err.response.data && err.response.data.message === "Bad credentials"; + const isBadCredential = + e?.response?.data?.message === "Bad credentials"; const isAccountSuspended = - err.response.data && - err.response.data.message === "Sorry. Your account was suspended."; + e?.response?.data?.message === "Sorry. Your account was suspended."; if (isBadCredential || isAccountSuspended) { logger.log(`PAT_${retries + 1} Failed`); retries++; // directly return from the function return retryer(fetcher, variables, retries); - } else { - return err.response; } + + // HTTP error with a response → return it for caller-side handling + return e.response; } };