The RedisStore
class provides an efficient way to manage and cache messages, chats, contacts, and more using Redis. This class integrates seamlessly with the Baileys library and offers a robust solution for handling and storing WhatsApp-related data.
- 🔗 Redis Integration: Connects to a Redis server to store and manage data.
- 🔄 Event Handling: Listens and responds to various Baileys events such as connection updates and message reactions.
- 💾 Data Caching: Implements caching for messages to improve performance and reduce Redis load.
- 🔍 Message Search: Provides functionality to search for messages based on different criteria.
- 🗑️ Data Clearing: Allows clearing all cached data from Redis and local storage.
To use RedisStore
, you'll need to install the necessary dependencies. Run the following command:
npm install baileys-redis-store
To set up RedisStore
, create a new instance by providing the required configuration options:
import pino from 'pino';
import { RedisStore } from 'baileys-redis-store'; // Adjust the import path as necessary
// Create a Redis client with connection options
const redisClient: RedisClientType = createClient({
url: "YOUR REDIS URL"
});
// Create a RedisStore instance for managing Baileys store data
const store = new RedisStore({
redisConnection: redisClient,
prefix: 'store', // Optional prefix for Redis keys
logger: pino({ level: 'debug' }), // Optional Pino logger instance
maxCacheSize: 5000, // Maximum number of messages to cache locally (defaults to 1000)
});
async disconnect(): Promise<void>
Disconnects from the Redis server. 🔌
async bind(ev: Partial<EventEmitter>): Promise<void>
Binds event handlers to the specified event emitter. 🛠️
async loadMessage(jid: string, id: string): Promise<WAMessage | undefined>
Loads a single message from the cache or database. 📩
async loadMessages(jid: string, count: number, cursor?: { before?: WAMessageKey }): Promise<WAMessage[]>
Loads a list of messages from the database. 🗂️
async getMessage(key: WAMessageKey): Promise<WAMessageContent | undefined>
Retrieves the content of a message. 📝
async searchMessages(options: MessageSearchOptions): Promise<WAMessage[]>
Searches for messages based on the given criteria. 🔍
async getChat(jid: string): Promise<Chat | null>
Retrieves chat details from the database. 💬
async getContact(jid: string): Promise<Contact | null>
Retrieves contact details from the database. 👤
async getGroup(jid: string): Promise<GroupMetadata | null>
Retrieves group metadata from the database. 🧑🤝🧑
async clearAll(): Promise<void>
Clears all data from the Redis cache and local cache. 🗑️
Here's a basic example of how to use the RedisStore
:
import makeWASocket, { useMultiFileAuthState } from '@whiskeysockets/baileys';
import { RedisStore } from 'baileys-redis-store'; // Import RedisStore for managing Redis-based session storage
import pino from 'pino'; // Import Pino for logging
import { createClient, RedisClientType } from 'redis'; // Import Redis client utilities
/**
* Main function to set up the WhatsApp socket connection and Redis store.
*/
async function main() {
// Create a Redis client with connection options
const redisClient: RedisClientType = createClient({
url: "YOUR REDIS URL"
});
// Handle Redis connection errors
redisClient.on('error', (err) => {
console.error('Redis Client Error:', err);
// Optionally attempt to reconnect
// setTimeout(() => redisClient.connect(), 5000); // Retry connection after 5 seconds
});
// Connect to the Redis server
try {
await redisClient.connect();
console.log('Connected to Redis successfully!');
} catch (error) {
console.error('Error connecting to Redis:', error);
return; // Exit if connection fails
}
// Create a RedisStore instance for managing Baileys store data
const store = new RedisStore({
redisConnection: redisClient,
prefix: 'store', // Optional prefix for Redis keys
logger: pino({ level: 'debug' }), // Optional Pino logger instance
maxCacheSize: 5000, // Maximum number of messages to cache locally (defaults to 1000)
});
// Load authentication state from multi-file storage
const { state, saveCreds } = await useMultiFileAuthState('./Test');
// Create a WhatsApp socket connection with the specified configuration
const sock = makeWASocket({
auth: state,
printQRInTerminal: true,
getMessage: store.getMessage.bind(store), // Bind the context for getMessage method
});
// Listen for credentials updates and save them
sock.ev.on('creds.update', saveCreds);
// Bind the store to the WhatsApp socket event emitter
await store.bind(sock.ev as any);
// Handle incoming messages
sock.ev.on('messages.upsert', async ({ messages }) => {
const msg = messages[0];
// Example of loading a specific message by ID
const loadMessage = store.loadMessage("12343434@jid", "04FC413D6BE3C1XXXX");
// Example of loading the latest messages (up to 40) for a specific chat
const loadMessages = store.loadMessages("12343434@jid", 40);
});
// Gracefully disconnect from Redis on process exit
process.on('SIGINT', async () => {
console.log('Disconnecting from Redis...');
await redisClient.quit();
console.log('Disconnected from Redis.');
process.exit(0); // Exit cleanly
});
}
// Execute the main function and handle any errors
main().catch((error) => {
console.error('Main function error:', error);
});