A set of utilities for working with the AT Protocol in Elixir.

refactor: ditch HTTP adapter

ovyerus.com 81de840e a5d95b4d

verified
Changed files
+3 -73
lib
atex
http
identity_resolver
-6
lib/atex/http.ex
··· 1 - defmodule Atex.HTTP do 2 - @adapter Application.compile_env(:atex, :adapter, Atex.HTTP.Adapter.Req) 3 - 4 - defdelegate get(url, opts), to: @adapter 5 - defdelegate post(url, opts), to: @adapter 6 - end
···
-13
lib/atex/http/adapter.ex
··· 1 - defmodule Atex.HTTP.Adapter do 2 - @moduledoc """ 3 - Behaviour for defining a HTTP client adapter to be used within atex. 4 - """ 5 - alias Atex.HTTP.Response 6 - 7 - @type success() :: {:ok, Response.t()} 8 - @type error() :: {:error, Response.t() | term()} 9 - @type result() :: success() | error() 10 - 11 - @callback get(url :: String.t(), opts :: keyword()) :: result() 12 - @callback post(url :: String.t(), opts :: keyword()) :: result() 13 - end
···
-38
lib/atex/http/adapter/req.ex
··· 1 - defmodule Atex.HTTP.Adapter.Req do 2 - @moduledoc """ 3 - `Req` adapter for atex. 4 - """ 5 - 6 - @behaviour Atex.HTTP.Adapter 7 - 8 - @impl true 9 - def get(url, opts) do 10 - Req.get(url, opts) |> adapt() 11 - end 12 - 13 - @impl true 14 - def post(url, opts) do 15 - Req.post(url, opts) |> adapt() 16 - end 17 - 18 - @spec adapt({:ok, Req.Response.t()} | {:error, any()}) :: Atex.HTTP.Adapter.result() 19 - defp adapt({:ok, %Req.Response{status: status} = res}) when status < 400 do 20 - {:ok, to_response(res)} 21 - end 22 - 23 - defp adapt({:ok, %Req.Response{} = res}) do 24 - {:error, to_response(res)} 25 - end 26 - 27 - defp adapt({:error, exception}) do 28 - {:error, exception} 29 - end 30 - 31 - defp to_response(%Req.Response{} = res) do 32 - %Atex.HTTP.Response{ 33 - body: res.body, 34 - status: res.status, 35 - __raw__: res 36 - } 37 - end 38 - end
···
-13
lib/atex/http/response.ex
··· 1 - defmodule Atex.HTTP.Response do 2 - @moduledoc """ 3 - A generic response struct to be returned by an `Atex.HTTP.Adapter`. 4 - """ 5 - 6 - use TypedStruct 7 - 8 - typedstruct enforce: true do 9 - field :status, integer() 10 - field :body, any() 11 - field :__raw__, any() 12 - end 13 - end
···
+2 -2
lib/atex/identity_resolver/did.ex
··· 14 @spec resolve_plc(String.t()) :: resolution_result() 15 defp resolve_plc("did:plc:" <> _id = did) do 16 with {:ok, resp} when resp.status in 200..299 <- 17 - Atex.HTTP.get("https://plc.directory/#{did}", []), 18 {:ok, body} <- decode_body(resp.body), 19 {:ok, document} <- DIDDocument.from_json(body), 20 :ok <- DIDDocument.validate_for_atproto(document, did) do ··· 29 @spec resolve_web(String.t()) :: resolution_result() 30 defp resolve_web("did:web:" <> domain = did) do 31 with {:ok, resp} when resp.status in 200..299 <- 32 - Atex.HTTP.get("https://#{domain}/.well-known/did.json", []), 33 {:ok, body} <- decode_body(resp.body), 34 {:ok, document} <- DIDDocument.from_json(body), 35 :ok <- DIDDocument.validate_for_atproto(document, did) do
··· 14 @spec resolve_plc(String.t()) :: resolution_result() 15 defp resolve_plc("did:plc:" <> _id = did) do 16 with {:ok, resp} when resp.status in 200..299 <- 17 + Req.get("https://plc.directory/#{did}"), 18 {:ok, body} <- decode_body(resp.body), 19 {:ok, document} <- DIDDocument.from_json(body), 20 :ok <- DIDDocument.validate_for_atproto(document, did) do ··· 29 @spec resolve_web(String.t()) :: resolution_result() 30 defp resolve_web("did:web:" <> domain = did) do 31 with {:ok, resp} when resp.status in 200..299 <- 32 + Req.get("https://#{domain}/.well-known/did.json"), 33 {:ok, body} <- decode_body(resp.body), 34 {:ok, document} <- DIDDocument.from_json(body), 35 :ok <- DIDDocument.validate_for_atproto(document, did) do
+1 -1
lib/atex/identity_resolver/handle.ex
··· 55 56 @spec resolve_via_http(String.t()) :: {:ok, String.t()} | :error 57 defp resolve_via_http(handle) do 58 - case Atex.HTTP.get("https://#{handle}/.well-known/atproto-did", []) do 59 {:ok, %{body: "did:" <> _ = did}} -> {:ok, did} 60 _ -> :error 61 end
··· 55 56 @spec resolve_via_http(String.t()) :: {:ok, String.t()} | :error 57 defp resolve_via_http(handle) do 58 + case Req.get("https://#{handle}/.well-known/atproto-did") do 59 {:ok, %{body: "did:" <> _ = did}} -> {:ok, did} 60 _ -> :error 61 end