diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e5d940e..cbb4f5e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * Added extra files for chatwoot and appsmith * Added Get Last Message and Archive for Chat * Added env var QRCODE_COLOR +* Added websocket with lib socket.io ### Fixed diff --git a/package.json b/package.json index 4d6b2389..b9386ca6 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "qrcode-terminal": "^0.12.0", "redis": "^4.6.5", "sharp": "^0.30.7", + "socket.io": "^4.7.1", "uuid": "^9.0.0" }, "devDependencies": { diff --git a/src/db/db.connect.ts b/src/libs/db.connect.ts similarity index 100% rename from src/db/db.connect.ts rename to src/libs/db.connect.ts diff --git a/src/db/redis.client.ts b/src/libs/redis.client.ts similarity index 100% rename from src/db/redis.client.ts rename to src/libs/redis.client.ts diff --git a/src/libs/socket.ts b/src/libs/socket.ts new file mode 100644 index 00000000..4be23d01 --- /dev/null +++ b/src/libs/socket.ts @@ -0,0 +1,40 @@ +import { Server } from 'http'; +import { Server as SocketIO } from 'socket.io'; + +import { configService, Cors } from '../config/env.config'; +import { Logger } from '../config/logger.config'; + +const logger = new Logger('Socket'); + +let io: SocketIO; + +const cors = configService.get('CORS').ORIGIN; + +export const initIO = (httpServer: Server) => { + logger.verbose('Initializing Socket.io'); + io = new SocketIO(httpServer, { + cors: { + origin: cors, + }, + }); + + io.on('connection', (socket) => { + logger.verbose('Client connected'); + socket.on('disconnect', () => { + logger.verbose('Client disconnected'); + }); + }); + + return io; +}; + +export const getIO = (): SocketIO => { + logger.verbose('Getting Socket.io'); + + if (!io) { + logger.error('Socket.io not initialized'); + throw new Error('Socket.io not initialized'); + } + + return io; +}; diff --git a/src/main.ts b/src/main.ts index 1077d64d..298f49f2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,6 +9,7 @@ import { configService, Cors, HttpServer } from './config/env.config'; import { onUnexpectedError } from './config/error.config'; import { Logger } from './config/logger.config'; import { ROOT_DIR } from './config/path.config'; +import { initIO } from './libs/socket'; import { ServerUP } from './utils/server-up'; import { HttpStatus, router } from './whatsapp/routers/index.router'; import { waMonitor } from './whatsapp/whatsapp.module'; @@ -83,6 +84,8 @@ function bootstrap() { initWA(); + initIO(server); + onUnexpectedError(); } diff --git a/src/utils/use-multi-file-auth-state-db.ts b/src/utils/use-multi-file-auth-state-db.ts index 8b0d76e4..a021372a 100644 --- a/src/utils/use-multi-file-auth-state-db.ts +++ b/src/utils/use-multi-file-auth-state-db.ts @@ -9,7 +9,7 @@ import { import { configService, Database } from '../config/env.config'; import { Logger } from '../config/logger.config'; -import { dbserver } from '../db/db.connect'; +import { dbserver } from '../libs/db.connect'; export async function useMultiFileAuthStateDb( coll: string, 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 57439ced..8e685b54 100644 --- a/src/utils/use-multi-file-auth-state-redis-db.ts +++ b/src/utils/use-multi-file-auth-state-redis-db.ts @@ -7,7 +7,7 @@ import { } from '@whiskeysockets/baileys'; import { Logger } from '../config/logger.config'; -import { RedisCache } from '../db/redis.client'; +import { RedisCache } from '../libs/redis.client'; export async function useMultiFileAuthStateRedisDb(cache: RedisCache): Promise<{ state: AuthenticationState; diff --git a/src/whatsapp/controllers/instance.controller.ts b/src/whatsapp/controllers/instance.controller.ts index 04f45a4a..e2b81695 100644 --- a/src/whatsapp/controllers/instance.controller.ts +++ b/src/whatsapp/controllers/instance.controller.ts @@ -4,8 +4,8 @@ import EventEmitter2 from 'eventemitter2'; import { ConfigService, HttpServer } from '../../config/env.config'; import { Logger } from '../../config/logger.config'; -import { RedisCache } from '../../db/redis.client'; import { BadRequestException, InternalServerErrorException } from '../../exceptions'; +import { RedisCache } from '../../libs/redis.client'; import { InstanceDto } from '../dto/instance.dto'; import { RepositoryBroker } from '../repository/repository.manager'; import { AuthService, OldToken } from '../services/auth.service'; diff --git a/src/whatsapp/guards/instance.guard.ts b/src/whatsapp/guards/instance.guard.ts index 69d20414..144f4d40 100644 --- a/src/whatsapp/guards/instance.guard.ts +++ b/src/whatsapp/guards/instance.guard.ts @@ -4,8 +4,8 @@ import { join } from 'path'; import { configService, Database, Redis } from '../../config/env.config'; import { INSTANCE_DIR } from '../../config/path.config'; -import { dbserver } from '../../db/db.connect'; import { BadRequestException, ForbiddenException, NotFoundException } from '../../exceptions'; +import { dbserver } from '../../libs/db.connect'; import { InstanceDto } from '../dto/instance.dto'; import { cache, waMonitor } from '../whatsapp.module'; diff --git a/src/whatsapp/models/auth.model.ts b/src/whatsapp/models/auth.model.ts index 5c5b6a41..0f7d5ec3 100644 --- a/src/whatsapp/models/auth.model.ts +++ b/src/whatsapp/models/auth.model.ts @@ -1,6 +1,6 @@ import { Schema } from 'mongoose'; -import { dbserver } from '../../db/db.connect'; +import { dbserver } from '../../libs/db.connect'; export class AuthRaw { _id?: string; diff --git a/src/whatsapp/models/chat.model.ts b/src/whatsapp/models/chat.model.ts index 20153603..053d100e 100644 --- a/src/whatsapp/models/chat.model.ts +++ b/src/whatsapp/models/chat.model.ts @@ -1,6 +1,6 @@ import { Schema } from 'mongoose'; -import { dbserver } from '../../db/db.connect'; +import { dbserver } from '../../libs/db.connect'; export class ChatRaw { _id?: string; diff --git a/src/whatsapp/models/chatwoot.model.ts b/src/whatsapp/models/chatwoot.model.ts index d72f6e74..18d6b6f0 100644 --- a/src/whatsapp/models/chatwoot.model.ts +++ b/src/whatsapp/models/chatwoot.model.ts @@ -1,6 +1,6 @@ import { Schema } from 'mongoose'; -import { dbserver } from '../../db/db.connect'; +import { dbserver } from '../../libs/db.connect'; export class ChatwootRaw { _id?: string; diff --git a/src/whatsapp/models/contact.model.ts b/src/whatsapp/models/contact.model.ts index d9b51e1e..f5936b61 100644 --- a/src/whatsapp/models/contact.model.ts +++ b/src/whatsapp/models/contact.model.ts @@ -1,6 +1,6 @@ import { Schema } from 'mongoose'; -import { dbserver } from '../../db/db.connect'; +import { dbserver } from '../../libs/db.connect'; export class ContactRaw { _id?: string; diff --git a/src/whatsapp/models/message.model.ts b/src/whatsapp/models/message.model.ts index 764b04d9..a5790be7 100644 --- a/src/whatsapp/models/message.model.ts +++ b/src/whatsapp/models/message.model.ts @@ -1,6 +1,6 @@ import { Schema } from 'mongoose'; -import { dbserver } from '../../db/db.connect'; +import { dbserver } from '../../libs/db.connect'; import { wa } from '../types/wa.types'; class Key { diff --git a/src/whatsapp/models/settings.model.ts b/src/whatsapp/models/settings.model.ts index c928be42..48593fbe 100644 --- a/src/whatsapp/models/settings.model.ts +++ b/src/whatsapp/models/settings.model.ts @@ -1,6 +1,6 @@ import { Schema } from 'mongoose'; -import { dbserver } from '../../db/db.connect'; +import { dbserver } from '../../libs/db.connect'; export class SettingsRaw { _id?: string; diff --git a/src/whatsapp/models/webhook.model.ts b/src/whatsapp/models/webhook.model.ts index fa91326c..05a222e0 100644 --- a/src/whatsapp/models/webhook.model.ts +++ b/src/whatsapp/models/webhook.model.ts @@ -1,6 +1,6 @@ import { Schema } from 'mongoose'; -import { dbserver } from '../../db/db.connect'; +import { dbserver } from '../../libs/db.connect'; export class WebhookRaw { _id?: string; diff --git a/src/whatsapp/routers/instance.router.ts b/src/whatsapp/routers/instance.router.ts index 20aa434c..96a1a5da 100644 --- a/src/whatsapp/routers/instance.router.ts +++ b/src/whatsapp/routers/instance.router.ts @@ -2,7 +2,7 @@ import { RequestHandler, Router } from 'express'; import { Auth, ConfigService, Database } from '../../config/env.config'; import { Logger } from '../../config/logger.config'; -import { dbserver } from '../../db/db.connect'; +import { dbserver } from '../../libs/db.connect'; import { instanceNameSchema, oldTokenSchema } from '../../validate/validate.schema'; import { RouterBroker } from '../abstract/abstract.router'; import { InstanceDto } from '../dto/instance.dto'; diff --git a/src/whatsapp/services/monitor.service.ts b/src/whatsapp/services/monitor.service.ts index f64c9a54..039a5f29 100644 --- a/src/whatsapp/services/monitor.service.ts +++ b/src/whatsapp/services/monitor.service.ts @@ -7,9 +7,9 @@ import { join } from 'path'; import { Auth, ConfigService, Database, DelInstance, HttpServer, Redis } from '../../config/env.config'; import { Logger } from '../../config/logger.config'; import { INSTANCE_DIR, STORE_DIR } from '../../config/path.config'; -import { dbserver } from '../../db/db.connect'; -import { RedisCache } from '../../db/redis.client'; import { NotFoundException } from '../../exceptions'; +import { dbserver } from '../../libs/db.connect'; +import { RedisCache } from '../../libs/redis.client'; import { AuthModel, ChatwootModel, diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index 1116a835..1f1301d0 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -63,9 +63,10 @@ import { } from '../../config/env.config'; import { Logger } from '../../config/logger.config'; import { INSTANCE_DIR, ROOT_DIR } from '../../config/path.config'; -import { dbserver } from '../../db/db.connect'; -import { RedisCache } from '../../db/redis.client'; import { BadRequestException, InternalServerErrorException, NotFoundException } from '../../exceptions'; +import { dbserver } from '../../libs/db.connect'; +import { RedisCache } from '../../libs/redis.client'; +import { getIO } from '../../libs/socket'; import { useMultiFileAuthStateDb } from '../../utils/use-multi-file-auth-state-db'; import { useMultiFileAuthStateRedisDb } from '../../utils/use-multi-file-auth-state-redis-db'; import { @@ -416,6 +417,7 @@ export class WAStartupService { const serverUrl = this.configService.get('SERVER').URL; const we = event.replace(/[.-]/gm, '_').toUpperCase(); const transformedWe = we.replace(/_/gm, '-').toLowerCase(); + const io = getIO(); const expose = this.configService.get('AUTHENTICATION').EXPOSE_IN_FETCH_INSTANCES; const tokenStore = await this.repository.auth.find(this.instanceName); @@ -553,6 +555,12 @@ export class WAStartupService { } } } + + io.emit(event, { + event, + instance: this.instance.name, + data, + }); } private async connectionUpdate({ qr, connection, lastDisconnect }: Partial) { diff --git a/src/whatsapp/whatsapp.module.ts b/src/whatsapp/whatsapp.module.ts index b742afa9..00a10c2d 100644 --- a/src/whatsapp/whatsapp.module.ts +++ b/src/whatsapp/whatsapp.module.ts @@ -1,8 +1,8 @@ import { configService } from '../config/env.config'; import { eventEmitter } from '../config/event.config'; import { Logger } from '../config/logger.config'; -import { dbserver } from '../db/db.connect'; -import { RedisCache } from '../db/redis.client'; +import { dbserver } from '../libs/db.connect'; +import { RedisCache } from '../libs/redis.client'; import { ChatController } from './controllers/chat.controller'; import { ChatwootController } from './controllers/chatwoot.controller'; import { GroupController } from './controllers/group.controller'; diff --git a/views/manager.hbs b/views/manager.hbs index 4fa5f4e4..5414bdf1 100644 --- a/views/manager.hbs +++ b/views/manager.hbs @@ -11,7 +11,7 @@ - +