wa-multi-device-esm
v2.0.0
Published
Multi Device Whatsapp Library
Readme
WA Multi Device ESM
Port ESM dari library WhatsApp Multi Session berbasis Baileys. Dibuat untuk menjalankan banyak akun WhatsApp dalam satu aplikasi tanpa Selenium atau browser automation.
Repository: https://github.com/east-tech-id/wa-multi-device-esm
Instalasi
npm install wa-multi-device-esmES Module / TypeScript
import * as whatsapp from "wa-multi-device-esm";CommonJS
const whatsapp = require("wa-multi-device-esm");Manajemen Session
Membuat Session Baru
const session = await whatsapp.startSession("mysessionid");Membuat Session dengan Auto-Reconnect (v2.0)
const session = await whatsapp.startSession("mysessionid", {
printQR: true,
autoReconnect: {
enabled: true, // default: true
maxRetries: 5, // default: 5
baseDelay: 2000, // default: 2000ms
maxDelay: 60000, // default: 60000ms
},
onConnected: () => {
console.log("Session connected!");
},
onReconnecting: (info) => {
console.log(`Reconnecting attempt ${info.attempt}/${info.maxAttempts} in ${info.delayMs}ms`);
},
onDisconnected: (info) => {
if (info.permanent) {
console.log(`Logged out (${info.reason}) - perlu scan QR ulang`);
} else {
console.log(`Disconnected (${info.reason}) - semua retry gagal`);
}
},
});Reconnect Session Secara Manual (v2.0)
Berguna ketika auto-reconnect retry sudah habis, atau setelah server restart:
const session = await whatsapp.reconnectSession("mysessionid");Cek Status Session (v2.0)
const status = whatsapp.getSessionStatus("mysessionid");
// "connected" | "connecting" | "disconnected"Mendapatkan Semua Session
const sessions = whatsapp.getAllSession();Mendapatkan Session Berdasarkan ID
const session = whatsapp.getSession("mysessionid");Meload Session dari Penyimpanan
whatsapp.loadSessionsFromStorage();Menghapus Session
await whatsapp.deleteSession("mysessionid");Mengirim Pesan
Text
await whatsapp.sendTextMessage({
sessionId: "mysessionid",
to: "6281234567890",
text: "Halo dari server!"
});Gambar
const image = fs.readFileSync("./image.png");
await whatsapp.sendImage({ sessionId:"mysessionid", to:"6281234567890", text:"caption", media:image });Video
const video = fs.readFileSync("./video.mp4");
await whatsapp.sendVideo({ sessionId:"mysessionid", to:"6281234567890", text:"caption", media:video });Dokumen
const file = fs.readFileSync("file.pdf");
await whatsapp.sendDocument({ sessionId:"mysessionid", to:"6281234567890", filename:"file.pdf", media:file });Voice Note
const audio = fs.readFileSync("voice.mp3");
await whatsapp.sendVoiceNote({ sessionId:"mysessionid", to:"6281234567890", media:audio });Read Message
await whatsapp.readMessage({ sessionId:"mysessionid", key: msg.key });Typing Effect
await whatsapp.sendTyping({ sessionId:"mysessionid", to:"6281234567890", duration:3000 });Event Listener
Pesan Masuk
whatsapp.onMessageReceived((msg) => {
console.log(msg);
});QR Updated
whatsapp.onQRUpdated(({ sessionId, qr }) => {
console.log(qr);
});Session Connected
whatsapp.onConnected((id) => console.log("connected:", id));Session Disconnected (v2.0)
Callback onDisconnected sekarang menerima DisconnectInfo dengan detail alasan disconnect:
whatsapp.onDisconnected((sessionId, info) => {
console.log(`Session ${sessionId} disconnected`);
console.log(` Status code: ${info.statusCode}`); // 401, 408, 428, 515, dll
console.log(` Reason: ${info.reason}`); // "loggedOut", "timedOut", dll
console.log(` Permanent: ${info.permanent}`); // true jika harus scan QR ulang
if (!info.permanent) {
// Session auth masih tersimpan, bisa reconnect manual:
whatsapp.reconnectSession(sessionId);
}
});Session Reconnecting (v2.0)
Event baru yang di-emit setiap kali library melakukan auto-reconnect:
whatsapp.onReconnecting((sessionId, info) => {
console.log(`[${sessionId}] Reconnecting ${info.attempt}/${info.maxAttempts} in ${info.delayMs}ms (code: ${info.statusCode})`);
});Disconnect Reason Codes (v2.0)
| Code | Reason | Tindakan |
|------|--------|----------|
| 401 | loggedOut | Permanent - auth state dihapus, harus scan QR ulang |
| 408 | timedOut | Auto-reconnect |
| 428 | connectionReplaced | Auto-reconnect |
| 440 | multideviceMismatch | Auto-reconnect |
| 500 | serverError | Auto-reconnect |
| 515 | restartRequired | Auto-reconnect |
Menyimpan Media
whatsapp.onMessageReceived(async (msg) => {
if (msg.message?.imageMessage) msg.saveImage("./saved.jpg");
if (msg.message?.videoMessage) msg.saveVideo("./saved.mp4");
if (msg.message?.documentMessage) msg.saveDocument("./saved");
});Konfigurasi
whatsapp.setCredentialsDir("my_creds_folder");Migrasi dari v1.x ke v2.0
Breaking Changes
onDisconnectedcallback signature berubah// v1.x onDisconnected?: () => void; // v2.0 onDisconnected?: (info: DisconnectInfo) => void;Consumer yang menggunakan
onDisconnecteddistartSessionoptions harus update signature-nya.Global
onDisconnectedlistener signature berubah// v1.x whatsapp.onDisconnected((sessionId) => { ... }); // v2.0 whatsapp.onDisconnected((sessionId, info) => { ... });deleteSessiontidak lagi dipanggil otomatis saat disconnectDi v1.x, setiap disconnect yang gagal retry akan otomatis memanggil
deleteSession()(termasuklogout()ke WhatsApp server) sehingga session hancur permanen.Di v2.0, hanya disconnect 401 (loggedOut) yang menghapus auth state. Untuk disconnect lain (408, 428, dll), auth state dipertahankan agar bisa
reconnectSession().
Fitur Baru
autoReconnectconfig distartSessionoptionsonReconnectingevent (per-session dan global)reconnectSession(sessionId)untuk reconnect manualgetSessionStatus(sessionId)untuk cek status real-time- Baileys di-upgrade dari
7.0.0-rc.6ke7.0.0-rc13(fix connection deadlocks, memory leaks, security patch)
Kontributor
Original: https://github.com/mimamch ESM Port: https://github.com/east-tech-id
Feedback
https://github.com/east-tech-id/wa-multi-device-esm/issues
