UNPKG

@lucasroll62/nuxt3-auth

Version:

An alternative module to @nuxtjs/auth

73 lines (72 loc) 2.3 kB
import decode from "jwt-decode"; import { addTokenPrefix } from "../../utils"; import { TokenStatus } from "./token-status.mjs"; export class IdToken { constructor(scheme, storage) { this.scheme = scheme; this.$storage = storage; } get() { const key = this.scheme.options.idToken.prefix + this.scheme.name; return this.$storage.getUniversal(key); } set(tokenValue) { const idToken = addTokenPrefix(tokenValue, this.scheme.options.idToken.type); this.#setToken(idToken); this.#updateExpiration(idToken); return idToken; } sync() { const idToken = this.#syncToken(); this.#syncExpiration(); return idToken; } reset() { this.#setToken(false); this.#setExpiration(false); } status() { return new TokenStatus(this.get(), this.#getExpiration()); } #getExpiration() { const key = this.scheme.options.idToken.expirationPrefix + this.scheme.name; return this.$storage.getUniversal(key); } #setExpiration(expiration) { const key = this.scheme.options.idToken.expirationPrefix + this.scheme.name; return this.$storage.setUniversal(key, expiration); } #syncExpiration() { const key = this.scheme.options.idToken.expirationPrefix + this.scheme.name; return this.$storage.syncUniversal(key); } #updateExpiration(idToken) { let idTokenExpiration; const tokenIssuedAtMillis = Date.now(); const tokenTTLMillis = Number(this.scheme.options.idToken.maxAge) * 1e3; const tokenExpiresAtMillis = tokenTTLMillis ? tokenIssuedAtMillis + tokenTTLMillis : 0; try { idTokenExpiration = decode(idToken).exp * 1e3 || tokenExpiresAtMillis; } catch (error) { idTokenExpiration = tokenExpiresAtMillis; if (!(error && error.name === "InvalidTokenError")) { throw error; } } return this.#setExpiration(idTokenExpiration || false); } #setToken(idToken) { const key = this.scheme.options.idToken.prefix + this.scheme.name; return this.$storage.setUniversal(key, idToken); } #syncToken() { const key = this.scheme.options.idToken.prefix + this.scheme.name; return this.$storage.syncUniversal(key); } userInfo() { const idToken = this.get(); if (typeof idToken === "string") { return decode(idToken); } } }