mnemo_cards/games/mnemo_cards_game_api/PROJECT_STRUCTURE.md

148 lines
3.9 KiB
Markdown
Raw Normal View History

2025-11-10 23:55:41 +00:00
# 📦 Flutter WebView Bridge — структура проекта
Проект разделён на независимые пакеты (монорепозиторий с Melos), чтобы:
- отделить зависимости между `host`, `web` и `payloads`;
- изолировать доступ к данным (web видит только нужное);
- упростить масштабирование и тестирование.
---
## 🗂️ Общая структура
```
├── games/
│ ├── bridge_core/ # Общие типы и сериализация
│ ├── payloads_shared/ # Payload'ы, общие для всех
│ ├── payloads_host/ # Только для host-приложения
│ ├── payloads_app1/ # Только для web_app1
│ ├── host_app/ # Flutter Host App (с WebView)
│ ├── web_app1/ # Flutter Web-приложение 1
├── melos.yaml # Конфигурация монорепозитория
```
---
## 📦 Описание пакетов
### `bridge_core/`
Содержит:
- `BridgeMessage` — модель сообщения
- `BridgePayload` — абстракция типа данных
- `PayloadRegistry` — карта `"type"``fromJson`
Используется **всеми** остальными пакетами.
---
### `payloads_shared/`
Содержит payload'ы, используемые и в `host`, и в web-приложениях.
Пример: `GetUserInfoPayload`, `PingPayload`.
Импортируется и в `host_app`, и в `web_app1`, `web_app2`.
---
### `payloads_host/`
Содержит payload'ы, специфичные для хост-приложения.
Пример: `SecretAdminCommand`, `ShowNativeDialogPayload`.
Импортируется **только в `host_app`**.
---
### `payloads_app1/`
Содержит payload'ы, специфичные для web-приложения 1.
Пример: `LoginRequestPayload`, `SubmitQuizPayload`.
Импортируется **только в `web_app1`** и `host_app`.
---
### `host_app/`
Flutter-приложение с WebView.
- Имеет доступ ко всем `payloads_*` пакетам
- Обрабатывает все события
- Реализует `BridgeWebViewController`
---
### `web_app1/`
Flutter Web-приложение, встроенное в WebView.
- Импортирует только нужные `payloads_*`
- Регистрирует только свои payload'ы
- Не видит лишнего
---
## 🔐 Разделение доступа
| Пакет | Видит payloads_shared | Видит payloads_host | Видит payloads_app1 |
|---------------|------------------------|----------------------|----------------------|
| host_app | ✅ | ✅ | ✅ |
| web_app1 | ✅ | ❌ | ✅ |
| web_app2 | ✅ | ❌ | ❌ |
---
## ⚙️ Melos
Файл `melos.yaml` в корне:
```yaml
name: flutter_webview_bridge_repo
packages:
- packages/**
```
Запуск:
```bash
melos bootstrap
```
---
## 📥 Регистрация payload'ов
Каждый payload-пакет содержит:
```dart
void registerPayloads() {
BridgePayload.register('type_name', (json) => MyPayload.fromJson(json));
}
```
В `main()` у приложения:
```dart
void main() {
registerPayloads();
runApp(MyApp());
}
```
---
## 📌 Пример использования
```dart
// Web-приложение
GetUserInfoPayload(fields: ['name']).toMessage().sendToHost();
// Хост-приложение
hostBridge.registerHandler('get_user_info', (msg) {
final payload = GetUserInfoPayload.fromJson(msg.data);
...
});
```
---