studio/vite.config.js
min 412bb2fad9
All checks were successful
CI / Lint (pull_request) Successful in 2m43s
CI / Build (pull_request) Successful in 1m57s
CI / Secret scan (pull_request) Successful in 1m21s
CI / PR size check (pull_request) Successful in 8s
CI / Deploy to S1 + S2 (pull_request) Has been skipped
feat(rbxl-import): студия исполняет импортированные Roblox-Lua скрипты
Сегодня доведены до играбельного состояния:
- UI модалка импорта подключена в KubikonStudio (кнопка для МИНа в навигации)
- Converter: SCALE 0.35 (карта пропорциональна R15-персонажу),
  playerModelType='skin_bacon-hair', Lua упакован в поле code с маркером
  // @roblox-lua (storys API сохраняет только {id,code,target,name})
- vite.config: api+статика через rublox.pro/minecraftia-school.ru
- GameRuntime: распознаёт маркер, запускает через RobloxLuaSandbox
  + wasmoon Worker. Фильтрация: target!=null + lua<2500б +
  лимит 50 sandbox'ов (WASM OOM при >50 VM)
- roblox-shim: nullStub (Proxy с no-op методами) вместо null
  для FindFirstChild/WaitForChild — цепочки не падают
- require() заменён на nullStub
- RobloxLuaSandbox: совместимость с интерфейсом ScriptSandbox
  (sendGlobalEvent/SceneSnapshot/etc — no-op заглушки)
- RobloxLuaWorker: pcall обёртка над user-кодом
- remoteDevlog.js + /devlog endpoint: автосбор browser-логов
- PlayerController._loadSkinManifest: dev-fallback на studio.rublox.pro

Тест на Easy Obby:
- 8205 instances → 2245 primitives + 742 Lua-scripts
- 50/742 Lua-VM запущены (KillBrick handlers и т.п.),
  151 отфильтровано как admin/chat services, 541 пропущено по памяти
- Скин bacon-hair виден, FPS 20-25
- Сцена играется, можно ходить, прыгать

TODO (следующая итерация):
- Single-VM mode для wasmoon (один Lua-state на 742 скрипта,
  убрать WASM OOM)
- Реализовать select/focus в иерархии для импортированных карт
- Touched events от Babylon impostor → Lua-shim сигналы
- Поддержка GUI (ScreenGui/Frame/TextLabel) в конвертере

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-07 21:13:16 +03:00

68 lines
2.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { defineConfig, loadEnv } from 'vite';
import react from '@vitejs/plugin-react';
// Vite-конфиг студии Рублокса.
//
// - порт 5174 фиксирован (плеер на 5173, чтобы можно было гонять оба
// проекта параллельно на одной машине)
// - outDir 'build' (деплоится в nginx /var/www/rublox-studio/build/)
// - manualChunks: babylon/monaco/colyseus в отдельные чанки
// (movie engine ~46к строк + monaco ~5МБ — без разделения тормозит)
// - define для process.env.NODE_ENV — шим для engine-кода
// - dev-proxy по умолчанию на staging (dev-api.rublox.pro);
// переопределяй через VITE_API_PROXY_TARGET если нужно свой бэкенд.
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd(), '');
const PROXY_TARGET = env.VITE_API_PROXY_TARGET || 'https://dev-api.rublox.pro';
// Префиксы которые проксируем на бэкенд.
// Для prod-target (minecraftia-school.ru) — режем напрямую на S2 IP (85.175.6.22),
// т.к. на S1 user-service остался старый JWT_SECRET после ротации 2026-06-04,
// и токены выданные S2 на S1 не валидируются.
const proxyPrefixes = ['/api-user', '/api-storys', '/api-game'];
const isProdTarget = PROXY_TARGET.includes('minecraftia-school.ru');
const proxyOpts = {
target: PROXY_TARGET,
changeOrigin: true,
secure: true,
ws: true,
};
const proxy = Object.fromEntries(proxyPrefixes.map((p) => [p, proxyOpts]));
// /api-rbxl — отдельный target (VM 130 rbxl-importer на S1).
// В dev: ходим напрямую через CF DNS (proxied=false → 85.175.7.40 → NPM → VM 130).
proxy['/api-rbxl'] = {
target: env.VITE_RBXL_PROXY_TARGET || 'http://api-rbxl.rublox.pro',
changeOrigin: true,
secure: false,
rewrite: (path) => path.replace(/^\/api-rbxl/, ''),
};
// Вся статика (kubikon-assets, assets, wiki, dev-*.json) лежит в public/ —
// vite сама отдаёт. Никаких proxy не нужно. См. setup-public.ps1 если папок нет.
return {
plugins: [react()],
server: {
host: '127.0.0.1',
port: 5174,
strictPort: true,
proxy,
},
build: {
outDir: 'build',
sourcemap: false,
rollupOptions: {
output: {
manualChunks: {
babylon: ['@babylonjs/core', '@babylonjs/loaders'],
monaco: ['@monaco-editor/react'],
colyseus: ['colyseus.js'],
},
},
},
},
define: {
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development'),
},
};
});