Influence-cjdns/doc/ru/API.md
2018-05-09 15:34:53 +03:00

113 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Протокол обмена.
## Структура сети:
Связь между узлами - точка-точка
GUI - Сервер ==== Сервер - GUI
GUI - примитивная программа под Linux/Window/Android, которая умеет отображать сообщения и обмениваться с сервером.
Сервер - как правило сидит на localhost, принимает сообщения от GUI и переправляет на другой сервер.
В Windows/Linux GUI и серверная часть могут быть объединены.
Разделение GUI и Сервера позволяет также отправлять сообщения тем, кто оффлайн (например сервер крутится на роутере и он всё время online).
На сервере также хранится история переписки.
У сервера есть список контактов (друзей), в формате:
```json
{
"адрес1": { "nick":"", "last_online":"", "last_connect":"", "can_resend":1, "key":"", "other_info":... }
...
}
```
Поле адрес - это адрес сервера, куда отправляем. Может быть как ipv4, так и ipv6 адрес в сети cjdns.
## Протокол обмена
Обмен сообщениями ведётся по GET/POST http протоколу в формате JSON, что позволяет делать GUI прямо в браузере.
При любой успешной отправке данных обновляем поле last_connect у контакта.
Если пришло сообщение от контакта, которого нет в адресной книге - то оно отбрасывается.
Исключения - запрос handshake.
### Добавление в друзья
Используется, чтобы установить связь с контактом. Тот кто хочет добавиться в друзья - отправляет такой запрос.
```json
{ "action":"handshake", "nick": "" }
```
ответ:
```json
{ "status": 1 }
```
У другого абонента висит этот контакт в списке неавторизованных. Если он хочет его тоже добавить в друзья - отправляем ему свой handshake. Возможет вариант, когда сервер автоматически добавляет в друзья (публичный сервер для пересылки offline сообщений).
### Отправка сообщения
Структура сообщения в JSON:
```json
{ "action":"send", "from":"адрес", "to":"адрес", "message":"сообщение", "timestamp":"время", "enctype":"" }
```
ответ:
```json
{ "status": 1 }
```
Сообщение может быть зашифровано, метод шифрования в поле enctype.
Если нет ответа, то сохраняем сообщение у себя в истории, чтобы потом переотправить.
`status==1` - доставлено, другой - недоставлено (помечаем как недоставлено
### Пинг - проверка онлайна
Если прошло время больше чем last_connect + 1 минута, от отправляем запрос
```json
{ "action":"ping" }
```
ответ:
```json
{ "action":"pong" }
```
Если у нас есть сообщения для адреса и он онлайн (last_connect < 1 минуты), то передаём их
Если для этого адрес в базе есть недоставленные сообщения, то отправляем такой запрос:
```json
{ "action": "history", "messages":[{},{},{}...] }
```
ответ:
```json
{ "status":[1,1,1,0,1] }
```
В ответ приходит массив с 1 или 0. Если 1 - сообщение сохранено успешно, 0 - ошибка и его нужно потом переотправить.
### Отправление сообщения для другого абонента (это нужно чтобы отправлять тем, кто в offline)
Если человек, которому мы отправляем сообщение offline - то, во-первых, оно сохраняется у себя на сервере, для последующей отправки.
Во-вторых, можно попросить какого-то друга его переотправить. Для этого выбираем случайно несколько друзей из списка контактов, у которых `can_resend == 1` и отправляем им запрос.
Для ретрансляции можно также использовать свой сервер в интернете, нужно просто его добавить в контакты.
```json
{ "action":"resend", ... }
```
Параметры такие же как и для send
ответ
```json
{ "status":1 }
```
Если `status == 0` - то эта нода не желает пересылать сообщения и ей повторно отправлять не нужно.