@nitra/vite-boot
Version:
74 lines (62 loc) • 2.45 kB
JavaScript
const allowedRoles = import.meta.env.VITE_HASURA_ROLE.split(',')
// Декодована версія токена, яка пройшла перевірку, на те що вона:
// - має /hasura.io/jwt/claims
// - має дозволені ролі
// - не застарів
export let checkedToken
export let user = {}
/**
* Очищає дані поточного користувача
*/
export function unsetUser() {
user = {}
checkedToken = null
}
/**
* Встановлює дані користувача з розкодованого JWT
* @param {object} decoded - Обʼєкт з Hasura claims розкодованого токена
* @param {string} raw - Raw токен
*/
export function setUser(decoded, raw = null) {
user = decoded
checkedToken = raw
user.login = decoded['https://hasura.io/jwt/claims']['x-hasura-user-id']
// Роль за умовчанням
const intersect = intersection(allowedRoles, decoded['https://hasura.io/jwt/claims']['x-hasura-allowed-roles'])
user.role = intersect[0]
}
/**
* Повертає спільні елементи двох масивів рядків
* @param {string[]} a - Перший масив рядків
* @param {string[]} b - Другий масив рядків
* @returns {string[]} - Масив спільних значень
*/
function intersection(a, b) {
const setA = new Set(a)
return b.filter((value) => setA.has(value))
}
/**
* Очищаємо токен та дані користувача, переводимо його у стан "анонімний".
*/
export async function cleanToken() {
// очищуємо дані користувача
unsetUser()
// видаляємо запис з localStorage
localStorage.removeItem('__session')
// видаляємо cookie (__session) через Cookie Store API або document.cookie (fallback).
if (globalThis.cookieStore && typeof globalThis.cookieStore.delete === 'function') {
let safeDomain = import.meta.env.VITE_DOMAIN
if (typeof safeDomain === 'string' && safeDomain.startsWith('.')) {
safeDomain = safeDomain.slice(1)
}
await globalThis.cookieStore.delete({
name: '__session',
path: '/',
domain: safeDomain
})
} else {
// @ts-ignore
// eslint-disable-next-line unicorn/no-document-cookie
document.cookie = `__session=; Max-Age=0; path=/; domain=${import.meta.env.VITE_DOMAIN}`
}
}