GameProvider.tsx
Обзор
Файл GameProvider.tsx реализует React-контекст и провайдер для управления состоянием и логикой игрового приложения в реальном времени. Основная задача файла — предоставлять данные игрока, сетевой статус, список валидаторов, историю игровых действий и обеспечивать связь с сервером через WebSocket (Socket.IO). Также реализована поддержка режима симуляции (offline), который активируется при проблемах с подключением к серверу.
Важной особенностью является управление соединением с сервером с помощью механизма повторных попыток подключения с экспоненциальной задержкой и автоматический переход в режим симуляции при неудачных попытках. В режиме симуляции действия игрока обрабатываются локально, что позволяет работать без реального сервера.
Основные сущности (интерфейсы)
Player — объект игрока с его характеристиками и статистикой.
GameAction — описание игровых действий с типом, статусом, суммой, временем и другими параметрами.
ValidatorInfo — информация о валидаторах сети, включая статус, количество валидированных блоков и награды.
NetworkStatus — сводные данные о состоянии блокчейн-сети (кол-во валидаторов, TPS, текущий эпоха и др.).
RelayMessage — сообщения, имитирующие этапы обработки транзакций в режиме симуляции.
Класс и функции
GameProvider
Это React-компонент, реализующий провайдер контекста GameContext. Он содержит состояние игры и методы для управления игровым процессом и сетевым соединением.
Параметры
children: ReactNode— дочерние компоненты, которым доступен контекст.
Состояния (useState)
player: Player | null— текущий игрок.isConnected: boolean— состояние подключения к серверу.recentActions: GameAction[]— последние игровые действия (до 10).validators: ValidatorInfo[]— список валидаторов сети.networkStatus: NetworkStatus— состояние сети.isLoading: boolean— индикатор загрузки.error: string | null— текст ошибки, если есть.socket: Socket | null— объект соединения Socket.IO.isOffline: boolean— флаг оффлайн-режима.connectionStatus: 'connected' | 'connecting' | 'disconnected' | 'error'— статус соединения.lastUpdate: number | null— время последнего обновления данных.retryCount: number— количество попыток повторного подключения.reconnectTimer: NodeJS.Timeout | null— таймер для повторных попыток.isSimulationMode: boolean— флаг режима симуляции.relayMessages: RelayMessage[]— список сообщений симуляции.
Основные методы
initializeConnection()
Описание: Инициализирует соединение с игровым сервером через Socket.IO с ручным управлением повторными попытками при ошибках.
Возвращает: объект
Socket.Использование: вызывается при монтировании провайдера и при повторных попытках подключения.
Особенности:
При ошибках подключения реализован экспоненциальный бэкофф с максимумом 3 попыток.
После неудачных попыток переключает состояние в оффлайн-режим и симуляцию.
Подписывается на события сервера для обновления состояния игрока, действий, валидаторов и сети.
При обновлении валидаторов обновляет внешнюю аналитику через
analyticsService.
connectPlayer(playerId: string): Promise
Описание: Подключает игрока к игре, создавая мок-данные для демо и подписываясь на обновления.
Параметры:
playerId— уникальный идентификатор игрока.
Поведение:
Устанавливает состояние загрузки.
В режиме симуляции не подключает сокет.
Создает фиктивного игрока и валидаторов.
Подписывает сокет на комнату игрока.
Пример использования:
await connectPlayer('player123');
performAction(type: string, params: any): Promise
Описание: Выполняет игровое действие с оптимистичным обновлением UI и проверкой валидности.
Параметры:
type— тип действия (например, 'SPEND_MANA', 'CRAFT_ITEM').params— параметры действия (сумма, предметы, результат боя и т.д.).
Поведение:
Создает локальное действие со статусом
PENDING.Валидирует действие (например, проверяет баланс маны).
Обновляет состояние игрока в соответствии с действием.
В симуляции инициирует имитацию обработки транзакции.
В онлайне симулирует вероятность ошибки (10%) и подтверждение действия.
Пример использования:
await performAction('SPEND_MANA', { amount: 100, reason: 'Upgrade' });
refreshPlayerData(): Promise
Описание: Обновляет данные игрока, имитируя запрос к серверу.
Использование:
await refreshPlayerData();
retryConnection(): Promise
Описание: Сбрасывает счетчик попыток и повторно инициализирует соединение.
Использование:
await retryConnection();
clearError(): void
Описание: Сбрасывает сообщение об ошибке.
Использование:
clearError();
enableSimulationMode(): void
Включает режим симуляции, отключая реальные соединения.
forceSimulationMode(): void
Принудительно включает режим симуляции без условий.
simulateRelayAction(actionType: string, actionData: any): void
Описание: Имитация этапов обработки транзакции в режиме симуляции.
Этапы:
pending→validation→consensus→settlementс задержками.Обновляет сообщения
relayMessagesдля отображения прогресса.
Вспомогательные функции
validateAction(type: string, params: any, player: Player): string | null— проверка корректности действия (например, хватает ли маны).getActionDescription(type: string, params: any): string— генерация текстового описания действия для UI.
Взаимодействие с другими частями системы
Использует
socket.io-clientдля WebSocket-соединения с сервером игры.Интегрируется с внешним сервисом аналитики
analyticsServiceдля сбора метрик валидаторов.Предоставляет состояние и методы через React Context API, что позволяет дочерним компонентам подписываться на обновления и выполнять действия.
В режиме оффлайн (симуляция) работает без реального сервера, что облегчает тестирование и демонстрацию.
Визуальное представление
componentDiagram
component GameProvider {
+player: Player | null
+isConnected: boolean
+recentActions: GameAction[]
+validators: ValidatorInfo[]
+networkStatus: NetworkStatus
+isLoading: boolean
+error: string | null
+isOffline: boolean
+connectionStatus: enum
+lastUpdate: number | null
+retryCount: number
+isSimulationMode: boolean
+relayMessages: RelayMessage[]
--
+connectPlayer(playerId: string): Promise<void>
+performAction(type: string, params: any): Promise<void>
+refreshPlayerData(): Promise<void>
+retryConnection(): Promise<void>
+clearError(): void
+enableSimulationMode(): void
+forceSimulationMode(): void
+simulateRelayAction(actionType: string, actionData: any): void
}
component SocketIO {
+connect()
+disconnect()
+emit(event: string, data: any)
+on(event: string, callback: Function)
}
component analyticsService {
+addValidatorMetrics(validatorId: string, metrics: object): void
}
GameProvider --> SocketIO : Управляет соединением
GameProvider --> analyticsService : Отправляет метрики валидаторов
GameProvider ..> ReactChildren : Обеспечивает данные и методы через Context
Итог
Файл GameProvider.tsx — ключевой модуль для управления состоянием игры и взаимодействия с сервером в реальном времени. Благодаря продуманной архитектуре с использованием React Context, Socket.IO и режимом симуляции, он обеспечивает устойчивую работу приложения в различных условиях сети и предоставляет удобный API для компонентов игры.