diff --git a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts index 1e3bdcf1..922dd017 100644 --- a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts +++ b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts @@ -266,6 +266,28 @@ export class BaileysStartupService extends ChannelStartupService { this.client?.ws?.close(); + const db = this.configService.get('DATABASE'); + const cache = this.configService.get('CACHE'); + const provider = this.configService.get('PROVIDER'); + + if (provider?.ENABLED) { + const authState = await this.authStateProvider.authStateProvider(this.instance.id); + + await authState.removeCreds() + } + + if (cache?.REDIS.ENABLED && cache?.REDIS.SAVE_INSTANCES) { + const authState = await useMultiFileAuthStateRedisDb(this.instance.id, this.cache); + + await authState.removeCreds() + } + + if (db.SAVE_DATA.INSTANCE) { + const authState = await useMultiFileAuthStatePrisma(this.instance.id, this.cache); + + await authState.removeCreds() + } + const sessionExists = await this.prismaRepository.session.findFirst({ where: { sessionId: this.instanceId } }); if (sessionExists) { await this.prismaRepository.session.delete({ where: { sessionId: this.instanceId } }); diff --git a/src/utils/use-multi-file-auth-state-prisma.ts b/src/utils/use-multi-file-auth-state-prisma.ts index 0f7faa07..2a8f9514 100644 --- a/src/utils/use-multi-file-auth-state-prisma.ts +++ b/src/utils/use-multi-file-auth-state-prisma.ts @@ -5,6 +5,7 @@ import { INSTANCE_DIR } from '@config/path.config'; import { AuthenticationState, BufferJSON, initAuthCreds, WAProto as proto } from 'baileys'; import fs from 'fs/promises'; import path from 'path'; +import {Logger} from "@config/logger.config"; const fixFileName = (file: string): string | undefined => { if (!file) { @@ -73,12 +74,15 @@ async function fileExists(file: string): Promise { } } +const logger = new Logger('useMultiFileAuthStatePrisma'); + export default async function useMultiFileAuthStatePrisma( sessionId: string, cache: CacheService, ): Promise<{ state: AuthenticationState; saveCreds: () => Promise; + removeCreds: () => Promise; }> { const localFolder = path.join(INSTANCE_DIR, sessionId); const localFile = (key: string) => path.join(localFolder, fixFileName(key) + '.json'); @@ -142,6 +146,27 @@ export default async function useMultiFileAuthStatePrisma( } } + async function removeCreds(): Promise { + + const cacheConfig = configService.get('CACHE'); + + // Redis + try { + if (cacheConfig.REDIS.ENABLED) { + await cache.delete(sessionId); + logger.info({ action: 'redis.delete', sessionId }); + + return + } + } catch (err) { + logger.warn({ action: 'redis.delete', sessionId, err }); + } + + logger.info({ action: 'auth.key.delete', sessionId }); + + await deleteAuthKey(sessionId); + } + let creds = await readData('creds'); if (!creds) { creds = initAuthCreds(); @@ -183,5 +208,7 @@ export default async function useMultiFileAuthStatePrisma( saveCreds: () => { return writeData(creds, 'creds'); }, + + removeCreds }; } diff --git a/src/utils/use-multi-file-auth-state-provider-files.ts b/src/utils/use-multi-file-auth-state-provider-files.ts index 6a15d654..a1e94a1d 100644 --- a/src/utils/use-multi-file-auth-state-provider-files.ts +++ b/src/utils/use-multi-file-auth-state-provider-files.ts @@ -39,7 +39,11 @@ import { Logger } from '@config/logger.config'; import { AuthenticationCreds, AuthenticationState, BufferJSON, initAuthCreds, proto, SignalDataTypeMap } from 'baileys'; import { isNotEmpty } from 'class-validator'; -export type AuthState = { state: AuthenticationState; saveCreds: () => Promise }; +export type AuthState = { + state: AuthenticationState; + saveCreds: () => Promise + removeCreds: () => Promise; +}; export class AuthStateProvider { constructor(private readonly providerFiles: ProviderFiles) {} @@ -86,6 +90,19 @@ export class AuthStateProvider { return response; }; + const removeCreds = async () => { + + const [response, error] = await this.providerFiles.removeSession(instance); + if (error) { + // this.logger.error(['removeData', error?.message, error?.stack]); + return; + } + + logger.info({ action: 'remove.session', instance }); + + return; + }; + const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds(); return { @@ -126,6 +143,10 @@ export class AuthStateProvider { saveCreds: async () => { return await writeData(creds, 'creds'); }, + + removeCreds }; } } + +const logger = new Logger('useMultiFileAuthStatePrisma'); diff --git a/src/utils/use-multi-file-auth-state-redis-db.ts b/src/utils/use-multi-file-auth-state-redis-db.ts index 2f10c671..285f7e80 100644 --- a/src/utils/use-multi-file-auth-state-redis-db.ts +++ b/src/utils/use-multi-file-auth-state-redis-db.ts @@ -8,6 +8,7 @@ export async function useMultiFileAuthStateRedisDb( ): Promise<{ state: AuthenticationState; saveCreds: () => Promise; + removeCreds: () => Promise; }> { const logger = new Logger('useMultiFileAuthStateRedisDb'); @@ -36,6 +37,17 @@ export async function useMultiFileAuthStateRedisDb( } }; + async function removeCreds(): Promise { + try { + + logger.warn({ action: 'redis.delete', instanceName }); + + return await cache.delete(instanceName); + } catch { + return; + } + } + const creds: AuthenticationCreds = (await readData('creds')) || initAuthCreds(); return { @@ -76,5 +88,7 @@ export async function useMultiFileAuthStateRedisDb( saveCreds: async () => { return await writeData(creds, 'creds'); }, + + removeCreds }; }