wailey-whatsapp-lib
Version:
A robust WhatsApp library for Node.js with support for QR code and pairing code authentication
98 lines (86 loc) • 2.77 kB
JavaScript
/**
* WhatsApp connection functionality
*/
;
const { default: makeWASocket, fetchLatestBaileysVersion, generatePairingCode } = require('@whiskeysockets/baileys');
const { delay } = require('./utils');
/**
* Connect to WhatsApp
* @param {Object} options - Connection options
* @returns {Promise<Object>} Connection result
*/
async function connectToWhatsApp(options) {
const {
logger,
printQRInTerminal = true,
auth,
browser = ['Wailey WhatsApp Library', 'Chrome', '112.0.5615.49'],
version,
qrTimeout = 30000,
qrCallback,
pairingCode = false,
phoneNumber = ''
} = options;
try {
// Fetch the latest version of WhatsApp Web
const { version: baileyVersion } = await fetchLatestBaileysVersion();
const socketVersion = version || baileyVersion;
// Create socket connection
const sock = makeWASocket({
version: socketVersion,
logger,
printQRInTerminal,
auth,
browser,
// Important: Don't set getMessage for normal connection
...(pairingCode ? {
getMessage: async () => {
return { conversation: 'hello' };
}
} : {}),
qrTimeout
});
// Set up QR code callback if provided
if (qrCallback && typeof qrCallback === 'function') {
// Wait for connection update that includes QR code
const qrPromise = new Promise((resolve) => {
const connectionUpdateHandler = ({ qr }) => {
if (qr) {
qrCallback(qr);
sock.ev.off('connection.update', connectionUpdateHandler);
resolve();
}
};
sock.ev.on('connection.update', connectionUpdateHandler);
// Set a timeout to avoid hanging forever
setTimeout(() => {
sock.ev.off('connection.update', connectionUpdateHandler);
resolve();
}, qrTimeout);
});
// Wait briefly for initial connection update events
await qrPromise;
}
// Handle pairing code generation if requested
let generatedPairingCode = null;
if (pairingCode && phoneNumber) {
try {
// Wait for socket to be ready before generating pairing code
await delay(3000);
generatedPairingCode = await generatePairingCode(sock, phoneNumber);
console.log(`Pairing code generated: ${generatedPairingCode}`);
} catch (error) {
console.error('Failed to generate pairing code:', error);
throw new Error(`Pairing code generation failed: ${error.message}`);
}
}
return {
sock,
code: generatedPairingCode
};
} catch (error) {
console.error('WhatsApp connection error:', error);
throw error;
}
}
module.exports = { connectToWhatsApp };