Files
notesnook/packages/core/api/token-manager.js

104 lines
2.5 KiB
JavaScript
Raw Normal View History

2020-12-16 12:06:25 +05:00
import http from "../utils/http";
import constants from "../utils/constants";
2021-05-25 16:19:58 +05:00
import { EV, EVENTS, sendSessionExpiredEvent } from "../common";
2020-12-16 12:06:25 +05:00
const ENDPOINTS = {
token: "/connect/token",
revoke: "/connect/revocation",
temporaryToken: "/account/token",
logout: "/account/logout",
2020-12-16 12:06:25 +05:00
};
2021-05-25 16:19:58 +05:00
var RETRIES = 0;
var RETRIES_LIMIT = 1;
2020-12-16 12:06:25 +05:00
class TokenManager {
/**
*
* @param {import("./index").default} db
*/
constructor(db) {
this._db = db;
this.token;
2020-12-16 12:06:25 +05:00
}
2021-05-25 16:19:58 +05:00
async getToken(renew = true, forceRenew = false) {
let token = this.token || (await this._db.context.read("token"));
2020-12-16 12:06:25 +05:00
if (!token) return;
2021-05-25 16:19:58 +05:00
if (forceRenew || (renew && this._isTokenExpired(token))) {
2020-12-16 12:06:25 +05:00
await this._refreshToken(token);
return await this.getToken();
}
return token;
}
_isTokenExpired(token) {
const { t, expires_in } = token;
const expiryMs = t + expires_in * 1000;
return Date.now() >= expiryMs;
}
2021-05-25 16:19:58 +05:00
async getAccessToken(forceRenew = false) {
try {
const token = await this.getToken(true, forceRenew);
if (!token) return;
return token.access_token;
} catch (e) {
console.error("Error getting access token:", e);
if (e.message === "invalid_grant" || e.message === "invalid_client") {
2021-05-25 16:20:44 +05:00
if (++RETRIES <= RETRIES_LIMIT) {
return await this.getAccessToken(true);
}
RETRIES = 0;
EV.publish(EVENTS.userSessionExpired);
2021-05-25 16:19:58 +05:00
}
return null;
}
2020-12-16 12:06:25 +05:00
}
async _refreshToken(token) {
const { refresh_token, scope } = token;
if (!refresh_token || !scope) return;
2020-12-16 12:06:25 +05:00
return await this.saveToken(
await http.post(`${constants.AUTH_HOST}${ENDPOINTS.token}`, {
refresh_token,
grant_type: "refresh_token",
scope: scope,
client_id: "notesnook",
})
);
}
async revokeToken() {
const token = await this.getToken();
if (!token) return;
const { access_token } = token;
2020-12-16 12:06:25 +05:00
await http.post(
`${constants.AUTH_HOST}${ENDPOINTS.logout}`,
null,
access_token
);
2020-12-16 12:06:25 +05:00
}
saveToken(tokenResponse) {
this.token = { ...tokenResponse, t: Date.now() };
return this._db.context.write("token", this.token);
2020-12-16 12:06:25 +05:00
}
2021-04-05 11:32:40 +05:00
clearToken() {
this.token = undefined;
}
async getAccessTokenFromAuthorizationCode(userId, authCode) {
return await this.saveToken(
await http.post(`${constants.AUTH_HOST}${ENDPOINTS.temporaryToken}`, {
authorization_code: authCode,
user_id: userId,
client_id: "notesnook",
})
);
}
2020-12-16 12:06:25 +05:00
}
export default TokenManager;