@vnejs/docs 0.2.60 → 0.2.62
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/CHANGELOG.md +22 -0
- package/README.md +1 -0
- package/architecture.md +38 -14
- package/package.json +1 -1
- package/plugins/views/controls.hints.md +5 -5
- package/plugins/views.scenario/interface.md +9 -8
package/CHANGELOG.md
CHANGED
|
@@ -2,8 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
Краткая история изменений движка (плагины, helpers, packages, CLI и прочий runtime) и внешнего API. Версии — релизы пакета `@vnejs/docs`.
|
|
4
4
|
|
|
5
|
+
## 0.2.62
|
|
6
|
+
|
|
7
|
+
- `module.components` — при `isForce` `onUpdateStoreComponent` ждёт `ViewStoreApi.notifyIsForce(true)` и затем пишет `isForce: false`. Фиксированный `waitTimeout(100)` снят. API: `ViewStoreApi.notifyIsForce`, `ViewIsForceNotify`.
|
|
8
|
+
- `uis/react/hooks/use-store-state` — подписка через `useSyncExternalStore`. После коммита стейта с `isForce` зовёт `store.notifyIsForce(true)`. Это единственный сигнал, который отпускает ожидание в `onUpdateStoreComponent`.
|
|
9
|
+
- `uis/react/hooks/use-is-force-hook` — таймаут сброса `isRealForce` снимается, если `isForce` снова стал `true`.
|
|
10
|
+
- `views/fps`, `views/gamepad.debug`, `views/achievement` — в `View` уходит `isForce` из стора. Задержку кадра делает сам `View`.
|
|
11
|
+
- `views.scenario/interface` — `isForce` доходит до `SmoothText` в `InterfaceViewDialog`, `InterfaceViewLine` и `InterfaceViewWall`. Иначе форс-кадр оставляет посимвольный переход.
|
|
12
|
+
- `uis/react/composites/smooth-text` — смена `tokens` рисуется без `opacity`-перехода. Дальнейший рост `tokensVisibleForce` анимируется и когда за кадр появляется несколько символов. `tokensVisibleForce` применяется до отрисовки.
|
|
13
|
+
|
|
14
|
+
## 0.2.61
|
|
15
|
+
|
|
16
|
+
- `views.scenario/interface` — подписки `INTERFACE.SHOW` и `INTERFACE.HIDE` в модуле `interface.actions.show`. На `GATE` они обрывают остальных подписчиков, если интерфейс уже показан или уже скрыт, либо show/hide уже выполняется. Показ скрытого слоя шлёт `EVENTS.INTERFACE.VISIBLE`. API: `InterfaceShow.onShowGate`, `InterfaceShow.onHideGate`, `InterfaceShow.isInShowOrHideProcess`, `InterfaceShow.setShow`, `CONST.COMPONENTS.LIFECYCLE_PRIORITY.SHOW.GATE`, `CONST.COMPONENTS.LIFECYCLE_PRIORITY.HIDE.GATE`.
|
|
17
|
+
- `views/controls.hints` — show/hide группы по `showEvents` / `hideEvents` сохраняют `isForce` исходного события: `isForce: true` обновляет view через `UPDATE_FORCE`, иначе через `UPDATE_FAST`. API: `ControlsHintsController.onGroupShow`, `ControlsHintsController.onGroupHide`, `ControlsHintsController.updateGroupStateAndView`.
|
|
18
|
+
- `backends/auth`, `backends/content` — локальный запуск: `npm run dev` (`npm start` то же самое), auth `127.0.0.1:8787`, content `127.0.0.1:8788`. Секрет из `.env`; пустой `AUTH_SECRET` → `500`, не ошибка WebCrypto.
|
|
19
|
+
- `backends/auth` — `GET /` показывает статус входа и кнопку на `/steam/start`. Origin самого воркера для этой страницы допускается вместе с `ALLOWED_ORIGINS`.
|
|
20
|
+
- `backends/auth` — `isOwnedByUser` (ранее `isPurchasedByUser`): `ownsApp` в JWT без требования `permanent` в ответе CheckAppOwnership; по-прежнему отсекаются `sitelicense` и чужой `ownersteamid`.
|
|
21
|
+
- `backends/auth` — env `APP_DEMO_ID` (по умолчанию `5081630`); CheckAppOwnership для демо, в JWT и на тестовой странице `GET /` — `ownsDemoApp` отдельно от `ownsApp`.
|
|
22
|
+
- `backends/auth` — тестовая страница и `/session`: имя (`GetPlayerSummaries`), локальное время окончания JWT (`expiresAt`, формат `DD.MM hh:mm:ss`), кнопка «Обновить сессию» (`GET /session`).
|
|
23
|
+
- `backends/shared` — `TOKEN_TTL_SECONDS`: JWT живёт 3 суток.
|
|
24
|
+
- `backends/auth`, `backends/content` — HTTP на Fastify; локально `npm run dev` (`node --env-file=.env` + `tsx`, порты 8787/8788). Опционально `npm run dev:worker` (Wrangler + Fastify через `inject`).
|
|
25
|
+
|
|
5
26
|
## 0.2.60
|
|
6
27
|
|
|
28
|
+
- `backends/auth`, `backends/content` — воркеры токена Steam и выдачи `dist/label`. Контент отдаётся только с JWT, в котором `ownsApp` true.
|
|
7
29
|
- `views.screens/history` — закрытие крестиком сверху справа, клик шлёт `EVENTS.HISTORY_VIEW.HIDE`. Текстовая кнопка внизу снята. Список реплик высотой 1800 по вертикали по центру экрана. API: `PARAMS.HISTORY_VIEW.VIEW_PROPS.close` теперь `{ position, svg }`.
|
|
8
30
|
- `module.controller.arrows.vertical`, `module.controller.arrows.horizontal`, `module.controller.arrows.grid` — на `HIDE.CLEANUP` позиция пункта в стейте становится `undefined` через `UPDATE_STATE`, затем `UPDATE_FAST` перерисовывает view. API: `currentArrowVerticalItem`, `currentArrowHorizontalItem`, `gridRow`, `gridColumn`, `CONST.COMPONENTS.LIFECYCLE_PRIORITY.HIDE.CLEANUP`.
|
|
9
31
|
|
package/README.md
CHANGED
|
@@ -45,6 +45,7 @@ npm i @vnejs/docs
|
|
|
45
45
|
| [`uis/`](./architecture.md#uis) | React-компоненты для view-плагинов |
|
|
46
46
|
| [`cli/`](./architecture.md#cli) | Сборка монорепы и игр |
|
|
47
47
|
| [`games/`](./architecture.md#games) | Проекты игр: сценарий, entry, dist |
|
|
48
|
+
| [`backends/`](./architecture.md#backends) | Workers: токен Steam и JSON меток |
|
|
48
49
|
| [`vs_code_extensions/`](./architecture.md#vs_code_extensions) | Подсветка `.vne` в редакторе |
|
|
49
50
|
|
|
50
51
|
`games/` подключает один `bundles/` и получает `VneCore` — точку входа в движок.
|
package/architecture.md
CHANGED
|
@@ -40,6 +40,7 @@ flowchart LR
|
|
|
40
40
|
flowchart TD
|
|
41
41
|
G[games/] --> B[bundles/]
|
|
42
42
|
G --> CLI[cli/]
|
|
43
|
+
G -.->|HTTP| BE[backends/]
|
|
43
44
|
B --> P[plugins/]
|
|
44
45
|
B --> C[compatibility/]
|
|
45
46
|
P --> CT[contracts/]
|
|
@@ -60,6 +61,7 @@ flowchart TD
|
|
|
60
61
|
| От | К | Смысл |
|
|
61
62
|
| ---------------- | ----------------------------------- | -------------------------------------------------------- |
|
|
62
63
|
| `games/` | `bundles/`, `cli/` | Игра не знает про отдельные плагины; сборка через `cli/` |
|
|
64
|
+
| `games/` | `backends/` | HTTP к воркерам токена и меток, без импорта пакетов |
|
|
63
65
|
| `bundles/` | `plugins/`, `compatibility/` | Только импорт нужного набора |
|
|
64
66
|
| `plugins/` | `contracts/` | Реализация следует объявленному API |
|
|
65
67
|
| `plugins/` | `modules_extensions/` → `packages/` | Модули наследуют базы, базы опираются на shared/observer |
|
|
@@ -460,6 +462,27 @@ flowchart LR
|
|
|
460
462
|
|
|
461
463
|
---
|
|
462
464
|
|
|
465
|
+
## backends/
|
|
466
|
+
|
|
467
|
+
**Отдельные Cloudflare Workers** — не плагины и не часть `VneCore`. Игра ходит к ним по HTTP. Пакеты в `plugins/` их не импортируют.
|
|
468
|
+
|
|
469
|
+
| Пакет | Назначение |
|
|
470
|
+
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
471
|
+
| **`backends/auth`** | Steam OpenID и проверка покупки своего AppID. Отдаёт подписанный JWT (`steamId`, `ownsApp`, `exp`). |
|
|
472
|
+
| **`backends/content`** | `GET /label/*` — JSON меток из `dist/label`. Пускает только запрос с тем же JWT и `ownsApp`. Картинки и `mods.json` не отдаёт. |
|
|
473
|
+
|
|
474
|
+
Оба воркера знают один `AUTH_SECRET`. Контент-воркер Steam не вызывает. Каталог ассетов при деплое указывает на `dist` игры, сами JSON в репозиторий воркера не копируются. Закрытый деплой не кладёт то же дерево `label/` рядом со статикой игры.
|
|
475
|
+
|
|
476
|
+
```mermaid
|
|
477
|
+
flowchart LR
|
|
478
|
+
Game[games/] -->|popup OpenID| Auth[backends/auth]
|
|
479
|
+
Auth --> Steam[steamcommunity.com]
|
|
480
|
+
Game -->|GET /label Bearer| Content[backends/content]
|
|
481
|
+
Auth -.->|общий AUTH_SECRET| Content
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
---
|
|
485
|
+
|
|
463
486
|
## vs_code_extensions/
|
|
464
487
|
|
|
465
488
|
**Расширения редактора** для формата сценария — не runtime.
|
|
@@ -524,19 +547,20 @@ flowchart TD
|
|
|
524
547
|
|
|
525
548
|
## Резюме
|
|
526
549
|
|
|
527
|
-
| Каталог | Одной фразой
|
|
528
|
-
| ------------------------- |
|
|
529
|
-
| **`packages/`** | Реестр, шина, VneCore
|
|
530
|
-
| **`modules_extensions/`** | Базовые классы модулей
|
|
531
|
-
| **`configs/`** | Общие tsconfig
|
|
532
|
-
| **`contracts/`** | API плагина: события, типы
|
|
533
|
-
| **`plugins/`** | Реализация на шине
|
|
534
|
-
| **`compatibility/`** | Opt-in связка двух плагинов
|
|
535
|
-
| **`bundles/`** | Набор способностей для игры
|
|
536
|
-
| **`helpers/`** | Утилиты без движка
|
|
537
|
-
| **`uis/`** | React/UI для view
|
|
538
|
-
| **`cli/`** | Сборка монорепы и игр
|
|
539
|
-
| **`games/`** | Сценарий + entry + dist
|
|
540
|
-
| **`
|
|
550
|
+
| Каталог | Одной фразой |
|
|
551
|
+
| ------------------------- | --------------------------------- |
|
|
552
|
+
| **`packages/`** | Реестр, шина, VneCore |
|
|
553
|
+
| **`modules_extensions/`** | Базовые классы модулей |
|
|
554
|
+
| **`configs/`** | Общие tsconfig |
|
|
555
|
+
| **`contracts/`** | API плагина: события, типы |
|
|
556
|
+
| **`plugins/`** | Реализация на шине |
|
|
557
|
+
| **`compatibility/`** | Opt-in связка двух плагинов |
|
|
558
|
+
| **`bundles/`** | Набор способностей для игры |
|
|
559
|
+
| **`helpers/`** | Утилиты без движка |
|
|
560
|
+
| **`uis/`** | React/UI для view |
|
|
561
|
+
| **`cli/`** | Сборка монорепы и игр |
|
|
562
|
+
| **`games/`** | Сценарий + entry + dist |
|
|
563
|
+
| **`backends/`** | Workers: токен Steam и JSON меток |
|
|
564
|
+
| **`vs_code_extensions/`** | Подсветка `.vne` |
|
|
541
565
|
|
|
542
566
|
**Главное правило:** `plugins/` не знают друг о друге; интеграция — через события по `contracts/` и явный `compatibility/` в `bundles/`.
|
package/package.json
CHANGED
|
@@ -33,7 +33,7 @@ Payloads и результаты хендлеров типизированы ч
|
|
|
33
33
|
|
|
34
34
|
Для экрана обычно задают `position.zIndex = PARAMS.<SCREEN>.ZINDEX + 100`, чтобы другие экраны могли перекрыть подсказки.
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
Появление и скрытие группы по `showEvents` / `hideEvents` обновляет view через `UPDATE_FAST`. Если у исходного события `isForce: true`, обновление идёт через `UPDATE_FORCE`. Обычный `UPDATE` с ожиданием `TRANSITION` на этих событиях не вызывается. Сам `View` по-прежнему анимируется с `transition={PARAMS.TRANSITION}` (по умолчанию `300` ms), кроме `isForce`. Группа видима, если `isShow` и есть контролы для текущего device (с учётом `hideOnDevices`). При уходе в пустой список (например keyboard) предыдущие иконки держатся до конца transition, чтобы fade-out успел отрисоваться.
|
|
37
37
|
|
|
38
38
|
Элемент `controls[]`: `{ locKey, keyboard: string[], xbox: string[], playstation: string[], hideOnDevices?: ControlsDevice[] }` — пути внутри `media/view/{quality}/` (ведущий `/` снимается). `hideOnDevices` — девайсы, на которых контрол не рендерится (`CONTROLS.DEVICES.*`).
|
|
39
39
|
|
|
@@ -43,10 +43,10 @@ Payloads и результаты хендлеров типизированы ч
|
|
|
43
43
|
|
|
44
44
|
## Модули
|
|
45
45
|
|
|
46
|
-
| Модуль | Зона ответственности
|
|
47
|
-
| --------------------------- |
|
|
48
|
-
| `controls.hints.controller` | Preload иконок в `start` и на `MEMORY.CLEARED`; show/hide
|
|
49
|
-
| `controls.hints.view` | Рендер нескольких `View` + `Flex` + `Icon` + `Text`.
|
|
46
|
+
| Модуль | Зона ответственности |
|
|
47
|
+
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
48
|
+
| `controls.hints.controller` | Preload иконок в `start` и на `MEMORY.CLEARED`; show/hide групп сохраняют `isForce` исходного события (`UPDATE_FORCE` или `UPDATE_FAST`); `DEVICE_CHANGED`. `EXTERNAL_UPDATE` всегда вызывает `updateViewFast` (без проверки `isShow`). |
|
|
49
|
+
| `controls.hints.view` | Рендер нескольких `View` + `Flex` + `Icon` + `Text`. |
|
|
50
50
|
|
|
51
51
|
## Близкие плагины
|
|
52
52
|
|
|
@@ -54,14 +54,15 @@ Payloads и результаты хендлеров типизированы ч
|
|
|
54
54
|
|
|
55
55
|
## Модули
|
|
56
56
|
|
|
57
|
-
| Модуль | Зона ответственности
|
|
58
|
-
| ----------------------------- |
|
|
59
|
-
| `interface.controller` | Обрабатывает VIEW_UPDATE, VIEW_SHOW, VIEW_HIDE, …. Пустой `controls` на `ZINDEX`; `CONTROLS_UNVISIBLE` при скрытии слоя. `SHOULD_CLEAR_STATE_ON_CLEANUP` — `false`, поэтому текст и задник переживают hide.
|
|
60
|
-
| `interface.controller.accept` | Наследует `@vnejs/module.controller.accept`: `ACCEPT` / `INTERACT` → `INTERFACE.INTERACT`; видимый слой → `INTERACT.EMIT`, скрытый → `INTERFACE.VISIBLE`; PUSH/POP на VIEW_SHOW/HIDE.
|
|
61
|
-
| `interface` | STATE.SET / STATE.CLEAR → STATE_CHANGED.
|
|
62
|
-
| `interface.scenario` | `$ interface`: `LINE_EXEC_REG` → SHOW / HIDE / VIEW по `CONST.INTERFACE.EXEC_ACTIONS`.
|
|
63
|
-
| `interface.actions` |
|
|
64
|
-
| `interface.
|
|
57
|
+
| Модуль | Зона ответственности |
|
|
58
|
+
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
59
|
+
| `interface.controller` | Обрабатывает VIEW_UPDATE, VIEW_SHOW, VIEW_HIDE, …. Пустой `controls` на `ZINDEX`; `CONTROLS_UNVISIBLE` при скрытии слоя. `SHOULD_CLEAR_STATE_ON_CLEANUP` — `false`, поэтому текст и задник переживают hide. |
|
|
60
|
+
| `interface.controller.accept` | Наследует `@vnejs/module.controller.accept`: `ACCEPT` / `INTERACT` → `INTERFACE.INTERACT`; видимый слой → `INTERACT.EMIT`, скрытый → `INTERFACE.VISIBLE`; PUSH/POP на VIEW_SHOW/HIDE. |
|
|
61
|
+
| `interface` | STATE.SET / STATE.CLEAR → STATE_CHANGED. |
|
|
62
|
+
| `interface.scenario` | `$ interface`: `LINE_EXEC_REG` → SHOW / HIDE / VIEW по `CONST.INTERFACE.EXEC_ACTIONS`. |
|
|
63
|
+
| `interface.actions` | VISIBLE / TEXT_HIDE / VIEW через `globalState.interface`. |
|
|
64
|
+
| `interface.actions.show` | Подписки `SHOW` и `HIDE`. На `GATE` (`breakFollowing`): если интерфейс уже в целевом состоянии или цикл show/hide уже идёт, остальные подписчики этих событий не вызываются. Показ скрытого слоя шлёт `VISIBLE`. |
|
|
65
|
+
| `interface.view` | `isForce` доходит до `SmoothText` в `InterfaceViewDialog`, `InterfaceViewLine` и `InterfaceViewWall`. |
|
|
65
66
|
|
|
66
67
|
## Compatibility
|
|
67
68
|
|