Skip to content

Commit

Permalink
The interceptor should work when attached to a global agent (#11)
Browse files Browse the repository at this point in the history
Signed-off-by: Matteo Collina <[email protected]>
  • Loading branch information
mcollina authored Feb 4, 2024
1 parent e8cebe0 commit b0a6410
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 2 deletions.
4 changes: 2 additions & 2 deletions oauth-interceptor.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

const { createDecoder } = require('fast-jwt')
const { refreshAccessToken } = require('./lib/utils')
const { RetryHandler } = require('undici')
const { RetryHandler, getGlobalDispatcher } = require('undici')

const decode = createDecoder()
const EXP_DIFF_MS = 10 * 1000
Expand Down Expand Up @@ -84,7 +84,7 @@ function createOAuthInterceptor (options) {
opts.headers.authorization = `Bearer ${accessToken}`
}

const { dispatcher } = opts
const dispatcher = opts.dispatcher || getGlobalDispatcher()

const retryHandler = new RetryHandler({
...opts,
Expand Down
60 changes: 60 additions & 0 deletions tests/global.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
'use strict'

const test = require('node:test')
const assert = require('node:assert')
const http = require('node:http')
const { once, EventEmitter } = require('node:events')
const { request, Agent, setGlobalDispatcher, getGlobalDispatcher } = require('undici')
const { createDecoder } = require('fast-jwt')
const { createOAuthInterceptor } = require('../')
const { createToken } = require('./helper')

const originalGlobalDispatcher = getGlobalDispatcher()
test.afterEach(() => setGlobalDispatcher(originalGlobalDispatcher))

test('get an access token if no token provided', async (t) => {
let accessToken = ''
const mainServer = http.createServer((req, res) => {
assert.ok(req.headers.authorization.length > 'Bearer '.length)
assert.strictEqual(req.headers.authorization, `Bearer ${accessToken}`)
res.writeHead(200)
res.end()
})
mainServer.listen(0)

const tokenServer = http.createServer((req, res) => {
assert.strictEqual(req.method, 'POST')
assert.strictEqual(req.url, '/token')

accessToken = createToken({ name: 'access' }, { expiresIn: '1d' })
res.writeHead(200)
res.end(JSON.stringify({ access_token: accessToken }))
})
tokenServer.listen(0)

t.after(() => {
mainServer.close()
tokenServer.close()
})

const refreshToken = createToken(
{ name: 'refresh' },
{ expiresIn: '1d', iss: `http://localhost:${tokenServer.address().port}` }
)

const dispatcher = new Agent({
interceptors: {
Pool: [createOAuthInterceptor({
refreshToken,
retryOnStatusCodes: [401],
origins: [`http://localhost:${mainServer.address().port}`],
clientId: 'client-id'
})]
}
})

setGlobalDispatcher(dispatcher)

const { statusCode } = await request(`http://localhost:${mainServer.address().port}`)
assert.strictEqual(statusCode, 200)
})

0 comments on commit b0a6410

Please sign in to comment.