Local WebSocket + WebRTC (signaling) — 2026-08-11
Domain: D-CHAT · D-RIDES WP: WP-CHAT-WS-01 (env bootstrap)
Đã chạy / PASS
| Check | Result |
|---|---|
| Infra Postgres/Redis/MinIO | UP |
API :3000 health |
OK |
GET /chat probe |
socket.io · ns /chat |
GET /socket.io/?EIO=4&transport=polling |
HTTP 200 |
socket.io-client (mobile) |
installed |
| STUN mặc định | stun:stun.l.google.com:19302 |
Env mobile (local LAN)
mobile/.env.local trỏ realtime về máy API:
EXPO_PUBLIC_API_URL=http://192.168.1.109:3000/api/v1
EXPO_PUBLIC_WS_URL=http://192.168.1.109:3000
# optional TURN/STUN JSON:
# EXPO_PUBLIC_ICE_SERVERS=[{"urls":"stun:stun.l.google.com:19302"}]
Cloud backup giữ trong comment *_CLOUD_BACKUP trong .env.local.
Kiến trúc
App --Socket.IO--> API /socket.io
namespace /chat · tin nhắn + call:signal (WebRTC SDP/ICE)
namespace /rides · GPS tài xế
WebRTC media: peer-to-peer (STUN/TURN)
Signaling: qua Socket.IO (không đi media qua Nest)
Expo Go vs media đầy đủ
| Mode | Signaling WS | Audio/Video PeerConnection |
|---|---|---|
| Expo Go | ✅ | ❌ (thiếu RTCPeerConnection native) |
EAS Dev Client + react-native-webrtc |
✅ | ✅ |
CallScreen đã sẵn sàng signaling; media cần Dev Client (không cài native vào Expo Go trong bước này).
Lệnh vận hành
npm run infra:up
npm run api:dev
cd mobile && npm run start:clear # reload env
Namespaces: chat io(WS_URL + '/chat') · rides io(WS_URL + '/rides') · path /socket.io.