()
| 21 | } |
| 22 | |
| 23 | async function generatePKCE(): Promise<PkceCodes> { |
| 24 | const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" |
| 25 | const verifier = Array.from(crypto.getRandomValues(new Uint8Array(43))) |
| 26 | .map((b) => chars[b % chars.length]) |
| 27 | .join("") |
| 28 | const challenge = base64UrlEncode(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier))) |
| 29 | return { verifier, challenge } |
| 30 | } |
| 31 | |
| 32 | function base64UrlEncode(buffer: ArrayBuffer): string { |
| 33 | const bytes = new Uint8Array(buffer) |
no test coverage detected