# PoC: thay Playwright bằng zca-js

Mục đích: trả lời dứt điểm 3 câu hỏi trước khi viết lại worker.

1. Đăng nhập Zalo **không cần trình duyệt** có chạy được không?
2. Một tài khoản tốn bao nhiêu RAM thật? (hiện tại Playwright ~800 MB/tài khoản)
3. Tin nhắn có được **đẩy tới** qua WebSocket không, hay vẫn phải quét DOM?

PoC này chạy tách rời, **không đụng gì tới `worker/`, `backend/` hay database đang chạy**.

## Cảnh báo trước khi chạy

- `zca-js` là thư viện **không chính thức**, dựng bằng cách phân tích ngược Zalo Web.
  Dùng nó đi ngược điều khoản sử dụng của Zalo. **Rủi ro khoá tài khoản là có thật**,
  và tăng theo số lượng tài khoản chạy chung một IP.
- **Hãy thử bằng tài khoản phụ trước**, đừng dùng tài khoản đang chạy kinh doanh.
- `creds/*.json` chứa cookie phiên đăng nhập — ai có file đó là vào được tài khoản.
  Đã có `.gitignore`, đừng commit và đừng gửi qua kênh không mã hoá.

## Chạy

Không cần cài Node lên máy — dùng luôn image `node:22-alpine` (không cần Chromium):

```bash
cd poc/zca

# cài dependency (lần đầu, ~10 giây)
docker run --rm -v "$PWD":/poc -w /poc node:22-alpine npm install

# đăng nhập tài khoản đầu tiên — QR hiện ngay trong terminal
docker run --rm -it -v "$PWD":/poc -w /poc node:22-alpine node login.mjs shop01

# đăng nhập thêm vài tài khoản nữa để đo mức tăng RAM
docker run --rm -it -v "$PWD":/poc -w /poc node:22-alpine node login.mjs shop02
docker run --rm -it -v "$PWD":/poc -w /poc node:22-alpine node login.mjs shop03

# lắng nghe tất cả — cứ 30 giây in một lần bảng đo RAM
docker run --rm -it -v "$PWD":/poc -w /poc node:22-alpine node listen.mjs
```

Trong lúc `listen.mjs` chạy, **nhắn tin từ điện thoại khác vào một trong các tài khoản đó**.
Tin phải hiện ra trong terminal gần như tức thì, kèm `msgId` và `ts`.

Hai lệnh còn lại:

```bash
# xem zca-js liệt kê được những gì (và thiếu những gì)
docker run --rm -it -v "$PWD":/poc -w /poc node:22-alpine node list.mjs shop01

# gửi thử một tin thật
docker run --rm -it -v "$PWD":/poc -w /poc node:22-alpine node send.mjs shop01 <threadId> xin chào
```

## Đọc kết quả

`listen.mjs` in ra bảng như sau mỗi 30 giây:

```
  Tài khoản đang nối : 3
  RSS tổng           : 82.4 MB
  Chi phí / tài khoản: 12.3 MB
  Ước tính 100 tài khoản: 1275.6 MB
```

**Ngưỡng quyết định:**

| Chi phí / tài khoản | Kết luận |
|---|---|
| < 30 MB | Đạt — 100 tài khoản gọn trong máy 8 GB hiện tại, tiến hành migrate |
| 30–60 MB | Vẫn ổn — 100 tài khoản ~3–6 GB, cần thêm RAM nhưng khả thi |
| > 60 MB | Đo lại, có thể do rò rỉ; xem xét chia nhiều tiến trình |

Ngoài RAM, cần xác nhận đủ cả 3:

- [ ] `login.mjs` quét QR xong, lưu được `creds/<label>.json`
- [ ] `listen.mjs` in ra tin nhắn đến **trong vòng 1–2 giây** sau khi gửi từ điện thoại
- [ ] `send.mjs` gửi được tin thật, người nhận thấy được

Chạy `listen.mjs` liên tục **ít nhất vài giờ** trước khi kết luận — thứ cần bắt là
kết nối có tự rụng không (`closed code=3000/3003`) và RSS có leo dần không.

## Khoảng trống đã biết

`list.mjs` sẽ cho bạn thấy tận mắt: zca-js **không có** API danh sách hội thoại gần đây,
và **không có** API lịch sử chat 1-1 (chỉ nhóm mới có `getGroupChatHistory`).

Nghĩa là khi migrate, hệ thống phải **tự lưu tin nhắn vào MySQL** và dựng danh sách
hội thoại từ dữ liệu của chính mình — thay vì đọc màn hình Zalo Web như hiện tại.
Đây là thay đổi kiến trúc lớn nhất của việc chuyển hướng, xem phần thảo luận kèm theo.
