Skip to content

Sharing Service

Файл: backend/src/services/sharing.rs

Сервис P2P-расшаривания. Управляет запуском/остановкой P2P-сети, обнаружением пиров, публикацией и приватным расшариванием пространств, а также запросом файлов и удалённых директорий.

Эндпоинты

МетодПутьФункцияОписание
POST/api/sharing/startstart_sharing_svcЗапустить P2P сеть
POST/api/sharing/stopstop_sharing_svcОстановить P2P сеть
GET/api/sharing/peersget_sharing_peers_svcСписок известных пиров
POST/api/sharing/publishpublish_space_svcОпубликовать пространство (broadcast)
POST/api/sharing/shareshare_space_svcПриватно расшарить пространство
POST/api/sync/p2p/requestrequest_file_sync_svcЗапросить файл у пира (с resume)
POST/api/sync/p2p/request-allrequest_space_sync_svcЗапросить все файлы пространства (с resume)
POST/api/sharing/remote-directoryrequest_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-сообщений.

Логика

  1. Захватывает lock на SharingManager
  2. Вызывает start_sharing(event_bus) — поднимает libp2p Swarm в отдельном tokio task
plantuml Diagram

stop_sharing_svc

POST /api/sharing/stop

Останавливает P2P сеть и отключается от всех пиров.

plantuml Diagram

get_sharing_peers_svc

GET /api/sharing/peers

Возвращает список обнаруженных пиров с их identity, устройством и peer_id.

Возвращает

Result<Vec<KnownPeerInfo>, String>

plantuml Diagram

publish_space_svc

POST /api/sharing/publish

Публикует пространство всем подключённым пирам (plaintext broadcast). Все пиры в сети получат метаданные пространства и списка файлов.

Параметры

ИмяТипОписание
space_idStringID пространства
plantuml Diagram

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_idStringID пространства
target_identity_idStringID целевой identity
plantuml Diagram

request_file_sync_svc

POST /api/sync/p2p/request

Запрашивает конкретный файл у пира по hash. Поддерживает resume: проверяет наличие .part файла и передаёт resume_offset в FileRequest. Пир отправляет оставшиеся чанки (FileChunk messages).

Параметры

ИмяТипОписание
space_idStringID пространства
file_hashStringHash файла
plantuml Diagram

request_space_sync_svc

POST /api/sync/p2p/request-all

Запрашивает синхронизацию всех файлов пространства. Последовательно запрашивает каждый файл.


request_remote_directory_svc

POST /api/sharing/remote-directory

Запрашивает листинг директории на удалённом устройстве. Использует request-response паттерн с timeout 10 секунд.

Параметры

ИмяТипОписание
device_idStringID целевого устройства
pathStringПуть к директории

Возвращает

Result<Vec<RemoteFileEntry>, String>

Логика

  1. Вызывает sharing_manager.request_directory_list() — получает oneshot receiver
  2. Освобождает mutex
  3. Ожидает ответ с tokio timeout (10 сек)
  4. Возвращает список файлов или ошибку таймаута
plantuml Diagram