32 lines
1.7 KiB
Markdown
32 lines
1.7 KiB
Markdown
# HAN Chat frontend test site
|
||
|
||
Expo / React Native Web SPA для проверки публичных пользовательских потоков HAN Chat.
|
||
|
||
## Запуск
|
||
|
||
```bash
|
||
cp .env.example .env.local
|
||
npm install
|
||
npm run web
|
||
```
|
||
|
||
Проверки: `npm test`, `npm run typecheck`, `npm run build`, `npm run test:e2e`.
|
||
|
||
## Production
|
||
|
||
`npm run build` создаёт `dist/`. Каталог монтируется в корневой nginx системы; отдельный frontend nginx не используется. Для SPA nginx должен применять `try_files $uri /index.html`, не кэшировать `index.html` и бессрочно кэшировать hashed assets.
|
||
|
||
Dockerfile собирает статический OCI-артефакт `/dist` без runtime-сервера:
|
||
|
||
```bash
|
||
docker build --target static \
|
||
--build-arg EXPO_PUBLIC_API_BASE_URL=https://tohin.ru \
|
||
--build-arg EXPO_PUBLIC_AUTH_BASE_URL=https://tohin.ru/auth \
|
||
--build-arg EXPO_PUBLIC_KEYCLOAK_REALM=han-chat \
|
||
--build-arg EXPO_PUBLIC_KEYCLOAK_CLIENT_ID=han-chat-frontend .
|
||
```
|
||
|
||
Во frontend разрешены только публичные URL, realm, client id и имя среды. Service tokens, S3 credentials и mock OTP code добавлять запрещено. На web refresh token хранится в browser storage с известным XSS-риском; production требует строгой CSP и отсутствия сторонних scripts.
|
||
|
||
WebSocket использует subprotocols `han-chat-v1` и `bearer.<JWT>`. Они должны совпадать с реализацией api-backend. Query-token намеренно не используется.
|