# Сервисы шлюза

### Proxy
Единая точка входа для http и websocket

### Fastify
Один из вариантов коммуникации с клиентами и сторонними сервисами - веб сервер [Fastify](https://www.fastify.io/).
Сервис-обвертка инициализирет библиотеку fastify c расширениями: `@fastify/cors, @fastify/swagger, @fastify/swagger-ui, @fastify/multipart`.
В отличии от оригинального Fastify, сервис позволяет динамически добавлять и удалять новые маршруты без прерывания работы запущенных запросов после запуска сервера.
Также реализована плавная(greceful) остановка сервиса.

Для начала, надо добавить пакет из corelibs:
```
npm install ./corelibs/fastify
```
Пример работы с Fastify:
```javascript

import {Fastify} from  '@morphcluster/fastify'
...
//Добавление Fastify к хосту
let fastify = new Fastify( host, {"host" : "127.0.0.1", "port" : 80} )
host.addService(fastify)
...
//Добавление маршрута, в формате fastify
fastify.addRoute({...})
//Запуск пересоздания машрутов, чтобы отобразились изменения. Начатые вызовы сброшены не будут
await fastify.restart()
```
Формат для добавления новых маршрутов можно посмотреть в [официальной документации](https://www.fastify.io/docs/latest/Reference/Routes/#full-declaration)

### Gateway
Шлюз это HTTP сервер, который позволяет общаться из внешней среды с сервисами. Чтобы запрос сервиса был доступен через шлюз, надо описать его схеме, что он доступен во внешнем контуре. Также внешний контур проверяет наличие сессии. При отсутствии сессии будут работать только анонимные методы.

Чтобы публичные запросы сервисов хоста были доступны по http(s), можно воспользоваться сервисом Gateway. Он автоматически обнаружит запросы сервиса к публикации и создаст маршруты.

```javascript
import {ServiceHost} from '@morphcluster/core'
import {Fastify,FastifyRest} from  '@morphcluster/fastify'
...
//Fastify - зависимость FastifyRest
host.addService(new Fastify( host, {"host" : "127.0.0.1", "port" : 80} ))
//Добавление FastifyRest
host.addService(new FastifyRest( host ))
//Для публикации, сервис должен обязателно быть добавлен в ServiceHost
host.addService(new Test())
```
Проверить работу можно будет по ссылке `http://127.0.0.1/documentation`. Там автоматически разворачиватся OpenApi/Swagger со всеми доступными маршрутами.
Вызов, производимый извне имеет проверку доступа, при этом запросы между сервисами не замедляются этой проверки, сессия передается напрямую.

### Sessions
Сессии соответственно хранят информацию о доступе, подтвержденную токеном. Токен создается при авторизации или иным способом. Пользователю или внешнему сервису нужен токен для взаимодействия с системой через шлюз. Система через него идентифицирует пользователя. Сессия может быть определена как привилегированная(isAdmin), что расширяет возможности такого пользователя.

### Auth

### Eventer

### Bridge
<span lang="ru-RU"><span style="font-weight: normal;">Мост. Мост позволяет общаться привилегированным </span></span><span lang="ru-RU"><span style="font-weight: normal;">сессиям</span></span><span lang="ru-RU"><span style="font-weight: normal;"> с внутренним контуром, недоступным через шлюз.</span></span>