Current section

Files

Jump to
electric_client lib electric client fetch mint.ex
Raw

lib/electric/client/fetch/mint.ex

defmodule Electric.Client.Fetch.Mint do
alias Electric.Client
alias Electric.Client.Fetch
alias Electric.Client.Fetch.Mint.Connection
@behaviour Electric.Client.Fetch.Pool
@behaviour Electric.Client.Fetch
def client(attrs) do
Client.new(
Keyword.merge(attrs,
pool: {__MODULE__, []},
fetch: {__MODULE__, []}
)
)
end
@impl Electric.Client.Fetch.Pool
def request(%Client{} = client, %Fetch.Request{} = request, _opts) do
%{fetch: {fetcher, fetcher_opts}} = client
authenticated_request = Client.authenticate_request(client, request)
case fetcher.fetch(authenticated_request, fetcher_opts) do
%Fetch.Response{status: status} = response when status in 200..299 ->
response
%Fetch.Response{} = response ->
{:error, response}
error ->
error
end
end
@impl Electric.Client.Fetch
def fetch(%Fetch.Request{} = request, opts) do
with {:ok, conn} <- start_connection(request) do
Connection.fetch(conn, request, opts)
end
end
defp start_connection(%Fetch.Request{stream_id: stream_id} = _request) do
DynamicSupervisor.start_child(
Electric.Client.RequestSupervisor,
{Electric.Client.Fetch.Mint.Connection, stream_id}
)
|> return_existing()
end
defp return_existing({:ok, pid}), do: {:ok, pid}
defp return_existing({:error, {:already_started, pid}}), do: {:ok, pid}
defp return_existing(error), do: error
end