Skip to content
Logo

Архитектура

RedSpaceM SDK — набор небольших сфокусированных TypeScript-пакетов, которые лежат между логикой вашего гейммода и платформой RedSpaceM. Сама платформа разделена на два мира:

┌──────────────────────────────────────────────────────────┐
│  Ваш гейммод (TypeScript-ресурс)                         │
│  packages/@redspacem/*  ←  ЭТОТ РЕПОЗИТОРИЙ              │
└───────────────────────────┬──────────────────────────────┘
                            │  mp.* host API (внедряется в рантайме)
┌───────────────────────────▼──────────────────────────────┐
│  Ядро сервера RedSpaceM (Rust, закрытый исходный код)    │
│  скриптовый хост · ECS · сеть · голос · ассеты · …       │
└──────────────────────────────────────────────────────────┘

Слои SDK

Пакеты образуют тонкий стек с минимальными зависимостями. Каждый слой знает только о слое под ним:

        ┌─────────────────────────────────────────────┐
        │  testing  (моки для локальных юнит-тестов)  │
        │  client-types · browser-types (клиент/UI)   │
        │  di         (связывание)  rpc (транспорт)   │
        └──────────────┬──────────────────────────────┘
        ┌──────────────▼──────────────────────────────┐
        │  server-types  — контракт `mp.*`            │
        │  (игроки, транспорт, события, команды)      │
        └─────────────────────────────────────────────┘
  • @redspacem/server-types — фундамент. Объявляет типизированные контракты Mp, MpPlayer, MpVector3, MpVehicle, MpEvents/MpEventMap и MpCommands, а также небольшие чистые хелперы (clamp, distance, isValidCommandName). Без рантайм-зависимостей: поверхность типов + крошечные утилиты.

  • @redspacem/rpc — транспорт-агностичный RPC-слой. RpcServer обрабатывает «сырые» JSON-запросы, RpcClient отправляет запросы через внедряемый RpcTransport и сопоставляет ответы по id, а createTypedRpc превращает таблицу методов в строго типизированный фасад. Сам транспорт абстрактен: в проде он будет привязан к RPC-каналу хоста; в тестах — это транспорт в памяти из @redspacem/testing.

  • @redspacem/di — мини-контейнер dependency injection (register/registerValue/resolve/has) с ленивыми синглтонами. Используется для связывания сервисов внутри ресурса без фреймворков.

  • @redspacem/client-types — аналог server-types для клиентских скриптов, работающих в игре (в стиле RED4ext): camera, input, render, шина событий, а также хелпер lerp. Зависит от server-types (реэкспортирует MpVector3).

  • @redspacem/browser-types — типы и фабрика для CEF/NUI-мостов: типизированный канал сообщений между игровыми скриптами и браузерными поверхностями.

  • @redspacem/testing — dev-хелперы: createMockMp создаёт mock, соответствующий Mp (шина событий, реестр команд, запись логов в памяти); createMemoryTransport связывает RpcClient и RpcServer в памяти. Так вы юнит-тестируете гейммод без запущенного сервера.

Как SDK связан с (закрытым) Rust-ядром

Ядро RedSpaceM — Rust-сервис, владеющий игровым миром, сетевым транспортом и персистентностью. Оно предоставляет скриптовый хост TypeScript-ресурсам:

  • При загрузке ресурса хост внедряет глобал mp, соответствующий @redspacem/server-types. Ваш код не импортирует рантайм-mp — это типизированный глобал из песочницы.
  • События хоста (playerJoin, playerLeave, chatMessage, playerSpawn, …) приходят на mp.events и типизированы через MpEventMap.
  • Команды, зарегистрированные через mp.commands, диспатчит хост.
  • Долгие или сквозные вызовы могут идти через RPC-слой, который хост мостит к своим внутренним сервисам.

Отображение контракт-первое: SDK задаёт формы, хост их реализует, а @redspacem/testing даёт точную подмену для разработки.

Заметка про M4 (скриптовый хост)

Милстоун скриптового хоста (M4 в дорожной карте платформы) — момент, когда ядро начнёт исполнять TypeScript-ресурсы. SDK спроектирован под этот хост: пакеты созданы и протестированы до выхода хоста, поэтому гейммоды, написанные сегодня по контрактам, можно сразу юнит-тестировать, а после релиза хоста они заработают на нём.

Почему Bun

SDK разрабатывается, линтится, тип-чекается и тестируется с Bun (workspaces, bun test, Biome, TypeScript). Сами пакеты публикуются как обычный ESM JavaScript + .d.ts декларации и не содержат Bun-специфичных рантайм-API, поэтому работают в любом современном JS-окружении с поддержкой ESM.

Дальше: Справочник API · Дорожная карта