# ODIN Node JS

Native Node JS bindings for the ODIN SDK. It is based on the [ODIN Native SDK](https://github.com/4Players/odin-sdk) and
wraps the C++ code into a Node JS module.

Check out documentation and guides at [developers.4players.io](https://www.4players.io/odin/sdk/nodejs).

## Beta!

**This SDK is currently in beta. This means that the API is not final and might change in the future. It's also not ready
for production use as there might be bugs, memory leaks or other issues.** But it's good enough for testing AI 
integration, recording or other interesting use cases.

If you have any questions or feedback, please reach out to us at our [Discord Server](https://4np.de/discord).

## ODIN Node JS compared to Web SDK

We have a JavaScript/TypeScript SDK that has fallback code for WebRTC and can be used in the browser. While this also 
works on NodeJS (to some extent) it is not as performant as the native bindings and also has some limitations. 
For bots and other advanced use cases we provide this native Node JS SDK.

While we try to keep the API as similar as possible, there are some differences. While wrapping things in objects in 
JavaScript and TypeScript for better separating doing so in native C/C++ is harder and error prone. Therefore we decided
to only use C/C++ and objects where required. For example, the WebSDK provides an `OdinPeer` object that wraps various
methods and properties. For bots and other NodeJS use cases you typically don't need that and therefore we decided to 
not make things more complex than required. You typically only get a `peerId` and `mediaId` and that's it. But for most
use cases this is enough, and you are always free to build your own wrapper where required.

The most prominent difference is, that the NodeJS SDK allows you to get the raw audio data from the ODIN server. This
allows you to record audio or sending audio into the room. While the WebSDK provides a similar functionality it is based 
on Web Audio that is not available on NodeJS - therefore it does not make much sense to wrap and polyfill all of that while
it's super easy (and fast) to wrap the ODIN native SDK into NodeJS bindings.

Having two libs also allows us to optimize for each platform without having to work through many use cases.

## Prerequisites

You need to have a C++ compiler installed. On macOS, you can install XCode and the command line tools. On Linux you need
to have GCC installed. More information can be found here: [node-gyp](https://github.com/nodejs/node-gyp).

## Getting Started and compiling

Add the package to your project: 

```bash
npm install --save @4players/odin-nodejs
```

This will compile the NodeJS bindings for the "local" machine. We provide a few precompiled libraries so you don't need
to have GCC and compilers installed. This is especially useful for CI/CD pipelines.

## Dependencies

It has deps to the native ODIN SDK. A couple of libraries for typical use cases (i.e. macOS, Windows and Linux) is provided
in the `libs` folder. If you have some fancy platform, you might need to compile the ODIN SDK and put the lib in the
folder according this name scheme: `platform`-`arch`. 

## Examples

We provide a few examples in the `tests` folder to get you started quickly. 

