wa-multi-mongodb 3.10.2 → 3.10.4
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/dist/Defaults/index.js +4 -9
- package/dist/Error/index.js +1 -5
- package/dist/Messaging/index.d.ts +1 -1
- package/dist/Messaging/index.js +123 -137
- package/dist/Profile/index.d.ts +1 -1
- package/dist/Profile/index.js +6 -10
- package/dist/Socket/index.d.ts +160 -1
- package/dist/Socket/index.d.ts.map +1 -1
- package/dist/Socket/index.js +462 -200
- package/dist/Types/index.d.ts +21 -0
- package/dist/Types/index.d.ts.map +1 -1
- package/dist/Types/index.js +1 -2
- package/dist/Types/profile.js +1 -2
- package/dist/Utils/create-delay.js +2 -7
- package/dist/Utils/error.js +1 -4
- package/dist/Utils/group-cache.js +8 -15
- package/dist/Utils/index.d.ts +5 -5
- package/dist/Utils/index.js +5 -21
- package/dist/Utils/is-exist.d.ts +1 -1
- package/dist/Utils/is-exist.js +7 -10
- package/dist/Utils/lid-utils.js +13 -20
- package/dist/Utils/message-status.d.ts +1 -1
- package/dist/Utils/message-status.js +7 -11
- package/dist/Utils/mongo-auth-state.js +10 -13
- package/dist/Utils/phone-to-jid.js +6 -14
- package/dist/Utils/save-media.d.ts +1 -1
- package/dist/Utils/save-media.js +16 -26
- package/dist/cjs/Defaults/index.d.ts +21 -0
- package/dist/cjs/Defaults/index.d.ts.map +1 -0
- package/dist/cjs/Defaults/index.js +31 -0
- package/dist/cjs/Error/index.d.ts +5 -0
- package/dist/cjs/Error/index.d.ts.map +1 -0
- package/dist/cjs/Error/index.js +14 -0
- package/dist/cjs/Messaging/index.d.ts +45 -0
- package/dist/cjs/Messaging/index.d.ts.map +1 -0
- package/dist/cjs/Messaging/index.js +784 -0
- package/dist/cjs/Profile/index.d.ts +9 -0
- package/dist/cjs/Profile/index.d.ts.map +1 -0
- package/dist/cjs/Profile/index.js +34 -0
- package/dist/cjs/Socket/index.d.ts +264 -0
- package/dist/cjs/Socket/index.d.ts.map +1 -0
- package/dist/cjs/Socket/index.js +1210 -0
- package/dist/cjs/Types/index.d.ts +95 -0
- package/dist/cjs/Types/index.d.ts.map +1 -0
- package/dist/cjs/Types/index.js +2 -0
- package/dist/cjs/Types/profile.d.ts +5 -0
- package/dist/cjs/Types/profile.d.ts.map +1 -0
- package/dist/cjs/Types/profile.js +2 -0
- package/dist/cjs/Utils/create-delay.d.ts +17 -0
- package/dist/cjs/Utils/create-delay.d.ts.map +1 -0
- package/dist/cjs/Utils/create-delay.js +38 -0
- package/dist/cjs/Utils/error.d.ts +4 -0
- package/dist/cjs/Utils/error.d.ts.map +1 -0
- package/dist/cjs/Utils/error.js +8 -0
- package/dist/cjs/Utils/group-cache.d.ts +23 -0
- package/dist/cjs/Utils/group-cache.d.ts.map +1 -0
- package/dist/cjs/Utils/group-cache.js +176 -0
- package/dist/cjs/Utils/index.d.ts +6 -0
- package/dist/cjs/Utils/index.d.ts.map +1 -0
- package/dist/cjs/Utils/index.js +23 -0
- package/dist/cjs/Utils/is-exist.d.ts +6 -0
- package/dist/cjs/Utils/is-exist.d.ts.map +1 -0
- package/dist/cjs/Utils/is-exist.js +53 -0
- package/dist/cjs/Utils/lid-utils.d.ts +26 -0
- package/dist/cjs/Utils/lid-utils.d.ts.map +1 -0
- package/dist/cjs/Utils/lid-utils.js +81 -0
- package/dist/cjs/Utils/message-status.d.ts +4 -0
- package/dist/cjs/Utils/message-status.d.ts.map +1 -0
- package/dist/cjs/Utils/message-status.js +18 -0
- package/dist/cjs/Utils/mongo-auth-state.d.ts +15 -0
- package/dist/cjs/Utils/mongo-auth-state.d.ts.map +1 -0
- package/dist/cjs/Utils/mongo-auth-state.js +109 -0
- package/dist/cjs/Utils/phone-to-jid.d.ts +17 -0
- package/dist/cjs/Utils/phone-to-jid.d.ts.map +1 -0
- package/dist/cjs/Utils/phone-to-jid.js +51 -0
- package/dist/cjs/Utils/save-media.d.ts +6 -0
- package/dist/cjs/Utils/save-media.d.ts.map +1 -0
- package/dist/cjs/Utils/save-media.js +55 -0
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +46 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +7 -46
- package/package.json +57 -42
- package/readme.md +170 -3
package/dist/Socket/index.js
CHANGED
|
@@ -1,37 +1,3 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
1
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
36
2
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
37
3
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -41,30 +7,51 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
41
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
8
|
});
|
|
43
9
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const Error_1 = require("../Error");
|
|
58
|
-
const message_status_1 = require("../Utils/message-status");
|
|
59
|
-
const mongodb_1 = require("mongodb");
|
|
60
|
-
const mongo_auth_state_1 = require("../Utils/mongo-auth-state");
|
|
61
|
-
const create_delay_1 = require("../Utils/create-delay");
|
|
10
|
+
import makeWASocket, { Browsers, DisconnectReason, fetchLatestBaileysVersion, } from "baileys";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import fs from "fs";
|
|
13
|
+
import QRCode from "qrcode";
|
|
14
|
+
import pino from "pino";
|
|
15
|
+
import { CALLBACK_KEY, CREDENTIALS, Messages } from "../Defaults/index.js";
|
|
16
|
+
import { saveAudioHandler, saveDocumentHandler, saveImageHandler, saveVideoHandler, } from "../Utils/save-media.js";
|
|
17
|
+
import { groupCache } from "../Utils/index.js";
|
|
18
|
+
import { WhatsappError } from "../Error/index.js";
|
|
19
|
+
import { parseMessageStatusCodeToReadable } from "../Utils/message-status.js";
|
|
20
|
+
import { MongoClient } from "mongodb";
|
|
21
|
+
import { useMongoAuthState } from "../Utils/mongo-auth-state.js";
|
|
22
|
+
import { createDelay } from "../Utils/create-delay.js";
|
|
62
23
|
const sessions = new Map();
|
|
24
|
+
/**
|
|
25
|
+
* Helper function to generate browser configuration based on type and name
|
|
26
|
+
* @param browserType - Browser type (ubuntu, macOS, windows, appropriate)
|
|
27
|
+
* @param browserName - Custom browser/app name
|
|
28
|
+
* @returns Browser configuration tuple for Baileys
|
|
29
|
+
*/
|
|
30
|
+
const getBrowserConfig = (browserType = "ubuntu", browserName = "Chrome") => {
|
|
31
|
+
let browserTuple;
|
|
32
|
+
switch (browserType) {
|
|
33
|
+
case "macOS":
|
|
34
|
+
browserTuple = Browsers.macOS(browserName);
|
|
35
|
+
break;
|
|
36
|
+
case "windows":
|
|
37
|
+
browserTuple = Browsers.windows(browserName);
|
|
38
|
+
break;
|
|
39
|
+
case "appropriate":
|
|
40
|
+
browserTuple = Browsers.appropriate(browserName);
|
|
41
|
+
break;
|
|
42
|
+
case "ubuntu":
|
|
43
|
+
default:
|
|
44
|
+
browserTuple = Browsers.ubuntu(browserName);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
// Convert readonly tuple to mutable tuple for Baileys compatibility
|
|
48
|
+
return [...browserTuple];
|
|
49
|
+
};
|
|
63
50
|
const callback = new Map();
|
|
64
51
|
const retryCount = new Map();
|
|
65
52
|
// Tambahkan Map untuk melacak session yang menggunakan pairing code
|
|
66
53
|
const pairingCodeSessions = new Map();
|
|
67
|
-
const P =
|
|
54
|
+
const P = pino({
|
|
68
55
|
level: "silent",
|
|
69
56
|
});
|
|
70
57
|
// Tambahkan variabel global untuk koneksi MongoDB dan collection
|
|
@@ -77,10 +64,10 @@ let mongoURI = process.env.MONGODB_URI || "mongodb://localhost:27017";
|
|
|
77
64
|
*
|
|
78
65
|
* @param uri MongoDB connection URI
|
|
79
66
|
*/
|
|
80
|
-
const setMongoURI = (uri) => __awaiter(void 0, void 0, void 0, function* () {
|
|
67
|
+
export const setMongoURI = (uri) => __awaiter(void 0, void 0, void 0, function* () {
|
|
81
68
|
mongoURI = uri;
|
|
82
69
|
// Configure group cache MongoDB connection as well
|
|
83
|
-
yield
|
|
70
|
+
yield groupCache.setMongoURI(uri);
|
|
84
71
|
// Reset MongoDB client and collection to ensure they are recreated with new URI
|
|
85
72
|
if (mongoClient) {
|
|
86
73
|
try {
|
|
@@ -94,41 +81,40 @@ const setMongoURI = (uri) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
94
81
|
}
|
|
95
82
|
// MongoDB URI configured successfully - removed console.log for npm package
|
|
96
83
|
});
|
|
97
|
-
|
|
98
|
-
function setMongoCollection(collection) {
|
|
84
|
+
export function setMongoCollection(collection) {
|
|
99
85
|
authCollection = collection;
|
|
100
86
|
}
|
|
101
87
|
function initMongo() {
|
|
102
88
|
return __awaiter(this, void 0, void 0, function* () {
|
|
103
89
|
if (!authCollection) {
|
|
104
90
|
if (!mongoClient) {
|
|
105
|
-
mongoClient = new
|
|
91
|
+
mongoClient = new MongoClient(mongoURI);
|
|
106
92
|
yield mongoClient.connect();
|
|
107
93
|
}
|
|
108
94
|
// Gunakan variabel dari CREDENTIALS
|
|
109
|
-
const dbName =
|
|
110
|
-
const collectionName =
|
|
95
|
+
const dbName = CREDENTIALS.MONGO_DB_NAME;
|
|
96
|
+
const collectionName = CREDENTIALS.MONGO_COLLECTION_NAME;
|
|
111
97
|
authCollection = mongoClient.db(dbName).collection(collectionName);
|
|
112
98
|
// console.log(`MongoDB initialized with database "${dbName}" and collection "${collectionName}"`);
|
|
113
99
|
}
|
|
114
100
|
});
|
|
115
101
|
}
|
|
116
|
-
const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (sessionId = "mysession", options = { printQR: true }) {
|
|
102
|
+
export const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (sessionId = "mysession", options = { printQR: true }) {
|
|
117
103
|
if (isSessionExistAndRunning(sessionId))
|
|
118
|
-
throw new
|
|
104
|
+
throw new WhatsappError(Messages.sessionAlreadyExist(sessionId));
|
|
119
105
|
yield initMongo();
|
|
120
|
-
const { version } = yield
|
|
106
|
+
const { version } = yield fetchLatestBaileysVersion();
|
|
121
107
|
const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
122
|
-
const { state, saveCreds } = yield
|
|
123
|
-
const sock = (
|
|
108
|
+
const { state, saveCreds } = yield useMongoAuthState(sessionId, authCollection);
|
|
109
|
+
const sock = makeWASocket({
|
|
124
110
|
version,
|
|
125
111
|
auth: state,
|
|
126
112
|
logger: P,
|
|
127
113
|
markOnlineOnConnect: false,
|
|
128
|
-
browser:
|
|
114
|
+
browser: getBrowserConfig(options.browserType, options.browserName),
|
|
129
115
|
// Configure caching group metadata using our hybrid implementation with session ID
|
|
130
116
|
cachedGroupMetadata: (jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
131
|
-
return yield
|
|
117
|
+
return yield groupCache.get(sessionId, jid);
|
|
132
118
|
})
|
|
133
119
|
});
|
|
134
120
|
sessions.set(sessionId, Object.assign({}, sock));
|
|
@@ -141,7 +127,7 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
141
127
|
if (update.qr) {
|
|
142
128
|
// Print QR to console if requested
|
|
143
129
|
if (options.printQR) {
|
|
144
|
-
|
|
130
|
+
QRCode.toString(update.qr, {
|
|
145
131
|
type: 'terminal',
|
|
146
132
|
small: true,
|
|
147
133
|
margin: 1
|
|
@@ -152,21 +138,21 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
152
138
|
});
|
|
153
139
|
}
|
|
154
140
|
// Send QR data raw to callback for frontend processing
|
|
155
|
-
(_a = callback.get(
|
|
141
|
+
(_a = callback.get(CALLBACK_KEY.ON_QR)) === null || _a === void 0 ? void 0 : _a({
|
|
156
142
|
sessionId,
|
|
157
143
|
qr: update.qr
|
|
158
144
|
});
|
|
159
145
|
(_b = options.onQRUpdated) === null || _b === void 0 ? void 0 : _b.call(options, update.qr);
|
|
160
146
|
}
|
|
161
147
|
if (connection == "connecting") {
|
|
162
|
-
(_c = callback.get(
|
|
148
|
+
(_c = callback.get(CALLBACK_KEY.ON_CONNECTING)) === null || _c === void 0 ? void 0 : _c(sessionId);
|
|
163
149
|
(_d = options.onConnecting) === null || _d === void 0 ? void 0 : _d.call(options);
|
|
164
150
|
}
|
|
165
151
|
if (connection === "close") {
|
|
166
152
|
const code = (_f = (_e = lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error) === null || _e === void 0 ? void 0 : _e.output) === null || _f === void 0 ? void 0 : _f.statusCode;
|
|
167
153
|
let retryAttempt = (_g = retryCount.get(sessionId)) !== null && _g !== void 0 ? _g : 0;
|
|
168
154
|
let shouldRetry;
|
|
169
|
-
if (code !=
|
|
155
|
+
if (code != DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
170
156
|
shouldRetry = true;
|
|
171
157
|
}
|
|
172
158
|
if (shouldRetry) {
|
|
@@ -184,13 +170,13 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
184
170
|
// For regular sessions, completely delete
|
|
185
171
|
yield softDeleteSession(sessionId, false);
|
|
186
172
|
}
|
|
187
|
-
(_h = callback.get(
|
|
173
|
+
(_h = callback.get(CALLBACK_KEY.ON_DISCONNECTED)) === null || _h === void 0 ? void 0 : _h(sessionId);
|
|
188
174
|
(_j = options.onDisconnected) === null || _j === void 0 ? void 0 : _j.call(options);
|
|
189
175
|
}
|
|
190
176
|
}
|
|
191
177
|
if (connection == "open") {
|
|
192
178
|
retryCount.delete(sessionId);
|
|
193
|
-
(_k = callback.get(
|
|
179
|
+
(_k = callback.get(CALLBACK_KEY.ON_CONNECTED)) === null || _k === void 0 ? void 0 : _k(sessionId);
|
|
194
180
|
(_l = options.onConnected) === null || _l === void 0 ? void 0 : _l.call(options);
|
|
195
181
|
}
|
|
196
182
|
}
|
|
@@ -204,7 +190,7 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
204
190
|
try {
|
|
205
191
|
// Dapatkan metadata grup terbaru dan simpan ke cache dengan sessionId
|
|
206
192
|
const metadata = yield sock.groupMetadata(update.id);
|
|
207
|
-
yield
|
|
193
|
+
yield groupCache.set(sessionId, update.id, metadata);
|
|
208
194
|
}
|
|
209
195
|
catch (error) {
|
|
210
196
|
console.error(`Error updating group metadata in cache: ${error}`);
|
|
@@ -217,7 +203,7 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
217
203
|
try {
|
|
218
204
|
// Dapatkan metadata grup terbaru dan simpan ke cache dengan sessionId
|
|
219
205
|
const metadata = yield sock.groupMetadata(update.id);
|
|
220
|
-
yield
|
|
206
|
+
yield groupCache.set(sessionId, update.id, metadata);
|
|
221
207
|
}
|
|
222
208
|
catch (error) {
|
|
223
209
|
console.error(`Error updating group participants in cache: ${error}`);
|
|
@@ -225,8 +211,8 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
225
211
|
}
|
|
226
212
|
if (events["messages.update"]) {
|
|
227
213
|
const msg = events["messages.update"][0];
|
|
228
|
-
const data = Object.assign({ sessionId: sessionId, messageStatus:
|
|
229
|
-
(_m = callback.get(
|
|
214
|
+
const data = Object.assign({ sessionId: sessionId, messageStatus: parseMessageStatusCodeToReadable(msg.update.status) }, msg);
|
|
215
|
+
(_m = callback.get(CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _m === void 0 ? void 0 : _m(sessionId, data);
|
|
230
216
|
(_o = options.onMessageUpdated) === null || _o === void 0 ? void 0 : _o.call(options, data);
|
|
231
217
|
}
|
|
232
218
|
if (events["messages.upsert"]) {
|
|
@@ -242,11 +228,11 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
242
228
|
}
|
|
243
229
|
const msg = rawMsg;
|
|
244
230
|
msg.sessionId = sessionId;
|
|
245
|
-
msg.saveImage = (path) =>
|
|
246
|
-
msg.saveVideo = (path) =>
|
|
247
|
-
msg.saveDocument = (path) =>
|
|
248
|
-
msg.saveAudio = (path) =>
|
|
249
|
-
(_q = callback.get(
|
|
231
|
+
msg.saveImage = (path) => saveImageHandler(msg, path);
|
|
232
|
+
msg.saveVideo = (path) => saveVideoHandler(msg, path);
|
|
233
|
+
msg.saveDocument = (path) => saveDocumentHandler(msg, path);
|
|
234
|
+
msg.saveAudio = (path) => saveAudioHandler(msg, path);
|
|
235
|
+
(_q = callback.get(CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _q === void 0 ? void 0 : _q(Object.assign({}, msg));
|
|
250
236
|
(_r = options.onMessageReceived) === null || _r === void 0 ? void 0 : _r.call(options, msg);
|
|
251
237
|
}
|
|
252
238
|
}
|
|
@@ -260,7 +246,6 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
260
246
|
});
|
|
261
247
|
return startSocket();
|
|
262
248
|
});
|
|
263
|
-
exports.startSession = startSession;
|
|
264
249
|
/**
|
|
265
250
|
* Start WhatsApp session using pairing code method
|
|
266
251
|
* This is the recommended way to create sessions with pairing code
|
|
@@ -270,22 +255,22 @@ exports.startSession = startSession;
|
|
|
270
255
|
* @param options Optional configuration for the session
|
|
271
256
|
* @returns Promise<WASocket> The WhatsApp socket instance
|
|
272
257
|
*/
|
|
273
|
-
const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => __awaiter(void 0, [sessionId_1, phoneNumber_1, ...args_1], void 0, function* (sessionId, phoneNumber, options = {}) {
|
|
258
|
+
export const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => __awaiter(void 0, [sessionId_1, phoneNumber_1, ...args_1], void 0, function* (sessionId, phoneNumber, options = {}) {
|
|
274
259
|
if (isSessionExistAndRunning(sessionId))
|
|
275
|
-
throw new
|
|
260
|
+
throw new WhatsappError(Messages.sessionAlreadyExist(sessionId));
|
|
276
261
|
// Simpan informasi session pairing code untuk auto-reconnect
|
|
277
262
|
pairingCodeSessions.set(sessionId, { phoneNumber, options });
|
|
278
263
|
yield initMongo();
|
|
279
|
-
const { version } = yield
|
|
264
|
+
const { version } = yield fetchLatestBaileysVersion();
|
|
280
265
|
const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
281
266
|
var _a, _b;
|
|
282
|
-
const { state, saveCreds } = yield
|
|
283
|
-
const sock = (
|
|
267
|
+
const { state, saveCreds } = yield useMongoAuthState(sessionId, authCollection);
|
|
268
|
+
const sock = makeWASocket({
|
|
284
269
|
version,
|
|
285
270
|
auth: state,
|
|
286
271
|
logger: P,
|
|
287
272
|
markOnlineOnConnect: false,
|
|
288
|
-
browser:
|
|
273
|
+
browser: getBrowserConfig(options.browserType, options.browserName),
|
|
289
274
|
// Opsi tambahan untuk meningkatkan kompatibilitas
|
|
290
275
|
linkPreviewImageThumbnailWidth: 300,
|
|
291
276
|
generateHighQualityLinkPreview: true,
|
|
@@ -294,7 +279,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
294
279
|
printQRInTerminal: false, // QR tidak dicetak untuk pairing code
|
|
295
280
|
// Configure caching group metadata using our hybrid implementation with session ID
|
|
296
281
|
cachedGroupMetadata: (jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
297
|
-
return yield
|
|
282
|
+
return yield groupCache.get(sessionId, jid);
|
|
298
283
|
})
|
|
299
284
|
});
|
|
300
285
|
sessions.set(sessionId, Object.assign({}, sock));
|
|
@@ -312,7 +297,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
312
297
|
if (code && typeof code === 'string') {
|
|
313
298
|
console.log(`Pairing code untuk session ${sessionId}: ${code}`);
|
|
314
299
|
// Panggil callback yang terdaftar
|
|
315
|
-
(_a = callback.get(
|
|
300
|
+
(_a = callback.get(CALLBACK_KEY.ON_PAIRING_CODE)) === null || _a === void 0 ? void 0 : _a(sessionId, code);
|
|
316
301
|
(_b = options.onPairingCode) === null || _b === void 0 ? void 0 : _b.call(options, code);
|
|
317
302
|
}
|
|
318
303
|
else {
|
|
@@ -321,7 +306,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
321
306
|
}
|
|
322
307
|
catch (error) {
|
|
323
308
|
console.error("Error saat meminta kode pairing:", error);
|
|
324
|
-
throw new
|
|
309
|
+
throw new WhatsappError(`Gagal mendapatkan kode pairing: ${error.message || String(error)}`);
|
|
325
310
|
}
|
|
326
311
|
}
|
|
327
312
|
sock.ev.process((events) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -331,20 +316,20 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
331
316
|
const { connection, lastDisconnect } = update;
|
|
332
317
|
if (update.qr) {
|
|
333
318
|
// Send QR data raw to callback for frontend processing
|
|
334
|
-
(_a = callback.get(
|
|
319
|
+
(_a = callback.get(CALLBACK_KEY.ON_QR)) === null || _a === void 0 ? void 0 : _a({
|
|
335
320
|
sessionId,
|
|
336
321
|
qr: update.qr
|
|
337
322
|
});
|
|
338
323
|
}
|
|
339
324
|
if (connection == "connecting") {
|
|
340
|
-
(_b = callback.get(
|
|
325
|
+
(_b = callback.get(CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
|
|
341
326
|
(_c = options.onConnecting) === null || _c === void 0 ? void 0 : _c.call(options);
|
|
342
327
|
}
|
|
343
328
|
if (connection === "close") {
|
|
344
329
|
const code = (_e = (_d = lastDisconnect === null || lastDisconnect === void 0 ? void 0 : lastDisconnect.error) === null || _d === void 0 ? void 0 : _d.output) === null || _e === void 0 ? void 0 : _e.statusCode;
|
|
345
330
|
let retryAttempt = (_f = retryCount.get(sessionId)) !== null && _f !== void 0 ? _f : 0;
|
|
346
331
|
let shouldRetry;
|
|
347
|
-
if (code !=
|
|
332
|
+
if (code != DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
348
333
|
shouldRetry = true;
|
|
349
334
|
}
|
|
350
335
|
if (shouldRetry) {
|
|
@@ -353,7 +338,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
353
338
|
// Untuk session pairing code, coba reconnect dengan metode yang tepat
|
|
354
339
|
try {
|
|
355
340
|
// Tunggu sebentar sebelum reconnect
|
|
356
|
-
yield
|
|
341
|
+
yield createDelay(2000);
|
|
357
342
|
startSocket();
|
|
358
343
|
}
|
|
359
344
|
catch (reconnectError) {
|
|
@@ -387,13 +372,13 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
387
372
|
pairingCodeSessions.delete(sessionId); // Only delete from tracking if it's not a pairing code session
|
|
388
373
|
yield softDeleteSession(sessionId, false);
|
|
389
374
|
}
|
|
390
|
-
(_g = callback.get(
|
|
375
|
+
(_g = callback.get(CALLBACK_KEY.ON_DISCONNECTED)) === null || _g === void 0 ? void 0 : _g(sessionId);
|
|
391
376
|
(_h = options.onDisconnected) === null || _h === void 0 ? void 0 : _h.call(options);
|
|
392
377
|
}
|
|
393
378
|
}
|
|
394
379
|
if (connection == "open") {
|
|
395
380
|
retryCount.delete(sessionId);
|
|
396
|
-
(_j = callback.get(
|
|
381
|
+
(_j = callback.get(CALLBACK_KEY.ON_CONNECTED)) === null || _j === void 0 ? void 0 : _j(sessionId);
|
|
397
382
|
(_k = options.onConnected) === null || _k === void 0 ? void 0 : _k.call(options);
|
|
398
383
|
}
|
|
399
384
|
}
|
|
@@ -407,7 +392,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
407
392
|
try {
|
|
408
393
|
// Dapatkan metadata grup terbaru dan simpan ke cache dengan sessionId
|
|
409
394
|
const metadata = yield sock.groupMetadata(update.id);
|
|
410
|
-
yield
|
|
395
|
+
yield groupCache.set(sessionId, update.id, metadata);
|
|
411
396
|
}
|
|
412
397
|
catch (error) {
|
|
413
398
|
console.error(`Error updating group metadata in cache: ${error}`);
|
|
@@ -420,7 +405,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
420
405
|
try {
|
|
421
406
|
// Dapatkan metadata grup terbaru dan simpan ke cache dengan sessionId
|
|
422
407
|
const metadata = yield sock.groupMetadata(update.id);
|
|
423
|
-
yield
|
|
408
|
+
yield groupCache.set(sessionId, update.id, metadata);
|
|
424
409
|
}
|
|
425
410
|
catch (error) {
|
|
426
411
|
console.error(`Error updating group participants in cache: ${error}`);
|
|
@@ -428,8 +413,8 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
428
413
|
}
|
|
429
414
|
if (events["messages.update"]) {
|
|
430
415
|
const msg = events["messages.update"][0];
|
|
431
|
-
const data = Object.assign({ sessionId: sessionId, messageStatus:
|
|
432
|
-
(_l = callback.get(
|
|
416
|
+
const data = Object.assign({ sessionId: sessionId, messageStatus: parseMessageStatusCodeToReadable(msg.update.status) }, msg);
|
|
417
|
+
(_l = callback.get(CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _l === void 0 ? void 0 : _l(sessionId, data);
|
|
433
418
|
(_m = options.onMessageUpdated) === null || _m === void 0 ? void 0 : _m.call(options, data);
|
|
434
419
|
}
|
|
435
420
|
if (events["messages.upsert"]) {
|
|
@@ -445,11 +430,11 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
445
430
|
}
|
|
446
431
|
const msg = rawMsg;
|
|
447
432
|
msg.sessionId = sessionId;
|
|
448
|
-
msg.saveImage = (path) =>
|
|
449
|
-
msg.saveVideo = (path) =>
|
|
450
|
-
msg.saveDocument = (path) =>
|
|
451
|
-
msg.saveAudio = (path) =>
|
|
452
|
-
(_p = callback.get(
|
|
433
|
+
msg.saveImage = (path) => saveImageHandler(msg, path);
|
|
434
|
+
msg.saveVideo = (path) => saveVideoHandler(msg, path);
|
|
435
|
+
msg.saveDocument = (path) => saveDocumentHandler(msg, path);
|
|
436
|
+
msg.saveAudio = (path) => saveAudioHandler(msg, path);
|
|
437
|
+
(_p = callback.get(CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _p === void 0 ? void 0 : _p(Object.assign({}, msg));
|
|
453
438
|
(_q = options.onMessageReceived) === null || _q === void 0 ? void 0 : _q.call(options, msg);
|
|
454
439
|
}
|
|
455
440
|
}
|
|
@@ -463,17 +448,16 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
463
448
|
});
|
|
464
449
|
return startSocket();
|
|
465
450
|
});
|
|
466
|
-
exports.startSessionWithPairingCode = startSessionWithPairingCode;
|
|
467
451
|
/**
|
|
468
452
|
* @deprecated Use startSession method instead
|
|
469
453
|
*/
|
|
470
|
-
|
|
454
|
+
export const startWhatsapp = startSession;
|
|
471
455
|
/**
|
|
472
456
|
* Soft delete session - removes from memory but preserves MongoDB data for pairing code sessions
|
|
473
457
|
* @param sessionId Session ID to soft delete
|
|
474
458
|
*/
|
|
475
459
|
const softDeleteSession = (sessionId_1, ...args_1) => __awaiter(void 0, [sessionId_1, ...args_1], void 0, function* (sessionId, preserveData = false) {
|
|
476
|
-
const session =
|
|
460
|
+
const session = getSession(sessionId);
|
|
477
461
|
try {
|
|
478
462
|
yield (session === null || session === void 0 ? void 0 : session.logout());
|
|
479
463
|
}
|
|
@@ -496,19 +480,19 @@ const softDeleteSession = (sessionId_1, ...args_1) => __awaiter(void 0, [session
|
|
|
496
480
|
}
|
|
497
481
|
// Hapus cache grup untuk session ini
|
|
498
482
|
try {
|
|
499
|
-
yield
|
|
483
|
+
yield groupCache.clearSessionCache(sessionId);
|
|
500
484
|
}
|
|
501
485
|
catch (error) {
|
|
502
486
|
console.error(`Error clearing group cache for session ${sessionId}:`, error);
|
|
503
487
|
}
|
|
504
488
|
// Legacy: hapus juga dari file system jika ada
|
|
505
|
-
const dir =
|
|
506
|
-
if (
|
|
507
|
-
|
|
489
|
+
const dir = path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX);
|
|
490
|
+
if (fs.existsSync(dir)) {
|
|
491
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
508
492
|
}
|
|
509
493
|
});
|
|
510
|
-
const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
511
|
-
const session =
|
|
494
|
+
export const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
495
|
+
const session = getSession(sessionId);
|
|
512
496
|
try {
|
|
513
497
|
yield (session === null || session === void 0 ? void 0 : session.logout());
|
|
514
498
|
}
|
|
@@ -528,23 +512,22 @@ const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function*
|
|
|
528
512
|
}
|
|
529
513
|
// Hapus cache grup untuk session ini
|
|
530
514
|
try {
|
|
531
|
-
yield
|
|
515
|
+
yield groupCache.clearSessionCache(sessionId);
|
|
532
516
|
}
|
|
533
517
|
catch (error) {
|
|
534
518
|
console.error(`Error clearing group cache for session ${sessionId}:`, error);
|
|
535
519
|
}
|
|
536
520
|
// Legacy: hapus juga dari file system jika ada
|
|
537
|
-
const dir =
|
|
538
|
-
if (
|
|
539
|
-
|
|
521
|
+
const dir = path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX);
|
|
522
|
+
if (fs.existsSync(dir)) {
|
|
523
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
540
524
|
}
|
|
541
525
|
});
|
|
542
|
-
exports.deleteSession = deleteSession;
|
|
543
526
|
/**
|
|
544
527
|
* Get all active session IDs
|
|
545
528
|
* @returns Array of session IDs
|
|
546
529
|
*/
|
|
547
|
-
const getAllSession = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
530
|
+
export const getAllSession = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
548
531
|
// Return active sessions from Map (sessions yang sudah running di memori)
|
|
549
532
|
const runningSessionIds = Array.from(sessions.keys());
|
|
550
533
|
// Jika authCollection belum diinisialisasi, kembalikan hanya sessions dari memori
|
|
@@ -565,15 +548,12 @@ const getAllSession = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
565
548
|
return runningSessionIds;
|
|
566
549
|
}
|
|
567
550
|
});
|
|
568
|
-
exports.getAllSession = getAllSession;
|
|
569
551
|
// Untuk backward compatibility
|
|
570
|
-
const getAllSessionSync = () => Array.from(sessions.keys());
|
|
571
|
-
|
|
572
|
-
const getSession = (key) => sessions.get(key);
|
|
573
|
-
exports.getSession = getSession;
|
|
552
|
+
export const getAllSessionSync = () => Array.from(sessions.keys());
|
|
553
|
+
export const getSession = (key) => sessions.get(key);
|
|
574
554
|
const isSessionExistAndRunning = (sessionId) => {
|
|
575
555
|
// Cek jika session sudah berjalan di memory
|
|
576
|
-
if (
|
|
556
|
+
if (getSession(sessionId)) {
|
|
577
557
|
return true;
|
|
578
558
|
}
|
|
579
559
|
return false;
|
|
@@ -585,7 +565,7 @@ const isSessionExistAndRunning = (sessionId) => {
|
|
|
585
565
|
*/
|
|
586
566
|
const shouldLoadSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
587
567
|
// Jika session sudah berjalan di memory, tidak perlu load lagi
|
|
588
|
-
if (
|
|
568
|
+
if (getSession(sessionId)) {
|
|
589
569
|
return false;
|
|
590
570
|
}
|
|
591
571
|
// Jika authCollection belum diinisialisasi, tidak bisa load
|
|
@@ -605,54 +585,46 @@ const shouldLoadSession = (sessionId) => __awaiter(void 0, void 0, void 0, funct
|
|
|
605
585
|
/**
|
|
606
586
|
* @deprecated Use loadSessionsFromMongo instead
|
|
607
587
|
*/
|
|
608
|
-
const loadSessionsFromStorage = () => {
|
|
588
|
+
export const loadSessionsFromStorage = () => {
|
|
609
589
|
console.warn("loadSessionsFromStorage is deprecated, use loadSessionsFromMongo instead");
|
|
610
590
|
// Redirect ke fungsi loadSessionsFromMongo untuk backward compatibility
|
|
611
|
-
|
|
591
|
+
loadSessionsFromMongo().catch(err => {
|
|
612
592
|
console.error("Error loading sessions from MongoDB:", err);
|
|
613
593
|
});
|
|
614
594
|
};
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
595
|
+
export const onMessageReceived = (listener) => {
|
|
596
|
+
callback.set(CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
618
597
|
};
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_QR, listener);
|
|
598
|
+
export const onQRUpdated = (listener) => {
|
|
599
|
+
callback.set(CALLBACK_KEY.ON_QR, listener);
|
|
622
600
|
};
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTED, listener);
|
|
601
|
+
export const onConnected = (listener) => {
|
|
602
|
+
callback.set(CALLBACK_KEY.ON_CONNECTED, listener);
|
|
626
603
|
};
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED, listener);
|
|
604
|
+
export const onDisconnected = (listener) => {
|
|
605
|
+
callback.set(CALLBACK_KEY.ON_DISCONNECTED, listener);
|
|
630
606
|
};
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTING, listener);
|
|
607
|
+
export const onConnecting = (listener) => {
|
|
608
|
+
callback.set(CALLBACK_KEY.ON_CONNECTING, listener);
|
|
634
609
|
};
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
|
|
610
|
+
export const onMessageUpdate = (listener) => {
|
|
611
|
+
callback.set(CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
|
|
638
612
|
};
|
|
639
|
-
|
|
640
|
-
const onPairingCode = (listener) => {
|
|
613
|
+
export const onPairingCode = (listener) => {
|
|
641
614
|
// Set callback ke registry dengan key yang benar
|
|
642
|
-
callback.set(
|
|
615
|
+
callback.set(CALLBACK_KEY.ON_PAIRING_CODE, listener);
|
|
643
616
|
};
|
|
644
|
-
exports.onPairingCode = onPairingCode;
|
|
645
617
|
/**
|
|
646
618
|
* Load all sessions from MongoDB and start them automatically
|
|
647
619
|
*/
|
|
648
|
-
const loadSessionsFromMongo = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
620
|
+
export const loadSessionsFromMongo = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
649
621
|
yield initMongo();
|
|
650
622
|
const sessionDocs = yield authCollection.find({}).toArray();
|
|
651
623
|
for (const doc of sessionDocs) {
|
|
652
624
|
const sessionId = doc.sessionId;
|
|
653
|
-
if (sessionId && !
|
|
625
|
+
if (sessionId && !getSession(sessionId)) {
|
|
654
626
|
try {
|
|
655
|
-
yield
|
|
627
|
+
yield startSession(sessionId, { printQR: false });
|
|
656
628
|
}
|
|
657
629
|
catch (e) {
|
|
658
630
|
// Optional: log error jika gagal load session tertentu
|
|
@@ -661,36 +633,33 @@ const loadSessionsFromMongo = () => __awaiter(void 0, void 0, void 0, function*
|
|
|
661
633
|
}
|
|
662
634
|
}
|
|
663
635
|
});
|
|
664
|
-
exports.loadSessionsFromMongo = loadSessionsFromMongo;
|
|
665
636
|
/**
|
|
666
637
|
* Configure MongoDB database and collection names
|
|
667
638
|
*
|
|
668
639
|
* @param dbName MongoDB database name (default: "wa_session")
|
|
669
640
|
* @param collectionName MongoDB collection name for auth storage (default: "auth")
|
|
670
641
|
*/
|
|
671
|
-
const setMongoDBNames = (dbName = "wa_session", collectionName = "auth") => {
|
|
672
|
-
|
|
673
|
-
|
|
642
|
+
export const setMongoDBNames = (dbName = "wa_session", collectionName = "auth") => {
|
|
643
|
+
CREDENTIALS.MONGO_DB_NAME = dbName;
|
|
644
|
+
CREDENTIALS.MONGO_COLLECTION_NAME = collectionName;
|
|
674
645
|
};
|
|
675
|
-
exports.setMongoDBNames = setMongoDBNames;
|
|
676
646
|
/**
|
|
677
647
|
* Sets the directory name for storing credentials (File-based storage)
|
|
678
648
|
*
|
|
679
649
|
* @deprecated When using MongoDB, this setting has no effect. Only used for legacy file-based storage.
|
|
680
650
|
* @param dirname Directory name for storing credentials (default: "wa_credentials")
|
|
681
651
|
*/
|
|
682
|
-
const setCredentialsDir = (dirname = "wa_credentials") => {
|
|
652
|
+
export const setCredentialsDir = (dirname = "wa_credentials") => {
|
|
683
653
|
console.warn("setCredentialsDir() is deprecated when using MongoDB storage. This setting only affects legacy file-based storage.");
|
|
684
|
-
|
|
654
|
+
CREDENTIALS.DIR_NAME = dirname;
|
|
685
655
|
};
|
|
686
|
-
exports.setCredentialsDir = setCredentialsDir;
|
|
687
656
|
/**
|
|
688
657
|
* Attempt to reconnect a disconnected session
|
|
689
658
|
*
|
|
690
659
|
* @param sessionId Session ID to reconnect
|
|
691
660
|
* @returns Promise<boolean> indicating success
|
|
692
661
|
*/
|
|
693
|
-
const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
662
|
+
export const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
694
663
|
try {
|
|
695
664
|
// Cek jika session masih ada di memory
|
|
696
665
|
const existingSession = sessions.get(sessionId);
|
|
@@ -713,7 +682,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
713
682
|
sessions.delete(sessionId);
|
|
714
683
|
}
|
|
715
684
|
// Tunggu sedikit waktu untuk memastikan cleanup selesai
|
|
716
|
-
yield
|
|
685
|
+
yield createDelay(1000);
|
|
717
686
|
// Cek jika ini session pairing code dari tracking terlebih dahulu
|
|
718
687
|
const pairingInfo = pairingCodeSessions.get(sessionId);
|
|
719
688
|
if (pairingInfo) {
|
|
@@ -721,7 +690,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
721
690
|
try {
|
|
722
691
|
// Reset retry count untuk session ini
|
|
723
692
|
retryCount.delete(sessionId);
|
|
724
|
-
yield
|
|
693
|
+
yield startSessionWithPairingCode(sessionId, pairingInfo.phoneNumber, Object.assign(Object.assign({}, pairingInfo.options), { printQR: false,
|
|
725
694
|
// Tambahkan callback khusus untuk reconnect
|
|
726
695
|
onConnected: () => {
|
|
727
696
|
// Pairing code session reconnected successfully
|
|
@@ -729,7 +698,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
729
698
|
// Pairing code session disconnected after reconnect
|
|
730
699
|
} }));
|
|
731
700
|
// Periksa jika session berhasil dimulai
|
|
732
|
-
return !!
|
|
701
|
+
return !!getSession(sessionId);
|
|
733
702
|
}
|
|
734
703
|
catch (startError) {
|
|
735
704
|
console.error(`Failed to reconnect pairing code session ${sessionId}:`, startError.message);
|
|
@@ -743,7 +712,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
743
712
|
if (sessionExists) {
|
|
744
713
|
// Session biasa, gunakan metode startSession normal
|
|
745
714
|
try {
|
|
746
|
-
yield
|
|
715
|
+
yield startSession(sessionId, {
|
|
747
716
|
printQR: false,
|
|
748
717
|
// Tambahkan callback khusus untuk reconnect
|
|
749
718
|
onConnected: () => {
|
|
@@ -757,7 +726,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
757
726
|
}
|
|
758
727
|
});
|
|
759
728
|
// Periksa jika session berhasil dimulai
|
|
760
|
-
return !!
|
|
729
|
+
return !!getSession(sessionId);
|
|
761
730
|
}
|
|
762
731
|
catch (startError) {
|
|
763
732
|
console.error(`Failed to reconnect session ${sessionId}:`, startError.message);
|
|
@@ -775,19 +744,18 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
775
744
|
return false;
|
|
776
745
|
}
|
|
777
746
|
});
|
|
778
|
-
exports.reconnect = reconnect;
|
|
779
747
|
/**
|
|
780
748
|
* Reconnect all pairing code sessions that are tracked
|
|
781
749
|
* Useful for bulk reconnection after system restart
|
|
782
750
|
*/
|
|
783
|
-
const reconnectAllPairingCodeSessions = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
751
|
+
export const reconnectAllPairingCodeSessions = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
784
752
|
const results = {};
|
|
785
753
|
for (const [sessionId, sessionInfo] of pairingCodeSessions.entries()) {
|
|
786
754
|
try {
|
|
787
|
-
const success = yield
|
|
755
|
+
const success = yield reconnect(sessionId);
|
|
788
756
|
results[sessionId] = success;
|
|
789
757
|
// Add delay between reconnection attempts
|
|
790
|
-
yield
|
|
758
|
+
yield createDelay(2000);
|
|
791
759
|
}
|
|
792
760
|
catch (error) {
|
|
793
761
|
console.error(`Error reconnecting pairing code session ${sessionId}:`, error.message);
|
|
@@ -796,22 +764,20 @@ const reconnectAllPairingCodeSessions = () => __awaiter(void 0, void 0, void 0,
|
|
|
796
764
|
}
|
|
797
765
|
return results;
|
|
798
766
|
});
|
|
799
|
-
exports.reconnectAllPairingCodeSessions = reconnectAllPairingCodeSessions;
|
|
800
767
|
/**
|
|
801
768
|
* Get all tracked pairing code sessions
|
|
802
769
|
* @returns Array of session IDs that were created with pairing code
|
|
803
770
|
*/
|
|
804
|
-
const getPairingCodeSessions = () => {
|
|
771
|
+
export const getPairingCodeSessions = () => {
|
|
805
772
|
return Array.from(pairingCodeSessions.keys());
|
|
806
773
|
};
|
|
807
|
-
exports.getPairingCodeSessions = getPairingCodeSessions;
|
|
808
774
|
/**
|
|
809
775
|
* Get session status information
|
|
810
776
|
* @param sessionId Session ID to check
|
|
811
777
|
* @returns Object with session status information
|
|
812
778
|
*/
|
|
813
|
-
const getSessionStatus = (sessionId) => {
|
|
814
|
-
const isRunning = !!
|
|
779
|
+
export const getSessionStatus = (sessionId) => {
|
|
780
|
+
const isRunning = !!getSession(sessionId);
|
|
815
781
|
const isPairingCodeSession = pairingCodeSessions.has(sessionId);
|
|
816
782
|
const retryAttempts = retryCount.get(sessionId) || 0;
|
|
817
783
|
return {
|
|
@@ -822,53 +788,349 @@ const getSessionStatus = (sessionId) => {
|
|
|
822
788
|
hasCredentials: isRunning ? true : null // null means unknown when not running
|
|
823
789
|
};
|
|
824
790
|
};
|
|
825
|
-
exports.getSessionStatus = getSessionStatus;
|
|
826
791
|
// Fungsi baru untuk mendapatkan konfigurasi TTL cache grup
|
|
827
|
-
const setGroupCacheConfig = (options) => {
|
|
828
|
-
|
|
792
|
+
export const setGroupCacheConfig = (options) => {
|
|
793
|
+
groupCache.setConfig(options);
|
|
829
794
|
};
|
|
830
|
-
exports.setGroupCacheConfig = setGroupCacheConfig;
|
|
831
795
|
// Fungsi baru untuk mendapatkan atau memuat data grup dengan multi-session support
|
|
832
|
-
const getGroupMetadata = (sessionId_1, jid_1, ...args_1) => __awaiter(void 0, [sessionId_1, jid_1, ...args_1], void 0, function* (sessionId, jid, forceFetch = false) {
|
|
796
|
+
export const getGroupMetadata = (sessionId_1, jid_1, ...args_1) => __awaiter(void 0, [sessionId_1, jid_1, ...args_1], void 0, function* (sessionId, jid, forceFetch = false) {
|
|
833
797
|
// Get the session socket
|
|
834
|
-
const sock =
|
|
798
|
+
const sock = getSession(sessionId);
|
|
835
799
|
if (!sock) {
|
|
836
|
-
throw new
|
|
800
|
+
throw new WhatsappError(Messages.sessionNotFound(sessionId));
|
|
837
801
|
}
|
|
838
802
|
try {
|
|
839
803
|
// Jika forceFetch true, langsung ambil dari server dan update cache
|
|
840
804
|
if (forceFetch) {
|
|
841
805
|
const metadata = yield sock.groupMetadata(jid);
|
|
842
|
-
yield
|
|
806
|
+
yield groupCache.set(sessionId, jid, metadata);
|
|
843
807
|
return metadata;
|
|
844
808
|
}
|
|
845
809
|
// Coba ambil dari cache dulu
|
|
846
|
-
const cachedData = yield
|
|
810
|
+
const cachedData = yield groupCache.get(sessionId, jid);
|
|
847
811
|
if (cachedData) {
|
|
848
812
|
return cachedData;
|
|
849
813
|
}
|
|
850
814
|
// Jika tidak ada di cache, ambil dari server dan simpan ke cache
|
|
851
815
|
const metadata = yield sock.groupMetadata(jid);
|
|
852
|
-
yield
|
|
816
|
+
yield groupCache.set(sessionId, jid, metadata);
|
|
853
817
|
return metadata;
|
|
854
818
|
}
|
|
855
819
|
catch (error) {
|
|
856
|
-
throw new
|
|
820
|
+
throw new WhatsappError(`Failed to fetch group metadata: ${error.message || String(error)}`);
|
|
857
821
|
}
|
|
858
822
|
});
|
|
859
|
-
exports.getGroupMetadata = getGroupMetadata;
|
|
860
823
|
// Fungsi baru untuk menghapus cache grup tertentu
|
|
861
|
-
const clearGroupMetadataCache = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
862
|
-
yield
|
|
824
|
+
export const clearGroupMetadataCache = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
825
|
+
yield groupCache.delete(sessionId, jid);
|
|
863
826
|
});
|
|
864
|
-
exports.clearGroupMetadataCache = clearGroupMetadataCache;
|
|
865
827
|
// Fungsi untuk membersihkan seluruh cache grup untuk session tertentu
|
|
866
|
-
const clearSessionGroupMetadataCache = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
867
|
-
yield
|
|
828
|
+
export const clearSessionGroupMetadataCache = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
829
|
+
yield groupCache.clearSessionCache(sessionId);
|
|
868
830
|
});
|
|
869
|
-
exports.clearSessionGroupMetadataCache = clearSessionGroupMetadataCache;
|
|
870
831
|
// Fungsi untuk membersihkan seluruh cache grup untuk semua session
|
|
871
|
-
const clearAllGroupMetadataCache = () => {
|
|
872
|
-
|
|
832
|
+
export const clearAllGroupMetadataCache = () => {
|
|
833
|
+
groupCache.flush();
|
|
834
|
+
};
|
|
835
|
+
/**
|
|
836
|
+
* Convert LID (Linked ID) to Phone Number (PN/JID)
|
|
837
|
+
*
|
|
838
|
+
* This function uses Baileys' internal signalRepository.lidMapping to retrieve
|
|
839
|
+
* the phone number associated with a given LID.
|
|
840
|
+
*
|
|
841
|
+
* @param sessionId - Session ID to use for conversion
|
|
842
|
+
* @param lid - The LID to convert (e.g., "1524746986546@lid")
|
|
843
|
+
* @returns Promise<LIDConversionResult> - Result object with the phone number or null if not found
|
|
844
|
+
*
|
|
845
|
+
* @example
|
|
846
|
+
* ```typescript
|
|
847
|
+
* const result = await whatsapp.getPNForLID("mysession", "1524746986546@lid");
|
|
848
|
+
* if (result.success && result.pn) {
|
|
849
|
+
* console.log(`Phone number: ${result.pn}`);
|
|
850
|
+
* } else {
|
|
851
|
+
* console.log("Phone number not found for this LID");
|
|
852
|
+
* }
|
|
853
|
+
* ```
|
|
854
|
+
*
|
|
855
|
+
* @note This function may return null for new contacts or when WhatsApp
|
|
856
|
+
* hasn't provided the LID-PN mapping yet. Not all LIDs have known phone numbers.
|
|
857
|
+
*/
|
|
858
|
+
export const getPNForLID = (sessionId, lid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
859
|
+
var _a, _b;
|
|
860
|
+
const session = getSession(sessionId);
|
|
861
|
+
if (!session) {
|
|
862
|
+
return {
|
|
863
|
+
success: false,
|
|
864
|
+
lid,
|
|
865
|
+
pn: null,
|
|
866
|
+
error: Messages.sessionNotFound(sessionId)
|
|
867
|
+
};
|
|
868
|
+
}
|
|
869
|
+
try {
|
|
870
|
+
// Normalize LID format
|
|
871
|
+
let normalizedLid = lid;
|
|
872
|
+
if (!lid.includes('@lid')) {
|
|
873
|
+
normalizedLid = `${lid}@lid`;
|
|
874
|
+
}
|
|
875
|
+
// Access the signalRepository.lidMapping to get PN for LID
|
|
876
|
+
const signalRepo = session.signalRepository;
|
|
877
|
+
if (!signalRepo || !signalRepo.lidMapping) {
|
|
878
|
+
return {
|
|
879
|
+
success: false,
|
|
880
|
+
lid: normalizedLid,
|
|
881
|
+
pn: null,
|
|
882
|
+
error: "LID mapping not available in this session"
|
|
883
|
+
};
|
|
884
|
+
}
|
|
885
|
+
// Try to get the phone number for the LID
|
|
886
|
+
const pn = ((_b = (_a = signalRepo.lidMapping).getPNForLID) === null || _b === void 0 ? void 0 : _b.call(_a, normalizedLid)) || null;
|
|
887
|
+
return {
|
|
888
|
+
success: pn !== null,
|
|
889
|
+
lid: normalizedLid,
|
|
890
|
+
pn
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
catch (error) {
|
|
894
|
+
return {
|
|
895
|
+
success: false,
|
|
896
|
+
lid,
|
|
897
|
+
pn: null,
|
|
898
|
+
error: `Failed to convert LID to PN: ${error.message || String(error)}`
|
|
899
|
+
};
|
|
900
|
+
}
|
|
901
|
+
});
|
|
902
|
+
/**
|
|
903
|
+
* Convert Phone Number (PN/JID) to LID (Linked ID)
|
|
904
|
+
*
|
|
905
|
+
* This function uses Baileys' internal signalRepository.lidMapping to retrieve
|
|
906
|
+
* the LID associated with a given phone number.
|
|
907
|
+
*
|
|
908
|
+
* @param sessionId - Session ID to use for conversion
|
|
909
|
+
* @param pn - The phone number/JID to convert (e.g., "6281234567890" or "6281234567890@s.whatsapp.net")
|
|
910
|
+
* @returns Promise<PNConversionResult> - Result object with the LID or null if not found
|
|
911
|
+
*
|
|
912
|
+
* @example
|
|
913
|
+
* ```typescript
|
|
914
|
+
* const result = await whatsapp.getLIDForPN("mysession", "6281234567890");
|
|
915
|
+
* if (result.success && result.lid) {
|
|
916
|
+
* console.log(`LID: ${result.lid}`);
|
|
917
|
+
* } else {
|
|
918
|
+
* console.log("LID not found for this phone number");
|
|
919
|
+
* }
|
|
920
|
+
* ```
|
|
921
|
+
*
|
|
922
|
+
* @note This function may return null for contacts that haven't been encountered
|
|
923
|
+
* with their LID mapping yet.
|
|
924
|
+
*/
|
|
925
|
+
export const getLIDForPN = (sessionId, pn) => __awaiter(void 0, void 0, void 0, function* () {
|
|
926
|
+
var _a, _b;
|
|
927
|
+
const session = getSession(sessionId);
|
|
928
|
+
if (!session) {
|
|
929
|
+
return {
|
|
930
|
+
success: false,
|
|
931
|
+
pn,
|
|
932
|
+
lid: null,
|
|
933
|
+
error: Messages.sessionNotFound(sessionId)
|
|
934
|
+
};
|
|
935
|
+
}
|
|
936
|
+
try {
|
|
937
|
+
// Normalize PN format
|
|
938
|
+
let normalizedPn = pn.replace(/\D/g, ''); // Remove non-digits
|
|
939
|
+
if (!pn.includes('@s.whatsapp.net')) {
|
|
940
|
+
normalizedPn = `${normalizedPn}@s.whatsapp.net`;
|
|
941
|
+
}
|
|
942
|
+
else {
|
|
943
|
+
normalizedPn = pn;
|
|
944
|
+
}
|
|
945
|
+
// Access the signalRepository.lidMapping to get LID for PN
|
|
946
|
+
const signalRepo = session.signalRepository;
|
|
947
|
+
if (!signalRepo || !signalRepo.lidMapping) {
|
|
948
|
+
return {
|
|
949
|
+
success: false,
|
|
950
|
+
pn: normalizedPn,
|
|
951
|
+
lid: null,
|
|
952
|
+
error: "LID mapping not available in this session"
|
|
953
|
+
};
|
|
954
|
+
}
|
|
955
|
+
// Try to get the LID for the phone number
|
|
956
|
+
const lid = ((_b = (_a = signalRepo.lidMapping).getLIDForPN) === null || _b === void 0 ? void 0 : _b.call(_a, normalizedPn)) || null;
|
|
957
|
+
return {
|
|
958
|
+
success: lid !== null,
|
|
959
|
+
pn: normalizedPn,
|
|
960
|
+
lid
|
|
961
|
+
};
|
|
962
|
+
}
|
|
963
|
+
catch (error) {
|
|
964
|
+
return {
|
|
965
|
+
success: false,
|
|
966
|
+
pn,
|
|
967
|
+
lid: null,
|
|
968
|
+
error: `Failed to convert PN to LID: ${error.message || String(error)}`
|
|
969
|
+
};
|
|
970
|
+
}
|
|
971
|
+
});
|
|
972
|
+
/**
|
|
973
|
+
* Get all known LID-PN mappings for a session
|
|
974
|
+
*
|
|
975
|
+
* This function retrieves all LID to phone number mappings that are currently
|
|
976
|
+
* stored in the session's signal repository.
|
|
977
|
+
*
|
|
978
|
+
* @param sessionId - Session ID to get mappings from
|
|
979
|
+
* @returns Promise<LIDMappingEntry[]> - Array of LID-PN mapping entries
|
|
980
|
+
*
|
|
981
|
+
* @example
|
|
982
|
+
* ```typescript
|
|
983
|
+
* const mappings = await whatsapp.getAllLIDMappings("mysession");
|
|
984
|
+
* for (const mapping of mappings) {
|
|
985
|
+
* console.log(`${mapping.lid} => ${mapping.pn}`);
|
|
986
|
+
* }
|
|
987
|
+
* ```
|
|
988
|
+
*
|
|
989
|
+
* @note This may return an empty array if no mappings are available yet.
|
|
990
|
+
*/
|
|
991
|
+
export const getAllLIDMappings = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
992
|
+
const session = getSession(sessionId);
|
|
993
|
+
if (!session) {
|
|
994
|
+
throw new WhatsappError(Messages.sessionNotFound(sessionId));
|
|
995
|
+
}
|
|
996
|
+
try {
|
|
997
|
+
const signalRepo = session.signalRepository;
|
|
998
|
+
if (!signalRepo || !signalRepo.lidMapping) {
|
|
999
|
+
return [];
|
|
1000
|
+
}
|
|
1001
|
+
// Try to get all mappings if available
|
|
1002
|
+
const getAllMappings = signalRepo.lidMapping.getAll || signalRepo.lidMapping.getAllMappings;
|
|
1003
|
+
if (typeof getAllMappings === 'function') {
|
|
1004
|
+
const mappings = getAllMappings();
|
|
1005
|
+
if (Array.isArray(mappings)) {
|
|
1006
|
+
return mappings;
|
|
1007
|
+
}
|
|
1008
|
+
// If it's a Map or Object, convert to array
|
|
1009
|
+
if (mappings instanceof Map) {
|
|
1010
|
+
return Array.from(mappings.entries()).map(([lid, pn]) => ({ lid, pn: pn }));
|
|
1011
|
+
}
|
|
1012
|
+
if (typeof mappings === 'object') {
|
|
1013
|
+
return Object.entries(mappings).map(([lid, pn]) => ({ lid, pn: pn }));
|
|
1014
|
+
}
|
|
1015
|
+
}
|
|
1016
|
+
// Alternative: Try to access internal store directly
|
|
1017
|
+
const store = signalRepo.lidMapping.store || signalRepo.lidMapping._store;
|
|
1018
|
+
if (store) {
|
|
1019
|
+
if (store instanceof Map) {
|
|
1020
|
+
return Array.from(store.entries()).map(([lid, pn]) => ({ lid, pn: pn }));
|
|
1021
|
+
}
|
|
1022
|
+
if (typeof store === 'object') {
|
|
1023
|
+
return Object.entries(store).map(([lid, pn]) => ({ lid, pn: pn }));
|
|
1024
|
+
}
|
|
1025
|
+
}
|
|
1026
|
+
return [];
|
|
1027
|
+
}
|
|
1028
|
+
catch (error) {
|
|
1029
|
+
throw new WhatsappError(`Failed to get LID mappings: ${error.message || String(error)}`);
|
|
1030
|
+
}
|
|
1031
|
+
});
|
|
1032
|
+
/**
|
|
1033
|
+
* Check if a JID is in LID format
|
|
1034
|
+
*
|
|
1035
|
+
* @param jid - The JID to check
|
|
1036
|
+
* @returns boolean - True if the JID is in LID format
|
|
1037
|
+
*
|
|
1038
|
+
* @example
|
|
1039
|
+
* ```typescript
|
|
1040
|
+
* if (whatsapp.isLIDFormat("1524746986546@lid")) {
|
|
1041
|
+
* console.log("This is an LID");
|
|
1042
|
+
* }
|
|
1043
|
+
* ```
|
|
1044
|
+
*/
|
|
1045
|
+
export const isLIDFormat = (jid) => {
|
|
1046
|
+
return jid.includes('@lid');
|
|
873
1047
|
};
|
|
874
|
-
|
|
1048
|
+
/**
|
|
1049
|
+
* Check if a JID is in Phone Number format (@s.whatsapp.net)
|
|
1050
|
+
*
|
|
1051
|
+
* @param jid - The JID to check
|
|
1052
|
+
* @returns boolean - True if the JID is in PN format
|
|
1053
|
+
*
|
|
1054
|
+
* @example
|
|
1055
|
+
* ```typescript
|
|
1056
|
+
* if (whatsapp.isPNFormat("6281234567890@s.whatsapp.net")) {
|
|
1057
|
+
* console.log("This is a phone number JID");
|
|
1058
|
+
* }
|
|
1059
|
+
* ```
|
|
1060
|
+
*/
|
|
1061
|
+
export const isPNFormat = (jid) => {
|
|
1062
|
+
return jid.includes('@s.whatsapp.net');
|
|
1063
|
+
};
|
|
1064
|
+
/**
|
|
1065
|
+
* Smart convert any JID to phone number
|
|
1066
|
+
*
|
|
1067
|
+
* Automatically detects if the input is an LID and converts it to PN,
|
|
1068
|
+
* or returns the PN if already in PN format.
|
|
1069
|
+
*
|
|
1070
|
+
* @param sessionId - Session ID to use for conversion
|
|
1071
|
+
* @param jid - Any JID (LID or PN format)
|
|
1072
|
+
* @returns Promise<string | null> - Phone number or null if conversion failed
|
|
1073
|
+
*
|
|
1074
|
+
* @example
|
|
1075
|
+
* ```typescript
|
|
1076
|
+
* const pn = await whatsapp.toPhoneNumber("mysession", jid);
|
|
1077
|
+
* if (pn) {
|
|
1078
|
+
* console.log(`Phone number: ${pn}`);
|
|
1079
|
+
* }
|
|
1080
|
+
* ```
|
|
1081
|
+
*/
|
|
1082
|
+
export const toPhoneNumber = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1083
|
+
// If already in PN format, return as-is
|
|
1084
|
+
if (isPNFormat(jid)) {
|
|
1085
|
+
return jid;
|
|
1086
|
+
}
|
|
1087
|
+
// If it's an LID, try to convert
|
|
1088
|
+
if (isLIDFormat(jid)) {
|
|
1089
|
+
const result = yield getPNForLID(sessionId, jid);
|
|
1090
|
+
return result.pn;
|
|
1091
|
+
}
|
|
1092
|
+
// If it's a group or broadcast, return null
|
|
1093
|
+
if (jid.includes('@g.us') || jid.includes('@broadcast')) {
|
|
1094
|
+
return null;
|
|
1095
|
+
}
|
|
1096
|
+
// If it's just a number, format it as PN
|
|
1097
|
+
const phoneNumber = jid.replace(/\D/g, '');
|
|
1098
|
+
if (phoneNumber.length >= 10) {
|
|
1099
|
+
return `${phoneNumber}@s.whatsapp.net`;
|
|
1100
|
+
}
|
|
1101
|
+
return null;
|
|
1102
|
+
});
|
|
1103
|
+
/**
|
|
1104
|
+
* Smart convert any JID to LID
|
|
1105
|
+
*
|
|
1106
|
+
* Automatically detects if the input is a PN and converts it to LID,
|
|
1107
|
+
* or returns the LID if already in LID format.
|
|
1108
|
+
*
|
|
1109
|
+
* @param sessionId - Session ID to use for conversion
|
|
1110
|
+
* @param jid - Any JID (LID or PN format)
|
|
1111
|
+
* @returns Promise<string | null> - LID or null if conversion failed
|
|
1112
|
+
*
|
|
1113
|
+
* @example
|
|
1114
|
+
* ```typescript
|
|
1115
|
+
* const lid = await whatsapp.toLID("mysession", "6281234567890@s.whatsapp.net");
|
|
1116
|
+
* if (lid) {
|
|
1117
|
+
* console.log(`LID: ${lid}`);
|
|
1118
|
+
* }
|
|
1119
|
+
* ```
|
|
1120
|
+
*/
|
|
1121
|
+
export const toLID = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1122
|
+
// If already in LID format, return as-is
|
|
1123
|
+
if (isLIDFormat(jid)) {
|
|
1124
|
+
return jid;
|
|
1125
|
+
}
|
|
1126
|
+
// If it's a PN, try to convert
|
|
1127
|
+
if (isPNFormat(jid) || /^\d+$/.test(jid.replace(/\D/g, ''))) {
|
|
1128
|
+
const result = yield getLIDForPN(sessionId, jid);
|
|
1129
|
+
return result.lid;
|
|
1130
|
+
}
|
|
1131
|
+
// If it's a group or broadcast, return null
|
|
1132
|
+
if (jid.includes('@g.us') || jid.includes('@broadcast')) {
|
|
1133
|
+
return null;
|
|
1134
|
+
}
|
|
1135
|
+
return null;
|
|
1136
|
+
});
|