85 lines
1.7 KiB
TypeScript

import { TokenResponse } from "src/api/npm";
export const TOKEN_KEY = "authentications";
export class AuthStore {
// Get all tokens from stack
get tokens() {
const t = localStorage.getItem(TOKEN_KEY);
let tokens = [];
if (t !== null) {
try {
tokens = JSON.parse(t);
} catch (e) {
// do nothing
}
}
return tokens;
}
// Get last token from stack
get token() {
const t = this.tokens;
if (t.length) {
return t[t.length - 1];
}
return null;
}
// Get expires from last token
get expires() {
const t = this.token;
if (t && typeof t.expires !== "undefined") {
const expires = Number(t.expires);
if (expires && !isNaN(expires)) {
return expires;
}
}
return null;
}
// Filter out invalid tokens and return true if we find one that is valid
hasActiveToken() {
const t = this.tokens;
if (!t.length) {
return false;
}
const now = Math.round(new Date().getTime() / 1000);
const oneMinuteBuffer = 60;
for (let i = t.length - 1; i >= 0; i--) {
const valid = t[i].expires - oneMinuteBuffer > now;
if (valid) {
return true;
} else {
this.drop();
}
}
return false;
}
// Set a single token on the stack
set({ token, expires }: TokenResponse) {
localStorage.setItem(TOKEN_KEY, JSON.stringify([{ token, expires }]));
}
// Add a token to the stack
add({ token, expires }: TokenResponse) {
const t = this.tokens;
t.push({ token, expires });
localStorage.setItem(TOKEN_KEY, t);
}
// Drop a token from the stack
drop() {
const t = this.tokens;
localStorage.setItem(TOKEN_KEY, t.splice(-1, 1));
}
clear() {
localStorage.removeItem(TOKEN_KEY);
}
}
export default new AuthStore();