Архитектура
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 · Дорожная карта