Packages
atproto_browser
0.1.0
A browser-native atproto OAuth + XRPC client for Gleam: WebCrypto DPoP, PKCE, and async transport, for building a public-client SPA with no server-side session custody.
Current section
Files
Jump to
Current section
Files
src/atproto/browser/pkce.gleam
//// Async mirror of `atproto/oauth/pkce.gleam` (RFC 7636, S256), backed by
//// WebCrypto SHA-256 (`atproto/browser/digest`) instead of `gleam/crypto.hash`
//// (Node-only on the JS target). The random-bytes half of PKCE is already
//// browser-safe (`gleam/crypto.strong_random_bytes` genuinely uses
//// `crypto.getRandomValues`), so only the digest step needed replacing.
import atproto/browser/digest
import gleam/bit_array
import gleam/crypto
import gleam/javascript/promise.{type Promise}
pub type Pkce {
Pkce(verifier: String, challenge: String)
}
pub fn generate() -> Promise(Pkce) {
let verifier = base64url(crypto.strong_random_bytes(32))
use hash <- promise.map(digest.sha256(bit_array.from_string(verifier)))
Pkce(verifier:, challenge: base64url(hash))
}
fn base64url(bits: BitArray) -> String {
bit_array.base64_url_encode(bits, False)
}