/** 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<ArrayBuffer> {
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;
}