From fe9509d4f7b57396efc2570ec2787d0592140640 Mon Sep 17 00:00:00 2001 From: Erik Baklund Date: Wed, 18 Dec 2019 10:06:46 +0100 Subject: [PATCH] Added timeout to NahmiiRequest --- lib/nahmii-request.js | 12 ++++++++---- lib/nahmii-request.spec.js | 18 +++++++++++++++--- package.json | 2 +- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/nahmii-request.js b/lib/nahmii-request.js index 1cc1d93..58c08e9 100644 --- a/lib/nahmii-request.js +++ b/lib/nahmii-request.js @@ -4,6 +4,7 @@ const request = require('superagent'); const https = require('https'); const _authProvider = new WeakMap(); +const _timeout = new WeakMap(); function prefixSlash(value) { if (value.toString().startsWith('/')) @@ -16,15 +17,16 @@ const agent = new https.Agent({ }); function getSuperagent() { - if (global.window) + if (global.window) return request; - + return request.agent(agent); } module.exports = class NahmiiRequest { - constructor(apiRoot, authProvider) { + constructor(apiRoot, authProvider, timeout = 30000 /* 30 sec */) { _authProvider.set(this, authProvider); + _timeout.set(this, timeout); this.apiRoot = apiRoot; } @@ -32,7 +34,8 @@ module.exports = class NahmiiRequest { const authToken = await _authProvider.get(this)(); let r = getSuperagent() .get(`https://${this.apiRoot}${prefixSlash(uri)}`) - .set('authorization', `Bearer ${authToken}`); + .set('authorization', `Bearer ${authToken}`) + .timeout({ response: _timeout.get(this) }); if (queries) r = r.query(queries); return r.then(res => res.body); @@ -44,6 +47,7 @@ module.exports = class NahmiiRequest { .post(`https://${this.apiRoot}${prefixSlash(uri)}`) .send(payload) .set('authorization', `Bearer ${authToken}`) + .timeout({ response: _timeout.get(this) }) .then(res => res.body); } }; diff --git a/lib/nahmii-request.spec.js b/lib/nahmii-request.spec.js index f46e427..a53da43 100644 --- a/lib/nahmii-request.spec.js +++ b/lib/nahmii-request.spec.js @@ -2,9 +2,9 @@ const chai = require('chai'); const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); const expect = chai.expect; -chai.use(sinonChai); +chai.use(require('chai-as-promised')); +chai.use(require('sinon-chai')); const nock = require('nock'); @@ -20,6 +20,7 @@ const fakeConfig = { apiRoot: 'some.hubii.server' }; +const timeout = 100; const stubbedAuthProvider = sinon.stub(); describe('Nahmii Request', () => { @@ -42,7 +43,7 @@ describe('Nahmii Request', () => { beforeEach(() => { testToken = 'some JWT'; stubbedAuthProvider.resolves(testToken); - request = new NahmiiRequest(fakeConfig.apiRoot, stubbedAuthProvider); + request = new NahmiiRequest(fakeConfig.apiRoot, stubbedAuthProvider, timeout); }); describe('#get()', () => { @@ -74,6 +75,17 @@ describe('Nahmii Request', () => { expect(scope.isDone()).to.eql(true); expect(result).to.eql(expectedBody); }); + + it('it times out if it takes too long to resolve', async () => { + const expectedBody = ['item 1', 'item 2']; + nock('https://' + fakeConfig.apiRoot) + .get(prefixSlash(uri)) + .delayConnection(timeout + 100) + .reply(200, expectedBody); + const err = await request.get(uri).catch(err => err); + // return expect(err.errno).to.equal('ETIMEDOUT'); // ISSUE: https://github.com/visionmedia/superagent/issues/1487 + return expect(err.code).to.equal('ABORTED'); + }); }); }); diff --git a/package.json b/package.json index 0d4ec02..48f984f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nahmii-sdk", - "version": "4.0.0", + "version": "4.0.1", "description": "Javascript SDK for using hubii nahmii APIs", "main": "index.js", "scripts": {