trompot 1.5.0 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +195 -20
- package/lib/bot/BotEvents.d.ts +2 -0
- package/lib/bot/BotEvents.js.map +1 -1
- package/lib/client/Client.js +93 -28
- package/lib/client/Client.js.map +1 -1
- package/lib/client/ClientFunctionHandler.js +39 -3
- package/lib/client/ClientFunctionHandler.js.map +1 -1
- package/lib/telegram/TelegramAuth.js +36 -1
- package/lib/telegram/TelegramAuth.js.map +1 -1
- package/lib/telegram/TelegramBot.d.ts +11 -0
- package/lib/telegram/TelegramBot.js +101 -15
- package/lib/telegram/TelegramBot.js.map +1 -1
- package/lib/telegram/TelegramEvents.d.ts +8 -1
- package/lib/telegram/TelegramEvents.js +67 -30
- package/lib/telegram/TelegramEvents.js.map +1 -1
- package/lib/telegram/TelegramSendingController.js +59 -17
- package/lib/telegram/TelegramSendingController.js.map +1 -1
- package/lib/telegram/TelegramToRompotConverter.js +44 -14
- package/lib/telegram/TelegramToRompotConverter.js.map +1 -1
- package/lib/wa/Auth.js +17 -5
- package/lib/wa/Auth.js.map +1 -1
- package/lib/wa/ConfigWAEvents.d.ts +6 -10
- package/lib/wa/ConfigWAEvents.js +220 -426
- package/lib/wa/ConfigWAEvents.js.map +1 -1
- package/lib/wa/ConvertWAMessage.js +28 -19
- package/lib/wa/ConvertWAMessage.js.map +1 -1
- package/lib/wa/ID.d.ts +10 -1
- package/lib/wa/ID.js +22 -2
- package/lib/wa/ID.js.map +1 -1
- package/lib/wa/WhatsAppBot.d.ts +58 -11
- package/lib/wa/WhatsAppBot.js +365 -648
- package/lib/wa/WhatsAppBot.js.map +1 -1
- package/lib/wa/constants/ConfigDefaults.d.ts +23 -0
- package/lib/wa/constants/ConfigDefaults.js +27 -0
- package/lib/wa/constants/ConfigDefaults.js.map +1 -0
- package/lib/wa/constants/DisconnectReasons.d.ts +24 -0
- package/lib/wa/constants/DisconnectReasons.js +36 -0
- package/lib/wa/constants/DisconnectReasons.js.map +1 -0
- package/lib/wa/constants/ErrorCodes.d.ts +28 -0
- package/lib/wa/constants/ErrorCodes.js +32 -0
- package/lib/wa/constants/ErrorCodes.js.map +1 -0
- package/lib/wa/constants/JIDPatterns.d.ts +23 -0
- package/lib/wa/constants/JIDPatterns.js +38 -0
- package/lib/wa/constants/JIDPatterns.js.map +1 -0
- package/lib/wa/constants/Timeouts.d.ts +11 -0
- package/lib/wa/constants/Timeouts.js +15 -0
- package/lib/wa/constants/Timeouts.js.map +1 -0
- package/lib/wa/core/ConnectionManager.d.ts +84 -0
- package/lib/wa/core/ConnectionManager.js +256 -0
- package/lib/wa/core/ConnectionManager.js.map +1 -0
- package/lib/wa/core/SessionManager.d.ts +29 -0
- package/lib/wa/core/SessionManager.js +155 -0
- package/lib/wa/core/SessionManager.js.map +1 -0
- package/lib/wa/core/StateManager.d.ts +49 -0
- package/lib/wa/core/StateManager.js +135 -0
- package/lib/wa/core/StateManager.js.map +1 -0
- package/lib/wa/events/CallEventHandler.d.ts +17 -0
- package/lib/wa/events/CallEventHandler.js +155 -0
- package/lib/wa/events/CallEventHandler.js.map +1 -0
- package/lib/wa/events/ChatEventHandler.d.ts +12 -0
- package/lib/wa/events/ChatEventHandler.js +74 -0
- package/lib/wa/events/ChatEventHandler.js.map +1 -0
- package/lib/wa/events/ConnectionEventHandler.d.ts +43 -0
- package/lib/wa/events/ConnectionEventHandler.js +305 -0
- package/lib/wa/events/ConnectionEventHandler.js.map +1 -0
- package/lib/wa/events/ContactEventHandler.d.ts +12 -0
- package/lib/wa/events/ContactEventHandler.js +55 -0
- package/lib/wa/events/ContactEventHandler.js.map +1 -0
- package/lib/wa/events/EventManager.d.ts +43 -0
- package/lib/wa/events/EventManager.js +198 -0
- package/lib/wa/events/EventManager.js.map +1 -0
- package/lib/wa/events/GroupEventHandler.d.ts +12 -0
- package/lib/wa/events/GroupEventHandler.js +74 -0
- package/lib/wa/events/GroupEventHandler.js.map +1 -0
- package/lib/wa/events/HistoryEventHandler.d.ts +16 -0
- package/lib/wa/events/HistoryEventHandler.js +101 -0
- package/lib/wa/events/HistoryEventHandler.js.map +1 -0
- package/lib/wa/events/LIDMappingEventHandler.d.ts +20 -0
- package/lib/wa/events/LIDMappingEventHandler.js +39 -0
- package/lib/wa/events/LIDMappingEventHandler.js.map +1 -0
- package/lib/wa/events/MessageEventHandler.d.ts +16 -0
- package/lib/wa/events/MessageEventHandler.js +218 -0
- package/lib/wa/events/MessageEventHandler.js.map +1 -0
- package/lib/wa/interfaces/ICacheService.d.ts +12 -0
- package/lib/wa/interfaces/ICacheService.js +3 -0
- package/lib/wa/interfaces/ICacheService.js.map +1 -0
- package/lib/wa/interfaces/IConnectionManager.d.ts +15 -0
- package/lib/wa/interfaces/IConnectionManager.js +3 -0
- package/lib/wa/interfaces/IConnectionManager.js.map +1 -0
- package/lib/wa/interfaces/IErrorHandler.d.ts +9 -0
- package/lib/wa/interfaces/IErrorHandler.js +3 -0
- package/lib/wa/interfaces/IErrorHandler.js.map +1 -0
- package/lib/wa/interfaces/ILoggerService.d.ts +13 -0
- package/lib/wa/interfaces/ILoggerService.js +3 -0
- package/lib/wa/interfaces/ILoggerService.js.map +1 -0
- package/lib/wa/interfaces/ISessionManager.d.ts +16 -0
- package/lib/wa/interfaces/ISessionManager.js +3 -0
- package/lib/wa/interfaces/ISessionManager.js.map +1 -0
- package/lib/wa/interfaces/IStateManager.d.ts +41 -0
- package/lib/wa/interfaces/IStateManager.js +3 -0
- package/lib/wa/interfaces/IStateManager.js.map +1 -0
- package/lib/wa/operations/ChatOperations.d.ts +117 -0
- package/lib/wa/operations/ChatOperations.js +349 -0
- package/lib/wa/operations/ChatOperations.js.map +1 -0
- package/lib/wa/operations/GroupOperations.d.ts +31 -0
- package/lib/wa/operations/GroupOperations.js +128 -0
- package/lib/wa/operations/GroupOperations.js.map +1 -0
- package/lib/wa/operations/MessageOperations.d.ts +69 -0
- package/lib/wa/operations/MessageOperations.js +335 -0
- package/lib/wa/operations/MessageOperations.js.map +1 -0
- package/lib/wa/operations/UserOperations.d.ts +100 -0
- package/lib/wa/operations/UserOperations.js +216 -0
- package/lib/wa/operations/UserOperations.js.map +1 -0
- package/lib/wa/services/CacheService.d.ts +45 -0
- package/lib/wa/services/CacheService.js +93 -0
- package/lib/wa/services/CacheService.js.map +1 -0
- package/lib/wa/services/ErrorHandler.d.ts +26 -0
- package/lib/wa/services/ErrorHandler.js +73 -0
- package/lib/wa/services/ErrorHandler.js.map +1 -0
- package/lib/wa/services/LIDMappingService.d.ts +42 -0
- package/lib/wa/services/LIDMappingService.js +132 -0
- package/lib/wa/services/LIDMappingService.js.map +1 -0
- package/lib/wa/services/LIDNormalizationService.d.ts +30 -0
- package/lib/wa/services/LIDNormalizationService.js +136 -0
- package/lib/wa/services/LIDNormalizationService.js.map +1 -0
- package/lib/wa/services/LoggerService.d.ts +44 -0
- package/lib/wa/services/LoggerService.js +85 -0
- package/lib/wa/services/LoggerService.js.map +1 -0
- package/lib/wa/services/PendingMessageQueue.d.ts +46 -0
- package/lib/wa/services/PendingMessageQueue.js +119 -0
- package/lib/wa/services/PendingMessageQueue.js.map +1 -0
- package/lib/wa/services/RetryService.d.ts +25 -0
- package/lib/wa/services/RetryService.js +59 -0
- package/lib/wa/services/RetryService.js.map +1 -0
- package/lib/wa/utils/ConfigValidator.d.ts +15 -0
- package/lib/wa/utils/ConfigValidator.js +66 -0
- package/lib/wa/utils/ConfigValidator.js.map +1 -0
- package/lib/wa/utils/ErrorUtils.d.ts +29 -0
- package/lib/wa/utils/ErrorUtils.js +66 -0
- package/lib/wa/utils/ErrorUtils.js.map +1 -0
- package/lib/wa/utils/Validation.d.ts +18 -0
- package/lib/wa/utils/Validation.js +40 -0
- package/lib/wa/utils/Validation.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LoggerService = void 0;
|
|
7
|
+
const pino_1 = __importDefault(require("pino"));
|
|
8
|
+
class LoggerService {
|
|
9
|
+
constructor(level = 'info') {
|
|
10
|
+
this.level = level;
|
|
11
|
+
// Se for 'silent', não cria transport para evitar logs
|
|
12
|
+
if (level === 'silent') {
|
|
13
|
+
this.logger = (0, pino_1.default)({ level: 'silent' });
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
this.logger = (0, pino_1.default)({
|
|
17
|
+
level,
|
|
18
|
+
transport: process.env.NODE_ENV === 'development' ? {
|
|
19
|
+
target: 'pino-pretty',
|
|
20
|
+
options: {
|
|
21
|
+
colorize: true,
|
|
22
|
+
translateTime: 'SYS:standard',
|
|
23
|
+
ignore: 'pid,hostname',
|
|
24
|
+
},
|
|
25
|
+
} : undefined,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Obtém o logger pino (para uso direto se necessário)
|
|
30
|
+
*/
|
|
31
|
+
getLogger() {
|
|
32
|
+
return this.logger;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Log fatal
|
|
36
|
+
*/
|
|
37
|
+
fatal(obj, msg) {
|
|
38
|
+
this.logger.fatal(obj, msg);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Log error
|
|
42
|
+
*/
|
|
43
|
+
error(obj, msg) {
|
|
44
|
+
this.logger.error(obj, msg);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Log warn
|
|
48
|
+
*/
|
|
49
|
+
warn(obj, msg) {
|
|
50
|
+
this.logger.warn(obj, msg);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Log info
|
|
54
|
+
*/
|
|
55
|
+
info(obj, msg) {
|
|
56
|
+
this.logger.info(obj, msg);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Log debug
|
|
60
|
+
*/
|
|
61
|
+
debug(obj, msg) {
|
|
62
|
+
this.logger.debug(obj, msg);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Log trace
|
|
66
|
+
*/
|
|
67
|
+
trace(obj, msg) {
|
|
68
|
+
this.logger.trace(obj, msg);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Define o nível de log
|
|
72
|
+
*/
|
|
73
|
+
setLevel(level) {
|
|
74
|
+
this.level = level;
|
|
75
|
+
this.logger.level = level;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Retorna o nível atual
|
|
79
|
+
*/
|
|
80
|
+
getLevel() {
|
|
81
|
+
return this.level;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.LoggerService = LoggerService;
|
|
85
|
+
//# sourceMappingURL=LoggerService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LoggerService.js","sourceRoot":"","sources":["../../../src/wa/services/LoggerService.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAoC;AAKpC,MAAa,aAAa;IAIxB,YAAY,QAAkB,MAAM;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,uDAAuD;QACvD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,IAAA,cAAI,EAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAA,cAAI,EAAC;YACjB,KAAK;YACL,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC;gBAClD,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE;oBACP,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,cAAc;oBAC7B,MAAM,EAAE,cAAc;iBACvB;aACF,CAAC,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAQ,EAAE,GAAY;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAQ,EAAE,GAAY;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAQ,EAAE,GAAY;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAQ,EAAE,GAAY;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAQ,EAAE,GAAY;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAQ,EAAE,GAAY;QAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAe;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAzFD,sCAyFC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import Message from '../../messages/Message';
|
|
2
|
+
import { ILoggerService } from '../interfaces/ILoggerService';
|
|
3
|
+
export interface PendingMessage {
|
|
4
|
+
message: Message;
|
|
5
|
+
originalJID: string;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
retries: number;
|
|
8
|
+
resolve: (message: Message) => void;
|
|
9
|
+
reject: (error: Error) => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Serviço de fila de mensagens pendentes para JIDs LID
|
|
13
|
+
* Armazena mensagens que não puderam ser enviadas porque o mapeamento LID/PN não estava disponível
|
|
14
|
+
* Processa mensagens quando o mapeamento ficar disponível
|
|
15
|
+
*/
|
|
16
|
+
export declare class PendingMessageQueue {
|
|
17
|
+
private queue;
|
|
18
|
+
private logger;
|
|
19
|
+
private maxRetries;
|
|
20
|
+
private maxAge;
|
|
21
|
+
constructor(logger: ILoggerService);
|
|
22
|
+
/**
|
|
23
|
+
* Adiciona uma mensagem à fila de pendentes
|
|
24
|
+
*/
|
|
25
|
+
add(message: Message, resolve: (message: Message) => void, reject: (error: Error) => void): void;
|
|
26
|
+
/**
|
|
27
|
+
* Processa mensagens pendentes para um LID quando o mapeamento ficar disponível
|
|
28
|
+
*/
|
|
29
|
+
processPendingMessages(lid: string, pn: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Remove mensagens antigas da fila (limpeza periódica)
|
|
32
|
+
*/
|
|
33
|
+
cleanup(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Retorna o número de mensagens pendentes para um LID
|
|
36
|
+
*/
|
|
37
|
+
getPendingCount(lid: string): number;
|
|
38
|
+
/**
|
|
39
|
+
* Retorna o número total de mensagens pendentes
|
|
40
|
+
*/
|
|
41
|
+
getTotalPendingCount(): number;
|
|
42
|
+
/**
|
|
43
|
+
* Limpa todas as mensagens pendentes
|
|
44
|
+
*/
|
|
45
|
+
clear(): void;
|
|
46
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PendingMessageQueue = void 0;
|
|
4
|
+
const ID_1 = require("../ID");
|
|
5
|
+
/**
|
|
6
|
+
* Serviço de fila de mensagens pendentes para JIDs LID
|
|
7
|
+
* Armazena mensagens que não puderam ser enviadas porque o mapeamento LID/PN não estava disponível
|
|
8
|
+
* Processa mensagens quando o mapeamento ficar disponível
|
|
9
|
+
*/
|
|
10
|
+
class PendingMessageQueue {
|
|
11
|
+
constructor(logger) {
|
|
12
|
+
this.queue = new Map();
|
|
13
|
+
this.maxRetries = 3;
|
|
14
|
+
this.maxAge = 60000; // 60 segundos
|
|
15
|
+
this.logger = logger;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Adiciona uma mensagem à fila de pendentes
|
|
19
|
+
*/
|
|
20
|
+
add(message, resolve, reject) {
|
|
21
|
+
const lid = message.chat.id.replace('@lid', '');
|
|
22
|
+
if (!this.queue.has(lid)) {
|
|
23
|
+
this.queue.set(lid, []);
|
|
24
|
+
}
|
|
25
|
+
const pending = {
|
|
26
|
+
message,
|
|
27
|
+
originalJID: message.chat.id,
|
|
28
|
+
timestamp: Date.now(),
|
|
29
|
+
retries: 0,
|
|
30
|
+
resolve,
|
|
31
|
+
reject,
|
|
32
|
+
};
|
|
33
|
+
this.queue.get(lid).push(pending);
|
|
34
|
+
this.logger.info(`📥 Mensagem adicionada à fila de pendentes (LID: ${lid}). Total na fila: ${this.queue.get(lid).length}. Aguardando mapeamento LID/PN...`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Processa mensagens pendentes para um LID quando o mapeamento ficar disponível
|
|
38
|
+
*/
|
|
39
|
+
async processPendingMessages(lid, pn) {
|
|
40
|
+
const pendingMessages = this.queue.get(lid);
|
|
41
|
+
if (!pendingMessages || pendingMessages.length === 0) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const normalizedJID = (0, ID_1.getID)(pn);
|
|
45
|
+
this.logger.info(`✅ Mapeamento LID/PN disponível! Processando ${pendingMessages.length} mensagem(ns) pendente(s) para LID ${lid} -> ${normalizedJID}`);
|
|
46
|
+
// Remove da fila ANTES de processar (evita processamento duplicado)
|
|
47
|
+
this.queue.delete(lid);
|
|
48
|
+
// Processa todas as mensagens pendentes para este LID
|
|
49
|
+
// A promise resolve já chama sendMessageInternal automaticamente
|
|
50
|
+
const promises = pendingMessages.map(async (pending) => {
|
|
51
|
+
try {
|
|
52
|
+
// Atualiza o JID da mensagem
|
|
53
|
+
pending.message.chat.id = normalizedJID;
|
|
54
|
+
// Resolve a promise (o callback já envia a mensagem)
|
|
55
|
+
pending.resolve(pending.message);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
pending.reject(error);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
await Promise.allSettled(promises);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Remove mensagens antigas da fila (limpeza periódica)
|
|
65
|
+
*/
|
|
66
|
+
cleanup() {
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
const lidsToRemove = [];
|
|
69
|
+
for (const [lid, messages] of this.queue.entries()) {
|
|
70
|
+
const validMessages = messages.filter((pending) => {
|
|
71
|
+
const age = now - pending.timestamp;
|
|
72
|
+
if (age > this.maxAge) {
|
|
73
|
+
// Mensagem muito antiga, rejeita
|
|
74
|
+
pending.reject(new Error(`Mensagem pendente expirou após ${this.maxAge}ms`));
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
});
|
|
79
|
+
if (validMessages.length === 0) {
|
|
80
|
+
lidsToRemove.push(lid);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
this.queue.set(lid, validMessages);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
lidsToRemove.forEach((lid) => this.queue.delete(lid));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Retorna o número de mensagens pendentes para um LID
|
|
90
|
+
*/
|
|
91
|
+
getPendingCount(lid) {
|
|
92
|
+
var _a;
|
|
93
|
+
return ((_a = this.queue.get(lid)) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Retorna o número total de mensagens pendentes
|
|
97
|
+
*/
|
|
98
|
+
getTotalPendingCount() {
|
|
99
|
+
let total = 0;
|
|
100
|
+
for (const messages of this.queue.values()) {
|
|
101
|
+
total += messages.length;
|
|
102
|
+
}
|
|
103
|
+
return total;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Limpa todas as mensagens pendentes
|
|
107
|
+
*/
|
|
108
|
+
clear() {
|
|
109
|
+
// Rejeita todas as mensagens pendentes
|
|
110
|
+
for (const messages of this.queue.values()) {
|
|
111
|
+
messages.forEach((pending) => {
|
|
112
|
+
pending.reject(new Error('Fila de mensagens pendentes foi limpa'));
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
this.queue.clear();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.PendingMessageQueue = PendingMessageQueue;
|
|
119
|
+
//# sourceMappingURL=PendingMessageQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PendingMessageQueue.js","sourceRoot":"","sources":["../../../src/wa/services/PendingMessageQueue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare class RetryService {
|
|
2
|
+
private baseDelay;
|
|
3
|
+
private maxDelay;
|
|
4
|
+
private multiplier;
|
|
5
|
+
/**
|
|
6
|
+
* Calcula delay para retry com backoff exponencial
|
|
7
|
+
*/
|
|
8
|
+
getBackoffDelay(attempt: number): number;
|
|
9
|
+
/**
|
|
10
|
+
* Executa uma função com retry
|
|
11
|
+
*/
|
|
12
|
+
retry<T>(fn: () => Promise<T>, maxAttempts?: number, onRetry?: (attempt: number, error: Error) => void): Promise<T>;
|
|
13
|
+
/**
|
|
14
|
+
* Configura o delay base
|
|
15
|
+
*/
|
|
16
|
+
setBaseDelay(delay: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Configura o delay máximo
|
|
19
|
+
*/
|
|
20
|
+
setMaxDelay(delay: number): void;
|
|
21
|
+
/**
|
|
22
|
+
* Configura o multiplicador
|
|
23
|
+
*/
|
|
24
|
+
setMultiplier(multiplier: number): void;
|
|
25
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RetryService = void 0;
|
|
4
|
+
class RetryService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.baseDelay = 1000; // 1 segundo
|
|
7
|
+
this.maxDelay = 60000; // 60 segundos
|
|
8
|
+
this.multiplier = 2; // Backoff exponencial
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Calcula delay para retry com backoff exponencial
|
|
12
|
+
*/
|
|
13
|
+
getBackoffDelay(attempt) {
|
|
14
|
+
const delay = Math.min(this.baseDelay * Math.pow(this.multiplier, attempt - 1), this.maxDelay);
|
|
15
|
+
// Adiciona jitter aleatório (±20%) para evitar thundering herd
|
|
16
|
+
const jitter = delay * 0.2 * (Math.random() * 2 - 1);
|
|
17
|
+
return Math.floor(delay + jitter);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Executa uma função com retry
|
|
21
|
+
*/
|
|
22
|
+
async retry(fn, maxAttempts = 3, onRetry) {
|
|
23
|
+
let lastError;
|
|
24
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
25
|
+
try {
|
|
26
|
+
return await fn();
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
30
|
+
if (attempt < maxAttempts) {
|
|
31
|
+
const delay = this.getBackoffDelay(attempt);
|
|
32
|
+
onRetry === null || onRetry === void 0 ? void 0 : onRetry(attempt, lastError);
|
|
33
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
throw lastError;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Configura o delay base
|
|
41
|
+
*/
|
|
42
|
+
setBaseDelay(delay) {
|
|
43
|
+
this.baseDelay = delay;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Configura o delay máximo
|
|
47
|
+
*/
|
|
48
|
+
setMaxDelay(delay) {
|
|
49
|
+
this.maxDelay = delay;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Configura o multiplicador
|
|
53
|
+
*/
|
|
54
|
+
setMultiplier(multiplier) {
|
|
55
|
+
this.multiplier = multiplier;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.RetryService = RetryService;
|
|
59
|
+
//# sourceMappingURL=RetryService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RetryService.js","sourceRoot":"","sources":["../../../src/wa/services/RetryService.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAY;IAAzB;QACU,cAAS,GAAW,IAAI,CAAC,CAAC,YAAY;QACtC,aAAQ,GAAW,KAAK,CAAC,CAAC,cAAc;QACxC,eAAU,GAAW,CAAC,CAAC,CAAC,sBAAsB;IA+DxD,CAAC;IA7DC;;OAEG;IACH,eAAe,CAAC,OAAe;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,CAAC,CAAC,EACvD,IAAI,CAAC,QAAQ,CACd,CAAC;QAEF,+DAA+D;QAC/D,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,EAAoB,EACpB,cAAsB,CAAC,EACvB,OAAiD;QAEjD,IAAI,SAAgB,CAAC;QAErB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC;gBACH,OAAO,MAAM,EAAE,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAEtE,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;oBAC5C,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,OAAO,EAAE,SAAS,CAAC,CAAC;oBAC9B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAU,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,KAAa;QACxB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,KAAa;QACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,UAAkB;QAC9B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAlED,oCAkEC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { WhatsAppBotConfig } from '../WhatsAppBot';
|
|
2
|
+
import { LoggerService } from '../services/LoggerService';
|
|
3
|
+
/**
|
|
4
|
+
* Validador de configuração do WhatsAppBot
|
|
5
|
+
*/
|
|
6
|
+
export declare class ConfigValidator {
|
|
7
|
+
/**
|
|
8
|
+
* Valida e normaliza a configuração do WhatsAppBot
|
|
9
|
+
*/
|
|
10
|
+
static validate(config?: Partial<WhatsAppBotConfig>): WhatsAppBotConfig;
|
|
11
|
+
/**
|
|
12
|
+
* Valida configuração e loga avisos
|
|
13
|
+
*/
|
|
14
|
+
static validateWithWarnings(config?: Partial<WhatsAppBotConfig>, logger?: LoggerService): WhatsAppBotConfig;
|
|
15
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigValidator = void 0;
|
|
4
|
+
const ConfigDefaults_1 = require("../constants/ConfigDefaults");
|
|
5
|
+
/**
|
|
6
|
+
* Validador de configuração do WhatsAppBot
|
|
7
|
+
*/
|
|
8
|
+
class ConfigValidator {
|
|
9
|
+
/**
|
|
10
|
+
* Valida e normaliza a configuração do WhatsAppBot
|
|
11
|
+
*/
|
|
12
|
+
static validate(config) {
|
|
13
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
14
|
+
const validated = {
|
|
15
|
+
// Valores padrão obrigatórios
|
|
16
|
+
qrTimeout: (_a = config === null || config === void 0 ? void 0 : config.qrTimeout) !== null && _a !== void 0 ? _a : ConfigDefaults_1.ConfigDefaults.QR_TIMEOUT,
|
|
17
|
+
defaultQueryTimeoutMs: (_b = config === null || config === void 0 ? void 0 : config.defaultQueryTimeoutMs) !== null && _b !== void 0 ? _b : ConfigDefaults_1.ConfigDefaults.DEFAULT_QUERY_TIMEOUT,
|
|
18
|
+
retryRequestDelayMs: (_c = config === null || config === void 0 ? void 0 : config.retryRequestDelayMs) !== null && _c !== void 0 ? _c : ConfigDefaults_1.ConfigDefaults.RETRY_REQUEST_DELAY,
|
|
19
|
+
autoRestartInterval: (_d = config === null || config === void 0 ? void 0 : config.autoRestartInterval) !== null && _d !== void 0 ? _d : ConfigDefaults_1.ConfigDefaults.AUTO_RESTART_INTERVAL,
|
|
20
|
+
autoSyncHistory: (_e = config === null || config === void 0 ? void 0 : config.autoSyncHistory) !== null && _e !== void 0 ? _e : false,
|
|
21
|
+
readAllFailedMessages: (_f = config === null || config === void 0 ? void 0 : config.readAllFailedMessages) !== null && _f !== void 0 ? _f : false,
|
|
22
|
+
useExperimentalServers: (_g = config === null || config === void 0 ? void 0 : config.useExperimentalServers) !== null && _g !== void 0 ? _g : false,
|
|
23
|
+
autoLoadContactInfo: (_h = config === null || config === void 0 ? void 0 : config.autoLoadContactInfo) !== null && _h !== void 0 ? _h : false,
|
|
24
|
+
autoLoadGroupInfo: (_j = config === null || config === void 0 ? void 0 : config.autoLoadGroupInfo) !== null && _j !== void 0 ? _j : false,
|
|
25
|
+
autoRejectCalls: (_k = config === null || config === void 0 ? void 0 : config.autoRejectCalls) !== null && _k !== void 0 ? _k : false,
|
|
26
|
+
logLevel: (_l = config === null || config === void 0 ? void 0 : config.logLevel) !== null && _l !== void 0 ? _l : 'info',
|
|
27
|
+
...config,
|
|
28
|
+
};
|
|
29
|
+
// Validações de valores
|
|
30
|
+
if (validated.qrTimeout && validated.qrTimeout < 1000) {
|
|
31
|
+
throw new Error('qrTimeout deve ser pelo menos 1000ms');
|
|
32
|
+
}
|
|
33
|
+
if (validated.defaultQueryTimeoutMs && validated.defaultQueryTimeoutMs < 1000) {
|
|
34
|
+
throw new Error('defaultQueryTimeoutMs deve ser pelo menos 1000ms');
|
|
35
|
+
}
|
|
36
|
+
if (validated.retryRequestDelayMs && validated.retryRequestDelayMs < 100) {
|
|
37
|
+
throw new Error('retryRequestDelayMs deve ser pelo menos 100ms');
|
|
38
|
+
}
|
|
39
|
+
if (validated.autoRestartInterval && validated.autoRestartInterval < 60000) {
|
|
40
|
+
throw new Error('autoRestartInterval deve ser pelo menos 60000ms (1 minuto)');
|
|
41
|
+
}
|
|
42
|
+
if (validated.logLevel && !['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'].includes(validated.logLevel)) {
|
|
43
|
+
throw new Error(`logLevel inválido: ${validated.logLevel}. Use: fatal, error, warn, info, debug, trace ou silent`);
|
|
44
|
+
}
|
|
45
|
+
return validated;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Valida configuração e loga avisos
|
|
49
|
+
*/
|
|
50
|
+
static validateWithWarnings(config, logger) {
|
|
51
|
+
const validated = this.validate(config);
|
|
52
|
+
// Avisos para configurações não recomendadas
|
|
53
|
+
if (validated.autoSyncHistory && logger) {
|
|
54
|
+
logger.warn('autoSyncHistory está ativado. Isso pode causar alto uso de memória e processamento.');
|
|
55
|
+
}
|
|
56
|
+
if (validated.readAllFailedMessages && logger) {
|
|
57
|
+
logger.warn('readAllFailedMessages está ativado. Isso pode processar mensagens duplicadas.');
|
|
58
|
+
}
|
|
59
|
+
if (validated.useExperimentalServers && logger) {
|
|
60
|
+
logger.warn('useExperimentalServers está ativado. Use apenas para testes.');
|
|
61
|
+
}
|
|
62
|
+
return validated;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.ConfigValidator = ConfigValidator;
|
|
66
|
+
//# sourceMappingURL=ConfigValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigValidator.js","sourceRoot":"","sources":["../../../src/wa/utils/ConfigValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ILoggerService } from '../interfaces/ILoggerService';
|
|
2
|
+
import ErrorMessage from '../../messages/ErrorMessage';
|
|
3
|
+
/**
|
|
4
|
+
* Utilitários para tratamento padronizado de erros
|
|
5
|
+
*/
|
|
6
|
+
export declare class ErrorUtils {
|
|
7
|
+
/**
|
|
8
|
+
* Trata erro em handler de eventos e emite evento de erro
|
|
9
|
+
*/
|
|
10
|
+
static handleHandlerError(error: unknown, context: string, logger: ILoggerService, bot: {
|
|
11
|
+
emit: (event: string, data: any) => void;
|
|
12
|
+
}): void;
|
|
13
|
+
/**
|
|
14
|
+
* Trata erro em processamento de mensagem e retorna ErrorMessage
|
|
15
|
+
*/
|
|
16
|
+
static handleMessageError(error: unknown, remoteJid: string | undefined | null, logger?: ILoggerService): ErrorMessage;
|
|
17
|
+
/**
|
|
18
|
+
* Wrapper para executar função assíncrona com tratamento de erro padronizado
|
|
19
|
+
*/
|
|
20
|
+
static safeExecute<T>(fn: () => Promise<T>, context: string, logger: ILoggerService, bot: {
|
|
21
|
+
emit: (event: string, data: any) => void;
|
|
22
|
+
}, onError?: (error: unknown) => void): Promise<T | undefined>;
|
|
23
|
+
/**
|
|
24
|
+
* Wrapper para executar função síncrona com tratamento de erro padronizado
|
|
25
|
+
*/
|
|
26
|
+
static safeExecuteSync<T>(fn: () => T, context: string, logger: ILoggerService, bot: {
|
|
27
|
+
emit: (event: string, data: any) => void;
|
|
28
|
+
}, onError?: (error: unknown) => void): T | undefined;
|
|
29
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ErrorUtils = void 0;
|
|
7
|
+
const ErrorHandler_1 = require("../services/ErrorHandler");
|
|
8
|
+
const ErrorMessage_1 = __importDefault(require("../../messages/ErrorMessage"));
|
|
9
|
+
const ID_1 = require("../ID");
|
|
10
|
+
/**
|
|
11
|
+
* Utilitários para tratamento padronizado de erros
|
|
12
|
+
*/
|
|
13
|
+
class ErrorUtils {
|
|
14
|
+
/**
|
|
15
|
+
* Trata erro em handler de eventos e emite evento de erro
|
|
16
|
+
*/
|
|
17
|
+
static handleHandlerError(error, context, logger, bot) {
|
|
18
|
+
const errorHandler = new ErrorHandler_1.ErrorHandler(logger);
|
|
19
|
+
errorHandler.handle(error, context);
|
|
20
|
+
bot.emit('error', error);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Trata erro em processamento de mensagem e retorna ErrorMessage
|
|
24
|
+
*/
|
|
25
|
+
static handleMessageError(error, remoteJid, logger) {
|
|
26
|
+
if (logger) {
|
|
27
|
+
logger.error(error, 'Erro ao processar mensagem');
|
|
28
|
+
}
|
|
29
|
+
const errorObj = error instanceof Error
|
|
30
|
+
? error
|
|
31
|
+
: new Error(JSON.stringify(error));
|
|
32
|
+
return new ErrorMessage_1.default((0, ID_1.fixID)(remoteJid !== null && remoteJid !== void 0 ? remoteJid : ''), errorObj);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Wrapper para executar função assíncrona com tratamento de erro padronizado
|
|
36
|
+
*/
|
|
37
|
+
static async safeExecute(fn, context, logger, bot, onError) {
|
|
38
|
+
try {
|
|
39
|
+
return await fn();
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
ErrorUtils.handleHandlerError(error, context, logger, bot);
|
|
43
|
+
if (onError) {
|
|
44
|
+
onError(error);
|
|
45
|
+
}
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Wrapper para executar função síncrona com tratamento de erro padronizado
|
|
51
|
+
*/
|
|
52
|
+
static safeExecuteSync(fn, context, logger, bot, onError) {
|
|
53
|
+
try {
|
|
54
|
+
return fn();
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
ErrorUtils.handleHandlerError(error, context, logger, bot);
|
|
58
|
+
if (onError) {
|
|
59
|
+
onError(error);
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.ErrorUtils = ErrorUtils;
|
|
66
|
+
//# sourceMappingURL=ErrorUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorUtils.js","sourceRoot":"","sources":["../../../src/wa/utils/ErrorUtils.ts"],"names":[],"mappings":";;;;;;AAEA,2DAAwD;AACxD,+EAAuD;AACvD,8BAA8B;AAE9B;;GAEG;AACH,MAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,kBAAkB,CACvB,KAAc,EACd,OAAe,EACf,MAAsB,EACtB,GAAiD;QAEjD,MAAM,YAAY,GAAG,IAAI,2BAAY,CAAC,MAAM,CAAC,CAAC;QAC9C,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,kBAAkB,CACvB,KAAc,EACd,SAAoC,EACpC,MAAuB;QAEvB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK;YACrC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAErC,OAAO,IAAI,sBAAY,CACrB,IAAA,UAAK,EAAC,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,EAAE,CAAC,EACtB,QAAQ,CACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CACtB,EAAoB,EACpB,OAAe,EACf,MAAsB,EACtB,GAAiD,EACjD,OAAkC;QAElC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CACpB,EAAW,EACX,OAAe,EACf,MAAsB,EACtB,GAAiD,EACjD,OAAkC;QAElC,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC3D,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AA9ED,gCA8EC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BotStatus } from '../../bot/BotStatus';
|
|
2
|
+
/**
|
|
3
|
+
* Utilitários de validação
|
|
4
|
+
*/
|
|
5
|
+
export declare class Validation {
|
|
6
|
+
/**
|
|
7
|
+
* Valida se o bot está conectado
|
|
8
|
+
*/
|
|
9
|
+
static ensureConnected(status: BotStatus, socket?: any): void;
|
|
10
|
+
/**
|
|
11
|
+
* Valida se um JID é válido
|
|
12
|
+
*/
|
|
13
|
+
static ensureValidJID(jid: string | undefined | null, paramName?: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Valida se um parâmetro não é null/undefined
|
|
16
|
+
*/
|
|
17
|
+
static ensureNotNull<T>(value: T | null | undefined, paramName: string): asserts value is T;
|
|
18
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Validation = void 0;
|
|
4
|
+
const BotStatus_1 = require("../../bot/BotStatus");
|
|
5
|
+
const JIDPatterns_1 = require("../constants/JIDPatterns");
|
|
6
|
+
/**
|
|
7
|
+
* Utilitários de validação
|
|
8
|
+
*/
|
|
9
|
+
class Validation {
|
|
10
|
+
/**
|
|
11
|
+
* Valida se o bot está conectado
|
|
12
|
+
*/
|
|
13
|
+
static ensureConnected(status, socket) {
|
|
14
|
+
var _a;
|
|
15
|
+
if (status !== BotStatus_1.BotStatus.Online) {
|
|
16
|
+
throw new Error('Bot não está conectado. Aguarde o evento "open" antes de realizar operações.');
|
|
17
|
+
}
|
|
18
|
+
if (socket && !((_a = socket.ws) === null || _a === void 0 ? void 0 : _a.isOpen)) {
|
|
19
|
+
throw new Error('Socket não está aberto. Aguarde a conexão ser estabelecida.');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Valida se um JID é válido
|
|
24
|
+
*/
|
|
25
|
+
static ensureValidJID(jid, paramName = 'jid') {
|
|
26
|
+
if (!(0, JIDPatterns_1.isValidJID)(jid)) {
|
|
27
|
+
throw new Error(`JID inválido para ${paramName}: ${jid}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Valida se um parâmetro não é null/undefined
|
|
32
|
+
*/
|
|
33
|
+
static ensureNotNull(value, paramName) {
|
|
34
|
+
if (value === null || value === undefined) {
|
|
35
|
+
throw new Error(`Parâmetro ${paramName} não pode ser null ou undefined`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
exports.Validation = Validation;
|
|
40
|
+
//# sourceMappingURL=Validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Validation.js","sourceRoot":"","sources":["../../../src/wa/utils/Validation.ts"],"names":[],"mappings":";;;AAAA,mDAAgD;AAChD,0DAAsD;AAEtD;;GAEG;AACH,MAAa,UAAU;IACrB;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,MAAiB,EAAE,MAAY;;QACpD,IAAI,MAAM,KAAK,qBAAS,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;QAClG,CAAC;QAED,IAAI,MAAM,IAAI,CAAC,CAAA,MAAA,MAAM,CAAC,EAAE,0CAAE,MAAM,CAAA,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,GAA8B,EAAE,YAAoB,KAAK;QAC7E,IAAI,CAAC,IAAA,wBAAU,EAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,qBAAqB,SAAS,KAAK,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAI,KAA2B,EAAE,SAAiB;QACpE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,aAAa,SAAS,iCAAiC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;CACF;AA/BD,gCA+BC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "trompot",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.2",
|
|
4
4
|
"description": "Chatbot API multi-plataforma em TypeScript. Fork do Trompot.",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"example": "ts-node-dev example/index.ts",
|
|
9
9
|
"cluster": "ts-node-dev example/cluster.ts",
|
|
10
10
|
"telegram": "ts-node-dev example/telegram.ts",
|
|
11
|
+
"test": "ts-node example/test-refactoring.ts",
|
|
11
12
|
"build": "npm i && npm run clean && tsc",
|
|
12
13
|
"clean": "rimraf lib",
|
|
13
14
|
"lint": "eslint ."
|
|
@@ -43,9 +44,7 @@
|
|
|
43
44
|
"cluster": "0.7.7",
|
|
44
45
|
"crypto-digest-sync": "1.0.0",
|
|
45
46
|
"express": "5.2.1",
|
|
46
|
-
"link-preview-js": "3.0.0",
|
|
47
47
|
"long": "5.2.3",
|
|
48
|
-
"music-metadata": "7.12.3",
|
|
49
48
|
"node-cache": "5.1.2",
|
|
50
49
|
"node-telegram-bot-api": "0.66.0",
|
|
51
50
|
"pino": "9.7.0"
|
|
@@ -60,6 +59,7 @@
|
|
|
60
59
|
"@types/express": "5.0.2",
|
|
61
60
|
"@types/node": "^22.15.29",
|
|
62
61
|
"@types/node-telegram-bot-api": "0.64.8",
|
|
62
|
+
"@types/qrcode": "^1.5.6",
|
|
63
63
|
"@types/ws": "8.18.1",
|
|
64
64
|
"dotenv": "16.5.0",
|
|
65
65
|
"eslint": "^9.14.0",
|
|
@@ -68,6 +68,7 @@
|
|
|
68
68
|
"globals": "16.2.0",
|
|
69
69
|
"jimp": "^1.6.0",
|
|
70
70
|
"prettier": "^3.3.3",
|
|
71
|
+
"qrcode": "^1.5.4",
|
|
71
72
|
"rimraf": "^6.0.1",
|
|
72
73
|
"sharp": "0.32.6",
|
|
73
74
|
"ts-node-dev": "2.0.0",
|