Packages
electric_client
0.10.3
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/embedded.ex
if Code.ensure_loaded?(Electric.Shapes.Api) do
defmodule Electric.Client.Embedded do
alias Electric.Client.Fetch
alias Electric.Shapes.Api
@behaviour Electric.Client.Fetch
@impl Electric.Client.Fetch
def validate_opts(opts) do
case Keyword.fetch(opts, :api) do
{:ok, %Api{}} ->
{:ok, opts}
:error ->
{:error, "missing required api: %#{Api}{} setting"}
end
end
@impl Electric.Client.Fetch
def fetch(%Fetch.Request{method: :delete} = request, opts) do
{:ok, api} = Keyword.fetch(opts, :api)
timestamp = DateTime.utc_now()
with {:ok, request} <- Api.validate_for_delete(api, request_to_params(request)),
%Api.Response{} = response <- Api.delete_shape(request) do
{:ok, translate_response(response, timestamp)}
end
end
def fetch(%Fetch.Request{method: :get} = request, opts) do
{:ok, api} = Keyword.fetch(opts, :api)
timestamp = DateTime.utc_now()
case Api.validate(api, request_to_params(request)) do
{:ok, request} ->
%Api.Response{} = response = Api.serve_shape_log(request)
{:ok, translate_response(response, timestamp)}
{:error, response} ->
{:error, translate_response(response, timestamp)}
end
end
defp translate_response(%Api.Response{} = response, timestamp) do
%Fetch.Response{
status: response.status,
last_offset: convert_offset(response.offset),
shape_handle: response.handle,
schema: Api.schema(response),
# Embedded mode has no CDN, so cursor isn't needed for cache busting,
# but we set a dummy value to satisfy header validation.
next_cursor: 0,
request_timestamp: timestamp,
# Ensure we enumerate the response body in the same process that made the
# original api request so the cleanup shape process cleanup works
body: response.body |> Enum.to_list() |> List.flatten()
}
end
defp request_to_params(%Fetch.Request{} = request) do
Map.merge(
request.params,
%{
"offset" => to_string(request.offset),
"handle" => request.shape_handle,
"live" => request.live,
"replica" => request.replica
}
)
end
defp convert_offset(nil) do
nil
end
defp convert_offset(%Electric.Replication.LogOffset{} = server_offset) do
to_string(server_offset)
end
end
end