Skip to content

Instantly share code, notes, and snippets.

@slezica
Created December 1, 2014 22:41
Show Gist options
  • Save slezica/a2889526d44e25ba8535 to your computer and use it in GitHub Desktop.
Save slezica/a2889526d44e25ba8535 to your computer and use it in GitHub Desktop.
request = Promise.promisifyAll require 'request'
refreshToken = (token, refresh_token, provider) ->
request.postAsync
uri: provider.refreshUrl
headers:
'Authorization': "Bearer #{token}"
'Content-Type' : 'application/json'
form:
client_id : provider.clientID
client_secret: provider.clientSecret
refresh_token: refresh_token
grant_type : 'refresh_token'
.then ([ meta, body ]) ->
result = JSON.parse body
if result.error?
throw new Error(body)
return result.access_token
class TokenManager
@prototype.log = require('../log').create 'TokenManager'
constructor: ->
@promises = {}
refresh: (token, refresh_token, provider) ->
key = provider.clientID + token
if key of @promises
@log.d "Multiple refresh request for <#{token}> (ignoring...)"
return @promises[key] # Return the same, previous Promise
@log.d "Refreshing token <#{token}>..."
@promises[key] = refreshToken(token, refresh_token, provider)
.catch (err) =>
@log.e "refresh: #{err.stack}"
.finally =>
delete @promises[key]
# PARA USAR EL TOKEN MANAGER:
tokenman = new TokenManager() # estático, único
class OAuth2Client
(blabla...)
if autorefresh and meta.statusCode is 401
tokenman.refresh(
person[@provider].access_token,
person[@provider].refresh_token,
config[@provider]
).then (token) =>
@doRequestAsync(method, reqopts)
(bleble...)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment