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.
Files changed (85) hide show
  1. package/dist/Defaults/index.js +4 -9
  2. package/dist/Error/index.js +1 -5
  3. package/dist/Messaging/index.d.ts +1 -1
  4. package/dist/Messaging/index.js +123 -137
  5. package/dist/Profile/index.d.ts +1 -1
  6. package/dist/Profile/index.js +6 -10
  7. package/dist/Socket/index.d.ts +160 -1
  8. package/dist/Socket/index.d.ts.map +1 -1
  9. package/dist/Socket/index.js +462 -200
  10. package/dist/Types/index.d.ts +21 -0
  11. package/dist/Types/index.d.ts.map +1 -1
  12. package/dist/Types/index.js +1 -2
  13. package/dist/Types/profile.js +1 -2
  14. package/dist/Utils/create-delay.js +2 -7
  15. package/dist/Utils/error.js +1 -4
  16. package/dist/Utils/group-cache.js +8 -15
  17. package/dist/Utils/index.d.ts +5 -5
  18. package/dist/Utils/index.js +5 -21
  19. package/dist/Utils/is-exist.d.ts +1 -1
  20. package/dist/Utils/is-exist.js +7 -10
  21. package/dist/Utils/lid-utils.js +13 -20
  22. package/dist/Utils/message-status.d.ts +1 -1
  23. package/dist/Utils/message-status.js +7 -11
  24. package/dist/Utils/mongo-auth-state.js +10 -13
  25. package/dist/Utils/phone-to-jid.js +6 -14
  26. package/dist/Utils/save-media.d.ts +1 -1
  27. package/dist/Utils/save-media.js +16 -26
  28. package/dist/cjs/Defaults/index.d.ts +21 -0
  29. package/dist/cjs/Defaults/index.d.ts.map +1 -0
  30. package/dist/cjs/Defaults/index.js +31 -0
  31. package/dist/cjs/Error/index.d.ts +5 -0
  32. package/dist/cjs/Error/index.d.ts.map +1 -0
  33. package/dist/cjs/Error/index.js +14 -0
  34. package/dist/cjs/Messaging/index.d.ts +45 -0
  35. package/dist/cjs/Messaging/index.d.ts.map +1 -0
  36. package/dist/cjs/Messaging/index.js +784 -0
  37. package/dist/cjs/Profile/index.d.ts +9 -0
  38. package/dist/cjs/Profile/index.d.ts.map +1 -0
  39. package/dist/cjs/Profile/index.js +34 -0
  40. package/dist/cjs/Socket/index.d.ts +264 -0
  41. package/dist/cjs/Socket/index.d.ts.map +1 -0
  42. package/dist/cjs/Socket/index.js +1210 -0
  43. package/dist/cjs/Types/index.d.ts +95 -0
  44. package/dist/cjs/Types/index.d.ts.map +1 -0
  45. package/dist/cjs/Types/index.js +2 -0
  46. package/dist/cjs/Types/profile.d.ts +5 -0
  47. package/dist/cjs/Types/profile.d.ts.map +1 -0
  48. package/dist/cjs/Types/profile.js +2 -0
  49. package/dist/cjs/Utils/create-delay.d.ts +17 -0
  50. package/dist/cjs/Utils/create-delay.d.ts.map +1 -0
  51. package/dist/cjs/Utils/create-delay.js +38 -0
  52. package/dist/cjs/Utils/error.d.ts +4 -0
  53. package/dist/cjs/Utils/error.d.ts.map +1 -0
  54. package/dist/cjs/Utils/error.js +8 -0
  55. package/dist/cjs/Utils/group-cache.d.ts +23 -0
  56. package/dist/cjs/Utils/group-cache.d.ts.map +1 -0
  57. package/dist/cjs/Utils/group-cache.js +176 -0
  58. package/dist/cjs/Utils/index.d.ts +6 -0
  59. package/dist/cjs/Utils/index.d.ts.map +1 -0
  60. package/dist/cjs/Utils/index.js +23 -0
  61. package/dist/cjs/Utils/is-exist.d.ts +6 -0
  62. package/dist/cjs/Utils/is-exist.d.ts.map +1 -0
  63. package/dist/cjs/Utils/is-exist.js +53 -0
  64. package/dist/cjs/Utils/lid-utils.d.ts +26 -0
  65. package/dist/cjs/Utils/lid-utils.d.ts.map +1 -0
  66. package/dist/cjs/Utils/lid-utils.js +81 -0
  67. package/dist/cjs/Utils/message-status.d.ts +4 -0
  68. package/dist/cjs/Utils/message-status.d.ts.map +1 -0
  69. package/dist/cjs/Utils/message-status.js +18 -0
  70. package/dist/cjs/Utils/mongo-auth-state.d.ts +15 -0
  71. package/dist/cjs/Utils/mongo-auth-state.d.ts.map +1 -0
  72. package/dist/cjs/Utils/mongo-auth-state.js +109 -0
  73. package/dist/cjs/Utils/phone-to-jid.d.ts +17 -0
  74. package/dist/cjs/Utils/phone-to-jid.d.ts.map +1 -0
  75. package/dist/cjs/Utils/phone-to-jid.js +51 -0
  76. package/dist/cjs/Utils/save-media.d.ts +6 -0
  77. package/dist/cjs/Utils/save-media.d.ts.map +1 -0
  78. package/dist/cjs/Utils/save-media.js +55 -0
  79. package/dist/cjs/index.d.ts +8 -0
  80. package/dist/cjs/index.d.ts.map +1 -0
  81. package/dist/cjs/index.js +46 -0
  82. package/dist/index.d.ts +6 -6
  83. package/dist/index.js +7 -46
  84. package/package.json +57 -42
  85. package/readme.md +170 -3
