mirror of
https://github.com/Retropex/bitfeed.git
synced 2025-05-12 19:20:46 +02:00
90 lines
2.3 KiB
Elixir
90 lines
2.3 KiB
Elixir
require Logger
|
|
|
|
defmodule BitcoinStream.SocketHandler do
|
|
@behaviour :cowboy_websocket
|
|
|
|
alias BitcoinStream.Mempool, as: Mempool
|
|
alias BitcoinStream.BlockData, as: BlockData
|
|
|
|
def init(request, state) do
|
|
{:cowboy_websocket, request, state}
|
|
end
|
|
|
|
def websocket_init(state) do
|
|
Registry.BitcoinStream
|
|
|> Registry.register("txs", {})
|
|
|
|
{:ok, state}
|
|
end
|
|
|
|
def get_block(last_seen) do
|
|
Logger.debug("getting block with id #{last_seen}")
|
|
last_id = BlockData.get_block_id(:block_data)
|
|
Logger.debug("last block id: #{last_id}")
|
|
cond do
|
|
(last_seen == nil) ->
|
|
payload = BlockData.get_json_block(:block_data);
|
|
{:ok, payload}
|
|
(last_seen != last_id) ->
|
|
payload = BlockData.get_json_block(:block_data);
|
|
{:ok, payload}
|
|
true ->
|
|
{:ok, '{"type": "block", "block": {}}'}
|
|
end
|
|
end
|
|
|
|
def get_mempool_count_msg() do
|
|
count = Mempool.get(:mempool);
|
|
"{ \"type\": \"count\", \"count\": #{count}}"
|
|
end
|
|
|
|
def get_block_id_msg() do
|
|
last_id = BlockData.get_block_id(:block_data);
|
|
"{ \"type\": \"block_id\", \"block_id\": \"#{last_id}\"}"
|
|
end
|
|
|
|
def websocket_handle({:text, msg}, state) do
|
|
case msg do
|
|
"hb" -> {:reply, {:text, msg}, state};
|
|
|
|
"block" ->
|
|
Logger.debug('block request');
|
|
{:reply, {:text, "null"}, state}
|
|
|
|
"count" ->
|
|
count = get_mempool_count_msg();
|
|
{:reply, {:text, count}, state}
|
|
|
|
"block_id" ->
|
|
last_id = get_block_id_msg();
|
|
{:reply, {:text, last_id}, state}
|
|
|
|
json ->
|
|
with {:ok, result} <- Jason.decode(json) do
|
|
case result do
|
|
%{"last" => block_id, "method" => "get_block"} ->
|
|
case get_block(block_id) do
|
|
{:ok, block_msg} ->
|
|
{:reply, {:text, block_msg}, state};
|
|
|
|
_ -> {:reply, {:text, "error"}, state}
|
|
end
|
|
_ -> {:reply, {:text, "??"}, state}
|
|
end
|
|
else
|
|
{:error, reason} ->
|
|
Logger.error("Failed to parse websocket message");
|
|
Logger.error("#{inspect(reason)}")
|
|
reason ->
|
|
Logger.error("other response");
|
|
Logger.error("#{inspect(reason)}")
|
|
_ -> {:reply, {:text, "?"}, state}
|
|
end
|
|
end
|
|
end
|
|
|
|
def websocket_info(info, state) do
|
|
{:reply, {:text, info}, state}
|
|
end
|
|
end
|