Skip to content

Commit

Permalink
feat: setup custom retry with builtin node fetch
Browse files Browse the repository at this point in the history
  • Loading branch information
btkostner committed Sep 20, 2024
1 parent d1c0257 commit 4cd9a5f
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 60 deletions.
69 changes: 40 additions & 29 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9106,12 +9106,13 @@ exports["default"] = _default;
const core = __nccwpck_require__(2186)
const { exec } = __nccwpck_require__(1514)
const tc = __nccwpck_require__(7784)
const http = __nccwpck_require__(6255)
const path = __nccwpck_require__(1017)
const semver = __nccwpck_require__(1383)
const fs = __nccwpck_require__(7147)
const os = __nccwpck_require__(2037)

const MAX_HTTP_RETRIES = 3

main().catch((err) => {
core.setFailed(err.message)
})
Expand Down Expand Up @@ -9361,8 +9362,7 @@ async function getOTPVersions(osVersion) {
hexMirrors: hexMirrorsInput(),
actionTitle: `fetch ${originListing}`,
action: async (hexMirror) => {
const l = await get(`${hexMirror}${originListing}`, [null])
return l
return get(`${hexMirror}${originListing}`, [])
},
})
} else if (process.platform === 'win32') {
Expand Down Expand Up @@ -9413,8 +9413,7 @@ async function getElixirVersions() {
hexMirrors: hexMirrorsInput(),
actionTitle: `fetch ${originListing}`,
action: async (hexMirror) => {
const l = await get(`${hexMirror}${originListing}`, [null])
return l
return get(`${hexMirror}${originListing}`, [])
},
})
const otpVersionsForElixirMap = {}
Expand Down Expand Up @@ -9660,38 +9659,50 @@ function getRunnerOSVersion() {
return containerFromEnvImageOS
}

async function get(url0, pageIdxs) {
async function getPage(pageIdx) {
const url = new URL(url0)
const headers = {}
const GithubToken = getInput('github-token', false)
if (GithubToken && url.host === 'api.github.com') {
headers.authorization = `Bearer ${GithubToken}`
}
async function getUrlResponse(url, headers, attempt = 1) {
try {
const response = await fetch(url, { headers })
const contentType = response.headers.get('content-type') || ''

if (pageIdx !== null) {
url.searchParams.append('page', pageIdx)
if (!response.ok) {
throw new Error(`Got ${response.statusCode} from ${url}`)
}

const httpClient = new http.HttpClient('setup-beam', [], {
allowRetries: true,
maxRetries: 3,
})
const response = await httpClient.get(url, headers)
if (response.statusCode >= 400 && response.statusCode <= 599) {
throw new Error(
`Got ${response.statusCode} from ${url}. Exiting with error`,
)
if (contentType.indexOf('application/json') !== -1) {
return response.json()
} else {
return response.text()
}
} catch (err) {
if (attempt >= MAX_HTTP_RETRIES) {
core.debug(`Error during fetch. Retrying in 1000ms: ${err}`)
await new Promise((resolve) => setTimeout(resolve, 1000))
return getUrlResponse(url, headers, attempt + 1)
} else {
throw err
}

return response.readBody()
}
}

if (pageIdxs[0] === null) {
return getPage(null)
async function get(url0, pageIdxs) {
const url = new URL(url0)
const headers = {}
const GithubToken = getInput('github-token', false)
if (GithubToken && url.host === 'api.github.com') {
headers.authorization = `Bearer ${GithubToken}`
}

return Promise.all(pageIdxs.map(getPage))
if (pageIdxs.length === 0) {
return getUrlResponse(url, headers)
} else {
return Promise.all(
pageIdxs.map((page) => {
const urlWithPage = new URL(url)
urlWithPage.searchParams.append('page', page)
return getUrlResponse(urlWithPage, headers)
}),
)
}
}

function maybePrependWithV(v) {
Expand Down
1 change: 0 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
"dependencies": {
"@actions/core": "1.10.0",
"@actions/exec": "1.1.1",
"@actions/http-client": "2.1.0",
"@actions/tool-cache": "2.0.1",
"semver": "7.6.2"
},
Expand Down
69 changes: 40 additions & 29 deletions src/setup-beam.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
const core = require('@actions/core')
const { exec } = require('@actions/exec')
const tc = require('@actions/tool-cache')
const http = require('@actions/http-client')
const path = require('path')
const semver = require('semver')
const fs = require('fs')
const os = require('os')

const MAX_HTTP_RETRIES = 3

main().catch((err) => {
core.setFailed(err.message)
})
Expand Down Expand Up @@ -261,8 +262,7 @@ async function getOTPVersions(osVersion) {
hexMirrors: hexMirrorsInput(),
actionTitle: `fetch ${originListing}`,
action: async (hexMirror) => {
const l = await get(`${hexMirror}${originListing}`, [null])
return l
return get(`${hexMirror}${originListing}`, [])
},
})
} else if (process.platform === 'win32') {
Expand Down Expand Up @@ -313,8 +313,7 @@ async function getElixirVersions() {
hexMirrors: hexMirrorsInput(),
actionTitle: `fetch ${originListing}`,
action: async (hexMirror) => {
const l = await get(`${hexMirror}${originListing}`, [null])
return l
return get(`${hexMirror}${originListing}`, [])
},
})
const otpVersionsForElixirMap = {}
Expand Down Expand Up @@ -560,38 +559,50 @@ function getRunnerOSVersion() {
return containerFromEnvImageOS
}

async function get(url0, pageIdxs) {
async function getPage(pageIdx) {
const url = new URL(url0)
const headers = {}
const GithubToken = getInput('github-token', false)
if (GithubToken && url.host === 'api.github.com') {
headers.authorization = `Bearer ${GithubToken}`
}
async function getUrlResponse(url, headers, attempt = 1) {
try {
const response = await fetch(url, { headers })
const contentType = response.headers.get('content-type') || ''

if (pageIdx !== null) {
url.searchParams.append('page', pageIdx)
if (!response.ok) {
throw new Error(`Got ${response.statusCode} from ${url}`)
}

const httpClient = new http.HttpClient('setup-beam', [], {
allowRetries: true,
maxRetries: 3,
})
const response = await httpClient.get(url, headers)
if (response.statusCode >= 400 && response.statusCode <= 599) {
throw new Error(
`Got ${response.statusCode} from ${url}. Exiting with error`,
)
if (contentType.indexOf('application/json') !== -1) {
return response.json()
} else {
return response.text()
}
} catch (err) {
if (attempt >= MAX_HTTP_RETRIES) {
core.debug(`Error during fetch. Retrying in 1000ms: ${err}`)
await new Promise((resolve) => setTimeout(resolve, 1000))
return getUrlResponse(url, headers, attempt + 1)
} else {
throw err
}

return response.readBody()
}
}

if (pageIdxs[0] === null) {
return getPage(null)
async function get(url0, pageIdxs) {
const url = new URL(url0)
const headers = {}
const GithubToken = getInput('github-token', false)
if (GithubToken && url.host === 'api.github.com') {
headers.authorization = `Bearer ${GithubToken}`
}

return Promise.all(pageIdxs.map(getPage))
if (pageIdxs.length === 0) {
return getUrlResponse(url, headers)
} else {
return Promise.all(
pageIdxs.map((page) => {
const urlWithPage = new URL(url)
urlWithPage.searchParams.append('page', page)
return getUrlResponse(urlWithPage, headers)
}),
)
}
}

function maybePrependWithV(v) {
Expand Down

0 comments on commit 4cd9a5f

Please sign in to comment.