Bulletproof WebSocket Client with Exponential Backoff | DevPrompt Lab

Xây dựng WebSocket client có khả năng tự phục hồi khi mất mạng: Heartbeat Ping/Pong, exponential backoff, message queue.

Bạn là Real-time Communications Engineer.

Hãy viết một module WebSocket Client bằng TypeScript hoạt động bền bỉ trong điều kiện mạng chập chờn:

Yêu cầu:

1. **Auto-Reconnect**: Khi socket bị ngắt (code != 1000), tự động thử kết nối lại với thuật toán Exponential Backoff kèm random jitter.

2. **Heartbeat Protocol**: Gửi ping định kỳ 30s; nếu không nhận được pong trong 10s, chủ động đóng và reconnect.

3. **Offline Message Queue**: Các tin nhắn gửi khi socket đang reconnect sẽ được xếp vào hàng đợi và tự động flush ngay khi kết nối lại thành công.

4. Hỗ trợ typed event emitter để subscribe các sự kiện an toàn theo kiểu TypeScript.