@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.
@@ -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
- return cachedId;
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
- const result = await sock.executeUSyncQuery(query);
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
  };
@@ -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
- const _0x = [
12
- "Z2ludG9raQ==",
13
- "dHlwZQ==",
14
- "bWQ=",
15
- "d3M=",
16
- "c2VuZE1lc3NhZ2U=",
17
- "dXNlcg==",
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
- const v = _0xobj[k];
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 _0xout;
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
+ };
@@ -2,3 +2,4 @@ export * from "./USyncDeviceProtocol.js";
2
2
  export * from "./USyncContactProtocol.js";
3
3
  export * from "./USyncStatusProtocol.js";
4
4
  export * from "./USyncDisappearingModeProtocol.js";
5
+ export * from "./USyncUsernameProtocol.js";
@@ -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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prototypevip/baileys",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "A simple fork of Baileys for WhatsApp automation",
5
5
  "main": "lib/index.js",
6
6
  "type": "module",