@@ -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
- var __importDefault = (this && this.__importDefault) || function (mod) {
45
- return (mod && mod.__esModule) ? mod : { "default": mod };
46
- };
47
- Object.defineProperty(exports, "__esModule", { value: true });
48
- exports.clearAllGroupMetadataCache = exports.clearSessionGroupMetadataCache = exports.clearGroupMetadataCache = exports.getGroupMetadata = exports.setGroupCacheConfig = exports.getSessionStatus = exports.getPairingCodeSessions = exports.reconnectAllPairingCodeSessions = exports.reconnect = exports.setCredentialsDir = exports.setMongoDBNames = exports.loadSessionsFromMongo = exports.onPairingCode = exports.onMessageUpdate = exports.onConnecting = exports.onDisconnected = exports.onConnected = exports.onQRUpdated = exports.onMessageReceived = exports.loadSessionsFromStorage = exports.getSession = exports.getAllSessionSync = exports.getAllSession = exports.deleteSession = exports.startWhatsapp = exports.startSessionWithPairingCode = exports.startSession = exports.setMongoURI = void 0;
49
- exports.setMongoCollection = setMongoCollection;
50
- const baileys_1 = __importStar(require("baileys"));
51
- const path_1 = __importDefault(require("path"));
52
- const fs_1 = __importDefault(require("fs"));
53
- const qrcode_1 = __importDefault(require("qrcode"));
54
- const Defaults_1 = require("../Defaults");
55
- const save_media_1 = require("../Utils/save-media");
56
- const Utils_1 = require("../Utils");
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 = require("pino")({
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 Utils_1.groupCache.setMongoURI(uri);
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
- exports.setMongoURI = setMongoURI;
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 mongodb_1.MongoClient(mongoURI);
91
+ mongoClient = new MongoClient(mongoURI);
106
92
  yield mongoClient.connect();
107
93
  }
108
94
  // Gunakan variabel dari CREDENTIALS
109
- const dbName = Defaults_1.CREDENTIALS.MONGO_DB_NAME;
110
- const collectionName = Defaults_1.CREDENTIALS.MONGO_COLLECTION_NAME;
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 Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
104
+ throw new WhatsappError(Messages.sessionAlreadyExist(sessionId));
119
105
  yield initMongo();
120
- const { version } = yield (0, baileys_1.fetchLatestBaileysVersion)();
106
+ const { version } = yield fetchLatestBaileysVersion();
121
107
  const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
122
- const { state, saveCreds } = yield (0, mongo_auth_state_1.useMongoAuthState)(sessionId, authCollection);
123
- const sock = (0, baileys_1.default)({
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: baileys_1.Browsers.ubuntu("Chrome"),
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 Utils_1.groupCache.get(sessionId, jid);
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
- qrcode_1.default.toString(update.qr, {
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(Defaults_1.CALLBACK_KEY.ON_QR)) === null || _a === void 0 ? void 0 : _a({
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(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _c === void 0 ? void 0 : _c(sessionId);
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 != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
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(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _h === void 0 ? void 0 : _h(sessionId);
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(Defaults_1.CALLBACK_KEY.ON_CONNECTED)) === null || _k === void 0 ? void 0 : _k(sessionId);
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 Utils_1.groupCache.set(sessionId, update.id, metadata);
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 Utils_1.groupCache.set(sessionId, update.id, metadata);
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: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
229
- (_m = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _m === void 0 ? void 0 : _m(sessionId, data);
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) => (0, save_media_1.saveImageHandler)(msg, path);
246
- msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
247
- msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
248
- msg.saveAudio = (path) => (0, save_media_1.saveAudioHandler)(msg, path);
249
- (_q = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _q === void 0 ? void 0 : _q(Object.assign({}, msg));
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 Error_1.WhatsappError(Defaults_1.Messages.sessionAlreadyExist(sessionId));
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 (0, baileys_1.fetchLatestBaileysVersion)();
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 (0, mongo_auth_state_1.useMongoAuthState)(sessionId, authCollection);
283
- const sock = (0, baileys_1.default)({
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: baileys_1.Browsers.ubuntu("Chrome"),
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 Utils_1.groupCache.get(sessionId, jid);
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(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE)) === null || _a === void 0 ? void 0 : _a(sessionId, code);
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 Error_1.WhatsappError(`Gagal mendapatkan kode pairing: ${error.message || String(error)}`);
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(Defaults_1.CALLBACK_KEY.ON_QR)) === null || _a === void 0 ? void 0 : _a({
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(Defaults_1.CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
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 != baileys_1.DisconnectReason.loggedOut && retryAttempt < 10) {
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 (0, create_delay_1.createDelay)(2000);
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(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED)) === null || _g === void 0 ? void 0 : _g(sessionId);
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(Defaults_1.CALLBACK_KEY.ON_CONNECTED)) === null || _j === void 0 ? void 0 : _j(sessionId);
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 Utils_1.groupCache.set(sessionId, update.id, metadata);
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 Utils_1.groupCache.set(sessionId, update.id, metadata);
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: (0, message_status_1.parseMessageStatusCodeToReadable)(msg.update.status) }, msg);
432
- (_l = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _l === void 0 ? void 0 : _l(sessionId, data);
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) => (0, save_media_1.saveImageHandler)(msg, path);
449
- msg.saveVideo = (path) => (0, save_media_1.saveVideoHandler)(msg, path);
450
- msg.saveDocument = (path) => (0, save_media_1.saveDocumentHandler)(msg, path);
451
- msg.saveAudio = (path) => (0, save_media_1.saveAudioHandler)(msg, path);
452
- (_p = callback.get(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _p === void 0 ? void 0 : _p(Object.assign({}, msg));
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
- exports.startWhatsapp = exports.startSession;
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 = (0, exports.getSession)(sessionId);
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 Utils_1.groupCache.clearSessionCache(sessionId);
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 = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.PREFIX);
506
- if (fs_1.default.existsSync(dir)) {
507
- fs_1.default.rmSync(dir, { force: true, recursive: true });
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 = (0, exports.getSession)(sessionId);
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 Utils_1.groupCache.clearSessionCache(sessionId);
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 = path_1.default.resolve(Defaults_1.CREDENTIALS.DIR_NAME, sessionId + Defaults_1.CREDENTIALS.PREFIX);
538
- if (fs_1.default.existsSync(dir)) {
539
- fs_1.default.rmSync(dir, { force: true, recursive: true });
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
- exports.getAllSessionSync = getAllSessionSync;
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 ((0, exports.getSession)(sessionId)) {
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 ((0, exports.getSession)(sessionId)) {
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
- (0, exports.loadSessionsFromMongo)().catch(err => {
591
+ loadSessionsFromMongo().catch(err => {
612
592
  console.error("Error loading sessions from MongoDB:", err);
613
593
  });
614
594
  };
615
- exports.loadSessionsFromStorage = loadSessionsFromStorage;
616
- const onMessageReceived = (listener) => {
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
- exports.onMessageReceived = onMessageReceived;
620
- const onQRUpdated = (listener) => {
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
- exports.onQRUpdated = onQRUpdated;
624
- const onConnected = (listener) => {
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
- exports.onConnected = onConnected;
628
- const onDisconnected = (listener) => {
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
- exports.onDisconnected = onDisconnected;
632
- const onConnecting = (listener) => {
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
- exports.onConnecting = onConnecting;
636
- const onMessageUpdate = (listener) => {
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
- exports.onMessageUpdate = onMessageUpdate;
640
- const onPairingCode = (listener) => {
613
+ export const onPairingCode = (listener) => {
641
614
  // Set callback ke registry dengan key yang benar
642
- callback.set(Defaults_1.CALLBACK_KEY.ON_PAIRING_CODE, listener);
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 && !(0, exports.getSession)(sessionId)) {
625
+ if (sessionId && !getSession(sessionId)) {
654
626
  try {
655
- yield (0, exports.startSession)(sessionId, { printQR: false });
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
- Defaults_1.CREDENTIALS.MONGO_DB_NAME = dbName;
673
- Defaults_1.CREDENTIALS.MONGO_COLLECTION_NAME = collectionName;
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
- Defaults_1.CREDENTIALS.DIR_NAME = dirname;
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 (0, create_delay_1.createDelay)(1000);
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 (0, exports.startSessionWithPairingCode)(sessionId, pairingInfo.phoneNumber, Object.assign(Object.assign({}, pairingInfo.options), { printQR: false,
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 !!(0, exports.getSession)(sessionId);
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 (0, exports.startSession)(sessionId, {
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 !!(0, exports.getSession)(sessionId);
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 (0, exports.reconnect)(sessionId);
755
+ const success = yield reconnect(sessionId);
788
756
  results[sessionId] = success;
789
757
  // Add delay between reconnection attempts
790
- yield (0, create_delay_1.createDelay)(2000);
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 = !!(0, exports.getSession)(sessionId);
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
- Utils_1.groupCache.setConfig(options);
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 = (0, exports.getSession)(sessionId);
798
+ const sock = getSession(sessionId);
835
799
  if (!sock) {
836
- throw new Error_1.WhatsappError(Defaults_1.Messages.sessionNotFound(sessionId));
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 Utils_1.groupCache.set(sessionId, jid, metadata);
806
+ yield groupCache.set(sessionId, jid, metadata);
843
807
  return metadata;
844
808
  }
845
809
  // Coba ambil dari cache dulu
846
- const cachedData = yield Utils_1.groupCache.get(sessionId, jid);
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 Utils_1.groupCache.set(sessionId, jid, metadata);
816
+ yield groupCache.set(sessionId, jid, metadata);
853
817
  return metadata;
854
818
  }
855
819
  catch (error) {
856
- throw new Error_1.WhatsappError(`Failed to fetch group metadata: ${error.message || String(error)}`);
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 Utils_1.groupCache.delete(sessionId, jid);
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 Utils_1.groupCache.clearSessionCache(sessionId);
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
- Utils_1.groupCache.flush();
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
- exports.clearAllGroupMetadataCache = clearAllGroupMetadataCache;
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
+ });