README.md

# Xogmios

![CI Status](https://github.com/wowica/xogmios/actions/workflows/ci.yml/badge.svg)

An Elixir client for [Ogmios](https://github.com/CardanoSolutions/ogmios).  

> Ogmios is a lightweight bridge interface for a Cardano node. It offers a WebSockets API that enables local clients to speak Ouroboros' mini-protocols via JSON/RPC. - https://ogmios.dev/

Mini-Protocols supported by this library:

- [x] Chain Synchronization
- [x] State Query (partially supported)
- [ ] Mempool Monitoring
- [ ] Tx Submission


See [Examples](#examples) section below for information on how to use this library.

## Installing

Add the dependency to `mix.exs` (not yet available on Hex):

```elixir
defp deps do
  [
    {:xogmios, github: "wowica/xogmios"}
  ]
end
```

Add your client module(s) to your application's supervision tree as such:

```elixir
# file: application.ex
def start(_type, _args) do
  children = [
    {ChainSyncClient, url: "ws://..."},
    {StateQueryClient, url: "ws://..."},
  ]
  #...
end
```

The value for the `url` option should be set to the address of your Ogmios instance.

See section below for examples of client modules.

## Examples

The following is an example of a module that implement the Chain Sync behaviour.  This module syncs with the tip of the chain, reads the next 3 blocks and then closes the connection with the server.

```elixir
defmodule ChainSyncClient do
  use Xogmios, :chain_sync

  def start_link(opts) do
    initial_state = [counter: 3]
    opts = Keyword.merge(opts, initial_state)
    Xogmios.start_chain_sync_link(__MODULE__, opts)
  end

  @impl true
  def handle_block(block, %{counter: counter} = state) when counter > 1 do
    IO.puts("handle_block #{block["height"]}")
    {:ok, :next_block, %{state | counter: counter - 1}}
  end

  @impl true
  def handle_block(block, state) do
    IO.puts("final handle_block #{block["height"]}")
    {:close, state}
  end
end
```

The following example implements the State Query behaviour and runs queries against the tip of the chain.

```elixir
defmodule StateQueryClient do
  use Xogmios, :state_query
  alias Xogmios.StateQuery

  def start_link(opts) do
    Xogmios.start_state_link(__MODULE__, opts)
  end

  def get_current_epoch(pid \\ __MODULE__) do
    StateQuery.send_query(pid, :get_current_epoch)
  end

  def get_era_start(pid \\ __MODULE__) do
    StateQuery.send_query(pid, :get_era_start)
  end
end
```

For examples of applications using this library, see [Blocks](https://github.com/wowica/blocks) and [xogmios_watcher](https://github.com/wowica/xogmios_watcher).

## Test

Run `mix test`. Tests do NOT rely on a running Ogmios instance.