README.md

# Steemex

Elixir websockets client for Steem JSONRPC interface. Steemex is a supervised application, so don't forget to add it to applications in mix.exs

## Installation

  1. Add `steemex` to your list of dependencies in `mix.exs`:

    ```elixir
    def deps do
      [
        {:steemex, ">= 0.0.0"}
      ]
    end
    ```

  2. Add 'steemex' to applications in `mix.exs`:
    ```elixir
    def application do
      [applications: [:logger, :steemex]]
    end
    ```

## Configuration

First, configure a websockets url for the steemd instance, for example, a public node `wss://steemd.steemit.com/` to the config.

```elixir
config :steemex,
  url: System.get_env("STEEM_URL"),
```

Steemex module includes structs for all operations types. Streamer module parses each operation and converts it to a corresponding struct.

# JSONRPC API

The main module function is `Steemex.call`. It will block the calling process and return a success tuple with a "result" data from the JSONRPC call response. JSONRPC call ids are handled automatically.

# Documentation

All database api functions have docs, typespecs and example API responses. Most example responses are from the Golos blockchain, their shape is identical to Steem counterparts.

# GenStage

ExGolos uses GenStage, [a new specification](http://elixir-lang.org/blog/2016/07/14/announcing-genstage/) for handling and exchanging events among Elixir/Erlang processes.

On module app startup two GenStage processes are started and registered:

* Golos.Stage.Blocks.Producer which, perhaps unsurprisingly, is a new blocks producer
* Golos.Stage.Ops.ProducerConsumer consumes blocks and produces operations


## An example of GenStage consumer to handle stream of new operations

```
defmodule Steemex.Stage.Ops.ExampleConsumer do
  use GenStage
  require Logger

  def start_link(args, options \\ []) do
    GenStage.start_link(__MODULE__, args, options)
  end

  def init(state) do
    {:consumer, state, subscribe_to: state.subscribe_to}
  end

  def handle_events(events, _from, state) do
    for op <- events do
      Logger.info """
      New operation:
      #{inspect op}
      """
    end
    {:noreply, [], state}
  end

end
```

## Roadmap

Steemex is under active development.

* ~~Investigate using GenStage~~
* Add more utility functions
* Add more types and structs
* Add transaction broadcasting