# DjB MultiWA 1.0

Browser pengguna → HTTPS → PHP cPanel → HTTPS + token rahasia → gateway Node.js
→ profil Chromium terpisah (slot 1–8) → WhatsApp Web.

MySQL/MariaDB menyimpan user, password hash, akses nomor, audit dan identitas
permintaan pengiriman. Gateway menyimpan profil sesi LocalAuth dan receipt
idempotensi pada disk. Riwayat pesan dibaca dari WhatsApp Web, bukan arsip lengkap
mandiri. Nomor dihubungkan admin lewat QR; agent tidak dapat mengambil QR.

## Batas otorisasi

- Admin: semua slot dan pengaturan. Minimal satu admin aktif harus tersedia.
- Agent: semua slot aktif atau daftar slot yang dipilih admin.
- Pemeriksaan akses dilakukan server untuk chat, media, pengiriman, dan status
  pengiriman. Menyembunyikan tombol bukan satu-satunya proteksi.
- Perubahan user menaikkan session_version; sesi lama ditolak pada request
  berikutnya. Data yang telah dilihat/diunduh sebelumnya tidak dapat ditarik kembali.
- Hak akses berlaku untuk seluruh chat pada nomor yang diberikan, termasuk grup;
  tidak ada ACL per kontak atau grup.
- Media/quoted-message ID harus milik chat yang diminta. Pesan pengguna di-escape
  saat dirender. Lampiran aktif seperti HTML/SVG tidak ditampilkan inline.
- Tanda tangan berasal dari username di database setelah autentikasi, bukan
  username yang dikirim browser. Gateway menambahkan `— username` di akhir pesan
  atau caption. Media tanpa caption, misalnya audio, dikirim sebagai dokumen.
- Pesan yang dikirim dari aplikasi WhatsApp ponsel atau perangkat tertaut lain
  berada di luar kendali aplikasi ini dan tidak diberi signature secara otomatis.

## Idempotensi dan kegagalan jaringan

UI membuat request UUID; PHP menyimpan pasangan user+slot+UUID serta hash payload.
Gateway menyimpan hash dan receipt pada disk sebelum pemanggilan pengiriman.
Request dengan key sama dan payload sama yang telah berhasil mendapat ID pesan
sebelumnya. Key sama dengan isi berbeda ditolak. Status pending/uncertain tidak
secara otomatis dikirim ulang. Admin/user memeriksa status dan percakapan dahulu.

Ini mengurangi duplikasi pada timeout/dobel klik, bukan jaminan exactly-once dari
WhatsApp. Jika gateway mati setelah WhatsApp menerima pesan tetapi sebelum receipt
tersimpan, status dapat tetap uncertain. Tidak ada retry otomatis untuk pengiriman.
Jangan menghapus record pending/uncertain untuk memaksa pengiriman ulang.

## Operasional

Jalankan tepat satu proses gateway untuk setiap DATA_DIR; jangan gunakan cluster
PM2/Passenger atau berbagi profil dengan proses lain. Lock PID mencegah instance
ganda. Slot yang pernah diaktifkan dipulihkan bertahap saat gateway restart; logout
WhatsApp memerlukan scan QR lagi. Tidak ada janji pemulihan tanpa intervensi admin
untuk semua kegagalan Chromium/WhatsApp.

Polling pesan setiap sekitar 5 detik saat tab aktif; daftar chat sekitar 20 detik;
status nomor sekitar 12–15 detik. Riwayat diambil 60 pesan, dapat dimuat sampai 500
per chat dari riwayat yang tersedia pada sesi Web. Tidak semua chat lama/attachment
lama selalu tersinkron. Nomor yang tidak diizinkan tidak dikirim ke agent.

Upload/download aplikasi dibatasi 16 MiB. Di atas batas perlu kompresi atau
penyesuaian kode, PHP memory/upload limits, serta reverse proxy secara bersamaan.
Video bergantung pada codec browser gateway dan browser pengguna. Audio dikirim
sebagai berkas; tidak ada perekam voice note. Video playback belum menyediakan
HTTP Range/seek server-side khusus.

Backup database, config.php, .env dan gateway/data secara terenkripsi. Salin
LocalAuth saat gateway dihentikan agar konsisten. Folder gateway/data berisi
kredensial akun dan cache browser yang sensitif; batasi user OS pemilik dan
jangan simpan di document root. Log audit tidak menyalin isi pesan tetapi
menyimpan ID chat dan pengirim. Tetapkan kebijakan retensi sesuai kebutuhan
perusahaan. Hindari menghapus ledger pengiriman yang masih dirujuk aplikasi.

## Dependensi utama

- PHP ≥8.2; PDO MySQL, cURL, mbstring, fileinfo, sessions.
- MySQL 8 atau MariaDB 10.6+; InnoDB/utf8mb4.
- Node.js ≥22.12; whatsapp-web.js 1.34.7, Express 5.3.0, qrcode 1.5.4.
- Puppeteer di-override ke 25.16.0 untuk memperbaiki temuan audit dependency
  pada browser bawaan library. Import modul aktual telah diuji; pairing WhatsApp
  asli dengan kombinasi ini tetap perlu diuji pada staging.
- Dependency transitif dikunci package-lock.json. Gunakan npm ci.
- Library WhatsApp bersifat tidak resmi; perbarui hanya setelah uji staging.

Sumber dokumentasi diperiksa 24 Oktober 2026:
https://wwebjs.dev/guide/installation
https://wwebjs.dev/guide/creating-your-bot/authentication
https://docs.wwebjs.dev/Client.html
https://docs.wwebjs.dev/Message.html
https://docs.wwebjs.dev/global.html
https://github.com/wwebjs/whatsapp-web.js
https://docs.cpanel.net/cpanel/software/application-manager/
