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.
Files changed (144) hide show
  1. package/README.md +195 -20
  2. package/lib/bot/BotEvents.d.ts +2 -0
  3. package/lib/bot/BotEvents.js.map +1 -1
  4. package/lib/client/Client.js +93 -28
  5. package/lib/client/Client.js.map +1 -1
  6. package/lib/client/ClientFunctionHandler.js +39 -3
  7. package/lib/client/ClientFunctionHandler.js.map +1 -1
  8. package/lib/telegram/TelegramAuth.js +36 -1
  9. package/lib/telegram/TelegramAuth.js.map +1 -1
  10. package/lib/telegram/TelegramBot.d.ts +11 -0
  11. package/lib/telegram/TelegramBot.js +101 -15
  12. package/lib/telegram/TelegramBot.js.map +1 -1
  13. package/lib/telegram/TelegramEvents.d.ts +8 -1
  14. package/lib/telegram/TelegramEvents.js +67 -30
  15. package/lib/telegram/TelegramEvents.js.map +1 -1
  16. package/lib/telegram/TelegramSendingController.js +59 -17
  17. package/lib/telegram/TelegramSendingController.js.map +1 -1
  18. package/lib/telegram/TelegramToRompotConverter.js +44 -14
  19. package/lib/telegram/TelegramToRompotConverter.js.map +1 -1
  20. package/lib/wa/Auth.js +17 -5
  21. package/lib/wa/Auth.js.map +1 -1
  22. package/lib/wa/ConfigWAEvents.d.ts +6 -10
  23. package/lib/wa/ConfigWAEvents.js +220 -426
  24. package/lib/wa/ConfigWAEvents.js.map +1 -1
  25. package/lib/wa/ConvertWAMessage.js +28 -19
  26. package/lib/wa/ConvertWAMessage.js.map +1 -1
  27. package/lib/wa/ID.d.ts +10 -1
  28. package/lib/wa/ID.js +22 -2
  29. package/lib/wa/ID.js.map +1 -1
  30. package/lib/wa/WhatsAppBot.d.ts +58 -11
  31. package/lib/wa/WhatsAppBot.js +365 -648
  32. package/lib/wa/WhatsAppBot.js.map +1 -1
  33. package/lib/wa/constants/ConfigDefaults.d.ts +23 -0
  34. package/lib/wa/constants/ConfigDefaults.js +27 -0
  35. package/lib/wa/constants/ConfigDefaults.js.map +1 -0
  36. package/lib/wa/constants/DisconnectReasons.d.ts +24 -0
  37. package/lib/wa/constants/DisconnectReasons.js +36 -0
  38. package/lib/wa/constants/DisconnectReasons.js.map +1 -0
  39. package/lib/wa/constants/ErrorCodes.d.ts +28 -0
  40. package/lib/wa/constants/ErrorCodes.js +32 -0
  41. package/lib/wa/constants/ErrorCodes.js.map +1 -0
  42. package/lib/wa/constants/JIDPatterns.d.ts +23 -0
  43. package/lib/wa/constants/JIDPatterns.js +38 -0
  44. package/lib/wa/constants/JIDPatterns.js.map +1 -0
  45. package/lib/wa/constants/Timeouts.d.ts +11 -0
  46. package/lib/wa/constants/Timeouts.js +15 -0
  47. package/lib/wa/constants/Timeouts.js.map +1 -0
  48. package/lib/wa/core/ConnectionManager.d.ts +84 -0
  49. package/lib/wa/core/ConnectionManager.js +256 -0
  50. package/lib/wa/core/ConnectionManager.js.map +1 -0
  51. package/lib/wa/core/SessionManager.d.ts +29 -0
  52. package/lib/wa/core/SessionManager.js +155 -0
  53. package/lib/wa/core/SessionManager.js.map +1 -0
  54. package/lib/wa/core/StateManager.d.ts +49 -0
  55. package/lib/wa/core/StateManager.js +135 -0
  56. package/lib/wa/core/StateManager.js.map +1 -0
  57. package/lib/wa/events/CallEventHandler.d.ts +17 -0
  58. package/lib/wa/events/CallEventHandler.js +155 -0
  59. package/lib/wa/events/CallEventHandler.js.map +1 -0
  60. package/lib/wa/events/ChatEventHandler.d.ts +12 -0
  61. package/lib/wa/events/ChatEventHandler.js +74 -0
  62. package/lib/wa/events/ChatEventHandler.js.map +1 -0
  63. package/lib/wa/events/ConnectionEventHandler.d.ts +43 -0
  64. package/lib/wa/events/ConnectionEventHandler.js +305 -0
  65. package/lib/wa/events/ConnectionEventHandler.js.map +1 -0
  66. package/lib/wa/events/ContactEventHandler.d.ts +12 -0
  67. package/lib/wa/events/ContactEventHandler.js +55 -0
  68. package/lib/wa/events/ContactEventHandler.js.map +1 -0
  69. package/lib/wa/events/EventManager.d.ts +43 -0
  70. package/lib/wa/events/EventManager.js +198 -0
  71. package/lib/wa/events/EventManager.js.map +1 -0
  72. package/lib/wa/events/GroupEventHandler.d.ts +12 -0
  73. package/lib/wa/events/GroupEventHandler.js +74 -0
  74. package/lib/wa/events/GroupEventHandler.js.map +1 -0
  75. package/lib/wa/events/HistoryEventHandler.d.ts +16 -0
  76. package/lib/wa/events/HistoryEventHandler.js +101 -0
  77. package/lib/wa/events/HistoryEventHandler.js.map +1 -0
  78. package/lib/wa/events/LIDMappingEventHandler.d.ts +20 -0
  79. package/lib/wa/events/LIDMappingEventHandler.js +39 -0
  80. package/lib/wa/events/LIDMappingEventHandler.js.map +1 -0
  81. package/lib/wa/events/MessageEventHandler.d.ts +16 -0
  82. package/lib/wa/events/MessageEventHandler.js +218 -0
  83. package/lib/wa/events/MessageEventHandler.js.map +1 -0
  84. package/lib/wa/interfaces/ICacheService.d.ts +12 -0
  85. package/lib/wa/interfaces/ICacheService.js +3 -0
  86. package/lib/wa/interfaces/ICacheService.js.map +1 -0
  87. package/lib/wa/interfaces/IConnectionManager.d.ts +15 -0
  88. package/lib/wa/interfaces/IConnectionManager.js +3 -0
  89. package/lib/wa/interfaces/IConnectionManager.js.map +1 -0
  90. package/lib/wa/interfaces/IErrorHandler.d.ts +9 -0
  91. package/lib/wa/interfaces/IErrorHandler.js +3 -0
  92. package/lib/wa/interfaces/IErrorHandler.js.map +1 -0
  93. package/lib/wa/interfaces/ILoggerService.d.ts +13 -0
  94. package/lib/wa/interfaces/ILoggerService.js +3 -0
  95. package/lib/wa/interfaces/ILoggerService.js.map +1 -0
  96. package/lib/wa/interfaces/ISessionManager.d.ts +16 -0
  97. package/lib/wa/interfaces/ISessionManager.js +3 -0
  98. package/lib/wa/interfaces/ISessionManager.js.map +1 -0
  99. package/lib/wa/interfaces/IStateManager.d.ts +41 -0
  100. package/lib/wa/interfaces/IStateManager.js +3 -0
  101. package/lib/wa/interfaces/IStateManager.js.map +1 -0
  102. package/lib/wa/operations/ChatOperations.d.ts +117 -0
  103. package/lib/wa/operations/ChatOperations.js +349 -0
  104. package/lib/wa/operations/ChatOperations.js.map +1 -0
  105. package/lib/wa/operations/GroupOperations.d.ts +31 -0
  106. package/lib/wa/operations/GroupOperations.js +128 -0
  107. package/lib/wa/operations/GroupOperations.js.map +1 -0
  108. package/lib/wa/operations/MessageOperations.d.ts +69 -0
  109. package/lib/wa/operations/MessageOperations.js +335 -0
  110. package/lib/wa/operations/MessageOperations.js.map +1 -0
  111. package/lib/wa/operations/UserOperations.d.ts +100 -0
  112. package/lib/wa/operations/UserOperations.js +216 -0
  113. package/lib/wa/operations/UserOperations.js.map +1 -0
  114. package/lib/wa/services/CacheService.d.ts +45 -0
  115. package/lib/wa/services/CacheService.js +93 -0
  116. package/lib/wa/services/CacheService.js.map +1 -0
  117. package/lib/wa/services/ErrorHandler.d.ts +26 -0
  118. package/lib/wa/services/ErrorHandler.js +73 -0
  119. package/lib/wa/services/ErrorHandler.js.map +1 -0
  120. package/lib/wa/services/LIDMappingService.d.ts +42 -0
  121. package/lib/wa/services/LIDMappingService.js +132 -0
  122. package/lib/wa/services/LIDMappingService.js.map +1 -0
  123. package/lib/wa/services/LIDNormalizationService.d.ts +30 -0
  124. package/lib/wa/services/LIDNormalizationService.js +136 -0
  125. package/lib/wa/services/LIDNormalizationService.js.map +1 -0
  126. package/lib/wa/services/LoggerService.d.ts +44 -0
  127. package/lib/wa/services/LoggerService.js +85 -0
  128. package/lib/wa/services/LoggerService.js.map +1 -0
  129. package/lib/wa/services/PendingMessageQueue.d.ts +46 -0
  130. package/lib/wa/services/PendingMessageQueue.js +119 -0
  131. package/lib/wa/services/PendingMessageQueue.js.map +1 -0
  132. package/lib/wa/services/RetryService.d.ts +25 -0
  133. package/lib/wa/services/RetryService.js +59 -0
  134. package/lib/wa/services/RetryService.js.map +1 -0
  135. package/lib/wa/utils/ConfigValidator.d.ts +15 -0
  136. package/lib/wa/utils/ConfigValidator.js +66 -0
  137. package/lib/wa/utils/ConfigValidator.js.map +1 -0
  138. package/lib/wa/utils/ErrorUtils.d.ts +29 -0
  139. package/lib/wa/utils/ErrorUtils.js +66 -0
  140. package/lib/wa/utils/ErrorUtils.js.map +1 -0
  141. package/lib/wa/utils/Validation.d.ts +18 -0
  142. package/lib/wa/utils/Validation.js +40 -0
  143. package/lib/wa/utils/Validation.js.map +1 -0
  144. 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.5.0",
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",