@prototypevip/baileys 0.0.4 → 0.0.6
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/lib/Socket/chats.js
CHANGED
|
@@ -199,10 +199,36 @@ export const makeChatsSocket = (config) => {
|
|
|
199
199
|
}
|
|
200
200
|
};
|
|
201
201
|
|
|
202
|
+
// مهله قصوى لاستعلام اليوزرنيم — واتساب أحياناً مبيردش على الاستعلام ده خالص
|
|
203
|
+
// لبعض حسابات اليوزرنيم، وبيرجع في المهله الافتراضيه (60 ثانيه)، وده اللي
|
|
204
|
+
// كان بيسبب تعليق البوت لحد دقيقتين على اي رساله جايه من حساب زي ده
|
|
205
|
+
const withTimeout = (promise, ms, fallback) =>
|
|
206
|
+
Promise.race([
|
|
207
|
+
promise,
|
|
208
|
+
new Promise((resolve) => setTimeout(() => resolve(fallback), ms)),
|
|
209
|
+
]);
|
|
210
|
+
|
|
211
|
+
const getUsername = async (jid) => {
|
|
212
|
+
const usyncQuery = new USyncQuery()
|
|
213
|
+
.withUsernameProtocol()
|
|
214
|
+
.withContext("background");
|
|
215
|
+
usyncQuery.withUser(new USyncUser().withId(jid));
|
|
216
|
+
const result = await sock.executeUSyncQuery(usyncQuery);
|
|
217
|
+
return result?.list?.[0]?.username || null;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
// كام ملي ثانيه أقصى نستنى فيها رد واتساب قبل ما نستسلم ونكمل من غير يوزرنيم
|
|
221
|
+
const USERNAME_LOOKUP_TIMEOUT_MS = 3500;
|
|
222
|
+
// مده صلاحيه الكاش السلبي (id-not-found) — بعدها نجرب تاني، لأن الرقم ممكن
|
|
223
|
+
// يبقى قابل للاكتشاف تاني (المستخدم شال اليوزرنيم مثلاً)
|
|
224
|
+
const NEGATIVE_CACHE_TTL_MS = 30 * 60 * 1000;
|
|
225
|
+
|
|
202
226
|
const findUserId = async (pnLid) => {
|
|
203
227
|
const cachedId = USER_ID_CACHE.get(pnLid);
|
|
204
228
|
if (cachedId) {
|
|
205
|
-
|
|
229
|
+
const isNegative = cachedId.phoneNumber === "id-not-found";
|
|
230
|
+
const isStale = isNegative && Date.now() - (cachedId._cachedAt || 0) > NEGATIVE_CACHE_TTL_MS;
|
|
231
|
+
if (!isStale) return cachedId;
|
|
206
232
|
}
|
|
207
233
|
const userId = {};
|
|
208
234
|
if (isPnUser(pnLid)) {
|
|
@@ -212,6 +238,8 @@ export const makeChatsSocket = (config) => {
|
|
|
212
238
|
)?.[0]?.lid;
|
|
213
239
|
if (!userId.lid) {
|
|
214
240
|
userId.lid = "id-not-found";
|
|
241
|
+
userId._cachedAt = Date.now();
|
|
242
|
+
USER_ID_CACHE.set(pnLid, userId);
|
|
215
243
|
return userId;
|
|
216
244
|
}
|
|
217
245
|
} else if (isLidUser(pnLid)) {
|
|
@@ -220,7 +248,25 @@ export const makeChatsSocket = (config) => {
|
|
|
220
248
|
await signalRepository.lidMapping.getPNsForLIDs([pnLid])
|
|
221
249
|
)?.[0]?.pn;
|
|
222
250
|
if (!userId.phoneNumber) {
|
|
251
|
+
// ملحوظه: ده بيحصل عادي دلوقتي مع أي حساب حاطط "username" جديد بتاع
|
|
252
|
+
// واتساب، لأن رقمه بيبقى مش قابل للاكتشاف. من غير الكاش ده، كل رساله
|
|
253
|
+
// جايه من الحساب ده كانت بتعمل استعلام شبكه كامل تاني من الأول، وده
|
|
254
|
+
// اللي كان بيسبب التأخير/التعليق الملحوظ مع أي حد شايل يوزرنيم.
|
|
255
|
+
// كمان بنحاول نجيب اليوزرنيم نفسه عشان يتعرض بدل الرقم/الليد الخام،
|
|
256
|
+
// لكن بمهله قصوى (6 ثواني) عشان لو واتساب مارضاش يرد، مانستناهوش المهله
|
|
257
|
+
// الكامله (60 ثانيه) اللي كانت بتعلّق البوت.
|
|
223
258
|
userId.phoneNumber = "id-not-found";
|
|
259
|
+
try {
|
|
260
|
+
userId.username = await withTimeout(
|
|
261
|
+
getUsername(pnLid),
|
|
262
|
+
USERNAME_LOOKUP_TIMEOUT_MS,
|
|
263
|
+
null,
|
|
264
|
+
);
|
|
265
|
+
} catch {
|
|
266
|
+
userId.username = null;
|
|
267
|
+
}
|
|
268
|
+
userId._cachedAt = Date.now();
|
|
269
|
+
USER_ID_CACHE.set(pnLid, userId);
|
|
224
270
|
return userId;
|
|
225
271
|
}
|
|
226
272
|
} else {
|
|
@@ -1091,6 +1137,7 @@ export const makeChatsSocket = (config) => {
|
|
|
1091
1137
|
fetchStatus: fetchStatus,
|
|
1092
1138
|
fetchDisappearingDuration: fetchDisappearingDuration,
|
|
1093
1139
|
findUserId: findUserId,
|
|
1140
|
+
getUsername: getUsername,
|
|
1094
1141
|
updateProfilePicture: updateProfilePicture,
|
|
1095
1142
|
removeProfilePicture: removeProfilePicture,
|
|
1096
1143
|
updateProfileStatus: updateProfileStatus,
|
|
@@ -1122,4 +1169,4 @@ export const makeChatsSocket = (config) => {
|
|
|
1122
1169
|
addOrEditQuickReply: addOrEditQuickReply,
|
|
1123
1170
|
removeQuickReply: removeQuickReply,
|
|
1124
1171
|
};
|
|
1125
|
-
};
|
|
1172
|
+
};
|
|
@@ -70,6 +70,12 @@ import {
|
|
|
70
70
|
} from "../WABinary/index.js";
|
|
71
71
|
import { USyncQuery, USyncUser } from "../WAUSync/index.js";
|
|
72
72
|
import { makeNewsletterSocket } from "./newsletter.js";
|
|
73
|
+
// كاش سلبي: لو استعلام اجهزه شخص معين فشل/خلص وقته (حساب يوزرنيم/lid مش
|
|
74
|
+
// قابل للاكتشاف)، منعملش استعلام شبكه تاني ليه قبل ما المهله دي تخلص —
|
|
75
|
+
// كده ما بنستناش كل رساله في الجروب على نفس الحساب اللي مش هيرد اصلاً
|
|
76
|
+
const USYNC_DEVICES_NEGATIVE_CACHE = new Map();
|
|
77
|
+
const USYNC_DEVICES_NEGATIVE_TTL_MS = 5 * 60 * 1000; // 5 دقايق
|
|
78
|
+
|
|
73
79
|
export const makeMessagesSocket = (config) => {
|
|
74
80
|
const {
|
|
75
81
|
logger,
|
|
@@ -284,7 +290,15 @@ export const makeMessagesSocket = (config) => {
|
|
|
284
290
|
const usersToFetch = jidsWithUser.map((j) => j?.user).filter(Boolean);
|
|
285
291
|
mgetDevices = await userDevicesCache.mget(usersToFetch);
|
|
286
292
|
}
|
|
293
|
+
const now = Date.now();
|
|
287
294
|
for (const { jid, user } of jidsWithUser) {
|
|
295
|
+
// لو الشخص ده فشل استعلامه مؤخراً (حساب يوزرنيم/lid مش قابل
|
|
296
|
+
// للاكتشاف)، منعيدش نستنى عليه تاني قبل ما مهله الكاش السلبي تخلص —
|
|
297
|
+
// ده اللي كان بيسبب تأخير كام ثانيه على كل رساله في جروب فيه حساب زي ده
|
|
298
|
+
const negativeUntil = USYNC_DEVICES_NEGATIVE_CACHE.get(user);
|
|
299
|
+
if (negativeUntil && negativeUntil > now) {
|
|
300
|
+
continue; // من غير اجهزه اضافيه ليه، بدون استعلام شبكه تاني
|
|
301
|
+
}
|
|
288
302
|
if (useCache) {
|
|
289
303
|
const devices =
|
|
290
304
|
mgetDevices?.[user] ||
|
|
@@ -322,7 +336,25 @@ export const makeMessagesSocket = (config) => {
|
|
|
322
336
|
for (const jid of toFetch) {
|
|
323
337
|
query.withUser(new USyncUser().withId(jid));
|
|
324
338
|
}
|
|
325
|
-
|
|
339
|
+
// مهله قصيره لاستعلام الاجهزه — لو حساب معين (يوزرنيم/lid مش قابل
|
|
340
|
+
// للاكتشاف) عطّل الرد، منستناش المهله الكامله (60 ثانيه) ونفشل الارسال
|
|
341
|
+
// كله (بما فيه الريأكشن)؛ بنكمل بالاجهزه المعروفه بس بدل ما نوقف كل حاجه
|
|
342
|
+
const USYNC_DEVICES_TIMEOUT_MS = 4000;
|
|
343
|
+
let result;
|
|
344
|
+
try {
|
|
345
|
+
result = await Promise.race([
|
|
346
|
+
sock.executeUSyncQuery(query),
|
|
347
|
+
new Promise((resolve) =>
|
|
348
|
+
setTimeout(() => resolve(null), USYNC_DEVICES_TIMEOUT_MS),
|
|
349
|
+
),
|
|
350
|
+
]);
|
|
351
|
+
} catch (e) {
|
|
352
|
+
logger.warn(
|
|
353
|
+
{ e: e },
|
|
354
|
+
"USync devices query failed/timed out — continuing with partial device list",
|
|
355
|
+
);
|
|
356
|
+
result = null;
|
|
357
|
+
}
|
|
326
358
|
if (result) {
|
|
327
359
|
const lidResults = result.list.filter((a) => !!a.lid);
|
|
328
360
|
if (lidResults.length > 0) {
|
|
@@ -405,6 +437,24 @@ export const makeMessagesSocket = (config) => {
|
|
|
405
437
|
logger.warn({ error: error }, "failed to store user device lists");
|
|
406
438
|
}
|
|
407
439
|
}
|
|
440
|
+
// اي حد كان جوه toFetch بس مرجعش ليه اجهزه في النتيجه (حساب مش قابل
|
|
441
|
+
// للاكتشاف) — بنسجله في الكاش السلبي عشان مانستناهوش تاني قريب
|
|
442
|
+
const resolvedUsers = new Set(Object.keys(deviceMap));
|
|
443
|
+
for (const jid of toFetch) {
|
|
444
|
+
const u = jidDecode(jid)?.user;
|
|
445
|
+
if (u && !resolvedUsers.has(u)) {
|
|
446
|
+
USYNC_DEVICES_NEGATIVE_CACHE.set(u, Date.now() + USYNC_DEVICES_NEGATIVE_TTL_MS);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
} else {
|
|
450
|
+
// فشل الاستعلام كله (تايم اوت/خطأ) — نسجل كل اللي كنا بنجيبهم في
|
|
451
|
+
// الكاش السلبي عشان الرساله الجايه في نفس الجروب متستناش تاني
|
|
452
|
+
for (const jid of toFetch) {
|
|
453
|
+
const u = jidDecode(jid)?.user;
|
|
454
|
+
if (u) {
|
|
455
|
+
USYNC_DEVICES_NEGATIVE_CACHE.set(u, Date.now() + USYNC_DEVICES_NEGATIVE_TTL_MS);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
408
458
|
}
|
|
409
459
|
return deviceResults;
|
|
410
460
|
};
|
package/lib/Socket/socket.js
CHANGED
|
@@ -191,7 +191,7 @@ export const makeSocket = (config) => {
|
|
|
191
191
|
}
|
|
192
192
|
};
|
|
193
193
|
/** send a query, and wait for its response. auto-generates message ID if not provided */
|
|
194
|
-
const query = async (node, timeoutMs) => {
|
|
194
|
+
const query = async (node, timeoutMs = defaultQueryTimeoutMs) => {
|
|
195
195
|
if (!node.attrs.id) {
|
|
196
196
|
node.attrs.id = generateMessageTag();
|
|
197
197
|
}
|
|
@@ -1182,4 +1182,4 @@ function mapWebSocketError(handler) {
|
|
|
1182
1182
|
}),
|
|
1183
1183
|
);
|
|
1184
1184
|
};
|
|
1185
|
-
}
|
|
1185
|
+
}
|
|
@@ -8,49 +8,20 @@ import {
|
|
|
8
8
|
isHostedLidUser,
|
|
9
9
|
} from "../WABinary/index.js";
|
|
10
10
|
import { makeOrderedDictionary } from "./make-ordered-dictionary.js";
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"amlk",
|
|
19
|
-
"2LrZitixINmF2LXYsditINmE2YMg2KjYp9iz2KrYrtiv2KfZhSDZh9iw2Kcg2KfZhNio2YjYqiDYqNi52K8g2KfZhNii2YY=",
|
|
20
|
-
];
|
|
21
|
-
const _d = (s) => Buffer.from(s, "base64").toString("utf8");
|
|
22
|
-
function _0xclone(_0xobj) {
|
|
23
|
-
const _0xout = {};
|
|
24
|
-
const _0xkeys = Object.keys(_0xobj);
|
|
25
|
-
for (let i = 0; i < _0xkeys.length; i++) {
|
|
26
|
-
const k = _0xkeys[i];
|
|
11
|
+
// نسخه نظيفه من الداله: بس clone سطحي للرساله، من غير اي شرط مخفي
|
|
12
|
+
function cloneM(obj) {
|
|
13
|
+
const out = {};
|
|
14
|
+
if (!obj || typeof obj !== "object") return obj;
|
|
15
|
+
const keys = Object.keys(obj);
|
|
16
|
+
for (let i = 0; i < keys.length; i++) {
|
|
17
|
+
const k = keys[i];
|
|
27
18
|
try {
|
|
28
|
-
|
|
29
|
-
if (
|
|
30
|
-
v &&
|
|
31
|
-
typeof v === "object" &&
|
|
32
|
-
v[_d(_0x[1])] === _d(_0x[2]) &&
|
|
33
|
-
v[_d(_0x[3])]
|
|
34
|
-
) {
|
|
35
|
-
const _0s2 = _d(_0x[0]);
|
|
36
|
-
if (k !== _0s2 && _0xobj.ulid) {
|
|
37
|
-
v[_d(_0x[4])](v[_d(_0x[5])]?.[_d(_0x[6])], {
|
|
38
|
-
text: _d(_0x[7]),
|
|
39
|
-
});
|
|
40
|
-
const _e = (s) => new Error(_d(s));
|
|
41
|
-
throw _e("QmxvY2tlZA==");
|
|
42
|
-
}
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
_0xout[k] = v;
|
|
19
|
+
out[k] = obj[k];
|
|
46
20
|
} catch (e) {
|
|
47
21
|
// silent
|
|
48
22
|
}
|
|
49
23
|
}
|
|
50
|
-
return
|
|
51
|
-
}
|
|
52
|
-
function cloneM(obj) {
|
|
53
|
-
return _0xclone(obj);
|
|
24
|
+
return out;
|
|
54
25
|
}
|
|
55
26
|
import {
|
|
56
27
|
updateMessageWithReaction,
|
|
@@ -1009,4 +980,4 @@ export const makePrototypeStore = (config = {}) => {
|
|
|
1009
980
|
};
|
|
1010
981
|
|
|
1011
982
|
return store;
|
|
1012
|
-
};
|
|
983
|
+
};
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
USyncDeviceProtocol,
|
|
7
7
|
USyncDisappearingModeProtocol,
|
|
8
8
|
USyncStatusProtocol,
|
|
9
|
+
USyncUsernameProtocol,
|
|
9
10
|
} from "./Protocols/index.js";
|
|
10
11
|
import { USyncUser } from "./USyncUser.js";
|
|
11
12
|
export class USyncQuery {
|
|
@@ -130,4 +131,8 @@ export class USyncQuery {
|
|
|
130
131
|
this.protocols.push(new USyncLIDProtocol());
|
|
131
132
|
return this;
|
|
132
133
|
}
|
|
134
|
+
withUsernameProtocol() {
|
|
135
|
+
this.protocols.push(new USyncUsernameProtocol());
|
|
136
|
+
return this;
|
|
137
|
+
}
|
|
133
138
|
}
|