wa-multi-mongodb 3.10.8 → 3.11.1
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/Socket/index.d.ts +5 -0
- package/dist/Socket/index.d.ts.map +1 -1
- package/dist/Socket/index.js +42 -3
- package/dist/Utils/group-cache.d.ts.map +1 -1
- package/dist/Utils/group-cache.js +20 -12
- package/dist/Utils/index.d.ts +1 -0
- package/dist/Utils/index.d.ts.map +1 -1
- package/dist/Utils/index.js +1 -0
- package/dist/Utils/mongo-auth-state.d.ts.map +1 -1
- package/dist/Utils/mongo-auth-state.js +5 -3
- package/dist/Utils/save-media.d.ts.map +1 -1
- package/dist/Utils/save-media.js +6 -4
- package/dist/Utils/security.d.ts +7 -0
- package/dist/Utils/security.d.ts.map +1 -0
- package/dist/Utils/security.js +44 -0
- package/dist/cjs/Socket/index.d.ts +5 -0
- package/dist/cjs/Socket/index.d.ts.map +1 -1
- package/dist/cjs/Socket/index.js +43 -3
- package/dist/cjs/Utils/group-cache.d.ts.map +1 -1
- package/dist/cjs/Utils/group-cache.js +20 -12
- package/dist/cjs/Utils/index.d.ts +1 -0
- package/dist/cjs/Utils/index.d.ts.map +1 -1
- package/dist/cjs/Utils/index.js +1 -0
- package/dist/cjs/Utils/mongo-auth-state.d.ts.map +1 -1
- package/dist/cjs/Utils/mongo-auth-state.js +5 -3
- package/dist/cjs/Utils/save-media.d.ts.map +1 -1
- package/dist/cjs/Utils/save-media.js +6 -4
- package/dist/cjs/Utils/security.d.ts +7 -0
- package/dist/cjs/Utils/security.d.ts.map +1 -0
- package/dist/cjs/Utils/security.js +56 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/package.json +9 -8
- package/readme.md +1302 -1246
package/dist/Socket/index.d.ts
CHANGED
|
@@ -31,6 +31,11 @@ export declare const deleteSession: (sessionId: string) => Promise<void>;
|
|
|
31
31
|
export declare const getAllSession: () => Promise<string[]>;
|
|
32
32
|
export declare const getAllSessionSync: () => string[];
|
|
33
33
|
export declare const getSession: (key: string) => WASocket | undefined;
|
|
34
|
+
export declare const downloadMediaMessage: ({ sessionId, message, key, }: {
|
|
35
|
+
sessionId: string;
|
|
36
|
+
message: any;
|
|
37
|
+
key?: any;
|
|
38
|
+
}) => Promise<Buffer>;
|
|
34
39
|
/**
|
|
35
40
|
* @deprecated Use loadSessionsFromMongo instead
|
|
36
41
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Socket/index.ts"],"names":[],"mappings":"AAAA,OAAqB,EAInB,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Socket/index.ts"],"names":[],"mappings":"AAAA,OAAqB,EAInB,QAAQ,EAGT,MAAM,SAAS,CAAC;AAMjB,OAAO,KAAK,EAEV,eAAe,EACf,cAAc,EACd,kBAAkB,EAEnB,MAAM,UAAU,CAAC;AAsHlB;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GAAU,KAAK,MAAM,kBAkB5C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,GAAG,QAEjD;AAkBD,eAAO,MAAM,YAAY,GACvB,kBAAuB,EACvB,UAAS,kBAAsC,KAC9C,OAAO,CAAC,QAAQ,CAqKlB,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,2BAA2B,GACtC,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,UAAS,kBAAuB,KAC/B,OAAO,CAAC,QAAQ,CAuNlB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,iCAjZf,kBAAkB,KAC1B,OAAO,CAAC,QAAQ,CAgZsB,CAAC;AA6C1C,eAAO,MAAM,aAAa,GAAU,WAAW,MAAM,kBAoCpD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,MAAM,EAAE,CAsBtD,CAAC;AAGF,eAAO,MAAM,iBAAiB,QAAO,MAAM,EAAiC,CAAC;AAE7E,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,QAAQ,GAAG,SACC,CAAC;AAEtD,eAAO,MAAM,oBAAoB,GAAU,8BAIxC;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,GAAG,CAAC;IACb,GAAG,CAAC,EAAE,GAAG,CAAC;CACX,KAAG,OAAO,CAAC,MAAM,CA4BjB,CAAC;AAsCF;;GAEG;AACH,eAAO,MAAM,uBAAuB,YAMnC,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,UAAU,CAAC,GAAG,EAAE,eAAe,KAAK,GAAG,SAExE,CAAC;AACF,eAAO,MAAM,WAAW,GACtB,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,KAAK,GAAG,SAGxE,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,UAAU,CAAC,SAAS,EAAE,MAAM,KAAK,GAAG,SAE/D,CAAC;AACF,eAAO,MAAM,cAAc,GAAI,UAAU,CAAC,SAAS,EAAE,MAAM,KAAK,GAAG,SAElE,CAAC;AACF,eAAO,MAAM,YAAY,GAAI,UAAU,CAAC,SAAS,EAAE,MAAM,KAAK,GAAG,SAEhE,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,CAAC,IAAI,EAAE,cAAc,KAAK,GAAG,SAEtE,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,GAAG,SAInD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,qBAcjC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,SAAQ,MAAqB,EAAE,iBAAgB,MAAe,SAG7F,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,UAAS,MAAyB,SAGnE,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,OAAO,CA4FlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,QAAa,OAAO,CAAC;IAAE,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAiBhG,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAO,MAAM,EAE/C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM;;;;;;CAajD,CAAC;AAGF,eAAO,MAAM,mBAAmB,GAAI,SAAS;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,SAEA,CAAC;AAGF,eAAO,MAAM,gBAAgB,GAC3B,WAAW,MAAM,EACjB,KAAK,MAAM,EACX,aAAY,OAAe,KAC1B,OAAO,CAAC,GAAG,CA8Bb,CAAC;AAGF,eAAO,MAAM,uBAAuB,GAAU,WAAW,MAAM,EAAE,KAAK,MAAM,kBAI3E,CAAC;AAGF,eAAO,MAAM,8BAA8B,GAAU,WAAW,MAAM,kBAGrE,CAAC;AAGF,eAAO,MAAM,0BAA0B,YAEtC,CAAC;AAMF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,WAAW,GAAU,WAAW,MAAM,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,mBAAmB,CAgD7F,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,WAAW,GAAU,WAAW,MAAM,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAiD3F,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,iBAAiB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,eAAe,EAAE,CA8CpF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,OAEzC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,OAExC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,aAAa,GAAU,WAAW,MAAM,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAqCzF,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,KAAK,GAAU,WAAW,MAAM,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAmBjF,CAAC"}
|
package/dist/Socket/index.js
CHANGED
|
@@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import makeWASocket, { Browsers, DisconnectReason, fetchLatestBaileysVersion, jidNormalizedUser } from "baileys";
|
|
10
|
+
import makeWASocket, { Browsers, DisconnectReason, fetchLatestBaileysVersion, jidNormalizedUser, downloadMediaMessage as baileysDownloadMediaMessage, } from "baileys";
|
|
11
11
|
import path from "path";
|
|
12
12
|
import fs from "fs";
|
|
13
13
|
import QRCode from "qrcode";
|
|
@@ -20,6 +20,7 @@ import { parseMessageStatusCodeToReadable } from "../Utils/message-status.js";
|
|
|
20
20
|
import { MongoClient } from "mongodb";
|
|
21
21
|
import { useMongoAuthState } from "../Utils/mongo-auth-state.js";
|
|
22
22
|
import { createDelay } from "../Utils/create-delay.js";
|
|
23
|
+
import { assertValidJidIdentifier, assertValidSessionId, maskSensitiveValue } from "../Utils/security.js";
|
|
23
24
|
const sessions = new Map();
|
|
24
25
|
/**
|
|
25
26
|
* Valid PlatformType values that WhatsApp recognizes
|
|
@@ -143,6 +144,7 @@ function initMongo() {
|
|
|
143
144
|
});
|
|
144
145
|
}
|
|
145
146
|
export const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (sessionId = "mysession", options = { printQR: true }) {
|
|
147
|
+
sessionId = assertValidSessionId(sessionId);
|
|
146
148
|
if (isSessionExistAndRunning(sessionId))
|
|
147
149
|
throw new WhatsappError(Messages.sessionAlreadyExist(sessionId));
|
|
148
150
|
yield initMongo();
|
|
@@ -310,6 +312,7 @@ export const startSession = (...args_1) => __awaiter(void 0, [...args_1], void 0
|
|
|
310
312
|
* @returns Promise<WASocket> The WhatsApp socket instance
|
|
311
313
|
*/
|
|
312
314
|
export const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_1) => __awaiter(void 0, [sessionId_1, phoneNumber_1, ...args_1], void 0, function* (sessionId, phoneNumber, options = {}) {
|
|
315
|
+
sessionId = assertValidSessionId(sessionId);
|
|
313
316
|
if (isSessionExistAndRunning(sessionId))
|
|
314
317
|
throw new WhatsappError(Messages.sessionAlreadyExist(sessionId));
|
|
315
318
|
// Simpan informasi session pairing code untuk auto-reconnect
|
|
@@ -353,7 +356,7 @@ export const startSessionWithPairingCode = (sessionId_1, phoneNumber_1, ...args_
|
|
|
353
356
|
const code = yield sock.requestPairingCode(phoneNumberFormatted);
|
|
354
357
|
// Pastikan kode ada dan merupakan string
|
|
355
358
|
if (code && typeof code === 'string') {
|
|
356
|
-
console.log(`Pairing code untuk session ${sessionId}: ${code}`);
|
|
359
|
+
console.log(`Pairing code untuk session ${sessionId}: ${maskSensitiveValue(code)}`);
|
|
357
360
|
// Panggil callback yang terdaftar
|
|
358
361
|
(_a = callback.get(CALLBACK_KEY.ON_PAIRING_CODE)) === null || _a === void 0 ? void 0 : _a(sessionId, code);
|
|
359
362
|
(_b = options.onPairingCode) === null || _b === void 0 ? void 0 : _b.call(options, code);
|
|
@@ -522,6 +525,7 @@ export const startWhatsapp = startSession;
|
|
|
522
525
|
* @param sessionId Session ID to soft delete
|
|
523
526
|
*/
|
|
524
527
|
const softDeleteSession = (sessionId_1, ...args_1) => __awaiter(void 0, [sessionId_1, ...args_1], void 0, function* (sessionId, preserveData = false) {
|
|
528
|
+
sessionId = assertValidSessionId(sessionId);
|
|
525
529
|
const session = getSession(sessionId);
|
|
526
530
|
try {
|
|
527
531
|
yield (session === null || session === void 0 ? void 0 : session.logout());
|
|
@@ -557,6 +561,7 @@ const softDeleteSession = (sessionId_1, ...args_1) => __awaiter(void 0, [session
|
|
|
557
561
|
}
|
|
558
562
|
});
|
|
559
563
|
export const deleteSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
564
|
+
sessionId = assertValidSessionId(sessionId);
|
|
560
565
|
const session = getSession(sessionId);
|
|
561
566
|
try {
|
|
562
567
|
yield (session === null || session === void 0 ? void 0 : session.logout());
|
|
@@ -615,8 +620,28 @@ export const getAllSession = () => __awaiter(void 0, void 0, void 0, function* (
|
|
|
615
620
|
});
|
|
616
621
|
// Untuk backward compatibility
|
|
617
622
|
export const getAllSessionSync = () => Array.from(sessions.keys());
|
|
618
|
-
export const getSession = (key) => sessions.get(key);
|
|
623
|
+
export const getSession = (key) => sessions.get(assertValidSessionId(key));
|
|
624
|
+
export const downloadMediaMessage = (_a) => __awaiter(void 0, [_a], void 0, function* ({ sessionId, message, key, }) {
|
|
625
|
+
const session = getSession(sessionId);
|
|
626
|
+
if (!session) {
|
|
627
|
+
throw new WhatsappError(Messages.sessionNotFound(sessionId));
|
|
628
|
+
}
|
|
629
|
+
if (!message) {
|
|
630
|
+
throw new WhatsappError("Message is required to download media");
|
|
631
|
+
}
|
|
632
|
+
try {
|
|
633
|
+
const buffer = yield baileysDownloadMediaMessage(message, "buffer", {}, {
|
|
634
|
+
logger: P,
|
|
635
|
+
reuploadRequest: session.updateMediaMessage,
|
|
636
|
+
});
|
|
637
|
+
return buffer;
|
|
638
|
+
}
|
|
639
|
+
catch (error) {
|
|
640
|
+
throw new WhatsappError(`Failed to download media: ${error.message || String(error)}`);
|
|
641
|
+
}
|
|
642
|
+
});
|
|
619
643
|
const isSessionExistAndRunning = (sessionId) => {
|
|
644
|
+
sessionId = assertValidSessionId(sessionId);
|
|
620
645
|
// Cek jika session sudah berjalan di memory
|
|
621
646
|
if (getSession(sessionId)) {
|
|
622
647
|
return true;
|
|
@@ -629,6 +654,7 @@ const isSessionExistAndRunning = (sessionId) => {
|
|
|
629
654
|
* @returns Boolean indicating if session should be loaded
|
|
630
655
|
*/
|
|
631
656
|
const shouldLoadSession = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
657
|
+
sessionId = assertValidSessionId(sessionId);
|
|
632
658
|
// Jika session sudah berjalan di memory, tidak perlu load lagi
|
|
633
659
|
if (getSession(sessionId)) {
|
|
634
660
|
return false;
|
|
@@ -726,6 +752,7 @@ export const setCredentialsDir = (dirname = "wa_credentials") => {
|
|
|
726
752
|
*/
|
|
727
753
|
export const reconnect = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
728
754
|
try {
|
|
755
|
+
sessionId = assertValidSessionId(sessionId);
|
|
729
756
|
// Cek jika session masih ada di memory
|
|
730
757
|
const existingSession = sessions.get(sessionId);
|
|
731
758
|
// Hapus session terlebih dahulu untuk menghindari konflik
|
|
@@ -842,6 +869,7 @@ export const getPairingCodeSessions = () => {
|
|
|
842
869
|
* @returns Object with session status information
|
|
843
870
|
*/
|
|
844
871
|
export const getSessionStatus = (sessionId) => {
|
|
872
|
+
sessionId = assertValidSessionId(sessionId);
|
|
845
873
|
const isRunning = !!getSession(sessionId);
|
|
846
874
|
const isPairingCodeSession = pairingCodeSessions.has(sessionId);
|
|
847
875
|
const retryAttempts = retryCount.get(sessionId) || 0;
|
|
@@ -859,6 +887,8 @@ export const setGroupCacheConfig = (options) => {
|
|
|
859
887
|
};
|
|
860
888
|
// Fungsi baru untuk mendapatkan atau memuat data grup dengan multi-session support
|
|
861
889
|
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) {
|
|
890
|
+
sessionId = assertValidSessionId(sessionId);
|
|
891
|
+
jid = assertValidJidIdentifier(jid, "jid");
|
|
862
892
|
// Get the session socket
|
|
863
893
|
const sock = getSession(sessionId);
|
|
864
894
|
if (!sock) {
|
|
@@ -887,10 +917,13 @@ export const getGroupMetadata = (sessionId_1, jid_1, ...args_1) => __awaiter(voi
|
|
|
887
917
|
});
|
|
888
918
|
// Fungsi baru untuk menghapus cache grup tertentu
|
|
889
919
|
export const clearGroupMetadataCache = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
920
|
+
sessionId = assertValidSessionId(sessionId);
|
|
921
|
+
jid = assertValidJidIdentifier(jid, "jid");
|
|
890
922
|
yield groupCache.delete(sessionId, jid);
|
|
891
923
|
});
|
|
892
924
|
// Fungsi untuk membersihkan seluruh cache grup untuk session tertentu
|
|
893
925
|
export const clearSessionGroupMetadataCache = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
926
|
+
sessionId = assertValidSessionId(sessionId);
|
|
894
927
|
yield groupCache.clearSessionCache(sessionId);
|
|
895
928
|
});
|
|
896
929
|
// Fungsi untuk membersihkan seluruh cache grup untuk semua session
|
|
@@ -922,6 +955,8 @@ export const clearAllGroupMetadataCache = () => {
|
|
|
922
955
|
*/
|
|
923
956
|
export const getPNForLID = (sessionId, lid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
924
957
|
var _a, _b;
|
|
958
|
+
sessionId = assertValidSessionId(sessionId);
|
|
959
|
+
lid = assertValidJidIdentifier(lid, "lid");
|
|
925
960
|
const session = getSession(sessionId);
|
|
926
961
|
if (!session) {
|
|
927
962
|
return {
|
|
@@ -989,6 +1024,7 @@ export const getPNForLID = (sessionId, lid) => __awaiter(void 0, void 0, void 0,
|
|
|
989
1024
|
*/
|
|
990
1025
|
export const getLIDForPN = (sessionId, pn) => __awaiter(void 0, void 0, void 0, function* () {
|
|
991
1026
|
var _a, _b;
|
|
1027
|
+
sessionId = assertValidSessionId(sessionId);
|
|
992
1028
|
const session = getSession(sessionId);
|
|
993
1029
|
if (!session) {
|
|
994
1030
|
return {
|
|
@@ -1054,6 +1090,7 @@ export const getLIDForPN = (sessionId, pn) => __awaiter(void 0, void 0, void 0,
|
|
|
1054
1090
|
* @note This may return an empty array if no mappings are available yet.
|
|
1055
1091
|
*/
|
|
1056
1092
|
export const getAllLIDMappings = (sessionId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1093
|
+
sessionId = assertValidSessionId(sessionId);
|
|
1057
1094
|
const session = getSession(sessionId);
|
|
1058
1095
|
if (!session) {
|
|
1059
1096
|
throw new WhatsappError(Messages.sessionNotFound(sessionId));
|
|
@@ -1145,6 +1182,7 @@ export const isPNFormat = (jid) => {
|
|
|
1145
1182
|
* ```
|
|
1146
1183
|
*/
|
|
1147
1184
|
export const toPhoneNumber = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1185
|
+
sessionId = assertValidSessionId(sessionId);
|
|
1148
1186
|
// Handle null/undefined input
|
|
1149
1187
|
if (!jid) {
|
|
1150
1188
|
return null;
|
|
@@ -1195,6 +1233,7 @@ export const toPhoneNumber = (sessionId, jid) => __awaiter(void 0, void 0, void
|
|
|
1195
1233
|
* ```
|
|
1196
1234
|
*/
|
|
1197
1235
|
export const toLID = (sessionId, jid) => __awaiter(void 0, void 0, void 0, function* () {
|
|
1236
|
+
sessionId = assertValidSessionId(sessionId);
|
|
1198
1237
|
// If already in LID format, return as-is
|
|
1199
1238
|
if (isLIDFormat(jid)) {
|
|
1200
1239
|
return jid;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-cache.d.ts","sourceRoot":"","sources":["../../src/Utils/group-cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"group-cache.d.ts","sourceRoot":"","sources":["../../src/Utils/group-cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAMxC,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAC5C,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAuB;IAGvC,OAAO;WAUO,WAAW,IAAI,kBAAkB;IAQlC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD,OAAO,CAAC,cAAc;IAKT,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAsCtE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B/E,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzD,SAAS,CAAC,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAU5D,KAAK,IAAI,IAAI;CAGrB;AAGD,eAAO,MAAM,UAAU,oBAAmC,CAAC"}
|
|
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import NodeCache from "node-cache";
|
|
11
11
|
import { MongoClient } from "mongodb";
|
|
12
12
|
import { CREDENTIALS } from "../Defaults/index.js";
|
|
13
|
+
import { assertValidJidIdentifier, assertValidSessionId } from "./security.js";
|
|
13
14
|
// Class untuk mengelola cache group metadata dengan pendekatan hybrid (NodeCache + MongoDB)
|
|
14
15
|
export class GroupMetadataCache {
|
|
15
16
|
// Konstruktor private untuk singleton pattern
|
|
@@ -58,8 +59,10 @@ export class GroupMetadataCache {
|
|
|
58
59
|
// Mendapatkan metadata grup dari cache atau MongoDB
|
|
59
60
|
get(sessionId, groupId) {
|
|
60
61
|
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
const safeSessionId = assertValidSessionId(sessionId);
|
|
63
|
+
const safeGroupId = assertValidJidIdentifier(groupId, "groupId");
|
|
61
64
|
// Buat kunci cache dengan kombinasi sessionId dan groupId
|
|
62
|
-
const cacheKey = this.createCacheKey(
|
|
65
|
+
const cacheKey = this.createCacheKey(safeSessionId, safeGroupId);
|
|
63
66
|
// Coba ambil dari cache memory dulu
|
|
64
67
|
const cachedData = this.cache.get(cacheKey);
|
|
65
68
|
if (cachedData) {
|
|
@@ -69,8 +72,8 @@ export class GroupMetadataCache {
|
|
|
69
72
|
if (this.mongoCollection) {
|
|
70
73
|
try {
|
|
71
74
|
const data = yield this.mongoCollection.findOne({
|
|
72
|
-
id:
|
|
73
|
-
sessionId:
|
|
75
|
+
id: safeGroupId,
|
|
76
|
+
sessionId: safeSessionId
|
|
74
77
|
});
|
|
75
78
|
if (data) {
|
|
76
79
|
// Hapus _id dari MongoDB yang tidak diperlukan
|
|
@@ -91,18 +94,20 @@ export class GroupMetadataCache {
|
|
|
91
94
|
// Menyimpan metadata grup ke cache dan MongoDB
|
|
92
95
|
set(sessionId, groupId, metadata) {
|
|
93
96
|
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
const safeSessionId = assertValidSessionId(sessionId);
|
|
98
|
+
const safeGroupId = assertValidJidIdentifier(groupId, "groupId");
|
|
94
99
|
// Buat kunci cache dengan kombinasi sessionId dan groupId
|
|
95
|
-
const cacheKey = this.createCacheKey(
|
|
100
|
+
const cacheKey = this.createCacheKey(safeSessionId, safeGroupId);
|
|
96
101
|
// Simpan ke cache memory
|
|
97
102
|
this.cache.set(cacheKey, metadata);
|
|
98
103
|
// Jika MongoDB tersedia, simpan juga ke MongoDB
|
|
99
104
|
if (this.mongoCollection) {
|
|
100
105
|
try {
|
|
101
106
|
// Tambahkan sessionId ke data yang disimpan
|
|
102
|
-
const dataToStore = Object.assign(Object.assign({}, metadata), { sessionId });
|
|
107
|
+
const dataToStore = Object.assign(Object.assign({}, metadata), { sessionId: safeSessionId });
|
|
103
108
|
yield this.mongoCollection.updateOne({
|
|
104
|
-
id:
|
|
105
|
-
sessionId:
|
|
109
|
+
id: safeGroupId,
|
|
110
|
+
sessionId: safeSessionId
|
|
106
111
|
}, { $set: dataToStore }, { upsert: true });
|
|
107
112
|
}
|
|
108
113
|
catch (error) {
|
|
@@ -114,16 +119,18 @@ export class GroupMetadataCache {
|
|
|
114
119
|
// Menghapus metadata grup dari cache dan MongoDB
|
|
115
120
|
delete(sessionId, groupId) {
|
|
116
121
|
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
+
const safeSessionId = assertValidSessionId(sessionId);
|
|
123
|
+
const safeGroupId = assertValidJidIdentifier(groupId, "groupId");
|
|
117
124
|
// Buat kunci cache dengan kombinasi sessionId dan groupId
|
|
118
|
-
const cacheKey = this.createCacheKey(
|
|
125
|
+
const cacheKey = this.createCacheKey(safeSessionId, safeGroupId);
|
|
119
126
|
// Hapus dari cache memory
|
|
120
127
|
this.cache.del(cacheKey);
|
|
121
128
|
// Jika MongoDB tersedia, hapus juga dari MongoDB
|
|
122
129
|
if (this.mongoCollection) {
|
|
123
130
|
try {
|
|
124
131
|
yield this.mongoCollection.deleteOne({
|
|
125
|
-
id:
|
|
126
|
-
sessionId:
|
|
132
|
+
id: safeGroupId,
|
|
133
|
+
sessionId: safeSessionId
|
|
127
134
|
});
|
|
128
135
|
}
|
|
129
136
|
catch (error) {
|
|
@@ -135,10 +142,11 @@ export class GroupMetadataCache {
|
|
|
135
142
|
// Menghapus semua cache untuk session tertentu
|
|
136
143
|
clearSessionCache(sessionId) {
|
|
137
144
|
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
+
const safeSessionId = assertValidSessionId(sessionId);
|
|
138
146
|
// Hapus dari MongoDB
|
|
139
147
|
if (this.mongoCollection) {
|
|
140
148
|
try {
|
|
141
|
-
yield this.mongoCollection.deleteMany({ sessionId:
|
|
149
|
+
yield this.mongoCollection.deleteMany({ sessionId: safeSessionId });
|
|
142
150
|
}
|
|
143
151
|
catch (error) {
|
|
144
152
|
console.error(`Error clearing session ${sessionId} cache from MongoDB:`, error);
|
|
@@ -147,7 +155,7 @@ export class GroupMetadataCache {
|
|
|
147
155
|
// Hapus dari memory cache
|
|
148
156
|
// Karena NodeCache tidak mendukung wildcard delete, kita harus mendapatkan semua kunci dulu
|
|
149
157
|
const allKeys = this.cache.keys();
|
|
150
|
-
const sessionKeys = allKeys.filter(key => key.startsWith(`${
|
|
158
|
+
const sessionKeys = allKeys.filter(key => key.startsWith(`${safeSessionId}:`));
|
|
151
159
|
sessionKeys.forEach(key => this.cache.del(key));
|
|
152
160
|
});
|
|
153
161
|
}
|
package/dist/Utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
package/dist/Utils/index.js
CHANGED
|
@@ -3,5 +3,6 @@ export * from "./is-exist.js";
|
|
|
3
3
|
export * from "./create-delay.js";
|
|
4
4
|
export * from "./group-cache.js";
|
|
5
5
|
export * from "./lid-utils.js";
|
|
6
|
+
export * from "./security.js";
|
|
6
7
|
// Note: setCredentialsDir & setMongoDBNames have been moved to src/Socket/index.ts
|
|
7
8
|
// Please import them directly from there instead
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mongo-auth-state.d.ts","sourceRoot":"","sources":["../../src/Utils/mongo-auth-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"mongo-auth-state.d.ts","sourceRoot":"","sources":["../../src/Utils/mongo-auth-state.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAwC1C,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;;;;kBAkC7D,CAAC,SAAS,MAAM,iBAAiB,QAAQ,CAAC,OAAO,MAAM,EAAE;;;2BAWhD,GAAG;;;;GAqB/B"}
|
|
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import { proto } from "baileys/WAProto/index.js";
|
|
11
11
|
import { Curve, signedKeyPair } from "baileys/lib/Utils/crypto.js";
|
|
12
12
|
import { generateRegistrationId } from "baileys/lib/Utils/generics.js";
|
|
13
|
+
import { assertValidSessionId } from "./security.js";
|
|
13
14
|
const BufferJSON = {
|
|
14
15
|
replacer: (_, value) => {
|
|
15
16
|
if (Buffer.isBuffer(value) || value instanceof Uint8Array || (value === null || value === void 0 ? void 0 : value.type) === "Buffer") {
|
|
@@ -47,17 +48,18 @@ const initAuthCreds = () => {
|
|
|
47
48
|
};
|
|
48
49
|
export function useMongoAuthState(sessionId, collection) {
|
|
49
50
|
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
const safeSessionId = assertValidSessionId(sessionId);
|
|
50
52
|
const readState = () => __awaiter(this, void 0, void 0, function* () {
|
|
51
|
-
const doc = yield collection.findOne({ sessionId });
|
|
53
|
+
const doc = yield collection.findOne({ sessionId: safeSessionId });
|
|
52
54
|
return (doc === null || doc === void 0 ? void 0 : doc.state)
|
|
53
55
|
? JSON.parse(JSON.stringify(doc.state), BufferJSON.reviver)
|
|
54
56
|
: null;
|
|
55
57
|
});
|
|
56
58
|
const writeState = (state) => __awaiter(this, void 0, void 0, function* () {
|
|
57
|
-
yield collection.updateOne({ sessionId }, { $set: { state: JSON.parse(JSON.stringify(state, BufferJSON.replacer)) } }, { upsert: true });
|
|
59
|
+
yield collection.updateOne({ sessionId: safeSessionId }, { $set: { state: JSON.parse(JSON.stringify(state, BufferJSON.replacer)) } }, { upsert: true });
|
|
58
60
|
});
|
|
59
61
|
const removeKey = (key) => __awaiter(this, void 0, void 0, function* () {
|
|
60
|
-
yield collection.updateOne({ sessionId }, { $unset: { [`state.keys.${key}`]: "" } });
|
|
62
|
+
yield collection.updateOne({ sessionId: safeSessionId }, { $unset: { [`state.keys.${key}`]: "" } });
|
|
61
63
|
});
|
|
62
64
|
const savedState = (yield readState()) || {};
|
|
63
65
|
const creds = savedState.creds || initAuthCreds();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-media.d.ts","sourceRoot":"","sources":["../../src/Utils/save-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"save-media.d.ts","sourceRoot":"","sources":["../../src/Utils/save-media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAU3C,eAAO,MAAM,gBAAgB,GAAU,KAAK,eAAe,EAAE,MAAM,MAAM,kBAOxE,CAAC;AACF,eAAO,MAAM,gBAAgB,GAAU,KAAK,eAAe,EAAE,MAAM,MAAM,kBAOxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,KAAK,eAAe,EACpB,MAAM,MAAM,kBAUb,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAU,KAAK,eAAe,EAAE,MAAM,MAAM,kBAOxE,CAAC"}
|
package/dist/Utils/save-media.js
CHANGED
|
@@ -10,8 +10,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
import { downloadMediaMessage } from "baileys";
|
|
11
11
|
import ValidationError from "./error.js";
|
|
12
12
|
import fs from "fs/promises";
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
import { assertSafeFilePath, sanitizeFileExtension } from "./security.js";
|
|
14
|
+
const saveMedia = (filePath, data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
|
+
const safePath = assertSafeFilePath(filePath);
|
|
16
|
+
yield fs.writeFile(safePath, data.toString("base64"), "base64");
|
|
15
17
|
});
|
|
16
18
|
export const saveImageHandler = (msg, path) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
19
|
var _a;
|
|
@@ -32,8 +34,8 @@ export const saveDocumentHandler = (msg, path) => __awaiter(void 0, void 0, void
|
|
|
32
34
|
if (!((_a = msg.message) === null || _a === void 0 ? void 0 : _a.documentMessage))
|
|
33
35
|
throw new ValidationError("Message is not contain Document");
|
|
34
36
|
const buf = yield downloadMediaMessage(msg, "buffer", {});
|
|
35
|
-
const ext = (_b = msg.message.documentMessage.fileName) === null || _b === void 0 ? void 0 : _b.split(".").pop();
|
|
36
|
-
path
|
|
37
|
+
const ext = sanitizeFileExtension((_b = msg.message.documentMessage.fileName) === null || _b === void 0 ? void 0 : _b.split(".").pop());
|
|
38
|
+
path = `${assertSafeFilePath(path)}.${ext}`;
|
|
37
39
|
return saveMedia(path, buf);
|
|
38
40
|
});
|
|
39
41
|
export const saveAudioHandler = (msg, path) => __awaiter(void 0, void 0, void 0, function* () {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const assertValidIdentifier: (value: string, fieldName: string) => string;
|
|
2
|
+
export declare const assertValidSessionId: (sessionId: string) => string;
|
|
3
|
+
export declare const assertValidJidIdentifier: (value: string, fieldName: string) => string;
|
|
4
|
+
export declare const assertSafeFilePath: (filePath: string) => string;
|
|
5
|
+
export declare const sanitizeFileExtension: (extension?: string) => string;
|
|
6
|
+
export declare const maskSensitiveValue: (value: string, visibleChars?: number) => string;
|
|
7
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/Utils/security.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,MAQxE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,WAAW,MAAM,KAAG,MACV,CAAC;AAEhD,eAAO,MAAM,wBAAwB,GAAI,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,MAQ3E,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,MAiBrD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,KAAG,MAK1D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO,MAAM,EAAE,qBAAgB,KAAG,MAKpE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { WhatsappError } from "../Error/index.js";
|
|
3
|
+
const SAFE_IDENTIFIER_PATTERN = /^[A-Za-z0-9_-]{1,128}$/;
|
|
4
|
+
const SAFE_JID_IDENTIFIER_PATTERN = /^[A-Za-z0-9_@.:-]{1,192}$/;
|
|
5
|
+
export const assertValidIdentifier = (value, fieldName) => {
|
|
6
|
+
if (typeof value !== "string" || !SAFE_IDENTIFIER_PATTERN.test(value)) {
|
|
7
|
+
throw new WhatsappError(`${fieldName} hanya boleh berisi huruf, angka, underscore, atau dash dengan panjang 1-128 karakter`);
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
};
|
|
11
|
+
export const assertValidSessionId = (sessionId) => assertValidIdentifier(sessionId, "sessionId");
|
|
12
|
+
export const assertValidJidIdentifier = (value, fieldName) => {
|
|
13
|
+
if (typeof value !== "string" || !SAFE_JID_IDENTIFIER_PATTERN.test(value)) {
|
|
14
|
+
throw new WhatsappError(`${fieldName} berisi karakter tidak valid atau melebihi 192 karakter`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
};
|
|
18
|
+
export const assertSafeFilePath = (filePath) => {
|
|
19
|
+
if (typeof filePath !== "string" || filePath.trim().length === 0) {
|
|
20
|
+
throw new WhatsappError("File path is required");
|
|
21
|
+
}
|
|
22
|
+
if (filePath.includes("\0")) {
|
|
23
|
+
throw new WhatsappError("File path contains invalid characters");
|
|
24
|
+
}
|
|
25
|
+
const normalized = path.normalize(filePath);
|
|
26
|
+
const baseName = path.basename(normalized);
|
|
27
|
+
if (!baseName || baseName === "." || baseName === "..") {
|
|
28
|
+
throw new WhatsappError("File path must include a valid file name");
|
|
29
|
+
}
|
|
30
|
+
return normalized;
|
|
31
|
+
};
|
|
32
|
+
export const sanitizeFileExtension = (extension) => {
|
|
33
|
+
if (!extension)
|
|
34
|
+
return "bin";
|
|
35
|
+
const cleanExtension = extension.replace(/[^A-Za-z0-9]/g, "").slice(0, 16);
|
|
36
|
+
return cleanExtension || "bin";
|
|
37
|
+
};
|
|
38
|
+
export const maskSensitiveValue = (value, visibleChars = 2) => {
|
|
39
|
+
if (!value)
|
|
40
|
+
return "";
|
|
41
|
+
if (value.length <= visibleChars * 2)
|
|
42
|
+
return "*".repeat(value.length);
|
|
43
|
+
return `${value.slice(0, visibleChars)}${"*".repeat(value.length - visibleChars * 2)}${value.slice(-visibleChars)}`;
|
|
44
|
+
};
|
|
@@ -31,6 +31,11 @@ export declare const deleteSession: (sessionId: string) => Promise<void>;
|
|
|
31
31
|
export declare const getAllSession: () => Promise<string[]>;
|
|
32
32
|
export declare const getAllSessionSync: () => string[];
|
|
33
33
|
export declare const getSession: (key: string) => WASocket | undefined;
|
|
34
|
+
export declare const downloadMediaMessage: ({ sessionId, message, key, }: {
|
|
35
|
+
sessionId: string;
|
|
36
|
+
message: any;
|
|
37
|
+
key?: any;
|
|
38
|
+
}) => Promise<Buffer>;
|
|
34
39
|
/**
|
|
35
40
|
* @deprecated Use loadSessionsFromMongo instead
|
|
36
41
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Socket/index.ts"],"names":[],"mappings":"AAAA,OAAqB,EAInB,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Socket/index.ts"],"names":[],"mappings":"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"}
|