Всем привет! Я продолжаю развивать свою библиотеку для создания распределённых приложений, которая уже легла в основу новой версии rats-search (распределённого торрент-поисковика) и, судя по всему, UltraVNC (VNC клиент).
Она позволяет развернуть собственную P2P-сеть, связать пользователей между собой и выстроить коммуникацию посредством различных потоков данных (бинарных, строковых и т.п.). Главная особенность — автоматическое обнаружение участников (peer discovery), что крайне актуально в условиях постоянных блокировок и сетевых ограничений.
На данный момент библиотека поддерживает языки C/C++, Android (Java), Python и Node.js.
Это очередное обновление и ещё большая стабилизация различных функций. Обо всём подробнее далее.
Последний стабильный релиз на сегодня — 1.0.0. Исходный код и бинарные файлы доступны для скачивания для:
Windows (64-bit)
Linux (64-bit)
Android (32-bit / 64-bit)
macOS (64-bit)
https://github.com/librats/librats/releases
Доступ к функционалу библиотеки организован через FFI (Foreign Function Interface).

Поддерживается следующие возможности:
Поиск пиров в сети — автоматическое обнаружение участников через DHT (совместим с BitTorrent Mainline DHT) для глобальной сети и через mDNS для локальной.
Обход NAT без настройки роутера — встроенная поддержка UPnP, NAT-PMP, ICE, STUN и TURN. Библиотека сама просит роутер пробросить порт, поэтому пиры за NAT могут принимать входящие соединения без ручной настройки.
Сквозное шифрование — протокол Noise (Curve25519 + ChaCha20-Poly1305) с автоматическим управлением ключами, взаимной аутентификацией и совершенной прямой секретностью.
Передача файлов — потоковая отправка файлов и целых папок с контролем целостности (CRC32 + SHA-256), возможностью паузы/возобновления/отмены и атомарной доставкой.
Масштабируемый обмен сообщениями — протокол GossipSub для публикации/подписки по темам с организацией сообщений и их фильтрацией.
Поддержка многих языков — единый API для C++, C, Node.js (с TypeScript), Java/Android и Python, работающий на Windows, Linux, macOS и Android.
Удобный API для разработчика — событийная модель (
on(),once(),off()), обмен сообщениями в JSON, отслеживание состояния соединений в реальном времени и гибкая система логирования.и т.п. :)
Ключевые изменения и исправления с момента выхода предыдущей статьи (в ней была версия 0.7.0), их было еще больше но тем не менее:
Исправлено определение порта в peer exchange для входящих подключений (раньше при обмене списками пиров мог попадать неверный порт)
Переход на I/O poller для списка клиентов
Поддержка IPv6 в DHT
Поддержка защиты от Sybil attack - BEP 42 - это так же улучшает связность сети с qbittorrent клиентами и другими современными реализациями DHT.
Поддержка протоколов UPnP и NAT-PMP для "пробивания" роутеров.
Детекция двойного NAT
Поддержка implied_port из BEP 5 для DHT
Поддержка ротации логов
Поддержка алгоритма vote для DHT
Network monitor — отслеживание изменений состояния сети (смена интерфейсов/адресов). Будет гораздо лучше чувствовать себя на android где это актуально.
Исправлен краш на macOS при коротком жизненном цикле и use-after-scope в Node.js-биндингах (спасибо Simon’s Hub)
Из интересного (о чём уже было сказано выше): обнаружил форк библиотеки для клиента UltraVNC — приятненько :).
На этом пока про библиотеку все, всем приятного использования. Теперь пару слов про ключевой клиент rats-search. Было много стабилизаций со времени прошлой версии.

Наконец стабилизировался запуск вместе с Manticore ( https://github.com/librats/rats-search/issues/244 ) - было очень много комментариев с этой проблемой.
Появилась возможность экспорта .torrent файлов. Восстановлена загрузка описаний с разных трекеров:

Ну и, соответственно, все фичи из librats тоже доступны. А, кстати, версия на macOS под ARM наконец-то работает как надо :)
Void-Cowboy
круто! не знал что такое есть причем довольно давно уже относительно
единое что - не хватает не зашифрованного режима для использования в закрытых сетях (по крайней мере не увидел в реадми)
например что бы если шарится через играсиль (то есть локальная сеть как выглядит для стороннего приложения) то оверхед на шифрование не нужен (да и в целом в локальной домашней сети можно напрямую отдавать)
DEgITx Автор
можно и отключить шифрование полностью если не нужно перед стартом:
вообще noise довольно эффективный, создает минимальный оверхед, но не нужен так не нужен :)