bythe.net
← К ленте
Проект

Sendfile.space — прямая передача файлов между двумя устройствами через браузер

Без серверов, без ограничений, на максимальной скорости!

82f565c1-e5ff-434c-a8e0-e2cf2e5aca13

Привет, By The Net!

Так уж вышло, что в процессе работы мне регулярно приходится передавать файлы между устройствами из разных экосистем: Android → iOS, Windows → macOS и так далее.

Когда возникает такая потребность — что вы делаете? Либо заливаете файл в облако, либо отправляете его себе через мессенджер. Так вам, наверное, ответят 9 из 10 человек.

Я тоже так делал. И постепенно начал страдать от низких скоростей и необходимости проделывать довольно много действий вручную.

В какой-то момент мне это окончательно надоело. Я подумал: ну что за глупость — передавать файл самому себе через облако, расположенное на другом континенте?

Поднимать файлопомойку дома я решительно не хотел, поэтому остановился на P2P-передаче через WebRTC. Сервер для хранения файлов в таком случае вообще не нужен, а если устройства находятся в одной локальной сети, то скорость должна быть практически ограничена самой сетью.

Сказано — сделано.

За вечер был написан каркас sendfile.space, который умел передавать файлы между любыми устройствами напрямую.

Весь проект написан на чистом JavaScript. Чтобы не арендовать отдельный сервер под сигнальный сервер и не заниматься его масштабированием, я поднял сигналинг на Cloudflare Workers. Получилась довольно простая схема: Edge-инфраструктура занимается только установлением соединения, а сам файл между ней вообще не проходит.

Потом я немного подумал и решил, что вручную копировать идентификаторы сторон обмена тоже как-то глупо. Поэтому на сайте появился QR-код: один телефон сканирует его с экрана другого устройства — и соединение устанавливается автоматически.

А потом я ещё немного подумал и понял, что если мне нужно передать файл с ноутбука на телефон, то сканировать ноутбуком QR-код на экране телефона, мягко говоря, неудобно.

Так родился режим «Флип».

В нём устройства можно поменять ролями: QR-код сканируется телефоном с экрана ноутбука, устройства связываются, но отправить файл после этого можно с телефона на ноутбук.

И тут я впервые задумался: а кому ещё, кроме меня, это может быть нужно?

И сразу вспомнил места, где мне самому приходилось отправлять файлы по email или через мессенджеры, хотя нужный компьютер стоял буквально в метре от меня.

Копицентры, муниципалитеты, налоговая, поликлиники, стоматологии и прочие места, где человеку регулярно нужно передать сотруднику PDF, фотографию или скан документа.

Для такого сценария всё получилось неожиданно удобно: один раз распечатал QR-код, повесил его рядом с рабочим местом — и посетители могут отправлять файлы со своего телефона прямо на компьютер сотрудника.

Причём здесь уже появилась новая проблема. Для одного человека схема «телефон → компьютер» работает отлично, но что делать, если одновременно стоят несколько посетителей?

Поэтому приёмник научился принимать файлы сразу от нескольких передатчиков и делать это параллельно.

А что с NAT?

В идеальном мире WebRTC всегда устанавливает прямое соединение между устройствами.

В реальном мире всё немного веселее. Некоторые сети, особенно мобильные, используют такие варианты NAT, при которых прямое соединение установить не получается.

Поэтому я добавил TURN — промежуточный сервер, через который трафик проходит в тех случаях, когда P2P не срабатывает.

В итоге получается два режима:

  • P2P — файл идёт напрямую между устройствами;
  • TURN — если напрямую не получилось, трафик идёт через промежуточный сервер.

А что со скоростью?

В моей локальной сети между двумя ноутбуками я получал примерно 25–30 МБ/с.

Через TURN — около 2–5 МБ/с. Сейчас мой TURN-сервер находится в Германии, поэтому рекордов скорости от него я и не ожидал.

При этом главное для меня не скорость сама по себе, а то, что в нормальном сценарии файл вообще не нужно сначала куда-то загружать.

Я делал всё это исключительно для себя. Но раз уж получилось достаточно универсально, можете пользоваться и вы:

https://sendfile.space

Если найдёте баг — буду рад узнать. Если придумаете ещё один сценарий, где такая штука оказывается полезной, — тем более.

Войти, чтобы оценить материал

Комментарии

Войти, чтобы оставить комментарий