Sharing Service
Файл:
backend/src/services/sharing.rs
Сервис P2P-расшаривания. Управляет запуском/остановкой P2P-сети, обнаружением пиров, публикацией и приватным расшариванием пространств, а также запросом файлов и удалённых директорий.
Эндпоинты
| Метод | Путь | Функция | Описание |
|---|---|---|---|
| POST | /api/sharing/start | start_sharing_svc | Запустить P2P сеть |
| POST | /api/sharing/stop | stop_sharing_svc | Остановить P2P сеть |
| GET | /api/sharing/peers | get_sharing_peers_svc | Список известных пиров |
| POST | /api/sharing/publish | publish_space_svc | Опубликовать пространство (broadcast) |
| POST | /api/sharing/share | share_space_svc | Приватно расшарить пространство |
| POST | /api/sync/p2p/request | request_file_sync_svc | Запросить файл у пира (с resume) |
| POST | /api/sync/p2p/request-all | request_space_sync_svc | Запросить все файлы пространства (с resume) |
| POST | /api/sharing/remote-directory | request_remote_directory_svc | Запросить листинг директории |
Зависимости
SharingManager— оркестрация P2P sharing (обёртка над libp2p SharingService)EventBus— уведомления о P2P-событиях в UI
start_sharing_svc
POST /api/sharing/start
Запускает P2P сеть: инициализирует libp2p Swarm с mDNS, Noise, Yamux. Начинает обнаружение пиров и отправку Announce-сообщений.
Логика
- Захватывает lock на
SharingManager - Вызывает
start_sharing(event_bus)— поднимает libp2p Swarm в отдельном tokio task
stop_sharing_svc
POST /api/sharing/stop
Останавливает P2P сеть и отключается от всех пиров.
get_sharing_peers_svc
GET /api/sharing/peers
Возвращает список обнаруженных пиров с их identity, устройством и peer_id.
Возвращает
Result<Vec<KnownPeerInfo>, String>
publish_space_svc
POST /api/sharing/publish
Публикует пространство всем подключённым пирам (plaintext broadcast). Все пиры в сети получат метаданные пространства и списка файлов.
Параметры
| Имя | Тип | Описание |
|---|---|---|
space_id | String | ID пространства |
share_space_svc
POST /api/sharing/share
Приватно расшаривает пространство конкретной identity. Данные шифруются SealedEnvelope (hybrid X25519 fan-out + AES-256-GCM) — отдельный wrapped key на каждое устройство получателя.
Pre-condition:
target_identity_idдолжен присутствовать в локальной таблицеacquaintances(т.е. с этой identity уже состоялся meet — см. Meet Service). Иначе вызов возвращаетIdentityUnknown— pubkey недоступен, ECDH не может быть инициирован.
Параметры
| Имя | Тип | Описание |
|---|---|---|
space_id | String | ID пространства |
target_identity_id | String | ID целевой identity |
request_file_sync_svc
POST /api/sync/p2p/request
Запрашивает конкретный файл у пира по hash. Поддерживает resume: проверяет наличие .part файла и передаёт resume_offset в FileRequest. Пир отправляет оставшиеся чанки (FileChunk messages).
Параметры
| Имя | Тип | Описание |
|---|---|---|
space_id | String | ID пространства |
file_hash | String | Hash файла |
request_space_sync_svc
POST /api/sync/p2p/request-all
Запрашивает синхронизацию всех файлов пространства. Последовательно запрашивает каждый файл.
request_remote_directory_svc
POST /api/sharing/remote-directory
Запрашивает листинг директории на удалённом устройстве. Использует request-response паттерн с timeout 10 секунд.
Параметры
| Имя | Тип | Описание |
|---|---|---|
device_id | String | ID целевого устройства |
path | String | Путь к директории |
Возвращает
Result<Vec<RemoteFileEntry>, String>
Логика
- Вызывает
sharing_manager.request_directory_list()— получает oneshot receiver - Освобождает mutex
- Ожидает ответ с tokio timeout (10 сек)
- Возвращает список файлов или ошибку таймаута