/** * jwt-decode yerine kullanılan minimal çözücü. * * Sadece payload okunuyor; imza doğrulaması zaten sunucunun işi. Token * base64url kodlu olduğu için `-`/`_` çevrilir ve padding tamamlanır; * ayrıca Türkçe karakter içeren claim'lerin bozulmaması için atob çıktısı * UTF-8 olarak yeniden çözülür. */ export const jwtDecode = >(token: string): T => { const payload = token?.split('.')[1] if (!payload) { throw new Error('Invalid token specified: missing payload') } const base64 = payload.replace(/-/g, '+').replace(/_/g, '/') const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=') try { const binary = atob(padded) const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0)) return JSON.parse(new TextDecoder().decode(bytes)) as T } catch { throw new Error('Invalid token specified: payload could not be decoded') } } export default jwtDecode