Read-only mirror — the public repositories of the Forgejo instance, refreshed every 10 minutes. The live instance (fg.dieschoenewolke.de) is reachable only over the VPN; clone here with https://git.dieschoenewolke.de/git/<owner>/<repo>.git.
summaryrefslogtreecommitdiff
path: root/src/retry-helper.ts
diff options
context:
space:
mode:
authoreric sciple <ericsciple@users.noreply.github.com>2019-12-12 13:16:16 -0500
committerGitHub <noreply@github.com>2019-12-12 13:16:16 -0500
commit25ac60e43ded675f082e10f444b0ad95ea43622e (patch)
tree4f254bf120e072e899f70c2646541eeec6fbbd63 /src/retry-helper.ts
parentf60b14d6faba41537d0983497a96349d75b1b481 (diff)
fallback to REST API to download repo (#104)
Diffstat (limited to 'src/retry-helper.ts')
-rw-r--r--src/retry-helper.ts61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/retry-helper.ts b/src/retry-helper.ts
new file mode 100644
index 0000000..bbc20a1
--- /dev/null
+++ b/src/retry-helper.ts
@@ -0,0 +1,61 @@
+import * as core from '@actions/core'
+
+const defaultMaxAttempts = 3
+const defaultMinSeconds = 10
+const defaultMaxSeconds = 20
+
+export class RetryHelper {
+ private maxAttempts: number
+ private minSeconds: number
+ private maxSeconds: number
+
+ constructor(
+ maxAttempts: number = defaultMaxAttempts,
+ minSeconds: number = defaultMinSeconds,
+ maxSeconds: number = defaultMaxSeconds
+ ) {
+ this.maxAttempts = maxAttempts
+ this.minSeconds = Math.floor(minSeconds)
+ this.maxSeconds = Math.floor(maxSeconds)
+ if (this.minSeconds > this.maxSeconds) {
+ throw new Error('min seconds should be less than or equal to max seconds')
+ }
+ }
+
+ async execute<T>(action: () => Promise<T>): Promise<T> {
+ let attempt = 1
+ while (attempt < this.maxAttempts) {
+ // Try
+ try {
+ return await action()
+ } catch (err) {
+ core.info(err.message)
+ }
+
+ // Sleep
+ const seconds = this.getSleepAmount()
+ core.info(`Waiting ${seconds} seconds before trying again`)
+ await this.sleep(seconds)
+ attempt++
+ }
+
+ // Last attempt
+ return await action()
+ }
+
+ private getSleepAmount(): number {
+ return (
+ Math.floor(Math.random() * (this.maxSeconds - this.minSeconds + 1)) +
+ this.minSeconds
+ )
+ }
+
+ private async sleep(seconds: number): Promise<void> {
+ return new Promise(resolve => setTimeout(resolve, seconds * 1000))
+ }
+}
+
+export async function execute<T>(action: () => Promise<T>): Promise<T> {
+ const retryHelper = new RetryHelper()
+ return await retryHelper.execute(action)
+}