UNPKG

1.71 kBJavaScriptView Raw
1import d from 'debug';
2import { Expirable } from './utils';
3
4const debug = d('LC:SessionManager');
5
6export default class SessionManager {
7 constructor({ refresh, onBeforeGetSessionToken } = {}) {
8 this.refresh = refresh;
9 this._onBeforeGetSessionToken = onBeforeGetSessionToken;
10 this.setSessionToken(null, 0);
11 }
12
13 setSessionToken(token, ttl) {
14 debug('set session token', token, ttl);
15 const sessionToken = new Expirable(token, ttl * 1000);
16 this._sessionToken = sessionToken;
17 delete this._pendingSessionTokenPromise;
18 return sessionToken;
19 }
20
21 async setSessionTokenAsync(promise) {
22 const currentSessionToken = this._sessionToken;
23 this._pendingSessionTokenPromise = promise.catch(error => {
24 // revert, otherwise the following getSessionToken calls
25 // will all be rejected
26 this._sessionToken = currentSessionToken;
27 throw error;
28 });
29 return this.setSessionToken(...(await this._pendingSessionTokenPromise));
30 }
31
32 async getSessionToken({ autoRefresh = true } = {}) {
33 debug('get session token');
34 if (this._onBeforeGetSessionToken) {
35 this._onBeforeGetSessionToken(this);
36 }
37 const { value, originalValue } =
38 this._sessionToken || (await this._pendingSessionTokenPromise);
39 if (value === Expirable.EXPIRED && autoRefresh && this.refresh) {
40 debug('refresh expired session token');
41 const { value: newValue } = await this.setSessionTokenAsync(
42 this.refresh(this, originalValue)
43 );
44 debug('session token', newValue);
45 return newValue;
46 }
47 debug('session token', value);
48 return value;
49 }
50
51 revoke() {
52 if (this._sessionToken) this._sessionToken.expiredAt = -1;
53 }
54}