From b0a641022333c3faca1d1d9f8b53f6a9e75636ca Mon Sep 17 00:00:00 2001 From: Matteo Collina Date: Sun, 4 Feb 2024 18:51:50 +0100 Subject: [PATCH] The interceptor should work when attached to a global agent (#11) Signed-off-by: Matteo Collina --- oauth-interceptor.js | 4 +-- tests/global.test.js | 60 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 tests/global.test.js diff --git a/oauth-interceptor.js b/oauth-interceptor.js index 4ce45cf..9ddb25a 100644 --- a/oauth-interceptor.js +++ b/oauth-interceptor.js @@ -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 @@ -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, diff --git a/tests/global.test.js b/tests/global.test.js new file mode 100644 index 0000000..92cfb8e --- /dev/null +++ b/tests/global.test.js @@ -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) +})