@parkingboss/api
Version:
The Parking Boss API
73 lines (72 loc) • 2.07 kB
JavaScript
import storage from "store/dist/store.modern";
import decodeJwt from "jwt-decode";
const AUTH_KEY = "user/auth";
function loadFromUrl(skipExpiryCheck) {
const url = new URL(location.toString());
const source = Array.from(url.searchParams.entries())
.concat(Array.from(new URLSearchParams(url.hash.replace(/^#/, "")).entries()))
.reduce((acc, item) => {
acc[item[0]] = item[1];
return acc;
}, {});
const token = source.access_token || source.token;
if (!token)
return null;
const usr = jwtUser({ token, type: "bearer" }, skipExpiryCheck);
if (usr)
setUser(usr);
return usr;
}
function loadFromStorage(skipExpiryCheck) {
const data = storage.get(AUTH_KEY);
return jwtUser(data, skipExpiryCheck);
}
export function jwtUser(jwt, skipExpiryCheck) {
return jwtToUser(parseJwt(jwt, !!skipExpiryCheck));
}
export function loadUser(skipExpiryCheck = false) {
return loadFromUrl(skipExpiryCheck) || loadFromStorage(skipExpiryCheck);
}
export function setUser(data) {
storage.set(AUTH_KEY, data);
}
export function unsetUser() {
storage.remove(AUTH_KEY);
}
function parseJwt(data, skipExpiryCheck) {
if (data && data.token) {
try {
const jwt = decodeJwt(data.token);
if (jwt && (skipExpiryCheck || notExpired(jwt))) {
return Object.assign(data, jwt);
}
}
catch (e) {
console.warn("Failed to Decode JWT. Use is not logged in.", e);
unsetUser();
}
}
return null;
}
function notExpired(jwt) {
if (jwt && jwt.exp) {
return jwt.exp * 1000 > Date.now();
}
return false;
}
function jwtToUser(jwt) {
if (!jwt)
return jwt;
const expms = jwt.exp * 1000;
const iatms = jwt.iat * 1000;
const nbfms = jwt.nbf * 1000;
return Object.assign(jwt, {
user: jwt.sub,
expms,
expires: new Date(expms),
iatms,
created: new Date(iatms),
nbfms,
starts: new Date(nbfms),
});
}