@gqb333/based 2.7.71
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/LICENSE +58 -0
- package/README.MD +611 -0
- package/WAProto/GenerateStatics.sh +4 -0
- package/WAProto/WAProto.proto +5604 -0
- package/WAProto/index.d.ts +63156 -0
- package/WAProto/index.js +195638 -0
- package/WAProto/p.html +1 -0
- package/engine-requirements.js +10 -0
- package/lib/Defaults/baileys-version.json +3 -0
- package/lib/Defaults/index.d.ts +53 -0
- package/lib/Defaults/index.js +108 -0
- package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
- package/lib/Signal/Group/ciphertext-message.js +15 -0
- package/lib/Signal/Group/group-session-builder.d.ts +14 -0
- package/lib/Signal/Group/group-session-builder.js +64 -0
- package/lib/Signal/Group/group_cipher.d.ts +17 -0
- package/lib/Signal/Group/group_cipher.js +96 -0
- package/lib/Signal/Group/index.d.ts +11 -0
- package/lib/Signal/Group/index.js +57 -0
- package/lib/Signal/Group/keyhelper.d.ts +10 -0
- package/lib/Signal/Group/keyhelper.js +55 -0
- package/lib/Signal/Group/queue-job.d.ts +1 -0
- package/lib/Signal/Group/queue-job.js +57 -0
- package/lib/Signal/Group/sender-chain-key.d.ts +13 -0
- package/lib/Signal/Group/sender-chain-key.js +34 -0
- package/lib/Signal/Group/sender-key-distribution-message.d.ts +16 -0
- package/lib/Signal/Group/sender-key-distribution-message.js +66 -0
- package/lib/Signal/Group/sender-key-message.d.ts +18 -0
- package/lib/Signal/Group/sender-key-message.js +69 -0
- package/lib/Signal/Group/sender-key-name.d.ts +17 -0
- package/lib/Signal/Group/sender-key-name.js +51 -0
- package/lib/Signal/Group/sender-key-record.d.ts +30 -0
- package/lib/Signal/Group/sender-key-record.js +53 -0
- package/lib/Signal/Group/sender-key-state.d.ts +38 -0
- package/lib/Signal/Group/sender-key-state.js +99 -0
- package/lib/Signal/Group/sender-message-key.d.ts +11 -0
- package/lib/Signal/Group/sender-message-key.js +29 -0
- package/lib/Signal/libsignal.d.ts +3 -0
- package/lib/Signal/libsignal.js +174 -0
- package/lib/Socket/Client/index.d.ts +2 -0
- package/lib/Socket/Client/index.js +18 -0
- package/lib/Socket/Client/types.d.ts +16 -0
- package/lib/Socket/Client/types.js +13 -0
- package/lib/Socket/Client/websocket.d.ts +13 -0
- package/lib/Socket/Client/websocket.js +111 -0
- package/lib/Socket/business.d.ts +172 -0
- package/lib/Socket/business.js +260 -0
- package/lib/Socket/chats.d.ts +85 -0
- package/lib/Socket/chats.js +1094 -0
- package/lib/Socket/groups.d.ts +124 -0
- package/lib/Socket/groups.js +423 -0
- package/lib/Socket/index.d.ts +172 -0
- package/lib/Socket/index.js +32 -0
- package/lib/Socket/messages-interactive.js +259 -0
- package/lib/Socket/messages-recv.d.ts +161 -0
- package/lib/Socket/messages-recv.js +1474 -0
- package/lib/Socket/messages-send.d.ts +151 -0
- package/lib/Socket/messages-send.js +1085 -0
- package/lib/Socket/newsletter.d.ts +136 -0
- package/lib/Socket/newsletter.js +250 -0
- package/lib/Socket/socket.d.ts +43 -0
- package/lib/Socket/socket.js +1241 -0
- package/lib/Socket/usync.d.ts +36 -0
- package/lib/Socket/usync.js +123 -0
- package/lib/Store/index.d.ts +2 -0
- package/lib/Store/index.js +8 -0
- package/lib/Store/make-in-memory-store.d.ts +118 -0
- package/lib/Store/make-in-memory-store.js +452 -0
- package/lib/Store/make-ordered-dictionary.d.ts +13 -0
- package/lib/Store/make-ordered-dictionary.js +81 -0
- package/lib/Store/object-repository.d.ts +10 -0
- package/lib/Store/object-repository.js +27 -0
- package/lib/Types/Auth.d.ts +114 -0
- package/lib/Types/Auth.js +2 -0
- package/lib/Types/Call.d.ts +13 -0
- package/lib/Types/Call.js +2 -0
- package/lib/Types/Chat.d.ts +109 -0
- package/lib/Types/Chat.js +4 -0
- package/lib/Types/Contact.d.ts +29 -0
- package/lib/Types/Contact.js +2 -0
- package/lib/Types/Events.d.ts +199 -0
- package/lib/Types/Events.js +2 -0
- package/lib/Types/GroupMetadata.d.ts +64 -0
- package/lib/Types/GroupMetadata.js +2 -0
- package/lib/Types/Label.d.ts +35 -0
- package/lib/Types/Label.js +27 -0
- package/lib/Types/LabelAssociation.d.ts +29 -0
- package/lib/Types/LabelAssociation.js +9 -0
- package/lib/Types/Message.d.ts +740 -0
- package/lib/Types/Message.js +7 -0
- package/lib/Types/Newsletter.d.ts +22 -0
- package/lib/Types/Newsletter.js +18 -0
- package/lib/Types/Product.d.ts +78 -0
- package/lib/Types/Product.js +2 -0
- package/lib/Types/Signal.d.ts +63 -0
- package/lib/Types/Signal.js +2 -0
- package/lib/Types/Socket.d.ts +134 -0
- package/lib/Types/Socket.js +2 -0
- package/lib/Types/State.d.ts +27 -0
- package/lib/Types/State.js +2 -0
- package/lib/Types/USync.d.ts +25 -0
- package/lib/Types/USync.js +2 -0
- package/lib/Types/index.d.ts +65 -0
- package/lib/Types/index.js +43 -0
- package/lib/Utils/auth-utils.d.ts +18 -0
- package/lib/Utils/auth-utils.js +209 -0
- package/lib/Utils/baileys-event-stream.d.ts +16 -0
- package/lib/Utils/baileys-event-stream.js +63 -0
- package/lib/Utils/business.d.ts +22 -0
- package/lib/Utils/business.js +234 -0
- package/lib/Utils/cache-manager.d.ts +16 -0
- package/lib/Utils/cache-manager.js +114 -0
- package/lib/Utils/chat-utils.d.ts +70 -0
- package/lib/Utils/chat-utils.js +734 -0
- package/lib/Utils/crypto.d.ts +40 -0
- package/lib/Utils/crypto.js +193 -0
- package/lib/Utils/decode-wa-message.d.ts +35 -0
- package/lib/Utils/decode-wa-message.js +207 -0
- package/lib/Utils/event-buffer.d.ts +35 -0
- package/lib/Utils/event-buffer.js +619 -0
- package/lib/Utils/generics.d.ts +89 -0
- package/lib/Utils/generics.js +440 -0
- package/lib/Utils/history.d.ts +19 -0
- package/lib/Utils/history.js +94 -0
- package/lib/Utils/index.d.ts +22 -0
- package/lib/Utils/index.js +38 -0
- package/lib/Utils/jid-validation.d.ts +2 -0
- package/lib/Utils/jid-validation.js +186 -0
- package/lib/Utils/link-preview.d.ts +21 -0
- package/lib/Utils/link-preview.js +152 -0
- package/lib/Utils/logger.d.ts +11 -0
- package/lib/Utils/logger.js +59 -0
- package/lib/Utils/lt-hash.d.ts +12 -0
- package/lib/Utils/lt-hash.js +51 -0
- package/lib/Utils/make-mutex.d.ts +7 -0
- package/lib/Utils/make-mutex.js +43 -0
- package/lib/Utils/messages-media.d.ts +120 -0
- package/lib/Utils/messages-media.js +848 -0
- package/lib/Utils/messages.d.ts +131 -0
- package/lib/Utils/messages.js +1793 -0
- package/lib/Utils/newsletter-utils.d.ts +2 -0
- package/lib/Utils/newsletter-utils.js +48 -0
- package/lib/Utils/noise-handler.d.ts +19 -0
- package/lib/Utils/noise-handler.js +150 -0
- package/lib/Utils/performance-config.d.ts +70 -0
- package/lib/Utils/performance-config.js +183 -0
- package/lib/Utils/process-message.d.ts +42 -0
- package/lib/Utils/process-message.js +498 -0
- package/lib/Utils/rate-limiter.js +90 -0
- package/lib/Utils/retry.js +66 -0
- package/lib/Utils/signal.d.ts +33 -0
- package/lib/Utils/signal.js +153 -0
- package/lib/Utils/use-multi-file-auth-state.d.ts +12 -0
- package/lib/Utils/use-multi-file-auth-state.js +129 -0
- package/lib/Utils/validate-connection.d.ts +10 -0
- package/lib/Utils/validate-connection.js +233 -0
- package/lib/WABinary/constants.d.ts +27 -0
- package/lib/WABinary/constants.js +1303 -0
- package/lib/WABinary/decode.d.ts +6 -0
- package/lib/WABinary/decode.js +279 -0
- package/lib/WABinary/encode.d.ts +2 -0
- package/lib/WABinary/encode.js +264 -0
- package/lib/WABinary/generic-utils.d.ts +14 -0
- package/lib/WABinary/generic-utils.js +114 -0
- package/lib/WABinary/index.d.ts +5 -0
- package/lib/WABinary/index.js +21 -0
- package/lib/WABinary/jid-utils.d.ts +38 -0
- package/lib/WABinary/jid-utils.js +485 -0
- package/lib/WABinary/types.d.ts +18 -0
- package/lib/WABinary/types.js +2 -0
- package/lib/WAM/BinaryInfo.d.ts +8 -0
- package/lib/WAM/BinaryInfo.js +13 -0
- package/lib/WAM/constants.d.ts +38 -0
- package/lib/WAM/constants.js +15350 -0
- package/lib/WAM/encode.d.ts +2 -0
- package/lib/WAM/encode.js +155 -0
- package/lib/WAM/index.d.ts +3 -0
- package/lib/WAM/index.js +19 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
- package/lib/WAUSync/Protocols/USyncContactProtocol.js +102 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
- package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +110 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
- package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +30 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
- package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.d.ts +25 -0
- package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +53 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.d.ts +8 -0
- package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
- package/lib/WAUSync/Protocols/index.d.ts +4 -0
- package/lib/WAUSync/Protocols/index.js +20 -0
- package/lib/WAUSync/USyncQuery.d.ts +28 -0
- package/lib/WAUSync/USyncQuery.js +147 -0
- package/lib/WAUSync/USyncUser.d.ts +12 -0
- package/lib/WAUSync/USyncUser.js +26 -0
- package/lib/WAUSync/index.d.ts +3 -0
- package/lib/WAUSync/index.js +19 -0
- package/lib/index.d.ts +17 -0
- package/lib/index.js +53 -0
- package/package.json +104 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./encode"), exports);
|
|
18
|
+
__exportStar(require("./decode"), exports);
|
|
19
|
+
__exportStar(require("./generic-utils"), exports);
|
|
20
|
+
__exportStar(require("./jid-utils"), exports);
|
|
21
|
+
__exportStar(require("./types"), exports);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const S_WHATSAPP_NET = "@s.whatsapp.net";
|
|
2
|
+
export declare const OFFICIAL_BIZ_JID = "16505361212@c.us";
|
|
3
|
+
export declare const SERVER_JID = "server@c.us";
|
|
4
|
+
export declare const PSA_WID = "0@c.us";
|
|
5
|
+
export declare const STORIES_JID = "status@broadcast";
|
|
6
|
+
export declare const META_AI_JID = "13135550002@c.us";
|
|
7
|
+
export type JidServer = 'c.us' | 'g.us' | 'broadcast' | 's.whatsapp.net' | 'call' | 'lid' | 'newsletter' | 'bot';
|
|
8
|
+
export type JidWithDevice = {
|
|
9
|
+
user: string;
|
|
10
|
+
device?: number;
|
|
11
|
+
};
|
|
12
|
+
export type FullJid = JidWithDevice & {
|
|
13
|
+
server: JidServer;
|
|
14
|
+
domainType?: number;
|
|
15
|
+
};
|
|
16
|
+
export declare const jidEncode: (user: string | number | null, server: JidServer, device?: number, agent?: number) => string;
|
|
17
|
+
export declare const jidDecode: (jid: string | undefined) => FullJid | undefined;
|
|
18
|
+
/** is the jid a user */
|
|
19
|
+
export declare const areJidsSameUser: (jid1: string | undefined, jid2: string | undefined) => boolean;
|
|
20
|
+
/** is the jid Meta IA */
|
|
21
|
+
export declare const isJidMetaAi: (jid: string | undefined) => boolean | undefined;
|
|
22
|
+
/** is the jid a user */
|
|
23
|
+
export declare const isJidUser: (jid: string | undefined) => boolean | undefined;
|
|
24
|
+
/** is the jid a group */
|
|
25
|
+
export declare const isLidUser: (jid: string | undefined) => boolean | undefined;
|
|
26
|
+
/** is the jid a broadcast */
|
|
27
|
+
export declare const isJidBroadcast: (jid: string | undefined) => boolean | undefined;
|
|
28
|
+
/** is the jid a newsletter */
|
|
29
|
+
export declare const isJidNewsletter: (jid: string | undefined) => boolean | undefined;
|
|
30
|
+
/** is the jid a group */
|
|
31
|
+
export declare const isJidGroup: (jid: string | undefined) => boolean | undefined;
|
|
32
|
+
/** is the jid the status broadcast */
|
|
33
|
+
export declare const isJidStatusBroadcast: (jid: string) => jid is "status@broadcast";
|
|
34
|
+
export declare const isJidBot: (jid: string | undefined) => boolean | "" | undefined;
|
|
35
|
+
export declare const jidNormalizedUser: (jid: string | undefined) => string;
|
|
36
|
+
export declare const lidToJid: (jid: string) => string;
|
|
37
|
+
export declare const resolveJid: (jid: string | undefined) => string | undefined;
|
|
38
|
+
export declare const getBotJid: (jid: string) => string;
|
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAndConvertLidToJid = exports.validateAndCleanJid = exports.lidToJidEnhanced = exports.resolveJid = exports.lidToJid = exports.getBotJid = exports.jidNormalizedUser = exports.isJidBot = exports.isJidStatusBroadcast = exports.isJidGroup = exports.isJidNewsletter = exports.isJidBroadcast = exports.isLid = exports.assertLid = exports.isJidUser = exports.isJidMetaAi = exports.areJidsSameUser = exports.jidDecode = exports.jidEncode = exports.META_AI_JID = exports.STORIES_JID = exports.PSA_WID = exports.SERVER_JID = exports.OFFICIAL_BIZ_JID = exports.S_WHATSAPP_NET = void 0;
|
|
4
|
+
exports.S_WHATSAPP_NET = '@s.whatsapp.net';
|
|
5
|
+
exports.OFFICIAL_BIZ_JID = '16505361212@c.us';
|
|
6
|
+
exports.SERVER_JID = 'server@c.us';
|
|
7
|
+
exports.PSA_WID = '0@c.us';
|
|
8
|
+
exports.STORIES_JID = 'status@broadcast';
|
|
9
|
+
exports.META_AI_JID = '13135550002@c.us';
|
|
10
|
+
const jidEncode = (user, server, device, agent) => {
|
|
11
|
+
return `${user || ''}${!!agent ? `_${agent}` : ''}${!!device ? `:${device}` : ''}@${server}`;
|
|
12
|
+
};
|
|
13
|
+
exports.jidEncode = jidEncode;
|
|
14
|
+
const jidDecode = (jid) => {
|
|
15
|
+
const sepIdx = typeof jid === 'string' ? jid.indexOf('@') : -1;
|
|
16
|
+
if (sepIdx < 0) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const server = jid.slice(sepIdx + 1);
|
|
20
|
+
const userCombined = jid.slice(0, sepIdx);
|
|
21
|
+
const [userAgent, device] = userCombined.split(':');
|
|
22
|
+
const user = userAgent.split('_')[0];
|
|
23
|
+
return {
|
|
24
|
+
server: server,
|
|
25
|
+
user,
|
|
26
|
+
domainType: server === 'lid' ? 1 : 0,
|
|
27
|
+
device: device ? +device : undefined
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
exports.jidDecode = jidDecode;
|
|
31
|
+
/** is the jid a user */
|
|
32
|
+
const areJidsSameUser = (jid1, jid2) => {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
return (((_a = (0, exports.jidDecode)(jid1)) === null || _a === void 0 ? void 0 : _a.user) === ((_b = (0, exports.jidDecode)(jid2)) === null || _b === void 0 ? void 0 : _b.user));
|
|
35
|
+
};
|
|
36
|
+
exports.areJidsSameUser = areJidsSameUser;
|
|
37
|
+
/** is the jid Meta IA */
|
|
38
|
+
const isJidMetaAi = (jid) => (jid === null || jid === void 0 ? void 0 : jid.endsWith('@bot'));
|
|
39
|
+
exports.isJidMetaAi = isJidMetaAi;
|
|
40
|
+
/** is the jid a user */
|
|
41
|
+
const isJidUser = (jid) => (jid === null || jid === void 0 ? void 0 : jid.endsWith('@s.whatsapp.net'));
|
|
42
|
+
exports.isJidUser = isJidUser;
|
|
43
|
+
/** is the jid a group */
|
|
44
|
+
const isLid = (jid) => (jid === null || jid === void 0 ? void 0 : jid.endsWith('@lid'));
|
|
45
|
+
exports.isLid = isLid;
|
|
46
|
+
exports.isLidUser = isLid;
|
|
47
|
+
/** assert the jid is a LID */
|
|
48
|
+
const assertLid = (jid) => {
|
|
49
|
+
if (!isLid(jid)) {
|
|
50
|
+
throw new Error(`JID "${jid}" is not a LID`);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.assertLid = assertLid;
|
|
54
|
+
/** is the jid a broadcast */
|
|
55
|
+
const isJidBroadcast = (jid) => (jid === null || jid === void 0 ? void 0 : jid.endsWith('@broadcast'));
|
|
56
|
+
exports.isJidBroadcast = isJidBroadcast;
|
|
57
|
+
/** is the jid a newsletter */
|
|
58
|
+
const isJidNewsletter = (jid) => (jid === null || jid === void 0 ? void 0 : jid.endsWith('@newsletter'));
|
|
59
|
+
exports.isJidNewsletter = isJidNewsletter;
|
|
60
|
+
/** is the jid a group */
|
|
61
|
+
const isJidGroup = (jid) => (jid === null || jid === void 0 ? void 0 : jid.endsWith('@g.us'));
|
|
62
|
+
exports.isJidGroup = isJidGroup;
|
|
63
|
+
/** is the jid the status broadcast */
|
|
64
|
+
const isJidStatusBroadcast = (jid) => jid === 'status@broadcast';
|
|
65
|
+
exports.isJidStatusBroadcast = isJidStatusBroadcast;
|
|
66
|
+
const botRegexp = /^1313555\d{4}$|^131655500\d{2}$/;
|
|
67
|
+
const isJidBot = (jid) => (jid && botRegexp.test(jid.split('@')[0]) && jid.endsWith('@c.us'));
|
|
68
|
+
exports.isJidBot = isJidBot;
|
|
69
|
+
const jidNormalizedUser = (jid) => {
|
|
70
|
+
const result = (0, exports.jidDecode)(jid);
|
|
71
|
+
if (!result) {
|
|
72
|
+
return '';
|
|
73
|
+
}
|
|
74
|
+
const { user, server } = result;
|
|
75
|
+
return (0, exports.jidEncode)(user, server === 'c.us' ? 's.whatsapp.net' : server);
|
|
76
|
+
};
|
|
77
|
+
exports.jidNormalizedUser = jidNormalizedUser;
|
|
78
|
+
// Node.js helpers for optional dynamic bot map loading
|
|
79
|
+
const fs = require('fs');
|
|
80
|
+
const path = require('path');
|
|
81
|
+
|
|
82
|
+
// LRU cache semplice per lidToJid (leggero, senza dipendenze)
|
|
83
|
+
class SimpleLRU {
|
|
84
|
+
constructor(maxSize = 5000, ttl = 5 * 60 * 1000) {
|
|
85
|
+
this.maxSize = maxSize;
|
|
86
|
+
this.ttl = ttl;
|
|
87
|
+
this.map = new Map(); // mantiene l'ordine di inserimento
|
|
88
|
+
}
|
|
89
|
+
get(key) {
|
|
90
|
+
const entry = this.map.get(key);
|
|
91
|
+
if (!entry)
|
|
92
|
+
return undefined;
|
|
93
|
+
if (Date.now() - entry.ts > this.ttl) {
|
|
94
|
+
this.map.delete(key);
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
// promuovi a MRU
|
|
98
|
+
this.map.delete(key);
|
|
99
|
+
this.map.set(key, entry);
|
|
100
|
+
return entry.value;
|
|
101
|
+
}
|
|
102
|
+
set(key, value) {
|
|
103
|
+
if (this.map.has(key))
|
|
104
|
+
this.map.delete(key);
|
|
105
|
+
this.map.set(key, { value, ts: Date.now() });
|
|
106
|
+
if (this.map.size > this.maxSize) {
|
|
107
|
+
// rimuovi LRU (primo elemento)
|
|
108
|
+
const it = this.map.keys();
|
|
109
|
+
const lru = it.next().value;
|
|
110
|
+
if (lru)
|
|
111
|
+
this.map.delete(lru);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const DEFAULT_LID_CACHE_TTL = 5 * 60 * 1000; // 5 minuti
|
|
117
|
+
const DEFAULT_LID_CACHE_MAX = 5000;
|
|
118
|
+
const lidToJidCache = new SimpleLRU(DEFAULT_LID_CACHE_MAX, DEFAULT_LID_CACHE_TTL);
|
|
119
|
+
|
|
120
|
+
const lidToJid = (jid) => {
|
|
121
|
+
try {
|
|
122
|
+
if (!jid || typeof jid !== 'string') {
|
|
123
|
+
return jid;
|
|
124
|
+
}
|
|
125
|
+
const cached = lidToJidCache.get(jid);
|
|
126
|
+
if (cached)
|
|
127
|
+
return cached;
|
|
128
|
+
|
|
129
|
+
let result = jid;
|
|
130
|
+
if (jid.endsWith('@lid')) {
|
|
131
|
+
const lidPart = jid.replace('@lid', '');
|
|
132
|
+
|
|
133
|
+
// Check if this LID exists in BOT_MAP first
|
|
134
|
+
if (BOT_MAP.has(lidPart)) {
|
|
135
|
+
result = BOT_MAP.get(lidPart) + '@s.whatsapp.net';
|
|
136
|
+
} else {
|
|
137
|
+
// Check if lidPart is a valid phone number (digits only, reasonable length)
|
|
138
|
+
const isValidPhoneNumber = /^[0-9]+$/.test(lidPart) && lidPart.length >= 8 && lidPart.length <= 15;
|
|
139
|
+
|
|
140
|
+
if (isValidPhoneNumber) {
|
|
141
|
+
result = lidPart + '@s.whatsapp.net';
|
|
142
|
+
} else {
|
|
143
|
+
// Not a valid phone number, keep as LID or return original
|
|
144
|
+
result = jid; // Keep original LID if it's not a valid phone number
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
lidToJidCache.set(jid, result);
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
try {
|
|
154
|
+
const { Logger } = require('../Utils/performance-config');
|
|
155
|
+
Logger.error('Error in lidToJid:', error && error.message ? error.message : error, 'Input:', jid);
|
|
156
|
+
} catch (_) {
|
|
157
|
+
// Fallback if logger is not available
|
|
158
|
+
}
|
|
159
|
+
return jid;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
exports.lidToJid = lidToJid;
|
|
163
|
+
|
|
164
|
+
const resolveJid = (jid) => {
|
|
165
|
+
if (typeof jid === 'string' && jid.endsWith('@lid')) {
|
|
166
|
+
return lidToJid(jid);
|
|
167
|
+
}
|
|
168
|
+
return jid;
|
|
169
|
+
};
|
|
170
|
+
exports.resolveJid = resolveJid;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Enhanced LID to JID conversion with phone number validation
|
|
174
|
+
* Validates that the phone number has a valid international format
|
|
175
|
+
*/
|
|
176
|
+
const validateAndConvertLidToJid = async (jid, onWhatsApp) => {
|
|
177
|
+
try {
|
|
178
|
+
if (!jid || typeof jid !== 'string') {
|
|
179
|
+
return jid;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// First, try basic conversion
|
|
183
|
+
const convertedJid = lidToJid(jid);
|
|
184
|
+
|
|
185
|
+
// If it's still a LID, return as-is (invalid phone number)
|
|
186
|
+
if (isLid(convertedJid)) {
|
|
187
|
+
return convertedJid;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// If it's already a JID (not converted), validate it exists on WhatsApp
|
|
191
|
+
if (!jid.endsWith('@lid') && convertedJid === jid) {
|
|
192
|
+
if (onWhatsApp) {
|
|
193
|
+
try {
|
|
194
|
+
const validation = await onWhatsApp(convertedJid);
|
|
195
|
+
if (validation && validation.length > 0 && validation[0].exists) {
|
|
196
|
+
return convertedJid;
|
|
197
|
+
} else {
|
|
198
|
+
// JID doesn't exist on WhatsApp, return original
|
|
199
|
+
return jid;
|
|
200
|
+
}
|
|
201
|
+
} catch (error) {
|
|
202
|
+
// If validation fails, return converted JID (better than nothing)
|
|
203
|
+
return convertedJid;
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
// No onWhatsApp available, return as-is
|
|
207
|
+
return convertedJid;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// For newly converted JIDs, validate they exist on WhatsApp
|
|
212
|
+
if (convertedJid !== jid && onWhatsApp) {
|
|
213
|
+
try {
|
|
214
|
+
const validation = await onWhatsApp(convertedJid);
|
|
215
|
+
if (validation && validation.length > 0 && validation[0].exists) {
|
|
216
|
+
return convertedJid;
|
|
217
|
+
} else {
|
|
218
|
+
// Converted JID doesn't exist on WhatsApp, keep original LID
|
|
219
|
+
return jid;
|
|
220
|
+
}
|
|
221
|
+
} catch (error) {
|
|
222
|
+
// If validation fails, return converted JID
|
|
223
|
+
return convertedJid;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return convertedJid;
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
try {
|
|
231
|
+
const { Logger } = require('../Utils/performance-config');
|
|
232
|
+
Logger.error('Error in validateAndConvertLidToJid:', error && error.message ? error.message : error, 'Input:', jid);
|
|
233
|
+
} catch (_) {
|
|
234
|
+
// ignore if logger not available
|
|
235
|
+
}
|
|
236
|
+
return jid;
|
|
237
|
+
}
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Simple phone number validation based on international format
|
|
242
|
+
* Checks if the number has a valid country code and reasonable length
|
|
243
|
+
*/
|
|
244
|
+
const isValidInternationalPhoneNumber = (phoneNumber) => {
|
|
245
|
+
if (!phoneNumber || typeof phoneNumber !== 'string') {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Remove any non-digit characters
|
|
250
|
+
const digits = phoneNumber.replace(/\D/g, '');
|
|
251
|
+
|
|
252
|
+
// Check length (8-15 digits is typical for international numbers)
|
|
253
|
+
if (digits.length < 8 || digits.length > 15) {
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Check if it starts with a valid country code (1-3 digits)
|
|
258
|
+
// Most country codes are 1-3 digits long
|
|
259
|
+
const firstThreeDigits = digits.substring(0, 3);
|
|
260
|
+
const firstTwoDigits = digits.substring(0, 2);
|
|
261
|
+
const firstDigit = digits.substring(0, 1);
|
|
262
|
+
|
|
263
|
+
// Common valid country codes (this is not exhaustive but covers most cases)
|
|
264
|
+
const validCountryCodes = [
|
|
265
|
+
'1', '7', '20', '27', '30', '31', '32', '33', '34', '36', '39', '40', '41', '43', '44', '45', '46', '47', '48', '49',
|
|
266
|
+
'51', '52', '53', '54', '55', '56', '57', '58', '60', '61', '62', '63', '64', '65', '66', '81', '82', '84', '86', '90', '91', '92', '93', '94', '95', '98', '212', '213', '216', '218', '220', '221', '222', '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237', '238', '239', '240', '241', '242', '243', '244', '245', '246', '247', '248', '249', '250', '251', '252', '253', '254', '255', '256', '257', '258', '260', '261', '262', '263', '264', '265', '266', '267', '268', '269', '290', '291', '297', '298', '299', '350', '351', '352', '353', '354', '355', '356', '357', '358', '359', '370', '371', '372', '373', '374', '375', '376', '377', '378', '380', '381', '382', '383', '385', '386', '387', '389', '420', '421', '423', '424', '425', '426', '427', '428', '430', '431', '432', '433', '434', '435', '436', '437', '438', '439', '440', '441', '442', '443', '445', '446', '447', '448', '449', '450', '451', '452', '453', '454', '455', '456', '457', '458', '459', '460', '461', '462', '463', '464', '465', '466', '467', '468', '469', '470', '471', '472', '473', '474', '475', '476', '477', '478', '479', '480', '481', '482', '483', '484', '485', '486', '487', '488', '489', '490', '491', '492', '493', '494', '495', '496', '497', '498', '499', '500', '501', '502', '503', '504', '505', '506', '507', '508', '509', '590', '591', '592', '593', '594', '595', '596', '597', '598', '599', '670', '672', '673', '674', '675', '676', '677', '678', '679', '680', '681', '682', '683', '684', '685', '686', '687', '688', '689', '690', '691', '692', '693', '694', '695', '696', '697', '698', '699', '850', '852', '853', '855', '856', '880', '886', '960', '961', '962', '963', '964', '965', '966', '967', '968', '970', '971', '972', '973', '974', '975', '976', '977', '979', '992', '993', '994', '995', '996', '998'
|
|
267
|
+
];
|
|
268
|
+
|
|
269
|
+
// Check if the number starts with a valid country code
|
|
270
|
+
const hasValidCountryCode = validCountryCodes.includes(firstThreeDigits) ||
|
|
271
|
+
validCountryCodes.includes(firstTwoDigits) ||
|
|
272
|
+
validCountryCodes.includes(firstDigit);
|
|
273
|
+
|
|
274
|
+
// Special case: reject numbers that start with suspicious patterns
|
|
275
|
+
// 101, 999, 000, etc. are not valid country codes
|
|
276
|
+
const suspiciousPatterns = ['101', '999', '000', '123', '456', '789'];
|
|
277
|
+
const hasSuspiciousPattern = suspiciousPatterns.includes(firstThreeDigits) ||
|
|
278
|
+
suspiciousPatterns.includes(firstTwoDigits);
|
|
279
|
+
|
|
280
|
+
return hasValidCountryCode && !hasSuspiciousPattern;
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Enhanced LID to JID conversion with international phone validation
|
|
285
|
+
* Uses phone number format validation instead of WhatsApp API calls
|
|
286
|
+
*/
|
|
287
|
+
const lidToJidEnhanced = (jid) => {
|
|
288
|
+
try {
|
|
289
|
+
if (!jid || typeof jid !== 'string') {
|
|
290
|
+
return jid;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
let result = jid;
|
|
294
|
+
|
|
295
|
+
// Handle LID conversion
|
|
296
|
+
if (jid.endsWith('@lid')) {
|
|
297
|
+
const lidPart = jid.replace('@lid', '');
|
|
298
|
+
|
|
299
|
+
// Check if this LID exists in BOT_MAP first
|
|
300
|
+
if (BOT_MAP.has(lidPart)) {
|
|
301
|
+
result = BOT_MAP.get(lidPart) + '@s.whatsapp.net';
|
|
302
|
+
} else {
|
|
303
|
+
// Check if lidPart is a valid international phone number
|
|
304
|
+
if (isValidInternationalPhoneNumber(lidPart)) {
|
|
305
|
+
result = lidPart + '@s.whatsapp.net';
|
|
306
|
+
} else {
|
|
307
|
+
// Not a valid international phone number, keep as LID
|
|
308
|
+
result = jid;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// Handle existing JID validation
|
|
313
|
+
else if (jid.endsWith('@s.whatsapp.net')) {
|
|
314
|
+
const phoneNumber = jid.replace('@s.whatsapp.net', '');
|
|
315
|
+
|
|
316
|
+
// Validate if this JID has a valid international phone number
|
|
317
|
+
if (!isValidInternationalPhoneNumber(phoneNumber)) {
|
|
318
|
+
// This JID is invalid, but we can't convert it back to LID
|
|
319
|
+
// Keep it as-is but log the issue
|
|
320
|
+
try {
|
|
321
|
+
const { Logger } = require('../Utils/performance-config');
|
|
322
|
+
Logger.warn('Invalid JID detected:', jid, 'Phone number:', phoneNumber);
|
|
323
|
+
} catch (_) {
|
|
324
|
+
// ignore if logger not available
|
|
325
|
+
}
|
|
326
|
+
result = jid; // Keep the invalid JID for now
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return result;
|
|
331
|
+
}
|
|
332
|
+
catch (error) {
|
|
333
|
+
try {
|
|
334
|
+
const { Logger } = require('../Utils/performance-config');
|
|
335
|
+
Logger.error('Error in lidToJidEnhanced:', error && error.message ? error.message : error, 'Input:', jid);
|
|
336
|
+
} catch (_) {
|
|
337
|
+
// ignore if logger not available
|
|
338
|
+
}
|
|
339
|
+
return jid;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Validates and cleans existing JIDs, converting invalid ones back to LID if possible
|
|
345
|
+
*/
|
|
346
|
+
const validateAndCleanJid = (jid) => {
|
|
347
|
+
try {
|
|
348
|
+
if (!jid || typeof jid !== 'string') {
|
|
349
|
+
return jid;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// If it's a LID, use enhanced conversion
|
|
353
|
+
if (jid.endsWith('@lid')) {
|
|
354
|
+
return lidToJidEnhanced(jid);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// If it's a JID, validate it
|
|
358
|
+
if (jid.endsWith('@s.whatsapp.net')) {
|
|
359
|
+
const phoneNumber = jid.replace('@s.whatsapp.net', '');
|
|
360
|
+
|
|
361
|
+
// Check if this is a valid international phone number
|
|
362
|
+
if (!isValidInternationalPhoneNumber(phoneNumber)) {
|
|
363
|
+
// This JID is invalid, try to convert back to LID
|
|
364
|
+
// Check if it might be from our suspicious patterns
|
|
365
|
+
const firstThreeDigits = phoneNumber.substring(0, 3);
|
|
366
|
+
const suspiciousPatterns = ['101', '999', '000', '123', '456', '789'];
|
|
367
|
+
|
|
368
|
+
if (suspiciousPatterns.includes(firstThreeDigits)) {
|
|
369
|
+
// Convert back to LID
|
|
370
|
+
return phoneNumber + '@lid';
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// For other invalid numbers, we'll keep the JID but mark it
|
|
374
|
+
try {
|
|
375
|
+
const { Logger } = require('../Utils/performance-config');
|
|
376
|
+
Logger.warn('Invalid JID kept:', jid, 'Phone number:', phoneNumber);
|
|
377
|
+
} catch (_) {
|
|
378
|
+
// ignore if logger not available
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return jid;
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
try {
|
|
387
|
+
const { Logger } = require('../Utils/performance-config');
|
|
388
|
+
Logger.error('Error in validateAndCleanJid:', error && error.message ? error.message : error, 'Input:', jid);
|
|
389
|
+
} catch (_) {
|
|
390
|
+
// ignore if logger not available
|
|
391
|
+
}
|
|
392
|
+
return jid;
|
|
393
|
+
}
|
|
394
|
+
};
|
|
395
|
+
exports.validateAndConvertLidToJid = validateAndConvertLidToJid;
|
|
396
|
+
|
|
397
|
+
// Static BOT map kept for fallback. Created once to avoid recreating Map on each call.
|
|
398
|
+
const BOT_MAP_STATIC = new Map([["867051314767696", "13135550002"], ["1061492271844689", "13135550005"], ["245886058483988", "13135550009"], ["3509905702656130", "13135550012"], ["1059680132034576", "13135550013"], ["715681030623646", "13135550014"], ["1644971366323052", "13135550015"], ["582497970646566", "13135550019"], ["645459357769306", "13135550022"], ["294997126699143", "13135550023"], ["1522631578502677", "13135550027"], ["719421926276396", "13135550030"], ["1788488635002167", "13135550031"], ["24232338603080193", "13135550033"], ["689289903143209", "13135550035"], ["871626054177096", "13135550039"], ["362351902849370", "13135550042"], ["1744617646041527", "13135550043"], ["893887762270570", "13135550046"], ["1155032702135830", "13135550047"], ["333931965993883", "13135550048"], ["853748013058752", "13135550049"], ["1559068611564819", "13135550053"], ["890487432705716", "13135550054"], ["240254602395494", "13135550055"], ["1578420349663261", "13135550062"], ["322908887140421", "13135550065"], ["3713961535514771", "13135550067"], ["997884654811738", "13135550070"], ["403157239387035", "13135550081"], ["535242369074963", "13135550082"], ["946293427247659", "13135550083"], ["3664707673802291", "13135550084"], ["1821827464894892", "13135550085"], ["1760312477828757", "13135550086"], ["439480398712216", "13135550087"], ["1876735582800984", "13135550088"], ["984025089825661", "13135550089"], ["1001336351558186", "13135550090"], ["3739346336347061", "13135550091"], ["3632749426974980", "13135550092"], ["427864203481615", "13135550093"], ["1434734570493055", "13135550094"], ["992873449225921", "13135550095"], ["813087747426445", "13135550096"], ["806369104931434", "13135550098"], ["1220982902403148", "13135550099"], ["1365893374104393", "13135550100"], ["686482033622048", "13135550200"], ["1454999838411253", "13135550201"], ["718584497008509", "13135550202"], ["743520384213443", "13135550301"], ["1147715789823789", "13135550302"], ["1173034540372201", "13135550303"], ["974785541030953", "13135550304"], ["1122200255531507", "13135550305"], ["899669714813162", "13135550306"], ["631880108970650", "13135550307"], ["435816149330026", "13135550308"], ["1368717161184556", "13135550309"], ["7849963461784891", "13135550310"], ["3609617065968984", "13135550312"], ["356273980574602", "13135550313"], ["1043447920539760", "13135550314"], ["1052764336525346", "13135550315"], ["2631118843732685", "13135550316"], ["510505411332176", "13135550317"], ["1945664239227513", "13135550318"], ["1518594378764656", "13135550319"], ["1378821579456138", "13135550320"], ["490214716896013", "13135550321"], ["1028577858870699", "13135550322"], ["308915665545959", "13135550323"], ["845884253678900", "13135550324"], ["995031308616442", "13135550325"], ["2787365464763437", "13135550326"], ["1532790990671645", "13135550327"], ["302617036180485", "13135550328"], ["723376723197227", "13135550329"], ["8393570407377966", "13135550330"], ["1931159970680725", "13135550331"], ["401073885688605", "13135550332"], ["2234478453565422", "13135550334"], ["814748673882312", "13135550335"], ["26133635056281592", "13135550336"], ["1439804456676119", "13135550337"], ["889851503172161", "13135550338"], ["1018283232836879", "13135550339"], ["1012781386779537", "13135559000"], ["823280953239532", "13135559001"], ["1597090934573334", "13135559002"], ["485965054020343", "13135559003"], ["1033381648363446", "13135559004"], ["491802010206446", "13135559005"], ["1017139033184870", "13135559006"], ["499638325922174", "13135559008"], ["468946335863664", "13135559009"], ["1570389776875816", "13135559010"], ["1004342694328995", "13135559011"], ["1012240323971229", "13135559012"], ["392171787222419", "13135559013"], ["952081212945019", "13135559016"], ["444507875070178", "13135559017"], ["1274819440594668", "13135559018"], ["1397041101147050", "13135559019"], ["425657699872640", "13135559020"], ["532292852562549", "13135559021"], ["705863241720292", "13135559022"], ["476449815183959", "13135559023"], ["488071553854222", "13135559024"], ["468693832665397", "13135559025"], ["517422564037340", "13135559026"], ["819805466613825", "13135559027"], ["1847708235641382", "13135559028"], ["716282970644228", "13135559029"], ["521655380527741", "13135559030"], ["476193631941905", "13135559031"], ["485600497445562", "13135559032"], ["440217235683910", "13135559033"], ["523342446758478", "13135559034"], ["514784864360240", "13135559035"], ["505790121814530", "13135559036"], ["420008964419580", "13135559037"], ["492141680204555", "13135559038"], ["388462787271952", "13135559039"], ["423473920752072", "13135559040"], ["489574180468229", "13135559041"], ["432360635854105", "13135559042"], ["477878201669248", "13135559043"], ["351656951234045", "13135559044"], ["430178036732582", "13135559045"], ["434537312944552", "13135559046"], ["1240614300631808", "13135559047"], ["473135945605128", "13135559048"], ["423669800729310", "13135559049"], ["3685666705015792", "13135559050"], ["504196509016638", "13135559051"], ["346844785189449", "13135559052"], ["504823088911074", "13135559053"], ["402669415797083", "13135559054"], ["490939640234431", "13135559055"], ["875124128063715", "13135559056"], ["468788962654605", "13135559057"], ["562386196354570", "13135559058"], ["372159285928791", "13135559059"], ["531017479591050", "13135559060"], ["1328873881401826", "13135559061"], ["1608363646390484", "13135559062"], ["1229628561554232", "13135559063"], ["348802211530364", "13135559064"], ["3708535859420184", "13135559065"], ["415517767742187", "13135559066"], ["479330341612638", "13135559067"], ["480785414723083", "13135559068"], ["387299107507991", "13135559069"], ["333389813188944", "13135559070"], ["391794130316996", "13135559071"], ["457893470576314", "13135559072"], ["435550496166469", "13135559073"], ["1620162702100689", "13135559074"], ["867491058616043", "13135559075"], ["816224117357759", "13135559076"], ["334065176362830", "13135559077"], ["489973170554709", "13135559078"], ["473060669049665", "13135559079"], ["1221505815643060", "13135559080"], ["889000703096359", "13135559081"], ["475235961979883", "13135559082"], ["3434445653519934", "13135559084"], ["524503026827421", "13135559085"], ["1179639046403856", "13135559086"], ["471563305859144", "13135559087"], ["533896609192881", "13135559088"], ["365443583168041", "13135559089"], ["836082305329393", "13135559090"], ["1056787705969916", "13135559091"], ["503312598958357", "13135559092"], ["3718606738453460", "13135559093"], ["826066052850902", "13135559094"], ["1033611345091888", "13135559095"], ["3868390816783240", "13135559096"], ["7462677740498860", "13135559097"], ["436288576108573", "13135559098"], ["1047559746718900", "13135559099"], ["1099299455255491", "13135559100"], ["1202037301040633", "13135559101"], ["1720619402074074", "13135559102"], ["1030422235101467", "13135559103"], ["827238979523502", "13135559104"], ["1516443722284921", "13135559105"], ["1174442747196709", "13135559106"], ["1653165225503842", "13135559107"], ["1037648777635013", "13135559108"], ["551617757299900", "13135559109"], ["1158813558718726", "13135559110"], ["2463236450542262", "13135559111"], ["1550393252501466", "13135559112"], ["2057065188042796", "13135559113"], ["506163028760735", "13135559114"], ["2065249100538481", "13135559115"], ["1041382867195858", "13135559116"], ["886500209499603", "13135559117"], ["1491615624892655", "13135559118"], ["486563697299617", "13135559119"], ["1175736513679463", "13135559120"], ["491811473512352", "13165550064"]]);
|
|
399
|
+
|
|
400
|
+
// Current effective BOT map. May be replaced at runtime via `setBotMap` or `loadBotMapFromFile`.
|
|
401
|
+
let BOT_MAP = BOT_MAP_STATIC;
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Attempt to load a bot map JSON from disk. The JSON should be an object mapping
|
|
405
|
+
* userId -> phoneNumber (both strings). Tries first the provided filePath, then
|
|
406
|
+
* looks in process.cwd() and module directory.
|
|
407
|
+
*/
|
|
408
|
+
const loadBotMapFromFile = async (filePath) => {
|
|
409
|
+
const candidates = [];
|
|
410
|
+
if (filePath) candidates.push(filePath);
|
|
411
|
+
candidates.push(path.join(process.cwd(), 'bot-map.json'));
|
|
412
|
+
candidates.push(path.join(__dirname, 'bot-map.json'));
|
|
413
|
+
|
|
414
|
+
for (const p of candidates) {
|
|
415
|
+
try {
|
|
416
|
+
if (!p) continue;
|
|
417
|
+
const stat = await fs.promises.stat(p).catch(() => null);
|
|
418
|
+
if (!stat || !stat.isFile()) continue;
|
|
419
|
+
const data = await fs.promises.readFile(p, 'utf8');
|
|
420
|
+
const obj = JSON.parse(data);
|
|
421
|
+
if (obj && typeof obj === 'object') {
|
|
422
|
+
BOT_MAP = new Map(Object.entries(obj));
|
|
423
|
+
return BOT_MAP;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
catch (err) {
|
|
427
|
+
// continue to next candidate
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
// If no dynamic map found, keep existing BOT_MAP
|
|
431
|
+
return BOT_MAP;
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Replace current BOT map with a provided object or Map.
|
|
436
|
+
*/
|
|
437
|
+
const setBotMap = (mapLike) => {
|
|
438
|
+
if (!mapLike)
|
|
439
|
+
return;
|
|
440
|
+
if (mapLike instanceof Map) {
|
|
441
|
+
BOT_MAP = mapLike;
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
if (typeof mapLike === 'object') {
|
|
445
|
+
BOT_MAP = new Map(Object.entries(mapLike));
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
};
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Get the mapped bot JID for a given jid (e.g. "123@bot"). Uses a runtime
|
|
452
|
+
* configurable map with a static fallback. Returns the input jid if no mapping.
|
|
453
|
+
*/
|
|
454
|
+
const getBotJid = (jid) => {
|
|
455
|
+
try {
|
|
456
|
+
const sepIdx = typeof jid === 'string' ? jid.indexOf('@') : -1;
|
|
457
|
+
if (sepIdx < 0) {
|
|
458
|
+
return jid;
|
|
459
|
+
}
|
|
460
|
+
const server = jid.slice(sepIdx + 1);
|
|
461
|
+
if (server !== 'bot')
|
|
462
|
+
return jid;
|
|
463
|
+
const user = jid.slice(0, sepIdx);
|
|
464
|
+
const mappedNumber = BOT_MAP.get(user);
|
|
465
|
+
return mappedNumber ? `${mappedNumber}@s.whatsapp.net` : jid;
|
|
466
|
+
}
|
|
467
|
+
catch (err) {
|
|
468
|
+
// In case of unexpected errors, log and return original jid as safe fallback
|
|
469
|
+
try {
|
|
470
|
+
const { Logger } = require('../Utils/performance-config');
|
|
471
|
+
Logger.error('getBotJid error:', err && err.message ? err.message : err);
|
|
472
|
+
}
|
|
473
|
+
catch (_) {
|
|
474
|
+
// Fallback if logger is not available
|
|
475
|
+
}
|
|
476
|
+
return jid;
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
exports.getBotJid = getBotJid;
|
|
481
|
+
exports.loadBotMapFromFile = loadBotMapFromFile;
|
|
482
|
+
exports.setBotMap = setBotMap;
|
|
483
|
+
exports.validateAndConvertLidToJid = validateAndConvertLidToJid;
|
|
484
|
+
exports.lidToJidEnhanced = lidToJidEnhanced;
|
|
485
|
+
exports.validateAndCleanJid = validateAndCleanJid;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as constants from './constants';
|
|
2
|
+
/**
|
|
3
|
+
* the binary node WA uses internally for communication
|
|
4
|
+
*
|
|
5
|
+
* this is manipulated soley as an object and it does not have any functions.
|
|
6
|
+
* This is done for easy serialization, to prevent running into issues with prototypes &
|
|
7
|
+
* to maintain functional code structure
|
|
8
|
+
* */
|
|
9
|
+
export type BinaryNode = {
|
|
10
|
+
tag: string;
|
|
11
|
+
attrs: {
|
|
12
|
+
[key: string]: string;
|
|
13
|
+
};
|
|
14
|
+
content?: BinaryNode[] | string | Uint8Array;
|
|
15
|
+
};
|
|
16
|
+
export type BinaryNodeAttributes = BinaryNode['attrs'];
|
|
17
|
+
export type BinaryNodeData = BinaryNode['content'];
|
|
18
|
+
export type BinaryNodeCodingOptions = typeof constants;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BinaryInfo = void 0;
|
|
4
|
+
class BinaryInfo {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.protocolVersion = 5;
|
|
7
|
+
this.sequence = 0;
|
|
8
|
+
this.events = [];
|
|
9
|
+
this.buffer = [];
|
|
10
|
+
Object.assign(this, options);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.BinaryInfo = BinaryInfo;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const WEB_EVENTS: Event[];
|
|
2
|
+
export declare const WEB_GLOBALS: Global[];
|
|
3
|
+
export declare const FLAG_BYTE = 8, FLAG_GLOBAL = 0, FLAG_EVENT = 1, FLAG_FIELD = 2, FLAG_EXTENDED = 4;
|
|
4
|
+
export type Event = {
|
|
5
|
+
name: string;
|
|
6
|
+
id: number;
|
|
7
|
+
props: {
|
|
8
|
+
[key: string]: [number, string | {
|
|
9
|
+
[key: string]: number;
|
|
10
|
+
}];
|
|
11
|
+
};
|
|
12
|
+
weight: number;
|
|
13
|
+
wamChannel: string;
|
|
14
|
+
privateStatsIdInt: number;
|
|
15
|
+
};
|
|
16
|
+
export type Global = {
|
|
17
|
+
name: string;
|
|
18
|
+
id: number;
|
|
19
|
+
type: string | {
|
|
20
|
+
[key: string]: number;
|
|
21
|
+
};
|
|
22
|
+
validator?: string;
|
|
23
|
+
channels: string[];
|
|
24
|
+
};
|
|
25
|
+
type EventByName<T extends Event['name']> = Extract<Event, {
|
|
26
|
+
name: T;
|
|
27
|
+
}>;
|
|
28
|
+
export type EventInputType = {
|
|
29
|
+
[key in Event['name']]: {
|
|
30
|
+
props: {
|
|
31
|
+
[k in keyof EventByName<key>['props']]: any;
|
|
32
|
+
};
|
|
33
|
+
globals: {
|
|
34
|
+
[x: string]: any;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
} & {};
|
|
38
|
+
export {};
|