Skip to content

Commit

Permalink
feat: initial version
Browse files Browse the repository at this point in the history
  • Loading branch information
Simon Grondin authored and gr2m committed Dec 28, 2018
1 parent b30fbc6 commit 380c216
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 0 deletions.
17 changes: 17 additions & 0 deletions lib/error-request.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module.exports = errorRequest

async function errorRequest (octokit, error, options) {
if (error.status === 500) {
const retries = 3
const retryAfter = Math.pow((options.request.retryCount || 0) + 1, 2)
throw octokit.retry.retryRequest(error, retries, retryAfter)
}

/*
TODO:
Add more cases here.
Use the 500 error above as example.
*/

throw error
}
22 changes: 22 additions & 0 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
module.exports = retryPlugin

const wrapRequest = require('./wrap-request')
const errorRequest = require('./error-request')

function retryPlugin (octokit) {
const state = {
retryAfterBaseValue: 1000
}

octokit.retry = {
_options: (options = {}) => Object.assign(state, options),
retryRequest: (error, retries, retryAfter) => {
error.request.request.retries = retries
error.request.request.retryAfter = retryAfter
return error
}
}

octokit.hook.error('request', errorRequest.bind(null, octokit))
octokit.hook.wrap('request', wrapRequest.bind(null, state))
}
19 changes: 19 additions & 0 deletions lib/wrap-request.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module.exports = wrapRequest

const Bottleneck = require('bottleneck/light')

async function wrapRequest (state, request, options) {
const limiter = new Bottleneck()

limiter.on('failed', function (error, info) {
const maxRetries = ~~error.request.request.retries
const after = ~~error.request.request.retryAfter
options.request.retryCount = info.retryCount + 1

if (maxRetries > info.retryCount) {
return after * state.retryAfterBaseValue
}
})

return limiter.schedule(request, options)
}

0 comments on commit 380c216

Please sign in to comment.