@crysnovax/baileys 2.5.0 → 2.5.5
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/README.md +1430 -285
- package/WAProto/index.js +14789 -3578
- package/lib/Defaults/index.js +19 -11
- package/lib/Signal/libsignal.js +42 -18
- package/lib/Socket/Client//342/234/230 +1 -0
- package/lib/Socket/chats.js +246 -91
- package/lib/Socket/messages-recv.js +618 -322
- package/lib/Socket/messages-send.js +174 -74
- package/lib/Socket/newsletter.js +2 -2
- package/lib/Socket/socket.js +12 -20
- package/lib/Socket//342/230/201/357/270/216 +1 -0
- package/lib/Types/Mex.js +39 -0
- package/lib/Types/index.js +1 -0
- package/lib/Types//342/234/206 +1 -0
- package/lib/Utils/index.js +1 -0
- package/lib/Utils/messages.js +148 -114
- package/lib/Utils/use-sqlite-auth-state.js +109 -0
- package/lib/Utils//342/232/211 +1 -0
- package/lib/WABinary/constants.js +99 -5
- package/lib/WABinary//342/216/231 +1 -0
- package/package.json +43 -9
package/lib/Defaults/index.js
CHANGED
|
@@ -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,
|
|
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:
|
|
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:
|
|
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/
|
|
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
|
-
//
|
|
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
|
+
|
package/lib/Signal/libsignal.js
CHANGED
|
@@ -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 {
|
|
120
|
-
|
|
121
|
-
|
|
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
|
+
|