Packages
electric_client
0.1.0-dev
0.10.3
0.10.2
0.10.1
0.10.1-beta-1
0.10.0
0.9.5-beta-1
0.9.4
0.9.4-beta-1
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.3-beta-1
0.8.2
0.8.1
0.8.0
0.8.0-beta-1
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.5-beta-5
0.6.5-beta-4
0.6.5-beta-3
0.6.5-beta-2
0.6.5-beta-1
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.5.0-beta-1
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.3.0-beta.4
0.3.0-beta.3
0.3.0-beta.2
0.2.6-pre-1
retired
0.2.6-beta.1
0.2.6-beta.0
0.2.5
0.2.4
0.2.4-pre-8
0.2.4-pre-7
0.2.4-pre-6
0.2.4-pre-5
0.2.4-pre-4
0.2.4-pre-3
0.2.4-pre-2
0.2.4-pre-1
0.2.3
0.2.3-rc-1
0.2.2
0.2.2-rc-1
0.2.1
0.2.1-rc-3
0.2.1-rc-2
0.2.1-rc-1
0.2.0
0.1.2
0.1.1
0.1.0
0.1.0-dev-9
0.1.0-dev-8
0.1.0-dev-7
0.1.0-dev-6
0.1.0-dev-5
0.1.0-dev-4
0.1.0-dev-3
0.1.0-dev-2
0.1.0-dev-17
0.1.0-dev-16
0.1.0-dev-15
0.1.0-dev-14
0.1.0-dev-13
0.1.0-dev-12
0.1.0-dev-11
0.1.0-dev-10
0.1.0-dev
Elixir client for ElectricSQL
Current section
Files
Jump to
Current section
Files
lib/electric/client/fetch/http.ex
defmodule Electric.Client.Fetch.HTTP do
@moduledoc false
alias Electric.Client.Fetch
alias Electric.Client.ShapeDefinition
@behaviour Electric.Client.Fetch
def fetch(%Fetch.Request{} = request, opts) do
request_opts = Keyword.get(opts, :request, [])
{connect_options, request_opts} = Keyword.pop(request_opts, :connect_options, [])
%{
method: method,
base_url: base_url,
shape: %ShapeDefinition{} = shape
} = request
params = Electric.Client.params(request)
[
method: method,
base_url: base_url,
url: "/v1/shape/#{ShapeDefinition.url_table_name(shape)}",
params: params,
retry_delay: &retry_delay/1,
max_retries: 6,
# finch: Electric.Client.Finch,
# we use long polling with a timeout of 20s so we don't want Req to error before
# Electric has returned something
receive_timeout: 60_000,
connect_options:
Keyword.merge(
[protocols: [:http2]],
connect_options
)
]
|> Keyword.merge(request_opts)
|> Req.new()
|> request()
end
defp request(request) do
request |> Req.request() |> wrap_resp()
end
defp wrap_resp({:ok, %Req.Response{} = resp}) do
%{status: status, headers: headers, body: body} = resp
{:ok, Fetch.Response.decode!(status, headers, body)}
end
defp wrap_resp({:error, _} = error) do
error
end
defp retry_delay(n) do
(Integer.pow(2, n) * 1000 * jitter())
|> min(30_000 * (1 - 0.1 * :rand.uniform()))
|> trunc()
end
defp jitter() do
1 - 0.1 * :rand.uniform()
end
end