Metacom — RPC через WebSocket

Транспортно-независимый RPC из стека Metarhia. Один контракт — много транспортов (HTTP, HTTPS, HTTP/2, WebSocket, gRPC, WebRTC).

Что это

Metacom — протокол RPC от автора а. Идея: API на сервере — это набор асинхронных функций. Транспорт выбирается отдельно (HTTP для запросов, WebSocket для подписок, gRPC между сервисами). Бизнес-код один и тот же.

Архитектура

┌──────────────────┐         ┌──────────────────┐
│ Клиент (browser) │◄──ws───►│ Metacom-server   │
│  api.users.find│         │  api/users/find.js│
└──────────────────┘         └──────────────────┘
        ▲                            ▲
        │ transport-agnostic         │
        └─── одно и то же API ───────┘
  • Клиент строит зеркало API динамически.
  • Server цепляется к чистому http.Server (HTTP + Upgrade WebSocket).
  • Транспорты — pluggable: ws, HTTP, gRPC (Георг), WebRTC.

API / Пример (server)

// api/users/find.js
module.exports = async ({ id }) => {
  return await db.users.findById(id);
};

// server.js — ~50 строк
const http = require('http');
const { Server } = require('metacom');
const server = new Server({ /* config */ });
server.bind(http.createServer).listen(8000);

Ключевые свойства

  • Чистая нода + 1 dependency — без Express/Fastify.
  • Мультиплексация стримов в одном TCP — несколько вызовов параллельно.
  • Сессии и подписки на одном соединении.
  • Серверная инициация — сервер может вызвать процедуру на клиенте.
  • Один и тот же RPC внутри слоёв — изолирует не только клиент/сервер, но и любые абстрактные слои.

Производительность / Подводные камни

  • Не SOAP/JSON-RPC — свой формат с компактной сериализацией.
  • Свой WebSocket-сервер в новых версиях — потому что ws ломает контракт между релизами.
  • Service Worker + Metacom — прокси между вкладками; событийная шина через broadcast channel.
  • GraphQL рядом — можно использовать GraphQL для query, Metacom для realtime событий.
  • Vibe-coding с LLM работает лучше, если инфраструктура уже написана: модель пишет только бизнес-логику.

🎓 Источники

  • 🎓 Metacom — сеть прозрачна для API при выборе транспорта · 2025-12-11

    • Тезисы: Metacom отвязывается от Impress; своя реализация WebSocket-сервера; части стека можно использовать без всей инфраструктуры; прокси Metacom в Service Worker для объединения вкладок; мультиплексация стримов; рассылка всем кроме набора получателей.
    • Цитата: «Часть API остаётся на GraphQL, а рядом открыли WebSockets — синхронизируется стейт.»
  • 🎓 Сервер на Node.js c RPC через Websocket — протокол Metacom (Claude Sonnet 4.6) · 2026-03-06

    • Тезисы: сервер на чистой ноде с одной зависимостью Metacom; ~5.5 КБ кода; интеграция с Fastify/Nest через http.createServer; уже есть gRPC-транспорт (Георг); универсальный RPC между слоями; LLM эффективнее когда инфраструктура готова.
    • Цитата: «Это становится универсальным средством, которое изолирует не только клиент от сервера, но и взаимодействие любое между абстрактными слоями.»
  • 🎓 Ревью кода Websocket для Node.js и протокола metacom · 2025-08-30

    • Тезисы: бинарный фрейм быстрее текстового; ping/pong для keep-alive; terminate зависших соединений.

См. также