···
|> URI.append_query(URI.encode_query(%{cursor: cursor}))
25
-
WebSockex.start_link(url, __MODULE__, %{cursor: cursor})
25
+
WebSockex.start_link(url, __MODULE__, 0)
def handle_connect(conn, state) do
···
with {:ok, header, next} <- CAR.DagCbor.decode(msg),
{:ok, payload, _} <- CAR.DagCbor.decode(next),
{%{"op" => @op_regular, "t" => type}, _} <- {header, payload},
37
-
message <- from_payload(type, payload) do
37
+
true <- type == "#info" || valid_seq?(state, payload["seq"]),
39
+
from_payload(type, payload) do
%Firehose.Commit{} = commit ->
IO.inspect(commit.ops, label: commit.repo)
···
48
+
{:ok, payload["seq"] || state}
51
+
Logger.error("Got out of sequence or invalid `seq` from Firehose")
{%{"op" => @op_error, "t" => type}, payload} ->
Logger.error("Got error from Firehose: #{inspect({type, payload})}")
Logger.warning("Failed to decode frame from Firehose: #{inspect(reason)}")
def handle_frame({:text, msg}, state) do
57
-
Logger.warning("Got unexpected text frame from Firehose #{inspect(msg)}")
65
+
Logger.warning("Got unexpected text frame from Firehose: #{inspect(msg)}")
69
+
@spec valid_seq?(integer(), any()) :: boolean()
70
+
defp valid_seq?(last_seq, seq) when is_integer(seq), do: seq > last_seq
71
+
defp valid_seq?(_last_seq, _seq), do: false
@spec from_payload(String.t(), map()) ::
···
68
-
def from_payload("#commit", payload), do: Firehose.Commit.from(payload)
69
-
def from_payload("#sync", payload), do: Firehose.Sync.from(payload)
70
-
def from_payload("#identity", payload), do: Firehose.Identity.from(payload)
71
-
def from_payload("#account", payload), do: Firehose.Account.from(payload)
72
-
def from_payload("#info", payload), do: Firehose.Info.from(payload)
73
-
def from_payload(_type, _payload), do: nil
80
+
defp from_payload("#commit", payload), do: Firehose.Commit.from(payload)
81
+
defp from_payload("#sync", payload), do: Firehose.Sync.from(payload)
82
+
defp from_payload("#identity", payload), do: Firehose.Identity.from(payload)
83
+
defp from_payload("#account", payload), do: Firehose.Account.from(payload)
84
+
defp from_payload("#info", payload), do: Firehose.Info.from(payload)
85
+
defp from_payload(_type, _payload), do: nil