Ай-нане-нане
Тот самый цыганский сервер для тестового задания.
Запуск
Сервер уже доступен по адресу https://nane.tada.team.
Однако, если очень хочется, можно запустить его локально:
go get -u github.com/tada-team/nane
$HOME/go/bin/nane -kozma
Аргумент -kozma
включает встроенный тестовый аккаунт «Козьма Прутков», который создаёт себе комнату «kozma» и начинает
туда время от времени писать.
Факты
- на сервере есть N комнат-чатов, в которые может отправлять сообщения кто угодно;
- комната создаётся, как только кто-то пишет в неё сообщение;
- к серверу можно присоединиться под любым именем пользователя и отправлять сообщения без авторизации;
- всё тлен: в каждой комнате хранится ограниченное количество последних сообщений, при перезагрузке сервера вся история исчезает;
- поддерживается только текстовые сообщения. Удалять и изменять сообщения нельзя.
HTTP API
Все вызовы доступны без авторизации.
- Настройки сервера:
GET https://nane.tada.team/api/settings
- Список комнат:
GET https://nane.tada.team/api/rooms
- История сообщений:
GET https://nane.tada.team/api/rooms/{name}/history
Веб-сокеты
Соединение: wss://nane.tada.team/ws?username={username}
Клиент отправляет сообщения формата:
{
"room": string, // название комнаты. Если такой комнаты нет, она будет создана
"text": string, // текст сообщения
"id": string // необязательный идентификатор, можно назначить на клиенте, чтобы получить подтверждение получения сообщения сервером
}
Сервер отправляет сообщения формата:
{
"room": string,
"text": string,
"id": string, // если передан клиентом при отправке. Сам сервер этот id не назначает, не использует и не отдаёт в /history
"created": iso_datetime, // время создания сообщения
"sender": {"username": string} // информация об отправителе
}
Попингуй мне тут
В самом протоколе веб-сокетов уже есть механизм пингов. Но если хочется чего-то высокоуровневого, то клиент может послать:
{"ping": true}
...и сервер тут же должен ответить:
{"pong": true}
Если не ответил, то, вероятно, что-то не так с соединением (его нет).
Перепись!
Можно поставить звёздочку репозиторию, если понравилось.