diff --git a/.gitignore b/.gitignore index a851262d..10508850 100644 --- a/.gitignore +++ b/.gitignore @@ -11,15 +11,6 @@ yarn-debug.log* yarn-error.log* lerna-debug.log* -/store/auth/apikey/* -/store/auth/jwt/* -/store/baileys/* -/store/chats/* -/store/contacts/* -/store/message-up/* -/store/messages/* -/store/webhook/* - /docker-compose-data # Package @@ -41,5 +32,6 @@ lerna-debug.log* !/instances/.gitkeep /test/ /src/env.yml +/store /temp/* diff --git a/Dockerfile b/Dockerfile index 338efa4b..28e330e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,9 @@ FROM node:16.18-alpine +LABEL version="1.1.3" description="Api to control whatsapp features through http requests." +LABEL maintainer="Davidson Gomes" git="https://github.com/DavidsonGomes" +LABEL contact="contato@agenciadgcode.com" + RUN apk update && apk upgrade && \ apk add --no-cache git diff --git a/package.json b/package.json index 5c9525a5..0e73166f 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "evolution-api", - "version": "1.2.0", + "version": "1.1.3", "description": "Rest api for communication with WhatsApp", - "main": "index.js", + "main": "./dist/src/main.js", "scripts": { "build": "tsc", "start": "ts-node --files --transpile-only ./src/main.ts", diff --git a/src/config/env.config.ts b/src/config/env.config.ts index d1e0e70a..7fa4fe5c 100644 --- a/src/config/env.config.ts +++ b/src/config/env.config.ts @@ -160,7 +160,9 @@ export class ConfigService { } private envYaml(): Env { - return load(readFileSync(join(SRC_DIR, 'env.yml'), { encoding: 'utf-8' })) as Env; + return load( + readFileSync(join(process.cwd(), 'src', 'env.yml'), { encoding: 'utf-8' }), + ) as Env; } private envProcess(): Env { diff --git a/src/whatsapp/repository/repository.manager.ts b/src/whatsapp/repository/repository.manager.ts index 86b8c8b4..eac7b18e 100644 --- a/src/whatsapp/repository/repository.manager.ts +++ b/src/whatsapp/repository/repository.manager.ts @@ -5,6 +5,9 @@ import { MessageUpRepository } from './messageUp.repository'; import { MongoClient } from 'mongodb'; import { WebhookRepository } from './webhook.repository'; import { AuthRepository } from './auth.repository'; +import { Auth, ConfigService, Database } from '../../config/env.config'; +import { execSync } from 'child_process'; +import { join } from 'path'; export class RepositoryBroker { constructor( @@ -14,9 +17,11 @@ export class RepositoryBroker { public readonly messageUpdate: MessageUpRepository, public readonly webhook: WebhookRepository, public readonly auth: AuthRepository, + private configService: ConfigService, dbServer?: MongoClient, ) { this.dbClient = dbServer; + this.__init_repo_without_db__(); } private dbClient?: MongoClient; @@ -24,4 +29,22 @@ export class RepositoryBroker { public get dbServer() { return this.dbClient; } + + private __init_repo_without_db__() { + if (!this.configService.get('DATABASE').ENABLED) { + const storePath = join(process.cwd(), 'store'); + execSync( + `mkdir -p ${join( + storePath, + 'auth', + this.configService.get('AUTHENTICATION').TYPE, + )}`, + ); + execSync(`mkdir -p ${join(storePath, 'chats')}`); + execSync(`mkdir -p ${join(storePath, 'contacts')}`); + execSync(`mkdir -p ${join(storePath, 'messages')}`); + execSync(`mkdir -p ${join(storePath, 'message-up')}`); + execSync(`mkdir -p ${join(storePath, 'webhook')}`); + } + } } diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index bdb8cfc4..f3f4cd51 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -30,7 +30,6 @@ import makeWASocket, { WAMessageUpdate, WASocket, getAggregateVotesInPollMessage, - makeInMemoryStore, } from '@whiskeysockets/baileys'; import { Auth, @@ -141,7 +140,6 @@ export class WAStartupService { private readonly userDevicesCache: CacheStore = new NodeCache(); private endSession = false; private logBaileys = this.configService.get('LOG').BAILEYS; - private store = makeInMemoryStore({ logger: P({ level: this.logBaileys }) }); public set instanceName(name: string) { if (!name) { @@ -481,21 +479,30 @@ export class WAStartupService { if (full) { return webMessageInfo[0]; } + if (webMessageInfo[0].message?.pollCreationMessage) { + const messageSecretBase64 = + webMessageInfo[0].message?.messageContextInfo?.messageSecret; + + if (typeof messageSecretBase64 === 'string') { + const messageSecret = Buffer.from(messageSecretBase64, 'base64'); + + const msg = { + messageContextInfo: { + messageSecret, + }, + pollCreationMessage: webMessageInfo[0].message?.pollCreationMessage, + }; + + return msg; + } + } + return webMessageInfo[0].message; } catch (error) { return { conversation: '' }; } } - private async getMessageStore(key: proto.IMessageKey) { - if (this.store) { - const msg = await this.store.loadMessage(key.remoteJid, key.id); - return msg?.message || undefined; - } - - return proto.Message.fromObject({}); - } - private cleanStore() { const cleanStore = this.configService.get('CLEAN_STORE'); const database = this.configService.get('DATABASE'); @@ -551,12 +558,6 @@ export class WAStartupService { const session = this.configService.get('CONFIG_SESSION_PHONE'); const browser: WABrowserDescription = [session.CLIENT, session.NAME, release()]; - this.store?.readFromFile(`${this.storePath}/baileys/store.json`); - - setInterval(() => { - this.store?.writeToFile(`${this.storePath}/baileys/store.json`); - }, 10_000); - const socketConfig: UserFacingSocketConfig = { auth: { creds: this.instance.authState.state.creds, @@ -574,7 +575,7 @@ export class WAStartupService { emitOwnEvents: false, msgRetryCounterCache: this.msgRetryCounterCache, getMessage: async (key) => - (await this.getMessageStore(key)) as Promise, + (await this.getMessage(key)) as Promise, generateHighQualityLinkPreview: true, syncFullHistory: true, userDevicesCache: this.userDevicesCache, @@ -607,8 +608,6 @@ export class WAStartupService { this.client = makeWASocket(socketConfig); - this.store?.bind(this.client.ev); - this.eventHandler(); return this.client; @@ -824,7 +823,7 @@ export class WAStartupService { ) { let pollUpdates: any; if (update.pollUpdates) { - const pollCreation = await this.getMessageStore(key); + const pollCreation = await this.getMessage(key); if (pollCreation) { pollUpdates = getAggregateVotesInPollMessage({ message: pollCreation as proto.IMessage, @@ -1598,7 +1597,6 @@ export class WAStartupService { ); const typeMessage = getContentType(msg.message); - // if for audioMessage converte para mp3 if (convertToMp4 && typeMessage === 'audioMessage') { const number = msg.key.remoteJid.split('@')[0]; const convert = await this.processAudio(buffer.toString('base64'), number); diff --git a/src/whatsapp/whatsapp.module.ts b/src/whatsapp/whatsapp.module.ts index e971da78..6ef1cf68 100644 --- a/src/whatsapp/whatsapp.module.ts +++ b/src/whatsapp/whatsapp.module.ts @@ -47,6 +47,7 @@ export const repository = new RepositoryBroker( messageUpdateRepository, webhookRepository, authRepository, + configService, dbserver?.getClient(), ); diff --git a/store/auth/apikey/.gitkeep b/store/auth/apikey/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/store/auth/jwt/.gitkeep b/store/auth/jwt/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/store/chats/.gitkeep b/store/chats/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/store/contacts/.gitkeep b/store/contacts/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/store/message-up/.gitkeep b/store/message-up/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/store/messages/.gitkeep b/store/messages/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/store/webhook/.gitkeep b/store/webhook/.gitkeep deleted file mode 100644 index e69de29b..00000000