wa-multi-mongodb 3.10.2 → 3.10.3
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 +1 -1
- package/dist/Socket/index.d.ts.map +1 -1
- package/dist/Socket/index.js +134 -200
- 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 +105 -0
- package/dist/cjs/Socket/index.d.ts.map +1 -0
- package/dist/cjs/Socket/index.js +875 -0
- package/dist/cjs/Types/index.d.ts +74 -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/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,25 @@ 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();
|
|
63
24
|
const callback = new Map();
|
|
64
25
|
const retryCount = new Map();
|
|
65
26
|
// Tambahkan Map untuk melacak session yang menggunakan pairing code
|
|
66
27
|
const pairingCodeSessions = new Map();
|
|
67
|
-
const P =
|
|
28
|
+
const P = pino({
|
|
68
29
|
level: "silent",
|
|
69
30
|
});
|
|
70
31
|
// Tambahkan variabel global untuk koneksi MongoDB dan collection
|
|
@@ -77,10 +38,10 @@ let mongoURI = process.env.MONGODB_URI || "mongodb://localhost:27017";
|
|
|
77
38
|
*
|
|
78
39
|
* @param uri MongoDB connection URI
|
|
79
40
|
*/
|
|
80
|
-
const setMongoURI = (uri) => __awaiter(void 0, void 0, void 0, function* () {
|
|
41
|
+
export const setMongoURI = (uri) => __awaiter(void 0, void 0, void 0, function* () {
|
|
81
42
|
mongoURI = uri;
|
|
82
43
|
// Configure group cache MongoDB connection as well
|
|
83
|
-
yield
|
|
44
|
+
yield groupCache.setMongoURI(uri);
|
|
84
45
|
// Reset MongoDB client and collection to ensure they are recreated with new URI
|
|
85
46
|
if (mongoClient) {
|
|
86
47
|
try {
|
|
@@ -94,41 +55,40 @@ const setMongoURI = (uri) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
94
55
|
}
|
|
95
56
|
// MongoDB URI configured successfully - removed console.log for npm package
|
|
96
57
|
});
|
|
97
|
-
|
|
98
|
-
function setMongoCollection(collection) {
|
|
58
|
+
export function setMongoCollection(collection) {
|
|
99
59
|
authCollection = collection;
|
|
100
60
|
}
|
|
101
61
|
function initMongo() {
|
|
102
62
|
return __awaiter(this, void 0, void 0, function* () {
|
|
103
63
|
if (!authCollection) {
|
|
104
64
|
if (!mongoClient) {
|
|
105
|
-
mongoClient = new
|
|
65
|
+
mongoClient = new MongoClient(mongoURI);
|
|
106
66
|
yield mongoClient.connect();
|
|
107
67
|
}
|
|
108
68
|
// Gunakan variabel dari CREDENTIALS
|
|
109
|
-
const dbName =
|
|
110
|
-
const collectionName =
|
|
69
|
+
const dbName = CREDENTIALS.MONGO_DB_NAME;
|
|
70
|
+
const collectionName = CREDENTIALS.MONGO_COLLECTION_NAME;
|
|
111
71
|
authCollection = mongoClient.db(dbName).collection(collectionName);
|
|
112
72
|
// console.log(`MongoDB initialized with database "${dbName}" and collection "${collectionName}"`);
|
|
113
73
|
}
|
|
114
74
|
});
|
|
115
75
|
}
|
|
116
|
-
const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (sessionId = "mysession", options = { printQR: true }) {
|
|
76
|
+
export const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (sessionId = "mysession", options = { printQR: true }) {
|
|
117
77
|
if (isSessionExistAndRunning(sessionId))
|
|
118
|
-
throw new
|
|
78
|
+
throw new WhatsappError(Messages.sessionAlreadyExist(sessionId));
|
|
119
79
|
yield initMongo();
|
|
120
|
-
const { version } = yield
|
|
80
|
+
const { version } = yield fetchLatestBaileysVersion();
|
|
121
81
|
const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
122
|
-
const { state, saveCreds } = yield
|
|
123
|
-
const sock = (
|
|
82
|
+
const { state, saveCreds } = yield useMongoAuthState(sessionId, authCollection);
|
|
83
|
+
const sock = makeWASocket({
|
|
124
84
|
version,
|
|
125
85
|
auth: state,
|
|
126
86
|
logger: P,
|
|
127
87
|
markOnlineOnConnect: false,
|
|
128
|
-
browser:
|
|
88
|
+
browser: Browsers.ubuntu("Chrome"),
|
|
129
89
|
// Configure caching group metadata using our hybrid implementation with session ID
|
|
130
90
|
cachedGroupMetadata: (jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
131
|
-
return yield
|
|
91
|
+
return yield groupCache.get(sessionId, jid);
|
|
132
92
|
})
|
|
133
93
|
});
|
|
134
94
|
sessions.set(sessionId, Object.assign({}, sock));
|
|
@@ -141,7 +101,7 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
141
101
|
if (update.qr) {
|
|
142
102
|
// Print QR to console if requested
|
|
143
103
|
if (options.printQR) {
|
|
144
|
-
|
|
104
|
+
QRCode.toString(update.qr, {
|
|
145
105
|
type: 'terminal',
|
|
146
106
|
small: true,
|
|
147
107
|
margin: 1
|
|
@@ -152,21 +112,21 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
152
112
|
});
|
|
153
113
|
}
|
|
154
114
|
// Send QR data raw to callback for frontend processing
|
|
155
|
-
(_a = callback.get(
|
|
115
|
+
(_a = callback.get(CALLBACK_KEY.ON_QR)) === null || _a === void 0 ? void 0 : _a({
|
|
156
116
|
sessionId,
|
|
157
117
|
qr: update.qr
|
|
158
118
|
});
|
|
159
119
|
(_b = options.onQRUpdated) === null || _b === void 0 ? void 0 : _b.call(options, update.qr);
|
|
160
120
|
}
|
|
161
121
|
if (connection == "connecting") {
|
|
162
|
-
(_c = callback.get(
|
|
122
|
+
(_c = callback.get(CALLBACK_KEY.ON_CONNECTING)) === null || _c === void 0 ? void 0 : _c(sessionId);
|
|
163
123
|
(_d = options.onConnecting) === null || _d === void 0 ? void 0 : _d.call(options);
|
|
164
124
|
}
|
|
165
125
|
if (connection === "close") {
|
|
166
126
|
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
127
|
let retryAttempt = (_g = retryCount.get(sessionId)) !== null && _g !== void 0 ? _g : 0;
|
|
168
128
|
let shouldRetry;
|
|
169
|
-
if (code !=
|
|
129
|
+
if (code != DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
170
130
|
shouldRetry = true;
|
|
171
131
|
}
|
|
172
132
|
if (shouldRetry) {
|
|
@@ -184,13 +144,13 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
184
144
|
// For regular sessions, completely delete
|
|
185
145
|
yield softDeleteSession(sessionId, false);
|
|
186
146
|
}
|
|
187
|
-
(_h = callback.get(
|
|
147
|
+
(_h = callback.get(CALLBACK_KEY.ON_DISCONNECTED)) === null || _h === void 0 ? void 0 : _h(sessionId);
|
|
188
148
|
(_j = options.onDisconnected) === null || _j === void 0 ? void 0 : _j.call(options);
|
|
189
149
|
}
|
|
190
150
|
}
|
|
191
151
|
if (connection == "open") {
|
|
192
152
|
retryCount.delete(sessionId);
|
|
193
|
-
(_k = callback.get(
|
|
153
|
+
(_k = callback.get(CALLBACK_KEY.ON_CONNECTED)) === null || _k === void 0 ? void 0 : _k(sessionId);
|
|
194
154
|
(_l = options.onConnected) === null || _l === void 0 ? void 0 : _l.call(options);
|
|
195
155
|
}
|
|
196
156
|
}
|
|
@@ -204,7 +164,7 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
204
164
|
try {
|
|
205
165
|
// Dapatkan metadata grup terbaru dan simpan ke cache dengan sessionId
|
|
206
166
|
const metadata = yield sock.groupMetadata(update.id);
|
|
207
|
-
yield
|
|
167
|
+
yield groupCache.set(sessionId, update.id, metadata);
|
|
208
168
|
}
|
|
209
169
|
catch (error) {
|
|
210
170
|
console.error(`Error updating group metadata in cache: ${error}`);
|
|
@@ -217,7 +177,7 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
217
177
|
try {
|
|
218
178
|
// Dapatkan metadata grup terbaru dan simpan ke cache dengan sessionId
|
|
219
179
|
const metadata = yield sock.groupMetadata(update.id);
|
|
220
|
-
yield
|
|
180
|
+
yield groupCache.set(sessionId, update.id, metadata);
|
|
221
181
|
}
|
|
222
182
|
catch (error) {
|
|
223
183
|
console.error(`Error updating group participants in cache: ${error}`);
|
|
@@ -225,8 +185,8 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
225
185
|
}
|
|
226
186
|
if (events["messages.update"]) {
|
|
227
187
|
const msg = events["messages.update"][0];
|
|
228
|
-
const data = Object.assign({ sessionId: sessionId, messageStatus:
|
|
229
|
-
(_m = callback.get(
|
|
188
|
+
const data = Object.assign({ sessionId: sessionId, messageStatus: parseMessageStatusCodeToReadable(msg.update.status) }, msg);
|
|
189
|
+
(_m = callback.get(CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _m === void 0 ? void 0 : _m(sessionId, data);
|
|
230
190
|
(_o = options.onMessageUpdated) === null || _o === void 0 ? void 0 : _o.call(options, data);
|
|
231
191
|
}
|
|
232
192
|
if (events["messages.upsert"]) {
|
|
@@ -242,11 +202,11 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
242
202
|
}
|
|
243
203
|
const msg = rawMsg;
|
|
244
204
|
msg.sessionId = sessionId;
|
|
245
|
-
msg.saveImage = (path) =>
|
|
246
|
-
msg.saveVideo = (path) =>
|
|
247
|
-
msg.saveDocument = (path) =>
|
|
248
|
-
msg.saveAudio = (path) =>
|
|
249
|
-
(_q = callback.get(
|
|
205
|
+
msg.saveImage = (path) => saveImageHandler(msg, path);
|
|
206
|
+
msg.saveVideo = (path) => saveVideoHandler(msg, path);
|
|
207
|
+
msg.saveDocument = (path) => saveDocumentHandler(msg, path);
|
|
208
|
+
msg.saveAudio = (path) => saveAudioHandler(msg, path);
|
|
209
|
+
(_q = callback.get(CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _q === void 0 ? void 0 : _q(Object.assign({}, msg));
|
|
250
210
|
(_r = options.onMessageReceived) === null || _r === void 0 ? void 0 : _r.call(options, msg);
|
|
251
211
|
}
|
|
252
212
|
}
|
|
@@ -260,7 +220,6 @@ const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, funct
|
|
|
260
220
|
});
|
|
261
221
|
return startSocket();
|
|
262
222
|
});
|
|
263
|
-
exports.startSession = startSession;
|
|
264
223
|
/**
|
|
265
224
|
* Start WhatsApp session using pairing code method
|
|
266
225
|
* This is the recommended way to create sessions with pairing code
|
|
@@ -270,22 +229,22 @@ exports.startSession = startSession;
|
|
|
270
229
|
* @param options Optional configuration for the session
|
|
271
230
|
* @returns Promise<WASocket> The WhatsApp socket instance
|
|
272
231
|
*/
|
|
273
|
-
const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => __awaiter(void 0, [sessionId_1, phoneNumber_1, ...args_1], void 0, function* (sessionId, phoneNumber, options = {}) {
|
|
232
|
+
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
233
|
if (isSessionExistAndRunning(sessionId))
|
|
275
|
-
throw new
|
|
234
|
+
throw new WhatsappError(Messages.sessionAlreadyExist(sessionId));
|
|
276
235
|
// Simpan informasi session pairing code untuk auto-reconnect
|
|
277
236
|
pairingCodeSessions.set(sessionId, { phoneNumber, options });
|
|
278
237
|
yield initMongo();
|
|
279
|
-
const { version } = yield
|
|
238
|
+
const { version } = yield fetchLatestBaileysVersion();
|
|
280
239
|
const startSocket = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
281
240
|
var _a, _b;
|
|
282
|
-
const { state, saveCreds } = yield
|
|
283
|
-
const sock = (
|
|
241
|
+
const { state, saveCreds } = yield useMongoAuthState(sessionId, authCollection);
|
|
242
|
+
const sock = makeWASocket({
|
|
284
243
|
version,
|
|
285
244
|
auth: state,
|
|
286
245
|
logger: P,
|
|
287
246
|
markOnlineOnConnect: false,
|
|
288
|
-
browser:
|
|
247
|
+
browser: Browsers.ubuntu("Chrome"),
|
|
289
248
|
// Opsi tambahan untuk meningkatkan kompatibilitas
|
|
290
249
|
linkPreviewImageThumbnailWidth: 300,
|
|
291
250
|
generateHighQualityLinkPreview: true,
|
|
@@ -294,7 +253,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
294
253
|
printQRInTerminal: false, // QR tidak dicetak untuk pairing code
|
|
295
254
|
// Configure caching group metadata using our hybrid implementation with session ID
|
|
296
255
|
cachedGroupMetadata: (jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
297
|
-
return yield
|
|
256
|
+
return yield groupCache.get(sessionId, jid);
|
|
298
257
|
})
|
|
299
258
|
});
|
|
300
259
|
sessions.set(sessionId, Object.assign({}, sock));
|
|
@@ -312,7 +271,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
312
271
|
if (code && typeof code === 'string') {
|
|
313
272
|
console.log(`Pairing code untuk session ${sessionId}: ${code}`);
|
|
314
273
|
// Panggil callback yang terdaftar
|
|
315
|
-
(_a = callback.get(
|
|
274
|
+
(_a = callback.get(CALLBACK_KEY.ON_PAIRING_CODE)) === null || _a === void 0 ? void 0 : _a(sessionId, code);
|
|
316
275
|
(_b = options.onPairingCode) === null || _b === void 0 ? void 0 : _b.call(options, code);
|
|
317
276
|
}
|
|
318
277
|
else {
|
|
@@ -321,7 +280,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
321
280
|
}
|
|
322
281
|
catch (error) {
|
|
323
282
|
console.error("Error saat meminta kode pairing:", error);
|
|
324
|
-
throw new
|
|
283
|
+
throw new WhatsappError(`Gagal mendapatkan kode pairing: ${error.message || String(error)}`);
|
|
325
284
|
}
|
|
326
285
|
}
|
|
327
286
|
sock.ev.process((events) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -331,20 +290,20 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
331
290
|
const { connection, lastDisconnect } = update;
|
|
332
291
|
if (update.qr) {
|
|
333
292
|
// Send QR data raw to callback for frontend processing
|
|
334
|
-
(_a = callback.get(
|
|
293
|
+
(_a = callback.get(CALLBACK_KEY.ON_QR)) === null || _a === void 0 ? void 0 : _a({
|
|
335
294
|
sessionId,
|
|
336
295
|
qr: update.qr
|
|
337
296
|
});
|
|
338
297
|
}
|
|
339
298
|
if (connection == "connecting") {
|
|
340
|
-
(_b = callback.get(
|
|
299
|
+
(_b = callback.get(CALLBACK_KEY.ON_CONNECTING)) === null || _b === void 0 ? void 0 : _b(sessionId);
|
|
341
300
|
(_c = options.onConnecting) === null || _c === void 0 ? void 0 : _c.call(options);
|
|
342
301
|
}
|
|
343
302
|
if (connection === "close") {
|
|
344
303
|
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
304
|
let retryAttempt = (_f = retryCount.get(sessionId)) !== null && _f !== void 0 ? _f : 0;
|
|
346
305
|
let shouldRetry;
|
|
347
|
-
if (code !=
|
|
306
|
+
if (code != DisconnectReason.loggedOut && retryAttempt < 10) {
|
|
348
307
|
shouldRetry = true;
|
|
349
308
|
}
|
|
350
309
|
if (shouldRetry) {
|
|
@@ -353,7 +312,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
353
312
|
// Untuk session pairing code, coba reconnect dengan metode yang tepat
|
|
354
313
|
try {
|
|
355
314
|
// Tunggu sebentar sebelum reconnect
|
|
356
|
-
yield
|
|
315
|
+
yield createDelay(2000);
|
|
357
316
|
startSocket();
|
|
358
317
|
}
|
|
359
318
|
catch (reconnectError) {
|
|
@@ -387,13 +346,13 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
387
346
|
pairingCodeSessions.delete(sessionId); // Only delete from tracking if it's not a pairing code session
|
|
388
347
|
yield softDeleteSession(sessionId, false);
|
|
389
348
|
}
|
|
390
|
-
(_g = callback.get(
|
|
349
|
+
(_g = callback.get(CALLBACK_KEY.ON_DISCONNECTED)) === null || _g === void 0 ? void 0 : _g(sessionId);
|
|
391
350
|
(_h = options.onDisconnected) === null || _h === void 0 ? void 0 : _h.call(options);
|
|
392
351
|
}
|
|
393
352
|
}
|
|
394
353
|
if (connection == "open") {
|
|
395
354
|
retryCount.delete(sessionId);
|
|
396
|
-
(_j = callback.get(
|
|
355
|
+
(_j = callback.get(CALLBACK_KEY.ON_CONNECTED)) === null || _j === void 0 ? void 0 : _j(sessionId);
|
|
397
356
|
(_k = options.onConnected) === null || _k === void 0 ? void 0 : _k.call(options);
|
|
398
357
|
}
|
|
399
358
|
}
|
|
@@ -407,7 +366,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
407
366
|
try {
|
|
408
367
|
// Dapatkan metadata grup terbaru dan simpan ke cache dengan sessionId
|
|
409
368
|
const metadata = yield sock.groupMetadata(update.id);
|
|
410
|
-
yield
|
|
369
|
+
yield groupCache.set(sessionId, update.id, metadata);
|
|
411
370
|
}
|
|
412
371
|
catch (error) {
|
|
413
372
|
console.error(`Error updating group metadata in cache: ${error}`);
|
|
@@ -420,7 +379,7 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
420
379
|
try {
|
|
421
380
|
// Dapatkan metadata grup terbaru dan simpan ke cache dengan sessionId
|
|
422
381
|
const metadata = yield sock.groupMetadata(update.id);
|
|
423
|
-
yield
|
|
382
|
+
yield groupCache.set(sessionId, update.id, metadata);
|
|
424
383
|
}
|
|
425
384
|
catch (error) {
|
|
426
385
|
console.error(`Error updating group participants in cache: ${error}`);
|
|
@@ -428,8 +387,8 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
428
387
|
}
|
|
429
388
|
if (events["messages.update"]) {
|
|
430
389
|
const msg = events["messages.update"][0];
|
|
431
|
-
const data = Object.assign({ sessionId: sessionId, messageStatus:
|
|
432
|
-
(_l = callback.get(
|
|
390
|
+
const data = Object.assign({ sessionId: sessionId, messageStatus: parseMessageStatusCodeToReadable(msg.update.status) }, msg);
|
|
391
|
+
(_l = callback.get(CALLBACK_KEY.ON_MESSAGE_UPDATED)) === null || _l === void 0 ? void 0 : _l(sessionId, data);
|
|
433
392
|
(_m = options.onMessageUpdated) === null || _m === void 0 ? void 0 : _m.call(options, data);
|
|
434
393
|
}
|
|
435
394
|
if (events["messages.upsert"]) {
|
|
@@ -445,11 +404,11 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
445
404
|
}
|
|
446
405
|
const msg = rawMsg;
|
|
447
406
|
msg.sessionId = sessionId;
|
|
448
|
-
msg.saveImage = (path) =>
|
|
449
|
-
msg.saveVideo = (path) =>
|
|
450
|
-
msg.saveDocument = (path) =>
|
|
451
|
-
msg.saveAudio = (path) =>
|
|
452
|
-
(_p = callback.get(
|
|
407
|
+
msg.saveImage = (path) => saveImageHandler(msg, path);
|
|
408
|
+
msg.saveVideo = (path) => saveVideoHandler(msg, path);
|
|
409
|
+
msg.saveDocument = (path) => saveDocumentHandler(msg, path);
|
|
410
|
+
msg.saveAudio = (path) => saveAudioHandler(msg, path);
|
|
411
|
+
(_p = callback.get(CALLBACK_KEY.ON_MESSAGE_RECEIVED)) === null || _p === void 0 ? void 0 : _p(Object.assign({}, msg));
|
|
453
412
|
(_q = options.onMessageReceived) === null || _q === void 0 ? void 0 : _q.call(options, msg);
|
|
454
413
|
}
|
|
455
414
|
}
|
|
@@ -463,17 +422,16 @@ const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => _
|
|
|
463
422
|
});
|
|
464
423
|
return startSocket();
|
|
465
424
|
});
|
|
466
|
-
exports.startSessionWithPairingCode = startSessionWithPairingCode;
|
|
467
425
|
/**
|
|
468
426
|
* @deprecated Use startSession method instead
|
|
469
427
|
*/
|
|
470
|
-
|
|
428
|
+
export const startWhatsapp = startSession;
|
|
471
429
|
/**
|
|
472
430
|
* Soft delete session - removes from memory but preserves MongoDB data for pairing code sessions
|
|
473
431
|
* @param sessionId Session ID to soft delete
|
|
474
432
|
*/
|
|
475
433
|
const softDeleteSession = (sessionId_1, ...args_1) => __awaiter(void 0, [sessionId_1, ...args_1], void 0, function* (sessionId, preserveData = false) {
|
|
476
|
-
const session =
|
|
434
|
+
const session = getSession(sessionId);
|
|
477
435
|
try {
|
|
478
436
|
yield (session === null || session === void 0 ? void 0 : session.logout());
|
|
479
437
|
}
|
|
@@ -496,19 +454,19 @@ const softDeleteSession = (sessionId_1, ...args_1) => __awaiter(void 0, [session
|
|
|
496
454
|
}
|
|
497
455
|
// Hapus cache grup untuk session ini
|
|
498
456
|
try {
|
|
499
|
-
yield
|
|
457
|
+
yield groupCache.clearSessionCache(sessionId);
|
|
500
458
|
}
|
|
501
459
|
catch (error) {
|
|
502
460
|
console.error(`Error clearing group cache for session ${sessionId}:`, error);
|
|
503
461
|
}
|
|
504
462
|
// Legacy: hapus juga dari file system jika ada
|
|
505
|
-
const dir =
|
|
506
|
-
if (
|
|
507
|
-
|
|
463
|
+
const dir = path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX);
|
|
464
|
+
if (fs.existsSync(dir)) {
|
|
465
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
508
466
|
}
|
|
509
467
|
});
|
|
510
|
-
const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
511
|
-
const session =
|
|
468
|
+
export const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
469
|
+
const session = getSession(sessionId);
|
|
512
470
|
try {
|
|
513
471
|
yield (session === null || session === void 0 ? void 0 : session.logout());
|
|
514
472
|
}
|
|
@@ -528,23 +486,22 @@ const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function*
|
|
|
528
486
|
}
|
|
529
487
|
// Hapus cache grup untuk session ini
|
|
530
488
|
try {
|
|
531
|
-
yield
|
|
489
|
+
yield groupCache.clearSessionCache(sessionId);
|
|
532
490
|
}
|
|
533
491
|
catch (error) {
|
|
534
492
|
console.error(`Error clearing group cache for session ${sessionId}:`, error);
|
|
535
493
|
}
|
|
536
494
|
// Legacy: hapus juga dari file system jika ada
|
|
537
|
-
const dir =
|
|
538
|
-
if (
|
|
539
|
-
|
|
495
|
+
const dir = path.resolve(CREDENTIALS.DIR_NAME, sessionId + CREDENTIALS.PREFIX);
|
|
496
|
+
if (fs.existsSync(dir)) {
|
|
497
|
+
fs.rmSync(dir, { force: true, recursive: true });
|
|
540
498
|
}
|
|
541
499
|
});
|
|
542
|
-
exports.deleteSession = deleteSession;
|
|
543
500
|
/**
|
|
544
501
|
* Get all active session IDs
|
|
545
502
|
* @returns Array of session IDs
|
|
546
503
|
*/
|
|
547
|
-
const getAllSession = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
504
|
+
export const getAllSession = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
548
505
|
// Return active sessions from Map (sessions yang sudah running di memori)
|
|
549
506
|
const runningSessionIds = Array.from(sessions.keys());
|
|
550
507
|
// Jika authCollection belum diinisialisasi, kembalikan hanya sessions dari memori
|
|
@@ -565,15 +522,12 @@ const getAllSession = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
565
522
|
return runningSessionIds;
|
|
566
523
|
}
|
|
567
524
|
});
|
|
568
|
-
exports.getAllSession = getAllSession;
|
|
569
525
|
// Untuk backward compatibility
|
|
570
|
-
const getAllSessionSync = () => Array.from(sessions.keys());
|
|
571
|
-
|
|
572
|
-
const getSession = (key) => sessions.get(key);
|
|
573
|
-
exports.getSession = getSession;
|
|
526
|
+
export const getAllSessionSync = () => Array.from(sessions.keys());
|
|
527
|
+
export const getSession = (key) => sessions.get(key);
|
|
574
528
|
const isSessionExistAndRunning = (sessionId) => {
|
|
575
529
|
// Cek jika session sudah berjalan di memory
|
|
576
|
-
if (
|
|
530
|
+
if (getSession(sessionId)) {
|
|
577
531
|
return true;
|
|
578
532
|
}
|
|
579
533
|
return false;
|
|
@@ -585,7 +539,7 @@ const isSessionExistAndRunning = (sessionId) => {
|
|
|
585
539
|
*/
|
|
586
540
|
const shouldLoadSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
587
541
|
// Jika session sudah berjalan di memory, tidak perlu load lagi
|
|
588
|
-
if (
|
|
542
|
+
if (getSession(sessionId)) {
|
|
589
543
|
return false;
|
|
590
544
|
}
|
|
591
545
|
// Jika authCollection belum diinisialisasi, tidak bisa load
|
|
@@ -605,54 +559,46 @@ const shouldLoadSession = (sessionId) => __awaiter(void 0, void 0, void 0, funct
|
|
|
605
559
|
/**
|
|
606
560
|
* @deprecated Use loadSessionsFromMongo instead
|
|
607
561
|
*/
|
|
608
|
-
const loadSessionsFromStorage = () => {
|
|
562
|
+
export const loadSessionsFromStorage = () => {
|
|
609
563
|
console.warn("loadSessionsFromStorage is deprecated, use loadSessionsFromMongo instead");
|
|
610
564
|
// Redirect ke fungsi loadSessionsFromMongo untuk backward compatibility
|
|
611
|
-
|
|
565
|
+
loadSessionsFromMongo().catch(err => {
|
|
612
566
|
console.error("Error loading sessions from MongoDB:", err);
|
|
613
567
|
});
|
|
614
568
|
};
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
569
|
+
export const onMessageReceived = (listener) => {
|
|
570
|
+
callback.set(CALLBACK_KEY.ON_MESSAGE_RECEIVED, listener);
|
|
618
571
|
};
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_QR, listener);
|
|
572
|
+
export const onQRUpdated = (listener) => {
|
|
573
|
+
callback.set(CALLBACK_KEY.ON_QR, listener);
|
|
622
574
|
};
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTED, listener);
|
|
575
|
+
export const onConnected = (listener) => {
|
|
576
|
+
callback.set(CALLBACK_KEY.ON_CONNECTED, listener);
|
|
626
577
|
};
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_DISCONNECTED, listener);
|
|
578
|
+
export const onDisconnected = (listener) => {
|
|
579
|
+
callback.set(CALLBACK_KEY.ON_DISCONNECTED, listener);
|
|
630
580
|
};
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_CONNECTING, listener);
|
|
581
|
+
export const onConnecting = (listener) => {
|
|
582
|
+
callback.set(CALLBACK_KEY.ON_CONNECTING, listener);
|
|
634
583
|
};
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
callback.set(Defaults_1.CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
|
|
584
|
+
export const onMessageUpdate = (listener) => {
|
|
585
|
+
callback.set(CALLBACK_KEY.ON_MESSAGE_UPDATED, listener);
|
|
638
586
|
};
|
|
639
|
-
|
|
640
|
-
const onPairingCode = (listener) => {
|
|
587
|
+
export const onPairingCode = (listener) => {
|
|
641
588
|
// Set callback ke registry dengan key yang benar
|
|
642
|
-
callback.set(
|
|
589
|
+
callback.set(CALLBACK_KEY.ON_PAIRING_CODE, listener);
|
|
643
590
|
};
|
|
644
|
-
exports.onPairingCode = onPairingCode;
|
|
645
591
|
/**
|
|
646
592
|
* Load all sessions from MongoDB and start them automatically
|
|
647
593
|
*/
|
|
648
|
-
const loadSessionsFromMongo = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
594
|
+
export const loadSessionsFromMongo = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
649
595
|
yield initMongo();
|
|
650
596
|
const sessionDocs = yield authCollection.find({}).toArray();
|
|
651
597
|
for (const doc of sessionDocs) {
|
|
652
598
|
const sessionId = doc.sessionId;
|
|
653
|
-
if (sessionId && !
|
|
599
|
+
if (sessionId && !getSession(sessionId)) {
|
|
654
600
|
try {
|
|
655
|
-
yield
|
|
601
|
+
yield startSession(sessionId, { printQR: false });
|
|
656
602
|
}
|
|
657
603
|
catch (e) {
|
|
658
604
|
// Optional: log error jika gagal load session tertentu
|
|
@@ -661,36 +607,33 @@ const loadSessionsFromMongo = () => __awaiter(void 0, void 0, void 0, function*
|
|
|
661
607
|
}
|
|
662
608
|
}
|
|
663
609
|
});
|
|
664
|
-
exports.loadSessionsFromMongo = loadSessionsFromMongo;
|
|
665
610
|
/**
|
|
666
611
|
* Configure MongoDB database and collection names
|
|
667
612
|
*
|
|
668
613
|
* @param dbName MongoDB database name (default: "wa_session")
|
|
669
614
|
* @param collectionName MongoDB collection name for auth storage (default: "auth")
|
|
670
615
|
*/
|
|
671
|
-
const setMongoDBNames = (dbName = "wa_session", collectionName = "auth") => {
|
|
672
|
-
|
|
673
|
-
|
|
616
|
+
export const setMongoDBNames = (dbName = "wa_session", collectionName = "auth") => {
|
|
617
|
+
CREDENTIALS.MONGO_DB_NAME = dbName;
|
|
618
|
+
CREDENTIALS.MONGO_COLLECTION_NAME = collectionName;
|
|
674
619
|
};
|
|
675
|
-
exports.setMongoDBNames = setMongoDBNames;
|
|
676
620
|
/**
|
|
677
621
|
* Sets the directory name for storing credentials (File-based storage)
|
|
678
622
|
*
|
|
679
623
|
* @deprecated When using MongoDB, this setting has no effect. Only used for legacy file-based storage.
|
|
680
624
|
* @param dirname Directory name for storing credentials (default: "wa_credentials")
|
|
681
625
|
*/
|
|
682
|
-
const setCredentialsDir = (dirname = "wa_credentials") => {
|
|
626
|
+
export const setCredentialsDir = (dirname = "wa_credentials") => {
|
|
683
627
|
console.warn("setCredentialsDir() is deprecated when using MongoDB storage. This setting only affects legacy file-based storage.");
|
|
684
|
-
|
|
628
|
+
CREDENTIALS.DIR_NAME = dirname;
|
|
685
629
|
};
|
|
686
|
-
exports.setCredentialsDir = setCredentialsDir;
|
|
687
630
|
/**
|
|
688
631
|
* Attempt to reconnect a disconnected session
|
|
689
632
|
*
|
|
690
633
|
* @param sessionId Session ID to reconnect
|
|
691
634
|
* @returns Promise<boolean> indicating success
|
|
692
635
|
*/
|
|
693
|
-
const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
636
|
+
export const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
694
637
|
try {
|
|
695
638
|
// Cek jika session masih ada di memory
|
|
696
639
|
const existingSession = sessions.get(sessionId);
|
|
@@ -713,7 +656,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
713
656
|
sessions.delete(sessionId);
|
|
714
657
|
}
|
|
715
658
|
// Tunggu sedikit waktu untuk memastikan cleanup selesai
|
|
716
|
-
yield
|
|
659
|
+
yield createDelay(1000);
|
|
717
660
|
// Cek jika ini session pairing code dari tracking terlebih dahulu
|
|
718
661
|
const pairingInfo = pairingCodeSessions.get(sessionId);
|
|
719
662
|
if (pairingInfo) {
|
|
@@ -721,7 +664,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
721
664
|
try {
|
|
722
665
|
// Reset retry count untuk session ini
|
|
723
666
|
retryCount.delete(sessionId);
|
|
724
|
-
yield
|
|
667
|
+
yield startSessionWithPairingCode(sessionId, pairingInfo.phoneNumber, Object.assign(Object.assign({}, pairingInfo.options), { printQR: false,
|
|
725
668
|
// Tambahkan callback khusus untuk reconnect
|
|
726
669
|
onConnected: () => {
|
|
727
670
|
// Pairing code session reconnected successfully
|
|
@@ -729,7 +672,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
729
672
|
// Pairing code session disconnected after reconnect
|
|
730
673
|
} }));
|
|
731
674
|
// Periksa jika session berhasil dimulai
|
|
732
|
-
return !!
|
|
675
|
+
return !!getSession(sessionId);
|
|
733
676
|
}
|
|
734
677
|
catch (startError) {
|
|
735
678
|
console.error(`Failed to reconnect pairing code session ${sessionId}:`, startError.message);
|
|
@@ -743,7 +686,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
743
686
|
if (sessionExists) {
|
|
744
687
|
// Session biasa, gunakan metode startSession normal
|
|
745
688
|
try {
|
|
746
|
-
yield
|
|
689
|
+
yield startSession(sessionId, {
|
|
747
690
|
printQR: false,
|
|
748
691
|
// Tambahkan callback khusus untuk reconnect
|
|
749
692
|
onConnected: () => {
|
|
@@ -757,7 +700,7 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
757
700
|
}
|
|
758
701
|
});
|
|
759
702
|
// Periksa jika session berhasil dimulai
|
|
760
|
-
return !!
|
|
703
|
+
return !!getSession(sessionId);
|
|
761
704
|
}
|
|
762
705
|
catch (startError) {
|
|
763
706
|
console.error(`Failed to reconnect session ${sessionId}:`, startError.message);
|
|
@@ -775,19 +718,18 @@ const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
775
718
|
return false;
|
|
776
719
|
}
|
|
777
720
|
});
|
|
778
|
-
exports.reconnect = reconnect;
|
|
779
721
|
/**
|
|
780
722
|
* Reconnect all pairing code sessions that are tracked
|
|
781
723
|
* Useful for bulk reconnection after system restart
|
|
782
724
|
*/
|
|
783
|
-
const reconnectAllPairingCodeSessions = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
725
|
+
export const reconnectAllPairingCodeSessions = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
784
726
|
const results = {};
|
|
785
727
|
for (const [sessionId, sessionInfo] of pairingCodeSessions.entries()) {
|
|
786
728
|
try {
|
|
787
|
-
const success = yield
|
|
729
|
+
const success = yield reconnect(sessionId);
|
|
788
730
|
results[sessionId] = success;
|
|
789
731
|
// Add delay between reconnection attempts
|
|
790
|
-
yield
|
|
732
|
+
yield createDelay(2000);
|
|
791
733
|
}
|
|
792
734
|
catch (error) {
|
|
793
735
|
console.error(`Error reconnecting pairing code session ${sessionId}:`, error.message);
|
|
@@ -796,22 +738,20 @@ const reconnectAllPairingCodeSessions = () => __awaiter(void 0, void 0, void 0,
|
|
|
796
738
|
}
|
|
797
739
|
return results;
|
|
798
740
|
});
|
|
799
|
-
exports.reconnectAllPairingCodeSessions = reconnectAllPairingCodeSessions;
|
|
800
741
|
/**
|
|
801
742
|
* Get all tracked pairing code sessions
|
|
802
743
|
* @returns Array of session IDs that were created with pairing code
|
|
803
744
|
*/
|
|
804
|
-
const getPairingCodeSessions = () => {
|
|
745
|
+
export const getPairingCodeSessions = () => {
|
|
805
746
|
return Array.from(pairingCodeSessions.keys());
|
|
806
747
|
};
|
|
807
|
-
exports.getPairingCodeSessions = getPairingCodeSessions;
|
|
808
748
|
/**
|
|
809
749
|
* Get session status information
|
|
810
750
|
* @param sessionId Session ID to check
|
|
811
751
|
* @returns Object with session status information
|
|
812
752
|
*/
|
|
813
|
-
const getSessionStatus = (sessionId) => {
|
|
814
|
-
const isRunning = !!
|
|
753
|
+
export const getSessionStatus = (sessionId) => {
|
|
754
|
+
const isRunning = !!getSession(sessionId);
|
|
815
755
|
const isPairingCodeSession = pairingCodeSessions.has(sessionId);
|
|
816
756
|
const retryAttempts = retryCount.get(sessionId) || 0;
|
|
817
757
|
return {
|
|
@@ -822,53 +762,47 @@ const getSessionStatus = (sessionId) => {
|
|
|
822
762
|
hasCredentials: isRunning ? true : null // null means unknown when not running
|
|
823
763
|
};
|
|
824
764
|
};
|
|
825
|
-
exports.getSessionStatus = getSessionStatus;
|
|
826
765
|
// Fungsi baru untuk mendapatkan konfigurasi TTL cache grup
|
|
827
|
-
const setGroupCacheConfig = (options) => {
|
|
828
|
-
|
|
766
|
+
export const setGroupCacheConfig = (options) => {
|
|
767
|
+
groupCache.setConfig(options);
|
|
829
768
|
};
|
|
830
|
-
exports.setGroupCacheConfig = setGroupCacheConfig;
|
|
831
769
|
// 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) {
|
|
770
|
+
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
771
|
// Get the session socket
|
|
834
|
-
const sock =
|
|
772
|
+
const sock = getSession(sessionId);
|
|
835
773
|
if (!sock) {
|
|
836
|
-
throw new
|
|
774
|
+
throw new WhatsappError(Messages.sessionNotFound(sessionId));
|
|
837
775
|
}
|
|
838
776
|
try {
|
|
839
777
|
// Jika forceFetch true, langsung ambil dari server dan update cache
|
|
840
778
|
if (forceFetch) {
|
|
841
779
|
const metadata = yield sock.groupMetadata(jid);
|
|
842
|
-
yield
|
|
780
|
+
yield groupCache.set(sessionId, jid, metadata);
|
|
843
781
|
return metadata;
|
|
844
782
|
}
|
|
845
783
|
// Coba ambil dari cache dulu
|
|
846
|
-
const cachedData = yield
|
|
784
|
+
const cachedData = yield groupCache.get(sessionId, jid);
|
|
847
785
|
if (cachedData) {
|
|
848
786
|
return cachedData;
|
|
849
787
|
}
|
|
850
788
|
// Jika tidak ada di cache, ambil dari server dan simpan ke cache
|
|
851
789
|
const metadata = yield sock.groupMetadata(jid);
|
|
852
|
-
yield
|
|
790
|
+
yield groupCache.set(sessionId, jid, metadata);
|
|
853
791
|
return metadata;
|
|
854
792
|
}
|
|
855
793
|
catch (error) {
|
|
856
|
-
throw new
|
|
794
|
+
throw new WhatsappError(`Failed to fetch group metadata: ${error.message || String(error)}`);
|
|
857
795
|
}
|
|
858
796
|
});
|
|
859
|
-
exports.getGroupMetadata = getGroupMetadata;
|
|
860
797
|
// Fungsi baru untuk menghapus cache grup tertentu
|
|
861
|
-
const clearGroupMetadataCache = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
862
|
-
yield
|
|
798
|
+
export const clearGroupMetadataCache = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
799
|
+
yield groupCache.delete(sessionId, jid);
|
|
863
800
|
});
|
|
864
|
-
exports.clearGroupMetadataCache = clearGroupMetadataCache;
|
|
865
801
|
// Fungsi untuk membersihkan seluruh cache grup untuk session tertentu
|
|
866
|
-
const clearSessionGroupMetadataCache = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
867
|
-
yield
|
|
802
|
+
export const clearSessionGroupMetadataCache = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
803
|
+
yield groupCache.clearSessionCache(sessionId);
|
|
868
804
|
});
|
|
869
|
-
exports.clearSessionGroupMetadataCache = clearSessionGroupMetadataCache;
|
|
870
805
|
// Fungsi untuk membersihkan seluruh cache grup untuk semua session
|
|
871
|
-
const clearAllGroupMetadataCache = () => {
|
|
872
|
-
|
|
806
|
+
export const clearAllGroupMetadataCache = () => {
|
|
807
|
+
groupCache.flush();
|
|
873
808
|
};
|
|
874
|
-
exports.clearAllGroupMetadataCache = clearAllGroupMetadataCache;
|