Один протокол — семь языков: как Moq учит Python и Swift понимать друг друга
Один протокол — семь языков: как Moq учит Python и Swift понимать друг друга
Представьте: вы пишете скрипт на Python, который публикует видеопоток, а смотрит его приложение на Swift — и всё это работает без единой строчки склеек и костылей. Именно такую картину описывает open-source проект Moq: две основные реализации и семь языковых привязок, которые говорят на одном сетевом протоколе.
Звучит как мечта любого, кто хоть раз пытался подружить медиа-пайплайны на разных языках. Разбираемся, что там внутри.
Как это устроено
Базовая логика живёт в Rust — это референсная реализация, на ней построены все серверные инструменты. Отдельно есть TypeScript-версия, написанная с нуля для браузеров: она опирается на WebTransport и WebCodecs. А остальные семь привязок — Python, Kotlin, Swift, Go, Dart и C++ — генерируются из одного UniFFI-крейта moq-ffi и оборачиваются в идиоматичный для каждого языка слой. Для C сделали отдельный ABI, написанный руками.
Главная фишка в том, что новая функция, добавленная в ядро, появляется во всех привязках одновременно. Не нужно ждать, пока мейнтейнер Python-обёртки соизволит обновиться — всё синхронно по определению.
Что умеют все привязки
- Подключаться к релею с TLS и JWT прямо в URL — или поднимать сессии самостоятельно и принимать запросы по пути.
- Автоматически переподключаться с backoff, если транспорт отвалился.
- Искать трансляции по префиксу, ждать конкретную или запрашивать по пути.
- Публиковать и подписываться на медиа — либо готовыми кодеками (VideoToolbox, Media Foundation, NVENC, openh264, Opus), либо отдавая сырые пиксели и PCM и позволяя привязке всё закодировать.
- Работать с JSON-треками: последнее значение с merge-patch-дельтами, лог с append или скользящее окно записей.
Плюс сырые треки произвольных байтов с приоритетом и максимальной задержкой для каждого подписчика, отдельные live-датаграммы без кэширования и возможность вытащить один кэшированный групповой пакет по номеру.
Про производительность честно
Авторы не скрывают: обёртки добавляют накладные расходы. В бенчмарках сравнивают каждую привязку с rust-ffi — прямым вызовом из Rust. Коэффициент выше 1 означает, что обёртка дороже прямого вызова. Измеряют пропускную способность, CPU на байт и задержку синхронных вызовов. И справедливо напоминают: реальная производительность приложения — это ещё сеть, кодеки и собственная обработка, а не только переход через границу языка.
📖 Кстати, больше новостей, гайдов и разборов для разработчиков мы собираем в нашей рубрике IT и разработка на сайте Lamvi.Art. Заходите почитать!
Что это значит для нас
Если вы пишете медиа-сервис, где бэкенд на Python, мобильное приложение на Swift, а веб-клиент на TypeScript, — Moq снимает целый класс головной боли. Не нужно держать три разных стека с разными багами и разными фичами. Один протокол, одна логика, разные обёртки. Подробности и таблицу привязок можно посмотреть в документации проекта.
Конечно, идеального серебра нет: накладные расходы на границе языка реальны, и для высоконагруженных сценариев, вероятно, стоит смотреть в сторону Rust напрямую. Но как способ быстро собрать работающий прототип на любимом языке — это отличный вариант.
В мире, где все устали от зоопарка несовместимых SDK, проект, который генерирует привязки из одного ядра, выглядит как глоток свежего воздуха. Будем следить.
📌 Чтобы не пропустить новые публикации, подписывайтесь там, где вам удобнее: Дзен или MAX.
💛 Если статья оказалась полезной, поддержите автора донатом.
Материал подготовлен на основе информации из открытых источников. Все права на исходные материалы принадлежат их авторам. Если вы являетесь правообладателем и возражаете против использования материала, либо обнаружили неточность или имеете иное мнение о фактах, изложенных в статье, — напишите нам по адресу info@lamvi.art. Мы всегда открыты к диалогу и внимательно рассмотрим ваше обращение.