Skip to content

Commit

Permalink
Merge pull request #6 from softvu/fix/token-refresh
Browse files Browse the repository at this point in the history
Fix problems with token refreshing
  • Loading branch information
c0bra committed Feb 8, 2018
2 parents f096fa9 + 748ddbd commit 173b97d
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 39 deletions.
2 changes: 1 addition & 1 deletion dist/seniorvu.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"test": "webpack && ava",
"watch": "npm run test -- --watch",
"build": "webpack",
"build:watch": "onchange src/** -- webpack",
"dev": "onchange src/** -- webpack",
"toc": "doctoc README.md --github",
"debug": "node --inspect node_modules/ava/profile.js",
"cover": "nyc ava && nyc report"
Expand Down
67 changes: 31 additions & 36 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,16 @@ const PATHS = [
];

// Check if the expiration time is within a day
function expiresSoon(expireAt) {
export function expiresSoon(expireAt) {
if (typeof expireAt === 'undefined') return true;
return (new Date(expireAt) - new Date()) < 1000 * 60 * 60 * 24;
}

export default class SeniorVu {
constructor(opts = {}) {
this.ax = axios.create();
constructor(opts = {}, ax) {
if (ax) this.ax = ax;
else this.ax = axios.create();

this.config(opts);

// Create functions for each XHR verb
Expand Down Expand Up @@ -134,58 +137,38 @@ export default class SeniorVu {
apiKey: opts.apiKey,
})
.then(res => {
if (res.data.token) {
if (res && res.data && res.data.token) {
this.userId = res.data.userId;
this._updateToken(res.data.token);

return { token: this.token, userId: this.userId };
}
throw new Error('No token received from SeniorVu API');
})
.catch(err => {
let ex = null;
if (err.response) {
if (err.response.data && err.response.data.errors && err.response.data.errors.length > 0) {
const msg = err.response.data.errors[0].message || err.response.data.errors[0];
ex = new Error(msg);
}
} else if (err.request) {
ex = new Error('No response from SeniorVu API');
} else if (err instanceof Error) {
ex = err;
} else {
ex = new Error('Error setting up request ' + err);
}

ex.axios = err;

throw ex;
});
.catch(err => this._handleError(err));
}

throw new Error('No authentication options provided');
}

register(opts) {
return axios.post(this.opts.baseUrl + '/auth/registration', opts)
return this.ax(this.opts.baseUrl + '/auth/registration', opts)
.then(res => {
if (res && res.data) return res.data;
return res;
})
.catch(err => {
this._handleError(err);
});
.catch(err => this._handleError(err));
}

oneTimeTokenAuth(token) {
return axios.post(this.opts.baseUrl + '/auth/login', {
return this.ax(this.opts.baseUrl + '/auth/login', {
token,
})
.then(res => {
if (res.data.token) {
if (res && res.data.token) {
this._updateToken(res.data.token);
}
if (res.data.userToken) {
if (res && res.data.userToken) {
return {
token: this.token,
userToken: res.data.userToken,
Expand All @@ -198,15 +181,22 @@ export default class SeniorVu {
}

refreshToken() {
return axios({
return this.ax({
url: `${this.opts.baseUrl}/auth/refresh`,
method: 'post',
headers: { Authorization: `Bearer ${this.token}` },
})
.then(({ data }) => {
this._updateToken(data.token);
this.expireAt = data.expireAt;
});
.then(res => {
if (res && res.data && res.data.token) {
this._updateToken(res.data.token);
this.expireAt = res.data.expireAt;
} else {
const e = new Error('Problem refreshing jwt');
e.response = res;
throw e;
}
})
.catch(err => this._handleError(err));
}

_updateToken(token) {
Expand All @@ -228,7 +218,7 @@ export default class SeniorVu {
}

_startChain() {
return new SeniorVuChain(this.opts); /* eslint no-use-before-define: "off" */
return new SeniorVuChain(this.opts, this.ax); /* eslint no-use-before-define: "off" */
}

_chain(...segments) {
Expand Down Expand Up @@ -256,6 +246,11 @@ export default class SeniorVu {
if (err.response.data && err.response.data.errors && err.response.data.errors.length > 0) {
const msg = err.response.data.errors[0].message || err.response.data.errors[0];
ex = new Error(msg);
} else if (err.response.data) {
ex = new Error(err.response.data);
} else {
ex = new Error('Unknown issue');
ex.err = err;
}
} else if (err.request) {
ex = new Error('No response from SeniorVu API');
Expand Down
6 changes: 5 additions & 1 deletion test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import test from 'ava';
import nock from 'nock';

// import SeniorVu from '../src';
import SeniorVu from '../src';
import { default as SeniorVu, expiresSoon } from '../src';

const HOSTNAME = 'http://foo.local';

Expand Down Expand Up @@ -119,3 +119,7 @@ test.serial('Can run simultaneous requests', t => {
t.deepEqual(one.chain.segments, ['statuses']);
t.deepEqual(two.chain.segments, ['priorities']);
});

test('expiresSoon handles undefined values', t => {
t.true(expiresSoon(undefined));
});

0 comments on commit 173b97d

Please sign in to comment.