/** URL-safe base64 without padding, as used by WebAuthn on both client and server. */ export function toBase64Url(bytes: Uint8Array): string { let binary = ""; for (const byte of bytes) binary += String.fromCharCode(byte); return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, ""); } export function fromBase64Url(value: string): Uint8Array { const padded = value.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((value.length + 3) % 4); const binary = atob(padded); const out = new Uint8Array(binary.length); for (let index = 0; index < binary.length; index++) out[index] = binary.charCodeAt(index); return out; }