# NodeJS

[![Build Status](](
[![License: MIT](](
[![Coverage Status](](

Provides an Elixir API for calling Node.js functions.

## Documentation

The docs can
be found at [](

## Prerequisites

- Elixir >= 1.6
- NodeJS >= 10

## Installation

def deps do
    {:nodejs, "~> 1.0"}

## Starting the service

Add `NodeJS` to your Supervisor as a child, pointing the required `path` option at the
directory containing your JavaScript modules.

supervisor(NodeJS, [[path: "/node_app_root", pool_size: 4]])

### Calling JavaScript module functions with `, args \\ [])`.

If the module exports a function directly, like this:

module.exports = (x) => x

You can call it like this:

```elixir"echo", ["hello"]) #=> {:ok, "hello"}

There is also a `call!` form that throws on error instead of returning a tuple:

```elixir!("echo", ["hello"]) #=> "hello"

If the module exports an object with named functions like:

exports.add = (a, b) => a + b
exports.sub = (a, b) => a - b

You can call them like this:

```elixir{"math", :add}, [1, 2]) # => {:ok, 3}{"math", :sub}, [1, 2]) # => {:ok, -1}

In order to cope with Unicode character it is necessary to specify the `binary` option:

```elixir"echo", ["’"], binary: true) # => {:ok, "’"}

### There Are Rules & Limitations (Unfortunately)

- Function arguments must be serializable to JSON.
- Return values must be serializable to JSON. (Objects with circular references will definitely fail.)
- Modules must be requested relative to the `path` that was given to the `Supervisor`.
  E.g., for a `path` of `/node_app_root` and a file `/node_app_root/foo/index.js` your module request should be for `"foo/index.js"` or `"foo/index"` or `"foo"`.

### Running the tests

  Since the test suite requires npm dependencies before you can run the tests you will first need to run

  cd test/js && npm install && cd ../..

  After that you should be able to run

  mix test