README.md

# ElixirV8

V8 engine for [Elixir](http://elixir-lang.org/) with pools.

## Examples

Application start:

```
ElixirV8.start
```
or add it in `application` section in mix:

```
def application do
  [mod: {Example, []},
   applications: [ :elixir_v8 ] ]
end
```

### Create pools

```
ElixirV8.create_pool(:default, 10)
```

Where `:default` is name of pool and `10` is size of pool.

Also you can configure ElixirV8 directly from configuration file to get pools automatically created at application startup. In `config/config.exs`, add :

```
config :elixir_v8, pools: [
  test_pool:   [{:size, 10}],
  test_pool_2: [{:size, 20}]
]
```

#### Load js libs to v8

You also can load js libs to each v8 engine in pool:

```
js_undescore_lib = Mix.Project.app_path <> "/priv/underscore-min.js"

ElixirV8.create_pool(:main, 10, [{:file, js_undescore_lib}])
```

Using config in mix:

```
js_undescore_lib = Mix.Project.app_path <> "/priv/underscore-min.js"
js_other_lib = Mix.Project.app_path <> "/priv/some-another-lib.js"

config :elixir_v8,
  pools: [
    main: [
      {:size, 10},
      {:max_overflow, 10},
      {:file, js_undescore_lib},
      {:file, js_other_lib}
    ]
  ]

```

### Delete pools

```
ElixirV8.delete_pool(:default)

ElixirV8.delete_pool(:test)
```

### Usage

Usage of pools (`eval` js code):

```
iex(2)> ElixirV8.eval({:global, :main}, "1+2")
{:ok, 3}
iex(3)> ElixirV8.eval({:global, :main}, "1+2+3")
{:ok, 6}
```

Method `eval_function` is execute function body with some arguments:

```
iex(4)> ElixirV8.eval_function({:global, :main}, "return data + 13", [13])
{:ok, 26}
iex(6)> ElixirV8.eval_function({:global, :main}, "return data * 13", [20])
{:ok, 260}
iex(8)> ElixirV8.eval_function({:global, :main}, "return arguments[0] * arguments[1]", [20, 5])
{:ok, 100}
```

## Contributing

1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request