@crysnovax/baileys 2.0.0 → 2.5.2

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.
@@ -2,7 +2,7 @@ import { proto } from '../../WAProto/index.js';
2
2
  import { makeLibSignalRepository } from '../Signal/libsignal.js';
3
3
  import { Browsers } from '../Utils/browser-utils.js';
4
4
  import logger from '../Utils/logger.js';
5
- const version = [2, 3000, 1037013887];
5
+ const version = [2, 3000, 1040735178];
6
6
  export const UNAUTHORIZED_CODES = [401, 403, 419];
7
7
  export const BIZ_BOT_SUPPORT_PAYLOAD = '{"version":1,"is_ai_message":true,"should_upload_client_logs":false,"should_show_system_message":false,"ticket_id":"7004947587700716","citation_items":[],"ticket_locale":"us"}';
8
8
  export const DEFAULT_ORIGIN = 'https://web.whatsapp.com';
@@ -48,7 +48,7 @@ export const DEFAULT_CONNECTION_CONFIG = {
48
48
  browser: Browsers.macOS('Chrome'),
49
49
  waWebSocketUrl: 'wss://web.whatsapp.com/ws/chat',
50
50
  connectTimeoutMs: 20000,
51
- keepAliveIntervalMs: 30000,
51
+ keepAliveIntervalMs: 15000,
52
52
  logger: logger.child({ class: 'baileys' }),
53
53
  emitOwnEvents: true,
54
54
  defaultQueryTimeoutMs: 60000,
@@ -66,7 +66,7 @@ export const DEFAULT_CONNECTION_CONFIG = {
66
66
  shouldIgnoreJid: () => false,
67
67
  linkPreviewImageThumbnailWidth: 192,
68
68
  transactionOpts: { maxCommitRetries: 10, delayBetweenTriesMs: 3000 },
69
- generateHighQualityLinkPreview: false,
69
+ generateHighQualityLinkPreview: true,
70
70
  enableAutoSessionRecreation: true,
71
71
  enableRecentMessageCache: true,
72
72
  options: {},
@@ -87,13 +87,16 @@ export const MEDIA_PATH_MAP = {
87
87
  sticker: '/mms/image',
88
88
  'sticker-pack': '/mms/sticker-pack',
89
89
  'thumbnail-sticker-pack': '/mms/thumbnail-sticker-pack',
90
- 'thumbnail-link': '/mms/thumbnail-link',
90
+ 'thumbnail-link': '/mms/image',
91
+ 'thumbnail-image': '/mms/image',
92
+ 'thumbnail-video': '/mms/video',
93
+ 'thumbnail-document': '/mms/document',
91
94
  'product-catalog-image': '/product/image',
92
95
  'md-app-state': '',
93
96
  'md-msg-hist': '/mms/md-app-state',
94
97
  'biz-cover-photo': '/pps/biz-cover-photo'
95
98
  };
96
- // Lia@Changes 06-02-26 --- Add newsletter media path for "/m1/" instead of "/o1/" (⁠≧⁠▽⁠≦⁠)
99
+ // crysnovax@Changes 06-02-26 --- Add newsletter media path for "/m1/" instead of "/o1/" (⁠≧⁠▽⁠≦⁠)
97
100
  export const NEWSLETTER_MEDIA_PATH_MAP = {
98
101
  image: '/newsletter/newsletter-image',
99
102
  video: '/newsletter/newsletter-video',
@@ -120,22 +123,26 @@ export const MEDIA_HKDF_KEY_MAPPING = {
120
123
  'thumbnail-link': 'Link Thumbnail',
121
124
  'md-msg-hist': 'History',
122
125
  'md-app-state': 'App State',
123
- 'product-catalog-image': '',
126
+ 'product-catalog-image': 'Product Catalog Image',
124
127
  'payment-bg-image': 'Payment Background',
125
128
  ptv: 'Video',
126
- 'biz-cover-photo': 'Image'
129
+ 'biz-cover-photo': 'Image',
130
+ location: 'Location',
131
+ contact: 'Contact',
132
+ 'voip-token': 'Voip Token'
127
133
  };
128
134
  export const MEDIA_KEYS = Object.keys(MEDIA_PATH_MAP);
129
- export const MIN_PREKEY_COUNT = 5;
130
- export const INITIAL_PREKEY_COUNT = 812;
131
- export const UPLOAD_TIMEOUT = 30000; // 30 seconds
132
- export const MIN_UPLOAD_INTERVAL = 5000; // 5 seconds minimum between uploads
133
135
  export const DEFAULT_CACHE_TTLS = {
134
136
  SIGNAL_STORE: 5 * 60, // 5 minutes
135
137
  MSG_RETRY: 60 * 60, // 1 hour
136
138
  CALL_OFFER: 5 * 60, // 5 minutes
137
139
  USER_DEVICES: 5 * 60 // 5 minutes
138
140
  };
141
+ /** 120s timeout for history sync stall detection, same as WA Web's handleChunkProgress / restartPausedTimer (g = 120) */
142
+ export const HISTORY_SYNC_PAUSED_TIMEOUT_MS = 120000;
143
+ export const MIN_PREKEY_COUNT = 5;
144
+ export const INITIAL_PREKEY_COUNT = 812;
145
+ export const UPLOAD_TIMEOUT = 30000; // 30 seconds
139
146
  export const TimeMs = {
140
147
  Minute: 60 * 1000,
141
148
  Hour: 60 * 60 * 1000,
@@ -146,3 +153,4 @@ export const BOT_RENDERING_CONFIG_METADATA = {
146
153
  bloksVersioningId: '0903aa5f7f47de66789d5f4c86d3bd6e05e4bc3ff85e454a9f907d5ed7fef97c',
147
154
  pixelDensity: 2.75
148
155
  };
156
+
@@ -40,6 +40,16 @@ export function makeLibSignalRepository(auth, logger, pnToLIDFunc) {
40
40
  ttlAutopurge: true,
41
41
  updateAgeOnGet: true
42
42
  });
43
+ const ensureSenderKeyAndCreateSkdm = async (group, meId) => {
44
+ const senderName = jidToSignalSenderKeyName(group, meId);
45
+ const senderNameStr = senderName.toString();
46
+ const { [senderNameStr]: senderKey } = await auth.keys.get('sender-key', [senderNameStr]);
47
+ if (!senderKey) {
48
+ await storage.storeSenderKey(senderName, new SenderKeyRecord());
49
+ }
50
+ const skdm = await new GroupSessionBuilder(storage).create(senderName);
51
+ return { senderName, skdm };
52
+ };
43
53
  const repository = {
44
54
  decryptGroupMessage({ group, authorJid, msg }) {
45
55
  const senderName = jidToSignalSenderKeyName(group, authorJid);
@@ -112,27 +122,43 @@ export function makeLibSignalRepository(auth, logger, pnToLIDFunc) {
112
122
  }, jid);
113
123
  },
114
124
  async encryptGroupMessage({ group, meId, data }) {
115
- const senderName = jidToSignalSenderKeyName(group, meId);
116
- const builder = new GroupSessionBuilder(storage);
117
- const senderNameStr = senderName.toString();
118
125
  return parsedKeys.transaction(async () => {
119
- const { [senderNameStr]: senderKey } = await auth.keys.get('sender-key', [senderNameStr]);
120
- if (!senderKey) {
121
- await storage.storeSenderKey(senderName, new SenderKeyRecord());
122
- }
123
- const senderKeyDistributionMessage = await builder.create(senderName);
124
- const session = new GroupCipher(storage, senderName);
125
- const ciphertext = await session.encrypt(data);
126
- return {
127
- ciphertext,
128
- senderKeyDistributionMessage: senderKeyDistributionMessage.serialize()
129
- };
126
+ const { senderName, skdm } = await ensureSenderKeyAndCreateSkdm(group, meId);
127
+ const ciphertext = await new GroupCipher(storage, senderName).encrypt(data);
128
+ return { ciphertext, senderKeyDistributionMessage: skdm.serialize() };
130
129
  }, group);
131
130
  },
131
+ async getSenderKeyDistributionMessage({ group, meId }) {
132
+ return parsedKeys.transaction(async () => {
133
+ const { skdm } = await ensureSenderKeyAndCreateSkdm(group, meId);
134
+ return skdm.serialize();
135
+ }, group);
136
+ },
137
+ async hasSenderKey({ group, meId }) {
138
+ const senderName = jidToSignalSenderKeyName(group, meId).toString();
139
+ const { [senderName]: key } = await auth.keys.get('sender-key', [senderName]);
140
+ return !!key;
141
+ },
142
+ async getSessionInfo(jid) {
143
+ const addr = jidToSignalProtocolAddress(jid).toString();
144
+ const session = (await storage.loadSession(addr));
145
+ if (!session) {
146
+ return null;
147
+ }
148
+ const open = session.getOpenSession?.();
149
+ const baseKey = open?.indexInfo?.baseKey;
150
+ const registrationId = open?.registrationId;
151
+ if (!baseKey || typeof registrationId !== 'number') {
152
+ return null;
153
+ }
154
+ return { baseKey: new Uint8Array(baseKey), registrationId };
155
+ },
132
156
  async injectE2ESession({ jid, session }) {
133
157
  logger.trace({ jid }, 'injecting E2EE session');
134
158
  const cipher = new libsignal.SessionBuilder(storage, jidToSignalProtocolAddress(jid));
135
159
  return parsedKeys.transaction(async () => {
160
+ // libsignal runtime accepts an absent prekey (initOutgoing checks `device.preKey && ...`)
161
+ // but the bundled .d.ts marks it required.
136
162
  await cipher.initOutgoing(session);
137
163
  }, jid);
138
164
  },
@@ -171,7 +197,7 @@ export function makeLibSignalRepository(auth, logger, pnToLIDFunc) {
171
197
  await auth.keys.set({ session: sessionUpdates });
172
198
  }, `delete-${jids.length}-sessions`);
173
199
  },
174
- close () {
200
+ close() {
175
201
  migratedSessionCache.clear();
176
202
  lidMapping.close();
177
203
  },
@@ -345,9 +371,7 @@ function signalStorage({ creds, keys }, lidMapping) {
345
371
  saveIdentity: async (id, identityKey) => {
346
372
  const wireJid = await resolveLIDSignalAddress(id);
347
373
  const { [wireJid]: existingKey } = await keys.get('identity-key', [wireJid]);
348
- const keysMatch = existingKey &&
349
- existingKey.length === identityKey.length &&
350
- existingKey.every((byte, i) => byte === identityKey[i]);
374
+ const keysMatch = existingKey?.length === identityKey.length && existingKey.every((byte, i) => byte === identityKey[i]);
351
375
  if (existingKey && !keysMatch) {
352
376
  // Identity changed - clear session and update key
353
377
  await keys.set({
@@ -0,0 +1 @@
1
+