export const base64UrlEncode = (arrayBuffer: ArrayBuffer): string => { const bytes = new Uint8Array(arrayBuffer); let binary = ""; for (let i = 0; i < bytes.byteLength; i++) binary += String.fromCharCode(bytes[i]); return btoa(binary) .replace(/\+/g, "-") .replace(/\//g, "_") .replace(/=+$/, ""); }; export const sha256 = async (input: string): Promise => { const encoder = new TextEncoder(); const data = encoder.encode(input); const digest = await crypto.subtle.digest("SHA-256", data); return base64UrlEncode(digest); }; export const randomString = (size = 64): string => { const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~"; const values = crypto.getRandomValues(new Uint8Array(size)); return Array.from(values, (v) => charset[v % charset.length]).join(""); };