engine-whatsapp berjalan sebagai satu proses di lokal: src/app.ts via tsx. Tidak ada worker terpisah (berbeda dari engine-bot yang butuh app + worker).
Prasyarat
Sudah selesai Setup Environment? Pastikan:
.envada denganMONGO_URLmenunjuk ke MongoDB aktif- MongoDB lokal berjalan di
127.0.0.1:27017(DBdazo) WEBHOOK_URLdi-set ke backend Dazo yang aktif, atau biarkan mengandungwebhook-testuntuk mode dummy- Folder
session/auth/kosong (belum ada sesi) atau berisi sesi yang ingin di-restore
Menjalankan app
npm run devScript ini menjalankan tsx src/app.ts. Server listen di port 5002 (dari config.port).
Output saat start:
🚀 Server Berjalan di http://localhost:5002
📡 Mode: Single Process Multi-Device
Mongodb ConnectedRestore sesi saat boot
Saat server.listen sukses, app.ts memanggil WhatsAppService.init():
// src/app.ts:44
WhatsAppService.init();init() memindai session/auth/, lalu menyalakan ulang setiap sesi dengan jeda 2 detik antar sesi:
for (const instanceId of sessionFolders) {
await this.startSession(instanceId);
await new Promise((resolve) => setTimeout(resolve, 2000));
}Verifikasi
Tidak ada endpoint /health. Verifikasi via API:
# Cek server merespons
curl "http://localhost:5002/api/device-info?instance=test-uuid"
# Expected: {"success":true,"data":{"id":"test-uuid","status":"NOT_FOUND","isConnected":false,...}}Membuat sesi baru
# 1. Buat sesi
curl -X POST http://localhost:5002/api/new \
-H "Content-Type: application/json" \
-d '{"instance":"0c1a968c-7918-4c29-a524-0ad7c445ee7f"}'
# Expected: {"success":true,"message":"Sesi berhasil diinisialisasi..."}
# 2. Ambil QR (bisa juga lewat Socket.IO event qrcode)
curl "http://localhost:5002/api/qrcode?instance=0c1a968c-..."
# Expected: {"data":{"qrcode":"data:image/png;base64,...","status":"QR_READY"}}
# 3. Scan QR dengan WhatsApp di HP
# 4. Cek status
curl "http://localhost:5002/api/device-info?instance=0c1a968c-..."
# Expected: status: "open", isConnected: trueDetail endpoint di API Reference.
Socket.IO — test realtime
Server Socket.IO di port yang sama (5002), CORS terbuka (*).
// Contoh client
const socket = io("http://localhost:5002");
socket.emit("join_instance", "0c1a968c-...");
socket.on("device_status", (s) => console.log(s.status));
socket.on("qrcode", ({ qr }) => render(qr));
socket.on("message_upsert", (m) => console.log("Pesan masuk:", m.data));Detail event di Realtime Events.
PM2 (opsional)
Tidak ada ecosystem.config.js di repo. PM2 opsional untuk menjalankan lokal:
pm2 start npm --name engine-whatsapp-dev -- run dev
# atau setelah build:
pm2 start dist/app.js --name engine-whatsapp-devTesting endpoint
Kirim pesan
curl -X POST http://localhost:5002/api/send-message \
-H "Content-Type: application/json" \
-d '{
"instance": "0c1a968c-...",
"number": "628123456789",
"message": "Halo dari engine-whatsapp!",
"pesan_id": "msg-1",
"role": "cs",
"data": "{}"
}'Webhook mode dummy
Jika WEBHOOK_URL mengandung webhook-test, pengiriman webhook dilewati. Berguna untuk test kirim pesan tanpa backend Dazo aktif:
# .env
WEBHOOK_URL=http://localhost:3000/webhook-testSetelah mengubah kode TypeScript
Tidak ada test suite. Jalankan minimal:
npx tsc --noEmit # verifikasi tipe — WAJIB, harus exit 0Yang tidak bisa diuji lokal
| Fitur | Keterbatasan |
|---|---|
| Webhook ke backend | Butuh backend-go/dazoapp reachable di WEBHOOK_URL (atau pakai webhook-test) |
| Receive pesan masuk | Butuh device WhatsApp aktif yang ter-scan QR |
| Socket.IO ke frontend | Bisa connect, tapi frontend Dazo adalah konsumen eksternal — verifikasi event shape |
| Facebook Pixel | POST /api/submit-pixel butuh access_token valid dari Facebook |
Log
Pino menulis ke ./wa-logs.txt (file destination) dan stdout. Level dari LEVEL_LOG:
# Tail log real-time
Get-Content wa-logs.txt -Wait
# atau
tail -f wa-logs.txtLangkah berikutnya
- Akan deploy? Baca Deployment.
- Cara kerja sesi? Baca Session Lifecycle.
- Detail endpoint? Baca API Reference.