vimp-engine 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  VIMP — движок-приложение: мастер (лобби, WebRTC-сигналинг), P2P-транспорт,
4
4
  Worker-хост, мета-модули матча, MVC-каркас клиента. Игровые правила
5
- (например, `@vimp/tanks`) подключаются динамически через
5
+ (например, `@vimp-games/tanks`) подключаются динамически через
6
6
  [plugin-api](https://github.com/lgick/vimp/blob/main/docs/en/plugin-api.md)
7
7
  — этот пакет их не содержит.
8
8
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vimp-engine",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "VIMP — движок-приложение (мастер, P2P-транспорт, Worker-хост, мета, MVC-каркас клиента)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -9,6 +9,9 @@
9
9
  },
10
10
  "homepage": "https://github.com/lgick/vimp#readme",
11
11
  "type": "module",
12
+ "engines": {
13
+ "node": ">=20.11.0"
14
+ },
12
15
  "exports": {
13
16
  "./lib/*": "./src/lib/*",
14
17
  "./config/*": "./src/config/*",
@@ -20,20 +23,24 @@
20
23
  "src/host"
21
24
  ],
22
25
  "scripts": {
26
+ "predev": "node scripts/sync-pixi-vendor.mjs",
23
27
  "dev": "NODE_ENV=development nodemon src/master/main.js -w src/master -w src/lib -w src/config",
24
28
  "start": "NODE_ENV=production node --env-file ../../.env src/master/main.js",
25
- "build": "vite build"
29
+ "prebuild": "node scripts/sync-pixi-vendor.mjs",
30
+ "build": "vite build",
31
+ "postbuild": "node scripts/check-importmap-csp-hash.mjs"
26
32
  },
27
33
  "dependencies": {
28
34
  "express": "^5.1.0",
35
+ "pixi.js": "8.19.0",
29
36
  "uuid": "^13.0.0",
30
37
  "vite-express": "^0.21.1",
31
38
  "ws": "^8.18.3"
32
39
  },
33
40
  "devDependencies": {
41
+ "esbuild": "0.27.7",
34
42
  "howler": "^2.2.4",
35
43
  "nodemon": "^3.1.10",
36
- "pixi.js": "^8.14.0",
37
44
  "vite": "^7.1.11",
38
45
  "vite-plugin-pug": "^0.4.1"
39
46
  }
@@ -4,8 +4,16 @@
4
4
  // (см. docs/en/auth.md).
