| 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<string> => { | |
| 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(""); | |
| }; | |