import gleam/dynamic/decode import gleam/httpc import gleam/json import gleam/list import gleam/option import gleam/string import gleam/uri import possum import possum/did import possum/handle pub fn get_handle(did: did.Did) -> option.Option(handle.Handle) { let plc_request = possum.get_plc_data(did) case httpc.send(plc_request) { Error(_) -> option.None Ok(plc_response) -> { let aliases_decoder = decode.at(["alsoKnownAs"], decode.list(decode.string)) case json.parse(plc_response.body, aliases_decoder) { Ok(["at://" <> handle_text, ..]) -> case handle.parse(handle_text) { Ok(parsed_handle) -> option.Some(parsed_handle) Error(_) -> option.None } _ -> option.None } } } } pub fn get_did(handl: String) -> did.Did { let assert Ok(handle) = handle.parse(handl) let resolve_request = possum.resolve_handle(handle, pds: "slingshot.microcosm.blue") let assert Ok(resolve_response) = httpc.send(resolve_request) let did_decoder = decode.at(["did"], decode.string) let assert Ok(did_string) = json.parse(resolve_response.body, did_decoder) let assert Ok(account_did) = did.parse(did_string) // Bidirectionally verify the handle: the DID document must claim it back. let plc_request = possum.get_plc_data(account_did) let assert Ok(plc_response) = httpc.send(plc_request) let aliases_decoder = decode.at(["alsoKnownAs"], decode.list(decode.string)) let assert Ok(aliases) = json.parse(plc_response.body, aliases_decoder) let assert True = list.contains(aliases, "at://" <> string.lowercase(handl)) account_did } pub fn get_pds(did: did.Did) -> String { let plc_request = possum.get_plc_data(did) let assert Ok(plc_response) = httpc.send(plc_request) let pds_decoder = decode.at(["services", "atproto_pds", "endpoint"], decode.string) let assert Ok(pds_url) = json.parse(plc_response.body, pds_decoder) let assert Ok(pds_uri) = uri.parse(pds_url) let assert uri.Uri(host: option.Some(pds_host), ..) = pds_uri pds_host }