# Orion

[![Build Status][travis-image]][travis-url] [![Coverage Status][codecov-image]][codecov-url] [![NPM Version][npm-image]][npm-url]

Orion is a pluggable framework for microservices.

Following "batteries included but removable" design philosophy. Providing sane default implementations, but everything is swappable. Comes with built in support for various transports and codecs.

## Features

- **Async communication**: event driven architecture (pub/sub)
- **Sync communication**: request-response transport layer
- **RPC**: clean and simple interface to build services

## Components

- **Transport**: provides an interface for sync request/response communication
- **Codec**: used for encoding and decoding messages before transporting across the wire
- **Service**: provides an interface to name your service and register request handlers
- **Client**: provides an interface to make requests to services

### Built-in components

- **Transports**: NATS _(default)_
- **Codecs**: JSON _(default)_, MessagePack

## Example

Service:

```javascript
const orion = require('@betit/orion');

const service = new orion.Service('calc');

service.handle('add', (req, reply) => {
  reply(null, parseInt(req.params.a) + parseInt(req.params.b));
});

service.listen(() => {
  console.log(`Service started: ${service}`);
});
```

Client:

```javascript
const orion = require('@betit/orion');

const client = new orion.Client({ service: 'calc' });

client.call('add', { a: 3, b: 2 }, (err, res) => {
  console.log(err, res);
  client.close();
});
```

Check out the [examples](examples) folder for more examples.

## Development

```
$ docker run -p 4222:4222 -p 8222:8222 -d nats
$ npm install
$ npm test
```

## License

[MIT](LICENSE)

[travis-image]: https://img.shields.io/travis/betit/orion.svg
[travis-url]: https://travis-ci.org/betit/orion
[codecov-image]: https://img.shields.io/codecov/c/github/betit/orion.svg
[codecov-url]: https://codecov.io/gh/betit/orion
[npm-image]: https://img.shields.io/npm/v/@betit/orion.svg
[npm-url]: https://www.npmjs.com/package/@betit/orion
