@crysnovax/baileys 2.5.6 → 2.6.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.
@@ -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,7 +87,10 @@ 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',
@@ -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
135
  export const MIN_PREKEY_COUNT = 5;
130
136
  export const INITIAL_PREKEY_COUNT = 812;
131
137
  export const UPLOAD_TIMEOUT = 30000; // 30 seconds
132
- export const MIN_UPLOAD_INTERVAL = 5000; // 5 seconds minimum between uploads
133
138
  export const DEFAULT_CACHE_TTLS = {
134
139
  SIGNAL_STORE: 5 * 60, // 5 minutes
135
140
  MSG_RETRY: 60 * 60, // 1 hour
136
141
  CALL_OFFER: 5 * 60, // 5 minutes
137
142
  USER_DEVICES: 5 * 60 // 5 minutes
138
143
  };
144
+ /** 120s timeout for history sync stall detection, same as WA Web's handleChunkProgress / restartPausedTimer (g = 120) */
145
+ export const HISTORY_SYNC_PAUSED_TIMEOUT_MS = 120000;
139
146
  export const TimeMs = {
140
147
  Minute: 60 * 1000,
141
148
  Hour: 60 * 60 * 1000,
@@ -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,23 +122,37 @@ 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));
@@ -171,7 +195,7 @@ export function makeLibSignalRepository(auth, logger, pnToLIDFunc) {
171
195
  await auth.keys.set({ session: sessionUpdates });
172
196
  }, `delete-${jids.length}-sessions`);
173
197
  },
174
- close () {
198
+ close() {
175
199
  migratedSessionCache.clear();
176
200
  lidMapping.close();
177
201
  },
@@ -345,9 +369,7 @@ function signalStorage({ creds, keys }, lidMapping) {
345
369
  saveIdentity: async (id, identityKey) => {
346
370
  const wireJid = await resolveLIDSignalAddress(id);
347
371
  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]);
372
+ const keysMatch = existingKey?.length === identityKey.length && existingKey.every((byte, i) => byte === identityKey[i]);
351
373
  if (existingKey && !keysMatch) {
352
374
  // Identity changed - clear session and update key
353
375
  await keys.set({
@@ -372,7 +372,8 @@ export const makeBusinessSocket = (config) => {
372
372
  productDelete,
373
373
  productUpdate,
374
374
  updateBussinesProfile,
375
+ updateBusinessProfile: updateBussinesProfile,
375
376
  updateCoverPhoto,
376
377
  removeCoverPhoto
377
378
  };
378
- };
379
+ };