Fix reconnect logic and audio mimetype support

This commit is contained in:
Hamza-Ayed
2026-05-22 19:42:41 +03:00
parent de6e90d873
commit cdfdcd1eb8
3 changed files with 25 additions and 16 deletions

View File

@@ -231,25 +231,29 @@ async function startSession(session_key, webhook_url) {
if (connection === 'close') {
const statusCode = lastDisconnect?.error?.output?.statusCode;
const shouldReconnect = statusCode !== DisconnectReason.loggedOut;
const retries = (retryCounters.get(session_key) || 0) + 1;
retryCounters.set(session_key, retries);
console.log(`[Connection] ${session_key} closed | code=${statusCode} | retry=${retries}/${MAX_RETRIES} | shouldReconnect=${shouldReconnect}`);
if (shouldReconnect && retries <= MAX_RETRIES) {
// Try reconnecting with exponential backoff
if (!shouldReconnect) {
console.log(`[Connection] ${session_key} permanently closed (logged out). Cleaning up.`);
sessions.delete(session_key);
const delay = Math.min(retries * 3000, 15000); // 3s, 6s, 9s, 12s, 15s
console.log(`[Connection] Reconnecting ${session_key} in ${delay}ms...`);
setTimeout(() => startSession(session_key, webhook_url), delay);
} else {
// Either logged out, banned, or max retries exceeded
console.log(`[Connection] ${session_key} permanently closed. Cleaning up.`);
await cleanupSession(session_key);
await sendWebhook(webhook_url, {
session_key,
state: 'disconnected'
});
} else {
const retries = (retryCounters.get(session_key) || 0) + 1;
retryCounters.set(session_key, retries);
sessions.delete(session_key);
let delay;
if (retries <= MAX_RETRIES) {
delay = Math.min(retries * 3000, 15000); // 3s, 6s, 9s, 12s, 15s
console.log(`[Connection] Reconnecting ${session_key} (quick retry ${retries}/${MAX_RETRIES}) in ${delay}ms...`);
} else {
delay = 60000; // 60s
console.log(`[Connection] Reconnecting ${session_key} (long-term retry ${retries}) in 60s...`);
}
setTimeout(() => startSession(session_key, webhook_url), delay);
}
} else if (connection === 'open') {
console.log(`[Connection] ✅ ${session_key} connected successfully!`);
@@ -310,7 +314,7 @@ async function disconnectSession(session_key) {
/**
* Send a message using an active session
*/
async function sendMessage(session_key, phone, message, mediaUrl = null, audioBase64 = null) {
async function sendMessage(session_key, phone, message, mediaUrl = null, audioBase64 = null, mimetype = null) {
const sock = sessions.get(session_key);
if (!sock) {
throw new Error(`Session ${session_key} is not active or connected`);
@@ -323,7 +327,7 @@ async function sendMessage(session_key, phone, message, mediaUrl = null, audioBa
const buffer = Buffer.from(audioBase64, 'base64');
sentMsg = await sock.sendMessage(jid, {
audio: buffer,
mimetype: 'audio/mp4',
mimetype: mimetype || 'audio/mp4',
ptt: true
});
} else if (mediaUrl) {

View File

@@ -84,7 +84,7 @@ app.get('/api/sessions/active', (req, res) => {
// Send outbound message
app.post('/api/messages/send', async (req, res) => {
const { session_key, phone, message, media_url, audio } = req.body;
const { session_key, phone, message, media_url, audio, mimetype } = req.body;
if (!session_key || !phone) {
return res.status(400).json({ error: 'Missing session_key or phone' });
@@ -95,7 +95,7 @@ app.post('/api/messages/send', async (req, res) => {
}
try {
const result = await sendMessage(session_key, phone, message, media_url, audio);
const result = await sendMessage(session_key, phone, message, media_url, audio, mimetype);
res.json({ status: 'success', data: result });
} catch (err) {
console.error(`Error sending message via ${session_key} to ${phone}:`, err);