feat: add Baileys WhatsApp session with reconnect logic
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
"test": "jest"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hapi/boom": "^10.0.1",
|
||||
"@tower/config": "workspace:*",
|
||||
"@tower/logger": "workspace:*",
|
||||
"@tower/types": "workspace:*",
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
import makeWASocket, {
|
||||
useMultiFileAuthState,
|
||||
fetchLatestBaileysVersion,
|
||||
DisconnectReason,
|
||||
WASocket,
|
||||
proto,
|
||||
GroupMetadata,
|
||||
} from '@whiskeysockets/baileys';
|
||||
import { Boom } from '@hapi/boom';
|
||||
import { createLogger } from '@tower/logger';
|
||||
|
||||
const logger = createLogger('whatsapp-session');
|
||||
|
||||
export type OnMessageCallback = (msg: proto.IWebMessageInfo) => void;
|
||||
export type OnGroupsCallback = (groups: Record<string, GroupMetadata>) => void;
|
||||
|
||||
export async function createWhatsAppSession(
|
||||
sessionPath: string,
|
||||
onMessage: OnMessageCallback,
|
||||
onGroups: OnGroupsCallback,
|
||||
): Promise<WASocket> {
|
||||
const { state, saveCreds } = await useMultiFileAuthState(sessionPath);
|
||||
const { version } = await fetchLatestBaileysVersion();
|
||||
|
||||
const sock = makeWASocket({
|
||||
version,
|
||||
auth: state,
|
||||
printQRInTerminal: true,
|
||||
logger: logger as any,
|
||||
});
|
||||
|
||||
sock.ev.on('creds.update', saveCreds);
|
||||
|
||||
sock.ev.on('connection.update', async ({ connection, lastDisconnect }) => {
|
||||
if (connection === 'close') {
|
||||
const reason = (lastDisconnect?.error as Boom)?.output?.statusCode;
|
||||
const shouldReconnect = reason !== DisconnectReason.loggedOut;
|
||||
logger.info({ reason, shouldReconnect }, 'Connection closed');
|
||||
if (shouldReconnect) {
|
||||
logger.info('Reconnecting in 5s...');
|
||||
setTimeout(() => createWhatsAppSession(sessionPath, onMessage, onGroups), 5000);
|
||||
}
|
||||
} else if (connection === 'open') {
|
||||
logger.info('WhatsApp connected');
|
||||
const groups = await sock.groupFetchAllParticipating();
|
||||
onGroups(groups);
|
||||
}
|
||||
});
|
||||
|
||||
sock.ev.on('messages.upsert', ({ messages, type }) => {
|
||||
if (type !== 'notify') return;
|
||||
for (const msg of messages) {
|
||||
onMessage(msg);
|
||||
}
|
||||
});
|
||||
|
||||
return sock;
|
||||
}
|
||||
Reference in New Issue
Block a user