README.md

# StdJsonIo

Starts a pool of workers that communicate with an external script via JSON over
STDIN/STDOUT.

Originally written to use [react-stdio](https://github.com/mjackson/react-stdio)
but can be used with any process that reads a JSON object from STDIN and outputs
JSON on STDOUT.

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed as:

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

        def deps do
          [{:std_json_io, "~> 0.1.0"}]
        end

  2. Ensure `std_json_io` is started before your application:

        def application do
          [applications: [:std_json_io]]
        end

### Setup

Define a module and use StdJsonIo.

```elixir
defmodule MyApp.ReactIo do
  use StdJsonIo, otp_app: :my_app
end
```

When you use `StdJsonIo` your module becomes a supervisor. You'll need to add it
to your supervision tree.

```elixir
children = [
  # snip
  supervisor(MyApp.ReactIo, [])
]

opts = [strategy: :one_for_one, name: MyApp]

Supervisor.start_link(children, opts)
```


### Configuration

You can either configure as additional arguments of the use statement, or in your config file.

```elixir
config :my_app, MyApp.ReactIo,
  pool_size: 20, # default 5
  max_overflow: 10, # default 10
  script: "path/to/script", # for react-io use "react-stdio"
  watch_files: [
    Path.join([__DIR__, "../priv/server/js/component.js"]) # do not watch files in dev
  ]
```

* `script` - the script to run for the IO server
* `watch_files` - A list of files to watch for changes. When the file changes,
  kill the IO worker and restart, picking up any changes. Use only in dev.
* `pool_size` - The size for the pool of workers - See poolboy `size`
* `max_overflow` - The poolboy `max_overflow`