@natsuyuchn/baileys-redis-store
v1.0.4
Published
A robust and efficient Redis-based storage solution for WhatsApp applications using the Baileys library.
Downloads
84
Maintainers
Readme
📦 RedisStore for Baileys
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.
🚀 Features
- 🔗 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.
🛠️ Installation
To use RedisStore
, you'll need to install the necessary dependencies. Run the following command:
npm install baileys-redis-store
⚙️ Configuration
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)
});
📋 Methods
disconnect
async disconnect(): Promise<void>
Disconnects from the Redis server. 🔌
bind
async bind(ev: Partial<EventEmitter>): Promise<void>
Binds event handlers to the specified event emitter. 🛠️
loadMessage
async loadMessage(jid: string, id: string): Promise<WAMessage | undefined>
Loads a single message from the cache or database. 📩
loadMessages
async loadMessages(jid: string, count: number, cursor?: { before?: WAMessageKey }): Promise<WAMessage[]>
Loads a list of messages from the database. 🗂️
getMessage
async getMessage(key: WAMessageKey): Promise<WAMessageContent | undefined>
Retrieves the content of a message. 📝
searchMessages
async searchMessages(options: MessageSearchOptions): Promise<WAMessage[]>
Searches for messages based on the given criteria. 🔍
getChat
async getChat(jid: string): Promise<Chat | null>
Retrieves chat details from the database. 💬
getContact
async getContact(jid: string): Promise<Contact | null>
Retrieves contact details from the database. 👤
getGroup
async getGroup(jid: string): Promise<GroupMetadata | null>
Retrieves group metadata from the database. 🧑🤝🧑
clearAll
async clearAll(): Promise<void>
Clears all data from the Redis cache and local cache. 🗑️
📚 Usage Example
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);
});