Metacom — транспорт-независимый RPC

Главная идея Metacom: UI и бизнес-логика вызывают API одинаково — независимо от того, какой транспорт под капотом (WebSocket, HTTP, WebRTC, MessagePort, UDP).

Идея

Везде в индустрии транспорт пробивается в API: REST требует методы и URL, GraphQL — Query/Mutation, gRPC — protobuf-схему. Поменять транспорт — переписать клиент.

Metacom: вызов выглядит как локальный async-метод. Что под капотом — деталь реализации.

const stock = await api.warehouse.getStock(itemId);

В этой строке нет HTTP, нет URL, нет WebSocket. Транспорт меняется — строка та же.

Уровни абстракции

UI (React/Vue/...)
  ↓
api.warehouse.getStock(123)     ← UI не знает про Metacom
  ↓
Metacom proxy                    ← выбирает транспорт
  ↓
WebSocket / HTTP / WebRTC / MessagePort

Реальные транспорты

  • WebSocket — основной, bidirectional, long-lived.
  • HTTP/HTTPS — для legacy и REST-совместимости.
  • HTTP/2 и HTTP/3 — приедут вместе с Node.js.
  • gRPC — транспорт от Георга (контрибьютор).
  • WebRTC — для P2P (можно прикрутить).
  • MessagePort — для общения с Service Worker (как прокси к WebSocket).
  • UDP — можно дописать.

Зачем

  1. Локально работаешь как с локальным модулем — потом включаешь сеть, ничего не меняется.
  2. Меняешь транспорт без переписывания UI — нужен P2P? Подменили WebSocket на WebRTC.
  3. Mock/stub в тестах тривиален — Metacom-транспорт может быть просто заглушкой.
  4. Один WebSocket мультиплексируется — RPC, файлы, события, state — всё в одном соединении.

Изоляция слоёв

Metacom изолирует не только клиент/сервер, но и любые абстрактные слои. UI ↔ business-logic ↔ storage — каждое взаимодействие можно завернуть в Metacom.

Цитата

«Это таким образом становится универсальным средством, которое изолирует не только клиент от сервера или бизнес-логику от того места, откуда она вызывается. Но еще можно взаимодействие любое между абстрактными слоями.»

Сравнение

REST GraphQL gRPC Metacom
URL/method видны да да нет нет
Транспорт HTTP HTTP/WS HTTP/2 любой
Один канал для всего нет нет нет да
Клиент пишется руками да сгенерён сгенерён introspection

🎓 Источники

См. также