UNPKG

@nitra/vite-boot

Version:
74 lines (62 loc) 2.45 kB
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}` } }