Metacom — RPC протокол

Сетевой протокол Metarhia: RPC + файлы + события через одно WebSocket-соединение. Транспорт скрыт от UI.

Что это

Metacom — это бинарно-агностичный протокол поверх любого транспорта (WebSocket, HTTP, HTTP/2, gRPC, WebRTC, MessagePort). Включает три типа пакетов: RPC-вызовы, передача файлов, события.

В версии 2025 добавлен 4-й тип: синхронизация state (для local-first).

Прозрачный RPC

// Клиент: вызывает как локальный метод
const stock = await api.warehouse.getStock(itemId);

// Сервер: applications/warehouse/api/getStock.js
module.exports = async ({ itemId }) => {
  return await db.stock.find(itemId);
};

UI не знает, что вызов идёт по сети. Введён слой абстракции, в котором даже про Metacom можно не знать.

Что умеет

  • RPC — вызов удалённых методов.
  • File transfer — стриминг файлов в обе стороны через тот же канал.
  • Event bus — pub/sub.
  • State sync (с 2025) — синхронизация состояния для local-first.
  • Мультиплексирование — всё через одно WebSocket-соединение.

Раньше vs сейчас

Было Стало
Metacom был только в Impress Metacom отвязан, работает на чистом Node
Только RPC RPC + файлы + события + state
2 WebSocket (RPC и sync) Одно соединение для всего

Минимальный сервер

const metacom = require('metacom');
const server = new metacom.Server(application, options);
server.listen(8000);
  • ~5.5 КБ кода без зависимостей кроме metacom.
  • Подключается к чистому Node HTTP-серверу — можно отдать в Fastify/Nest.

Транспорт-абстракция

  • Можно дописать любой транспорт: WebRTC, UDP, gRPC, MessagePort.
  • Уже есть: WebSocket (основной), HTTP, gRPC (от Георга), MessagePort (для Service Worker proxy).
  • Стандартный WebSocket-клиент из браузера работает out-of-the-box.

Клиентская сторона

// Загружаем интерфейс — клиент строится по introspection
await app.metacom.load('warehouse');
window.api = app.metacom.api;
// Вызываем
const result = await api.warehouse.getStock(123);

Клиент перестраивается через introspection — не пишется руками.

🎓 Источники

См. также