5
5
  export default {
6
6
  // базовый URL центрального auth-сервиса (packages/auth). Дефолт — dev-порт
7
- // из packages/auth/src/config/auth.js
8
- serviceUrl: 'http://localhost:3010',
7
+ // из packages/auth/src/config/auth.js; в проде подставляется Vite'ом из
8
+ // VITE_AUTH_SERVICE_URL (см. Dockerfile — тот же VIMP_AUTH_SERVICE_URL,
9
+ // что и серверный master/main.js), никакой ручной правки перед сборкой
10
+ // больше не требуется. Этот модуль импортируется и серверным
11
+ // master/main.js под чистым Node, где import.meta.env не определён —
12
+ // typeof-guard нужен, иначе TypeError роняет мастер на старте (502)
13
+ serviceUrl:
14
+ (typeof import.meta.env !== 'undefined' &&
15
+ import.meta.env.VITE_AUTH_SERVICE_URL) ||
16
+ 'http://localhost:3010',
9
17
 
10
18
  // включённые провайдеры (должны совпадать с packages/auth config.oauth)
11
19
  providers: ['github'],
@@ -74,19 +74,6 @@ export default {
74
74
  fieldsId: 'lobby-fields',
75
75
  },
76
76
 
77
- // движковые подсказки генератору формы комнаты (только движковые ключи
78
- // roomDefaults; игровые поля выводятся из типа значения)
79
- form: {
80
- // тайм-ключи движка: в roomDefaults хранятся в мс, в форме — секунды
81
- secondsKeys: ['roundTime', 'mapTime'],
82
- // атрибуты числовых полей (в единицах формы)
83
- attrs: {
84
- maxPlayers: { min: 1 },
85
- roundTime: { min: 10, max: 3600 },
86
- mapTime: { min: 10, max: 3600 },
87
- },
88
- },
89
-
90
77
  // создание комнаты (хост в этой же вкладке); лимит игроков/время
91
78
  // раунда-карты/огонь по своим/карта по умолчанию — из roomDefaults
92
79
  // манифеста активной игры (Этап 6.3), не бандлятся здесь
@@ -26,7 +26,7 @@ export default {
26
26
  // используется GameCatalog напрямую, это опорная точка для проверки версии
27
27
  // при деплое (Этап A4). В проде переопределяется переменной окружения
28
28
  // GAMES_MATRIX (JSON), см. master/main.js
29
- games: [{ id: 'tanks', package: '@vimp/tanks', version: '0.1.0' }],
29
+ games: [{ id: 'tanks', package: '@vimp-games/tanks', version: '0.1.0' }],
30
30
 
31
31
  // список серверов (GET /servers)
32
32
  servers: {
@@ -69,15 +69,23 @@ export default {
69
69
  // authServiceUrl (Этап B2) — домен central auth-сервиса (packages/auth):
70
70
  // лобби делает туда прямой fetch (POST /nick), поэтому connect-src должен
71
71
  // его разрешать; сам OAuth-редирект (location.href на auth-сервис/провайдера)
72
- // CSP не ограничивает — это навигация верхнего уровня, не fetch/XHR
72
+ // CSP не ограничивает — это навигация верхнего уровня, не fetch/XHR.
73
+ // script-src несёт sha256-хэш инлайнового importmap из index.html (для
74
+ // pixi.js — src="..." на <script type="importmap"> браузеры не
75
+ // поддерживают, инлайн обязателен). Хэш посчитан по факту собранного
76
+ // packages/engine/dist/index.html скриптом
77
+ // scripts/check-importmap-csp-hash.mjs (запускается postbuild) — vite
78
+ // build минифицирует HTML и может изменить байты скрипта, поэтому хэш
79
+ // нельзя брать из исходника/консоли браузера; при правке importmap или
80
+ // апгрейде Vite смотреть на вывод postbuild-проверки.
73
81
  security: {
74
82
  authServiceUrl: 'http://localhost:3010',
75
83
  csp: authServiceUrl =>
76
84
  [
77
85
  "default-src 'self'",
78
- "script-src 'self' 'wasm-unsafe-eval'",
86
+ "script-src 'self' 'wasm-unsafe-eval' 'sha256-XJmzkFBLHYpcM8KgGRFztTJTwfMb5xIFKAmqlgTpobo='",
79
87
  "worker-src 'self' blob:",
80
- `connect-src 'self' wss: data: ${authServiceUrl}`,
88
+ `connect-src 'self' wss: data:${authServiceUrl ? ` ${authServiceUrl}` : ''}`,
81
89
  "img-src 'self' data: blob:",
82
90
  "style-src 'self' 'unsafe-inline'",
83
91
  "object-src 'none'",
@@ -5,8 +5,9 @@
5
5
  // версия контракта движок ↔ игра-плагин (GameManifest, HostPlugin,
6
6
  // ClientPlugin, Wasm Host ABI — docs/{en,ru}/plugin-api.md);
7
7
  // проверяется при загрузке плагинов; ломающие изменения контрактов → +1.
8
- // Пока номинальная: код движка и игры ещё монолитен (см. PLAN.md)
9
- export const ENGINE_API_VERSION = 1;
8
+ // v2: явная схема форм (roomForm/authSchema.params[].options Form schema
9
+ // в plugin-api.md), движок больше не выводит контролы из типа значения
10
+ export const ENGINE_API_VERSION = 2;
10
11
 
11
12
  // версия формата кадра: первый байт после порта;
12
13
  // увеличивать при любом изменении байтовой раскладки в ядре
@@ -1,5 +1,5 @@
1
1
  // Web Worker браузерного хоста. Крутит авторитетную часть матча:
2
- // WASM-ядро симуляции (core/pkg-web из пакета игры, например @vimp/tanks,
2
+ // WASM-ядро симуляции (core/pkg-web из пакета игры, например @vimp-games/tanks,
3
3
  // репозиторий vimp-tanks) + JS-мету (HostGame поверх
4
4
  // мета-модулей ./meta/) + игровой цикл ~120 Гц (таймеры Worker'а не
5
5
  // троттлятся в фоновой вкладке). RTCPeerConnection живут в главном потоке —
@@ -1,6 +1,6 @@
1
1
  // Сборка клиентского CONFIG_DATA (порт 0): merge движковых дефолтов
2
2
  // (src/config/clientDefaults.js) с игровым client-конфигом
3
- // (@vimp/tanks/config/client.js) + время голосования и данные client-side
3
+ // (@vimp-games/tanks/config/client.js) + время голосования и данные client-side
4
4
  // prediction из game-конфига. Используется Worker'ом хоста
5
5
  // (src/host/host.worker.js).
6
6
 
@@ -40,10 +40,13 @@ export const validateAuth = (data, authParams, validators = {}) => {
40
40
  if (options?.validator) {
41
41
  const validatorFn = rules[options.validator];
42
42
 
43
+ // validateAuth используется и клиентом (без игровых validators —
44
+ // это норма, авторитет проверки на хосте), и хостом (с authSchema.validators
45
+ // игры — здесь отсутствие validatorFn обычно опечатка в имени валидатора
46
+ // конфига игры). В обоих случаях просто пропускаем поле без ошибки,
47
+ // сохраняя прежнее поведение (эта ветка никогда не добавляла в errors).
43
48
  if (validatorFn && !validatorFn(value)) {
44
49
  errors.push({ name, error: 'not valid' });
45
- } else if (!validatorFn) {
46
- console.warn(`Validator function '${options.validator}' not found.`);
47
50
  }
48
51
  }
49
52
  }