@akson/chatsuite-sdk
Version:
Production-ready TypeScript SDK for ChatSuite - WhatsApp automation with built-in session management, message queuing, webhook server, and database sync
215 lines (182 loc) โข 6.98 kB
text/typescript
/**
* Session Management Example
*
* Demonstrates advanced session management features:
* - MongoDB session persistence
* - Auto-reconnection logic
* - Health monitoring
* - Multiple session handling
*
* Run: npx ts-node examples/session-management.ts
*/
import {
SessionManager,
MongoSessionStore,
InMemorySessionStore
} from '../src/index';
async function sessionManagementExample() {
console.log('๐๏ธ Session Management Example');
// Choose storage backend
const useMongoStorage = process.env.MONGODB_URI ? true : false;
const sessionManager = new SessionManager({
store: useMongoStorage
? new MongoSessionStore({
uri: process.env.MONGODB_URI!,
database: 'whatsapp_sessions',
collection: 'sessions'
})
: new InMemorySessionStore(),
autoReconnect: true,
qrCodeExpiry: 60000, // 1 minute
maxReconnectAttempts: 5,
reconnectDelay: 5000, // 5 seconds
healthCheckInterval: 30000 // 30 seconds
});
// Initialize session manager
console.log('Initializing session manager...');
await sessionManager.initialize();
console.log(`โ
Session manager initialized with ${useMongoStorage ? 'MongoDB' : 'in-memory'} storage`);
// Event handlers
sessionManager.on('session:created', (session) => {
console.log(`โจ Session created: ${session.phoneNumber} (${session.sessionId})`);
});
sessionManager.on('session:qr', (session) => {
console.log(`๐ฑ QR Code available for ${session.phoneNumber}`);
console.log(`QR expires at: ${session.qrCodeExpiry}`);
// In a real app, you would display the QR code to the user
// console.log('QR Code:', session.qrCode);
});
sessionManager.on('session:connected', (session) => {
console.log(`๐ Session connected: ${session.phoneNumber}`);
console.log(`Connected at: ${session.lastConnected}`);
});
sessionManager.on('session:disconnected', (session) => {
console.log(`โ Session disconnected: ${session.phoneNumber}`);
});
sessionManager.on('session:expired', (phoneNumber) => {
console.log(`โฐ Session expired and removed: ${phoneNumber}`);
});
sessionManager.on('health:check', (phoneNumber, health) => {
console.log(`๐ฅ Health check for ${phoneNumber}: ${health.status}`);
if (health.latency) {
console.log(` Latency: ${health.latency}ms`);
}
if (health.errors && health.errors.length > 0) {
console.log(` Errors: ${health.errors.join(', ')}`);
}
});
// Create multiple sessions
const phoneNumbers = [
'+1234567890',
'+0987654321',
'+1122334455'
];
console.log('\n๐ฑ Creating sessions...');
for (const phoneNumber of phoneNumbers) {
try {
const session = await sessionManager.createOrRestore(
phoneNumber,
`Session for ${phoneNumber}`
);
console.log(`โ
Created session: ${session.phoneNumber}`);
// Simulate QR code generation
await sessionManager.updateQRCode(phoneNumber, `qr-code-${Date.now()}`);
// Simulate connection after some delay
setTimeout(async () => {
try {
await sessionManager.markConnected(phoneNumber, {
// Baileys session data would go here
creds: { noiseKey: 'example' },
keys: { preKeys: {} }
});
} catch (error) {
console.log(`Failed to connect ${phoneNumber}:`, error.message);
}
}, Math.random() * 5000); // Random delay 0-5 seconds
} catch (error) {
console.error(`โ Failed to create session for ${phoneNumber}:`, error.message);
}
}
// Monitor sessions
setInterval(async () => {
try {
const allSessions = await sessionManager.getAllSessions();
console.log('\n๐ Session Status Summary:');
console.log(`Total sessions: ${allSessions.length}`);
const statusCounts = allSessions.reduce((acc, session) => {
acc[session.status] = (acc[session.status] || 0) + 1;
return acc;
}, {} as Record<string, number>);
for (const [status, count] of Object.entries(statusCounts)) {
console.log(` ${status}: ${count}`);
}
// Health check for connected sessions
for (const session of allSessions) {
if (session.status === 'connected') {
const health = await sessionManager.getSessionHealth(session.phoneNumber);
if (health) {
console.log(` ${session.phoneNumber}: ${health.status}`);
}
}
}
} catch (error) {
console.error('Error monitoring sessions:', error);
}
}, 15000); // Every 15 seconds
// Simulate random disconnections
setInterval(async () => {
try {
const allSessions = await sessionManager.getAllSessions();
const connectedSessions = allSessions.filter(s => s.status === 'connected');
if (connectedSessions.length > 0 && Math.random() < 0.3) {
const randomSession = connectedSessions[Math.floor(Math.random() * connectedSessions.length)];
console.log(`\n๐ Simulating disconnection for ${randomSession.phoneNumber}`);
await sessionManager.markDisconnected(randomSession.phoneNumber);
}
} catch (error) {
console.error('Error in disconnect simulation:', error);
}
}, 20000); // Every 20 seconds
// Cleanup old sessions periodically
setInterval(async () => {
try {
const allSessions = await sessionManager.getAllSessions();
const oldSessions = allSessions.filter(session => {
const age = Date.now() - session.lastConnected?.getTime() || 0;
return age > 5 * 60 * 1000; // 5 minutes old
});
for (const oldSession of oldSessions) {
if (oldSession.status === 'disconnected') {
console.log(`๐งน Cleaning up old session: ${oldSession.phoneNumber}`);
await sessionManager.deleteSession(oldSession.phoneNumber);
}
}
} catch (error) {
console.error('Error in cleanup:', error);
}
}, 60000); // Every minute
console.log('\n๐ฎ Session management demo running!');
console.log('Features demonstrated:');
console.log(' โ
Multi-session management');
console.log(' โ
Automatic persistence');
console.log(' โ
Health monitoring');
console.log(' โ
Auto-reconnection');
console.log(' โ
Event-driven updates');
console.log('\nPress Ctrl+C to stop...');
// Graceful shutdown
process.on('SIGINT', async () => {
console.log('\n๐ Shutting down session manager...');
await sessionManager.stop();
console.log('โ
Session manager stopped');
process.exit(0);
});
}
// Handle errors
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
});
// Run the example
if (require.main === module) {
sessionManagementExample().catch(console.error);
}
export { sessionManagementExample };